diff --git a/apps/level_up/.env.example b/apps/level_up/.env.example
new file mode 100644
index 00000000..2b0f238e
--- /dev/null
+++ b/apps/level_up/.env.example
@@ -0,0 +1,15 @@
+# NextAuth Configuration
+NEXTAUTH_URL=http://localhost:3001
+NEXTAUTH_SECRET=your-nextauth-secret-here
+
+# SSC OAuth Configuration
+SSC_CLIENT_ID=your-ssc-client-id
+
+#Game craft ssc event id
+GAME_CRAFT_SSC_EVENT_ID=202501
+
+# External App URLs
+# Development: http://localhost:3000
+# Production: https://ceit-ssc.ir
+NEXT_PUBLIC_SSC_URL=http://localhost:3000
+NEXT_PUBLIC_API_URL=https://localhost:8000
\ No newline at end of file
diff --git a/apps/level_up/Dockerfile b/apps/level_up/Dockerfile
new file mode 100644
index 00000000..f257cfbf
--- /dev/null
+++ b/apps/level_up/Dockerfile
@@ -0,0 +1,26 @@
+# Step 1: Use a lightweight Node.js base
+FROM node:20-alpine AS base
+
+# Step 2: Set working directory
+WORKDIR /app
+
+# Step 3: Copy only dependency files first (for caching)
+COPY pnpm-lock.yaml ./
+COPY package.json ./
+COPY pnpm-workspace.yaml ./
+COPY apps/game_craft/package.json apps/game_craft/
+COPY packages/core/package.json packages/core/
+COPY packages/ui/package.json packages/ui/
+
+# Step 4: Install deps with pnpm (monorepo-aware)
+RUN npm install -g pnpm@9 && pnpm install --frozen-lockfile
+
+# Step 5: Copy all source code
+COPY . .
+
+# Step 6: Build game_craft
+RUN pnpm run build
+
+# Step 7: Start production server
+EXPOSE 3000
+CMD ["pnpm", "start"]
diff --git a/apps/level_up/app/[locale]/(public)/faq/page.tsx b/apps/level_up/app/[locale]/(public)/faq/page.tsx
new file mode 100644
index 00000000..bdb02f40
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/faq/page.tsx
@@ -0,0 +1,153 @@
+"use client";
+
+import { Flex, theme, Typography, Collapse, Space, Card } from "antd";
+import { useTranslations } from "next-intl";
+import { QuestionCircleOutlined } from "@ant-design/icons";
+import { useResponsive } from "lib/hooks/useResponsive";
+
+const { useToken } = theme;
+
+export default function FAQPage() {
+ const { token } = useToken();
+ const screens = useResponsive();
+ const t = useTranslations("app");
+ const faqViewPadding = screens.lg ? "3rem 5rem" : "3rem 2rem";
+
+ const items = [
+ {
+ key: "1",
+ label: (
+
+
+
+ {t("faq.competitionParticipate.title")}
+
+
+ ),
+ children: (
+
+ {t("faq.competitionParticipate.content")}
+
+ ),
+ },
+ {
+ key: "2",
+ label: (
+
+
+
+ {t("faq.teamsConditions.title")}
+
+
+ ),
+ children: (
+
+ {t("faq.teamsConditions.content")}
+
+ ),
+ },
+ {
+ key: "3",
+ label: (
+
+
+
+ {t("faq.howToParticipate.title")}
+
+
+ ),
+ children: (
+
+ {t("faq.howToParticipate.content")}
+
+ ),
+ },
+ {
+ key: "4",
+ label: (
+
+
+
+ {t("faq.competitionRules.title")}
+
+
+ ),
+ children: (
+
+ {t("faq.competitionRules.content")}
+
+ ),
+ }
+ ];
+
+ return (
+
+
+
+
+
+
+ {t("faq.title")}
+
+
+ {t("faq.competitionConditions")}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/(public)/gallery/page.tsx b/apps/level_up/app/[locale]/(public)/gallery/page.tsx
new file mode 100644
index 00000000..a7927961
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/gallery/page.tsx
@@ -0,0 +1,96 @@
+"use client";
+
+import { Empty, Flex, theme, Typography, Image, Row, Col } from "antd";
+import { useTranslations } from "next-intl";
+import { useResponsive } from "../../../../lib/hooks/useResponsive";
+import { galleryImages } from "../../../../config/galleryImages";
+
+const { useToken } = theme;
+
+export default function GalleryPage() {
+ const { token } = useToken();
+ const screens = useResponsive();
+ const t = useTranslations("app");
+ const galleryViewPadding = screens.lg ? "3rem 5rem" : "3rem 2rem";
+
+ return (
+
+
+
+ {t("mainNavigation.gallery")}
+
+
+ {galleryImages.length > 0 ? (
+
+
+ {galleryImages.map((image) => (
+
+
+
+
+
+ ))}
+
+
+ ) : (
+
+ )}
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/(public)/history/page.tsx b/apps/level_up/app/[locale]/(public)/history/page.tsx
new file mode 100644
index 00000000..561f6994
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/history/page.tsx
@@ -0,0 +1,55 @@
+"use client";
+
+import { Empty, Flex, theme, Typography } from "antd";
+import { useTranslations } from "next-intl";
+import {useResponsive} from "../../../../lib/hooks/useResponsive";
+
+const { useToken } = theme;
+
+export default function HistoryPage() {
+ const { token } = useToken();
+ const screens = useResponsive();
+ const t = useTranslations("app");
+ const historyViewPadding = screens.lg ? "3rem 5rem" : "3rem 2rem";
+
+ return (
+
+
+
+ {t("mainNavigation.history")}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/(public)/layout.tsx b/apps/level_up/app/[locale]/(public)/layout.tsx
new file mode 100644
index 00000000..cb63a5f6
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/layout.tsx
@@ -0,0 +1,48 @@
+"use client";
+
+import { FloatButton, Layout, theme } from "antd";
+import { AppHeader } from "../../../components/layout/AppHeader";
+import { AppFooter } from "../../../components/layout/AppFooter";
+import Wave from "../../../components/common/Wave";
+import { usePathname } from "next/navigation";
+
+interface MainLayoutProps {
+ children: React.ReactNode;
+}
+
+const { useToken } = theme;
+
+export default function MainLayout({ children }: MainLayoutProps) {
+ const { token } = useToken();
+ const pathname = usePathname();
+
+ // if pathname == /[locale]/ --> home page
+ const isHomePage = pathname === "/" || /^\/[a-zA-Z-]+\/?$/.test(pathname);
+
+ return (
+
+
+
+ {children}
+
+
+
+ {/**/}
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/(public)/news/page.tsx b/apps/level_up/app/[locale]/(public)/news/page.tsx
new file mode 100644
index 00000000..7f6ebca4
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/news/page.tsx
@@ -0,0 +1,55 @@
+"use client";
+
+import { Empty, Flex, theme, Typography } from "antd";
+import { useTranslations } from "next-intl";
+import { useResponsive } from "../../../../lib/hooks/useResponsive";
+
+const { useToken } = theme;
+
+export default function NewsPage() {
+ const { token } = useToken();
+ const screens = useResponsive();
+ const t = useTranslations("app");
+ const newsViewPadding = screens.lg ? "3rem 5rem" : "3rem 2rem";
+
+ return (
+
+
+
+ {t("mainNavigation.news")}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/(public)/page.tsx b/apps/level_up/app/[locale]/(public)/page.tsx
new file mode 100644
index 00000000..80f32045
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/page.tsx
@@ -0,0 +1,85 @@
+"use client";
+
+import { Flex, theme } from "antd";
+import { GameCraftTimeline } from "../../../components/features/Timeline";
+import { GameCraftIntro } from "../../../components/features/home/GameCraftIntro";
+import { Prizes } from "../../../components/features/home/Prizes";
+import { AboutUs } from "../../../components/features/home/AboutUs";
+import { OfflineWorkshop } from "../../../components/features/workshops/OfflineWorkshop";
+import { OnlineWorkshop } from "../../../components/features/workshops/OnlineWorkshop";
+import { Sponsors } from "../../../components/features/home/Sponsors";
+import Wave from "../../../components/common/Wave";
+import { useResponsive } from "../../../lib/hooks/useResponsive";
+import { customColors } from "../../../config/colors";
+import WelcomePopup from "../../../components/features/popup/WelcomePopup";
+import { CompetitionsList } from "components/features/competitions/CompetitonsList";
+
+const { useToken } = theme;
+
+export default function HomePage() {
+ const { token } = useToken();
+ const screens = useResponsive();
+ const homeViewPadding = screens.lg ? "3rem 5rem" : "3rem 2rem";
+
+ return (
+ <>
+ {/**/}
+
+ {/* GameCraft Introduction Section */}
+
+ {/**/}
+
+ {/*Timeline and Prizes Section*/}
+ {/**/}
+ {/**/}
+
+ {/* Workshop Sections - Matching React order exactly */}
+
+
+
+
+
+
+ {/* Sponsors Section */}
+ {/**/}
+
+
+ {/* About Us Section */}
+
+
+ >
+ );
+}
diff --git a/apps/level_up/app/[locale]/(public)/sponsor/page.tsx b/apps/level_up/app/[locale]/(public)/sponsor/page.tsx
new file mode 100644
index 00000000..8b17d3c9
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/sponsor/page.tsx
@@ -0,0 +1,109 @@
+"use client";
+
+import { Empty, Flex, theme, Typography } from "antd";
+import { useTranslations } from "next-intl";
+import {useResponsive} from "../../../../lib/hooks/useResponsive";
+import {sponsors} from "../../../../config/sponsors";
+import SponsorCard from "../../../../components/common/SponsorCard";
+
+const { useToken } = theme;
+
+export default function SponsorsPage() {
+ const { token } = useToken();
+ const screens = useResponsive();
+ const t = useTranslations("app");
+ const tSponsors = useTranslations("app.sponsors");
+
+ // Responsive padding configuration
+ const isMobile = !screens.md;
+ const isTablet = screens.md && !screens.lg;
+
+ const getResponsivePadding = () => {
+ if (isMobile) return "2rem 1rem";
+ if (isTablet) return "2.5rem 2rem";
+ return "3rem 5rem";
+ };
+
+ const getContainerPadding = () => {
+ if (isMobile) return token.padding;
+ if (isTablet) return token.paddingLG;
+ return token.padding;
+ };
+
+ const getMaxWidth = () => {
+ if (isMobile) return "100%";
+ if (isTablet) return "800px";
+ return "1200px";
+ };
+
+ return (
+
+
+
+ {t("mainNavigation.sponsors")}
+
+
+ {sponsors.length > 0 ? (
+
+ {sponsors.map((sponsor, index) => (
+
+ ))}
+
+ ) : (
+
+ )}
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/(public)/sponsors/page.tsx b/apps/level_up/app/[locale]/(public)/sponsors/page.tsx
new file mode 100644
index 00000000..a4aba452
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/sponsors/page.tsx
@@ -0,0 +1,5 @@
+import { redirect } from 'next/navigation'
+
+export default function SponsorsRedirect() {
+ redirect('/sponsor')
+}
diff --git a/apps/level_up/app/[locale]/(public)/staffs/page.tsx b/apps/level_up/app/[locale]/(public)/staffs/page.tsx
new file mode 100644
index 00000000..f280c4f3
--- /dev/null
+++ b/apps/level_up/app/[locale]/(public)/staffs/page.tsx
@@ -0,0 +1,5 @@
+import { StaffView } from "../../../../components/features/staff/StaffView";
+
+export default function StaffsPage() {
+ return ;
+}
diff --git a/apps/level_up/app/[locale]/[...rest]/page.ts b/apps/level_up/app/[locale]/[...rest]/page.ts
new file mode 100644
index 00000000..723244f9
--- /dev/null
+++ b/apps/level_up/app/[locale]/[...rest]/page.ts
@@ -0,0 +1,5 @@
+import { notFound } from "next/navigation";
+
+export default function Page() {
+ return notFound();
+}
diff --git a/apps/level_up/app/[locale]/auth/page.tsx b/apps/level_up/app/[locale]/auth/page.tsx
new file mode 100644
index 00000000..0af67d6f
--- /dev/null
+++ b/apps/level_up/app/[locale]/auth/page.tsx
@@ -0,0 +1,22 @@
+"use client";
+
+import { useRouter } from "@bprogress/next";
+import { useRouter as nextIntlRouter } from "../../../lib/navigation";
+import { useSession } from "next-auth/react";
+import { useEffect, useState } from "react";
+
+export default function LoginPage() {
+ const session = useSession();
+ const router = useRouter({ customRouter: nextIntlRouter });
+
+ useEffect(() => {
+ if (session.status === "authenticated") {
+ router.push("/dashboard");
+ // TODO: show toast
+ } else {
+ router.push("/");
+ }
+ }, [session]);
+
+ return
لطفا صبر کنید | please wait
;
+}
diff --git a/apps/level_up/app/[locale]/dashboard/events/page.tsx b/apps/level_up/app/[locale]/dashboard/events/page.tsx
new file mode 100644
index 00000000..3d53c180
--- /dev/null
+++ b/apps/level_up/app/[locale]/dashboard/events/page.tsx
@@ -0,0 +1,180 @@
+"use client";
+
+import { Alert, Col, Empty, Flex, Row, Spin, theme, Typography } from "antd";
+import { useTranslations } from "next-intl";
+import { WorkshopCard } from "components/features/workshops/WorkshopCard";
+import { PresentationType } from "@ssc/core";
+import { usePurchases } from "lib/hooks/usePurchases";
+import { CompetitionsList } from "components/features/competitions/CompetitonsList";
+import { useResponsive } from "lib/hooks/useResponsive";
+
+const { useToken } = theme;
+
+export default function EventsPage() {
+ const { token } = useToken();
+ const t = useTranslations("app");
+ const { presentations, loading, error, isAuthenticated } = usePurchases();
+ const screen = useResponsive();
+
+ // Filter presentations by type
+ const workshops = presentations.filter(
+ (p) => p.type === "workshop" || p.type === "course"
+ );
+ const talks = presentations.filter((p) => p.type === "talk");
+
+ const renderSection = (items: typeof presentations, title: string) => {
+ if (loading) {
+ return (
+
+
+
+ );
+ }
+
+ if (error) {
+ return (
+
+ );
+ }
+
+ if (!items || items.length === 0) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+ {items.map((item) => (
+
+
+
+ ))}
+
+ );
+ };
+
+ // If not authenticated, show message to login
+ if (!isAuthenticated) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+ {/* Competition Section */}
+
+
+ {t("dashboard.events.competitions")}
+
+
+
+
+ {/* Workshops Section */}
+
+
+ {t("dashboard.events.workshops")}
+
+ {renderSection(workshops, "کارگاه")}
+
+
+ {/* Talks Section */}
+
+
+ {t("dashboard.events.talks")}
+
+ {renderSection(talks, "ارائه")}
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/dashboard/games/page.tsx b/apps/level_up/app/[locale]/dashboard/games/page.tsx
new file mode 100644
index 00000000..0462a684
--- /dev/null
+++ b/apps/level_up/app/[locale]/dashboard/games/page.tsx
@@ -0,0 +1,59 @@
+"use client";
+
+import { Divider, Flex, Grid, theme, Typography } from "antd";
+import { GameCard } from "../../../../components/features/games/GameCard";
+import { UploadGameForm } from "../../../../components/features/games/UploadGameForm";
+import { useTranslations } from "next-intl";
+
+const { useToken } = theme;
+const { useBreakpoint } = Grid;
+
+export default function GamesPage() {
+ const { token } = useToken();
+ const screens = useBreakpoint();
+ const t = useTranslations("app.dashboard.games");
+
+ return (
+
+
+
+
+
+ {screens.lg ? (
+
+ ) : (
+
+ {t("preview")}
+
+ )}
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/dashboard/layout.tsx b/apps/level_up/app/[locale]/dashboard/layout.tsx
new file mode 100644
index 00000000..866f5aa1
--- /dev/null
+++ b/apps/level_up/app/[locale]/dashboard/layout.tsx
@@ -0,0 +1,166 @@
+"use client";
+
+import {theme, Grid, Flex, Typography, Divider, Button} from "antd";
+import {ArrowLeftOutlined} from "@ant-design/icons";
+import {useDashboardNavigations} from "../../../lib/config/dashboard-navigation";
+import {DashboardHeader} from "../../../components/layout/dashboard";
+import {DashboardNavigationCard} from "../../../components/layout/dashboard";
+import LogoWithText from "../../../components/common/LogoWithText";
+import {usePathname} from "lib/navigation";
+import {useAuth} from "lib/hooks/useAuth";
+import {useEffect} from "react";
+import {useRouter} from "next/navigation";
+import {useTranslations} from "next-intl";
+
+const {useToken} = theme;
+const {useBreakpoint} = Grid;
+
+interface DashboardLayoutProps {
+ children: React.ReactNode;
+ params: Promise<{ locale: string }>;
+}
+
+export default function DashboardLayout({children}: DashboardLayoutProps) {
+ const screens = useBreakpoint();
+ const {token} = useToken();
+ const dashboardNavigations = useDashboardNavigations();
+ const pathname = usePathname();
+ const {isAuthenticated} = useAuth();
+ const router = useRouter();
+ const t = useTranslations();
+
+ useEffect(() => {
+ if (!isAuthenticated) {
+ router.push("/");
+ }
+ }, [isAuthenticated]);
+
+ const handleBackToHome = () => {
+ router.push("/");
+ };
+
+ return (
+
+
+
+
+ {screens.lg ? (
+
+ {/* Back button aligned with logo */}
+
+
+ {/* Logo in center */}
+
+
+ {/* Empty div for spacing balance */}
+
+
+ ) : (
+ <>>
+ )}
+
+ {screens.lg ? (
+
+
+
+ ) : (
+ <>>
+ )}
+
+
+
+
+ {
+ dashboardNavigations.find((item) => item.route === pathname)
+ ?.name
+ }
+
+
+
+
+ {children}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/dashboard/online-account/page.tsx b/apps/level_up/app/[locale]/dashboard/online-account/page.tsx
new file mode 100644
index 00000000..28e042d1
--- /dev/null
+++ b/apps/level_up/app/[locale]/dashboard/online-account/page.tsx
@@ -0,0 +1,132 @@
+"use client";
+
+import { Alert, Button, Flex, theme, Typography } from "antd";
+import { usePurchases } from "lib/hooks/usePurchases";
+import { useSession } from "next-auth/react";
+import { useTranslations } from "next-intl";
+import { LuCopy } from "react-icons/lu";
+import { toast, ToastContainer } from "react-toastify";
+
+const { useToken } = theme;
+
+export default function EventsPage() {
+ const { token } = useToken();
+ const t = useTranslations("app");
+ const { isAuthenticated } = usePurchases();
+ const session = useSession();
+
+ const handleCopyCode = async (text: string) => {
+ try {
+ await navigator.clipboard.writeText(text);
+ toast.info("با موفقیت کپی شد");
+ } catch (err) {
+ console.error("Failed to copy code:", err);
+ }
+ };
+
+ // If not authenticated, show message to login
+ if (!isAuthenticated) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+
+ {/* Skyroom Account */}
+
+
+ {t("dashboard.onlineAccount.skyroom")}
+
+
+ {t("dashboard.onlineAccount.description")}
+
+
+
+ {t("dashboard.onlineAccount.username")}
+
+
+
+
+ {t("dashboard.onlineAccount.password")}
+
+
+ handleCopyCode(session.data.skyPassword)}
+ >
+
+
+ {session.data.skyPassword}
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/dashboard/page.tsx b/apps/level_up/app/[locale]/dashboard/page.tsx
new file mode 100644
index 00000000..4ef00162
--- /dev/null
+++ b/apps/level_up/app/[locale]/dashboard/page.tsx
@@ -0,0 +1,12 @@
+import { redirect } from 'next/navigation'
+
+interface DashboardPageProps {
+ params: Promise<{ locale: string }>
+}
+
+export default async function DashboardPage({ params }: DashboardPageProps) {
+ const { locale } = await params
+
+ // Redirect to events page as the default dashboard page with proper locale
+ redirect(`/${locale}/dashboard/events`)
+}
diff --git a/apps/level_up/app/[locale]/dashboard/shopping-bag/page.tsx b/apps/level_up/app/[locale]/dashboard/shopping-bag/page.tsx
new file mode 100644
index 00000000..fc9227c1
--- /dev/null
+++ b/apps/level_up/app/[locale]/dashboard/shopping-bag/page.tsx
@@ -0,0 +1,127 @@
+"use client";
+
+import { PayBox } from "../../../../components/features/cart/PayBox";
+import ProductCart from "components/features/cart/ProductCart";
+import { useAppDispatch, useAppSelector } from "lib/store/store";
+import {
+ cartPresentationsSelector,
+ cartLoadingSelector,
+ cartErrorSelector,
+} from "lib/store/cart/cart.selectors";
+import { useEffect } from "react";
+import {
+ fetchCartThunk,
+ removeItemFromCartThunk,
+} from "lib/store/cart/cart.thunk";
+import { Flex, theme, Row, Col, Spin, Empty, Alert, message } from "antd";
+import {ItemType, PresentationType} from "@ssc/core";
+
+const { useToken } = theme;
+
+// TODO: Hydrate redux with SSR, also make this component server component
+
+export default function ShoppingBagPage() {
+ const dispatch = useAppDispatch();
+ const cartItems = useAppSelector(cartPresentationsSelector);
+ const loading = useAppSelector(cartLoadingSelector);
+ const error = useAppSelector(cartErrorSelector);
+ const { token } = useToken();
+
+ useEffect(() => {
+ dispatch(fetchCartThunk());
+ }, [dispatch]);
+
+ const handleRemoveItem = async (item_id: number, item_type: ItemType) => {
+ try {
+ await dispatch(removeItemFromCartThunk({ item_id, item_type })).unwrap();
+ message.success("محصول از سبد خرید حذف شد");
+ } catch (error) {
+ message.error("خطا در حذف محصول");
+ }
+ };
+
+ const renderContent = () => {
+ if (loading) {
+ return (
+
+
+
+ );
+ }
+
+ if (error) {
+ return (
+
+ );
+ }
+
+ if (!cartItems || cartItems.length === 0) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+ {cartItems.map((item) => (
+
+ handleRemoveItem(item.id, ItemType.PRESENTATION)}
+ />
+
+ ))}
+
+ );
+ };
+
+ return (
+
+
+ {renderContent()}
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/dashboard/team-status/page.tsx b/apps/level_up/app/[locale]/dashboard/team-status/page.tsx
new file mode 100644
index 00000000..767782ab
--- /dev/null
+++ b/apps/level_up/app/[locale]/dashboard/team-status/page.tsx
@@ -0,0 +1,32 @@
+"use client";
+
+import { Flex, theme, Typography } from "antd";
+import { useTranslations } from "next-intl";
+import { TeamMemberContainer } from "../../../../components/features/team/TeamMemberContainer";
+
+const { useToken } = theme;
+
+export default function TeamStatusPage() {
+ const t = useTranslations("app.dashboard.teamStatus");
+ const { token } = useToken();
+
+ return (
+
+ {/*
+ {t("teamName")}
+ */}
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/layout.tsx b/apps/level_up/app/[locale]/layout.tsx
new file mode 100644
index 00000000..1a9e6ca8
--- /dev/null
+++ b/apps/level_up/app/[locale]/layout.tsx
@@ -0,0 +1,189 @@
+import { NextIntlClientProvider } from "next-intl";
+import { getMessages } from "next-intl/server";
+import { ThemeProvider } from "next-themes";
+import localFont from "next/font/local";
+import "../globals.css";
+import { SoundProvider } from "components/providers/SoundProvider";
+import { AntdRegistry } from "@ant-design/nextjs-registry";
+import AuthProvider from "components/providers/AuthProvider";
+import AntDesignProvider from "components/providers/AntDesignProvider";
+import Providers from "components/Providers";
+import { routing } from "lib/routing";
+import StoreProvider from "components/providers/StoreProvider";
+import GoftinoProvider from "components/providers/GoftinoProvider";
+
+// Font definitions
+const estedad = localFont({
+ src: [
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Thin.woff2",
+ weight: "100",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-ExtraLight.woff2",
+ weight: "200",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Light.woff2",
+ weight: "300",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Regular.woff2",
+ weight: "400",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Medium.woff2",
+ weight: "500",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-SemiBold.woff2",
+ weight: "600",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Bold.woff2",
+ weight: "700",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-ExtraBold.woff2",
+ weight: "800",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Black.woff2",
+ weight: "900",
+ style: "normal",
+ },
+ ],
+ variable: "--font-estedad",
+ display: "swap",
+});
+
+const vazirmatn = localFont({
+ src: [
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Thin.woff2",
+ weight: "100",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-ExtraLight.woff2",
+ weight: "200",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Light.woff2",
+ weight: "300",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Regular.woff2",
+ weight: "400",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Medium.woff2",
+ weight: "500",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-SemiBold.woff2",
+ weight: "600",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Bold.woff2",
+ weight: "700",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-ExtraBold.woff2",
+ weight: "800",
+ style: "normal",
+ },
+ {
+ path: "../../public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Black.woff2",
+ weight: "900",
+ style: "normal",
+ },
+ ],
+ variable: "--font-vazirmatn",
+ display: "swap",
+});
+
+interface LocaleLayoutProps {
+ children: React.ReactNode;
+ params: Promise<{ locale: string }>;
+}
+
+export function generateStaticParams() {
+ return routing.locales.map((locale) => ({ locale }));
+}
+
+export async function generateMetadata({
+ params,
+}: {
+ params: Promise<{ locale: string }>;
+}) {
+ const { locale } = await params;
+
+ const title = locale === "fa" ? "لولآپ" : "LevelUp";
+ const description = locale === "fa" ? "لولآپ - ۱۴۰۴" : "LevelUp - 2025";
+
+ return {
+ title,
+ description,
+ icons: {
+ icon: "/favicon.ico",
+ shortcut: "/favicon.ico",
+ apple: "/favicon.ico",
+ },
+ };
+}
+
+export default async function LocaleLayout({
+ children,
+ params,
+}: LocaleLayoutProps) {
+ const { locale } = await params;
+ const messages = await getMessages();
+ const direction = locale === "fa" ? "rtl" : "ltr";
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/app/[locale]/not-found.tsx b/apps/level_up/app/[locale]/not-found.tsx
new file mode 100644
index 00000000..5a9218fb
--- /dev/null
+++ b/apps/level_up/app/[locale]/not-found.tsx
@@ -0,0 +1,183 @@
+"use client";
+
+import { Button, Typography, Flex } from "antd";
+import { useTranslations } from "next-intl";
+import { useRouter, usePathname } from "next/navigation";
+import Image from "next/image";
+import { HomeOutlined, ArrowLeftOutlined } from "@ant-design/icons";
+import { useTheme } from "next-themes";
+import { useEffect, useState } from "react";
+
+const { Title, Paragraph } = Typography;
+
+export default function NotFound() {
+ const t = useTranslations("notFound");
+ const router = useRouter();
+ const pathname = usePathname();
+ const { theme } = useTheme();
+ const [mounted, setMounted] = useState(false);
+
+ useEffect(() => {
+ setMounted(true);
+ }, []);
+
+ const handleGoHome = () => {
+ // Extract the locale from the current pathname
+ const locale = pathname.split("/")[1] || "fa";
+ router.push(`/${locale}`);
+ };
+
+ const handleGoBack = () => {
+ router.back();
+ };
+
+ if (!mounted) return null;
+
+ return (
+
+
+
+ {/* Error Code */}
+
+
+ {/* Error Message */}
+
+
+ {t("title") || "Oops! Page Not Found"}
+
+
+
+ {t("description") ||
+ "It looks like the page you're looking for does not exist."}
+
+
+
+ {/* Action Buttons */}
+
+ }
+ onClick={handleGoHome}
+ className="h-12 px-8 text-lg font-semibold rounded-lg border-2 border-primary bg-primary hover:!bg-primary/90 hover:!border-primary/90 shadow-lg hover:shadow-xl transition-all duration-300 transform hover:scale-105"
+ style={{
+ fontFamily:
+ "var(--font-estedad), var(--font-vazirmatn), sans-serif",
+ }}
+ >
+ {t("goHome") || "Go Home"}
+
+
+ }
+ onClick={handleGoBack}
+ className="h-12 px-8 text-lg font-semibold rounded-lg border-2 border-action text-action hover:!bg-action hover:!text-white hover:!border-action shadow-lg hover:shadow-xl transition-all duration-300 transform hover:scale-105"
+ style={{
+ fontFamily:
+ "var(--font-estedad), var(--font-vazirmatn), sans-serif",
+ }}
+ >
+ {t("goBack") || "Go Back"}
+
+
+
+ {/* Decorative Elements */}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/app/api/auth/[...nextauth]/route.ts b/apps/level_up/app/api/auth/[...nextauth]/route.ts
new file mode 100644
index 00000000..dae0688b
--- /dev/null
+++ b/apps/level_up/app/api/auth/[...nextauth]/route.ts
@@ -0,0 +1,374 @@
+import { BASE_URL } from "@ssc/core";
+import { RequestResponse } from "@ssc/core/lib/types/api/general";
+import { UserProfileResponse } from "@ssc/core/lib/types/api/User/user";
+import axios from "axios";
+import { serverApi } from "lib/api/server/serverApi";
+import NextAuth, { AuthOptions } from "next-auth";
+import { Provider } from "next-auth/providers";
+import { getRequestConfig } from "next-intl/server";
+
+interface SSCProviderOptions {
+ clientId: string;
+ clientSecret?: string;
+}
+
+interface SSCProfile {
+ success?: boolean;
+ data?: {
+ id?: number;
+ email: string;
+ first_name?: string;
+ last_name?: string;
+ profile_picture?: string;
+ phone_number?: string;
+ date_joined?: string;
+ sky_username?: string;
+ sky_password?: string;
+ };
+
+ // Direct fields for fallback
+ id?: number;
+ sub?: string;
+ email?: string;
+ first_name?: string;
+ last_name?: string;
+ profile_picture?: string;
+ sky_username?: string;
+ sky_password?: string;
+}
+
+function SSCProvider(options: SSCProviderOptions): Provider {
+ return {
+ id: "ssc",
+ name: "SSC SSO",
+ type: "oauth",
+ authorization: {
+ url: `${
+ process.env.NEXT_PUBLIC_SSC_URL || "http://localhost:3000"
+ }/login`,
+ params: {
+ scope: "read write",
+ response_type: "code",
+ },
+ },
+ token: {
+ url: `${BASE_URL}/o/token/`,
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ async request(context: any) {
+ const { params, checks } = context;
+ console.log("Full token request context:", context);
+
+ const formData = new URLSearchParams();
+ formData.append("grant_type", "authorization_code");
+ formData.append("code", params.code);
+ formData.append("client_id", process.env.SSC_CLIENT_ID!);
+ formData.append(
+ "redirect_uri",
+ `${
+ process.env.NEXTAUTH_URL || "http://localhost:3001"
+ }/api/auth/callback/ssc`
+ );
+
+ const codeVerifier = checks?.code_verifier || params.code_verifier;
+ if (codeVerifier) {
+ formData.append("code_verifier", codeVerifier);
+ } else {
+ console.warn("PKCE code_verifier not found in context!");
+ }
+
+ console.log("Sending form data:", Object.fromEntries(formData));
+
+ const response = await fetch(`${BASE_URL}/o/token/`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/x-www-form-urlencoded",
+ Accept: "application/json",
+ },
+ body: formData,
+ });
+
+ console.log("!@!", response);
+ const result = await response.json();
+ console.log("Token response from Django:", result);
+
+ if (!response.ok) {
+ const errorDetail =
+ result.errors?.detail ||
+ result.error_description ||
+ result.error ||
+ "Token exchange failed";
+ throw new Error(`Token exchange failed: ${errorDetail}`);
+ }
+
+ const tokens = result.data || result;
+
+ if (!tokens.access_token) {
+ console.error("No access_token in response:", tokens);
+ throw new Error("access_token not found in response");
+ }
+
+ return {
+ tokens: {
+ access_token: tokens.access_token,
+ refresh_token: tokens.refresh_token,
+ token_type: tokens.token_type || "Bearer",
+ expires_in: tokens.expires_in,
+ scope: tokens.scope,
+ },
+ };
+ },
+ },
+ userinfo: {
+ url: `${BASE_URL}/profile/`,
+ },
+
+ clientId: options.clientId,
+ // Don't include clientSecret for PKCE flow
+ client: {
+ token_endpoint_auth_method: "none",
+ },
+ checks: ["pkce", "state"],
+ profile(profile: SSCProfile) {
+ console.log("Processing profile:", profile);
+
+ const userData = profile.data || profile;
+
+ return {
+ id: userData.id?.toString() || userData.email || "",
+ name: `${userData.first_name || ""} ${userData.last_name || ""}`.trim(),
+ email: userData.email,
+ image: userData.profile_picture,
+ skyUsername: userData.sky_username,
+ skyPassword: userData.sky_password,
+ };
+ },
+ };
+}
+
+declare module "next-auth" {
+ interface Session {
+ accessToken?: string;
+ tokenType?: string;
+ expiresIn?: number;
+ scope?: string;
+
+ skyUsername?: string;
+ skyPassword?: string;
+ }
+
+ interface User {
+ accessToken?: string;
+ refreshToken?: string;
+ tokenType?: string;
+ expiresIn?: number;
+ scope?: string;
+
+ skyUsername?: string;
+ skyPassword?: string;
+ }
+}
+
+declare module "next-auth/jwt" {
+ interface JWT {
+ accessToken?: string;
+ refreshToken?: string;
+ tokenType?: string;
+ expiresIn?: number;
+ scope?: string;
+ expiresAt?: number;
+ provider?: string;
+
+ skyUsername?: string;
+ skyPassword?: string;
+ }
+}
+
+const authOptions: AuthOptions = {
+ providers: [
+ SSCProvider({
+ clientId: process.env.SSC_CLIENT_ID,
+ }),
+ ],
+ // debug: true, // Enable debug mode
+ // logger: {
+ // error(code, metadata) {
+ // console.error("NextAuth Error:", code, metadata);
+ // },
+ // warn(code) {
+ // console.warn("NextAuth Warning:", code);
+ // },
+ // debug(code, metadata) {
+ // console.log("NextAuth Debug:", code, metadata);
+ // },
+ // },
+ callbacks: {
+ async signIn({ user, account, profile, email, credentials }) {
+ console.log("SignIn callback triggered:", {
+ provider: account?.provider,
+ user: user?.email,
+ accountKeys: account ? Object.keys(account) : null,
+ profile: profile,
+ });
+
+ if (account?.provider === "ssc") {
+ try {
+ console.log("SSC account data:", account);
+ // Store OAuth tokens in user object
+ const userWithTokens = user;
+ userWithTokens.accessToken = account.access_token;
+ userWithTokens.refreshToken = account.refresh_token;
+ userWithTokens.tokenType = account.token_type || "Bearer";
+ // Store expires_in as duration in seconds (not absolute timestamp)
+ userWithTokens.expiresIn = (account.expires_in as number) || 900;
+ return true;
+ } catch (error) {
+ console.error("Error handling SSC OAuth tokens:", error);
+ return false;
+ }
+ }
+
+ if (account?.provider === "google") {
+ try {
+ const response = await serverApi.auth.googleAuth({
+ access_token: account.access_token,
+ id_token: account.id_token,
+ });
+
+ if (response.status === 200 && response.data?.success) {
+ const tokenData = response.data.data;
+ // Store backend tokens in user object
+ const userWithTokens = user;
+ userWithTokens.accessToken = tokenData.access_token;
+ userWithTokens.refreshToken = tokenData.refresh_token;
+ userWithTokens.tokenType = tokenData.token_type;
+ userWithTokens.expiresIn = tokenData.expires_in;
+ return true;
+ } else {
+ console.error(
+ "Backend Google authentication failed:",
+ response.data
+ );
+ return false;
+ }
+ } catch (error) {
+ console.error("Error authenticating with backend:", error);
+ return false;
+ }
+ }
+
+ // Allow credentials provider sign in
+ // if (account?.provider === "credentials") {
+ // return true;
+ // }
+
+ return false;
+ },
+
+ async jwt({ token, user, account }) {
+ if (user && account) {
+ const userWithTokens = user;
+ token.accessToken = userWithTokens.accessToken;
+ token.refreshToken = userWithTokens.refreshToken;
+ token.tokenType = userWithTokens.tokenType;
+ token.expiresIn = userWithTokens.expiresIn; // Duration in seconds
+ token.scope = userWithTokens.scope;
+ token.provider = account.provider; // Store provider info for refresh logic
+
+ token.skyUsername = user.skyUsername;
+ token.skyPassword = user.skyPassword;
+
+ // Calculate absolute expiry time in milliseconds
+ const expiresAt = Date.now() + (userWithTokens.expiresIn || 0) * 1000;
+ token.expiresAt = expiresAt;
+ }
+
+ if (Date.now() < (token.expiresAt || 0)) {
+ return token;
+ }
+
+ // Access token has expired, try to refresh it
+ try {
+ // For SSC OAuth tokens, use OAuth2 refresh endpoint
+ if (token.provider === "ssc" && token.refreshToken) {
+ const response = await serverApi.auth.refresh(
+ token.refreshToken,
+ process.env.SSC_CLIENT_ID!
+ );
+
+ console.log("Refresh response:", response.status);
+
+ if (response.status === 200) {
+ console.log("Refreshed tokens:", response.data);
+
+ if (response.data.success && response.data.data) {
+ const newTokenData = response.data.data;
+ token.accessToken = newTokenData.access_token;
+ token.refreshToken =
+ newTokenData.refresh_token ?? token.refreshToken;
+ token.tokenType = newTokenData.token_type;
+ token.expiresIn = newTokenData.expires_in; // Duration in seconds
+
+ // Update expiry time - calculate absolute timestamp
+ const expiresAt =
+ Date.now() + (newTokenData.expires_in || 0) * 1000;
+ token.expiresAt = expiresAt;
+
+ console.log(
+ "Token refreshed successfully, new expiry:",
+ new Date(expiresAt).toISOString()
+ );
+
+ return token;
+ }
+ }
+ }
+ } catch (error) {
+ console.error("Token refresh failed:", error);
+ console.error("Token refresh failed:", error.response);
+ console.error("Token refresh failed:", error.request);
+ }
+
+ // Return null to force sign out
+ return null;
+ },
+
+ async session({ session, token }) {
+ const {
+ data: { data: user },
+ } = await axios.get<
+ UserProfileResponse,
+ RequestResponse
+ >(`${BASE_URL}/profile/`, {
+ headers: {
+ Authorization: `Bearer ${token.accessToken}`,
+ },
+ });
+
+ if (token.accessToken) {
+ const sessionWithTokens = session;
+ sessionWithTokens.accessToken = token.accessToken;
+ sessionWithTokens.tokenType = token.tokenType;
+ sessionWithTokens.expiresIn = token.expiresIn;
+ sessionWithTokens.scope = token.scope;
+
+ session.skyUsername = user.sky_username;
+ session.skyPassword = user.sky_password;
+ }
+
+ return session;
+ },
+ },
+ pages: {
+ signIn: "/auth",
+ error: "/auth",
+ },
+ session: {
+ strategy: "jwt",
+ maxAge: 30 * 24 * 60 * 60,
+ },
+ secret: process.env.NEXTAUTH_SECRET,
+};
+
+const handler = NextAuth(authOptions);
+
+export { handler as GET, handler as POST };
diff --git a/apps/level_up/app/favicon.ico b/apps/level_up/app/favicon.ico
new file mode 100644
index 00000000..92c3c9db
--- /dev/null
+++ b/apps/level_up/app/favicon.ico
@@ -0,0 +1,73 @@
+
diff --git a/apps/level_up/app/globals.css b/apps/level_up/app/globals.css
new file mode 100644
index 00000000..940cce89
--- /dev/null
+++ b/apps/level_up/app/globals.css
@@ -0,0 +1,181 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+/* RTL support */
+[dir="rtl"] {
+ text-align: right;
+}
+
+[dir="ltr"] {
+ text-align: left;
+}
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+html {
+ cursor: url("/cursor/pointer.cur");
+}
+
+a,
+.ant-collapse-header:hover,
+.ant-collapse-header:hover *,
+.ant-image-mask:hover,
+.ant-btn:not(:disabled):hover {
+ cursor: url("/cursor/cursor.cur"), auto !important;
+}
+
+body {
+ width: auto;
+ min-height: 100vh;
+ font-family: var(--font-estedad), var(--font-vazirmatn), sans-serif;
+ background-color: lightyellow;
+ overflow: auto;
+ overflow-x: hidden;
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+
+::-webkit-scrollbar {
+ scrollbar-width: none;
+ display: none;
+}
+
+/* Debug font variables */
+:root {
+ --font-estedad: 'Estedad';
+ --font-vazirmatn: 'Vazirmatn';
+}
+
+/* RTL support */
+[dir="rtl"] {
+ text-align: right;
+}
+
+[dir="ltr"] {
+ text-align: left;
+}
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ width: auto;
+ min-height: 100vh;
+ font-family: var(--font-estedad), var(--font-vazirmatn), sans-serif;
+ background-color: lightyellow;
+ overflow: auto;
+ overflow-x: hidden;
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+
+::-webkit-scrollbar {
+ scrollbar-width: none;
+ display: none;
+}
+
+/* Debug font variables */
+:root {
+ --font-estedad: 'Estedad';
+ --font-vazirmatn: 'Vazirmatn';
+}
+
+/* Custom Toastify Styles */
+.custom-toast-container .Toastify__toast {
+ background: #ffffff;
+ border: 2px solid #3c3a7d;
+ border-radius: 12px;
+ box-shadow: 0 4px 12px rgba(60, 58, 125, 0.15);
+ font-family: var(--font-estedad), var(--font-vazirmatn), sans-serif;
+ font-weight: 500;
+ color: #000000d9;
+ margin-bottom: 8px;
+}
+
+.custom-toast-container .Toastify__toast--success {
+ border-color: #01B582;
+ background: linear-gradient(135deg, #ffffff 0%, #f0fdf9 100%);
+}
+
+.custom-toast-container .Toastify__toast--error {
+ border-color: #ff4d4f;
+ background: linear-gradient(135deg, #ffffff 0%, #fef2f2 100%);
+}
+
+.custom-toast-container .Toastify__toast--warning {
+ border-color: #faad14;
+ background: linear-gradient(135deg, #ffffff 0%, #fffbeb 100%);
+}
+
+.custom-toast-container .Toastify__toast--info {
+ border-color: #3c3a7d;
+ background: linear-gradient(135deg, #ffffff 0%, #f8f9ff 100%);
+}
+
+.custom-toast-container .Toastify__progress-bar {
+ height: 4px;
+}
+
+.custom-toast-container .Toastify__progress-bar--success {
+ background: #01B582;
+}
+
+.custom-toast-container .Toastify__progress-bar--error {
+ background: #ff4d4f;
+}
+
+.custom-toast-container .Toastify__progress-bar--warning {
+ background: #faad14;
+}
+
+.custom-toast-container .Toastify__progress-bar--info {
+ background: #3c3a7d;
+}
+
+.custom-toast-container .Toastify__close-button {
+ color: #3c3a7d;
+ opacity: 0.7;
+}
+
+.custom-toast-container .Toastify__close-button:hover {
+ opacity: 1;
+}
+
+/* Dark mode support */
+.dark .custom-toast-container .Toastify__toast {
+ background: #262626;
+ color: #ffffffd9;
+ border-color: #4c4a8d;
+}
+
+.dark .custom-toast-container .Toastify__toast--success {
+ border-color: #01B582;
+ background: linear-gradient(135deg, #262626 0%, #0f2420 100%);
+}
+
+.dark .custom-toast-container .Toastify__toast--error {
+ border-color: #ff4d4f;
+ background: linear-gradient(135deg, #262626 0%, #2d1b1b 100%);
+}
+
+.dark .custom-toast-container .Toastify__toast--warning {
+ border-color: #faad14;
+ background: linear-gradient(135deg, #262626 0%, #2d2416 100%);
+}
+
+.dark .custom-toast-container .Toastify__toast--info {
+ border-color: #4c4a8d;
+ background: linear-gradient(135deg, #262626 0%, #1a1a2e 100%);
+}
+
+.dark .custom-toast-container .Toastify__close-button {
+ color: #ffffffd9;
+}
diff --git a/apps/level_up/components/Providers.tsx b/apps/level_up/components/Providers.tsx
new file mode 100644
index 00000000..0dc8d0e8
--- /dev/null
+++ b/apps/level_up/components/Providers.tsx
@@ -0,0 +1,37 @@
+"use client";
+
+import { AppProgressProvider } from "@bprogress/next";
+import { ToastContainer } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+
+const Providers = ({ children }: { children: React.ReactNode }) => {
+ return (
+
+ {children}
+
+
+ );
+};
+
+export default Providers;
diff --git a/apps/level_up/components/common/CrownBadge.tsx b/apps/level_up/components/common/CrownBadge.tsx
new file mode 100644
index 00000000..6b1f069b
--- /dev/null
+++ b/apps/level_up/components/common/CrownBadge.tsx
@@ -0,0 +1,48 @@
+"use client";
+
+import React from "react";
+import Image from "next/image";
+
+interface CrownBadgeProps {
+ children: React.ReactNode;
+}
+
+const CrownBadge: React.FC = ({ children }) => {
+ return (
+
+ );
+};
+
+const styles = {
+ wrapper: {
+ position: "relative" as const,
+ display: "inline-block",
+ width: "100%",
+ height: "100%",
+ },
+ crownContainer: {
+ position: "absolute" as const,
+ top: 0,
+ right: 0,
+ transform: "translate(50%, -50%)",
+ zIndex: 1,
+ },
+ crownIcon: {
+ width: "40px",
+ height: "40px",
+ transform: "rotate(35deg)",
+ },
+};
+
+export default CrownBadge;
diff --git a/apps/level_up/components/common/LogoWithText.tsx b/apps/level_up/components/common/LogoWithText.tsx
new file mode 100644
index 00000000..056b8973
--- /dev/null
+++ b/apps/level_up/components/common/LogoWithText.tsx
@@ -0,0 +1,62 @@
+'use client'
+
+import { Flex, Typography } from 'antd'
+import { useTranslations } from 'next-intl'
+import Image from 'next/image'
+
+interface LogoWithTextProps {
+ variant?: 'dark' | 'light'
+ size?: number
+ className?: string
+}
+
+export default function LogoWithText({
+ variant = 'dark',
+ size = 100,
+ className = ''
+}: LogoWithTextProps) {
+ const t = useTranslations('app')
+
+ const logoSrc = variant === 'dark' ? '/images/logo/ssc_white.png' : '/images/logo/ssc_white.png'
+
+ return (
+
+
+ {t('logo.game')}
+
+
+
+
+
+ {t('logo.craft')}
+
+
+ )
+}
diff --git a/apps/level_up/components/common/SoundControls.tsx b/apps/level_up/components/common/SoundControls.tsx
new file mode 100644
index 00000000..520d6237
--- /dev/null
+++ b/apps/level_up/components/common/SoundControls.tsx
@@ -0,0 +1,32 @@
+"use client";
+
+
+import {useSound} from "../providers/SoundProvider";
+import {Button} from "antd";
+import {SoundFilled, SoundOutlined} from "@ant-design/icons";
+
+export function SoundControls() {
+ const { toggle, muted, volume, changeVolume } = useSound();
+
+ return (
+
+
+ {muted ? : }
+
+
+ changeVolume(parseFloat(e.target.value))}
+ className="w-20"
+ disabled={muted}
+ />
+
+ );
+}
diff --git a/apps/level_up/components/common/SponsorCard.tsx b/apps/level_up/components/common/SponsorCard.tsx
new file mode 100644
index 00000000..a44241ac
--- /dev/null
+++ b/apps/level_up/components/common/SponsorCard.tsx
@@ -0,0 +1,128 @@
+"use client";
+
+import {Typography, Button, Flex, theme, Tag} from "antd";
+import {LinkOutlined} from "@ant-design/icons";
+import Image from "next/image";
+import {Sponsor, sponsors} from "../../config/sponsors";
+import {useResponsive} from "../../lib/hooks/useResponsive";
+import {useTranslations} from "next-intl";
+import {customColors} from "../../config/colors";
+
+const {Text, Title} = Typography;
+const {useToken} = theme;
+
+interface SponsorCardProps {
+ sponsor: Sponsor;
+ index: number;
+}
+
+export default function SponsorCard({sponsor, index}: SponsorCardProps) {
+ const {token} = useToken();
+ const screens = useResponsive();
+ const t = useTranslations("app.sponsors");
+
+ const isMobile = !screens.md;
+
+ const handleVisitWebsite = () => {
+ window.open(sponsor.link, "_blank", "noopener,noreferrer");
+ };
+
+ return (
+
+ {/* Sponsor Content */}
+
+
+ {/* Logo Section */}
+
+
+
+
+ {/* Content Section */}
+
+
+ {t(`${sponsor.id}.name`, {default: sponsor.id})}
+
+
+
+ {t(`${sponsor.id}.description`)}
+
+
+ }
+ onClick={handleVisitWebsite}
+ size={isMobile ? "middle" : "large"}
+ style={{
+ alignSelf: isMobile ? "center" : "flex-start",
+ minWidth: 140,
+ }}
+ >
+ {t("visitWebsite")}
+
+
+
+
+
+ {index < sponsors.length - 1 && (
+
+
+ )}
+
+ );
+}
diff --git a/apps/level_up/components/common/TelegramIcon.tsx b/apps/level_up/components/common/TelegramIcon.tsx
new file mode 100644
index 00000000..fd396c82
--- /dev/null
+++ b/apps/level_up/components/common/TelegramIcon.tsx
@@ -0,0 +1,33 @@
+import React from 'react';
+
+interface TelegramIconProps {
+ color?: string;
+ size?: number | string;
+ className?: string;
+ style?: React.CSSProperties;
+}
+
+export function TelegramIcon({
+ color = 'currentColor',
+ size = 24,
+ className,
+ style
+}: TelegramIconProps) {
+ return (
+
+
+
+ );
+}
diff --git a/apps/level_up/components/common/ThemeToggle.tsx b/apps/level_up/components/common/ThemeToggle.tsx
new file mode 100644
index 00000000..4c1729e0
--- /dev/null
+++ b/apps/level_up/components/common/ThemeToggle.tsx
@@ -0,0 +1,20 @@
+"use client";
+
+import { Button } from "antd";
+import { MoonOutlined, SunOutlined } from "@ant-design/icons";
+import { useTheme } from "next-themes";
+
+export default function ThemeToggle() {
+ const { theme, setTheme } = useTheme();
+
+ return (
+ : }
+ onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
+ className="fixed top-4 right-4"
+ >
+ {theme === "dark" ? "Light" : "Dark"}
+
+ );
+}
diff --git a/apps/level_up/components/common/Wave.tsx b/apps/level_up/components/common/Wave.tsx
new file mode 100644
index 00000000..d2d62d8a
--- /dev/null
+++ b/apps/level_up/components/common/Wave.tsx
@@ -0,0 +1,36 @@
+import { CSSProperties } from "react";
+
+interface WaveProps {
+ width?: string | number;
+ height?: string | number;
+ fill?: string;
+ style?: CSSProperties;
+ className?: string;
+}
+
+export default function Wave({
+ width = "100%",
+ height,
+ fill = "red",
+ style = {},
+ className = "",
+}: WaveProps) {
+ return (
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/Timeline/GameCraftTimeline.tsx b/apps/level_up/components/features/Timeline/GameCraftTimeline.tsx
new file mode 100644
index 00000000..e5f75ae2
--- /dev/null
+++ b/apps/level_up/components/features/Timeline/GameCraftTimeline.tsx
@@ -0,0 +1,142 @@
+import { ConfigProvider, Flex, Timeline, Typography } from "antd";
+import { useTranslations } from "next-intl";
+import Image from "next/image";
+import TimelineDot from "./TimelineDot";
+import TimelineLabel from "./TimelineLabel";
+import TimelineChildren from "./TimelineChildren";
+
+interface GameCraftTimelineProps {
+ padding?: string | number;
+ backgroundColor?: string;
+ className?: string;
+}
+
+export default function GameCraftTimeline({
+ padding = "2rem",
+ backgroundColor = "transparent",
+ className = "",
+}: GameCraftTimelineProps) {
+ const t = useTranslations("app.timeline");
+
+ const items = [
+ {
+ dot: ,
+ children: (
+
+ ),
+ label: ,
+ },
+ {
+ dot: ,
+ children: (
+
+ ),
+ label: (
+
+ ),
+ },
+ {
+ dot: ,
+ children: (
+
+ ),
+ label: ,
+ },
+ {
+ dot: ,
+ children: (
+
+ ),
+ label: ,
+ },
+ {
+ dot: ,
+ children: (
+
+ ),
+ label: ,
+ },
+ {
+ dot: ,
+ children: (
+
+ ),
+ label: ,
+ },
+ {
+ dot: ,
+ children: (
+
+ ),
+ label: (
+
+ ),
+ },
+ ];
+
+ return (
+
+
+
+
+
+ {t("title")}
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/Timeline/TimelineChildren.tsx b/apps/level_up/components/features/Timeline/TimelineChildren.tsx
new file mode 100644
index 00000000..7f9e4840
--- /dev/null
+++ b/apps/level_up/components/features/Timeline/TimelineChildren.tsx
@@ -0,0 +1,45 @@
+import { Flex, Typography } from "antd";
+
+interface TimelineChildrenProps {
+ title: string;
+ time: string;
+ titleLevel?: 1 | 2 | 3 | 4 | 5;
+}
+
+export default function TimelineChildren({
+ title,
+ time,
+ titleLevel = 2,
+}: TimelineChildrenProps) {
+ return (
+
+
+ {title}
+
+
+ {time}
+
+
+ );
+}
diff --git a/apps/level_up/components/features/Timeline/TimelineDot.tsx b/apps/level_up/components/features/Timeline/TimelineDot.tsx
new file mode 100644
index 00000000..c1400dc6
--- /dev/null
+++ b/apps/level_up/components/features/Timeline/TimelineDot.tsx
@@ -0,0 +1,54 @@
+import { Avatar, Flex, theme } from "antd";
+
+interface TimelineDotProps {
+ logoSrc?: string;
+ size?: string;
+}
+
+const { useToken } = theme;
+
+export default function TimelineDot({
+ logoSrc = "/mario/giphy-11.gif",
+ size = "5vw",
+}: TimelineDotProps) {
+ const { token } = useToken();
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/Timeline/TimelineLabel.tsx b/apps/level_up/components/features/Timeline/TimelineLabel.tsx
new file mode 100644
index 00000000..25021d25
--- /dev/null
+++ b/apps/level_up/components/features/Timeline/TimelineLabel.tsx
@@ -0,0 +1,32 @@
+import { Flex } from "antd";
+import Image from "next/image";
+
+interface TimelineLabelProps {
+ logo: string;
+ alt?: string;
+ width?: string;
+}
+
+export default function TimelineLabel({
+ logo,
+ alt = "Timeline step",
+ width = "30%",
+}: TimelineLabelProps) {
+ return (
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/Timeline/index.ts b/apps/level_up/components/features/Timeline/index.ts
new file mode 100644
index 00000000..45a9a4e0
--- /dev/null
+++ b/apps/level_up/components/features/Timeline/index.ts
@@ -0,0 +1,5 @@
+export { default as GameCraftTimeline } from './GameCraftTimeline'
+export { default as TimelineDot } from './TimelineDot'
+export { default as TimelineLabel } from './TimelineLabel'
+export { default as TimelineChildren } from './TimelineChildren'
+
diff --git a/apps/level_up/components/features/cart/CartButton.tsx b/apps/level_up/components/features/cart/CartButton.tsx
new file mode 100644
index 00000000..9d3fbc3f
--- /dev/null
+++ b/apps/level_up/components/features/cart/CartButton.tsx
@@ -0,0 +1,71 @@
+'use client';
+
+import {Badge, Button, Spin} from "antd";
+import {useFormatter} from "lib/hooks/useFormatter";
+import {
+ cartErrorSelector,
+ cartPresentationsCountSelector,
+ cartLoadingSelector,
+} from "lib/store/cart/cart.selectors";
+import {useAppDispatch, useAppSelector} from "lib/store/store";
+import {useEffect, useMemo} from "react";
+import {FaShoppingCart} from "react-icons/fa";
+import {CgSpinnerTwoAlt} from "react-icons/cg";
+import {fetchCartThunk} from "lib/store/cart/cart.thunk";
+import {useRouter as nextIntlRouter} from "lib/routing";
+import {useRouter} from "@bprogress/next";
+import {ShoppingCartOutlined} from "@ant-design/icons";
+import {LoadingOutlined} from "@ant-design/icons";
+
+const CartButton = () => {
+ const {formatNumberToMoney} = useFormatter();
+ const router = useRouter({customRouter: nextIntlRouter});
+ const dispatch = useAppDispatch();
+ const counter = useAppSelector(cartPresentationsCountSelector);
+ const error = useAppSelector(cartErrorSelector);
+ const loading = useAppSelector(cartLoadingSelector);
+
+ useEffect(() => {
+ dispatch(fetchCartThunk());
+ }, []);
+
+ const badge = useMemo(() => {
+ if (loading) {
+ return ;
+ } else {
+ if (error) {
+ return "!";
+ } else {
+ return formatNumberToMoney(counter);
+ }
+ }
+ }, [counter, error, loading]);
+
+ return (
+ router.push("/dashboard/shopping-bag")}
+ >
+
+
+
+
+ // router.push("/dashboard/shopping-bag")}
+ // >
+ //
+ //
+ // {badge}
+ //
+ //
+ );
+};
+
+export default CartButton;
diff --git a/apps/level_up/components/features/cart/PayBox.tsx b/apps/level_up/components/features/cart/PayBox.tsx
new file mode 100644
index 00000000..3854188b
--- /dev/null
+++ b/apps/level_up/components/features/cart/PayBox.tsx
@@ -0,0 +1,244 @@
+"use client";
+
+import {
+ cartPresentationsSelector,
+ cartLoadingSelector,
+ cartPaymentDataSelector,
+} from "lib/store/cart/cart.selectors";
+import { createAndCheckoutThunk } from "lib/store/order/order.thunk";
+import {
+ applyBonusCodeThunk,
+ removeBonusCodeThunk,
+} from "lib/store/cart/cart.thunk";
+import { useAppDispatch, useAppSelector } from "lib/store/store";
+import { useCallback, useState } from "react";
+import {
+ Flex,
+ Divider,
+ Typography,
+ Button as AntButton,
+ theme,
+ Spin,
+ Modal,
+ Input,
+ message,
+} from "antd";
+import { useFormatter } from "lib/hooks/useFormatter";
+import { toast, ToastContainer } from "react-toastify";
+import { FaCross } from "react-icons/fa";
+import { MdCancel } from "react-icons/md";
+
+const { useToken } = theme;
+
+export function PayBox() {
+ const dispatch = useAppDispatch();
+ const cartItems = useAppSelector(cartPresentationsSelector);
+ const paymentData = useAppSelector(cartPaymentDataSelector);
+ const loading = useAppSelector(cartLoadingSelector);
+ const { token, theme } = useToken();
+ const { formatNumberToMoney } = useFormatter();
+
+ // State for discount code modal and input
+ const [isDiscountModalOpen, setIsDiscountModalOpen] = useState(false);
+ const [discountCode, setDiscountCode] = useState("");
+ const [discountLoading, setDiscountLoading] = useState(false);
+
+ const applyDiscount = () => {
+ setIsDiscountModalOpen(true);
+ };
+
+ const handleDiscountSubmit = async () => {
+ if (!discountCode.trim()) {
+ toast.error("لطفاً کد تخفیف را وارد کنید");
+ return;
+ }
+
+ setDiscountLoading(true);
+ try {
+ await dispatch(applyBonusCodeThunk(discountCode.trim())).unwrap();
+ toast.success("کد تخفیف با موفقیت اعمال شد");
+ setIsDiscountModalOpen(false);
+ setDiscountCode("");
+ } catch (error) {
+ toast.error("کد تخفیف معتبر نمی باشد");
+ } finally {
+ setDiscountLoading(false);
+ }
+ };
+
+ const handleDiscountCancel = () => {
+ setIsDiscountModalOpen(false);
+ setDiscountCode("");
+ };
+
+ const checkout = useCallback(() => {
+ dispatch(createAndCheckoutThunk(cartItems.map((item) => item.id)))
+ .unwrap()
+ .then((res) => {
+ window.open(res.payment_url, "_blank");
+ })
+ .catch((error) => {
+ console.error(error);
+ });
+ }, [cartItems, dispatch]);
+
+ if (loading) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+ {!paymentData.discountCode ? (
+ <>
+ کد تخفیف دارید؟
+
+ وارد کردن
+
+ >
+ ) : (
+ <>
+ کد تخفیف شما:
+ <>
+
+
+ {paymentData.discountCode}
+
+ }
+ onClick={() => dispatch(removeBonusCodeThunk())}
+ style={{ padding: 0, margin: 0 }}
+ aria-label="حذف کد تخفیف"
+ />
+
+ >
+ >
+ )}
+
+
+
+
+ جمع کل:
+
+ {formatNumberToMoney(paymentData.subTotal)} تومان
+
+
+
+ {paymentData.discountAmount > 0 && (
+
+ تخفیف:
+
+ -{formatNumberToMoney(paymentData.discountAmount)} تومان
+
+
+ )}
+
+
+
+
+
+ مبلغ نهایی:
+
+
+ {formatNumberToMoney(paymentData.total)} تومان
+
+
+
+
+
+
+ پرداخت
+
+
+
+
+
+ {/* Discount Code Modal */}
+
+
+ کد تخفیف خود را وارد کنید:
+ setDiscountCode(e.target.value)}
+ onPressEnter={handleDiscountSubmit}
+ size="large"
+ disabled={discountLoading}
+ />
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/cart/ProductCart.tsx b/apps/level_up/components/features/cart/ProductCart.tsx
new file mode 100644
index 00000000..ddbb06ec
--- /dev/null
+++ b/apps/level_up/components/features/cart/ProductCart.tsx
@@ -0,0 +1,120 @@
+import {digitsToHindi, moneyFormat} from "@ssc/utils";
+import Image from "next/image";
+import React from "react";
+import {Card, Flex, Typography, Button, theme, Grid} from 'antd';
+import {DeleteOutlined} from "@ant-design/icons";
+
+const {useToken} = theme;
+const {useBreakpoint} = Grid;
+
+interface Props {
+ title: string;
+ price: string;
+ imageUrl: string;
+ onRemove: () => void;
+}
+
+const ProductCart = (props: Props) => {
+ const {token} = useToken();
+ const screens = useBreakpoint();
+
+ const isMobile = !screens.md;
+ const imageSize = isMobile ? 48 : 64;
+
+ return (
+
+
+ {/* Main content section - Image and Title */}
+
+
+
+ {props.title}
+
+
+
+ {/* Price and Action section */}
+
+
+ {digitsToHindi(moneyFormat(props.price))} تومان
+
+ }
+ onClick={props.onRemove}
+ style={{
+ color: token.colorTextSecondary,
+ padding: isMobile ? token.paddingXXS : token.paddingXS,
+ minWidth: isMobile ? 'auto' : 'auto'
+ }}
+ aria-label="حذف محصول"
+ />
+
+
+
+ );
+};
+
+export default ProductCart;
diff --git a/apps/level_up/components/features/competitions/CompetitionCard.tsx b/apps/level_up/components/features/competitions/CompetitionCard.tsx
new file mode 100644
index 00000000..fdd8c3e2
--- /dev/null
+++ b/apps/level_up/components/features/competitions/CompetitionCard.tsx
@@ -0,0 +1,597 @@
+"use client";
+
+import { useTranslations } from "next-intl";
+import Image from "next/image";
+import { ItemType } from "@ssc/core";
+import { useState } from "react";
+import {
+ Card,
+ Typography,
+ Button as AntButton,
+ Flex,
+ Badge,
+ Modal,
+ theme,
+ Space,
+ Row,
+ Col,
+} from "antd";
+import {
+ ClockCircleOutlined,
+ EyeOutlined,
+ TeamOutlined,
+} from "@ant-design/icons";
+import { useFormatter } from "lib/hooks/useFormatter";
+import { useAppDispatch, useAppSelector } from "lib/store/store";
+import {
+ cartLoadingSelector,
+ itemInCartSelector,
+} from "lib/store/cart/cart.selectors";
+// import { useIscompetitionPurchased } from "lib/hooks/usePurchases";
+import { useAuth } from "lib/hooks/useAuth";
+import { digitsToHindi } from "@ssc/utils";
+import { GroupCompetitionDetails } from "@ssc/core/lib/types/api/competitions/competitions";
+import GroupModal from "./GroupModal";
+import React from "react";
+
+const { useToken } = theme;
+
+interface Props {
+ competitionImage?: string;
+ competition: GroupCompetitionDetails;
+ isPurchased?: boolean;
+ dashboardMode?: boolean;
+}
+
+// simple RTL detection (Persian/Arabic Unicode ranges)
+const isRTL = (text?: string) =>
+ !!text && /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF]/.test(text);
+
+export function CompetitionCard({
+ competition,
+ competitionImage: workshopImage,
+ isPurchased = false,
+ dashboardMode = false,
+}: Props) {
+ const t = useTranslations();
+ const [showModal, setShowModal] = useState(false);
+ const { formatNumberToMoney } = useFormatter();
+ const dispatch = useAppDispatch();
+ const itemInCart = useAppSelector(
+ itemInCartSelector(competition.id, ItemType.PRESENTATION)
+ );
+ // const iscompetitionPurchased = useIscompetitionPurchased(competition.id);
+ const buttonShouldBeDisabled = useAppSelector(cartLoadingSelector);
+ const [buttonLoading, setButtonLoading] = useState(false);
+ const { isAuthenticated } = useAuth();
+ const { token } = useToken();
+
+ const { data: teams } = useAppSelector((s) => s.teams);
+
+ if (
+ dashboardMode &&
+ !teams.find((team) => team.group_competition_details?.id == competition.id)
+ )
+ return;
+
+ // const [isRegistered, setIsRegistered] = useState(false);
+ // const handleIsRegistered = (registered: boolean) =>
+ // setIsRegistered(registered);
+
+ // console.log(competition.event_title, dashboardMode, isRegistered);
+
+ // if (dashboardMode && !isRegistered) return;
+
+ // const isSelected = useMemo(() => {
+ // return itemInCart !== undefined;
+ // }, [itemInCart]);
+
+ // Color palette
+ const colorStripes = ["#4CAF50", "#2196F3", "#FFC107", "#F44336"];
+
+ // const buttonText = useMemo(() => {
+ // if (!isAuthenticated) return t("workshop.loginToContinue");
+ // if (isSelected) {
+ // return t("workshop.removeFromCart");
+ // } else {
+ // return competition.is_paid
+ // ? t("workshop.addToCart")
+ // : t("workshop.enroll");
+ // }
+ // }, [isSelected, competition, t, isAuthenticated]);
+
+ // Format date and time
+ const formatDateTime = (dateTimeString: string) => {
+ const date = new Date(dateTimeString);
+ return date.toLocaleString("fa-IR", {
+ timeZone: "UTC",
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+ };
+
+ // Format time only (for end time when it's same day)
+ const formatTime = (dateTimeString: string) => {
+ const date = new Date(dateTimeString);
+ return date.toLocaleString("fa-IR", {
+ timeZone: "UTC",
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+ };
+
+ // Check if start and end dates are on the same day
+ const isSameDay = (startTime: string, endTime: string) => {
+ const start = new Date(startTime);
+ const end = new Date(endTime);
+ return start.toDateString() === end.toDateString();
+ };
+
+ // Format date time range
+ const formatDateTimeRange = () => {
+ if (!competition.end_datetime) {
+ return formatDateTime(competition.start_datetime);
+ }
+
+ if (isSameDay(competition.start_datetime, competition.end_datetime)) {
+ // Same day: show date + start time - end time
+ return `${formatDateTime(competition.start_datetime)} - ${formatTime(
+ competition.end_datetime
+ )}`;
+ } else {
+ // Different days: show full start date/time - full end date/time
+ return `${formatDateTime(competition.start_datetime)} - ${formatDateTime(
+ competition.end_datetime
+ )}`;
+ }
+ };
+
+ const titleIsRTL = isRTL(competition.title);
+ const descriptionIsRTL = isRTL(competition.description);
+
+ const formatPrice = () => {
+ return competition.is_paid
+ ? t("workshop.per_member") +
+ " " +
+ formatNumberToMoney(competition.price_per_member)
+ : t("workshop.free");
+ };
+
+ return (
+ <>
+ {/* Competition Card */}
+
+ {/* Header Image with Stripes */}
+
+ {/* Workshop Image */}
+
+
+ {/* Colored Stripes */}
+
+ {colorStripes.map((color, index) => (
+
+ ))}
+
+
+ {/* View Details Button */}
+
+
setShowModal(true)}
+ type="primary"
+ icon={}
+ size="small"
+ style={{
+ borderRadius: token.borderRadiusLG,
+ backgroundColor: "rgba(0, 0, 0, 0.7)",
+ borderColor: "transparent",
+ }}
+ >
+ جزئیات بیشتر
+
+
+
+
+ {/* Content */}
+
+ {/* Title and Badges */}
+
+
+ {competition.title}
+
+
+ {/* Description */}
+
+ {competition.description}
+
+
+ {/* Teams */}
+
+
+
+ {t("workshop.teamSizes")}: {competition.min_group_size} -{" "}
+ {competition.max_group_size}
+
+
+
+ {/* Date and Time */}
+
+
+
+ {formatDateTimeRange()}
+
+
+
+ {/* Capacity */}
+
+
+ {t("workshop.teamsCapacity") +
+ ": " +
+ digitsToHindi(competition.max_teams)}
+
+
+
+ {t("workshop.remainingCapacity") +
+ ": " +
+ digitsToHindi(competition.remaining_capacity)}
+
+
+
+ {/* Price and Add to Cart */}
+
+
+ {formatPrice()} {competition.is_paid && t("common.currency")}
+
+
+ {/* Show purchased button if already purchased, otherwise show add to cart/register button */}
+ {/* {iscompetitionPurchased ? (
+
+ خریداری شده
+
+ ) : (
+ :
+ }
+ onClick={isSelected ? removeFromCart : handleAddToCart}
+ disabled={
+ !competition.is_active ||
+ buttonShouldBeDisabled ||
+ competition.capacity <= 0 ||
+ !isAuthenticated
+ }
+ loading={buttonLoading}
+ style={{
+ borderRadius: token.borderRadius,
+ height: "36px",
+ }}
+ >
+ {buttonText}
+
+ )} */}
+
+
+
+
+
+
+
+ {/* Modal */}
+ setShowModal(false)}
+ footer={[
+ // Only show action button if not purchased
+ // ...(!isPurchased
+ // ? [
+ // :
+ // }
+ // onClick={() => {
+ // if (isSelected) {
+ // removeFromCart();
+ // } else {
+ // handleAddToCart();
+ // }
+ // setShowModal(false);
+ // }}
+ // disabled={
+ // !competition.is_active ||
+ // buttonShouldBeDisabled ||
+ // competition.capacity <= 0 ||
+ // !isAuthenticated
+ // }
+ // loading={buttonLoading}
+ // >
+ // {buttonText}
+ // ,
+ // ]
+ // : []),
+ ,
+ ]}
+ width={700}
+ style={{ top: 50, zIndex: 200 }}
+ styles={{
+ body: { maxHeight: "70vh", overflowY: "auto" },
+ }}
+ >
+
+ {competition.title}
+
+
+ {/* Workshop Image */}
+ {competition.poster && (
+
+
+ {/* Colored Stripes */}
+
+ {colorStripes.map((color, index) => (
+
+ ))}
+
+
+ )}
+
+ {/* Workshop Details */}
+
+ {/* Left Column */}
+
+
+ {/* Description */}
+
+
+ {t("workshop.description")}
+
+
+ {competition.description}
+
+
+
+ {/* Date and Time */}
+
+
+ {t("workshop.schedule")}
+
+
+
+
+ {formatDateTimeRange()}
+
+
+
+
+
+
+ {/* Right Column */}
+
+
+ {/* Teams */}
+
+
+ {t("workshop.teamSizes")}
+
+
+
+
+ {competition.min_group_size} - {competition.max_group_size}
+
+
+
+
+ {/* Price */}
+
+
+ {t("workshop.price")}
+
+
+ {formatPrice()} {competition.is_paid && t("common.currency")}
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/apps/level_up/components/features/competitions/CompetitionsGrid.tsx b/apps/level_up/components/features/competitions/CompetitionsGrid.tsx
new file mode 100644
index 00000000..8dc14769
--- /dev/null
+++ b/apps/level_up/components/features/competitions/CompetitionsGrid.tsx
@@ -0,0 +1,72 @@
+"use client";
+
+import { Row, Col } from "antd";
+import { CompetitionCard } from "./CompetitionCard";
+import { GroupCompetitionDetails } from "@ssc/core/lib/types/api/competitions/competitions";
+
+interface Props {
+ competitions?: GroupCompetitionDetails[];
+ competitionImage?: string;
+ dashboardMode?: boolean;
+}
+
+export function CompetitionsGrid({
+ competitions = [],
+ competitionImage: workshopImage,
+ dashboardMode = false,
+}: Props) {
+ if (dashboardMode)
+ return (
+
+ {competitions.map((item) => (
+
+
+
+ ))}
+
+ );
+
+ return (
+
+ {competitions.map((competition) => (
+
+
+
+ ))}
+
+ );
+}
diff --git a/apps/level_up/components/features/competitions/CompetitonsList.tsx b/apps/level_up/components/features/competitions/CompetitonsList.tsx
new file mode 100644
index 00000000..8235fede
--- /dev/null
+++ b/apps/level_up/components/features/competitions/CompetitonsList.tsx
@@ -0,0 +1,125 @@
+"use client";
+
+import { Flex, theme, Typography, Spin, Alert } from "antd";
+import { CompetitionsGrid } from "./CompetitionsGrid";
+import { useTranslations } from "next-intl";
+import { useResponsive } from "../../../lib/hooks/useResponsive";
+import { useEffect, useMemo, useState } from "react";
+import { clientApi } from "lib/api/client/clientApi";
+import { eventId } from "lib/utils/constants";
+import { GroupCompetitionsList } from "@ssc/core/lib/types/api/competitions/competitions";
+
+const { useToken } = theme;
+
+interface Props {
+ padding?: string;
+ backgroundColor?: string;
+ dashboardMode?: boolean;
+}
+
+export function CompetitionsList({
+ padding = "3rem 2rem",
+ backgroundColor,
+ dashboardMode = false,
+}: Props) {
+ const { token } = useToken();
+ const screens = useResponsive();
+ const t = useTranslations();
+ const [competitions, setCompetitions] = useState<{
+ loading: boolean;
+ error?: string;
+ data?: GroupCompetitionsList;
+ }>({ loading: true });
+
+ useEffect(() => {
+ clientApi.competitions
+ .getGroupCompetitionsList(eventId, undefined)
+ .then((response) => {
+ if (response.status === 200) {
+ setCompetitions({
+ loading: false,
+ data: response.data.data,
+ });
+ } else {
+ setCompetitions({ loading: false, error: "failed to fetch" });
+ }
+ })
+ .catch((err) => {
+ setCompetitions({ loading: false, error: "failed to fetch" });
+ });
+ }, []);
+
+ const content = useMemo(() => {
+ if (competitions.loading) {
+ return (
+
+
+
+ );
+ } else if (competitions.error) {
+ return (
+
+ );
+ } else {
+ return competitions.data.results.length === 0 ? (
+
+ ) : (
+
+ );
+ }
+ }, [competitions, t]);
+
+ if (dashboardMode) return content;
+
+ return (
+
+ {/* */}
+
+
+ {t("workshop.competitions")}
+
+
+ {content}
+
+
+ );
+}
diff --git a/apps/level_up/components/features/competitions/GroupModal.tsx b/apps/level_up/components/features/competitions/GroupModal.tsx
new file mode 100644
index 00000000..b9343338
--- /dev/null
+++ b/apps/level_up/components/features/competitions/GroupModal.tsx
@@ -0,0 +1,365 @@
+import { Alert, Button, Flex, Modal, Spin, theme, Typography } from "antd";
+import { clientApi } from "lib/api/client/clientApi";
+import { eventId } from "lib/utils/constants";
+import React, { useEffect, useMemo, useState } from "react";
+import { TeamDetails } from "@ssc/core/lib/types/api/Teams/teams";
+import { useTranslations } from "next-intl";
+import { digitsToHindi } from "@ssc/utils";
+import { useAuth } from "lib/hooks/useAuth";
+import { HiCash, HiCheck, HiPlus } from "react-icons/hi";
+import { toast } from "react-toastify";
+import { MdOutlineWatch } from "react-icons/md";
+import { useAppDispatch, useAppSelector } from "lib/store/store";
+import {
+ fetchTeamsThunk,
+ payTeamThunk,
+ registerTeamThunk,
+} from "lib/store/teams/teams.thunk";
+
+interface Props {
+ isRTL: boolean;
+ competitionId: number;
+ minTeamSize: number;
+ maxTeamSize: number;
+ disable: boolean;
+ registered?: (isRegistered: boolean) => void;
+}
+
+const GroupModal = ({
+ isRTL,
+ competitionId,
+ registered,
+ minTeamSize,
+ maxTeamSize,
+ disable,
+}: Props) => {
+ const [showGroupModal, setShowGroupModal] = useState(false);
+ const t = useTranslations();
+ const { isAuthenticated } = useAuth();
+ const { useToken } = theme;
+ const { token } = useToken();
+ const [filteredTeams, setFilteredTeams] = useState([]);
+
+ const dispatch = useAppDispatch();
+ const { data: teams, loading, error } = useAppSelector((s) => s.teams);
+
+ const isTeamSizeValid = (teamSize: number) => {
+ if (teamSize < minTeamSize || teamSize > maxTeamSize) return false;
+ return true;
+ };
+
+ const isRegistered = !!teams.find(
+ (team) =>
+ team.group_competition_details?.id == competitionId &&
+ team.status === "active"
+ );
+
+ const inPaymentProgress = !!teams.find(
+ (team) =>
+ team.group_competition_details?.id == competitionId &&
+ (team.status === "approved_awaiting_payment" ||
+ team.status === "awaiting_payment_confirmation")
+ );
+
+ if (registered) registered(isRegistered);
+
+ const buttonText = () =>
+ isAuthenticated
+ ? inPaymentProgress
+ ? "در انتظار پرداخت"
+ : isRegistered
+ ? "ثبت نام شده"
+ : "ثبت نام"
+ : "ابتدا وارد شوید";
+
+ // const buttonText = useMemo(() => {
+ // if (!isAuthenticated) return t("workshop.loginToContinue");
+ // if (isSelected) {
+ // return t("workshop.removeFromCart");
+ // } else {
+ // return presentation.is_paid
+ // ? t("workshop.addToCart")
+ // : t("workshop.enroll");
+ // }
+ // }, [isSelected, presentation, t, isAuthenticated]);
+
+ const statusButton = (status: string, teamId: number) => {
+ switch (status) {
+ case "pending_admin_verification":
+ return (
+ }>
+ در انتظار تایید
+
+ );
+ case "approved_awaiting_payment":
+ return (
+ }
+ onClick={() => handlePayment(teamId)}
+ >
+ پرداخت
+
+ );
+ case "awaiting_payment_confirmation":
+ return (
+ }
+ onClick={() => handlePayment(teamId)}
+ >
+ پرداخت
+
+ );
+ case "active":
+ return (
+ }>
+ ثبت نام شده
+
+ );
+ default:
+ break;
+ }
+ };
+
+ useEffect(() => {
+ if (isAuthenticated)
+ dispatch(fetchTeamsThunk())
+ .unwrap()
+ .catch((err) => {
+ toast.error(err.message);
+ });
+
+ setFilteredTeams(
+ teams.filter(
+ (team) =>
+ isTeamSizeValid(team.memberships.length) &&
+ (!team.group_competition_details ||
+ team.group_competition_details.id == competitionId)
+ )
+ );
+ }, [isAuthenticated, showGroupModal]);
+
+ const handlePayment = (teamId: number) => {
+ dispatch(payTeamThunk(teamId))
+ .unwrap()
+ .then((res) => {
+ if (res.paymentUrl) {
+ window.open(res.paymentUrl, "_blank");
+ } else {
+ // free
+ toast.success("پرداخت با موفقیت انجام شد");
+ }
+ })
+ .catch((err) => {
+ toast.error(err.message);
+ });
+ };
+
+ const handleRegisterCompetition = (team: TeamDetails) => {
+ const pending = team.memberships.some(
+ (member) => member.status === "pending"
+ );
+ if (pending) {
+ toast.error("تمامی اعضای تیم باید درخواست عضویت خود را تایید کنند");
+ return;
+ }
+
+ dispatch(registerTeamThunk({ teamId: team.id, competitionId }))
+ .unwrap()
+ .then((res) => {
+ toast.success(res.message);
+ })
+ .catch((err) => {
+ toast.error(err.message);
+ });
+ };
+
+ const content = useMemo(() => {
+ if (loading) {
+ return (
+
+
+
+ );
+ } else if (error) {
+ return (
+
+ );
+ } else {
+ return filteredTeams.length === 0 ? (
+
+ با هر تیمی تنها یک ثبت نام ممکن است، با مراجعه به
+ داشبورد{" "}
+
+ سایت انجمن (ceit-ssc.ir)
+ {" "}
+ میتوانید تیم جدید با اعضای دلخواه بسازید
+
+ }
+ type="info"
+ showIcon
+ />
+ ) : (
+ filteredTeams.map((team) => {
+ return (
+
+
+
+ {team.name}
+
+
+ سرگروه:{" "}
+ {team.leader_details.first_name +
+ " " +
+ team.leader_details.last_name}
+
+
+ تعداد اعضا: {digitsToHindi(team.memberships.length)}
+
+
+
+ {team.group_competition_details ? (
+ statusButton(team.status, team.id)
+ ) : (
+ handleRegisterCompetition(team)}
+ icon={}
+ >
+ ثبت تیم
+
+ )}
+
+ );
+ })
+ );
+ }
+ }, [teams, filteredTeams, t, loading]);
+
+ const cardButton = () => (
+ setShowGroupModal(true)}
+ type="primary"
+ size="middle"
+ style={{
+ borderRadius: token.borderRadius,
+ height: "36px",
+ }}
+ disabled={!isAuthenticated || isRegistered || disable}
+ icon={isRegistered ? : }
+ >
+ {buttonText()}
+
+ );
+
+ return (
+ <>
+ {cardButton()}
+ setShowGroupModal(false)}
+ footer={
+ [
+ // Only show action button if not purchased
+ // ...(!isPurchased
+ // ? [
+ // :
+ // }
+ // onClick={() => {
+ // if (isSelected) {
+ // removeFromCart();
+ // } else {
+ // handleAddToCart();
+ // }
+ // setShowModal(false);
+ // }}
+ // disabled={
+ // !competition.is_active ||
+ // buttonShouldBeDisabled ||
+ // competition.capacity <= 0 ||
+ // !isAuthenticated
+ // }
+ // loading={buttonLoading}
+ // >
+ // {buttonText}
+ // ,
+ // ]
+ // : []),
+ ]
+ }
+ width={700}
+ style={{ top: 50, zIndex: 200 }}
+ styles={{
+ body: { maxHeight: "70vh", overflowY: "auto" },
+ }}
+ >
+
+ انتخاب تیم برای ثبت نام
+
+
+ {isAuthenticated && content}
+
+
+ >
+ );
+};
+
+export default GroupModal;
diff --git a/apps/level_up/components/features/games/GameCard.tsx b/apps/level_up/components/features/games/GameCard.tsx
new file mode 100644
index 00000000..7bcaeefe
--- /dev/null
+++ b/apps/level_up/components/features/games/GameCard.tsx
@@ -0,0 +1,108 @@
+"use client";
+
+import React from "react";
+import { Button, Flex, theme, Typography } from "antd";
+import { HeartOutlined } from "@ant-design/icons";
+import { useTranslations } from "next-intl";
+import Image from "next/image";
+
+const { useToken } = theme;
+
+interface GameCardProps {
+ gameName?: string;
+ gameDescription?: string;
+ gameImage?: string;
+}
+
+export const GameCard: React.FC = ({
+ gameName = "Game Name",
+ gameDescription = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores dicta obcaecati quae! Ab aspernatur blanditiis dignissimos eum fugiat itaque maxime modi nisi non omnis ratione repellat sed suscipit, totam vero.",
+ gameImage = "/images/logo/gameTestImage.jpg"
+}) => {
+ const { token } = useToken();
+ const t = useTranslations("app.dashboard.games");
+
+ return (
+
+
+
+
+
+
+
+ {gameName}
+
+
+
+
+ {gameDescription}
+
+
+ }
+ />
+
+ {t("download")}
+
+
+
+
+ );
+};
diff --git a/apps/level_up/components/features/games/UploadGameForm.tsx b/apps/level_up/components/features/games/UploadGameForm.tsx
new file mode 100644
index 00000000..d61abcb8
--- /dev/null
+++ b/apps/level_up/components/features/games/UploadGameForm.tsx
@@ -0,0 +1,89 @@
+"use client";
+
+import React from "react";
+import { Button, Flex, Input, theme, Typography, Upload } from "antd";
+import { PlusOutlined } from "@ant-design/icons";
+import { useTranslations } from "next-intl";
+
+const { useToken } = theme;
+
+export const UploadGameForm: React.FC = () => {
+ const { token } = useToken();
+ const t = useTranslations("app.dashboard.games");
+
+ return (
+
+
+
+
+ {t("upload")}
+
+
+
+
+
+
+
+
+
+
+
+
+ {t("submitGame")}
+
+
+ );
+};
diff --git a/apps/level_up/components/features/home/AboutUs.tsx b/apps/level_up/components/features/home/AboutUs.tsx
new file mode 100644
index 00000000..a620ae26
--- /dev/null
+++ b/apps/level_up/components/features/home/AboutUs.tsx
@@ -0,0 +1,74 @@
+"use client";
+
+import { Button, Col, Flex, Row, Typography } from "antd";
+import Image from "next/image";
+import { useRouter as useNextIntlRouter } from "../../../lib/navigation";
+import { useTranslations } from "next-intl";
+import { customColors } from "../../../config/colors";
+import { useRouter } from "@bprogress/next";
+
+interface AboutUsProps {
+ padding?: string;
+ backgroundColor?: string;
+}
+
+export function AboutUs({
+ padding = "3rem 2rem",
+ backgroundColor,
+}: AboutUsProps) {
+ const router = useRouter({
+ customRouter: useNextIntlRouter,
+ });
+ const t = useTranslations("app");
+
+ return (
+
+
+
+
+
+
+ {t("aboutUs.title")}
+
+
+ {t("aboutUs.description")}
+
+
+ router.push("/staffs")}
+ >
+ {t("buttons.staffs")}
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/home/GameCraftIntro.tsx b/apps/level_up/components/features/home/GameCraftIntro.tsx
new file mode 100644
index 00000000..ec0b2caf
--- /dev/null
+++ b/apps/level_up/components/features/home/GameCraftIntro.tsx
@@ -0,0 +1,147 @@
+"use client";
+
+import {Button, Col, ConfigProvider, Flex, Row, Typography} from "antd";
+import {InstagramOutlined, XOutlined, YoutubeFilled} from "@ant-design/icons";
+import {useTranslations} from "next-intl";
+import Image from "next/image";
+import {useResponsive} from "../../../lib/hooks/useResponsive";
+import {darkTheme} from "../../../components/providers/AntDesignProvider";
+import {customColors} from "../../../config/colors";
+import {gameCraftSocialLinks, sscSocialLinks} from "../../../config/socialLinks";
+import {TelegramIcon} from "../../../components/common/TelegramIcon";
+
+interface GameCraftIntroProps {
+ padding?: string;
+ backgroundColor?: string;
+}
+
+export function GameCraftIntro({
+ padding = "3rem 2rem",
+ backgroundColor,
+ }: GameCraftIntroProps) {
+ const t = useTranslations("app");
+ const screens = useResponsive();
+
+ return (
+
+
+
+
+ {/* Bubble Background - using the actual SVG from React project */}
+
+
+
+
+
+ {t("intro.title")}
+
+
+
+ {t("intro.subtitle")}
+
+
+
+ {t("intro.description")}
+
+
+
+ }
+ style={{padding: "2rem"}}
+ href={sscSocialLinks.telegram}
+ target="_blank"
+ rel="noopener noreferrer"
+ />
+ }
+ style={{padding: "2rem"}}
+ href={sscSocialLinks.instagram}
+ target="_blank"
+ rel="noopener noreferrer"
+ />
+ }
+ style={{padding: "2rem"}}
+ href={sscSocialLinks.twitter}
+ target="_blank"
+ rel="noopener noreferrer"
+ />
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/home/Prizes.tsx b/apps/level_up/components/features/home/Prizes.tsx
new file mode 100644
index 00000000..d32bd4e9
--- /dev/null
+++ b/apps/level_up/components/features/home/Prizes.tsx
@@ -0,0 +1,139 @@
+'use client'
+
+import { Col, Flex, Row, Typography } from 'antd';
+import { useTranslations } from 'next-intl';
+import Image from 'next/image';
+
+interface PrizeCardProps {
+ teamImage: string;
+ teamTitle: string;
+ teamPrize: string;
+}
+
+function PrizeCard({ teamImage, teamTitle, teamPrize }: PrizeCardProps) {
+ return (
+
+
+
+ {teamTitle}
+
+
+ {teamPrize}
+
+
+ );
+}
+
+interface PrizesProps {
+ padding?: string;
+ backgroundColor?: string;
+}
+
+export function Prizes({ padding = '3rem 2rem', backgroundColor }: PrizesProps) {
+ const t = useTranslations('app');
+
+ // Using the exact same prize data structure as React project
+ const prizes = [
+ {
+ teamImage: '/assets/svg/prize-1.svg',
+ teamTitle: t('prizes.firstTeam.title'),
+ teamPrize: t('prizes.firstTeam.prize')
+ },
+ {
+ teamImage: '/assets/svg/prize-2.svg',
+ teamTitle: t('prizes.secondTeam.title'),
+ teamPrize: t('prizes.secondTeam.prize')
+ },
+ {
+ teamImage: '/assets/svg/prize-3.svg',
+ teamTitle: t('prizes.thirdTeam.title'),
+ teamPrize: t('prizes.thirdTeam.prize')
+ }
+ ];
+
+ return (
+
+ {/* Background bubble effect - matching React project exactly */}
+
+
+
+
+
+ {t('prizes.title')}
+
+
+
+ {prizes.map((prize, index) => (
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/apps/level_up/components/features/home/Sponsors.tsx b/apps/level_up/components/features/home/Sponsors.tsx
new file mode 100644
index 00000000..003825d5
--- /dev/null
+++ b/apps/level_up/components/features/home/Sponsors.tsx
@@ -0,0 +1,85 @@
+"use client";
+
+import {Button, Col, Flex, Row, Typography} from "antd";
+import {useTranslations} from "next-intl";
+import Image from "next/image";
+import {sponsors} from "../../../config/sponsors";
+
+interface SponsorsProps {
+ padding?: string;
+ backgroundColor?: string;
+}
+
+export function Sponsors({padding = "3rem 2rem", backgroundColor}: SponsorsProps) {
+ const t = useTranslations("app");
+
+ return (
+
+
+ {t("sponsors.title")}
+
+
+ {sponsors.map((sponsor, index) => (
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/apps/level_up/components/features/popup/WelcomePopup.tsx b/apps/level_up/components/features/popup/WelcomePopup.tsx
new file mode 100644
index 00000000..a1392198
--- /dev/null
+++ b/apps/level_up/components/features/popup/WelcomePopup.tsx
@@ -0,0 +1,396 @@
+import { useRouter } from "@bprogress/next";
+import { useRouter as useNextIntlRouter } from "../../../lib/navigation";
+import { Button, Flex, Typography, Modal } from "antd";
+import { CloseOutlined } from "@ant-design/icons";
+import React, { useState, useEffect } from "react";
+import { useLocale } from "next-intl";
+import { digitsToHindi } from "@ssc/utils";
+import { toast } from "react-toastify";
+
+const WelcomePopup = () => {
+ const router = useRouter({
+ customRouter: useNextIntlRouter,
+ });
+ const locale = useLocale();
+ const [isVisible, setIsVisible] = useState(false);
+
+ useEffect(() => {
+ // Check if 24 hours have passed since last popup was shown
+ const lastShownTimestamp = localStorage.getItem(
+ "gamecraft-welcome-popup-last-shown"
+ );
+ const now = Date.now();
+ const twentyFourHours = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
+
+ if (!lastShownTimestamp) {
+ // First time visitor - show popup after delay
+ const timer = setTimeout(() => {
+ setIsVisible(true);
+ }, 1500);
+
+ return () => clearTimeout(timer);
+ } else {
+ // Check if 24 hours have passed
+ const lastShown = parseInt(lastShownTimestamp, 10);
+ const timeDifference = now - lastShown;
+
+ if (timeDifference >= twentyFourHours) {
+ // More than 24 hours have passed - show popup
+ const timer = setTimeout(() => {
+ setIsVisible(true);
+ }, 1500);
+
+ return () => clearTimeout(timer);
+ }
+ }
+ }, []);
+
+ const handleClose = () => {
+ setIsVisible(false);
+ // Save current timestamp so popup shows again after 24 hours
+ localStorage.setItem(
+ "gamecraft-welcome-popup-last-shown",
+ Date.now().toString()
+ );
+ };
+
+ const handleCopyCode = async () => {
+ try {
+ await navigator.clipboard.writeText("LAST50");
+ toast.success(
+ locale === "fa"
+ ? "کد تخفیف با موفقیت کپی شد!"
+ : "Discount code copied successfully!"
+ );
+ } catch (err) {
+ console.error("Failed to copy code:", err);
+ toast.error(
+ locale === "fa" ? "خطا در کپی کردن کد" : "Failed to copy code"
+ );
+ }
+ };
+
+ const handleClaimNow = () => {
+ router.push("/#workshops");
+ handleClose();
+ };
+
+ return (
+
+
+ {/* Game-style decorative elements */}
+
+
+
+
+
+ {/* Close button */}
+
}
+ onClick={handleClose}
+ style={{
+ position: "absolute",
+ right: "16px",
+ top: "16px",
+ color: "white",
+ backgroundColor: "rgba(0,0,0,0.2)",
+ borderRadius: "50%",
+ width: "36px",
+ height: "36px",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ border: "none",
+ fontSize: "16px",
+ zIndex: 10,
+ }}
+ />
+
+ {/* Main content */}
+
+ {/* Welcome title */}
+
+
+ 🎮
+
+
+ {locale === "fa"
+ ? "به Game Craft خوش آمدید!"
+ : "Welcome to Game Craft!"}
+
+
+
+ {/* Offer text */}
+
+ {locale === "fa" ? (
+ <>
+ 🔥 پیشنهاد ویژهٔ ثبتنام! {digitsToHindi("50")}٪ تخفیف برای
+ کارگاههای ساخت بازی با کد{" "}
+ {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(255,255,255,0.5)";
+ target.style.transform = "scale(1.1)";
+ }}
+ onMouseLeave={(e) => {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(255,255,255,0.3)";
+ target.style.transform = "scale(1)";
+ }}
+ title="کلیک کنید تا کپی شود"
+ >
+ LAST50
+
+ >
+ ) : (
+ <>
+ 🔥 Special Welcome Offer! Get 50% OFF on Game Development
+ Workshops with code{" "}
+ {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(255,255,255,0.5)";
+ target.style.transform = "scale(1.1)";
+ }}
+ onMouseLeave={(e) => {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(255,255,255,0.3)";
+ target.style.transform = "scale(1)";
+ }}
+ title="Click to copy"
+ >
+ LAST50
+
+ !
+ >
+ )}
+
+
+ {/* Action buttons */}
+
+ {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "#fef3c7";
+ target.style.transform = "translateY(-2px) scale(1.05)";
+ target.style.boxShadow = "0 6px 20px rgba(0,0,0,0.3)";
+ }}
+ onMouseLeave={(e) => {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "white";
+ target.style.transform = "translateY(0) scale(1)";
+ target.style.boxShadow = "0 4px 12px rgba(0,0,0,0.2)";
+ }}
+ onClick={handleClaimNow}
+ >
+ ⚡
+ {locale === "fa"
+ ? "ثبت نام در کارگاهها"
+ : "Claim Now & Join Workshops"}
+
+
+ {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(255,255,255,0.1)";
+ target.style.borderColor = "rgba(255,255,255,0.6)";
+ }}
+ onMouseLeave={(e) => {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "transparent";
+ target.style.borderColor = "rgba(255,255,255,0.3)";
+ }}
+ >
+ {locale === "fa" ? "بعداً" : "Maybe Later"}
+
+
+
+
+ {/* Animated background effects */}
+
+
+
+
+ );
+};
+
+export default WelcomePopup;
diff --git a/apps/level_up/components/features/presentersAvatar/PresentersAvatar.tsx b/apps/level_up/components/features/presentersAvatar/PresentersAvatar.tsx
new file mode 100644
index 00000000..7793811b
--- /dev/null
+++ b/apps/level_up/components/features/presentersAvatar/PresentersAvatar.tsx
@@ -0,0 +1,131 @@
+import React from "react";
+import { Avatar, Flex, Typography, theme } from "antd";
+import { UserOutlined } from "@ant-design/icons";
+import { useTranslations } from "next-intl";
+
+const { useToken } = theme;
+
+interface PresenterDetail {
+ id: number;
+ name: string;
+ email: string;
+ bio: string;
+ presenter_picture: string | null;
+ created_at: string;
+}
+
+interface PresentersAvatarProps {
+ presenters: PresenterDetail[];
+ maxDisplay?: number;
+}
+
+const PresentersAvatar: React.FC = ({
+ presenters = [],
+ maxDisplay = 3,
+}) => {
+ const { token } = useToken();
+ const t = useTranslations("workshop");
+
+ if (!presenters || presenters.length === 0) {
+ return (
+
+ } size={32} />
+
+ {t("noPresenters")}
+
+
+ );
+ }
+
+ const displayPresenters = presenters.slice(0, maxDisplay);
+ const remainingCount = presenters.length - maxDisplay;
+
+ if (presenters.length === 1) {
+ const presenter = presenters[0];
+ return (
+
+ }
+ size={32}
+ />
+
+ {presenter.name}
+
+
+ );
+ }
+
+ return (
+
+ {/* Avatar Stack */}
+
+ {displayPresenters.map((presenter, index) => (
+
}
+ size={32}
+ style={{
+ marginLeft: index > 0 ? -8 : 0,
+ border: `2px solid ${token.colorBgContainer}`,
+ zIndex: maxDisplay - index,
+ }}
+ />
+ ))}
+ {remainingCount > 0 && (
+
+
+ +{remainingCount}
+
+
+ )}
+
+
+ {/* Names Display */}
+
+ {remainingCount > 0
+ ? `${displayPresenters.map((p) => p.name).join(", ")} ${t("andMore", {
+ count: remainingCount,
+ })}`
+ : displayPresenters.map((p) => p.name).join(", ")}
+
+
+ );
+};
+
+export default PresentersAvatar;
diff --git a/apps/level_up/components/features/staff/StaffCard.tsx b/apps/level_up/components/features/staff/StaffCard.tsx
new file mode 100644
index 00000000..0cd901be
--- /dev/null
+++ b/apps/level_up/components/features/staff/StaffCard.tsx
@@ -0,0 +1,118 @@
+"use client";
+
+import { Avatar, Button, Flex, theme, Typography } from "antd";
+import { GithubFilled, LinkedinFilled, UserOutlined } from "@ant-design/icons";
+import { StaffMember } from "../../../config/staffs";
+import Image from "next/image";
+import { TelegramIcon } from "../../../components/common/TelegramIcon";
+
+const { useToken } = theme;
+
+interface StaffCardProps {
+ staff: StaffMember;
+}
+
+export function StaffCard({ staff }: StaffCardProps) {
+ const { token } = useToken();
+
+ return (
+
+
+ {
+ staff.imageUrl ? (
+ } src={staff.imageUrl} />
+ ) : (
+
+
+
+ )
+ // }
+ // src={"/mario/giphy-16.gif"}
+ // />
+ }
+
+
+
+ {staff.name}
+
+ {staff.role}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/staff/StaffContainer.tsx b/apps/level_up/components/features/staff/StaffContainer.tsx
new file mode 100644
index 00000000..ed8d05c1
--- /dev/null
+++ b/apps/level_up/components/features/staff/StaffContainer.tsx
@@ -0,0 +1,85 @@
+"use client";
+
+import { Col, Flex, Row, theme, Typography } from "antd";
+import { StaffCard } from "./StaffCard";
+import { useStaffs } from "../../../config/staffs";
+import { useTranslations } from "next-intl";
+import { customColors } from "../../../config/colors";
+import Image from "next/image";
+
+const { useToken } = theme;
+
+export function StaffContainer() {
+ const { token } = useToken();
+ const staffs = useStaffs();
+ const t = useTranslations("app.staffs");
+
+ return (
+
+
+
+ {t("title")}
+
+
+
+ {staffs.map((team, index) => (
+
+
+ {team.teamTitle}
+
+
+ {team.teamMembers.map((staff, staffIndex) => (
+
+
+
+ ))}
+
+
+ ))}
+
+
+ );
+}
diff --git a/apps/level_up/components/features/staff/StaffView.tsx b/apps/level_up/components/features/staff/StaffView.tsx
new file mode 100644
index 00000000..59ae786b
--- /dev/null
+++ b/apps/level_up/components/features/staff/StaffView.tsx
@@ -0,0 +1,24 @@
+"use client";
+
+import { Flex } from "antd";
+import { StaffContainer } from "./StaffContainer";
+import {useResponsive} from "../../../lib/hooks/useResponsive";
+
+export function StaffView() {
+ const screens = useResponsive();
+ const staffViewPadding = screens.lg ? "3rem 5rem" : "3rem 2rem";
+
+ return (
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/stickyBar/StickyBar.tsx b/apps/level_up/components/features/stickyBar/StickyBar.tsx
new file mode 100644
index 00000000..09b52f60
--- /dev/null
+++ b/apps/level_up/components/features/stickyBar/StickyBar.tsx
@@ -0,0 +1,236 @@
+import { useRouter } from "@bprogress/next";
+import { useRouter as useNextIntlRouter } from "../../../lib/navigation";
+import { Button, Flex, Typography } from "antd";
+import { CloseOutlined } from "@ant-design/icons";
+import React, { useState } from "react";
+import { useLocale } from "next-intl";
+import { digitsToHindi } from "@ssc/utils";
+import { toast, ToastContainer } from "react-toastify";
+
+const StickyBar = () => {
+ const router = useRouter({
+ customRouter: useNextIntlRouter,
+ });
+ const locale = useLocale();
+ const [isVisible, setIsVisible] = useState(true);
+
+ const handleClose = () => {
+ setIsVisible(false);
+ };
+
+ const handleCopyCode = async () => {
+ try {
+ await navigator.clipboard.writeText("LAST50");
+ toast.info("با موفقیت کپی شد");
+ // You could add a toast notification here if desired
+ } catch (err) {
+ console.error("Failed to copy code:", err);
+ }
+ };
+
+ if (!isVisible) {
+ return null;
+ }
+
+ return (
+
+
+ {/* Game-style decorative elements */}
+
+
+
+
+
+ {/* Main coupon content */}
+
+ 🎮
+
+ {locale === "fa" ? (
+ <>
+ 🔥 تخفیف ویژهٔ ثبتنام! {digitsToHindi("50")}٪ تخفیف برای
+ کارگاههای ساخت بازی با کد{" "}
+
+ LAST50
+
+ >
+ ) : (
+ <>
+ 🔥 Special Game Craft Offer — 50% OFF on Game Development
+ Workshops with code{" "}
+ {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(255,255,255,0.3)";
+ target.style.transform = "scale(1.05)";
+ }}
+ onMouseLeave={(e) => {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(255,255,255,0.2)";
+ target.style.transform = "scale(1)";
+ }}
+ title="Click to copy"
+ >
+ LAST50
+
+ !
+ >
+ )}
+
+ ⚡
+ {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "#fef3c7";
+ target.style.transform = "scale(1.05)";
+ }}
+ onMouseLeave={(e) => {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "white";
+ target.style.transform = "scale(1)";
+ }}
+ onClick={() => router.push("#workshops")}
+ >
+ {locale === "fa" ? "ثبت نام" : "Claim Now!"}
+
+
+
+ {/* Close button */}
+
}
+ onClick={handleClose}
+ style={{
+ position: "absolute",
+ right: "8px",
+ top: "50%",
+ transform: "translateY(-50%)",
+ color: "white",
+ border: "none",
+ backgroundColor: "rgba(0,0,0,0.2)",
+ borderRadius: "50%",
+ width: "24px",
+ height: "24px",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ transition: "all 0.2s ease",
+ zIndex: 10,
+ }}
+ onMouseEnter={(e) => {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(0,0,0,0.4)";
+ target.style.transform = "translateY(-50%) scale(1.1)";
+ }}
+ onMouseLeave={(e) => {
+ const target = e.currentTarget as HTMLElement;
+ target.style.backgroundColor = "rgba(0,0,0,0.2)";
+ target.style.transform = "translateY(-50%) scale(1)";
+ }}
+ />
+
+ );
+};
+
+export default StickyBar;
diff --git a/apps/level_up/components/features/team/TeamMemberCard.tsx b/apps/level_up/components/features/team/TeamMemberCard.tsx
new file mode 100644
index 00000000..778c9195
--- /dev/null
+++ b/apps/level_up/components/features/team/TeamMemberCard.tsx
@@ -0,0 +1,67 @@
+"use client";
+
+import React from "react";
+import { Flex, theme, Typography } from "antd";
+import Image from "next/image";
+import CrownBadge from "../../common/CrownBadge";
+
+const { useToken } = theme;
+
+interface TeamMemberCardProps {
+ isHead?: boolean;
+ name?: string;
+ avatar?: string;
+}
+
+export const TeamMemberCard: React.FC = ({
+ isHead = false,
+ name = "",
+ avatar = "svg/avatar-1.svg",
+}) => {
+ const { token } = useToken();
+
+ const memberCard = (
+
+
+
+
+ {name}
+
+ );
+
+ return isHead ? {memberCard} : memberCard;
+};
diff --git a/apps/level_up/components/features/team/TeamMemberContainer.tsx b/apps/level_up/components/features/team/TeamMemberContainer.tsx
new file mode 100644
index 00000000..3bb7d9dc
--- /dev/null
+++ b/apps/level_up/components/features/team/TeamMemberContainer.tsx
@@ -0,0 +1,169 @@
+"use client";
+
+import React, { useEffect, useMemo, useState } from "react";
+import { Alert, Col, Flex, Row, Spin, theme, Typography } from "antd";
+import { useTranslations } from "next-intl";
+import { TeamMemberCard } from "./TeamMemberCard";
+import { useAppSelector } from "lib/store/store";
+import { TeamDetails } from "@ssc/core/lib/types/api/Teams/teams";
+import { clientApi } from "lib/api/client/clientApi";
+import { eventId } from "lib/utils/constants";
+import { GroupCompetitionsList } from "@ssc/core/lib/types/api/competitions/competitions";
+
+const { useToken } = theme;
+
+export const TeamMemberContainer: React.FC = () => {
+ const { token } = useToken();
+ const t = useTranslations("app.dashboard.teamStatus");
+
+ const { data: teams } = useAppSelector((s) => s.teams);
+ const [filteredTeams, setFilteredTeams] = useState([]);
+ const [competitions, setCompetitions] = useState<{
+ loading: boolean;
+ error?: string;
+ data?: GroupCompetitionsList;
+ }>({ loading: true });
+
+ const isValidTeam = (competitionId: number) =>
+ !!competitions.data?.results.find(
+ (competition) => competition.id == competitionId
+ );
+
+ useEffect(() => {
+ clientApi.competitions
+ .getGroupCompetitionsList(eventId, undefined)
+ .then((response) => {
+ if (response.status === 200) {
+ setCompetitions({
+ loading: false,
+ data: response.data.data,
+ });
+ } else {
+ setCompetitions({ loading: false, error: "failed to fetch" });
+ }
+ })
+ .catch((err) => {
+ setCompetitions({ loading: false, error: err });
+ });
+
+ setFilteredTeams(
+ teams.filter(
+ (team) =>
+ team.group_competition_details &&
+ isValidTeam(team.group_competition_details.id) &&
+ team.status === "active"
+ )
+ );
+ }, [competitions, teams]);
+
+ const mapTeamMembers = (team: TeamDetails) =>
+ team.memberships.map((member) => (
+
+
+
+ ));
+
+ const mapTeams = () =>
+ filteredTeams.map((team) => (
+ <>
+
+
+ {team.group_competition_details.title}:
+
+
+ {team.name}
+
+
+ {mapTeamMembers(team)}
+ >
+ ));
+
+ const content = useMemo(() => {
+ if (competitions.loading) {
+ return (
+
+
+
+ );
+ } else if (competitions.error) {
+ return (
+
+ );
+ } else {
+ return filteredTeams.length === 0 ? (
+
+ ) : (
+ mapTeams()
+ );
+ }
+ }, [competitions, t]);
+
+ return (
+
+
+ {content}
+ {/*
+
+ {t("teamMembers")}
+
+
+ {[1, 2, 3, 4, 5, 6, 7].map((item, index) => (
+
+
+
+ ))} */}
+ {/*
+ }
+ >
+ {t("addTeammate")}
+
+ */}
+
+
+ );
+};
diff --git a/apps/level_up/components/features/workshops/OfflineWorkshop.tsx b/apps/level_up/components/features/workshops/OfflineWorkshop.tsx
new file mode 100644
index 00000000..7ace581d
--- /dev/null
+++ b/apps/level_up/components/features/workshops/OfflineWorkshop.tsx
@@ -0,0 +1,117 @@
+"use client";
+
+import { Flex, Typography, Spin, Alert } from "antd";
+import { WorkshopGrid } from "./WorkshopGrid";
+import { useTranslations } from "next-intl";
+import { useResponsive } from "../../../lib/hooks/useResponsive";
+import { useEffect, useMemo, useState } from "react";
+import { PresentationsList, PresentationType } from "@ssc/core";
+import { clientApi } from "lib/api/client/clientApi";
+import { eventId } from "lib/utils/constants";
+
+interface OfflineWorkshopProps {
+ padding?: string;
+ backgroundColor?: string;
+}
+
+export function OfflineWorkshop({
+ padding = "3rem 2rem",
+ backgroundColor,
+}: OfflineWorkshopProps) {
+ const screens = useResponsive();
+ const t = useTranslations();
+ const [presentations, setPresentations] = useState<{
+ loading: boolean;
+ error?: string;
+ data?: PresentationsList;
+ }>({ loading: true });
+
+ useEffect(() => {
+ clientApi.presentations
+ .getPresentationsList(
+ eventId,
+ undefined,
+ undefined,
+ PresentationType.WORKSHOP
+ )
+ .then((response) => {
+ if (response.status === 200) {
+ const filteredData = response.data.data;
+ filteredData.results = filteredData.results.filter(
+ (presentation) => presentation.is_active
+ );
+
+ setPresentations({
+ loading: false,
+ data: filteredData,
+ });
+ } else {
+ setPresentations({ loading: false, error: "failed to fetch" });
+ }
+ })
+ .catch((err) => {
+ setPresentations({ loading: false, error: "failed to fetch" });
+ });
+ }, []);
+
+ const content = useMemo(() => {
+ if (presentations.loading) {
+ return (
+
+
+
+ );
+ } else if (presentations.error) {
+ return (
+
+ );
+ } else {
+ return presentations.data.results.length === 0 ? (
+
+ ) : (
+
+ );
+ }
+ }, [presentations]);
+
+ return (
+
+
+ {t("workshop.workshops")}
+
+
+ {content}
+
+ );
+}
diff --git a/apps/level_up/components/features/workshops/OnlineWorkshop.tsx b/apps/level_up/components/features/workshops/OnlineWorkshop.tsx
new file mode 100644
index 00000000..2f500a0e
--- /dev/null
+++ b/apps/level_up/components/features/workshops/OnlineWorkshop.tsx
@@ -0,0 +1,137 @@
+"use client";
+
+import { Flex, theme, Typography, Spin, Alert } from "antd";
+import Wave from "../../common/Wave";
+import { WorkshopGrid } from "./WorkshopGrid";
+import { useTranslations } from "next-intl";
+import { useResponsive } from "../../../lib/hooks/useResponsive";
+import { useEffect, useMemo, useState } from "react";
+import { PresentationsList, PresentationType } from "@ssc/core";
+import { clientApi } from "lib/api/client/clientApi";
+import { eventId } from "lib/utils/constants";
+
+const { useToken } = theme;
+
+interface OnlineWorkshopProps {
+ padding?: string;
+ backgroundColor?: string;
+}
+
+export function OnlineWorkshop({
+ padding = "3rem 2rem",
+ backgroundColor,
+}: OnlineWorkshopProps) {
+ const { token } = useToken();
+ const screens = useResponsive();
+ const t = useTranslations();
+ const [presentations, setPresentations] = useState<{
+ loading: boolean;
+ error?: string;
+ data?: PresentationsList;
+ }>({ loading: true });
+
+ useEffect(() => {
+ clientApi.presentations
+ .getPresentationsList(
+ eventId,
+ undefined,
+ undefined,
+ PresentationType.TALK
+ )
+ .then((response) => {
+ if (response.status === 200) {
+ const filteredData = response.data.data;
+ filteredData.results = filteredData.results.filter(
+ (presentation) => presentation.is_active
+ );
+
+ setPresentations({
+ loading: false,
+ data: filteredData,
+ });
+ } else {
+ setPresentations({ loading: false, error: "failed to fetch" });
+ }
+ })
+ .catch((err) => {
+ setPresentations({ loading: false, error: "failed to fetch" });
+ });
+ }, []);
+
+ const content = useMemo(() => {
+ if (presentations.loading) {
+ return (
+
+
+
+ );
+ } else if (presentations.error) {
+ return (
+
+ );
+ } else {
+ return presentations.data.results.length === 0 ? (
+
+ ) : (
+
+ );
+ }
+ }, [presentations, t]);
+
+ return (
+
+
+
+
+ {t("workshop.presentations")}
+
+
+ {content}
+
+
+
+ );
+}
diff --git a/apps/level_up/components/features/workshops/WorkshopCard.tsx b/apps/level_up/components/features/workshops/WorkshopCard.tsx
new file mode 100644
index 00000000..e69563d9
--- /dev/null
+++ b/apps/level_up/components/features/workshops/WorkshopCard.tsx
@@ -0,0 +1,771 @@
+"use client";
+
+import { useTranslations } from "next-intl";
+import Image from "next/image";
+import { ItemType, PresentationOverview } from "@ssc/core";
+import PresentersAvatar from "../presentersAvatar/PresentersAvatar";
+import { use, useMemo, useState } from "react";
+import {
+ Card,
+ Typography,
+ Button as AntButton,
+ Flex,
+ Badge,
+ Modal,
+ theme,
+ Space,
+ Row,
+ Col,
+} from "antd";
+import {
+ ClockCircleOutlined,
+ EnvironmentOutlined,
+ LinkOutlined,
+ ShoppingCartOutlined,
+ DeleteOutlined,
+ EyeOutlined,
+} from "@ant-design/icons";
+import { useFormatter } from "lib/hooks/useFormatter";
+import { useAppDispatch, useAppSelector } from "lib/store/store";
+import {
+ cartLoadingSelector,
+ itemInCartSelector,
+} from "lib/store/cart/cart.selectors";
+import { useIsPresentationPurchased } from "lib/hooks/usePurchases";
+import {
+ addItemToCartThunk,
+ removeItemFromCartThunk,
+} from "lib/store/cart/cart.thunk";
+import { toast } from "react-toastify";
+import { useAuth } from "lib/hooks/useAuth";
+import { digitsToHindi } from "@ssc/utils";
+
+const { useToken } = theme;
+
+interface WorkshopCardProps {
+ workshopImage?: string;
+ presentation: PresentationOverview;
+ isPurchased?: boolean; // Add this prop to control purchase button visibility
+}
+
+// simple RTL detection (Persian/Arabic Unicode ranges)
+const isRTL = (text?: string) =>
+ !!text && /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF]/.test(text);
+
+export function WorkshopCard({
+ presentation,
+ workshopImage,
+ isPurchased = false, // Default to false if not provided
+}: WorkshopCardProps) {
+ const t = useTranslations();
+ const [showModal, setShowModal] = useState(false);
+ const { formatNumberToMoney } = useFormatter();
+ const dispatch = useAppDispatch();
+ const itemInCart = useAppSelector(
+ itemInCartSelector(presentation.id, ItemType.PRESENTATION)
+ );
+ const isPresentationPurchased = useIsPresentationPurchased(presentation.id);
+ const buttonShouldBeDisabled = useAppSelector(cartLoadingSelector);
+ const [buttonLoading, setButtonLoading] = useState(false);
+ const { isAuthenticated } = useAuth();
+ const { token } = useToken();
+
+ const isSelected = useMemo(() => {
+ return itemInCart !== undefined;
+ }, [itemInCart]);
+
+ // Color palette
+ const colorStripes = ["#4CAF50", "#2196F3", "#FFC107", "#F44336"];
+
+ const buttonText = useMemo(() => {
+ if (!isAuthenticated) return t("workshop.loginToContinue");
+ if (isSelected) {
+ return t("workshop.removeFromCart");
+ } else {
+ return presentation.is_paid
+ ? t("workshop.addToCart")
+ : t("workshop.enroll");
+ }
+ }, [isSelected, presentation, t, isAuthenticated]);
+
+ // Format date and time
+ const formatDateTime = (dateTimeString: string) => {
+ const date = new Date(dateTimeString);
+ return date.toLocaleString("fa-IR", {
+ timeZone: "UTC",
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+ };
+
+ // Format time only (for end time when it's same day)
+ const formatTime = (dateTimeString: string) => {
+ const date = new Date(dateTimeString);
+ return date.toLocaleString("fa-IR", {
+ timeZone: "UTC",
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+ };
+
+ // Check if start and end dates are on the same day
+ const isSameDay = (startTime: string, endTime: string) => {
+ const start = new Date(startTime);
+ const end = new Date(endTime);
+ return start.toDateString() === end.toDateString();
+ };
+
+ // Format date time range
+ const formatDateTimeRange = () => {
+ if (!presentation.end_time) {
+ return formatDateTime(presentation.start_time);
+ }
+
+ // if (isSameDay(presentation.start_time, presentation.end_time)) {
+ // // Same day: show date + start time - end time
+ //
+ // } else {
+ // // Different days: show full start date/time - full end date/time
+ // return `${formatDateTime(presentation.start_time)} - ${formatDateTime(presentation.end_time)}`;
+ // }
+
+ // since all the presentations are on one day
+ return `${formatDateTime(presentation.start_time)} - ${formatTime(
+ presentation.end_time
+ )}`;
+ };
+
+ const handleAddToCart = () => {
+ if (buttonShouldBeDisabled) {
+ if (!isAuthenticated) {
+ toast.error("لطفا وارد حساب خود شوید");
+ }
+ return;
+ }
+ setButtonLoading(true);
+ dispatch(
+ addItemToCartThunk({
+ item_type: ItemType.PRESENTATION,
+ item_id: presentation.id,
+ })
+ )
+ .unwrap()
+ .catch()
+ .finally(() => setButtonLoading(false));
+ };
+
+ const removeFromCart = () => {
+ if (buttonShouldBeDisabled || !itemInCart) return;
+ setButtonLoading(true);
+ dispatch(
+ removeItemFromCartThunk({
+ item_id: itemInCart.id,
+ item_type: ItemType.PRESENTATION,
+ })
+ )
+ .unwrap()
+ .catch()
+ .finally(() => setButtonLoading(false));
+ };
+
+ const titleIsRTL = isRTL(presentation.title);
+ const descriptionIsRTL = isRTL(presentation.description);
+
+ const formatPrice = () => {
+ return presentation.is_paid
+ ? formatNumberToMoney(presentation.price)
+ : t("workshop.free");
+ };
+
+ return (
+ <>
+ {/* Workshop Card */}
+
+ {/* Header Image with Stripes */}
+
+ {/* Workshop Image */}
+
+
+ {/* Colored Stripes */}
+
+ {colorStripes.map((color, index) => (
+
+ ))}
+
+
+ {/* View Details Button */}
+
+
setShowModal(true)}
+ type="primary"
+ icon={}
+ size="small"
+ style={{
+ borderRadius: token.borderRadiusLG,
+ backgroundColor: "rgba(0, 0, 0, 0.7)",
+ borderColor: "transparent",
+ }}
+ >
+ جزئیات بیشتر
+
+
+
+
+ {/* Content */}
+
+ {/* Title and Badges */}
+
+
+ {presentation.title}
+
+
+
+ {!presentation.is_online && (
+
+ )}
+ {presentation.is_online && (
+
+ )}
+
+
+
+
+
+ {/* Presentation online link */}
+ {isPurchased && presentation.online_link && (
+
+
+ {t("workshop.onlineLink")}
+
+
+
+ {presentation.online_link}
+
+
+
+ )}
+
+ {/* Description */}
+
+ {presentation.description}
+
+
+ {/* Date and Time */}
+
+
+
+ {formatDateTimeRange()}
+
+
+
+ {/* Location/Link */}
+ {presentation.location && !presentation.is_online && (
+
+
+
+ {presentation.location}
+
+
+ )}
+ {/* {isPurchased &&
+ presentation.online_link &&
+ presentation.is_online && (
+
+
+
+ {t("workshop.onlineLink")}
+
+
+ )} */}
+
+ {/* Presenters Label */}
+
+ {t("workshop.presenters")}:
+
+
+ {/* Presenters */}
+ {presentation.presenters_details.map((presenter) => (
+
+ ))}
+
+ {/* Capacity */}
+
+
+ {t("workshop.capacity") +
+ ": " +
+ digitsToHindi(presentation.capacity)}
+
+
+
+ {t("workshop.remainingCapacity") +
+ ": " +
+ digitsToHindi(presentation.remaining_capacity)}
+
+
+
+ {/* Price and Add to Cart */}
+
+
+ {formatPrice()} {presentation.is_paid && t("common.currency")}
+
+
+ {/* Show purchased button if already purchased, otherwise show add to cart/register button */}
+ {isPresentationPurchased ? (
+
+ خریداری شده
+
+ ) : (
+ :
+ }
+ onClick={isSelected ? removeFromCart : handleAddToCart}
+ disabled={
+ !presentation.is_active ||
+ buttonShouldBeDisabled ||
+ presentation.capacity <= 0 ||
+ !isAuthenticated
+ }
+ loading={buttonLoading}
+ style={{
+ borderRadius: token.borderRadius,
+ height: "36px",
+ }}
+ >
+ {buttonText}
+
+ )}
+
+
+
+
+ {/* Modal */}
+ setShowModal(false)}
+ footer={[
+ // Only show action button if not purchased
+ ...(!isPurchased
+ ? [
+ :
+ }
+ onClick={() => {
+ if (isSelected) {
+ removeFromCart();
+ } else {
+ handleAddToCart();
+ }
+ setShowModal(false);
+ }}
+ disabled={
+ !presentation.is_active ||
+ buttonShouldBeDisabled ||
+ presentation.capacity <= 0 ||
+ !isAuthenticated
+ }
+ loading={buttonLoading}
+ >
+ {buttonText}
+ ,
+ ]
+ : []),
+ ]}
+ width={700}
+ style={{ top: 50, zIndex: 200 }}
+ styles={{
+ body: { maxHeight: "70vh", overflowY: "auto" },
+ }}
+ >
+
+ {presentation.title}
+
+
+ {/* Workshop Image */}
+ {presentation.poster && (
+
+
+ {/* Colored Stripes */}
+
+ {colorStripes.map((color, index) => (
+
+ ))}
+
+
+ )}
+
+ {/* Workshop Details */}
+
+ {/* Left Column */}
+
+
+ {/* Description */}
+
+
+ {t("workshop.description")}
+
+
+ {presentation.description}
+
+
+
+ {/* Requirements */}
+ {presentation.requirements && (
+
+
+ {t("workshop.requirements")}
+
+
+ {presentation.requirements}
+
+
+ )}
+
+ {/* Date and Time */}
+
+
+ {t("workshop.schedule")}
+
+
+
+
+ {formatDateTimeRange()}
+
+
+
+
+ {/* Location */}
+ {presentation.location !== null && (
+
+
+ {t("workshop.location")}
+
+ {presentation.location && !presentation.is_online && (
+
+
+
+ {presentation.location}
+
+
+ )}
+ {presentation.online_link && presentation.is_online && (
+
+
+
+ {t("workshop.onlineLink")}
+
+
+ )}
+
+ )}
+
+
+
+ {/* Right Column */}
+
+
+ {/* Presenters */}
+
+
+ {t("workshop.presenters")}
+
+ {presentation.presenters_details.map((presenter) => (
+ <>
+
+
+ {presenter.bio}
+
+ >
+ ))}
+
+
+ {/* Price */}
+
+
+ {t("workshop.price")}
+
+
+ {presentation.is_paid
+ ? `${formatNumberToMoney(presentation.price)} ${t(
+ "common.currency"
+ )}`
+ : t("workshop.free")}
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/apps/level_up/components/features/workshops/WorkshopGrid.tsx b/apps/level_up/components/features/workshops/WorkshopGrid.tsx
new file mode 100644
index 00000000..f33a2610
--- /dev/null
+++ b/apps/level_up/components/features/workshops/WorkshopGrid.tsx
@@ -0,0 +1,53 @@
+"use client";
+
+import { Row, Col } from "antd";
+import { WorkshopCard } from "./WorkshopCard";
+import { PresentationOverview } from "@ssc/core";
+
+interface WorkshopGridProps {
+ presentations?: PresentationOverview[];
+ workshopImage?: string; // Add optional image prop
+}
+
+export function WorkshopGrid({
+ presentations = [],
+ workshopImage,
+}: WorkshopGridProps) {
+ return (
+
+ {presentations.map((presentation) => (
+
+
+
+ ))}
+
+ );
+}
diff --git a/apps/level_up/components/layout/AppDrawer.tsx b/apps/level_up/components/layout/AppDrawer.tsx
new file mode 100644
index 00000000..c663021d
--- /dev/null
+++ b/apps/level_up/components/layout/AppDrawer.tsx
@@ -0,0 +1,214 @@
+"use client";
+
+import { Button, Drawer, Flex, Switch, theme } from "antd";
+import { useTranslations, useLocale } from "next-intl";
+import { usePathname } from "next/navigation";
+import { MoonFilled, SunFilled } from "@ant-design/icons";
+import { useRouter as useNextIntlRouter } from "../../lib/navigation";
+import { useTheme } from "next-themes";
+import { useMainNavigations } from "../../lib/config/navigation";
+import { useAuth } from "../../lib/hooks/useAuth";
+import { useRouter } from "@bprogress/next";
+import { signIn } from "next-auth/react";
+import CartButton from "components/features/cart/CartButton";
+
+const { useToken } = theme;
+
+interface MainDrawerProps {
+ open: boolean;
+ toggleDrawerOpen: () => void;
+}
+
+export default function AppDrawer({ open, toggleDrawerOpen }: MainDrawerProps) {
+ const t = useTranslations("app");
+ const locale = useLocale();
+ const mainNavigations = useMainNavigations();
+ const pathname = usePathname();
+ const { token } = useToken();
+ const { theme, setTheme } = useTheme();
+ const { isAuthenticated, user, logout } = useAuth();
+ const router = useRouter({
+ customRouter: useNextIntlRouter,
+ });
+
+ const isActive = (path: string) => {
+ // Remove locale prefix from pathname for comparison
+ const pathWithoutLocale = pathname.replace(`/${locale}`, "") || "/";
+ return pathWithoutLocale === path;
+ };
+
+ const handleLanguageSwitch = () => {
+ const newLocale = locale === "fa" ? "en" : "fa";
+ // Remove the current locale from the pathname and get the clean path
+ const currentPath = pathname.replace(`/${locale}`, "") || "/";
+ router.replace(currentPath, { locale: newLocale });
+ };
+
+ const handleNavigation = (route: string) => {
+ toggleDrawerOpen();
+ router.push(route);
+ };
+
+ const handleLogout = async () => {
+ try {
+ await logout();
+ toggleDrawerOpen();
+ } catch (error) {
+ console.error("Logout error:", error);
+ }
+ };
+
+ return (
+
+
+
+
+ setTheme(theme === "dark" ? "light" : "dark")}
+ size="large"
+ icon={theme === "dark" ? : }
+ />
+
+
+
+ {mainNavigations.map((item) => (
+ handleNavigation(item.route)}
+ style={{
+ width: "100%",
+ fontWeight: "bolder",
+ }}
+ >
+ {item.name}
+
+ ))}
+
+ {isAuthenticated && (
+
+ handleNavigation("/dashboard/shopping-bag")}
+ >
+
+ {t("dashboard.shoppingBag")}
+
+
+ )}
+
+
+ {isAuthenticated && user ? (
+ <>
+ handleNavigation("/dashboard")}
+ >
+ {t("mainNavigation.dashboard")}
+
+
+ {t("auth.logout")}
+
+ >
+ ) : (
+ <>
+
+ signIn("ssc", {
+ callbackUrl: "/dashboard",
+ })
+ }
+ >
+ {t("auth.login")}
+
+
+ signIn("ssc", {
+ callbackUrl: "/dashboard",
+ })
+ }
+ >
+ {t("auth.signUp")}
+
+ >
+ )}
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/layout/AppFooter.tsx b/apps/level_up/components/layout/AppFooter.tsx
new file mode 100644
index 00000000..065d09ce
--- /dev/null
+++ b/apps/level_up/components/layout/AppFooter.tsx
@@ -0,0 +1,107 @@
+"use client";
+
+import {
+ Button,
+ Col,
+ ConfigProvider,
+ Divider,
+ Flex,
+ Layout,
+ Row,
+ theme,
+ Typography,
+} from "antd";
+import { useTranslations } from "next-intl";
+import {
+ FacebookFilled,
+ InstagramOutlined,
+ LinkedinFilled,
+ XOutlined,
+ YoutubeFilled,
+} from "@ant-design/icons";
+import Image from "next/image";
+import { darkTheme } from "../../components/providers/AntDesignProvider";
+import { gameCraftSocialLinks, sscSocialLinks } from "../../config/socialLinks";
+import { TelegramIcon } from "../../components/common/TelegramIcon";
+
+const { useToken } = theme;
+
+export function AppFooter() {
+ const { token } = useToken();
+ const t = useTranslations("app");
+
+ return (
+
+
+
+ {t("footer.autGameCraft")}
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ href={sscSocialLinks.telegram}
+ />
+ }
+ href={sscSocialLinks.instagram}
+ />
+ }
+ href={sscSocialLinks.twitter}
+ />
+
+
+
+
+
+
+ {t("footer.copyRight")}
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/layout/AppHeader.tsx b/apps/level_up/components/layout/AppHeader.tsx
new file mode 100644
index 00000000..e82cb158
--- /dev/null
+++ b/apps/level_up/components/layout/AppHeader.tsx
@@ -0,0 +1,265 @@
+"use client";
+
+import {
+ Button,
+ Divider,
+ Flex,
+ Layout,
+ Space,
+ Switch,
+ theme,
+ Typography,
+} from "antd";
+import { useEffect, useState } from "react";
+import { usePathname } from "next/navigation";
+import { useRouter as useNextIntlRouter } from "../../lib/navigation";
+import { useTranslations, useLocale } from "next-intl";
+import { MenuOutlined, MoonFilled, SunFilled } from "@ant-design/icons";
+import Image from "next/image";
+import { useTheme } from "next-themes";
+import { useResponsive } from "../../lib/hooks/useResponsive";
+import AppDrawer from "../../components/layout/AppDrawer";
+import { customColors } from "../../config/colors";
+import { useSound } from "../providers/SoundProvider";
+import { useMainNavigations } from "../../lib/config/navigation";
+import { useAuth } from "lib/hooks/useAuth";
+import { useRouter } from "@bprogress/next";
+import { signIn } from "next-auth/react";
+import { FaCircleUser } from "react-icons/fa6";
+import { MdGamepad } from "react-icons/md";
+import CartButton from "components/features/cart/CartButton";
+import StickyBar from "components/features/stickyBar/StickyBar";
+
+const { useToken } = theme;
+const { Header } = Layout;
+
+export function AppHeader() {
+ const [shadow, setShadow] = useState(false);
+ const [drawerOpen, setDrawerOpen] = useState(false);
+ const router = useRouter({
+ customRouter: useNextIntlRouter,
+ });
+ const pathname = usePathname();
+ const locale = useLocale();
+ const { token } = useToken();
+ const t = useTranslations("app");
+ const screens = useResponsive();
+ const { theme, setTheme } = useTheme();
+ const { playSound } = useSound();
+ const mainNavigations = useMainNavigations();
+ const { isLoading, isAuthenticated, user } = useAuth();
+
+ const toggleDrawerOpen = () => {
+ setDrawerOpen(!drawerOpen);
+ };
+
+ const handleLanguageSwitch = () => {
+ const newLocale = locale === "fa" ? "en" : "fa";
+ const currentPath = pathname.replace(`/${locale}`, "") || "/";
+ router.replace(currentPath, { locale: newLocale });
+ };
+
+ const handleScroll = () => {
+ if (window.scrollY > 0) {
+ setShadow(true);
+ } else {
+ setShadow(false);
+ }
+ };
+
+ useEffect(() => {
+ window.addEventListener("scroll", handleScroll);
+ return () => {
+ window.removeEventListener("scroll", handleScroll);
+ };
+ }, []);
+
+ // Fix active route detection by removing locale from pathname
+ const isActive = (path: string) => {
+ const pathWithoutLocale = pathname.replace(`/${locale}`, "") || "/";
+ return pathWithoutLocale === path;
+ };
+
+ const handleLoginClicked = () => {
+ // router.push("/auth/login");
+ signIn("ssc", {
+ callbackUrl: "/dashboard",
+ });
+ };
+
+ return (
+
+ {/*
*/}
+
+ {screens.lg ? (
+
+
+
+
+
+ {mainNavigations.map((item) => (
+ router.push(item.route)}
+ onMouseEnter={() => playSound("jump")}
+ style={{
+ fontWeight: "bolder",
+ ...(isActive(item.route)
+ ? { color: customColors.colorAction }
+ : {}),
+ }}
+ >
+ {item.name}
+
+ ))}
+
+
+
+
+ setTheme(theme === "dark" ? "light" : "dark")}
+ size="large"
+ >
+ {theme === "dark" ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {!isLoading ? (
+ !isAuthenticated ? (
+ <>
+ {/* /!* router.push("/auth/signup")}*/}
+ {/* onMouseEnter={() => playSound("coin")}*/}
+ {/*>*/}
+ {/* {t("auth.signUp")}*/}
+ {/* *!/*/}
+ playSound("coin")}
+ >
+ {t("auth.login")}
+
+ >
+ ) : (
+
+
+ playSound("coin")}
+ onClick={() => router.push("/dashboard/events")}
+ >
+ router.push("/dashboard/events")}
+ />
+
+ {user.name}
+
+
+
+ )
+ ) : (
+
+
+
+ )}
+
+
+
+ ) : (
+
+ }
+ onClick={() => toggleDrawerOpen()}
+ />
+
+
+
+ )}
+
+
+ );
+}
diff --git a/apps/level_up/components/layout/dashboard/DashboardDrawer.tsx b/apps/level_up/components/layout/dashboard/DashboardDrawer.tsx
new file mode 100644
index 00000000..b0ecde8a
--- /dev/null
+++ b/apps/level_up/components/layout/dashboard/DashboardDrawer.tsx
@@ -0,0 +1,93 @@
+"use client";
+
+import { Button, Drawer, Flex, Switch, theme } from "antd";
+import { useTranslations, useLocale } from "next-intl";
+import { DashboardNavigationCard } from "./DashboardNavigationCard";
+import { MoonFilled, SunFilled } from "@ant-design/icons";
+import { useTheme } from "next-themes";
+import { useRouter, usePathname } from "next/navigation";
+
+const { useToken } = theme;
+
+interface DashboardDrawerProps {
+ open: boolean;
+ toggleDrawerOpen: () => void;
+}
+
+export function DashboardDrawer({
+ open,
+ toggleDrawerOpen,
+}: DashboardDrawerProps) {
+ const t = useTranslations();
+ const locale = useLocale();
+ const { token } = useToken();
+ const { theme, setTheme } = useTheme();
+ const router = useRouter();
+ const pathname = usePathname();
+
+ const toggleTheme = () => {
+ setTheme(theme === "dark" ? "light" : "dark");
+ };
+
+ const toggleLanguage = () => {
+ const newLocale = locale === "fa" ? "en" : "fa";
+ const currentPath = pathname.replace(`/${locale}`, "");
+ router.push(`/${newLocale}${currentPath}`);
+ };
+
+ const direction = locale === "fa" ? "rtl" : "ltr";
+
+ return (
+ toggleDrawerOpen()}
+ zIndex={100000000}
+ style={{
+ backgroundColor: `${token.colorBgBase}`,
+ backdropFilter: "blur(10px)",
+ }}
+ >
+
+
+ toggleTheme()}
+ size="large"
+ icon={theme === "dark" ? : }
+ />
+
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/layout/dashboard/DashboardHeader.tsx b/apps/level_up/components/layout/dashboard/DashboardHeader.tsx
new file mode 100644
index 00000000..5eb10e95
--- /dev/null
+++ b/apps/level_up/components/layout/dashboard/DashboardHeader.tsx
@@ -0,0 +1,104 @@
+"use client";
+
+import { Button, Flex, Grid, Layout, theme } from "antd";
+import { MenuOutlined, ArrowLeftOutlined } from "@ant-design/icons";
+import { useEffect, useState } from "react";
+import { DashboardDrawer } from "./DashboardDrawer";
+import Image from "next/image";
+import { useRouter } from "next/navigation";
+import { useTranslations } from "next-intl";
+
+const { Header } = Layout;
+const { useToken } = theme;
+const { useBreakpoint } = Grid;
+
+export function DashboardHeader() {
+ const { token } = useToken();
+ const screens = useBreakpoint();
+ const router = useRouter();
+ const [shadow, setShadow] = useState(false);
+ const [drawerOpen, setDrawerOpen] = useState(false);
+ const t = useTranslations("common");
+
+ const handleScroll = () => {
+ if (window.scrollY > 0) {
+ setShadow(true);
+ } else {
+ setShadow(false);
+ }
+ };
+
+ useEffect(() => {
+ window.addEventListener("scroll", handleScroll);
+ return () => {
+ window.removeEventListener("scroll", handleScroll);
+ };
+ }, []);
+
+ function toggleDrawerOpen() {
+ setDrawerOpen(!drawerOpen);
+ }
+
+ const handleBackToHome = () => {
+ router.push("/");
+ };
+
+ return screens.lg ? (
+ <>>
+ ) : (
+
+
+ {/* Menu Button - moved to left */}
+ }
+ onClick={() => toggleDrawerOpen()}
+ />
+
+ {/* Logo in center */}
+
+
+ {/* Back Button - moved to right */}
+ }
+ onClick={handleBackToHome}
+ />
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/layout/dashboard/DashboardNavigationCard.tsx b/apps/level_up/components/layout/dashboard/DashboardNavigationCard.tsx
new file mode 100644
index 00000000..dc8b4513
--- /dev/null
+++ b/apps/level_up/components/layout/dashboard/DashboardNavigationCard.tsx
@@ -0,0 +1,154 @@
+"use client";
+
+import { Button, Card, Flex, Grid, Image, theme, Typography } from "antd";
+import { useLocale, useTranslations } from "next-intl";
+import { useDashboardNavigations } from "../../../lib/config/dashboard-navigation";
+import { DotLottieReact } from "@lottiefiles/dotlottie-react";
+import { signOut, useSession } from "next-auth/react";
+import { usePathname, useRouter as nextIntlNavigation } from "lib/navigation";
+import { useRouter } from "@bprogress/next";
+// import fireworks from "../../../public/lottie/Fireworks.lottie";
+
+const { useToken } = theme;
+const { useBreakpoint } = Grid;
+
+interface DashboardNavigationCardProps {
+ toggleDrawerOpen?: () => void;
+}
+
+export function DashboardNavigationCard({
+ toggleDrawerOpen,
+}: DashboardNavigationCardProps) {
+ const t = useTranslations();
+ const { token } = useToken();
+ const router = useRouter({ customRouter: nextIntlNavigation });
+ const pathname = usePathname();
+ const dashboardNavigations = useDashboardNavigations();
+ const screens = useBreakpoint();
+ const locale = useLocale();
+ const session = useSession();
+
+ const handleLogout = () => {
+ signOut();
+ };
+
+ // Function to check if a route is active
+ const isActiveRoute = (route: string) => {
+ return pathname === route;
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {session?.data?.user?.name}
+
+
+
+
+ {dashboardNavigations.map((item) => (
+ {
+ router.replace(item.route);
+ if (toggleDrawerOpen) {
+ toggleDrawerOpen();
+ }
+ }}
+ icon={item.icon ? item.icon : null}
+ >
+ {item.name}
+
+ ))}
+
+ {t("app.auth.logout")}
+
+
+
+
+ );
+}
diff --git a/apps/level_up/components/layout/dashboard/index.ts b/apps/level_up/components/layout/dashboard/index.ts
new file mode 100644
index 00000000..49ffc2fc
--- /dev/null
+++ b/apps/level_up/components/layout/dashboard/index.ts
@@ -0,0 +1,4 @@
+export { DashboardHeader } from './DashboardHeader';
+export { DashboardDrawer } from './DashboardDrawer';
+export { DashboardNavigationCard } from './DashboardNavigationCard';
+
diff --git a/apps/level_up/components/providers/AntDesignProvider.tsx b/apps/level_up/components/providers/AntDesignProvider.tsx
new file mode 100644
index 00000000..497b4f1e
--- /dev/null
+++ b/apps/level_up/components/providers/AntDesignProvider.tsx
@@ -0,0 +1,104 @@
+"use client";
+
+import {
+ ConfigProvider,
+ message,
+ notification,
+ theme as antdTheme,
+} from "antd";
+import { ReactNode, useEffect } from "react";
+import { useTheme } from "next-themes";
+import { customColors } from "../../config/colors";
+
+interface AntDesignProviderProps {
+ children: ReactNode;
+ direction: "ltr" | "rtl";
+}
+
+const lightTheme = {
+ token: {
+ fontFamily: "var(--font-estedad), var(--font-vazirmatn), sans-serif",
+ borderRadius: 16,
+ colorPrimary: customColors.colorPrimary,
+ // colorInfo: customColors.colorPrimary,
+ colorSuccess: customColors.colorAction,
+ colorWarning: "#faad14",
+ colorError: "#ff4d4f",
+ colorBgBase: "#ffffff",
+ colorBgContainer: "#ffffff",
+ colorBgElevated: "#ffffff",
+ colorText: "#000000d9",
+ colorTextSecondary: "#00000073",
+ },
+ components: {
+ Timeline: {
+ dotBg: "transparent",
+ tailColor: customColors.colorAction,
+ tailWidth: 10,
+ },
+ Button: {
+ colorPrimary: customColors.colorPrimary,
+ colorPrimaryHover: "#4c4a8d",
+ colorPrimaryActive: "#2c2a6d",
+ },
+ Layout: {
+ headerBg: customColors.colorPrimary,
+ bodyBg: "#f5f5f5",
+ },
+ Switch: {},
+ Collapse: {},
+ Message: {
+ colorBgBase: "#ffffff",
+ },
+ },
+};
+
+export const darkTheme = {
+ algorithm: antdTheme.darkAlgorithm,
+ token: {
+ ...lightTheme.token,
+ colorBgBase: "#1E1E1E",
+ colorBgContainer: "#262626",
+ colorBgElevated: "#2a2a2a",
+ colorText: "#ffffffd9",
+ colorTextSecondary: "#ffffff73",
+ },
+ components: {
+ ...lightTheme.components,
+ Layout: {
+ headerBg: "#3c3a7d",
+ bodyBg: "#1E1E1E",
+ },
+ Message: {
+ colorBgBase: "#262626",
+ },
+ },
+};
+
+export default function AntDesignProvider({
+ children,
+ direction,
+}: AntDesignProviderProps) {
+ const { theme } = useTheme();
+
+ const algorithm = theme === "dark" ? darkTheme : lightTheme;
+
+ useEffect(() => {
+ message.config({
+ top: 100,
+ duration: 2,
+ maxCount: 3,
+ });
+
+ notification.config({
+ placement: "topRight",
+ duration: 4.5,
+ });
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/apps/level_up/components/providers/AuthProvider.tsx b/apps/level_up/components/providers/AuthProvider.tsx
new file mode 100644
index 00000000..a9378c3c
--- /dev/null
+++ b/apps/level_up/components/providers/AuthProvider.tsx
@@ -0,0 +1,12 @@
+"use client";
+
+import { SessionProvider } from "next-auth/react";
+import { ReactNode } from "react";
+
+interface AuthProviderProps {
+ children: ReactNode;
+}
+
+export default function AuthProvider({ children }: AuthProviderProps) {
+ return {children};
+}
diff --git a/apps/level_up/components/providers/GoftinoProvider.tsx b/apps/level_up/components/providers/GoftinoProvider.tsx
new file mode 100644
index 00000000..80898b8c
--- /dev/null
+++ b/apps/level_up/components/providers/GoftinoProvider.tsx
@@ -0,0 +1,12 @@
+"use client";
+
+import React from "react";
+import { useGoftino } from "lib/hooks/useGoftino";
+
+const GoftinoProvider = () => {
+ useGoftino();
+
+ return null;
+};
+
+export default GoftinoProvider;
diff --git a/apps/level_up/components/providers/SoundProvider.tsx b/apps/level_up/components/providers/SoundProvider.tsx
new file mode 100644
index 00000000..30a0e77e
--- /dev/null
+++ b/apps/level_up/components/providers/SoundProvider.tsx
@@ -0,0 +1,87 @@
+"use client";
+
+import {
+ createContext,
+ useContext,
+ useState,
+ useCallback,
+ ReactNode,
+ useEffect,
+} from "react";
+import {
+ playSound as play,
+ setGlobalVolume,
+ toggleMute as toggleHowlerMute,
+ SoundKey,
+} from "../../lib/soundManager";
+
+type SoundContextType = {
+ playSound: (key: SoundKey) => void;
+ toggle: () => void;
+ muted: boolean;
+ volume: number;
+ changeVolume: (v: number) => void;
+ audioEnabled: boolean;
+};
+
+const SoundContext = createContext(undefined);
+
+export function SoundProvider({ children }: { children: ReactNode }) {
+ const [muted, setMuted] = useState(false);
+ const [volume, setVolume] = useState(1);
+ const [audioEnabled, setAudioEnabled] = useState(false);
+
+ // Enable audio on first user interaction
+ useEffect(() => {
+ const enableAudio = () => {
+ setAudioEnabled(true);
+ document.removeEventListener("click", enableAudio);
+ document.removeEventListener("touchstart", enableAudio);
+ document.removeEventListener("keydown", enableAudio);
+ };
+
+ document.addEventListener("click", enableAudio);
+ document.addEventListener("touchstart", enableAudio);
+ document.addEventListener("keydown", enableAudio);
+
+ return () => {
+ document.removeEventListener("click", enableAudio);
+ document.removeEventListener("touchstart", enableAudio);
+ document.removeEventListener("keydown", enableAudio);
+ };
+ }, []);
+
+ const playSound = useCallback(
+ (key: SoundKey) => {
+ if (audioEnabled && !muted) {
+ play(key);
+ }
+ },
+ [audioEnabled, muted]
+ );
+
+ const toggle = useCallback(() => {
+ const newMute = !muted;
+ setMuted(newMute);
+ toggleHowlerMute(newMute);
+ }, [muted]);
+
+ const changeVolume = useCallback((v: number) => {
+ setVolume(v);
+ setGlobalVolume(v);
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useSound() {
+ const ctx = useContext(SoundContext);
+ if (!ctx) throw new Error("useSound must be used inside SoundProvider");
+ return ctx;
+}
diff --git a/apps/level_up/components/providers/StoreProvider.tsx b/apps/level_up/components/providers/StoreProvider.tsx
new file mode 100644
index 00000000..34e93fd6
--- /dev/null
+++ b/apps/level_up/components/providers/StoreProvider.tsx
@@ -0,0 +1,13 @@
+"use client";
+
+import { store } from "lib/store/store";
+import { ReactNode } from "react";
+import { Provider } from "react-redux";
+
+interface StoreProviderProps {
+ children: ReactNode;
+}
+
+export default function StoreProvider({ children }: StoreProviderProps) {
+ return {children};
+}
diff --git a/apps/level_up/config/colors.ts b/apps/level_up/config/colors.ts
new file mode 100644
index 00000000..54c4d726
--- /dev/null
+++ b/apps/level_up/config/colors.ts
@@ -0,0 +1,8 @@
+// Custom brand colors for the application
+export const customColors = {
+ colorAction: "#01B582", // Brand action color
+ colorPrimary: "#3c3a7d", // Primary brand color
+ colorOfflineWorkshop: "#4F7B79", // Offline workshop background color
+} as const;
+
+export type CustomColors = typeof customColors;
diff --git a/apps/level_up/config/galleryImages.ts b/apps/level_up/config/galleryImages.ts
new file mode 100644
index 00000000..2c123790
--- /dev/null
+++ b/apps/level_up/config/galleryImages.ts
@@ -0,0 +1,81 @@
+export interface GalleryImage {
+ id: string;
+ src: string;
+ alt: string;
+ title?: string;
+}
+
+export const galleryImages: GalleryImage[] = [
+ {
+ id: "gamecraft-1",
+ src: "/gallary/gamecraft-1.jpg",
+ alt: "GameCraft Event Image 1",
+ title: "GameCraft Event 1"
+ },
+ {
+ id: "gamecraft-2",
+ src: "/gallary/gamecraft-2.jpg",
+ alt: "GameCraft Event Image 2",
+ title: "GameCraft Event 2"
+ },
+ {
+ id: "gamecraft-3",
+ src: "/gallary/gamecraft-3.jpg",
+ alt: "GameCraft Event Image 3",
+ title: "GameCraft Event 3"
+ },
+ {
+ id: "gamecraft-4",
+ src: "/gallary/gamecraft-4.jpg",
+ alt: "GameCraft Event Image 4",
+ title: "GameCraft Event 4"
+ },
+ {
+ id: "gamecraft-5",
+ src: "/gallary/gamecraft-5.jpg",
+ alt: "GameCraft Event Image 5",
+ title: "GameCraft Event 5"
+ },
+ {
+ id: "gamecraft-6",
+ src: "/gallary/gamecraft-6.jpg",
+ alt: "GameCraft Event Image 6",
+ title: "GameCraft Event 6"
+ },
+ {
+ id: "gamecraft-7",
+ src: "/gallary/gamecraft-7.jpg",
+ alt: "GameCraft Event Image 7",
+ title: "GameCraft Event 7"
+ },
+ {
+ id: "gamecraft-8",
+ src: "/gallary/gamecraft-8.jpg",
+ alt: "GameCraft Event Image 8",
+ title: "GameCraft Event 8"
+ },
+ {
+ id: "gamecraft-9",
+ src: "/gallary/gamecraft-9.jpg",
+ alt: "GameCraft Event Image 9",
+ title: "GameCraft Event 9"
+ },
+ {
+ id: "gamecraft-10",
+ src: "/gallary/gamecraft-10.jpg",
+ alt: "GameCraft Event Image 10",
+ title: "GameCraft Event 10"
+ },
+ {
+ id: "gamecraft-11",
+ src: "/gallary/gamecraft-11.jpg",
+ alt: "GameCraft Event Image 11",
+ title: "GameCraft Event 11"
+ },
+ {
+ id: "gamecraft-12",
+ src: "/gallary/gamecraft-12.jpg",
+ alt: "GameCraft Event Image 12",
+ title: "GameCraft Event 12"
+ }
+];
diff --git a/apps/level_up/config/socialLinks.ts b/apps/level_up/config/socialLinks.ts
new file mode 100644
index 00000000..3e7472ab
--- /dev/null
+++ b/apps/level_up/config/socialLinks.ts
@@ -0,0 +1,21 @@
+// Social media links for GameCraft
+export const gameCraftSocialLinks = {
+ instagram: "https://www.instagram.com/autgamecraft",
+ telegram: "https://t.me/AUTGamecraft",
+ twitter: "https://x.com/AutGamecraft",
+ website: "https://gamecraft.ir",
+ youtube: "",
+ linkedin: "",
+ facebook: "",
+ illustrationTehranUniInstagram: "https://www.instagram.com/illustration.ut"
+} as const;
+
+// Future: SSC social links
+export const sscSocialLinks = {
+ instagram: "https://www.instagram.com/ceit_ssc",
+ telegram: "https://t.me/ceit_ssc",
+ twitter: "https://twitter.com/ceit_ssc",
+ linkedin: "https://www.linkedin.com/school/students-scientific-chapter/",
+ website: "https://ceit-ssc.ir/",
+ youtube: "",
+} as const;
diff --git a/apps/level_up/config/sponsors.ts b/apps/level_up/config/sponsors.ts
new file mode 100644
index 00000000..8160777b
--- /dev/null
+++ b/apps/level_up/config/sponsors.ts
@@ -0,0 +1,16 @@
+export interface Sponsor {
+ id: string;
+ logo: string;
+ link: string;
+ tier: 'platinum' | 'gold' | 'silver';
+}
+
+// name and description of sponsors comes from translation files using id
+export const sponsors: Sponsor[] = [
+ {
+ id: "Liara",
+ logo: "/assets/images/sponsors/liara.png",
+ link: "https://liara.ir/",
+ tier: "gold"
+ },
+];
diff --git a/apps/level_up/config/staffs.ts b/apps/level_up/config/staffs.ts
new file mode 100644
index 00000000..fb91e464
--- /dev/null
+++ b/apps/level_up/config/staffs.ts
@@ -0,0 +1,131 @@
+import { useTranslations } from "next-intl";
+
+export interface StaffMember {
+ imageUrl: string;
+ name: string;
+ role: string;
+ githubUrl?: string;
+ linkedinUrl?: string;
+ telegramUrl?: string;
+}
+
+export interface StaffTeam {
+ teamTitle: string;
+ teamMembers: StaffMember[];
+}
+
+export function useStaffs(): StaffTeam[] {
+ const t = useTranslations("app.staffs");
+
+ const organizingTeam: StaffTeam = {
+ teamTitle: t("organizingTeam.title"),
+ teamMembers: [
+ {
+ imageUrl: "/images/2025/staffs/AmirabbasEntezari.jpg",
+ name: "امیرعباس انتظاری",
+ role: "دبیر رویداد",
+ telegramUrl: "https://t.me/amirabbas_entezari",
+ githubUrl: "https://github.com/AmirabbasEntezari",
+ linkedinUrl: "https://www.linkedin.com/in/amirabbas-entezari/",
+ },
+ {
+ imageUrl: "/images/2025/staffs/MohammadJavadAkbari.jpg",
+ name: "محمدجواد اکبری",
+ role: "دبیر انجمن علمی",
+ githubUrl: "https://github.com/Javad-Ak",
+ linkedinUrl: "https://www.linkedin.com/in/mo-ja-akbari/",
+ telegramUrl: "",
+ },
+ ],
+ };
+
+ const technicalTeam: StaffTeam = {
+ teamTitle: t("technicalTeam.title"),
+ teamMembers: [
+ {
+ imageUrl: "/images/2025/staffs/AmirhosseinAghighi.jpg",
+ name: "امیرحسین عقیقی",
+ role: "سرپرست تیم فنی",
+ telegramUrl: "https://t.me/Amirhosseinaghighii",
+ linkedinUrl: "https://www.linkedin.com/in/amirhossein-aghighi/",
+ githubUrl: "https://github.com/AmirhosseinAghighi",
+ },
+ {
+ imageUrl: "/images/2025/staffs/MohammadJavadAkbari.jpg",
+ name: "محمد جواد اکبری",
+ role: "توسعه دهنده بک اند",
+ githubUrl: "https://github.com/Javad-Ak",
+ linkedinUrl: "https://www.linkedin.com/in/mo-ja-akbari/",
+ telegramUrl: "",
+ },
+ {
+ imageUrl: "/images/2025/staffs/MoeinEnayati.png",
+ name: "معین عنایتی",
+ role: "توسعه دهنده بک اند و دوآپس",
+ telegramUrl: "https://t.me/moein_enayati",
+ linkedinUrl: "https://www.linkedin.com/in/moein-enayati",
+ githubUrl: "https://github.com/moeinEN",
+ },
+ {
+ imageUrl: "/images/2025/staffs/AlirezaNikooei.jpg",
+ name: "علیرضا نیکوئی",
+ role: "دوآپس",
+ githubUrl: "https://github.com/alirezanikooei",
+ linkedinUrl: "https://www.linkedin.com/in/alireza-nikooei-10655a1b5",
+ telegramUrl: "https://t.me/Nikoooei",
+ },
+ {
+ imageUrl: "/images/2025/staffs/PouryaFahimi.jpg",
+ name: "پوریا فهیمی",
+ role: "توسعه دهنده فرانت اند",
+ telegramUrl: "https://t.me/pouryaf289",
+ linkedinUrl: "https://www.linkedin.com/in/pourya-fahimi/",
+ githubUrl: "https://github.com/PouryaFahimi",
+ },
+ {
+ imageUrl: "/images/2025/staffs/MahdiHaeri.jpg",
+ name: "مهدی حائری",
+ role: "توسعه دهنده فرانت اند",
+ telegramUrl: "https://t.me/Mahdi_Haeri",
+ linkedinUrl: "https://www.linkedin.com/in/mahdi-haeri-4406861b9/",
+ githubUrl: "https://github.com/MahdiHaeri",
+ },
+ ],
+ };
+
+ const scientificTeam: StaffTeam = {
+ teamTitle: t("scientificTeam.title"),
+ teamMembers: [
+ {
+ imageUrl: "/images/2025/staffs/AmirabbasEntezari.jpg",
+ name: "امیرعباس انتظاری",
+ role: "سرپرست تیم علمی",
+ telegramUrl: "https://t.me/amirabbas_entezari",
+ githubUrl: "https://github.com/AmirabbasEntezari",
+ linkedinUrl: "https://www.linkedin.com/in/amirabbas-entezari/",
+ },
+ {
+ imageUrl: "/images/2025/staffs/AlirezaSafari.jpg",
+ name: "علی رضا صفری ",
+ role: "عضو تیم علمی",
+ telegramUrl: "https://t.me/A4f_ss",
+ linkedinUrl: "https://www.linkedin.com/in/alireza-safari-3ba3942b8/",
+ githubUrl: "https://github.com/Alireza12ss",
+ },
+ {
+ imageUrl: "/images/2025/staffs/MohammadJavadAkbari.jpg",
+ name: "محمدجواد اکبری",
+ role: "عضو تیم علمی",
+ githubUrl: "https://github.com/Javad-Ak",
+ linkedinUrl: "https://www.linkedin.com/in/mo-ja-akbari/",
+ telegramUrl: "",
+ },
+ ],
+ };
+
+ return [
+ organizingTeam,
+ technicalTeam,
+ scientificTeam,
+ ];
+}
diff --git a/apps/level_up/lib/api/client/clientApi.ts b/apps/level_up/lib/api/client/clientApi.ts
new file mode 100644
index 00000000..9ca679ec
--- /dev/null
+++ b/apps/level_up/lib/api/client/clientApi.ts
@@ -0,0 +1,48 @@
+"use client";
+
+import { ApiModule, BASE_URL } from "@ssc/core";
+import axios, { AxiosRequestConfig } from "axios";
+import { getSession, signOut } from "next-auth/react";
+
+declare module "axios" {
+ export interface AxiosRequestConfig {
+ requiresAuth?: boolean;
+ }
+}
+
+export const axiosInstance = axios.create({
+ baseURL: BASE_URL,
+ timeout: 10000,
+ headers: {
+ "Content-Type": "application/json",
+ },
+});
+
+axiosInstance.interceptors.request.use(
+ async (request) => {
+ if (request.requiresAuth) {
+ const session = await getSession();
+ if (session && session.accessToken) {
+ request.headers["Authorization"] = `Bearer ${session.accessToken}`;
+ }
+ }
+ return request;
+ },
+ (error) => {
+ return Promise.reject(error);
+ }
+);
+
+axiosInstance.interceptors.response.use(
+ (response) => {
+ return response;
+ },
+ async (error) => {
+ if (error.response?.status === 401) {
+ await signOut({ callbackUrl: "/login" });
+ }
+ return Promise.reject(error);
+ }
+);
+
+export const clientApi = new ApiModule(axiosInstance);
diff --git a/apps/level_up/lib/api/server/serverApi.ts b/apps/level_up/lib/api/server/serverApi.ts
new file mode 100644
index 00000000..196a0bd9
--- /dev/null
+++ b/apps/level_up/lib/api/server/serverApi.ts
@@ -0,0 +1,4 @@
+import { serverHttpService } from "@ssc/core";
+import { ApiModule } from "@ssc/core";
+
+export const serverApi = new ApiModule(serverHttpService);
diff --git a/apps/level_up/lib/config/dashboard-navigation.tsx b/apps/level_up/lib/config/dashboard-navigation.tsx
new file mode 100644
index 00000000..f092abd5
--- /dev/null
+++ b/apps/level_up/lib/config/dashboard-navigation.tsx
@@ -0,0 +1,44 @@
+import { useTranslations, useLocale } from "next-intl";
+import { FaExternalLinkAlt } from "react-icons/fa";
+
+export interface DashboardNavigationItem {
+ name: string;
+ route: string;
+ icon?: React.ReactNode;
+}
+
+export const useDashboardNavigations = (): DashboardNavigationItem[] => {
+ const t = useTranslations("app.dashboard");
+ const locale = useLocale();
+
+ return [
+ // {
+ // name: t("profile.label"),
+ // // route: `/${locale}/dashboard/events`,
+ // route: `${
+ // process.env.NEXT_PUBLIC_SSC_URL || "https://ceit-ssc.ir"
+ // }/dashboard`,
+ // icon: ,
+ // },
+ {
+ name: t("event"),
+ route: `/dashboard/events`,
+ },
+ {
+ name: t("teamStatus.label"),
+ route: `/dashboard/team-status`,
+ },
+ // {
+ // name: t("games.label"),
+ // route: `/${locale}/dashboard/games`,
+ // },
+ {
+ name: t("shoppingBag"),
+ route: `/dashboard/shopping-bag`,
+ },
+ {
+ name: t("onlineAccount.label"),
+ route: `/dashboard/online-account`,
+ },
+ ];
+};
diff --git a/apps/level_up/lib/config/navigation.ts b/apps/level_up/lib/config/navigation.ts
new file mode 100644
index 00000000..25e3f87e
--- /dev/null
+++ b/apps/level_up/lib/config/navigation.ts
@@ -0,0 +1,42 @@
+import { useTranslations } from "next-intl";
+
+export interface NavigationItem {
+ name: string;
+ route: string;
+ icon?: React.ReactNode;
+}
+
+export const useMainNavigations = (): NavigationItem[] => {
+ const t = useTranslations("app.mainNavigation");
+
+ return [
+ {
+ name: t("home"),
+ route: "/",
+ },
+ // {
+ // name: t('news'),
+ // route: '/news',
+ // },
+ {
+ name: t("faq"),
+ route: "/faq",
+ },
+ {
+ name: t("staffs"),
+ route: "/staffs",
+ },
+ {
+ name: t("gallery"),
+ route: "/gallery",
+ },
+ {
+ name: t("sponsors"),
+ route: "/sponsor",
+ },
+ // {
+ // name: t("dashboard"),
+ // route: "/dashboard/shopping-bag",
+ // },
+ ];
+};
diff --git a/apps/level_up/lib/hooks/useAuth.ts b/apps/level_up/lib/hooks/useAuth.ts
new file mode 100644
index 00000000..4d9144f6
--- /dev/null
+++ b/apps/level_up/lib/hooks/useAuth.ts
@@ -0,0 +1,27 @@
+import { signOut, useSession } from "next-auth/react";
+import { useMemo } from "react";
+
+export const useAuth = () => {
+ const session = useSession();
+
+ const isLoading = useMemo(
+ () => session.status === "loading",
+ [session.status]
+ );
+
+ const isAuthenticated = useMemo(
+ () => session.status === "authenticated",
+ [session.status]
+ );
+
+ const logout = () => {
+ signOut({ callbackUrl: "/" });
+ };
+
+ const user = useMemo(
+ () => (session.status === "authenticated" ? session.data.user : undefined),
+ [session]
+ );
+
+ return { isLoading, isAuthenticated, user, logout };
+};
diff --git a/apps/level_up/lib/hooks/useFetch.ts b/apps/level_up/lib/hooks/useFetch.ts
new file mode 100644
index 00000000..8893c9aa
--- /dev/null
+++ b/apps/level_up/lib/hooks/useFetch.ts
@@ -0,0 +1,77 @@
+"use client";
+
+import { useState, useEffect, useCallback } from "react";
+
+export interface UseFetchState {
+ data: T | null;
+ loading: boolean;
+ error: Error | null;
+}
+
+export interface UseFetchOptions {
+ immediate?: boolean;
+ onSuccess?: (data: T) => void;
+ onError?: (error: Error) => void;
+}
+
+/**
+ * Custom hook for data fetching with loading states
+ * @param apiFunc - The API function to call
+ * @param params - Parameters to pass to the API function
+ * @param options - Additional options for the fetch behavior
+ */
+export function useFetch(
+ apiFunc: (params?: P) => Promise,
+ params?: P,
+ options: UseFetchOptions = {}
+): UseFetchState & { refetch: (newParams?: P) => Promise } {
+ const { immediate = true, onSuccess, onError } = options;
+
+ const [data, setData] = useState(null);
+ const [loading, setLoading] = useState(immediate);
+ const [error, setError] = useState(null);
+
+ const fetchData = useCallback(
+ async (fetchParams?: P) => {
+ try {
+ setLoading(true);
+ setError(null);
+
+ const response = await apiFunc(fetchParams || params);
+ setData(response);
+
+ if (onSuccess) {
+ onSuccess(response);
+ }
+ } catch (err) {
+ const error =
+ err instanceof Error ? err : new Error("An unknown error occurred");
+ setError(error);
+
+ if (onError) {
+ onError(error);
+ }
+ } finally {
+ setLoading(false);
+ }
+ },
+ [apiFunc, params, onSuccess, onError]
+ );
+
+ const refetch = useCallback(
+ async (newParams?: P) => {
+ await fetchData(newParams);
+ },
+ [fetchData]
+ );
+
+ useEffect(() => {
+ if (immediate) {
+ fetchData();
+ }
+ }, []);
+
+ return { data, loading, error, refetch };
+}
+
+export default useFetch;
diff --git a/apps/level_up/lib/hooks/useFormatter.ts b/apps/level_up/lib/hooks/useFormatter.ts
new file mode 100644
index 00000000..7e104580
--- /dev/null
+++ b/apps/level_up/lib/hooks/useFormatter.ts
@@ -0,0 +1,15 @@
+"use client";
+
+import { digitsToHindi, moneyFormat } from "@ssc/utils";
+import { useLocale } from "next-intl";
+
+export const useFormatter = () => {
+ const locale = useLocale();
+
+ const formatNumberToMoney = (value: string | number) => {
+ const formatted = moneyFormat(value);
+ return locale === "fa" ? digitsToHindi(formatted) : formatted;
+ };
+
+ return { formatNumberToMoney };
+};
diff --git a/apps/level_up/lib/hooks/useGoftino.ts b/apps/level_up/lib/hooks/useGoftino.ts
new file mode 100644
index 00000000..9fb5dde3
--- /dev/null
+++ b/apps/level_up/lib/hooks/useGoftino.ts
@@ -0,0 +1,111 @@
+import { useSession } from "next-auth/react";
+import { useCallback, useEffect, useState } from "react";
+
+const WIDGET_ID = "pbMzMN";
+
+declare global {
+ interface Window {
+ Goftino?: {
+ setUser: (userData: {
+ email?: string;
+ name?: string;
+ phone?: string;
+ tags?: string[];
+ metadata?: { key: string; value: string }[];
+ avatar?: string;
+ about?: string;
+ forceUpdate?: boolean;
+ }) => void;
+ };
+ }
+}
+
+export function useGoftino() {
+ const [isGoftinoReady, setIsGoftinoReady] = useState(false);
+ const session = useSession();
+
+ const removeAllGoftinoScripts = (element) => {
+ if (!element) return;
+ const { id } = element;
+ if (id && (id === "goftino" || id === "goftino_w")) {
+ removeElem(element);
+ }
+ };
+
+ const removeGoftinoElements = useCallback((): void => {
+ setIsGoftinoReady(false);
+ getAllTags("script", removeAllGoftinoScripts);
+ getAllTags("iframe", removeAllGoftinoScripts);
+ getAllTags("style", removeAllGoftinoScripts);
+ }, []);
+
+ const loadGoftino = useCallback(() => {
+ const scriptElement = document.createElement("script");
+ const widgetUrl = "https://www.goftino.com/widget/" + WIDGET_ID;
+ const localStorageKey = "goftino_" + WIDGET_ID;
+ const localStorageValue = localStorage.getItem(localStorageKey);
+
+ scriptElement.id = "goftino";
+ scriptElement.async = true;
+ scriptElement.src = localStorageValue
+ ? widgetUrl + "?o=" + localStorageValue
+ : widgetUrl;
+
+ document.getElementsByTagName("head")[0].appendChild(scriptElement);
+ }, []);
+
+ const restartGoftino = useCallback(() => {
+ setIsGoftinoReady(false);
+ removeGoftinoElements();
+ loadGoftino();
+ }, [removeGoftinoElements, loadGoftino]);
+
+ useEffect(() => {
+ restartGoftino();
+
+ function handleGoftinoReady() {
+ if (session.status === "authenticated") {
+ const { user } = session.data;
+ // console.log("!@! user data to goftino", {
+ // email: user.email,
+ // name: user.name,
+ // forceUpdate: true,
+ // });
+ window.Goftino?.setUser({
+ email: user.email,
+ name: user.name,
+ tags: ["gamecraft", "user"],
+ forceUpdate: true,
+ });
+ }
+
+ setIsGoftinoReady(true);
+ }
+
+ if (document.readyState === "complete") {
+ loadGoftino();
+ } else {
+ window.addEventListener("load", loadGoftino);
+ }
+
+ window.addEventListener("goftino_ready", handleGoftinoReady);
+
+ return () => {
+ window.removeEventListener("goftino_ready", handleGoftinoReady);
+ };
+ }, [session, restartGoftino, loadGoftino]);
+
+ return { isGoftinoReady };
+}
+
+export const getAllTags = (tagName: string, cb) => {
+ const elements = document.getElementsByTagName(tagName);
+ const elementsArray = Array.prototype.slice.call(elements);
+ elementsArray.forEach(cb);
+};
+
+export const removeElem = (element: Node): Node =>
+ element.parentNode!.removeChild(element);
+
+export const getElemById = (elemId: string): Node | null =>
+ document.getElementById(elemId);
diff --git a/apps/level_up/lib/hooks/usePurchases.ts b/apps/level_up/lib/hooks/usePurchases.ts
new file mode 100644
index 00000000..f31de370
--- /dev/null
+++ b/apps/level_up/lib/hooks/usePurchases.ts
@@ -0,0 +1,42 @@
+"use client";
+
+import { useEffect } from "react";
+import { useAppDispatch, useAppSelector } from "../store/store";
+import { fetchPurchasesThunk } from "../store/purchases/purchases.thunk";
+import {
+ purchasesLoadingSelector,
+ purchasesErrorSelector,
+ purchasedPresentationsSelector,
+ isPresentationPurchasedSelector,
+} from "../store/purchases/purchases.selectors";
+import { useAuth } from "./useAuth";
+
+export function usePurchases() {
+ const dispatch = useAppDispatch();
+ const { isAuthenticated } = useAuth();
+ const loading = useAppSelector(purchasesLoadingSelector);
+ const error = useAppSelector(purchasesErrorSelector);
+ const presentations = useAppSelector(purchasedPresentationsSelector);
+
+ useEffect(() => {
+ // Only fetch purchases if user is authenticated and we haven't loaded yet
+ if (isAuthenticated && presentations.length === 0 && !loading && !error) {
+ dispatch(fetchPurchasesThunk());
+ }
+ }, [dispatch, isAuthenticated, presentations.length]);
+
+ return {
+ presentations,
+ loading,
+ error,
+ isAuthenticated,
+ };
+}
+
+export function useIsPresentationPurchased(presentationId: number) {
+ const isPurchased = useAppSelector(isPresentationPurchasedSelector(presentationId));
+ const { isAuthenticated } = useAuth();
+
+ // Only return true if user is authenticated and has purchased
+ return isAuthenticated && isPurchased;
+}
diff --git a/apps/level_up/lib/hooks/useRequest.ts b/apps/level_up/lib/hooks/useRequest.ts
new file mode 100644
index 00000000..d19e62c0
--- /dev/null
+++ b/apps/level_up/lib/hooks/useRequest.ts
@@ -0,0 +1,22 @@
+import React from "react";
+
+export const useFetch = (apiMethod: (...args) => Promise) => {
+ const [data, setData] = React.useState(null);
+ const [loading, setLoading] = React.useState(false);
+ const [error, setError] = React.useState(null);
+
+ const fetchData = async (...args) => {
+ setLoading(true);
+ setError(null);
+ try {
+ const response = await apiMethod(...args);
+ setData(response);
+ } catch (err) {
+ setError(err.message || "An error occurred");
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return { data, loading, error, fetchData };
+};
diff --git a/apps/level_up/lib/hooks/useResponsive.ts b/apps/level_up/lib/hooks/useResponsive.ts
new file mode 100644
index 00000000..bf7e2f57
--- /dev/null
+++ b/apps/level_up/lib/hooks/useResponsive.ts
@@ -0,0 +1,23 @@
+import { useMediaQuery } from "react-responsive";
+
+export const useResponsive = () => {
+ const xxl = useMediaQuery({
+ query: "(min-width: 1600px)",
+ });
+ const xl = useMediaQuery({
+ query: "(min-width: 1200px)",
+ });
+ const lg = useMediaQuery({
+ query: "(min-width: 992px)",
+ });
+ const md = useMediaQuery({
+ query: "(min-width: 768px)",
+ });
+ const sm = useMediaQuery({
+ query: "(min-width: 576px)",
+ });
+ const xs = useMediaQuery({
+ query: "(max-width: 576px)",
+ });
+ return { xxl, xl, lg, md, sm, xs };
+};
diff --git a/apps/level_up/lib/i18n.ts b/apps/level_up/lib/i18n.ts
new file mode 100644
index 00000000..5e61102e
--- /dev/null
+++ b/apps/level_up/lib/i18n.ts
@@ -0,0 +1,17 @@
+import { getRequestConfig } from "next-intl/server";
+import { routing } from "./routing";
+
+export default getRequestConfig(async ({ requestLocale }) => {
+ // This typically corresponds to the `[locale]` segment
+ let locale = await requestLocale;
+
+ // Ensure that a valid locale is used
+ if (!locale || !routing.locales.includes(locale as (typeof routing.locales)[number])) {
+ locale = routing.defaultLocale;
+ }
+
+ return {
+ locale,
+ messages: (await import(`../messages/${locale}.json`)).default,
+ };
+});
diff --git a/apps/level_up/lib/navigation.ts b/apps/level_up/lib/navigation.ts
new file mode 100644
index 00000000..f0bbd9af
--- /dev/null
+++ b/apps/level_up/lib/navigation.ts
@@ -0,0 +1,9 @@
+import { createSharedPathnamesNavigation } from 'next-intl/navigation';
+
+export const locales = ['en', 'fa'] as const;
+export const defaultLocale = 'fa' as const;
+
+export type Locale = (typeof locales)[number];
+
+export const { Link, redirect, usePathname, useRouter } =
+ createSharedPathnamesNavigation({ locales });
diff --git a/apps/level_up/lib/routing.ts b/apps/level_up/lib/routing.ts
new file mode 100644
index 00000000..b082efa0
--- /dev/null
+++ b/apps/level_up/lib/routing.ts
@@ -0,0 +1,15 @@
+import { defineRouting } from "next-intl/routing";
+import { createNavigation } from "next-intl/navigation";
+
+export const routing = defineRouting({
+ // A list of all locales that are supported
+ locales: ["fa", "en"],
+
+ // Used when no locale matches
+ defaultLocale: "fa",
+});
+
+// Lightweight wrappers around Next.js' navigation APIs
+// that will consider the routing configuration
+export const { Link, redirect, usePathname, useRouter } =
+ createNavigation(routing);
diff --git a/apps/level_up/lib/soundManager.ts b/apps/level_up/lib/soundManager.ts
new file mode 100644
index 00000000..cc6df18c
--- /dev/null
+++ b/apps/level_up/lib/soundManager.ts
@@ -0,0 +1,57 @@
+import { Howl, Howler } from "howler";
+
+// List of available sounds
+export type SoundKey = "coin" | "jump";
+
+// Store all sounds in one place
+const sounds: Record = {
+ coin: new Howl({
+ src: ["/sound/super-mario-coin-sound.mp3"],
+ volume: 0.3,
+ preload: true,
+ html5: true,
+ onloaderror: (id, error) => {
+ console.error(`Failed to load hover sound:`, error);
+ },
+ onplayerror: (id, error) => {
+ console.error(`Failed to play hover sound:`, error);
+ },
+ }),
+ jump: new Howl({
+ src: ["/sound/super-mario-jump-sound.mp3"],
+ volume: 0.3,
+ preload: true,
+ html5: true,
+ onloaderror: (id, error) => {
+ console.error(`Failed to load hover sound:`, error);
+ },
+ onplayerror: (id, error) => {
+ console.error(`Failed to play hover sound:`, error);
+ },
+ }),
+};
+
+export const playSound = (key: SoundKey): void => {
+ try {
+ const sound = sounds[key];
+ if (sound) {
+ // Check if the sound is ready to play
+ if (sound.state() === "loaded") {
+ sound.stop(); // reset if needed
+ // sound.play();
+ } else {
+ console.warn(`Sound "${key}" is not loaded yet`);
+ }
+ }
+ } catch (error) {
+ console.error(`Error playing sound "${key}":`, error);
+ }
+};
+
+export const setGlobalVolume = (vol: number): void => {
+ Howler.volume(vol); // 0.0 - 1.0
+};
+
+export const toggleMute = (mute: boolean): void => {
+ Howler.mute(mute);
+};
diff --git a/apps/level_up/lib/store/cart/cart.selectors.ts b/apps/level_up/lib/store/cart/cart.selectors.ts
new file mode 100644
index 00000000..5229cb6c
--- /dev/null
+++ b/apps/level_up/lib/store/cart/cart.selectors.ts
@@ -0,0 +1,49 @@
+import { RootState } from "../store";
+import { createSelector } from "@reduxjs/toolkit";
+import { ItemType } from "@ssc/core";
+
+export const cartSelector = (state: RootState) => state.cart;
+
+export const cartPresentationsSelector = createSelector(
+ [cartSelector],
+ (cart) => cart.presentations
+);
+
+export const cartPresentationsCountSelector = createSelector(
+ [cartSelector],
+ (cart) => cart.count
+);
+
+export const cartErrorSelector = createSelector(
+ [cartSelector],
+ (cart) => cart.error
+);
+
+export const cartLoadingSelector = createSelector(
+ [cartSelector],
+ (cart) => cart.loading
+);
+
+export const itemInCartSelector = (id: number, type: ItemType) =>
+ createSelector([cartPresentationsSelector], (presentation) => {
+ switch (type) {
+ case ItemType.PRESENTATION:
+ return presentation.find((item) => item.id === id);
+ case ItemType.SOLO_COMPETITION:
+ return false;
+ case ItemType.COMPETITION_TEAM:
+ return false;
+ default:
+ return false;
+ }
+ });
+
+export const cartPaymentDataSelector = createSelector(
+ [cartSelector],
+ (cart) => ({
+ total: cart.total,
+ subTotal: cart.subTotal,
+ discountAmount: cart.discountAmount,
+ discountCode: cart.discountCode,
+ })
+);
diff --git a/apps/level_up/lib/store/cart/cart.slice.ts b/apps/level_up/lib/store/cart/cart.slice.ts
new file mode 100644
index 00000000..0056a0e8
--- /dev/null
+++ b/apps/level_up/lib/store/cart/cart.slice.ts
@@ -0,0 +1,114 @@
+"use client";
+
+import { createSlice, PayloadAction } from "@reduxjs/toolkit";
+import { Cart, Presentation } from "@ssc/core";
+import {
+ addItemToCartThunk,
+ applyBonusCodeThunk,
+ fetchCartThunk,
+ removeBonusCodeThunk,
+ removeItemFromCartThunk,
+} from "./cart.thunk";
+
+const initialState = {
+ presentations: [] as Presentation[],
+ count: 0,
+ discountCode: null as string | null,
+ discountAmount: 0,
+ total: 0,
+ subTotal: 0,
+ error: null as string | null,
+ loading: false,
+};
+
+const cartSlice = createSlice({
+ name: "cart",
+ initialState: initialState,
+ reducers: {},
+ extraReducers: (builder) => {
+ builder.addAsyncThunk(fetchCartThunk, {
+ pending: (state) => {
+ state.loading = true;
+ state.error = null;
+ },
+ fulfilled: (state, action) => {
+ state.presentations = action.payload.presentations;
+ state.count = action.payload.presentations.length;
+ state.discountCode = action.payload.discount_code;
+ state.discountAmount = action.payload.discount_amount || 0;
+ // Handle both PriceObject and plain number formats
+ state.subTotal =
+ typeof action.payload.subtotal_amount === "object"
+ ? action.payload.subtotal_amount?.parsedValue || 0
+ : action.payload.subtotal_amount || 0;
+ state.total =
+ typeof action.payload.total_amount === "object"
+ ? action.payload.total_amount?.parsedValue || 0
+ : action.payload.total_amount || 0;
+ state.error = null;
+ state.loading = false;
+ },
+
+ rejected: (state, action) => {
+ state.presentations = [];
+ state.count = 0;
+ state.error = action.payload as string;
+ state.loading = false;
+ },
+ });
+ builder.addAsyncThunk(addItemToCartThunk, {
+ pending: (state) => {
+ state.loading = true;
+ state.error = null;
+ },
+ rejected: (state, action) => {
+ state.error = action.payload as string;
+ state.loading = false;
+ },
+ });
+ builder.addAsyncThunk(removeItemFromCartThunk, {
+ pending: (state) => {
+ state.loading = true;
+ state.error = null;
+ },
+ rejected: (state, action) => {
+ state.error = action.payload as string;
+ state.loading = false;
+ },
+ });
+ builder.addAsyncThunk(removeBonusCodeThunk, {
+ fulfilled: (state, action: PayloadAction) => {
+ state.discountCode = action.payload.discount_code;
+ state.discountAmount = action.payload.discount_amount;
+ state.subTotal =
+ typeof action.payload.subtotal_amount === "object"
+ ? action.payload.subtotal_amount?.parsedValue || 0
+ : action.payload.subtotal_amount || 0;
+ state.total =
+ typeof action.payload.total_amount === "object"
+ ? action.payload.total_amount?.parsedValue || 0
+ : action.payload.total_amount || 0;
+ },
+ });
+ builder.addAsyncThunk(applyBonusCodeThunk, {
+ fulfilled: (state, action: PayloadAction) => {
+ // state.presentations = action.payload.presentations;
+ // state.count = action.payload.presentations.length;
+ state.discountCode = action.payload.discount_code;
+ state.discountAmount = action.payload.discount_amount;
+ // Handle both PriceObject and plain number formats
+ state.subTotal =
+ typeof action.payload.subtotal_amount === "object"
+ ? action.payload.subtotal_amount?.parsedValue || 0
+ : action.payload.subtotal_amount || 0;
+ state.total =
+ typeof action.payload.total_amount === "object"
+ ? action.payload.total_amount?.parsedValue || 0
+ : action.payload.total_amount || 0;
+ },
+ });
+ },
+});
+
+export const {} = cartSlice.actions;
+export const cartReducer = cartSlice.reducer;
diff --git a/apps/level_up/lib/store/cart/cart.thunk.ts b/apps/level_up/lib/store/cart/cart.thunk.ts
new file mode 100644
index 00000000..aa0ef120
--- /dev/null
+++ b/apps/level_up/lib/store/cart/cart.thunk.ts
@@ -0,0 +1,70 @@
+"use client";
+
+import { eventId } from "lib/utils/constants";
+import { createAppAsyncThunk } from "../createAppAsyncThunk";
+import { Cart, ItemType } from "@ssc/core";
+
+export const fetchCartThunk = createAppAsyncThunk(
+ "cart/fetchCart",
+ async (_, thunkAPI) => {
+ try {
+ const response = await thunkAPI.extra.Api.shop.fetchCart(eventId);
+ const data = response.data.data;
+ return thunkAPI.fulfillWithValue(data);
+ } catch (error) {
+ return thunkAPI.rejectWithValue(error.message);
+ }
+ }
+);
+
+export const addItemToCartThunk = createAppAsyncThunk(
+ "cart/addItem",
+ async (params: { item_type: ItemType; item_id: number }, thunkAPI) => {
+ try {
+ await thunkAPI.extra.Api.shop.addItem(params.item_type, params.item_id);
+ thunkAPI.dispatch(fetchCartThunk());
+ return;
+ } catch (error) {
+ return thunkAPI.rejectWithValue(error.message);
+ }
+ }
+);
+
+export const removeItemFromCartThunk = createAppAsyncThunk(
+ "cart/removeItem",
+ async (args: { item_id: number; item_type: ItemType }, thunkAPI) => {
+ try {
+ thunkAPI.extra.Api.shop.removeItem(args.item_id, args.item_type);
+ thunkAPI.dispatch(fetchCartThunk());
+ return;
+ } catch (error) {
+ return thunkAPI.rejectWithValue(error.message);
+ }
+ }
+);
+
+export const applyBonusCodeThunk = createAppAsyncThunk(
+ "cart/applyBonusCode",
+ async (code: string, thunkAPI) => {
+ try {
+ const response = await thunkAPI.extra.Api.shop.applyDiscountCode(code);
+ const data = response.data.data;
+ return thunkAPI.fulfillWithValue(data);
+ } catch (error) {
+ return thunkAPI.rejectWithValue(error.message);
+ }
+ }
+);
+
+export const removeBonusCodeThunk = createAppAsyncThunk(
+ "cart/removeBonusCode",
+ async (parameters: void, thunkAPI) => {
+ try {
+ const response = await thunkAPI.extra.Api.shop.removeDiscountCode();
+ const data = response.data.data;
+ return thunkAPI.fulfillWithValue(data);
+ } catch (error) {
+ return thunkAPI.rejectWithValue(error.message);
+ }
+ }
+);
diff --git a/apps/level_up/lib/store/createAppAsyncThunk.ts b/apps/level_up/lib/store/createAppAsyncThunk.ts
new file mode 100644
index 00000000..a44892a2
--- /dev/null
+++ b/apps/level_up/lib/store/createAppAsyncThunk.ts
@@ -0,0 +1,8 @@
+import { createAsyncThunk } from "@reduxjs/toolkit";
+import { clientApi } from "../api/client/clientApi";
+
+export const createAppAsyncThunk = createAsyncThunk.withTypes<{
+ extra: {
+ Api: typeof clientApi;
+ };
+}>();
diff --git a/apps/level_up/lib/store/order/order.selectors.ts b/apps/level_up/lib/store/order/order.selectors.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/lib/store/order/order.slice.ts b/apps/level_up/lib/store/order/order.slice.ts
new file mode 100644
index 00000000..b3b301c5
--- /dev/null
+++ b/apps/level_up/lib/store/order/order.slice.ts
@@ -0,0 +1,39 @@
+"use client";
+
+import { createSlice } from "@reduxjs/toolkit";
+import { ItemType } from "antd/es/menu/interface";
+
+type orderStateType = {
+ id: number;
+ order_id: string;
+ totalAmount: number;
+ status: "pending_payment";
+ createdAt: string;
+ paidAt: string;
+ items: {
+ id: number;
+ description: string;
+ price: string;
+ content_type: number;
+ object_id: number;
+ event_id: number;
+ item_type: ItemType;
+ item_title: string;
+ }[];
+};
+
+const initialState = {
+ id: 0,
+ order_id: "",
+ totalAmount: 0,
+} as orderStateType;
+
+const orderSlice = createSlice({
+ name: "order",
+ initialState: initialState,
+ reducers: {},
+ extraReducers: (builder) => {},
+});
+
+export const {} = orderSlice.actions;
+export const orderReducer = orderSlice.reducer;
diff --git a/apps/level_up/lib/store/order/order.thunk.ts b/apps/level_up/lib/store/order/order.thunk.ts
new file mode 100644
index 00000000..7a39c07b
--- /dev/null
+++ b/apps/level_up/lib/store/order/order.thunk.ts
@@ -0,0 +1,32 @@
+import { createAppAsyncThunk } from "../createAppAsyncThunk";
+
+export const checkoutThunk = createAppAsyncThunk(
+ "order/partialCheckout",
+ async (eventID: number, thunkAPI) => {
+ try {
+ const response = await thunkAPI.extra.Api.order.checkout(eventID);
+ const data = response.data.data;
+ return thunkAPI.fulfillWithValue(data);
+ } catch (error) {
+ return thunkAPI.rejectWithValue(error.message);
+ }
+ }
+);
+
+export const createAndCheckoutThunk = createAppAsyncThunk(
+ "order/checkout",
+ async (itemIds: number[], thunkAPI) => {
+ try {
+ const response = await thunkAPI
+ .dispatch(checkoutThunk(Number(process.env.GAME_CRAFT_SSC_EVENT_ID)))
+ .unwrap();
+ const paymentRes = await thunkAPI.extra.Api.payment.initiatePayment(
+ response.order_id
+ );
+ const paymentData = paymentRes.data.data;
+ return thunkAPI.fulfillWithValue(paymentData);
+ } catch (error) {
+ return thunkAPI.rejectWithValue(error.message);
+ }
+ }
+);
diff --git a/apps/level_up/lib/store/orderHistory/orderHistory.slice.ts b/apps/level_up/lib/store/orderHistory/orderHistory.slice.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/lib/store/orderHistory/orderHistory.thunk.ts b/apps/level_up/lib/store/orderHistory/orderHistory.thunk.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/lib/store/purchases/purchases.selectors.ts b/apps/level_up/lib/store/purchases/purchases.selectors.ts
new file mode 100644
index 00000000..146f8ea1
--- /dev/null
+++ b/apps/level_up/lib/store/purchases/purchases.selectors.ts
@@ -0,0 +1,47 @@
+import { RootState } from "../store";
+import { createSelector } from "@reduxjs/toolkit";
+
+export const purchasesSelector = (state: RootState) => state.purchases;
+
+export const purchasedPresentationsSelector = createSelector(
+ [purchasesSelector],
+ (purchases) => purchases.presentations
+);
+
+export const purchasedSoloCompetitionsSelector = createSelector(
+ [purchasesSelector],
+ (purchases) => purchases.soloCompetitions
+);
+
+export const purchasedProductsSelector = createSelector(
+ [purchasesSelector],
+ (purchases) => purchases.products
+);
+
+export const purchasesLoadingSelector = createSelector(
+ [purchasesSelector],
+ (purchases) => purchases.loading
+);
+
+export const purchasesErrorSelector = createSelector(
+ [purchasesSelector],
+ (purchases) => purchases.error
+);
+
+// Filter presentations by type for workshops and talks
+export const workshopsSelector = createSelector(
+ [purchasedPresentationsSelector],
+ (presentations) => presentations.filter(p => p.type === "workshop" || p.type === "course")
+);
+
+export const talksSelector = createSelector(
+ [purchasedPresentationsSelector],
+ (presentations) => presentations.filter(p => p.type === "talk")
+);
+
+// Check if a specific presentation is purchased
+export const isPresentationPurchasedSelector = (presentationId: number) =>
+ createSelector(
+ [purchasedPresentationsSelector],
+ (presentations) => presentations.some(p => p.id === presentationId)
+ );
diff --git a/apps/level_up/lib/store/purchases/purchases.slice.ts b/apps/level_up/lib/store/purchases/purchases.slice.ts
new file mode 100644
index 00000000..99f0d1d9
--- /dev/null
+++ b/apps/level_up/lib/store/purchases/purchases.slice.ts
@@ -0,0 +1,53 @@
+"use client";
+
+import { createSlice, PayloadAction } from "@reduxjs/toolkit";
+import { PresentationOverview, SoloCompetition, Product } from "@ssc/core";
+import { fetchPurchasesThunk } from "./purchases.thunk";
+
+interface PurchasesState {
+ presentations: PresentationOverview[];
+ soloCompetitions: SoloCompetition[];
+ products: Product[];
+ loading: boolean;
+ error: string | null;
+}
+
+const initialState: PurchasesState = {
+ presentations: [],
+ soloCompetitions: [],
+ products: [],
+ loading: false,
+ error: null,
+};
+
+const purchasesSlice = createSlice({
+ name: "purchases",
+ initialState,
+ reducers: {},
+ extraReducers: (builder) => {
+ builder.addAsyncThunk(fetchPurchasesThunk, {
+ pending: (state) => {
+ state.loading = true;
+ state.error = null;
+ },
+ fulfilled: (state, action) => {
+ state.loading = false;
+ state.error = null;
+
+ // Direct access to presentations from the API response
+ state.presentations = action.payload.presentations || [];
+ state.soloCompetitions = action.payload.solo_competitions || [];
+ state.products = action.payload.products || [];
+ },
+ rejected: (state, action) => {
+ state.loading = false;
+ state.error = action.payload as string;
+ state.presentations = [];
+ state.soloCompetitions = [];
+ state.products = [];
+ },
+ });
+ },
+});
+
+export const purchasesReducer = purchasesSlice.reducer;
diff --git a/apps/level_up/lib/store/purchases/purchases.thunk.ts b/apps/level_up/lib/store/purchases/purchases.thunk.ts
new file mode 100644
index 00000000..0e67c419
--- /dev/null
+++ b/apps/level_up/lib/store/purchases/purchases.thunk.ts
@@ -0,0 +1,19 @@
+"use client";
+
+import { createAppAsyncThunk } from "../createAppAsyncThunk";
+import { PurchasesResponse } from "@ssc/core";
+
+export const fetchPurchasesThunk = createAppAsyncThunk(
+ "purchases/fetchPurchases",
+ async (_, thunkAPI) => {
+ try {
+ const response = await thunkAPI.extra.Api.purchases.fetchPurchases();
+ const data = response.data.data;
+ return thunkAPI.fulfillWithValue(data);
+ } catch (error) {
+ return thunkAPI.rejectWithValue(
+ error?.message || "Failed to fetch purchases"
+ );
+ }
+ }
+);
diff --git a/apps/level_up/lib/store/store.ts b/apps/level_up/lib/store/store.ts
new file mode 100644
index 00000000..58af4578
--- /dev/null
+++ b/apps/level_up/lib/store/store.ts
@@ -0,0 +1,42 @@
+"use client";
+
+import {
+ combineReducers,
+ configureStore,
+ createAsyncThunk,
+} from "@reduxjs/toolkit";
+import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
+import { cartReducer } from "./cart/cart.slice";
+import { clientApi } from "lib/api/client/clientApi";
+import { orderReducer } from "./order/order.slice";
+import { purchasesReducer } from "./purchases/purchases.slice";
+import { teamsReducer } from "./teams/teams.slice";
+
+export const store = configureStore({
+ reducer: combineReducers({
+ cart: cartReducer,
+ order: orderReducer,
+ purchases: purchasesReducer,
+ teams: teamsReducer,
+ }),
+ middleware: (getDefaultMiddleware) =>
+ getDefaultMiddleware({
+ thunk: {
+ extraArgument: {
+ Api: clientApi,
+ },
+ },
+ }),
+});
+
+export type RootState = ReturnType;
+export type AppDispatch = typeof store.dispatch;
+export const useAppDispatch: () => AppDispatch = useDispatch;
+export const useAppSelector: TypedUseSelectorHook = useSelector;
+export const createAppAsyncThunk = createAsyncThunk.withTypes<{
+ state: RootState;
+ dispatch: AppDispatch;
+ extra: {
+ Api: typeof clientApi;
+ };
+}>();
diff --git a/apps/level_up/lib/store/teams/teams.slice.ts b/apps/level_up/lib/store/teams/teams.slice.ts
new file mode 100644
index 00000000..de809452
--- /dev/null
+++ b/apps/level_up/lib/store/teams/teams.slice.ts
@@ -0,0 +1,56 @@
+import { createSlice } from "@reduxjs/toolkit";
+import { TeamDetails } from "@ssc/core/lib/types/api/Teams/teams";
+import {
+ fetchTeamsThunk,
+ payTeamThunk,
+ registerTeamThunk,
+} from "./teams.thunk";
+
+interface TeamsState {
+ loading: boolean;
+ error?: string | null;
+ data: TeamDetails[];
+}
+
+const initialState: TeamsState = {
+ loading: true,
+ error: null,
+ data: [],
+};
+
+const teamsSlice = createSlice({
+ name: "teams",
+ initialState,
+ reducers: {},
+ extraReducers: (builder) => {
+ builder
+ .addCase(fetchTeamsThunk.pending, (state) => {
+ state.loading = true;
+ state.error = null;
+ })
+ .addCase(fetchTeamsThunk.fulfilled, (state, action) => {
+ state.loading = false;
+ state.data = action.payload;
+ })
+ .addCase(fetchTeamsThunk.rejected, (state, action) => {
+ state.loading = false;
+ state.error = action.error.message ?? "Failed to fetch teams";
+ })
+
+ .addCase(payTeamThunk.fulfilled, (state, action) => {
+ const team = state.data.find((t) => t.id === action.payload.teamId);
+ if (team) team.status = "awaiting_payment_confirmation";
+ })
+
+ .addCase(registerTeamThunk.fulfilled, (state, action) => {
+ const { teamId, details } = action.payload;
+ const team = state.data.find((t) => t.id === teamId);
+ if (team) {
+ // team.group_competition_details = details;
+ team.status = "pending_admin_verification"; // update according to backend
+ }
+ });
+ },
+});
+
+export const teamsReducer = teamsSlice.reducer;
diff --git a/apps/level_up/lib/store/teams/teams.thunk.ts b/apps/level_up/lib/store/teams/teams.thunk.ts
new file mode 100644
index 00000000..8dbecabc
--- /dev/null
+++ b/apps/level_up/lib/store/teams/teams.thunk.ts
@@ -0,0 +1,72 @@
+import { TeamDetails } from "@ssc/core/lib/types/api/Teams/teams";
+import { createAppAsyncThunk } from "../createAppAsyncThunk";
+
+export const fetchTeamsThunk = createAppAsyncThunk(
+ "teams/fetchTeams",
+ async (_, { extra: { Api } }) => {
+ const res = await Api.teams.getTeamsList();
+ return res.data.data.results as TeamDetails[];
+ }
+);
+
+export const payTeamThunk = createAppAsyncThunk(
+ "teams/payTeam",
+ async (teamId: number, { extra: { Api }, rejectWithValue }) => {
+ try {
+ const res = await Api.teams.teamPayment(teamId);
+
+ if (res.status === 200) {
+ return { teamId, paymentUrl: res.data.data.payment_url };
+ }
+
+ if (res.status === 204) {
+ // it's free
+ }
+
+ return { teamId };
+ } catch (err) {
+ console.log(err);
+ if (err.status == 403)
+ return rejectWithValue({
+ code: err.status,
+ message: "تنها سرگروه مجاز به پرداخت میباشد",
+ });
+ return rejectWithValue({
+ code: err.response?.status ?? 500,
+ message: "پرداخت ناموفق بود",
+ });
+ }
+ }
+);
+
+export const registerTeamThunk = createAppAsyncThunk(
+ "teams/registerTeam",
+ async (
+ { teamId, competitionId }: { teamId: number; competitionId: number },
+ { extra: { Api }, rejectWithValue, dispatch }
+ ) => {
+ try {
+ const res = await Api.teams.registerCompetition(teamId, competitionId);
+ dispatch(fetchTeamsThunk());
+ return {
+ teamId,
+ details: res.data,
+ message: "تیم در مسابقه ثبت شد و آماده پرداخت است",
+ };
+ } catch (err) {
+ if (err.response?.status === 403) {
+ return rejectWithValue({
+ code: 403,
+ message: "تنها سرگروه مجاز به ثبت تیم می باشد",
+ });
+ }
+ if (err.response?.status === 400) {
+ return rejectWithValue({
+ code: 400,
+ message: err.response?.data?.message || "خطای نامشخص",
+ });
+ }
+ return rejectWithValue({ code: 500, message: "خطای ناشناخته" });
+ }
+ }
+);
diff --git a/apps/level_up/lib/utils/constants.ts b/apps/level_up/lib/utils/constants.ts
new file mode 100644
index 00000000..af426b21
--- /dev/null
+++ b/apps/level_up/lib/utils/constants.ts
@@ -0,0 +1,2 @@
+"use client";
+export const eventId = Number(process.env.GAME_CRAFT_SSC_EVENT_ID);
diff --git a/apps/level_up/lib/utils/storage.ts b/apps/level_up/lib/utils/storage.ts
new file mode 100644
index 00000000..efd339e5
--- /dev/null
+++ b/apps/level_up/lib/utils/storage.ts
@@ -0,0 +1,58 @@
+/**
+ * Storage utility for handling localStorage operations with Next.js SSR compatibility
+ */
+
+export const storage = {
+ set: (key: string, value: T): void => {
+ if (typeof window !== 'undefined') {
+ try {
+ localStorage.setItem(key, JSON.stringify(value))
+ } catch (error) {
+ console.error(`Error setting localStorage key "${key}":`, error)
+ }
+ }
+ },
+
+ get: (key: string): T | null => {
+ if (typeof window !== 'undefined') {
+ try {
+ const item = localStorage.getItem(key)
+ return item ? JSON.parse(item) : null
+ } catch (error) {
+ console.error(`Error getting localStorage key "${key}":`, error)
+ return null
+ }
+ }
+ return null
+ },
+
+ remove: (key: string): void => {
+ if (typeof window !== 'undefined') {
+ try {
+ localStorage.removeItem(key)
+ } catch (error) {
+ console.error(`Error removing localStorage key "${key}":`, error)
+ }
+ }
+ },
+
+ clear: (): void => {
+ if (typeof window !== 'undefined') {
+ try {
+ localStorage.clear()
+ } catch (error) {
+ console.error('Error clearing localStorage:', error)
+ }
+ }
+ },
+
+ // Check if a key exists
+ exists: (key: string): boolean => {
+ if (typeof window !== 'undefined') {
+ return localStorage.getItem(key) !== null
+ }
+ return false
+ }
+}
+
+export default storage
diff --git a/apps/level_up/messages/en.json b/apps/level_up/messages/en.json
new file mode 100644
index 00000000..71210277
--- /dev/null
+++ b/apps/level_up/messages/en.json
@@ -0,0 +1,263 @@
+{
+ "app": {
+ "name": "LevelUp",
+ "logo": {
+ "game": "Level",
+ "craft": "Up"
+ },
+ "mainNavigation": {
+ "home": "Home",
+ "news": "News",
+ "faq": "FAQ",
+ "staffs": "Our Team",
+ "gallery": "Gallery",
+ "sponsors": "Sponsors",
+ "dashboard": "Dashboard"
+ },
+ "sponsors": {
+ "title": "Sponsors",
+ "noSponsors": "No sponsors yet.",
+ "visitWebsite": "Show website!",
+ "Liara": {
+ "name": "Liara",
+ "description": "Liara makes it easy to deploy any software!"
+ }
+ },
+ "staffs": {
+ "title": "Our Team",
+ "organizingTeam": {
+ "title": "Organizing Team"
+ },
+ "technicalTeam": {
+ "title": "Technical Team"
+ },
+ "scientificTeam": {
+ "title": "Scientific Team"
+ },
+ "marketingTeam": {
+ "title": "Marketing Team"
+ },
+ "contentCreationTeam": {
+ "title": "Content Creation Team"
+ },
+ "graphicTeam": {
+ "title": "Graphic Design Team"
+ },
+ "financeTeam": {
+ "title": "Finance Team"
+ },
+ "operationsTeam": {
+ "title": "Operations Team"
+ },
+ "decorationTeam": {
+ "title": "Decoration Team"
+ }
+ },
+ "dashboard": {
+ "event": "Events",
+ "events": {
+ "title": "Events & Workshops",
+ "competitions": "My Competitions",
+ "workshops": "My Workshops",
+ "talks": "My Talks",
+ "loading": "Loading...",
+ "empty": "You haven't enrolled in any events",
+ "emptyDescription": "Browse available events and enroll to expand your skills"
+ },
+ "teamStatus": {
+ "label": "Teams Status",
+ "teamName": "Team Name",
+ "teamMembers": "Team Members",
+ "addTeammate": "Add Teammate",
+ "noTeams": "You haven't enrolled in any competitions",
+ "noTeamsDescription": "There is no such a team that enrolled in a competition for you"
+ },
+ "games": {
+ "label": "Games",
+ "upload": "Upload",
+ "gameName": "Game Name",
+ "gameLink": "Game Link",
+ "gameDescription": "Game Description",
+ "submitGame": "Submit Game",
+ "preview": "Preview",
+ "download": "Download"
+ },
+ "profile": {
+ "label": "Profile",
+ "profileImage": "Profile Image",
+ "firstName": "First Name",
+ "lastName": "Last Name",
+ "email": "Email",
+ "phoneNumber": "Phone Number",
+ "updateProfile": "Update Profile",
+ "uploadImage": "Upload Image",
+ "changeImage": "Change Image",
+ "emailLocked": "Email cannot be changed",
+ "personalInformation": "Personal Information",
+ "profilePicture": "Profile Picture",
+ "saveChanges": "Save Changes",
+ "cancel": "Cancel",
+ "profileUpdated": "Profile updated successfully",
+ "invalidImage": "Please upload a valid image file",
+ "maxFileSize": "File size should not exceed 5MB"
+ },
+ "shoppingBag": "Shopping Cart",
+ "onlineAccount": {
+ "label": "Online Account",
+ "skyroom": "Skyroom Account",
+ "description": "",
+ "username": "Username",
+ "password": "Password"
+ }
+ },
+ "pages": {
+ "main": "LevelUp",
+ "home": "Home",
+ "dashboard": "Dashboard",
+ "notFound": "Page Not Found",
+ "login": "Login",
+ "signUp": "Sign Up",
+ "forgotPassword": "Forgot Password"
+ },
+ "auth": {
+ "login": "Login",
+ "signUp": "Sign Up",
+ "logout": "Logout",
+ "register": "Register",
+ "email": "Email",
+ "password": "Password",
+ "displayName": "Display Name",
+ "phoneNumber": "Phone Number",
+ "forgotPassword": "Forgot Password?",
+ "doNotHaveAccount": "Don't have an account?",
+ "alreadyHaveAccount": "Already have an account?",
+ "resetPassword": "Reset Password",
+ "resetPasswordInstructions": "Enter your email address and we'll send you instructions to reset your password.",
+ "sendResetLink": "Send Reset Link",
+ "backToLogin": "Back to Login",
+ "resetLinkSent": "Reset link has been sent to your email",
+ "resetLinkError": "Failed to send reset link. Please try again.",
+ "loginWithSSC": "Login with SSC",
+ "loginWithEmail": "Login with Email",
+ "or": "OR",
+ "invalidCredentials": "Invalid email or password",
+ "loginSuccessful": "Login successful! Redirecting...",
+ "loginFailed": "Login failed. Please try again.",
+ "ssoLoginFailed": "SSO login failed. Please try again."
+ },
+ "intro": {
+ "title": "LevelUp",
+ "subtitle": "The Level Up Educational Event",
+ "description": "LevelUp is an educational event designed to empower students and enthusiasts through hands-on learning and collaboration. Organized by Amirkabir University of Technology, this year's event offers a dynamic blend of courses, workshops, and competitions focused on creativity, technology, and innovation. Participants will have the opportunity to learn from experienced mentors, develop practical skills, and showcase their talents in engaging challenges — all within a supportive and inspiring community environment."
+ },
+ "aboutUs": {
+ "title": "About Us",
+ "description": "The Computer Science Student Association at Amirkabir University is an independent organization dedicated to scientific and educational activities. Each year, the association hosts numerous academic and educational events at university, national, and international levels, attracting a large audience. Notable events include ACM competitions, Linux festivals, DMC data mining competitions, and AAISS artificial intelligence seminars.\nOne of the association's key approaches is strengthening team spirit and large-scale collaboration, helping students gain valuable experience for their professional lives. This event is no exception, with many students actively participating in the association's initiatives."
+ },
+ "footer": {
+ "autGameCraft": "Amirkabir Level Up",
+ "copyRight": "© 2025 LevelUp. All rights reserved."
+ },
+ "faq": {
+ "title": "Frequently Asked Questions",
+ "competitionConditions": "Course and Workshop Participation",
+ "competitionParticipate": {
+ "title": "How can I register for courses and workshops?",
+ "content": "To participate in LevelUp courses or workshops, visit levelup.ceit-ssc.ir, browse the available sessions, and complete the payment for your chosen course. After payment, the purchased course will appear in your dashboard under 'Purchased Courses'."
+ },
+ "teamsConditions": {
+ "title": "How can I access my purchased courses?",
+ "content": "Once you've registered for a course or presentation, go to your dashboard on the LevelUp website and open the 'My Courses' section. There you can view all the courses and workshops you’ve enrolled in, along with access details for each."
+ },
+ "howToParticipate": {
+ "title": "How do I join online classes?",
+ "content": "For online classes, your Skyroom username and password are displayed in the 'Online Account' section of your dashboard. You can use these credentials to join your class sessions directly through the Skyroom platform."
+ },
+ "competitionRules": {
+ "title": "Workshop and Course Rules",
+ "content": "Please check each course’s schedule before attending. Participants are expected to join sessions on time, whether in-person or online. Sharing login credentials or class links with others is not allowed. If you face any issues accessing a session, please contact event support."
+ }
+ },
+ "buttons": {
+ "staffs": "Our Team",
+ "learnMore": "Learn More",
+ "watchNow": "Watch Now",
+ "registerNow": "Register Now"
+ }
+ },
+ "button": {
+ "submit": "Submit",
+ "logout": "Logout",
+ "login": "Login",
+ "signup": "Sign Up",
+ "cancel": "Cancel",
+ "events": "Events",
+ "teamStatus": "Teams Status",
+ "games": "Games",
+ "shoppingBag": "Shopping Cart",
+ "staffs": "Our Team",
+ "backToHome": "Back to Home",
+ "sendResetLink": "Send Reset Link",
+ "backToLogin": "Back to Login"
+ },
+ "error": {
+ "404": "Page Not Found",
+ "500": "Internal Server Error"
+ },
+ "workshop": {
+ "loginToContinue": "Login to continue",
+ "workshops": "Workshops",
+ "presentations": "Presentations",
+ "competitions": "Competitions",
+ "price": "Price",
+ "per_member": "Per Each Member",
+ "description": "Description",
+ "schedule": "Schedule",
+ "location": "Location",
+ "inPerson": "In Person",
+ "online": "Online",
+ "addToCart": "Add to Cart",
+ "removeFromCart": "Remove from Cart",
+ "enroll": "Enroll",
+ "presenters": "Presenters",
+ "unknownPresenter": "Unknown Presenter",
+ "noPresenters": "No presenters",
+ "andMore": "and {count} more",
+ "onlineWorkshops": "Online Workshops",
+ "onlineTalks": "Online Talks",
+ "onlineLink": "Presentation Link",
+ "offlineWorkshops": "In-Person Workshops",
+ "free": "Free",
+ "error": "Failed to load workshops",
+ "noWorkshops": "No workshops available",
+ "noOnlineWorkshops": "No online workshops are currently available",
+ "noOfflineWorkshops": "No in-person workshops are currently available",
+ "viewDetails": "View Details",
+ "capacity": "Total Capacity",
+ "teamsCapacity": "Teams Total Capacity",
+ "remainingCapacity": "Remaining",
+ "teamSizes": "Team Sizes",
+ "requirements": "Requirements",
+ "type": {
+ "course": "Course",
+ "talk": "Talk",
+ "workshop": "Workshop"
+ },
+ "level": {
+ "beginner": "Beginner",
+ "intermediate": "Intermediate",
+ "advanced": "Advanced"
+ }
+ },
+ "common": {
+ "currency": "Toman",
+ "retry": "Retry",
+ "close": "Close"
+ },
+ "notFound": {
+ "title": "Oops! Page Not Found",
+ "description": "It looks like the page you're looking for doesn't exist. Mario couldn't find it in any of the castle levels!",
+ "goHome": "Go Home",
+ "goBack": "Go Back"
+ }
+}
diff --git a/apps/level_up/messages/fa.json b/apps/level_up/messages/fa.json
new file mode 100644
index 00000000..929063e1
--- /dev/null
+++ b/apps/level_up/messages/fa.json
@@ -0,0 +1,263 @@
+{
+ "app": {
+ "name": "لول آپ",
+ "logo": {
+ "game": "لول",
+ "craft": "آپ"
+ },
+ "mainNavigation": {
+ "home": "خانه",
+ "news": "اخبار",
+ "faq": "سوالات متداول",
+ "staffs": "تیم ما",
+ "gallery": "گالری",
+ "sponsors": "حامیان",
+ "dashboard": "داشبورد"
+ },
+ "staffs": {
+ "title": "تیم ما",
+ "organizingTeam": {
+ "title": "تیم برگزاری"
+ },
+ "technicalTeam": {
+ "title": "تیم فنی"
+ },
+ "scientificTeam": {
+ "title": "تیم علمی"
+ },
+ "marketingTeam": {
+ "title": "تیم بازاریابی"
+ },
+ "contentCreationTeam": {
+ "title": "تیم تولید محتوا"
+ },
+ "graphicTeam": {
+ "title": "تیم طراحی گرافیک"
+ },
+ "financeTeam": {
+ "title": "تیم مالی"
+ },
+ "operationsTeam": {
+ "title": "تیم اجرایی"
+ },
+ "decorationTeam": {
+ "title": "تیم تزئینات"
+ }
+ },
+ "sponsors": {
+ "title": "حامیان",
+ "noSponsors": "هنوز حامیای وجود ندارد",
+ "visitWebsite": "مشاهده وبسایت",
+ "Liara": {
+ "name": "Liara",
+ "description": "ما کارهای پیچیده\u200Cی راه\u200Cاندازی و تنظیمات سرورها را انجام داده\u200Cایم تا شما فقط با آپلود سورس\u200Cکد برنامه\u200Cی خود، آن را به\u200Cسادگی روی سرور اجرا کنید."
+ }
+ },
+ "dashboard": {
+ "event": "رویدادها",
+ "events": {
+ "title": "رویدادها و کارگاهها",
+ "competitions": "مسابقات من",
+ "workshops": "کارگاههای من",
+ "talks": "ارائههای من",
+ "loading": "در حال بارگذاری...",
+ "empty": "شما در هیچ رویدادی ثبتنام نکردهاید",
+ "emptyDescription": "برای مشاهده رویدادهای موجود و ثبتنام، به بخش مربوطه مراجعه کنید"
+ },
+ "teamStatus": {
+ "label": "وضعیت تیم ها",
+ "teamName": "نام تیم",
+ "teamMembers": "افراد تیم",
+ "addTeammate": "افزودن هم تیمی",
+ "noTeams": "تاکنون در هیچ مسابقه ای ثبت نام نکرده اید",
+ "noTeamsDescription": "شما هنوز تیم فعالی که در مسابقه شرکت کرده باشد ندارید"
+ },
+ "games": {
+ "label": "بازیها",
+ "upload": "آپلود",
+ "gameName": "نام بازی",
+ "gameLink": "لینک بازی",
+ "gameDescription": "توضیحات بازی",
+ "submitGame": "ثبت بازی",
+ "preview": "پیشنمایش",
+ "download": "دانلود"
+ },
+ "profile": {
+ "label": "پروفایل",
+ "profileImage": "تصویر پروفایل",
+ "firstName": "نام",
+ "lastName": "نام خانوادگی",
+ "email": "ایمیل",
+ "phoneNumber": "شماره تلفن",
+ "updateProfile": "بروزرسانی پروفایل",
+ "uploadImage": "آپلود تصویر",
+ "changeImage": "تغییر تصویر",
+ "emailLocked": "ایمیل قابل تغییر نیست",
+ "personalInformation": "اطلاعات شخصی",
+ "profilePicture": "تصویر پروفایل",
+ "saveChanges": "ذخیره تغییرات",
+ "cancel": "لغو",
+ "profileUpdated": "پروفایل با موفقیت بروزرسانی شد",
+ "invalidImage": "لطفاً یک فایل تصویر معتبر آپلود کنید",
+ "maxFileSize": "حجم فایل نباید از ۵ مگابایت بیشتر باشد"
+ },
+ "shoppingBag": "سبد خرید",
+ "onlineAccount": {
+ "label": "اکانت آنلاین",
+ "skyroom": "اکانت اسکای روم",
+ "description": "از این اکانت جهت شرکت در ارائه هایی که در بستر اسکای روم تشکیل می شوند استفاده نمایید.",
+ "username": "نام کاربری",
+ "password": "رمز عبور"
+ }
+ },
+ "pages": {
+ "main": "لول آپ",
+ "home": "خانه",
+ "dashboard": "داشبورد",
+ "notFound": "صفحه یافت نشد",
+ "login": "ورود",
+ "signUp": "ثبتنام",
+ "forgotPassword": "فراموشی رمز عبور"
+ },
+ "auth": {
+ "login": "ورود",
+ "signUp": "ثبتنام",
+ "logout": "خروج",
+ "register": "ثبتنام",
+ "email": "ایمیل",
+ "password": "رمز عبور",
+ "displayName": "نام نمایشی",
+ "phoneNumber": "شماره تلفن",
+ "forgotPassword": "رمز عبور خود را فراموش کردهاید؟",
+ "doNotHaveAccount": "حساب کاربری ندارید؟",
+ "alreadyHaveAccount": "حساب کاربری دارید؟",
+ "resetPassword": "بازیابی رمز عبور",
+ "resetPasswordInstructions": "آدرس ایمیل خود را وارد کنید تا دستورالعملهای بازیابی رمز عبور را برای شما ارسال کنیم.",
+ "sendResetLink": "ارسال لینک بازیابی",
+ "backToLogin": "بازگشت به صفحه ورود",
+ "resetLinkSent": "لینک بازیابی به ایمیل شما ارسال شد",
+ "resetLinkError": "ارسال لینک بازیابی با مشکل مواجه شد. لطفاً دوباره تلاش کنید.",
+ "loginWithSSC": "ورود با SSC",
+ "loginWithEmail": "ورود با ایمیل",
+ "or": "یا",
+ "invalidCredentials": "ایمیل یا رمز عبور نادرست است",
+ "loginSuccessful": "ورود موفقیتآمیز! در حال انتقال...",
+ "loginFailed": "ورود ناموفق بود. لطفاً دوباره تلاش کنید.",
+ "ssoLoginFailed": "ورود SSO ناموفق بود. لطفاً دوباره تلاش کنید."
+ },
+ "intro": {
+ "title": "لولآپ",
+ "subtitle": "آموزش در لول\u200Cآپ امیرکبیر",
+ "description": "لولآپ رویدادی آموزشی است که با هدف ارتقای مهارتها و توانمندسازی دانشجویان و علاقهمندان از طریق یادگیری عملی و کار تیمی برگزار میشود. این رویداد با میزبانی دانشگاه صنعتی امیرکبیر، شامل مجموعهای از دورهها، کارگاهها و مسابقات در زمینههای خلاقیت، فناوری و نوآوری است. شرکتکنندگان در لولآپ فرصت دارند از تجربیات منتورهای حرفهای بهرهمند شوند، مهارتهای خود را در فضای واقعی به کار بگیرند و در رقابتهای هیجانانگیز استعدادهایشان را به نمایش بگذارند؛ در محیطی پویا، الهامبخش و پرانرژی."
+ },
+ "aboutUs": {
+ "title": "درباره ما",
+ "description": "انجمن علمی دانشکده کامپیوتر امیرکبیر، نهادی مستقل در جهت انجام فعالیتهای علمی و آموزشی است. هر ساله رویدادهای علمی و آموزشی متعددی توسط انجمن علمی در سطح دانشگاهی، کشوری و بینالمللی برگزار شده و مخاطبان بسیاری را به خود جذب میکند. از میان این رویدادها میتوان به مسابقات ACM، جشنواره لینوکس، مسابقات دادهکاوی DMC و سمینارهای هوش مصنوعی AAISS اشاره کرد.\nیکی از رویکردهای مهم انجمن علمی دانشکده، تقویت روحیه کار تیمی و در مقیاس بزرگ است؛ به طوری که دانشجویان دخیل در رویدادها با کسب این تجربه، زندگی شغلی مؤثرتری داشته باشند. این رویداد نیز مستثنی نبوده و بسیاری از دانشجویان در این مسیر، انجمن علمی را همراهی کردهاند."
+ },
+ "buttons": {
+ "staffs": "با تیم ما آشنا شوید",
+ "learnMore": "اطلاعات بیشتر",
+ "watchNow": "همین حالا ببینید",
+ "registerNow": "همین حالا ثبت نام کنید"
+ },
+ "footer": {
+ "autGameCraft": "لول آپ امیرکبیر",
+ "copyRight": "لول آپ ۱۴۰۴ - تمام حقوق محفوظ است ©"
+ },
+ "faq": {
+ "title": "سوالات متداول",
+ "competitionConditions": "شرایط شرکت در دورهها و ارائهها",
+ "competitionParticipate": {
+ "title": "چگونه در دورهها و کارگاهها شرکت کنیم؟",
+ "content": "برای شرکت در دورهها و کارگاههای لولآپ کافی است به وبسایت levelup.ceit-ssc.ir مراجعه کنید، دوره یا کارگاه مورد نظر خود را از بین گزینههای موجود انتخاب کرده و هزینه آن را پرداخت نمایید. پس از پرداخت، دوره در بخش «دورههای خریداریشده» داشبورد شما قابل مشاهده خواهد بود."
+ },
+ "teamsConditions": {
+ "title": "چگونه به دورههای خریداریشده دسترسی پیدا کنم؟",
+ "content": "پس از خرید هر دوره یا ارائه، میتوانید از طریق داشبورد کاربری خود در سایت لولآپ به بخش «دورههای من» مراجعه کنید. در آنجا تمام دورهها و کارگاههایی که ثبتنام کردهاید نمایش داده میشود و لینک یا اطلاعات دسترسی به هرکدام در دسترس خواهد بود."
+ },
+ "howToParticipate": {
+ "title": "چگونه وارد کلاسهای آنلاین شوم؟",
+ "content": "برای کلاسهای آنلاین، اطلاعات ورود شما (نام کاربری و رمز عبور) در بخش «حساب آنلاین» داشبورد نمایش داده میشود. کلاسها از طریق پلتفرم اسکایروم برگزار میشوند و میتوانید با استفاده از اطلاعات موجود مستقیماً وارد کلاس شوید."
+ },
+ "competitionRules": {
+ "title": "قوانین حضور در دورهها و کارگاهها",
+ "content": "لطفاً پیش از شروع دورهها زمانبندی جلسات را در صفحه هر دوره بررسی کنید. شرکتکنندگان باید در زمان مقرر در کلاسهای حضوری یا آنلاین حضور داشته باشند. اشتراکگذاری لینک یا اطلاعات ورود برای سایر افراد مجاز نیست. در صورت بروز مشکل در ورود، با پشتیبانی انجمن علمی تماس بگیرید."
+ }
+ }
+ },
+ "button": {
+ "submit": "ثبت",
+ "logout": "خروج",
+ "login": "ورود",
+ "signup": "ثبتنام",
+ "cancel": "لغو",
+ "events": "رویدادها",
+ "teamStatus": "وضعیت تیم ها",
+ "games": "بازیها",
+ "shoppingBag": "سبد خرید",
+ "staffs": "تیم ما",
+ "backToHome": "بازگشت به خانه",
+ "sendResetLink": "ارسال لینک بازیابی",
+ "backToLogin": "بازگشت به صفحه ورود"
+ },
+ "error": {
+ "404": "صفحه یافت نشد",
+ "500": "خطای سرور داخلی"
+ },
+ "workshop": {
+ "loginToContinue": "ابتدا وارد شوید",
+ "competitions": "مسابقه ها",
+ "workshops": "کارگاه ها",
+ "presentations": "ارائه ها",
+ "price": "قیمت",
+ "per_member": "هر عضو",
+ "description": "توضیحات",
+ "schedule": "زمان برگزاری",
+ "location": "مکان",
+ "inPerson": "حضوری",
+ "online": "آنلاین",
+ "addToCart": "اضافه به سبد خرید",
+ "removeFromCart": "حذف از سبد خرید",
+ "enroll": "ثبت نام",
+ "presenters": "ارائه دهندگان",
+ "unknownPresenter": "ارائهدهنده نامشخص",
+ "noPresenters": "بدون ارائهدهنده",
+ "andMore": "و {count} نفر دیگر",
+ "onlineWorkshops": "کارگاههای آنلاین",
+ "onlineTalks": "ارائه های آنلاین",
+ "onlineLink": "لینک ارائه",
+ "offlineWorkshops": "کارگاههای حضوری",
+ "free": "رایگان",
+ "error": "خطا در بارگذاری کارگاهها",
+ "noWorkshops": "کارگاهی موجود نیست",
+ "noOnlineWorkshops": "در حال حاضر هیچ کارگاه آنلاینی موجود نیست",
+ "noOfflineWorkshops": "در حال حاضر هیچ کارگاه حضوری موجود نیست",
+ "viewDetails": "جزئیات بیشتر",
+ "capacity": "ظرفیت کل",
+ "teamsCapacity": "ظرفیت کل تیم ها",
+ "remainingCapacity": "باقی مانده",
+ "teamSizes": "اندازه تیم ها",
+ "requirements": "پیش نیاز ها",
+ "type": {
+ "course": "دوره",
+ "talk": "سخنرانی",
+ "workshop": "کارگاه"
+ },
+ "level": {
+ "beginner": "مبتدی",
+ "intermediate": "متوسط",
+ "advanced": "پیشرفته"
+ }
+ },
+ "common": {
+ "currency": "تومان",
+ "retry": "تلاش دوباره",
+ "close": "بستن"
+ },
+ "notFound": {
+ "title": "اوپس! صفحه پیدا نشد",
+ "description": "به نظر میرسد صفحهای که به دنبال آن هستید وجود ندارد.",
+ "goHome": "بازگشت به خانه",
+ "goBack": "بازگشت"
+ }
+}
diff --git a/apps/level_up/middleware.ts b/apps/level_up/middleware.ts
new file mode 100644
index 00000000..b926a15f
--- /dev/null
+++ b/apps/level_up/middleware.ts
@@ -0,0 +1,41 @@
+import { withAuth } from "next-auth/middleware";
+import createMiddleware from "next-intl/middleware";
+import { routing } from "./lib/routing";
+
+const intlMiddleware = createMiddleware(routing);
+
+// Protected routes that require authentication
+const protectedRoutes = ["/dashboard", "/profile", "/admin"];
+
+function isProtectedRoute(pathname: string) {
+ const pathWithoutLocale = pathname.replace(/^\/(fa|en)/, "") || "/";
+ return protectedRoutes.some((route) => pathWithoutLocale.startsWith(route));
+}
+
+export default withAuth(
+ function middleware(req) {
+ return intlMiddleware(req);
+ },
+ {
+ callbacks: {
+ authorized: ({ token, req }) => {
+ const { pathname } = req.nextUrl;
+
+ if (!isProtectedRoute(pathname)) {
+ return true;
+ }
+
+ return !!token;
+ },
+ },
+ pages: {
+ signIn: "/fa/",
+ },
+ }
+);
+
+export const config = {
+ matcher: [
+ "/((?!api|_next/static|_next/image|favicon.ico|images|sound|assets|public|svg|.*\\.cur|.*\\.lottie|.*\\.svg|.*\\.png|.*\\.jpg|.*\\.jpeg|.*\\.gif|.*\\.webp|.*\\.ico|.*\\.css|.*\\.js|.*\\.woff|.*\\.woff2|.*\\.ttf|.*\\.otf|not-found|error).*)",
+ ],
+};
diff --git a/apps/level_up/next.config.ts b/apps/level_up/next.config.ts
new file mode 100644
index 00000000..3f187f34
--- /dev/null
+++ b/apps/level_up/next.config.ts
@@ -0,0 +1,24 @@
+import createNextIntlPlugin from "next-intl/plugin";
+import type { NextConfig } from "next";
+
+const withNextIntl = createNextIntlPlugin("./lib/i18n.ts");
+const withBundleAnalyzer = require("@next/bundle-analyzer")({
+ enabled: process.env.ANALYZE === "true",
+});
+
+const nextConfig: NextConfig = {
+ env: {
+ GAME_CRAFT_SSC_EVENT_ID: process.env.GAME_CRAFT_SSC_EVENT_ID,
+ },
+ transpilePackages: ["@ssc/ui", "@ssc/utils", "@ssc/core"],
+ modularizeImports: {
+ antd: {
+ transform: "antd/lib/{{member}}",
+ },
+ },
+ images: {
+ domains: ["api.ceit-ssc.ir"],
+ },
+};
+
+export default withBundleAnalyzer(withNextIntl(nextConfig));
diff --git a/apps/level_up/package.json b/apps/level_up/package.json
new file mode 100644
index 00000000..83b51852
--- /dev/null
+++ b/apps/level_up/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "@ssc/level_up",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "next build",
+ "dev": "next dev",
+ "lint": "next lint",
+ "start": "NEXT_DEBUG=true next start",
+ "type-check": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@ant-design/icons": "^6.0.0",
+ "@ant-design/nextjs-registry": "^1.1.0",
+ "@ant-design/v5-patch-for-react-19": "^1.0.3",
+ "@bprogress/next": "^3.2.12",
+ "@lottiefiles/dotlottie-react": "^0.15.2",
+ "@reduxjs/toolkit": "^2.9.0",
+ "@ssc/core": "workspace:*",
+ "@ssc/ui": "workspace:*",
+ "@ssc/utils": "workspace:*",
+ "antd": "^5.27.1",
+ "axios": "^1.11.0",
+ "clsx": "^2.1.1",
+ "howler": "^2.2.4",
+ "next": "^15.5.2",
+ "next-auth": "^4.24.11",
+ "next-intl": "^3.26.5",
+ "next-themes": "^0.4.6",
+ "react": "^19.1.1",
+ "react-dom": "^19.1.1",
+ "react-icons": "^5.5.0",
+ "react-lottie": "^1.2.10",
+ "react-redux": "^9.2.0",
+ "react-responsive": "^10.0.1",
+ "react-toastify": "^11.0.5"
+ },
+ "devDependencies": {
+ "@next/bundle-analyzer": "^15.5.2",
+ "@ssc/tailwind-config": "workspace:*",
+ "@types/node": "^22.18.0",
+ "@types/react": "^19.1.12",
+ "@types/react-dom": "^19.1.9",
+ "autoprefixer": "^10.4.21",
+ "postcss": "^8.5.6",
+ "tailwindcss": "^3.4.17",
+ "typescript": "^5.9.2"
+ }
+}
diff --git a/apps/level_up/postcss.config.js b/apps/level_up/postcss.config.js
new file mode 100644
index 00000000..2aa7205d
--- /dev/null
+++ b/apps/level_up/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/apps/level_up/public/assets/images/3d-dark.png b/apps/level_up/public/assets/images/3d-dark.png
new file mode 100644
index 00000000..2202ab63
Binary files /dev/null and b/apps/level_up/public/assets/images/3d-dark.png differ
diff --git a/apps/level_up/public/assets/images/Asset 4.png b/apps/level_up/public/assets/images/Asset 4.png
new file mode 100644
index 00000000..75793b58
Binary files /dev/null and b/apps/level_up/public/assets/images/Asset 4.png differ
diff --git a/apps/level_up/public/assets/images/Asset4.png b/apps/level_up/public/assets/images/Asset4.png
new file mode 100644
index 00000000..75793b58
Binary files /dev/null and b/apps/level_up/public/assets/images/Asset4.png differ
diff --git a/apps/level_up/public/assets/images/IranServer.png b/apps/level_up/public/assets/images/IranServer.png
new file mode 100644
index 00000000..de64c1ab
Binary files /dev/null and b/apps/level_up/public/assets/images/IranServer.png differ
diff --git a/apps/level_up/public/assets/images/avngames.png b/apps/level_up/public/assets/images/avngames.png
new file mode 100644
index 00000000..803254e8
Binary files /dev/null and b/apps/level_up/public/assets/images/avngames.png differ
diff --git a/apps/level_up/public/assets/images/black-cube.png b/apps/level_up/public/assets/images/black-cube.png
new file mode 100644
index 00000000..73431575
Binary files /dev/null and b/apps/level_up/public/assets/images/black-cube.png differ
diff --git a/apps/level_up/public/assets/images/brainladder.png b/apps/level_up/public/assets/images/brainladder.png
new file mode 100644
index 00000000..b0b7a607
Binary files /dev/null and b/apps/level_up/public/assets/images/brainladder.png differ
diff --git a/apps/level_up/public/assets/images/crown.png b/apps/level_up/public/assets/images/crown.png
new file mode 100644
index 00000000..c11b449f
Binary files /dev/null and b/apps/level_up/public/assets/images/crown.png differ
diff --git a/apps/level_up/public/assets/images/dark-3d.png b/apps/level_up/public/assets/images/dark-3d.png
new file mode 100644
index 00000000..b0ace205
Binary files /dev/null and b/apps/level_up/public/assets/images/dark-3d.png differ
diff --git a/apps/level_up/public/assets/images/default_prof.jpg b/apps/level_up/public/assets/images/default_prof.jpg
new file mode 100644
index 00000000..3adfd6db
Binary files /dev/null and b/apps/level_up/public/assets/images/default_prof.jpg differ
diff --git a/apps/level_up/public/assets/images/dream-event.png b/apps/level_up/public/assets/images/dream-event.png
new file mode 100644
index 00000000..768683b2
Binary files /dev/null and b/apps/level_up/public/assets/images/dream-event.png differ
diff --git a/apps/level_up/public/assets/images/dropout.png b/apps/level_up/public/assets/images/dropout.png
new file mode 100644
index 00000000..e567a9c7
Binary files /dev/null and b/apps/level_up/public/assets/images/dropout.png differ
diff --git a/apps/level_up/public/assets/images/folan.png b/apps/level_up/public/assets/images/folan.png
new file mode 100644
index 00000000..841caefc
Binary files /dev/null and b/apps/level_up/public/assets/images/folan.png differ
diff --git a/apps/level_up/public/assets/images/folan4.png b/apps/level_up/public/assets/images/folan4.png
new file mode 100644
index 00000000..9884c494
Binary files /dev/null and b/apps/level_up/public/assets/images/folan4.png differ
diff --git a/apps/level_up/public/assets/images/folan_2.png b/apps/level_up/public/assets/images/folan_2.png
new file mode 100644
index 00000000..de75a863
Binary files /dev/null and b/apps/level_up/public/assets/images/folan_2.png differ
diff --git a/apps/level_up/public/assets/images/funtory.png b/apps/level_up/public/assets/images/funtory.png
new file mode 100644
index 00000000..3ee5c026
Binary files /dev/null and b/apps/level_up/public/assets/images/funtory.png differ
diff --git a/apps/level_up/public/assets/images/gameTestImage.jpg b/apps/level_up/public/assets/images/gameTestImage.jpg
new file mode 100644
index 00000000..6d081bfd
Binary files /dev/null and b/apps/level_up/public/assets/images/gameTestImage.jpg differ
diff --git a/apps/level_up/public/assets/images/hayahool.png b/apps/level_up/public/assets/images/hayahool.png
new file mode 100644
index 00000000..b4407329
Binary files /dev/null and b/apps/level_up/public/assets/images/hayahool.png differ
diff --git a/apps/level_up/public/assets/images/institue.png b/apps/level_up/public/assets/images/institue.png
new file mode 100644
index 00000000..48e0bfe4
Binary files /dev/null and b/apps/level_up/public/assets/images/institue.png differ
diff --git a/apps/level_up/public/assets/images/medrick-logo.png b/apps/level_up/public/assets/images/medrick-logo.png
new file mode 100644
index 00000000..71f4dcc9
Binary files /dev/null and b/apps/level_up/public/assets/images/medrick-logo.png differ
diff --git a/apps/level_up/public/assets/images/myket.png b/apps/level_up/public/assets/images/myket.png
new file mode 100644
index 00000000..12d1b09e
Binary files /dev/null and b/apps/level_up/public/assets/images/myket.png differ
diff --git a/apps/level_up/public/assets/images/pattern.png b/apps/level_up/public/assets/images/pattern.png
new file mode 100644
index 00000000..d0735baa
Binary files /dev/null and b/apps/level_up/public/assets/images/pattern.png differ
diff --git a/apps/level_up/public/assets/images/pgj.png b/apps/level_up/public/assets/images/pgj.png
new file mode 100644
index 00000000..1c4b02c8
Binary files /dev/null and b/apps/level_up/public/assets/images/pgj.png differ
diff --git a/apps/level_up/public/assets/images/quiz of kings.png b/apps/level_up/public/assets/images/quiz of kings.png
new file mode 100644
index 00000000..e5744736
Binary files /dev/null and b/apps/level_up/public/assets/images/quiz of kings.png differ
diff --git a/apps/level_up/public/assets/images/sponsors/asiatech.png b/apps/level_up/public/assets/images/sponsors/asiatech.png
new file mode 100644
index 00000000..1be5039d
Binary files /dev/null and b/apps/level_up/public/assets/images/sponsors/asiatech.png differ
diff --git a/apps/level_up/public/assets/images/sponsors/black-cube.png b/apps/level_up/public/assets/images/sponsors/black-cube.png
new file mode 100644
index 00000000..73431575
Binary files /dev/null and b/apps/level_up/public/assets/images/sponsors/black-cube.png differ
diff --git a/apps/level_up/public/assets/images/sponsors/incytelGames.png b/apps/level_up/public/assets/images/sponsors/incytelGames.png
new file mode 100644
index 00000000..909d734b
Binary files /dev/null and b/apps/level_up/public/assets/images/sponsors/incytelGames.png differ
diff --git a/apps/level_up/public/assets/images/sponsors/liara.png b/apps/level_up/public/assets/images/sponsors/liara.png
new file mode 100644
index 00000000..fa89ab9d
Binary files /dev/null and b/apps/level_up/public/assets/images/sponsors/liara.png differ
diff --git a/apps/level_up/public/assets/images/sponsors/pgj.png b/apps/level_up/public/assets/images/sponsors/pgj.png
new file mode 100644
index 00000000..54d3aadb
Binary files /dev/null and b/apps/level_up/public/assets/images/sponsors/pgj.png differ
diff --git a/apps/level_up/public/assets/images/sponsors/snappfood.png b/apps/level_up/public/assets/images/sponsors/snappfood.png
new file mode 100644
index 00000000..dc08a8a7
Binary files /dev/null and b/apps/level_up/public/assets/images/sponsors/snappfood.png differ
diff --git a/apps/level_up/public/assets/images/sponsors/yektanet.png b/apps/level_up/public/assets/images/sponsors/yektanet.png
new file mode 100644
index 00000000..813b604a
Binary files /dev/null and b/apps/level_up/public/assets/images/sponsors/yektanet.png differ
diff --git a/apps/level_up/public/assets/images/ssc_white.png b/apps/level_up/public/assets/images/ssc_white.png
new file mode 100644
index 00000000..3dfaeeb7
Binary files /dev/null and b/apps/level_up/public/assets/images/ssc_white.png differ
diff --git a/apps/level_up/public/assets/images/tod.png b/apps/level_up/public/assets/images/tod.png
new file mode 100644
index 00000000..17b14491
Binary files /dev/null and b/apps/level_up/public/assets/images/tod.png differ
diff --git a/apps/level_up/public/assets/svg/bubble-light-purple.svg b/apps/level_up/public/assets/svg/bubble-light-purple.svg
new file mode 100644
index 00000000..8ddca33e
--- /dev/null
+++ b/apps/level_up/public/assets/svg/bubble-light-purple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/level_up/public/assets/svg/bubble-purple.svg b/apps/level_up/public/assets/svg/bubble-purple.svg
new file mode 100644
index 00000000..b3937652
--- /dev/null
+++ b/apps/level_up/public/assets/svg/bubble-purple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/level_up/public/assets/svg/dark-3d-bulb.svg b/apps/level_up/public/assets/svg/dark-3d-bulb.svg
new file mode 100644
index 00000000..db7a00fa
--- /dev/null
+++ b/apps/level_up/public/assets/svg/dark-3d-bulb.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/level_up/public/assets/svg/dark-3d.svg b/apps/level_up/public/assets/svg/dark-3d.svg
new file mode 100644
index 00000000..b3bfd8ae
--- /dev/null
+++ b/apps/level_up/public/assets/svg/dark-3d.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/assets/svg/prize-1.svg b/apps/level_up/public/assets/svg/prize-1.svg
new file mode 100644
index 00000000..480a6bf5
--- /dev/null
+++ b/apps/level_up/public/assets/svg/prize-1.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/assets/svg/prize-2.svg b/apps/level_up/public/assets/svg/prize-2.svg
new file mode 100644
index 00000000..fc63de5a
--- /dev/null
+++ b/apps/level_up/public/assets/svg/prize-2.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/assets/svg/prize-3.svg b/apps/level_up/public/assets/svg/prize-3.svg
new file mode 100644
index 00000000..32c2851d
--- /dev/null
+++ b/apps/level_up/public/assets/svg/prize-3.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/cursor/cursor.cur b/apps/level_up/public/cursor/cursor.cur
new file mode 100644
index 00000000..bd385847
Binary files /dev/null and b/apps/level_up/public/cursor/cursor.cur differ
diff --git a/apps/level_up/public/cursor/pointer.cur b/apps/level_up/public/cursor/pointer.cur
new file mode 100644
index 00000000..adf86105
Binary files /dev/null and b/apps/level_up/public/cursor/pointer.cur differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/Estedad-sample.png b/apps/level_up/public/fonts/Estedad-v7.3/Estedad-sample.png
new file mode 100644
index 00000000..c168eaf3
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/Estedad-sample.png differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/Variable/Estedad-FD[KSHD,wght].ttf b/apps/level_up/public/fonts/Estedad-v7.3/Variable/Estedad-FD[KSHD,wght].ttf
new file mode 100644
index 00000000..526090f4
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/Variable/Estedad-FD[KSHD,wght].ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/Variable/Estedad[KSHD,wght].ttf b/apps/level_up/public/fonts/Estedad-v7.3/Variable/Estedad[KSHD,wght].ttf
new file mode 100644
index 00000000..0cd26cc3
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/Variable/Estedad[KSHD,wght].ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/estedad.css b/apps/level_up/public/fonts/Estedad-v7.3/estedad.css
new file mode 100644
index 00000000..12d17a6f
--- /dev/null
+++ b/apps/level_up/public/fonts/Estedad-v7.3/estedad.css
@@ -0,0 +1,62 @@
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 100;
+ src: url('webfonts/statics/Estedad-ExtraLight.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 200;
+ src: url('webfonts/statics/Estedad-Thin.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 300;
+ src: url('webfonts/statics/Estedad-Light.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 500;
+ src: url('webfonts/statics/Estedad-Medium.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 600;
+ src: url('webfonts/statics/Estedad-Regular.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 800;
+ src: url('webfonts/statics/Estedad-SemiBold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 900;
+ src: url('webfonts/statics/Estedad-Bold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 950;
+ src: url('webfonts/statics/Estedad-ExtraBold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Estedad';
+ font-style: normal;
+ font-weight: 1000;
+ src: url('webfonts/statics/Estedad-Black.woff2') format('woff2');
+}
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Black.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Black.ttf
new file mode 100644
index 00000000..0bbe6cec
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Black.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Bold.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Bold.ttf
new file mode 100644
index 00000000..934be8b3
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-ExtraBold.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-ExtraBold.ttf
new file mode 100644
index 00000000..6d69e10d
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-ExtraLight.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-ExtraLight.ttf
new file mode 100644
index 00000000..e9d87744
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Light.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Light.ttf
new file mode 100644
index 00000000..fd07ab8e
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Light.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Medium.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Medium.ttf
new file mode 100644
index 00000000..e0943157
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Regular.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Regular.ttf
new file mode 100644
index 00000000..5d6758c9
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-SemiBold.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-SemiBold.ttf
new file mode 100644
index 00000000..7ac69f1f
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Thin.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Thin.ttf
new file mode 100644
index 00000000..e917bca1
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/Estedad-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Black.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Black.ttf
new file mode 100644
index 00000000..d68b7a97
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Black.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Bold.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Bold.ttf
new file mode 100644
index 00000000..3e13688e
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-ExtraBold.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-ExtraBold.ttf
new file mode 100644
index 00000000..dead0d06
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-ExtraLight.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-ExtraLight.ttf
new file mode 100644
index 00000000..cd4955b2
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Light.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Light.ttf
new file mode 100644
index 00000000..004ec97a
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Light.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Medium.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Medium.ttf
new file mode 100644
index 00000000..7433882b
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Regular.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Regular.ttf
new file mode 100644
index 00000000..8f018e33
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-SemiBold.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-SemiBold.ttf
new file mode 100644
index 00000000..b1774c9f
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Thin.ttf b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Thin.ttf
new file mode 100644
index 00000000..77e008dc
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/ttf/FD/Estedad-FD-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Black.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Black.woff2
new file mode 100644
index 00000000..41d73ab3
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Bold.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Bold.woff2
new file mode 100644
index 00000000..f902f872
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-ExtraBold.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-ExtraBold.woff2
new file mode 100644
index 00000000..2bd438a1
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-ExtraLight.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-ExtraLight.woff2
new file mode 100644
index 00000000..27404930
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Light.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Light.woff2
new file mode 100644
index 00000000..ba2ff999
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Medium.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Medium.woff2
new file mode 100644
index 00000000..b023e050
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Regular.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Regular.woff2
new file mode 100644
index 00000000..0a77dfc2
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-SemiBold.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-SemiBold.woff2
new file mode 100644
index 00000000..433f5405
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Thin.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Thin.woff2
new file mode 100644
index 00000000..cf82ee10
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/Estedad-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Black.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Black.woff2
new file mode 100644
index 00000000..94f458f1
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Bold.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Bold.woff2
new file mode 100644
index 00000000..0302c641
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-ExtraBold.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-ExtraBold.woff2
new file mode 100644
index 00000000..0be62c64
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-ExtraLight.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-ExtraLight.woff2
new file mode 100644
index 00000000..e9bfb701
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Light.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Light.woff2
new file mode 100644
index 00000000..c1312c81
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Medium.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Medium.woff2
new file mode 100644
index 00000000..fb71ca06
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Regular.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Regular.woff2
new file mode 100644
index 00000000..a027c0b5
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-SemiBold.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-SemiBold.woff2
new file mode 100644
index 00000000..2fa813eb
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Thin.woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Thin.woff2
new file mode 100644
index 00000000..a24463e2
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/statics/FD/Estedad-FD-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/variable/Estedad-FD[KSHD,wght].woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/variable/Estedad-FD[KSHD,wght].woff2
new file mode 100644
index 00000000..ec19d31c
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/variable/Estedad-FD[KSHD,wght].woff2 differ
diff --git a/apps/level_up/public/fonts/Estedad-v7.3/webfonts/variable/Estedad[KSHD,wght].woff2 b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/variable/Estedad[KSHD,wght].woff2
new file mode 100644
index 00000000..62aa8925
Binary files /dev/null and b/apps/level_up/public/fonts/Estedad-v7.3/webfonts/variable/Estedad[KSHD,wght].woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/fontiran.css b/apps/level_up/public/fonts/IRANYekanX/fontiran.css
new file mode 100644
index 00000000..e03130dc
--- /dev/null
+++ b/apps/level_up/public/fonts/IRANYekanX/fontiran.css
@@ -0,0 +1,87 @@
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 100;
+ src: url('woff/IRANYekanX-Thin.woff') format('woff'),
+ url('woff2/IRANYekanX-Thin.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 200;
+ src: url('woff/IRANYekanX-UltraLight.woff') format('woff'),
+ url('woff2/IRANYekanX-UltraLight.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 300;
+ src: url('woff/IRANYekanX-Light.woff') format('woff'),
+ url('woff2/IRANYekanX-Light.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 500;
+ src: url('woff/IRANYekanX-Medium.woff') format('woff'),
+ url('woff2/IRANYekanX-Medium.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 600;
+ src: url('woff/IRANYekanX-DemiBold.woff') format('woff'),
+ url('woff2/IRANYekanX-DemiBold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 800;
+ src: url('woff/IRANYekanX-ExtraBold.woff') format('woff'),
+ url('woff2/IRANYekanX-ExtraBold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 900;
+ src: url('woff/IRANYekanX-Black.woff') format('woff'),
+ url('woff2/IRANYekanX-Black.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 950;
+ src: url('woff/IRANYekanX-ExtraBlack.woff') format('woff'),
+ url('woff2/IRANYekanX-ExtraBlack.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: 1000;
+ src: url('woff/IRANYekanX-Heavy.woff') format('woff'),
+ url('woff2/IRANYekanX-Heavy.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: bold;
+ src: url('woff/IRANYekanX-Bold.woff') format('woff'),
+ url('woff2/IRANYekanX-Bold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'IRANYekanX';
+ font-style: normal;
+ font-weight: normal;
+ src: url('woff/IRANYekanX-Regular.woff') format('woff'),
+ url('woff2/IRANYekanX-Regular.woff2') format('woff2');
+}
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Black.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Black.woff
new file mode 100644
index 00000000..595fa18e
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Black.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Bold.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Bold.woff
new file mode 100644
index 00000000..c5f285fe
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Bold.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-DemiBold.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-DemiBold.woff
new file mode 100644
index 00000000..9af6375a
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-DemiBold.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-ExtraBlack.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-ExtraBlack.woff
new file mode 100644
index 00000000..99cc6551
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-ExtraBlack.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-ExtraBold.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-ExtraBold.woff
new file mode 100644
index 00000000..6087a521
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-ExtraBold.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Heavy.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Heavy.woff
new file mode 100644
index 00000000..bdc053eb
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Heavy.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Light.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Light.woff
new file mode 100644
index 00000000..0477cd5a
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Light.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Medium.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Medium.woff
new file mode 100644
index 00000000..f8013a37
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Medium.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Regular.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Regular.woff
new file mode 100644
index 00000000..e3d92006
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Regular.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Thin.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Thin.woff
new file mode 100644
index 00000000..6041db14
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-Thin.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-UltraLight.woff b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-UltraLight.woff
new file mode 100644
index 00000000..c0433401
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff/IRANYekanX-UltraLight.woff differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Black.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Black.woff2
new file mode 100644
index 00000000..e67c520c
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Bold.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Bold.woff2
new file mode 100644
index 00000000..dd3fc162
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-DemiBold.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-DemiBold.woff2
new file mode 100644
index 00000000..f1f6750d
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-DemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-ExtraBlack.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-ExtraBlack.woff2
new file mode 100644
index 00000000..03a06821
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-ExtraBlack.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-ExtraBold.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-ExtraBold.woff2
new file mode 100644
index 00000000..c041d78e
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Heavy.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Heavy.woff2
new file mode 100644
index 00000000..ea163079
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Heavy.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Light.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Light.woff2
new file mode 100644
index 00000000..8d9534c1
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Medium.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Medium.woff2
new file mode 100644
index 00000000..cdb4ce09
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Regular.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Regular.woff2
new file mode 100644
index 00000000..89ae517f
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Thin.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Thin.woff2
new file mode 100644
index 00000000..c5a94098
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-UltraLight.woff2 b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-UltraLight.woff2
new file mode 100644
index 00000000..cb42c164
Binary files /dev/null and b/apps/level_up/public/fonts/IRANYekanX/woff2/IRANYekanX-UltraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/SF_Pro_Rounded/SF-Pro-Rounded-Regular.ttf b/apps/level_up/public/fonts/SF_Pro_Rounded/SF-Pro-Rounded-Regular.ttf
new file mode 100644
index 00000000..8514dfc7
Binary files /dev/null and b/apps/level_up/public/fonts/SF_Pro_Rounded/SF-Pro-Rounded-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/SF_Pro_Rounded/sfProRounded.css b/apps/level_up/public/fonts/SF_Pro_Rounded/sfProRounded.css
new file mode 100644
index 00000000..39bd8ca3
--- /dev/null
+++ b/apps/level_up/public/fonts/SF_Pro_Rounded/sfProRounded.css
@@ -0,0 +1,6 @@
+@font-face {
+ font-family: 'SF-Pro-Rounded';
+ font-style: normal;
+ font-weight: 100;
+ src: url('SF-Pro-Rounded-Regular.ttf') format('woff');
+}
\ No newline at end of file
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/AUTHORS.txt b/apps/level_up/public/fonts/vazirmatn-v33.003/AUTHORS.txt
new file mode 100644
index 00000000..6efd2e62
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/AUTHORS.txt
@@ -0,0 +1,9 @@
+# This is the official list of authors for copyright purposes.
+# This file is distinct from the CONTRIBUTORS files.
+# See the latter for an explanation.
+#
+# Names should be added to this file as:
+# Name or Organization
+# The email address is not required for organizations.
+
+Saber Rastikerdar
\ No newline at end of file
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/CHANGELOG.md b/apps/level_up/public/fonts/vazirmatn-v33.003/CHANGELOG.md
new file mode 100644
index 00000000..2523d7aa
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/CHANGELOG.md
@@ -0,0 +1,1512 @@
+# Vazirmatn Changelog
+
+## 33.003
+
+- Fixed wrong kerning for ژ ر with مـ تـ ثـ
+
+۱ تیر ۱۴۰۱
+
+- اصلاح کرنینگ اشتباه ژ ر با مـ تـ ثـ
+
+## 33.002
+
+- Added alternatives for یـ تـ پـ and related glyphs in connection with ـڕ ـړ ـږ ـڵ ـڭ ـڬ ـݢ ـٹـ ـۏ ـه ـة (#273)
+- Improved حـ ـحـ ـح ح ـڡـ ـڡ ـه ڪ ڡـ ڡ و ـو ٯ ـٯ
+- Improved ۵ in Thick
+
+۳۱ خرداد ۱۴۰۱
+
+- اضافه شدن جایگزینها برای «یـ تـ پـ» و گلیفهای مربوطه در اتصال با «ـڕ ـړ ـږ ـڵ ـڭ ـڬ ـݢ ـٹـ ـۏ ـه ـة» (#273)
+- بهبود حـ ـحـ ـح ح ـڡـ ـڡ ـه ڪ ڡـ ڡ و ـو ٯ ـٯ
+- بهبود ۵ در ضخیم
+
+## 33.001
+
+- Fixed wrong forms of letter ڽ (thanks @WanAhmadShahmi98) (#272)
+
+۲۰ خرداد ۱۴۰۱
+
+- رفع ایراد فرمهای حرف ڽ (با تشکر از @WanAhmadShahmi98) (#272)
+
+## 33.000
+
+- Added Jawi letters (thanks @WanAhmadShahmi98) (#262)
+- Added U+06C8 (ۈ) of Uyghur language (thanks @victorlee) (#270)
+- Fixed wrong interpolation of endofproof (thanks @ErwinDenissen) (#259)
+- Improved/Redesigned س سـ ـسـ ـس ٮ ٮـ ـٮـ ـٮ صـ ـصـ ی ـی ح ـح حـ ـحـ ک ع (#247)
+- Fixed dots in ـثـ (#265)
+- Fixed anchor location in عـ ع ـع ـعـ ـد (#263)
+- Fixed ڪ ـﮫ ھے ـیے ـپے
+- Improved kerning
+- Improved thickness in Thin
+- Improved/Fixed some other glyphs
+
+۲۰ خرداد ۱۴۰۱
+
+- اضافه شدن حروف جاوی مربوط به زبان مالایی (با تشکر از @WanAhmadShahmi98) (#262)
+- اضافه شدن گلیف U+06C8 (ۈ) از زبان اویغوری (با تشکر از @victorlee) (#270)
+- رفع ایراد درونیابی endofproof (با تشکر از @ErwinDenissen) (#259)
+- بهبود/بازطراحی س سـ ـسـ ـس ٮ ٮـ ـٮـ ـٮ صـ ـصـ ی ـی ح ـح حـ ـحـ ک ع (#247)
+- اصلاح نقاط در ـثـ (#265)
+- اصلاح مکان اعراب در عـ ع ـع ـعـ ـد (#263)
+- اصلاح ڪ ـﮫ ھے ـیے ـپے
+- بهبود کرنینگ
+- بهبود ضخامت در نازک
+- بهبود/اصلاح برخی دیگر از گلیفها
+
+## 32.102
+
+- Fixed bad rendering issue by removing the hinting totally
+- Fixed dots in ثـ in Variable (thanks @alimanian) (#252)
+- Improved ر ـر (#248)
+
+۱۳ فرورین ۱۴۰۱
+
+- رفع نمایش خراب گلیفها با حذف سراسری هینتینگ
+- رفع مشکل نقطهها در ثـ در وریبل (با تشکر از @alimanian) (#252)
+- بهبود ر ـر (#248)
+
+## 32.101
+
+- Fixed the lack of glyphs (ZWJ, ZWNJ) in the generated fonts (thanks @kokabi1365) #249
+
+۲۹ اسفند ۱۴۰۰
+
+- رفع نبود نیمفاصله در فونتهای تولید شده (با تشکر از @kokabi1365) #249
+
+## 32.1
+
+- Fixed collapsing numbers issue by removing kerning for Persian/Arabic numbers #244
+
+۲۲ اسفند ۱۴۰۰
+
+- رفع مشکل در هم فرو روفتن اعداد با حذف کرنینگ اعداد فارسی/عربی #244
+
+## 32.0.0
+
+- Renamed from Vazir to Vazirmatn
+- Increased the size of the glyphs (letters, signs and numbers)
+- Redesigned thick versions and applied contrast
+- Added Thin weight (recreating weights less than regular)
+- Changed spacing for all glyphs (increasing in heavy weights and decreasing in light weights)
+- Added Round-Dots version (Thanks @ghaznavipc) #127
+- Separated files by type (Thanks @xmha97) #190
+- Corrected the names of misc versions (Thanks @kokabi1365) #203
+- Fixed the problem of not showing dots in the UI version (Thanks @sepehr-brj) #194
+- Fixing Corning problem in Latin letters (Thanks @hamid0740) #218
+- Most letters shrinked
+- Improved س ص ن ي ك (Thanks @ulaima) #226
+- Fixed height issue in the UI version (با تشکر از @ulaima) #227
+- Fix the problem of Hamza (Thanks @X7md) #229
+- Designed + - − ÷ × symbols according to the size of Persian/Arabic letters and numbers
+- Resize "بـ یـ تـ پـ" and similar letters to fit next to other letters like "ـی ـق ـو ـر ..."
+- Improved thickness
+- Improved diacritics
+- Redesigned Arabic numerals ٥ ٤ ٦ and 9
+- Redesigned ۴ in Heavy
+- Redesigned ۲ ۳ ۷ ۸ ۵
+- Redesigned ی همزه ؟ ٌ ٚ ٛ
+- Changed kerning and spacing in number and fixed the problem of number spacing in style-set ss01
+- Redesigned Quranic brackets
+- Improved ـهـ ـلا لا ع عـ ـعـ ـع هـ ء ـه ك
+- Corrected ﷼
+- Shortened ک گ
+- Improved رزژـرـزـژ
+- Improved . ! ؛ ، ٬ ۰ ممیز : « »
+- Improved آ ص ط
+- Improved the kerning of «آ ر ز ژ ـر ـز ـژ» with other letters
+- Fixed technical problems in outputs by completely changing the way of combining with Latin and the way of producing outputs (scripts have been rewritten)
+- Completion of Latin glyphs # 93
+
+۱۷ اسفند ۱۴۰۰
+
+- تغییر نام از وزیر به وزیرمتن
+- بزرگتر شدن اندازه گلیفها (حروف و علائم و ارقام)
+- بازطراحی وزنهای ضخیم و اعمال کنتراست
+- اضافه شدن وزن نازک (ساخت مجدد وزنهای کمتر از معمولی)
+- تغییر فاصله حروف (افزایش در ضخیمها و کاهش در نازکها)
+- اضافه شدن نسخه نقطهگرد (با تشکر از @ghaznavipc) #127
+- تفکیک فایلها بر اساس نوع (با تشکر از @xmha97) #190
+- اصلاح اسامی نسخههای متفرقه (با تشکر از @kokabi1365) #203
+- رفع مشکل عدم نمایش نقاط ي در نسخه یوآی (با تشکر از @sepehr-brj) #194
+- رفع ایراد کرنینگ در حروف لاتین (با تشکر از @hamid0740) #218
+- فشرده شدن اغلب حروف
+- بهبود س ص ن ي ك (با تشکر از @ulaima) #226
+- رفع ایراد ارتفاع در نسخه یوآی (با تشکر از @ulaima) #227
+- رفع ایراد همزه (با تشکر از @X7md) #229
+- طراحی علائم + - − ÷ × متناسب با اندازه حروف و ارقام فارسی (خط تیره و منها یک شکل شدهاند)
+- تغییر اندازه «بـ یـ تـ پـ» و حروف مشابه به تناسب در کنار سایر حروف از جمله «ـی ـق ـو ـر ...»
+- بهبود ضخامت قلم
+- بهبود اِعراب
+- بازطراحی ارقام عربی ٥ ٤ ٦ و ۴
+- بازطراحی ۴ در ضخیم
+- بازطراحی ارقام ۲ ۳ ۷ ۸ ۵
+- بازطراحی ی همزه ؟ ٌ ٚ ٛ
+- تغییر کرنینگ ارقام و اصلاح عرضها و رفع مشکل فاصله اعداد در استایلست ss01
+- بازطراحی پرانتزهای قرآنی
+- بهبود ـهـ ـلا لا ع عـ ـعـ ـع هـ ء ـه ك
+- اصلاح ﷼
+- کوتاهتر شدن ک گ
+- بهبود رزژـرـزـژ
+- بهبود . ! ؛ ، ٬ ۰ ممیز : « »
+- بهبود آ ص ط
+- بهبود کرنینگ «آ ر ز ژ ـر ـز ـژ» با دیگر حروف
+- رفع اشکالات فنی با تغییر کامل شیوه ترکیب با لاتین و نحوه تولید خروجیها (اسکریپت ها بازنویسی شدهاند)
+- کامل شدن حروف لاتین #93
+
+
+## Old Vazir Changelog
+
+نسخه ۳۰.۱.۰
+-----------
+۱ شهریور ۱۴۰۰
+
+- بازطراحی لا ـلا
+- بهبود ۴ ۶ ء
+- اصلاح عرض غـ
+
+
+نسخه ۳۰.۰.۰
+-----------
+۱۳ مرداد ۱۴۰۰
+
+- بازطراحی ـفـ ـقـ ـف
+- بهبود ی م ـم ف فـ ق قـ
+- بهبود ـی در ضخیمها
+- اضافه شدن کرنینگ «ـا آ ا» با «ع غ»
+- اضافه شدن کرنینگ «د ـد ذ ـذ ـی» با «ک گ کـ گـ» #211
+- اضافه شدن ss01 Style Set برای جایگزینی ارقام لاتین با فارسی (با تشکر از @EhsanCh) #198
+- اضافه شدن tnum برای نمایش ارقام به صورت همعرض یا با عرض یکسان (با تشکر از @EhsanCh) #198
+
+
+نسخه ۲۹.۱.۰
+-----------
+۴ تیر ۱۴۰۰
+
+- افزایش طول کشیده (با تشکر از @imiimiimi) #153
+- اضافه شدن گلیف uni25cc ◌ (با تشکر از @adamiturabi) #200
+- اصلاح خط زیر (با تشکر از @Farshidmi) #205
+- بهبود ی ـعـ ـع ٤ ٥ ٦
+- اضافه شدن کرنینگ ٦ و ٥ ٨
+
+
+نسخه ۲۹.۰.۲
+-----------
+۲۶ خرداد ۱۴۰۰
+
+- اصلاح کرنینگ «لا ـلا» و «ع غ» (با تشکر از @rasa-app) #82
+- بهبود مد
+
+
+نسخه ۲۹.۰.۱
+-----------
+۲۰ خرداد ۱۴۰۰
+
+- رفع ایراد عـ ع
+
+
+نسخه ۲۹.۰.۰
+-----------
+۲۰ خرداد ۱۴۰۰
+
+- افزایش فاصله بین واژهها
+- بهبود ه لـ ـلـ
+- بهبود مد آ
+- بهبود نقاط ز ـز ژ ـژ خـ ـخـ خ ـخ
+- بهبود اِعراب م ـم يـ بـ
+
+
+نسخه ۲۸.۰.۰
+-----------
+۱۸ فروردین ۱۴۰۰
+
+- کاهش فاصله بین واژهها
+
+
+نسخه ۲۷.۲.۲
+-----------
+۲۵ بهمن ۱۳۹۹
+
+- اصلاح انحنای ۶ ۴ ۳ در حالتهای ضخیم
+- اصلاح ضخامت ـد
+
+
+نسخه ۲۷.۲.۱
+-----------
+۱۶ بهمن ۱۳۹۹
+
+- بهبود ـعـ ـع
+
+
+نسخه ۲۷.۲.۰
+-----------
+۲۵ دی ۱۳۹۹
+
+- بهبود ز ـز کـ ـکـ ـک ک
+- افزایش ضخامت نقاط در وزنهای بالا
+
+
+نسخه ۲۷.۱.۰
+-----------
+۲۲ آذر ۱۳۹۹
+
+- کاهش ارتفاع متریک قلم (فاصله بین خطوط) (با تشکر از @Mohammad-777)
+- رفع ایراد اعراب ٯ ٮ (با تشکر از @dscorbett) #178
+- رفع ایراد ﮿ ﯀ (با تشکر از @dscorbett) #179
+- بهبود ـعـ ـع
+
+
+نسخه ۲۷.۰.۳
+-----------
+۹ آذر ۱۳۹۹
+
+- افزایش هینتینگ برای نمایش بهتر در سیستمعامل ویندوز
+- رفع ایراد نامگذاری فونتها (با تشکر از @Ariodaad) #177
+
+
+نسخه ۲۷.۰.۲
+-----------
+۵ آذر ۱۳۹۹
+
+- رفع ایراد چاپ ـيـ يـ عربی و ارقام در نسخه «تمام ارقام فارسی» در برخی چاپگرها (با تشکر از @Ariodaad) #176
+- بهبود ـعـ
+- بهبود همزه در خروجی
+
+
+نسخه ۲۷.۰.۱
+-----------
+۲ آذر ۱۳۹۹
+
+- حذف گلیف رزرو شده U+FE75 (با تشکر از @dscorbett) #175
+
+
+نسخه ۲۷.۰.۰
+-----------
+۲ آذر ۱۳۹۹
+
+- بازنگری در طراحی «ر» و کرنینگ آن
+- بازنگری در طراحی «ـعـ ـع»
+- افزایش ارتفاع متریک قلم از بالا و پایین
+- کاهش فاصله بین کلمات
+- افزایش ارتفاغ گلیفهای عمودی در تمام وزنها به غیر از معمولی
+- بهبود نقطهها (متوسط، ضخیم، سیاه)
+- بهبود و اصلاحات در حروف از جمله آ لا ـلا ص ـص س ـس عـ ع ک ـک کـ ـکـ ف فـ ـفـ ق ـق و ی ـی م ـم ء ۹ ۶
+- بهبود مـ ـمـ ـم م فـ ف در سیاه
+- اصلاح ھ جدا
+- بازسازی وزن نازک و سیاه و اصلاح محل اعراب
+- بهبود شکل اعراب
+- اصلاح فیلد Manufacturer (با تشکر از @xmha97) #154
+- اضافه شدن تمامی حالات حروف «ؽ ݣ ۉ» از زبان ترکی #155
+- اصلاح ارجاعها و رفع ایراد جابجایی یا چاپ نشدن برخی حروف و علائم (با تشکر از @Ariodaad) #158
+- اصلاح ضخامت مد، همزه، یای کوتاه و اعراب و تبدیل rlig به ccmp (باتشکر از @aminabedi68) #160
+- اضافه شدن حرف ڪ (با تشکر از HosseinborAhmad) #161
+- اضافه شدن حرف ۉ از زبان ازبکی (با تشکر از @vaheedxp) #162
+- اضافه شدن تمامی حالات حروف «ۋ ڭ ﯗ ﯙ» از زبان قزاقی Kazakh (با تشکر از @MuratKaribay) #164
+- اضافه شدن «ںـ ـںـ ٮـ ـٮـ ٯـ ـٯـ» (با تشکر از @dscorbett) #169
+- حذف کرنینگ «ر ز ژ» با «فاصله» به دلیل مشکل نمایش در مرورگر کروم (با تشکر از @mojtabamoradi) #172
+- اضافه شدن نسخه UI (با ارتفاع متریک کمتر)
+- اضافه شدن لایسنس (مجوز) OFL به فونت #173
+- تغییر محتوای اطلاعاتی فونت
+- و برخی اصلاحات فنی
+
+
+نسخه ۲۶.۰.۲
+-----------
+۲۷ اردیبهشت ۱۳۹۹
+
+- اصلاح ضخامت مد الف در سبک
+
+
+نسخه ۲۶.۰.۱
+-----------
+۲۵ اردیبهشت ۱۳۹۹
+
+- رفع ایراد ـے همزه دار در اردو
+
+
+نسخه ۲۶.۰.۰
+-----------
+۲۴ اردیبهشت ۱۳۹۹
+
+- اضافه شدن زبانهای پشتو و اردو
+- اضافه شدن گلیفهای جدید از ایشو #143 بخش دوم (با تشکر از @farshadrasuli)
+- اصلاح عدد ۴
+- بهبود نقاط در ضخیم و متوسط
+- رفع ایراد ایشو #140 و اضافه شدن لیگچرهای لام و الف صامت
+- اصلاح همزه ٦ ،
+- بهبود گیومه (با تشکر از @neesti)
+
+
+نسخه ۲۵.۰.۰
+-----------
+۱۰ اردیبهشت ۱۳۹۹
+
+- تغییر جداول کرنینگ برای رفع ایراد نمایش کرنینگ در برخی نرمافزارها از جمله Adobe XD
+- اضافه شدن 13 گلیف جدید از ایشو #143 بخش نخست (با تشکر از @farshadrasuli)
+- اضافه شدن کرنینگ «ر ز ژ ـر ـز ـژ» با گلیف فاصله (با تشکر از @saeidka)
+- حذف و اضافه شدن برخی گلیفهای لاتین از قلم روبوتو
+
+
+نسخه ۲۴.۲.۰
+-----------
+۲۹ فروردین ۱۳۹۹
+
+- افزایش فاصله بین کلمات
+
+
+نسخه ۲۴.۱.۰
+-----------
+۵ فروردین ۱۳۹۹
+
+- بهبود ی م ـم
+
+
+نسخه ۲۴.۰.۰
+-----------
+۲۳ اسفند ۱۳۹۸
+
+- اصلاح ی ـو ـق ـا
+- افزایش ناحیه اتصال «یـ پـ ـیـ ـپـ بـ ـبـ» با «ـو ـق»
+- کاهش فاصله بین کلمات
+
+
+نسخه ۲۳.۰.۰
+-----------
+۶ اسفند ۱۳۹۸
+
+- بازطراحی ی
+- اصلاح عرض آ و کرنینگ آن با سایر حروف
+- بهبود عرض ـن ـد
+- بهبود ه هـ حـ ـحـ ـد ك آ
+- اصلاح ایرادات همپوشانی در سبک و نازک
+- کاهش ارتفاع گلیفهای عمودی
+- اصلاح ۷ ۸ در سبک
+
+
+نسخه ۲۲.۱.۰
+-----------
+۲۸ بهمن ۱۳۹۸
+
+- افزایش عرض ـی ـب ب ف ک ـگ
+
+
+نسخه ۲۲.۰.۰
+-----------
+۹ بهمن ۱۳۹۸
+
+- تغییر عرض ـیـ ـتـ ـپـ ـبـ ـنـ مـ ـمـ ـئـ
+
+
+نسخه ۲۱.۲.۱
+-----------
+۴ دی ۱۳۹۸
+
+- بهبود ی
+- اصلاح آدرس لایسنس
+
+
+نسخه ۲۱.۲.۰
+-----------
+۶ آذر ۱۳۹۸
+
+- بهبود نقاط پایین خط کرسی
+- بهبود ـی (با تشکر از @PAPIONbit)
+- بهبود عرض ـهـ
+
+
+نسخه ۲۱.۱.۲
+-----------
+۲۵ آبان ۱۳۹۸
+
+- اصلاح اعراب ـی
+- اصلاح جداول GPOS
+
+
+نسخه ۲۱.۱.۱
+-----------
+۹ آبان ۱۳۹۸
+
+- رفع ایراد هـ در معمولی و سبک
+- اصلاح ۰
+
+
+نسخه ۲۱.۱.۰
+-----------
+۱۶ مهر ۱۳۹۸
+
+- رفع ایراد اعراب س ـس سـ ـسـ
+- اصلاح ـی ـي ـئ
+- اصلاح ؟ در وزن سبک
+- اصلاح ـنـ در وزن نازک
+- اصلاح عرض ۳
+
+
+نسخه ۲۱.۰.۱
+-----------
+۸ شهریور ۱۳۹۸
+
+- بهبود سه نقطه
+
+
+نسخه ۲۱.۰.۰
+-----------
+۷ شهریور ۱۳۹۸
+
+- بازسازی کل فونت به صورت cubic، اصلاح نقاط، اصلاح اسامی و رند شدن اندازهها ایشو #123 (با تشکر از @aminabedi68)
+- کاهش جزئی ضخامت قلم
+- بهبود و باز طراحی ارقام
+- کاهش عرض ـی ـعـ به روش کالت (با تشکر از @aminabedi68)
+- بهبود حـ ـحـ ـفـ ـف ف فـ ف ق ح ـح ع ـهـ ـی ر ـر و ـو ﻙ ـﻙ هـ ـه
+- بهبود مکان و کاهش ضخامت نقاط
+- افزایش عرض پـ یـ ثـ ـپـ ـيـ ـثـ
+- کاهش عرض ت ـت ف لـ ـلـ
+- بهبود دندانهها
+- اضافه شدن کرنینگ «لا ـلا» با ع غ
+- اصلاح مکان تمام اِعراب
+- رفع مشکل همپوشانی اِعراب ایشو #103 (با تشکر از @ali-hardan)
+- بازطراحی ٬
+- بهبود علائم
+
+
+نسخه ۲۰.۱.۱
+-----------
+۲۱ مرداد ۱۳۹۸
+
+- افزایش جزئی فاصله ارقام
+- اصلاح نام بولد
+- اصلاح ناحیه همپوشانی ـفـ
+
+
+نسخه ۲۰.۱.۰
+-----------
+۷ خرداد ۱۳۹۸
+
+- بهبود شکل و کرنینگ ارقام
+- اصلاح ٫
+
+
+نسخه ۲۰.۰.۰
+-----------
+۴ خرداد ۱۳۹۸
+
+- بازطراحی هـ ؟
+- بهبود ـی ی ـه ـعـ ۰ ۶
+- تنظیم مجدد ناحیه همپوشانی در تمامی حالتها
+- بهبود ارتفاع
+- اصلاح کرنینگ هٔ با رزژ
+- اصلاح اندازه حالات سبک و متوسط در لاتین
+
+
+نسخه ۱۹.۲.۰
+-----------
+۵ اسفند ۱۳۹۷
+
+- بهبود م ـم
+- بهبود شکل و اندازه و مکان اعراب
+
+
+نسخه ۱۹.۱.۰
+-----------
+۱۸ دی ۱۳۹۷
+
+- بهبود هـ ن
+- رفع ایراد ریال
+- اصلاح حفرهها در سیاه
+- اصلاح اعراب پـ ـپـ
+- اصلاح ـا در سیاه
+
+
+نسخه ۱۹.۰.۰
+-----------
+۱۱ مرداد ۱۳۹۷
+
+- اضافه شدن وزن سنگین
+- اضافه شدن حروف کوردی (با تشکر از dolanskurd-Dolan Hêriş)
+- بهبود ۰ ۲ ۳ ۴ ۶ ۹ م ـم
+- اصلاح ـر در نسخه سبک
+- بهبود نقاط ت ث
+- بهبود ـهـ در ضخیم و متوسط
+- اصلاح نقطه ج ـج در متوسط
+- اصلاح کرنینگ آ کـ
+- بهبود تک نقطه در ضخیم
+
+
+نسخه ۱۸.۰.۱
+-----------
+۲۳ فروردین ۱۳۹۷
+
+- اصلاح ۳
+- بهبود ـع ـعـ
+
+
+نسخه ۱۸.۰.۰
+-----------
+۲۴ بهمن ۱۳۹۶
+
+- بهبود ر و ـر ـر ی ـی د ـد ـهـ
+- بهبود دندانههای س
+- بهبود اندازه نـ بـ ـنـ ـبـ ـب ب ف ـف ک ـک ئـ ـئـ
+- بهبود نقاط
+- بهبود ارقام
+- اضافه شدن کرنینگ ارقام
+
+
+نسخه ۱۷.۲.۰
+-----------
+۲۳ بهمن ۱۳۹۶
+
+- بهبود قوس و اندازه حروف س ص ی ن ق
+
+
+نسخه ۱۷.۱.۱
+-----------
+۲۰ دی ۱۳۹۶
+
+- اصلاح جزئی ضخمات ص ط
+
+
+نسخه ۱۷.۱.۰
+-----------
+۲۰ دی ۱۳۹۶
+
+- اصلاح عرض ـا ا ی و ـو مـ عـ ـه
+- اصلاح ـمـ ـم س ه
+
+
+نسخه ۱۷.۰.۰
+-----------
+۱۸ دی ۱۳۹۶
+
+- بهبود ارتفاع گلیفها و متریک فونت
+- بهبود ص ط ی ـی
+- اضافه شدن جدا کننده تاریخ عربی
+- اصلاح عرض تـ ثـ
+
+
+نسخه ۱۶.۱.۰
+-----------
+۲۰ مهر ۱۳۹۶
+
+- رفع اشکال سرکش گاف
+- بهبود ی ـی ه
+- بهبود همزه روی حروف
+- کاهش ارتفاغ گیومه
+- بهبود هـ در حالت ضخیم
+- بهبود نقاط در حالت ضخیم
+- بهبود نقاط ژ ز
+
+
+نسخه ۱۶.۰.۱
+-----------
+۱۵ مهر ۱۳۹۶
+
+- رفع اشکال س
+
+
+نسخه ۱۶.۰.۰
+-----------
+۱۵ مهر ۱۳۹۶
+
+- بهبود کل اعراب
+- اصلاح ضخامت کـ ـکـ
+- بهبود متیرکهای فونت
+- بهبود ؟ ! ا ـه ص ط ء و همزه روی حروف
+- بهبود ارتفاع و ناحیه همپوشانی
+
+
+نسخه ۱۵.۱.۰
+-----------
+۲ مهر ۱۳۹۶
+
+- بهبود ۹ ۵ ـد کـ ـکـ
+- اصلاح اعراب کـ ـکـ
+
+
+نسخه ۱۵.۰.۰
+-----------
+۹ شهریور ۱۳۹۶
+
+- بهبود ضخامت
+- بهبود ر و ی
+- بهبود ارتفاع
+
+
+نسخه ۱۴.۰.۰
+-----------
+۳۱ مرداد ۱۳۹۶
+
+- بهبود حروف و ارقام
+- اصلاح مشخصات فونتهای تفکیک شده بدون لاتین و حروف فارسی (با تشکر از @morealaz)
+
+
+نسخه ۱۳.۰.۱
+-----------
+۱۵ تیر ۱۳۹۶
+
+- اصلاح ایراد ـآ ـأ
+- اصلاح نقاط ـه ه نقطهدار
+- اصلاح اعراب إ ـإ
+
+
+نسخه ۱۳.۰.۰
+-----------
+۱۵ تیر ۱۳۹۶
+
+- بهبود دندانههای وسط و انتها
+- اصلاح فـ
+- بهبود فاصله بین واژهای
+- بهبود ضخامت ح ـح ع ـع
+
+
+نسخه ۱۲.۰.۰
+-----------
+۱۰ تیر ۱۳۹۶
+
+- بهبود حروف کشیده
+- بهبود م ی ط ف
+- بهبود ـو ـق
+- تصحیح لیگچر الله
+- بهبود مکان نقاط
+
+
+نسخه ۱۱.۰.۱
+-----------
+۲۵ خرداد ۱۳۹۶
+
+- اصلاح نام قلم در حالت نازک برای محیط دسکتاپ (با تشکر از @Javid-Izadfar)
+
+
+نسخه ۱۱.۰.۰
+-----------
+۱۸ خرداد ۱۳۹۶
+
+- بهبود سـ ـسـ ـا ـی ی ـعـ
+- بهبود حالات م ک
+- اصلاح عرض ف
+- اضافه شدن نسخه باریک
+
+
+نسخه ۱۰.۰.۱
+-----------
+۱۵ خرداد ۱۳۹۶
+
+- رفع ایراد عرض ـفـ ـقـ
+- اصلاح ضخامت مد در حالت نازک
+- رفع ایراد هینتینگ در woff و eot
+
+
+نسخه ۱۰.۰.۰
+-----------
+۶ خرداد ۱۳۹۶
+
+- بهبود و بازطراحی در گلیفها
+- اضافه شدن نسخه وزن متوسط
+- اضافه شدن نسخه woff2
+
+
+نسخه ۱۰.۰.۰-بتا
+---------------
+۹ فروردین ۱۳۹۶
+
+- اصلاح ضخامت خط کرسی در گلیفها (برابر شدن)
+- بهبود هـ در ضخیم
+- بهبود عرض ۹
+
+
+نسخه ۱۰.۰.۰-آلفا
+----------------
+۸ فروردین ۱۳۹۶
+
+- تجدید نظر در سایز قلم
+- برابر شدن سایز وزنها
+- کاهش فاصله بین کلمات
+- بهبود ارقام
+- بهبود حروف و علائم
+
+
+نسخه ۹.۰.۰-بتا
+--------------
+۳۰ اسفند ۱۳۹۵
+
+- کاهش فاصله بین کلمات
+- بازطراحی گیومه
+- بهبود فاصله طولی مـ ـه
+
+
+نسخه ۹.۰.۰-آلفا
+---------------
+۲۵ اسفند ۱۳۹۵
+
+- تجدید نظر در ضخامت و اندازه قلم
+- اصلاح و بهبود گلیفها
+
+
+نسخه ۸.۲.۱
+----------
+۱۶ اسفند ۱۳۹۵
+
+- اصلاح هـ عـ
+- اصلاح ط در ضخیم
+
+
+نسخه ۸.۲.۰
+----------
+۱۵ اسفند ۱۳۹۵
+
+- بهبود ـعـ
+- اصلاح اعراب
+- اصلاح نقاط
+- اصلاح س
+
+
+نسخه ۸.۱.۰
+----------
+۱۳ اسفند ۱۳۹۵
+
+- بهبود حالات خ
+- بهبود ارتفاع گلیفهای عمودی
+- بهبود نقطه ذ ـذ
+- بهبود ارتفاع م ـم
+- اصلاح ! در ضخیم
+
+
+نسخه ۸.۰.۰
+----------
+۱۲ اسفند ۱۳۹۵
+
+- بهبود قوسها، اندازهها، طولها، شکلها و فاصلهها
+- رفع مشکل ـن (با تشکر از @Masishta)
+
+
+نسخه ۷.۱.۰
+----------
+۷ اسفند ۱۳۹۵
+
+- اصلاح و بهبود د ـد ر ـر ـن مـ ـمـ ـفـ ـف هـ ـق ـو ّ ـت ف حـ ـحـ
+
+
+نسخه ۷.۰.۰
+----------
+۷ بهمن ۱۳۹۵
+
+- افزایش سایز قلم جهت هماهنگی با سایر قلم های رایج
+- بهبود برخی گلیف ها و ارتفاع
+- اصلاح متریکها
+
+
+نسخه ۶.۳.۴
+----------
+۳ مهر ۱۳۹۵
+
+- رفع ایراد زاویه سرکش گ
+- بهبود اتصال از راست ـط ـص
+- رفع ایراد X-Height
+
+
+نسخه ۶.۳.۳
+----------
+۲۳ آذر ۱۳۹۵
+
+- رفع ایراد ضخامت کرسی ـح حـ ـحـ
+- رفع ایراد جهت در ضخیم
+
+
+نسخه ۶.۳.۲
+----------
+۱۶ آذر ۱۳۹۵
+
+- رفع ایراد همخانواده نبودن نسخههای قلم
+
+
+نسخه ۶.۳.۱
+----------
+۱۵ آذر ۱۳۹۵
+
+- اصلاح حالات ک در ضخیم
+- بهبود جزئی ـه
+
+
+نسخه ۶.۳.۰
+----------
+۱۵ آذر ۱۳۹۵
+
+- بهبود ارتفاع
+- بهبود حـ ـحـ
+- اصلاح دندانه صـ ـصـ
+- بهبود ؟
+- افزایش فاصله نقاط در ضخیم
+
+
+نسخه ۶.۲.۰
+----------
+۱۲ آذر ۱۳۹۵
+
+- بهبود ضخامت گلیف های عمودی
+- بهبود ارقام
+
+
+نسخه ۶.۱.۰
+----------
+۱۱ آذر ۱۳۹۵
+
+- رفع اشکال ـت در ضخیم
+- بهبود ق
+- بهبود مکان نقاط
+
+
+نسخه ۶.۰.۰
+----------
+۱۰ آذر ۱۳۹۵
+
+- بهبود قوسها و دندانهها و اندازهها و زوایا
+- بهبود شکل حروف
+- اصلاح همزه بر روی ه
+- افزایش فاصله بین واژهای
+
+
+نسخه ۵.۱.۱
+----------
+۱ آذر ۱۳۹۵
+
+- بهبود عرض در ـسـ سـ ـس ـعـ
+
+
+نسخه ۵.۱.۰
+----------
+۱ آذر ۱۳۹۵
+
+- بهبود ح ـح حـ ـحـ ـع ع ل ـل ی ـی ن ـن س ـس ص ـص ـهـ هـ ء
+- بهبود و اصلاح ارقام
+- بازگشت ـه از نسخه چهار
+
+
+نسخه ۵.۰.۰
+----------
+۳۰ آبان ۱۳۹۵
+
+- بازطراحی برخی گلیف ها برای بازگشت به تایپ فیس وزیر یک
+- بهبود برخی گلیف ها (با تشکر از محمد)
+- اصلاح متریک در نسخه ضخیم
+- ایجاد دوباره نسخه ضخیم و سبک
+- اصلح ارقام ۴ ۵ ۶ در نسخه تمام ارقام فارسی
+
+
+نسخه ۴.۴.۱
+----------
+۷ آبان ۱۳۹۵
+
+- بهبود فـ ف ق ـو و مـ ـمـ
+
+
+نسخه ۴.۴.۰
+----------
+۲۹ مهر ۱۳۹۵
+
+- بهبود ارتفاع و فاصله و برخی نقاط
+- تصحیح صفر در ضخیم
+
+
+نسخه ۴.۳.۱
+----------
+۲۵ مهر ۱۳۹۵
+
+- بهبود دندانه ها
+
+
+نسخه ۴.۳.۰
+----------
+۲۵ مهر ۱۳۹۵
+
+- افزایش عرض مـ ـمـ لـ ـلـ ـی
+- بهبود ۹ فـ و ـفـ
+
+
+نسخه ۴.۲.۱
+----------
+۲۴ مهر ۱۳۹۵
+
+- بهبود و در ضخیم
+- اصلاح ـقـ ٫
+- اضافه شدن گلیف ریال
+- تصحیح جهت
+
+
+نسخه ۴.۲
+--------
+۲۳ مهر ۱۳۹۵
+
+- بهبود ضخامت در حالت توپر
+- بهبود دندانه ها و ارتفاع
+
+
+نسخه ۴.۱.۲
+----------
+۶ مهر ۱۳۹۵
+
+- بهبود مـ ـه
+- اصلاح charset
+
+
+نسخه ۴.۱.۱
+----------
+۱۹ شهریور ۱۳۹۵
+
+- بهبود بسیار جزيی قوس س ص ن
+- اصلاح دندانه صـ ـسـ
+- بهبود ـم
+
+
+نسخه ۴.۱.۰
+----------
+۷ شهریور ۱۳۹۵
+
+- افزایش نواحی همپوشانی
+- کوچکتر شدن خط فاصله (تطویل)
+
+
+نسخه ۴.۰.۱
+----------
+۲۲ مرداد ۱۳۹۵
+
+- اصلاح ۶
+- بهبود ح و دندانه های س در حالت ضخیم
+
+
+نسخه ۴.۰.۰
+----------
+۲۱ مرداد ۱۳۹۵
+
+- باز طراحی و بهبود فونت
+- اضافه شدن حروف لاتین فونت روبوتو به قلم
+
+
+نسخه ۳.۱.۰
+----------
+۴ تیر ۱۳۹۵
+
+- افزایش طولی فونت در برخی گلیف ها
+
+
+نسخه ۳.۰.۱
+----------
+۲۹ خرداد ۱۳۹۵
+
+- اضافه شدن cdn
+
+
+نسخه ۳
+------
+۲۸ خرداد ۱۳۹۵
+
+- بهبود بسیاری از گلیف ها
+- بهبود فاصله
+- اضافه شدن وزن های نازک و متوسط
+- اضافه شدن گلیف های الله و ریال
+- حذف داده های اضافی و کاهش حجم فایل
+
+
+نسخه ۲
+------
+۱۲ اردیبهشت ۱۳۹۵
+
+- بهبود حالات س
+- بهبود بـ
+- پشتیبانی از bower با (تشکر از Nasser Rafie-geminorum)
+
+
+نسخه ۲-کاندیدای انتشار ۱۳
+-------------------------
+۲ اردیبهشت ۱۳۹۵
+
+- بهبود دندانه ها
+- بهبود ضخامت ها
+- بهبود فاصله در حالت توپر
+
+
+نسخه ۲-کاندیدای انتشار ۱۲
+-------------------------
+۲۸ فروردین ۱۳۹۵
+
+- بهبود ه و ـو ف فـ ـق ق ـد ر ـر
+- بهبود ارتفاع گلیف های عمودی و نقاط
+- اصلاح ؟ ! در حالت ضخیم
+
+
+نسخه ۲-کاندیدای انتشار ۱۱
+-------------------------
+۲۳ فروردین ۱۳۹۵
+
+- بهبود حالات ح ع
+- بهبود نقاط
+- اصلاح متریک های فونت
+- بهبود م
+
+
+نسخه ۲-کاندیدای انتشار ۱۰
+-------------------------
+۲۰ فروردین ۱۳۹۵
+
+- بهبود تک نقطه
+
+
+نسخه ۲-کاندیدای انتشار ۹
+------------------------
+۱۸ فروردین ۱۳۹۵
+
+- بهبود ٪
+- اصلاح کد پیج فونت (با تشکر از Saleh Souzanchi-zoghal و Saeed Rasooli-ilius)
+
+
+نسخه ۲-کاندیدای انتشار ۸
+------------------------
+۱۳ فروردین ۱۳۹۵
+
+- بهبود مـ ـمـ ی هـ ـه ـت
+- بهبود همزه (با تشکر از amin3d)
+- بهبود تک نقطه (با تشکر از Saleh Souzanchi-zoghal)
+- تصحیح ایراد فایل eot (با تشکر از Alireza Dabiri Nejad-alirdn)
+
+
+نسخه ۲-کاندیدای انتشار ۷
+------------------------
+۲۶ اسفند ۱۳۹۴
+
+- بهبود فاصله ها
+
+
+نسخه ۲-کاندیدای انتشار ۶
+------------------------
+۲۵ اسفند ۱۳۹۴
+
+- بهبود کرنینگ
+
+
+نسخه ۲-کاندیدای انتشار ۵
+------------------------
+۲۲ اسفند ۱۳۹۴
+
+- تصحیح نقاط ـت ـث
+- بهبود م
+- تصحیح ص
+
+
+نسخه ۲-کاندیدای انتشار ۴
+------------------------
+۲۱ اسفند ۱۳۹۴
+
+- بازنگری کلی در حالت ضخیم
+- بهبود م
+
+
+نسخه ۲-کاندیدای انتشار ۳
+------------------------
+۲۱ اسفند ۱۳۹۴
+
+- بهبود هـ ـمـ مـ م ر ـر و ـو لا ـلا ـن ن ـق ق
+- بهبود حالات ط ص س
+
+
+نسخه ۲-کاندیدای انتشار ۲
+------------------------
+۲۰ اسفند ۱۳۹۴
+
+- بهبود هـ
+- بهبود ـم در حالت ضخیم
+
+
+نسخه ۲-کاندیدای انتشار ۱
+------------------------
+۱۷ اسفند ۱۳۹۴
+
+- بهبود نقاط
+- اصلاح ق ـق ـع
+- بهبود سرکش گاف در حالت ضخیم
+- اضافه شدن گلیف های ه همزه دار
+- اصلاح برخی اعراب
+
+
+نسخه ۲-کاندیدای انتشار ۰
+------------------------
+۱۶ اسفند ۱۳۹۴
+
+- بزرگتر شدن کل فونت
+
+
+نسخه ۲-بتا-رفع اشکال ۵
+----------------------
+۱۵ اسفند ۱۳۹۴
+
+- بهبود هـ ـم
+- بهبود نقاط
+- بهبود نقطه در حالات خ
+- تصحیح ـفـ ـقـ
+- بهبود نقاط ـچ در حالت ضخیم
+
+
+نسخه ۲-بتا-رفع اشکال ۴
+----------------------
+۱۳ اسفند ۱۳۹۴
+
+- بهبود مـ ـمـ م سـ ـسـ هـ ـهـ و حالات ص
+
+
+نسخه ۲-بتا-رفع اشکال ۳
+----------------------
+۱۱ اسفند ۱۳۹۴
+
+- تغییر شکل ـم و بهبود مـ ـمـ م ۶ همزه
+- تصحیح ـف در حالت ضخیم
+
+
+نسخه ۲-بتا-رفع اشکال ۲
+----------------------
+۸ اسفند ۱۳۹۴
+
+- بهبود ح ـح حـ ـحـ بـ سـ س ق ن ـع ع ۷ ۸
+- بهبود نقطه ها
+
+
+نسخه ۲-بتا-رفع اشکال ۱
+----------------------
+۱۵ بهمن ۱۳۹۴
+
+- اصلاح لا ـلا ی خ هـ طـ ـطـ ـق س ـسـ ـس سـ مـ ـمـ ـم طـ ـطـ
+- اصلاح مد
+- بازنگری در کرنینگ ارقام
+
+
+نسخه ۲-بتا-رفع اشکال ۰
+----------------------
+۱۲ دی ۱۳۹۴
+
+- تصحیح اعراب
+- تصحیح کرنینگ
+- تصحیح گلیف ها و اندازه ها
+
+
+نسخه ۲-بتا
+----------
+۱۱ دی ۱۳۹۴
+
+- تغییر کل سایز قلم
+- تغییر فاصله
+- تنظیم مجدد سایز ضخیم
+- تصحیح برخی گلیفها
+
+نسخه ۲-آلفا
+-----------
+۲۹ آذر ۱۳۹۴
+
+- تغییرات و باز طراحی گسترده در گلیفها
+
+
+نسخه ۱.۱۲.۱
+-----------
+۲۰ آذر ۱۳۹۴
+
+- اصلاح اندازه ج
+- اصلاح سایز گلیف های علائم و ارقام در ضخیم
+- حذف ارقام لاتین
+- اصلاح د س ـسـ
+- اصلاحات جزئی در شکل گلیف ها
+
+نسخه ۱.۱۲
+---------
+۲۰ آذر ۱۳۹۴
+
+- اصلاحات زیاد بر روی گلیف ها و کرنینگ
+
+نسخه ۱.۱۱
+---------
+۱۸ آذر ۱۳۹۴
+
+- اصلاحات در فاصله ها
+- بهبود ح ـح ـع ع ـک ـکـ ف ق ۵
+
+
+نسخه ۱.۱۰.۸
+-----------
+۸ آذر ۱۳۹۴
+
+- اصلاحاتی بر روی علائم و اندازه ها
+- اصلاح همزه
+
+
+نسخه ۱.۱۰.۷
+-----------
+۲۴ آبان ۱۳۹۴
+
+- بهبود ـم
+
+نسخه ۱.۱۰.۶
+-----------
+۲۱ آبان ۱۳۹۴
+
+- اصلاح گلیف های ـک ـکـ
+
+نسخه ۱.۱۰.۵
+-----------
+۱۷ آبان ۱۳۹۴
+
+- حذف عبارت کپی رایت اضافی
+
+نسخه ۱.۱۰.۴
+-----------
+۱۵ آبان ۱۳۹۴
+
+- اصلاح مکان نقطه های پ چ
+
+نسخه ۱.۱۰.۳
+-----------
+۱۵ آبان ۱۳۹۴
+
+- اصلاح دو نقطه و سه نقطه (نزدیکتر شدن به هم)
+- اصلاح ـم
+
+نسخه ۱.۱۰.۲
+-----------
+۱۳ آبان ۱۳۹۴
+
+- اصلاح ـم
+
+نسخه ۱.۱۰.۱
+-----------
+۱۳ آبان ۱۳۹۴
+
+- اصلاح گلیف ۶
+- اصلاح اعراب
+
+نسخه ۱.۱۰
+---------
+۱۳ آبان ۱۳۹۴
+
+-باز طراحی حرف ـم
+- اضافه شدن داده های هینتینگ با استفاده از نرم افزار ttfautohint (با تشکر از Salar Khalilzadeh-salarcode)
+
+نسخه ۱.۹.۵
+----------
+۸ آبان ۱۳۹۴
+
+- تصحیح حرف ی برای رندر بهتر در فایرفاکس
+
+نسخه ۱.۹.۴
+----------
+۸ آبان ۱۳۹۴
+
+- ضخیم تر شدن حرف ی به مقدار کم
+
+نسخه ۱.۹.۳
+----------
+۷ آبان ۱۳۹۴
+
+- باز طراحی حرف ی
+
+نسخه ۱.۹.۲
+----------
+۷ آبان ۱۳۹۴
+
+- تصحیح اعراب برخی حروف
+- تصحیح نقطه حرف ی عربی
+
+نسخه ۱.۹.۱
+----------
+۷ آبان ۱۳۹۴
+
+- اصلاحات مجدد در اندازه های فونت
+
+نسخه ۱.۹
+--------
+۷ آبان ۱۳۹۴
+
+- اصلاحات کلیدی و مهم در اندازه های فونت (با تشکر از A_O)
+
+نسخه ۱.۸.۶
+----------
+۶ آبان ۱۳۹۴
+
+- تصحیح مکان نقطه های سه تایی
+- تصحیح جهت حرف حـ
+
+نسخه ۱.۸.۵
+----------
+۵ آبان ۱۳۹۴
+
+- تصحیح مکان نقاط برخی حروف
+
+نسخه ۱.۸.۴
+----------
+۵ آبان ۱۳۹۴
+
+- تصحیح شکل عدد ۳
+- حذف برخی ردیف های lookup اضافه
+
+نسخه ۱.۸.۳
+----------
+۴ آبان ۱۳۹۴
+
+- تصحیح مشکل در هم رفتگی حروف متصل در حالت ضخیم
+
+نسخه ۱.۸.۲
+----------
+۴ آبان ۱۳۹۴
+
+- تصحیح مکان نقاط نویسههای چ و چـ
+
+نسخه ۱.۸.۱
+----------
+۴ آبان ۱۳۹۴
+
+- اصلاح جزئی بر روی انتهای حروف کشیده برای نمایش بهتر و یا صاف تر
+- تصحیح مکان نقطه حروف یـ و ـيـ عربی
+
+
+نسخه ۱.۸
+--------
+۳ آبان ۱۳۹۴
+
+- اضافه شدن نویسه های نیم فاصله و فاصله مجازی. (با تشکر از ahmadali shafiee-ahmadalli)
+- تصحیح مکان نقطه حرف ق
+
+
+نسخه ۱.۷.۸
+----------
+۲ آبان ۱۳۹۴
+
+- اصلاح سایز طول گلیف عدد صفر لاتین (طول اعداد یکسان باید باشد)
+
+نسخه ۱.۷.۷
+----------
+۲ آبان ۱۳۹۴
+
+- اصلاح گلیف (ـ)
+
+نسخه ۱.۷.۶
+----------
+۲ آبان ۱۳۹۴
+
+- اصلاح حرف هـ
+- اصلاح مکان نقاط برخی حروف
+- اصلاحات بیشتر بر روی اعراب
+
+نسخه ۱.۷.۵
+----------
+۱ آبان ۱۳۹۴
+
+- اصلاحات مجدد اعراب با فواصل بهتر
+
+نسخه ۱.۷.۴
+----------
+۱ آبان ۱۳۹۴
+
+- اصلاحات فراوان اعراب
+
+نسخه ۱.۷.۳
+----------
+۳۰ مهر ۱۳۹۴
+
+- اصلاحات جزئی
+- اضافه شدن نسخه تمام اعداد فارسی
+
+نسخه ۱.۷.۲
+----------
+۳۰ مهر ۱۳۹۴
+
+- تصحیح گلیف های م و ـم
+
+نسخه ۱.۷.۱
+----------
+۳۰ مهر ۱۳۹۴
+
+- تصحیح اعراب
+- تصحیح حرف هـ
+- تصحیح حرف ـم
+
+نسخه ۱.۷
+--------
+۳۰ مهر ۱۳۹۴
+
+- باز طراحی گلیف ویرگول (با تشکر از Ebrahim Byagowi-ebraminio)
+- باز طراحی گلیف نقطه ویرگول
+- تصحیح اندازه و مکان اعراب کل حروف
+- تصحیح جزئی شکل حرف عـ
+
+نسخه ۱.۶
+--------
+۲۸ مهر ۱۳۹۴
+
+- تغییر شکل گلیف ممیز (با تشکر از Ebrahim Byagowi-ebraminio)
+- تنظیم مجدد فاصله های حروف در حالت ضخیم
+
+نسخه ۱.۵.۳
+----------
+۲۷ مهر ۱۳۹۴
+
+- اصلاحات کرنینگ
+
+نسخه ۱.۵.۲
+----------
+۲۷ مهر ۱۳۹۴
+
+- اصلاحات کرنینگ
+
+نسخه ۱.۵.۱
+----------
+۲۷ مهر ۱۳۹۴
+
+- برخی اصلاحات کرنینگ
+
+نسخه ۱.۵
+----------
+۲۷ مهر ۱۳۹۴
+
+- اضافه شدن کرنینگ برای حروف لازم
+
+نسخه ۱.۴.۴
+----------
+۲۶ مهر ۱۳۹۴
+
+- بهبود برخی از گلیف ها برای نمایش بهتر در فایرفاکس و اینترنت اکسپلورر (با تشکر از Salar Khalilzadeh-salarcode)
+
+نسخه ۱.۴.۳
+----------
+۲۶ مهر ۱۳۹۴
+
+- حل مشکل عدد ۹ در حالت نرمال
+- بهبود حرف ن در حالت ضخیم
+
+نسخه ۱.۴.۲
+----------
+۲۶ مهر ۱۳۹۴
+
+- اضافه شدن گلیف گیلکی دوم ۊ
+- برخی اصلاحات جزئي
+
+نسخه ۱.۴.۱
+----------
+۲۵ مهر ۱۳۹۴
+
+- تصحیح اندازه گلیف های غیر عربی از جمله اعداد
+- اضافه شدن فایل فونت فورج (با تشکر از Sasan Cooper-sasy360)
+
+
+نسخه ۱.۴
+--------
+۲۵ مهر ۱۳۹۴
+
+- حرف ۊ از حروف گیلکی اضافه شد (با تشکر از ورگ v6rg).
+- مشکل اعراب حروف حل شد.
+
+نسخه ۱.۳.۱
+----------
+۲۳ مهر ۱۳۹۴
+
+- حل مشکل نمایش در مک. (با تشکر از Arvin Jenabi و Sajad Abedi)
+
+نسخه ۱.۰
+--------
+۲۲ مهر ۱۳۹۴
+
+- اولین نسخه
+
+
+برای مشاهده تاریخچه فونت وزیر به [این صفحه](https://github.com/rastikerdar/vazir-font/blob/master/CHANGELOG.md) مراجعه نمایید.
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/OFL.txt b/apps/level_up/public/fonts/vazirmatn-v33.003/OFL.txt
new file mode 100644
index 00000000..be66b382
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2015 The Vazirmatn Project Authors (https://github.com/rastikerdar/vazirmatn)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/README.md b/apps/level_up/public/fonts/vazirmatn-v33.003/README.md
new file mode 100644
index 00000000..27ba4d2d
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/README.md
@@ -0,0 +1,61 @@
+# Vazirmatn Font فونت وزیرمتن
+
+Vazirmatn is a Persian/Arabic font project that started in 2015 under the name of Vazir with the idea of a new simple and legible typeface suitable for web pages and applications. Design and development have taken a long way but I hope the results are worth it. Thanks to DejaVu Sans font (v2.35) published in public domain there was a free software base to start the Vazir project. Although Vazir was completely different in typeface, still the original software was common. The design is done in Fontforge. For Latin glyphs, Vazirmatn is combined with Roboto font by a build script, however there is also a version without Latin glyphs (Non-Latin). ([More info](https://rastikerdar.github.io/vazirmatn/fa/docs))
+
+- [Website](https://rastikerdar.github.io/vazirmatn)
+- [Docs](https://rastikerdar.github.io/vazirmatn/fa/docs)
+- [Test the font](https://rastikerdar.github.io/vazirmatn/fa/lab)
+
+## Install
+
+### Download
+
+Grab the [latest release](https://github.com/rastikerdar/vazirmatn/releases/latest) zip package.
+
+TTF files are in folder `fonts/ttf`. There is also a rounded dots version in folder `Round-Dots/`.
+
+### [npm](https://www.npmjs.com/package/vazirmatn)
+
+```
+npm install vazirmatn
+```
+or
+```
+yarn add vazirmatn
+```
+
+### CDN
+
+```html
+
+```
+
+`*-font-face.css` for other versions are in `misc` and `Round-Dots` folders.
+
+```css
+body {
+ font-family: Vazirmatn, sans-serif;
+}
+```
+
+### Arch Linux ([AUR](https://aur.archlinux.org/packages/vazirmatn-fonts))
+```
+yay -S vazirmatn-fonts
+```
+
+## Build
+
+All weights other than Thin, Regular and Black are generated by interpolation method by [fontmake](https://github.com/googlefonts/fontmake) library. See [README.md](/scripts/README.md) in `scripts/`. All build steps (generating files) are done by scripts.
+
+## Thank you
+
+- [fontforge](https://fontforge.org/)
+- [fontmake](https://github.com/googlefonts/fontmake)
+- [fonttools](https://github.com/fonttools/fonttools)
+- [DejaVu Fonts v2.35](https://dejavu-fonts.github.io) (used for the first version)
+
+## License
+This Font Software is licensed under the SIL Open Font License, Version 1.1. See [OFL.txt](OFL.txt).
+
+## Authors
+See [AUTHORS.txt](AUTHORS.txt).
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/Vazirmatn-RD-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/Vazirmatn-RD-font-face.css
new file mode 100644
index 00000000..ff6fa5ea
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/Vazirmatn-RD-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD;
+ src: url('fonts/webfonts/Vazirmatn-RD-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Black.ttf
new file mode 100644
index 00000000..dd7c2a0b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Bold.ttf
new file mode 100644
index 00000000..d0d65b08
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-ExtraBold.ttf
new file mode 100644
index 00000000..cfe91a0c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-ExtraLight.ttf
new file mode 100644
index 00000000..81e99578
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Light.ttf
new file mode 100644
index 00000000..0dfb68ba
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Medium.ttf
new file mode 100644
index 00000000..f351e5db
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Regular.ttf
new file mode 100644
index 00000000..296633af
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-SemiBold.ttf
new file mode 100644
index 00000000..3e2b0bd3
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Thin.ttf
new file mode 100644
index 00000000..7e7a39c1
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/ttf/Vazirmatn-RD-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/variable/Vazirmatn-RD[wght].ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/variable/Vazirmatn-RD[wght].ttf
new file mode 100644
index 00000000..626a591b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/variable/Vazirmatn-RD[wght].ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Black.woff2
new file mode 100644
index 00000000..4ec3c647
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Bold.woff2
new file mode 100644
index 00000000..8de5f278
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-ExtraBold.woff2
new file mode 100644
index 00000000..305c34a4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-ExtraLight.woff2
new file mode 100644
index 00000000..95da9ab4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Light.woff2
new file mode 100644
index 00000000..fd9071fd
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Medium.woff2
new file mode 100644
index 00000000..0a0d2234
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Regular.woff2
new file mode 100644
index 00000000..64610022
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-SemiBold.woff2
new file mode 100644
index 00000000..a246e472
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Thin.woff2
new file mode 100644
index 00000000..062b7daf
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD[wght].woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD[wght].woff2
new file mode 100644
index 00000000..21a20093
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/fonts/webfonts/Vazirmatn-RD[wght].woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/Vazirmatn-RD-FD-NL-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/Vazirmatn-RD-FD-NL-font-face.css
new file mode 100644
index 00000000..9137ea7d
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/Vazirmatn-RD-FD-NL-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-NL-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Black.ttf
new file mode 100644
index 00000000..00e5d6d0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Bold.ttf
new file mode 100644
index 00000000..9e28abce
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-ExtraBold.ttf
new file mode 100644
index 00000000..938137b2
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-ExtraLight.ttf
new file mode 100644
index 00000000..65169ab9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Light.ttf
new file mode 100644
index 00000000..4d7c52a0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Medium.ttf
new file mode 100644
index 00000000..468bd990
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Regular.ttf
new file mode 100644
index 00000000..4388f93c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-SemiBold.ttf
new file mode 100644
index 00000000..52ffd066
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Thin.ttf
new file mode 100644
index 00000000..f90df7d0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-FD-NL-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Black.woff2
new file mode 100644
index 00000000..f4234e78
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Bold.woff2
new file mode 100644
index 00000000..2e1478e0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-ExtraBold.woff2
new file mode 100644
index 00000000..9539d63c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-ExtraLight.woff2
new file mode 100644
index 00000000..30a93dd2
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Light.woff2
new file mode 100644
index 00000000..f258c8e9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Medium.woff2
new file mode 100644
index 00000000..8332dc78
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Regular.woff2
new file mode 100644
index 00000000..e8238d15
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-SemiBold.woff2
new file mode 100644
index 00000000..231ab5f5
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Thin.woff2
new file mode 100644
index 00000000..bc0014a3
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-FD-NL-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/Vazirmatn-RD-FD-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/Vazirmatn-RD-FD-font-face.css
new file mode 100644
index 00000000..3f876e84
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/Vazirmatn-RD-FD-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-FD-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Black.ttf
new file mode 100644
index 00000000..0df2e015
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Bold.ttf
new file mode 100644
index 00000000..589eee55
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-ExtraBold.ttf
new file mode 100644
index 00000000..542c9b3c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-ExtraLight.ttf
new file mode 100644
index 00000000..57ddbf05
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Light.ttf
new file mode 100644
index 00000000..17924224
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Medium.ttf
new file mode 100644
index 00000000..bb89d389
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Regular.ttf
new file mode 100644
index 00000000..91390e6b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-SemiBold.ttf
new file mode 100644
index 00000000..2f78697e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Thin.ttf
new file mode 100644
index 00000000..eaabfec9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/ttf/Vazirmatn-RD-FD-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Black.woff2
new file mode 100644
index 00000000..5038f6bc
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Bold.woff2
new file mode 100644
index 00000000..1a35db5e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-ExtraBold.woff2
new file mode 100644
index 00000000..699a1f43
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-ExtraLight.woff2
new file mode 100644
index 00000000..ccc24b8c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Light.woff2
new file mode 100644
index 00000000..d66c3839
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Medium.woff2
new file mode 100644
index 00000000..7c8d4649
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Regular.woff2
new file mode 100644
index 00000000..d996eb7c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-SemiBold.woff2
new file mode 100644
index 00000000..155c2125
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Thin.woff2
new file mode 100644
index 00000000..71f17662
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-RD-FD-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/Vazirmatn-RD-NL-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/Vazirmatn-RD-NL-font-face.css
new file mode 100644
index 00000000..1e03fd7f
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/Vazirmatn-RD-NL-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-NL-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Black.ttf
new file mode 100644
index 00000000..090f5f6a
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Bold.ttf
new file mode 100644
index 00000000..6f124f82
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-ExtraBold.ttf
new file mode 100644
index 00000000..4da39aaf
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-ExtraLight.ttf
new file mode 100644
index 00000000..b0bfd59b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Light.ttf
new file mode 100644
index 00000000..c05c993e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Medium.ttf
new file mode 100644
index 00000000..0d083ef7
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Regular.ttf
new file mode 100644
index 00000000..544b9fa0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-SemiBold.ttf
new file mode 100644
index 00000000..84edd7ec
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Thin.ttf
new file mode 100644
index 00000000..f3d03dc6
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/ttf/Vazirmatn-RD-NL-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/variable/Vazirmatn-RD-NL[wght].ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/variable/Vazirmatn-RD-NL[wght].ttf
new file mode 100644
index 00000000..cd90b12c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/variable/Vazirmatn-RD-NL[wght].ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Black.woff2
new file mode 100644
index 00000000..26390a6c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Bold.woff2
new file mode 100644
index 00000000..65e69595
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-ExtraBold.woff2
new file mode 100644
index 00000000..381aad16
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-ExtraLight.woff2
new file mode 100644
index 00000000..a7347447
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Light.woff2
new file mode 100644
index 00000000..3be158aa
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Medium.woff2
new file mode 100644
index 00000000..c50874d4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Regular.woff2
new file mode 100644
index 00000000..eb018c73
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-SemiBold.woff2
new file mode 100644
index 00000000..687e4fc2
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Thin.woff2
new file mode 100644
index 00000000..64f68df8
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL[wght].woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL[wght].woff2
new file mode 100644
index 00000000..cf464c0f
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/Non-Latin/fonts/webfonts/Vazirmatn-RD-NL[wght].woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/Vazirmatn-RD-UI-FD-NL-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/Vazirmatn-RD-UI-FD-NL-font-face.css
new file mode 100644
index 00000000..87ad5e8f
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/Vazirmatn-RD-UI-FD-NL-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Black.ttf
new file mode 100644
index 00000000..3e8cdb22
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Bold.ttf
new file mode 100644
index 00000000..df93ff0a
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-ExtraBold.ttf
new file mode 100644
index 00000000..0848070d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-ExtraLight.ttf
new file mode 100644
index 00000000..97d04b24
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Light.ttf
new file mode 100644
index 00000000..8e5fa90d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Medium.ttf
new file mode 100644
index 00000000..913fcc23
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Regular.ttf
new file mode 100644
index 00000000..7e57a00f
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-SemiBold.ttf
new file mode 100644
index 00000000..2f5fb6d7
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Thin.ttf
new file mode 100644
index 00000000..a39d8486
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-FD-NL-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Black.woff2
new file mode 100644
index 00000000..768f2fe4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Bold.woff2
new file mode 100644
index 00000000..c06826af
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-ExtraBold.woff2
new file mode 100644
index 00000000..4cc311a9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-ExtraLight.woff2
new file mode 100644
index 00000000..7ea625f1
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Light.woff2
new file mode 100644
index 00000000..7db91b3e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Medium.woff2
new file mode 100644
index 00000000..0fef7593
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Regular.woff2
new file mode 100644
index 00000000..9ca96e0d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-SemiBold.woff2
new file mode 100644
index 00000000..be6c245b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Thin.woff2
new file mode 100644
index 00000000..a8e1259e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-FD-NL-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/Vazirmatn-RD-UI-FD-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/Vazirmatn-RD-UI-FD-font-face.css
new file mode 100644
index 00000000..0f440a56
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/Vazirmatn-RD-UI-FD-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI FD;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-FD-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Black.ttf
new file mode 100644
index 00000000..960753fa
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Bold.ttf
new file mode 100644
index 00000000..2475cdac
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-ExtraBold.ttf
new file mode 100644
index 00000000..36e588a0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-ExtraLight.ttf
new file mode 100644
index 00000000..9e60dec4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Light.ttf
new file mode 100644
index 00000000..aecf14c0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Medium.ttf
new file mode 100644
index 00000000..c12edde6
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Regular.ttf
new file mode 100644
index 00000000..5b988ff3
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-SemiBold.ttf
new file mode 100644
index 00000000..03a19e94
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Thin.ttf
new file mode 100644
index 00000000..fa93a390
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-RD-UI-FD-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Black.woff2
new file mode 100644
index 00000000..28af8968
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Bold.woff2
new file mode 100644
index 00000000..da4ef15e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-ExtraBold.woff2
new file mode 100644
index 00000000..75ec0961
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-ExtraLight.woff2
new file mode 100644
index 00000000..86a324b7
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Light.woff2
new file mode 100644
index 00000000..2aaefc5d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Medium.woff2
new file mode 100644
index 00000000..b3d2a60c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Regular.woff2
new file mode 100644
index 00000000..52fc711c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-SemiBold.woff2
new file mode 100644
index 00000000..78d167a9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Thin.woff2
new file mode 100644
index 00000000..550788e3
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-RD-UI-FD-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/Vazirmatn-RD-UI-NL-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/Vazirmatn-RD-UI-NL-font-face.css
new file mode 100644
index 00000000..1d81975f
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/Vazirmatn-RD-UI-NL-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI NL;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-NL-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Black.ttf
new file mode 100644
index 00000000..ecc52aed
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Bold.ttf
new file mode 100644
index 00000000..6aa7c12c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-ExtraBold.ttf
new file mode 100644
index 00000000..e463b79e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-ExtraLight.ttf
new file mode 100644
index 00000000..8132b054
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Light.ttf
new file mode 100644
index 00000000..1811fbeb
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Medium.ttf
new file mode 100644
index 00000000..65438c41
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Regular.ttf
new file mode 100644
index 00000000..40ddd51c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-SemiBold.ttf
new file mode 100644
index 00000000..7be5336e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Thin.ttf
new file mode 100644
index 00000000..e28d9f0c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-RD-UI-NL-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Black.woff2
new file mode 100644
index 00000000..b4c006b6
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Bold.woff2
new file mode 100644
index 00000000..6b8f9dc7
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-ExtraBold.woff2
new file mode 100644
index 00000000..0990cb8c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-ExtraLight.woff2
new file mode 100644
index 00000000..31ca9369
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Light.woff2
new file mode 100644
index 00000000..a00368aa
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Medium.woff2
new file mode 100644
index 00000000..6debf0c9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Regular.woff2
new file mode 100644
index 00000000..bd84edb8
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-SemiBold.woff2
new file mode 100644
index 00000000..e3f5f07c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Thin.woff2
new file mode 100644
index 00000000..2720676e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-RD-UI-NL-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/Vazirmatn-RD-UI-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/Vazirmatn-RD-UI-font-face.css
new file mode 100644
index 00000000..e547f832
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/Vazirmatn-RD-UI-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn RD UI;
+ src: url('fonts/webfonts/Vazirmatn-RD-UI-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Black.ttf
new file mode 100644
index 00000000..e06e2b45
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Bold.ttf
new file mode 100644
index 00000000..39ee4488
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-ExtraBold.ttf
new file mode 100644
index 00000000..9b407438
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-ExtraLight.ttf
new file mode 100644
index 00000000..349be2cd
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Light.ttf
new file mode 100644
index 00000000..ee5abd6d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Medium.ttf
new file mode 100644
index 00000000..b5babac2
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Regular.ttf
new file mode 100644
index 00000000..a1518925
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-SemiBold.ttf
new file mode 100644
index 00000000..6ebfba3d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Thin.ttf
new file mode 100644
index 00000000..3bfee54d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/ttf/Vazirmatn-RD-UI-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Black.woff2
new file mode 100644
index 00000000..c1cbf367
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Bold.woff2
new file mode 100644
index 00000000..d25f185e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-ExtraBold.woff2
new file mode 100644
index 00000000..22e9e4f6
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-ExtraLight.woff2
new file mode 100644
index 00000000..71185c16
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Light.woff2
new file mode 100644
index 00000000..f168ba60
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Medium.woff2
new file mode 100644
index 00000000..8d7028c4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Regular.woff2
new file mode 100644
index 00000000..c99d1dac
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-SemiBold.woff2
new file mode 100644
index 00000000..778f6fc3
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Thin.woff2
new file mode 100644
index 00000000..f79b6a29
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/Round-Dots/misc/UI/fonts/webfonts/Vazirmatn-RD-UI-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Vazirmatn-Variable-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Vazirmatn-Variable-font-face.css
new file mode 100644
index 00000000..9b7e8c6e
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Vazirmatn-Variable-font-face.css
@@ -0,0 +1,8 @@
+@font-face {
+ font-family: 'Vazirmatn';
+ src: url('fonts/webfonts/Vazirmatn[wght].woff2') format('woff2 supports variations'),
+ url('fonts/webfonts/Vazirmatn[wght].woff2') format('woff2-variations');
+ font-weight: 100 900;
+ font-style: normal;
+ font-display: swap;
+}
\ No newline at end of file
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/Vazirmatn-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/Vazirmatn-font-face.css
new file mode 100644
index 00000000..9d625acd
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/Vazirmatn-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn;
+ src: url('fonts/webfonts/Vazirmatn-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Black.ttf
new file mode 100644
index 00000000..4b9bd661
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Bold.ttf
new file mode 100644
index 00000000..efa9b095
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-ExtraBold.ttf
new file mode 100644
index 00000000..380bd158
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-ExtraLight.ttf
new file mode 100644
index 00000000..b7b947e6
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Light.ttf
new file mode 100644
index 00000000..2dfd5c35
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Medium.ttf
new file mode 100644
index 00000000..1e08dd54
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Regular.ttf
new file mode 100644
index 00000000..64e4a818
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-SemiBold.ttf
new file mode 100644
index 00000000..6b3842ac
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Thin.ttf
new file mode 100644
index 00000000..b7a7d233
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/ttf/Vazirmatn-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/variable/Vazirmatn[wght].ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/variable/Vazirmatn[wght].ttf
new file mode 100644
index 00000000..b02ceb05
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/variable/Vazirmatn[wght].ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Black.woff2
new file mode 100644
index 00000000..f08cace8
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Bold.woff2
new file mode 100644
index 00000000..65b427f8
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-ExtraBold.woff2
new file mode 100644
index 00000000..c074e70f
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-ExtraLight.woff2
new file mode 100644
index 00000000..997dea07
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Light.woff2
new file mode 100644
index 00000000..d154722a
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Medium.woff2
new file mode 100644
index 00000000..495af757
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Regular.woff2
new file mode 100644
index 00000000..c9824c87
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-SemiBold.woff2
new file mode 100644
index 00000000..53016415
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Thin.woff2
new file mode 100644
index 00000000..b7df2782
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn[wght].woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn[wght].woff2
new file mode 100644
index 00000000..a501289a
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/fonts/webfonts/Vazirmatn[wght].woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/Vazirmatn-FD-NL-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/Vazirmatn-FD-NL-font-face.css
new file mode 100644
index 00000000..664c44c0
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/Vazirmatn-FD-NL-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD NL;
+ src: url('fonts/webfonts/Vazirmatn-FD-NL-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Black.ttf
new file mode 100644
index 00000000..dde4d053
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Bold.ttf
new file mode 100644
index 00000000..89dec5cc
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-ExtraBold.ttf
new file mode 100644
index 00000000..5b02de89
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-ExtraLight.ttf
new file mode 100644
index 00000000..552440c6
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Light.ttf
new file mode 100644
index 00000000..39a245f4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Medium.ttf
new file mode 100644
index 00000000..7134ba5d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Regular.ttf
new file mode 100644
index 00000000..ff9b5033
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-SemiBold.ttf
new file mode 100644
index 00000000..0dfab7f0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Thin.ttf
new file mode 100644
index 00000000..c220bb74
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-FD-NL-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Black.woff2
new file mode 100644
index 00000000..3dd1eb00
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Bold.woff2
new file mode 100644
index 00000000..8c41d970
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-ExtraBold.woff2
new file mode 100644
index 00000000..0e282fec
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-ExtraLight.woff2
new file mode 100644
index 00000000..2a89457b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Light.woff2
new file mode 100644
index 00000000..b830c7d4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Medium.woff2
new file mode 100644
index 00000000..36b116e5
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Regular.woff2
new file mode 100644
index 00000000..7c9285a2
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-SemiBold.woff2
new file mode 100644
index 00000000..26da2afd
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Thin.woff2
new file mode 100644
index 00000000..5e5600b5
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-FD-NL-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/Vazirmatn-FD-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/Vazirmatn-FD-font-face.css
new file mode 100644
index 00000000..cbccbc84
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/Vazirmatn-FD-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn FD;
+ src: url('fonts/webfonts/Vazirmatn-FD-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Black.ttf
new file mode 100644
index 00000000..cf09256a
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Bold.ttf
new file mode 100644
index 00000000..8a08b749
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-ExtraBold.ttf
new file mode 100644
index 00000000..1e29bc97
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-ExtraLight.ttf
new file mode 100644
index 00000000..d8126776
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Light.ttf
new file mode 100644
index 00000000..1241e29f
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Medium.ttf
new file mode 100644
index 00000000..f7f2aa94
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Regular.ttf
new file mode 100644
index 00000000..a5f5deac
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-SemiBold.ttf
new file mode 100644
index 00000000..fe384e68
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Thin.ttf
new file mode 100644
index 00000000..eaada002
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/ttf/Vazirmatn-FD-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Black.woff2
new file mode 100644
index 00000000..251a9237
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Bold.woff2
new file mode 100644
index 00000000..f97f0dbe
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-ExtraBold.woff2
new file mode 100644
index 00000000..e2b2d317
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-ExtraLight.woff2
new file mode 100644
index 00000000..d019c922
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Light.woff2
new file mode 100644
index 00000000..41d75fb0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Medium.woff2
new file mode 100644
index 00000000..27212370
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Regular.woff2
new file mode 100644
index 00000000..ac7cff8f
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-SemiBold.woff2
new file mode 100644
index 00000000..359e57e3
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Thin.woff2
new file mode 100644
index 00000000..d9cfb370
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Farsi-Digits/fonts/webfonts/Vazirmatn-FD-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/Vazirmatn-NL-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/Vazirmatn-NL-font-face.css
new file mode 100644
index 00000000..5b086ae3
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/Vazirmatn-NL-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn NL;
+ src: url('fonts/webfonts/Vazirmatn-NL-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Black.ttf
new file mode 100644
index 00000000..d777ec50
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Bold.ttf
new file mode 100644
index 00000000..419275df
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-ExtraBold.ttf
new file mode 100644
index 00000000..fd954548
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-ExtraLight.ttf
new file mode 100644
index 00000000..61cb1bf9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Light.ttf
new file mode 100644
index 00000000..e7d39ef6
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Medium.ttf
new file mode 100644
index 00000000..9f8c0ebd
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Regular.ttf
new file mode 100644
index 00000000..265d8bac
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-SemiBold.ttf
new file mode 100644
index 00000000..87b62c21
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Thin.ttf
new file mode 100644
index 00000000..769abb22
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/ttf/Vazirmatn-NL-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/variable/Vazirmatn-NL[wght].ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/variable/Vazirmatn-NL[wght].ttf
new file mode 100644
index 00000000..8d6ae604
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/variable/Vazirmatn-NL[wght].ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Black.woff2
new file mode 100644
index 00000000..355cf741
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Bold.woff2
new file mode 100644
index 00000000..d924f298
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-ExtraBold.woff2
new file mode 100644
index 00000000..f75949f9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-ExtraLight.woff2
new file mode 100644
index 00000000..63eb9d04
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Light.woff2
new file mode 100644
index 00000000..c60fd2d0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Medium.woff2
new file mode 100644
index 00000000..cc41a1eb
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Regular.woff2
new file mode 100644
index 00000000..bd0589b7
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-SemiBold.woff2
new file mode 100644
index 00000000..65417277
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Thin.woff2
new file mode 100644
index 00000000..77992a84
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL[wght].woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL[wght].woff2
new file mode 100644
index 00000000..949ad263
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/Non-Latin/fonts/webfonts/Vazirmatn-NL[wght].woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/Vazirmatn-UI-FD-NL-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/Vazirmatn-UI-FD-NL-font-face.css
new file mode 100644
index 00000000..5acc2fed
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/Vazirmatn-UI-FD-NL-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-NL-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Black.ttf
new file mode 100644
index 00000000..bf59f015
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Bold.ttf
new file mode 100644
index 00000000..e70490c3
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-ExtraBold.ttf
new file mode 100644
index 00000000..6c626819
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-ExtraLight.ttf
new file mode 100644
index 00000000..c1ee4673
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Light.ttf
new file mode 100644
index 00000000..e1aa5183
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Medium.ttf
new file mode 100644
index 00000000..c05c32ea
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Regular.ttf
new file mode 100644
index 00000000..7ff26d48
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-SemiBold.ttf
new file mode 100644
index 00000000..598379d2
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Thin.ttf
new file mode 100644
index 00000000..718972c9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/ttf/Vazirmatn-UI-FD-NL-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Black.woff2
new file mode 100644
index 00000000..ec576946
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Bold.woff2
new file mode 100644
index 00000000..8048291f
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-ExtraBold.woff2
new file mode 100644
index 00000000..70018ea8
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-ExtraLight.woff2
new file mode 100644
index 00000000..062f4627
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Light.woff2
new file mode 100644
index 00000000..73348a33
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Medium.woff2
new file mode 100644
index 00000000..764aa6a8
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Regular.woff2
new file mode 100644
index 00000000..13adfe8a
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-SemiBold.woff2
new file mode 100644
index 00000000..1da3f3d0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Thin.woff2
new file mode 100644
index 00000000..3f6199bb
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits-Non-Latin/fonts/webfonts/Vazirmatn-UI-FD-NL-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/Vazirmatn-UI-FD-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/Vazirmatn-UI-FD-font-face.css
new file mode 100644
index 00000000..15c96804
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/Vazirmatn-UI-FD-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI FD;
+ src: url('fonts/webfonts/Vazirmatn-UI-FD-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Black.ttf
new file mode 100644
index 00000000..e2083df0
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Bold.ttf
new file mode 100644
index 00000000..0354ca3e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-ExtraBold.ttf
new file mode 100644
index 00000000..6b91e789
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-ExtraLight.ttf
new file mode 100644
index 00000000..c6c3d8fc
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Light.ttf
new file mode 100644
index 00000000..65668b1c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Medium.ttf
new file mode 100644
index 00000000..86baad59
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Regular.ttf
new file mode 100644
index 00000000..ecbd2d7d
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-SemiBold.ttf
new file mode 100644
index 00000000..30b4f038
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Thin.ttf
new file mode 100644
index 00000000..57b21b34
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/ttf/Vazirmatn-UI-FD-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Black.woff2
new file mode 100644
index 00000000..4ca8ab0e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Bold.woff2
new file mode 100644
index 00000000..8a4cceda
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-ExtraBold.woff2
new file mode 100644
index 00000000..8c242c4b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-ExtraLight.woff2
new file mode 100644
index 00000000..40bb0a7b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Light.woff2
new file mode 100644
index 00000000..3df3b744
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Medium.woff2
new file mode 100644
index 00000000..05029712
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Regular.woff2
new file mode 100644
index 00000000..0af837f2
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-SemiBold.woff2
new file mode 100644
index 00000000..85465b50
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Thin.woff2
new file mode 100644
index 00000000..9ea69e3c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Farsi-Digits/fonts/webfonts/Vazirmatn-UI-FD-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/Vazirmatn-UI-NL-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/Vazirmatn-UI-NL-font-face.css
new file mode 100644
index 00000000..4f9d1b9f
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/Vazirmatn-UI-NL-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI NL;
+ src: url('fonts/webfonts/Vazirmatn-UI-NL-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Black.ttf
new file mode 100644
index 00000000..95447b48
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Bold.ttf
new file mode 100644
index 00000000..34aa1dba
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-ExtraBold.ttf
new file mode 100644
index 00000000..ebb87690
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-ExtraLight.ttf
new file mode 100644
index 00000000..6ececda7
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Light.ttf
new file mode 100644
index 00000000..95f8453e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Medium.ttf
new file mode 100644
index 00000000..cdeca0dd
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Regular.ttf
new file mode 100644
index 00000000..9deb47ee
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-SemiBold.ttf
new file mode 100644
index 00000000..3255b93a
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Thin.ttf
new file mode 100644
index 00000000..dde0662e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/ttf/Vazirmatn-UI-NL-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Black.woff2
new file mode 100644
index 00000000..8bbdbdf4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Bold.woff2
new file mode 100644
index 00000000..baeb0262
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-ExtraBold.woff2
new file mode 100644
index 00000000..f72c635b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-ExtraLight.woff2
new file mode 100644
index 00000000..3b6e6114
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Light.woff2
new file mode 100644
index 00000000..a1a1e290
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Medium.woff2
new file mode 100644
index 00000000..42f09bf4
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Regular.woff2
new file mode 100644
index 00000000..3ce577ae
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-SemiBold.woff2
new file mode 100644
index 00000000..d97b240e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Thin.woff2
new file mode 100644
index 00000000..4192b54b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI-Non-Latin/fonts/webfonts/Vazirmatn-UI-NL-Thin.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/Vazirmatn-UI-font-face.css b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/Vazirmatn-UI-font-face.css
new file mode 100644
index 00000000..26693f99
--- /dev/null
+++ b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/Vazirmatn-UI-font-face.css
@@ -0,0 +1,72 @@
+/* Generated by script */
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-Thin.woff2') format('woff2');
+ font-weight: 100;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-ExtraLight.woff2') format('woff2');
+ font-weight: 200;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-Light.woff2') format('woff2');
+ font-weight: 300;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-Regular.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-Medium.woff2') format('woff2');
+ font-weight: 500;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-SemiBold.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-Bold.woff2') format('woff2');
+ font-weight: 700;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-ExtraBold.woff2') format('woff2');
+ font-weight: 800;
+ font-style: normal;
+ font-display: swap;
+}
+
+@font-face {
+ font-family: Vazirmatn UI;
+ src: url('fonts/webfonts/Vazirmatn-UI-Black.woff2') format('woff2');
+ font-weight: 900;
+ font-style: normal;
+ font-display: swap;
+}
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Black.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Black.ttf
new file mode 100644
index 00000000..bc422d46
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Black.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Bold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Bold.ttf
new file mode 100644
index 00000000..b76f47e9
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Bold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-ExtraBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-ExtraBold.ttf
new file mode 100644
index 00000000..0747a452
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-ExtraBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-ExtraLight.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-ExtraLight.ttf
new file mode 100644
index 00000000..ef464272
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-ExtraLight.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Light.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Light.ttf
new file mode 100644
index 00000000..ebfca7ac
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Light.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Medium.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Medium.ttf
new file mode 100644
index 00000000..caa2056c
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Medium.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Regular.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Regular.ttf
new file mode 100644
index 00000000..0b68e819
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Regular.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-SemiBold.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-SemiBold.ttf
new file mode 100644
index 00000000..9eff472f
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-SemiBold.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Thin.ttf b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Thin.ttf
new file mode 100644
index 00000000..11b55978
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/ttf/Vazirmatn-UI-Thin.ttf differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Black.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Black.woff2
new file mode 100644
index 00000000..48194132
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Black.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Bold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Bold.woff2
new file mode 100644
index 00000000..ae0916fa
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Bold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-ExtraBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-ExtraBold.woff2
new file mode 100644
index 00000000..27c3930e
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-ExtraBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-ExtraLight.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-ExtraLight.woff2
new file mode 100644
index 00000000..7aed8e44
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-ExtraLight.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Light.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Light.woff2
new file mode 100644
index 00000000..6b6e0120
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Light.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Medium.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Medium.woff2
new file mode 100644
index 00000000..5ccb6421
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Medium.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Regular.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Regular.woff2
new file mode 100644
index 00000000..7deef0cb
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Regular.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-SemiBold.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-SemiBold.woff2
new file mode 100644
index 00000000..1d6d937b
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-SemiBold.woff2 differ
diff --git a/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Thin.woff2 b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Thin.woff2
new file mode 100644
index 00000000..1dee3725
Binary files /dev/null and b/apps/level_up/public/fonts/vazirmatn-v33.003/misc/UI/fonts/webfonts/Vazirmatn-UI-Thin.woff2 differ
diff --git "a/apps/level_up/public/fonts/vazirmatn-v33.003/\330\261\330\247\331\207\331\206\331\205\330\247.txt" "b/apps/level_up/public/fonts/vazirmatn-v33.003/\330\261\330\247\331\207\331\206\331\205\330\247.txt"
new file mode 100644
index 00000000..86f077e6
--- /dev/null
+++ "b/apps/level_up/public/fonts/vazirmatn-v33.003/\330\261\330\247\331\207\331\206\331\205\330\247.txt"
@@ -0,0 +1,5 @@
+لطفا برای مشاهده صفحات راهنما به وبسایت پروژه مراجعه کنید:
+https://rastikerdar.github.io/vazirmatn/
+
+مخزن پروژه:
+https://github.com/rastikerdar/vazirmatn
diff --git a/apps/level_up/public/gallary/gamecraft-1.jpg b/apps/level_up/public/gallary/gamecraft-1.jpg
new file mode 100644
index 00000000..d4ace19d
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-1.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-10.jpg b/apps/level_up/public/gallary/gamecraft-10.jpg
new file mode 100644
index 00000000..f3945fad
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-10.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-11.jpg b/apps/level_up/public/gallary/gamecraft-11.jpg
new file mode 100644
index 00000000..c8ff8232
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-11.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-12.jpg b/apps/level_up/public/gallary/gamecraft-12.jpg
new file mode 100644
index 00000000..21c52142
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-12.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-2.jpg b/apps/level_up/public/gallary/gamecraft-2.jpg
new file mode 100644
index 00000000..b7634631
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-2.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-3.jpg b/apps/level_up/public/gallary/gamecraft-3.jpg
new file mode 100644
index 00000000..b36d8e76
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-3.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-4.jpg b/apps/level_up/public/gallary/gamecraft-4.jpg
new file mode 100644
index 00000000..f9c334bd
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-4.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-5.jpg b/apps/level_up/public/gallary/gamecraft-5.jpg
new file mode 100644
index 00000000..f37f9a5d
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-5.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-6.jpg b/apps/level_up/public/gallary/gamecraft-6.jpg
new file mode 100644
index 00000000..3af3ae87
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-6.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-7.jpg b/apps/level_up/public/gallary/gamecraft-7.jpg
new file mode 100644
index 00000000..b784469b
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-7.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-8.jpg b/apps/level_up/public/gallary/gamecraft-8.jpg
new file mode 100644
index 00000000..fd5654b1
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-8.jpg differ
diff --git a/apps/level_up/public/gallary/gamecraft-9.jpg b/apps/level_up/public/gallary/gamecraft-9.jpg
new file mode 100644
index 00000000..dbd248bc
Binary files /dev/null and b/apps/level_up/public/gallary/gamecraft-9.jpg differ
diff --git a/apps/level_up/public/googled946bfc674156387(1).html b/apps/level_up/public/googled946bfc674156387(1).html
new file mode 100644
index 00000000..cbefe1d8
--- /dev/null
+++ b/apps/level_up/public/googled946bfc674156387(1).html
@@ -0,0 +1 @@
+google-site-verification: googled946bfc674156387.html
\ No newline at end of file
diff --git a/apps/level_up/public/images/2025/staffs/AliAghaee.jpg b/apps/level_up/public/images/2025/staffs/AliAghaee.jpg
new file mode 100644
index 00000000..50d4adb8
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AliAghaee.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AliMoghaddam.jpg b/apps/level_up/public/images/2025/staffs/AliMoghaddam.jpg
new file mode 100644
index 00000000..75644b58
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AliMoghaddam.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AliMohamadi.jpg b/apps/level_up/public/images/2025/staffs/AliMohamadi.jpg
new file mode 100644
index 00000000..5ee4bfc7
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AliMohamadi.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AlirezaAtharifard.jpg b/apps/level_up/public/images/2025/staffs/AlirezaAtharifard.jpg
new file mode 100644
index 00000000..2d566100
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AlirezaAtharifard.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AlirezaNikooei.jpg b/apps/level_up/public/images/2025/staffs/AlirezaNikooei.jpg
new file mode 100644
index 00000000..4ab7c577
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AlirezaNikooei.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AlirezaSafari.jpg b/apps/level_up/public/images/2025/staffs/AlirezaSafari.jpg
new file mode 100644
index 00000000..447d7b58
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AlirezaSafari.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AlirezaYousefpour.jpg b/apps/level_up/public/images/2025/staffs/AlirezaYousefpour.jpg
new file mode 100644
index 00000000..e9c77f17
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AlirezaYousefpour.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AminRezaeeyan.jpg b/apps/level_up/public/images/2025/staffs/AminRezaeeyan.jpg
new file mode 100644
index 00000000..bdd43d1c
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AminRezaeeyan.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AmirabbasEntezari.jpg b/apps/level_up/public/images/2025/staffs/AmirabbasEntezari.jpg
new file mode 100644
index 00000000..6a3c77f1
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AmirabbasEntezari.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AmiraliZakeri.jpg b/apps/level_up/public/images/2025/staffs/AmiraliZakeri.jpg
new file mode 100644
index 00000000..1a006bd6
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AmiraliZakeri.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AmirhosseinAghighi.jpg b/apps/level_up/public/images/2025/staffs/AmirhosseinAghighi.jpg
new file mode 100644
index 00000000..d5336ad2
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AmirhosseinAghighi.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/ArianMohseni.png b/apps/level_up/public/images/2025/staffs/ArianMohseni.png
new file mode 100644
index 00000000..2ca2db74
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/ArianMohseni.png differ
diff --git a/apps/level_up/public/images/2025/staffs/ArminaMotaghi.jpg b/apps/level_up/public/images/2025/staffs/ArminaMotaghi.jpg
new file mode 100644
index 00000000..6146f9a3
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/ArminaMotaghi.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AsalJlz.jpg b/apps/level_up/public/images/2025/staffs/AsalJlz.jpg
new file mode 100644
index 00000000..2f5fda19
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AsalJlz.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AshkanChaji.jpg b/apps/level_up/public/images/2025/staffs/AshkanChaji.jpg
new file mode 100644
index 00000000..75052874
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AshkanChaji.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/AvaMostanbet.jpg b/apps/level_up/public/images/2025/staffs/AvaMostanbet.jpg
new file mode 100644
index 00000000..770ecc53
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/AvaMostanbet.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/BehradHozouri.jpg b/apps/level_up/public/images/2025/staffs/BehradHozouri.jpg
new file mode 100644
index 00000000..c845b84a
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/BehradHozouri.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/DelaraamRoohani.jpg b/apps/level_up/public/images/2025/staffs/DelaraamRoohani.jpg
new file mode 100644
index 00000000..1ae50f54
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/DelaraamRoohani.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/ElnazBaharvand.jpg b/apps/level_up/public/images/2025/staffs/ElnazBaharvand.jpg
new file mode 100644
index 00000000..23e0b270
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/ElnazBaharvand.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/FatemehSadatMoujani.jpeg b/apps/level_up/public/images/2025/staffs/FatemehSadatMoujani.jpeg
new file mode 100644
index 00000000..c0007832
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/FatemehSadatMoujani.jpeg differ
diff --git a/apps/level_up/public/images/2025/staffs/HessamHosseinian.jpg b/apps/level_up/public/images/2025/staffs/HessamHosseinian.jpg
new file mode 100644
index 00000000..2d292a64
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/HessamHosseinian.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/IMG_6957 - asal Jlz.jpg b/apps/level_up/public/images/2025/staffs/IMG_6957 - asal Jlz.jpg
new file mode 100644
index 00000000..2f5fda19
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/IMG_6957 - asal Jlz.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/MahdiHaeri.jpg b/apps/level_up/public/images/2025/staffs/MahdiHaeri.jpg
new file mode 100644
index 00000000..5eeea613
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MahdiHaeri.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/MahdiNajibpour.png b/apps/level_up/public/images/2025/staffs/MahdiNajibpour.png
new file mode 100644
index 00000000..380ecdeb
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MahdiNajibpour.png differ
diff --git a/apps/level_up/public/images/2025/staffs/MahdiehTahami.jpg b/apps/level_up/public/images/2025/staffs/MahdiehTahami.jpg
new file mode 100644
index 00000000..17bb5f4f
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MahdiehTahami.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/MatinDehghanipor.jpg b/apps/level_up/public/images/2025/staffs/MatinDehghanipor.jpg
new file mode 100644
index 00000000..39a1d30f
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MatinDehghanipor.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/MelikaGhasemipour.jpg b/apps/level_up/public/images/2025/staffs/MelikaGhasemipour.jpg
new file mode 100644
index 00000000..fc547232
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MelikaGhasemipour.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/MoeinEnayati.png b/apps/level_up/public/images/2025/staffs/MoeinEnayati.png
new file mode 100644
index 00000000..cb5f7711
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MoeinEnayati.png differ
diff --git a/apps/level_up/public/images/2025/staffs/MohammadEshratabadi.jpg b/apps/level_up/public/images/2025/staffs/MohammadEshratabadi.jpg
new file mode 100644
index 00000000..7e557621
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MohammadEshratabadi.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/MohammadJavadAkbari.jpg b/apps/level_up/public/images/2025/staffs/MohammadJavadAkbari.jpg
new file mode 100644
index 00000000..dc3dd951
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MohammadJavadAkbari.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/MohammadrafiDavaji.jpg b/apps/level_up/public/images/2025/staffs/MohammadrafiDavaji.jpg
new file mode 100644
index 00000000..c5cf7776
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/MohammadrafiDavaji.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/NargesTakallu.jpg b/apps/level_up/public/images/2025/staffs/NargesTakallu.jpg
new file mode 100644
index 00000000..3071fcbd
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/NargesTakallu.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/ParnianEsfahani.jpg b/apps/level_up/public/images/2025/staffs/ParnianEsfahani.jpg
new file mode 100644
index 00000000..b74826ad
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/ParnianEsfahani.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/ParnianJavadi.jpg b/apps/level_up/public/images/2025/staffs/ParnianJavadi.jpg
new file mode 100644
index 00000000..f3183f4c
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/ParnianJavadi.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/ParsaSamareh.jpg b/apps/level_up/public/images/2025/staffs/ParsaSamareh.jpg
new file mode 100644
index 00000000..970e6e7b
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/ParsaSamareh.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/PouryaFahimi.jpg b/apps/level_up/public/images/2025/staffs/PouryaFahimi.jpg
new file mode 100644
index 00000000..7472fea4
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/PouryaFahimi.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/RezaAdinepour.jpg b/apps/level_up/public/images/2025/staffs/RezaAdinepour.jpg
new file mode 100644
index 00000000..aaedd6f6
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/RezaAdinepour.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/RoseNazeri.jpg b/apps/level_up/public/images/2025/staffs/RoseNazeri.jpg
new file mode 100644
index 00000000..d18b24e2
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/RoseNazeri.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/SabaSeyedtabaei.jpg b/apps/level_up/public/images/2025/staffs/SabaSeyedtabaei.jpg
new file mode 100644
index 00000000..3453e47f
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/SabaSeyedtabaei.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/SetayeshYavari.jpg b/apps/level_up/public/images/2025/staffs/SetayeshYavari.jpg
new file mode 100644
index 00000000..8edf39ac
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/SetayeshYavari.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/ShadiYousefabadi.jpg b/apps/level_up/public/images/2025/staffs/ShadiYousefabadi.jpg
new file mode 100644
index 00000000..54724b7c
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/ShadiYousefabadi.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/SoroushNanbakhsh.jpg b/apps/level_up/public/images/2025/staffs/SoroushNanbakhsh.jpg
new file mode 100644
index 00000000..c4ed873c
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/SoroushNanbakhsh.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/ZahraSheikhi.jpg b/apps/level_up/public/images/2025/staffs/ZahraSheikhi.jpg
new file mode 100644
index 00000000..2a200309
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/ZahraSheikhi.jpg differ
diff --git a/apps/level_up/public/images/2025/staffs/hero.gif b/apps/level_up/public/images/2025/staffs/hero.gif
new file mode 100644
index 00000000..7a02088f
Binary files /dev/null and b/apps/level_up/public/images/2025/staffs/hero.gif differ
diff --git a/apps/level_up/public/images/Luigi.jpg b/apps/level_up/public/images/Luigi.jpg
new file mode 100644
index 00000000..8c3a9611
Binary files /dev/null and b/apps/level_up/public/images/Luigi.jpg differ
diff --git a/apps/level_up/public/images/LuigiSquare.jpg b/apps/level_up/public/images/LuigiSquare.jpg
new file mode 100644
index 00000000..7a53110d
Binary files /dev/null and b/apps/level_up/public/images/LuigiSquare.jpg differ
diff --git a/apps/level_up/public/images/SuperMario.jpg b/apps/level_up/public/images/SuperMario.jpg
new file mode 100644
index 00000000..d7d109ed
Binary files /dev/null and b/apps/level_up/public/images/SuperMario.jpg differ
diff --git a/apps/level_up/public/images/SuperMarioSquare.jpg b/apps/level_up/public/images/SuperMarioSquare.jpg
new file mode 100644
index 00000000..079ebd6e
Binary files /dev/null and b/apps/level_up/public/images/SuperMarioSquare.jpg differ
diff --git a/apps/level_up/public/images/course.png b/apps/level_up/public/images/course.png
new file mode 100644
index 00000000..610f6790
Binary files /dev/null and b/apps/level_up/public/images/course.png differ
diff --git a/apps/level_up/public/images/dark-3d.svg b/apps/level_up/public/images/dark-3d.svg
new file mode 100644
index 00000000..b3bfd8ae
--- /dev/null
+++ b/apps/level_up/public/images/dark-3d.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/images/light-3d-bulb.svg b/apps/level_up/public/images/light-3d-bulb.svg
new file mode 100644
index 00000000..5dc208da
--- /dev/null
+++ b/apps/level_up/public/images/light-3d-bulb.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/images/light-3d.svg b/apps/level_up/public/images/light-3d.svg
new file mode 100644
index 00000000..a7a0da73
--- /dev/null
+++ b/apps/level_up/public/images/light-3d.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/images/logo/3d-dark.png b/apps/level_up/public/images/logo/3d-dark.png
new file mode 100644
index 00000000..2202ab63
Binary files /dev/null and b/apps/level_up/public/images/logo/3d-dark.png differ
diff --git a/apps/level_up/public/images/logo/Asset 4.png b/apps/level_up/public/images/logo/Asset 4.png
new file mode 100644
index 00000000..75793b58
Binary files /dev/null and b/apps/level_up/public/images/logo/Asset 4.png differ
diff --git a/apps/level_up/public/images/logo/IranServer.png b/apps/level_up/public/images/logo/IranServer.png
new file mode 100644
index 00000000..de64c1ab
Binary files /dev/null and b/apps/level_up/public/images/logo/IranServer.png differ
diff --git a/apps/level_up/public/images/logo/avngames.png b/apps/level_up/public/images/logo/avngames.png
new file mode 100644
index 00000000..803254e8
Binary files /dev/null and b/apps/level_up/public/images/logo/avngames.png differ
diff --git a/apps/level_up/public/images/logo/black-cube.png b/apps/level_up/public/images/logo/black-cube.png
new file mode 100644
index 00000000..73431575
Binary files /dev/null and b/apps/level_up/public/images/logo/black-cube.png differ
diff --git a/apps/level_up/public/images/logo/brainladder.png b/apps/level_up/public/images/logo/brainladder.png
new file mode 100644
index 00000000..b0b7a607
Binary files /dev/null and b/apps/level_up/public/images/logo/brainladder.png differ
diff --git a/apps/level_up/public/images/logo/crown.png b/apps/level_up/public/images/logo/crown.png
new file mode 100644
index 00000000..c11b449f
Binary files /dev/null and b/apps/level_up/public/images/logo/crown.png differ
diff --git a/apps/level_up/public/images/logo/dark-3d.png b/apps/level_up/public/images/logo/dark-3d.png
new file mode 100644
index 00000000..b0ace205
Binary files /dev/null and b/apps/level_up/public/images/logo/dark-3d.png differ
diff --git a/apps/level_up/public/images/logo/default_prof.jpg b/apps/level_up/public/images/logo/default_prof.jpg
new file mode 100644
index 00000000..3adfd6db
Binary files /dev/null and b/apps/level_up/public/images/logo/default_prof.jpg differ
diff --git a/apps/level_up/public/images/logo/dream-event.png b/apps/level_up/public/images/logo/dream-event.png
new file mode 100644
index 00000000..768683b2
Binary files /dev/null and b/apps/level_up/public/images/logo/dream-event.png differ
diff --git a/apps/level_up/public/images/logo/dropout.png b/apps/level_up/public/images/logo/dropout.png
new file mode 100644
index 00000000..e567a9c7
Binary files /dev/null and b/apps/level_up/public/images/logo/dropout.png differ
diff --git a/apps/level_up/public/images/logo/folan.png b/apps/level_up/public/images/logo/folan.png
new file mode 100644
index 00000000..841caefc
Binary files /dev/null and b/apps/level_up/public/images/logo/folan.png differ
diff --git a/apps/level_up/public/images/logo/folan4.png b/apps/level_up/public/images/logo/folan4.png
new file mode 100644
index 00000000..9884c494
Binary files /dev/null and b/apps/level_up/public/images/logo/folan4.png differ
diff --git a/apps/level_up/public/images/logo/folan_2.png b/apps/level_up/public/images/logo/folan_2.png
new file mode 100644
index 00000000..de75a863
Binary files /dev/null and b/apps/level_up/public/images/logo/folan_2.png differ
diff --git a/apps/level_up/public/images/logo/funtory.png b/apps/level_up/public/images/logo/funtory.png
new file mode 100644
index 00000000..3ee5c026
Binary files /dev/null and b/apps/level_up/public/images/logo/funtory.png differ
diff --git a/apps/level_up/public/images/logo/gameTestImage.jpg b/apps/level_up/public/images/logo/gameTestImage.jpg
new file mode 100644
index 00000000..6d081bfd
Binary files /dev/null and b/apps/level_up/public/images/logo/gameTestImage.jpg differ
diff --git a/apps/level_up/public/images/logo/hayahool.png b/apps/level_up/public/images/logo/hayahool.png
new file mode 100644
index 00000000..b4407329
Binary files /dev/null and b/apps/level_up/public/images/logo/hayahool.png differ
diff --git a/apps/level_up/public/images/logo/institue.png b/apps/level_up/public/images/logo/institue.png
new file mode 100644
index 00000000..48e0bfe4
Binary files /dev/null and b/apps/level_up/public/images/logo/institue.png differ
diff --git a/apps/level_up/public/images/logo/medrick-logo.png b/apps/level_up/public/images/logo/medrick-logo.png
new file mode 100644
index 00000000..71f4dcc9
Binary files /dev/null and b/apps/level_up/public/images/logo/medrick-logo.png differ
diff --git a/apps/level_up/public/images/logo/myket.png b/apps/level_up/public/images/logo/myket.png
new file mode 100644
index 00000000..12d1b09e
Binary files /dev/null and b/apps/level_up/public/images/logo/myket.png differ
diff --git a/apps/level_up/public/images/logo/pattern.jpg b/apps/level_up/public/images/logo/pattern.jpg
new file mode 100644
index 00000000..cf52a3b5
Binary files /dev/null and b/apps/level_up/public/images/logo/pattern.jpg differ
diff --git a/apps/level_up/public/images/logo/pattern.png b/apps/level_up/public/images/logo/pattern.png
new file mode 100644
index 00000000..d0735baa
Binary files /dev/null and b/apps/level_up/public/images/logo/pattern.png differ
diff --git a/apps/level_up/public/images/logo/pgj.png b/apps/level_up/public/images/logo/pgj.png
new file mode 100644
index 00000000..1c4b02c8
Binary files /dev/null and b/apps/level_up/public/images/logo/pgj.png differ
diff --git a/apps/level_up/public/images/logo/quiz of kings.png b/apps/level_up/public/images/logo/quiz of kings.png
new file mode 100644
index 00000000..e5744736
Binary files /dev/null and b/apps/level_up/public/images/logo/quiz of kings.png differ
diff --git a/apps/level_up/public/images/logo/ssc_white.png b/apps/level_up/public/images/logo/ssc_white.png
new file mode 100644
index 00000000..3dfaeeb7
Binary files /dev/null and b/apps/level_up/public/images/logo/ssc_white.png differ
diff --git a/apps/level_up/public/images/logo/tod.png b/apps/level_up/public/images/logo/tod.png
new file mode 100644
index 00000000..17b14491
Binary files /dev/null and b/apps/level_up/public/images/logo/tod.png differ
diff --git a/apps/level_up/public/images/pattern.png b/apps/level_up/public/images/pattern.png
new file mode 100644
index 00000000..85881471
Binary files /dev/null and b/apps/level_up/public/images/pattern.png differ
diff --git a/apps/level_up/public/lottie/Fireworks.lottie b/apps/level_up/public/lottie/Fireworks.lottie
new file mode 100644
index 00000000..57142f1f
Binary files /dev/null and b/apps/level_up/public/lottie/Fireworks.lottie differ
diff --git a/apps/level_up/public/mario/carnivorous-plant_528099.png b/apps/level_up/public/mario/carnivorous-plant_528099.png
new file mode 100644
index 00000000..7ebd7520
Binary files /dev/null and b/apps/level_up/public/mario/carnivorous-plant_528099.png differ
diff --git a/apps/level_up/public/mario/freepik__super_mario_theme_badge_cute.png b/apps/level_up/public/mario/freepik__super_mario_theme_badge_cute.png
new file mode 100644
index 00000000..0d0726a1
Binary files /dev/null and b/apps/level_up/public/mario/freepik__super_mario_theme_badge_cute.png differ
diff --git a/apps/level_up/public/mario/giphy-1.gif b/apps/level_up/public/mario/giphy-1.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-10.gif b/apps/level_up/public/mario/giphy-10.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-11.gif b/apps/level_up/public/mario/giphy-11.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-12.gif b/apps/level_up/public/mario/giphy-12.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-13.gif b/apps/level_up/public/mario/giphy-13.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-14.gif b/apps/level_up/public/mario/giphy-14.gif
new file mode 100644
index 00000000..bbda630d
Binary files /dev/null and b/apps/level_up/public/mario/giphy-14.gif differ
diff --git a/apps/level_up/public/mario/giphy-15.gif b/apps/level_up/public/mario/giphy-15.gif
new file mode 100644
index 00000000..f4f3c17d
Binary files /dev/null and b/apps/level_up/public/mario/giphy-15.gif differ
diff --git a/apps/level_up/public/mario/giphy-16.gif b/apps/level_up/public/mario/giphy-16.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-2.gif b/apps/level_up/public/mario/giphy-2.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-4.gif b/apps/level_up/public/mario/giphy-4.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-5.gif b/apps/level_up/public/mario/giphy-5.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-6.gif b/apps/level_up/public/mario/giphy-6.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-7.gif b/apps/level_up/public/mario/giphy-7.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-8.gif b/apps/level_up/public/mario/giphy-8.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/giphy-9.gif b/apps/level_up/public/mario/giphy-9.gif
new file mode 100644
index 00000000..e2f7a491
Binary files /dev/null and b/apps/level_up/public/mario/giphy-9.gif differ
diff --git a/apps/level_up/public/mario/giphy-coin.gif b/apps/level_up/public/mario/giphy-coin.gif
new file mode 100644
index 00000000..7f4841df
Binary files /dev/null and b/apps/level_up/public/mario/giphy-coin.gif differ
diff --git a/apps/level_up/public/mario/giphy.gif b/apps/level_up/public/mario/giphy.gif
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/level_up/public/mario/mario-friends.png b/apps/level_up/public/mario/mario-friends.png
new file mode 100644
index 00000000..a00ea5b8
Binary files /dev/null and b/apps/level_up/public/mario/mario-friends.png differ
diff --git a/apps/level_up/public/mario/mushroom.gif b/apps/level_up/public/mario/mushroom.gif
new file mode 100644
index 00000000..e2f7a491
Binary files /dev/null and b/apps/level_up/public/mario/mushroom.gif differ
diff --git a/apps/level_up/public/sound/super-mario-coin-sound.mp3 b/apps/level_up/public/sound/super-mario-coin-sound.mp3
new file mode 100644
index 00000000..7daf22fb
Binary files /dev/null and b/apps/level_up/public/sound/super-mario-coin-sound.mp3 differ
diff --git a/apps/level_up/public/sound/super-mario-jump-sound.mp3 b/apps/level_up/public/sound/super-mario-jump-sound.mp3
new file mode 100644
index 00000000..9ef5bee2
Binary files /dev/null and b/apps/level_up/public/sound/super-mario-jump-sound.mp3 differ
diff --git a/apps/level_up/public/svg/avatar-1.svg b/apps/level_up/public/svg/avatar-1.svg
new file mode 100644
index 00000000..20ed393a
--- /dev/null
+++ b/apps/level_up/public/svg/avatar-1.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/avatar-2.svg b/apps/level_up/public/svg/avatar-2.svg
new file mode 100644
index 00000000..84866e9e
--- /dev/null
+++ b/apps/level_up/public/svg/avatar-2.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/avatar-3.svg b/apps/level_up/public/svg/avatar-3.svg
new file mode 100644
index 00000000..d76751a2
--- /dev/null
+++ b/apps/level_up/public/svg/avatar-3.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/bubble-light-purple.svg b/apps/level_up/public/svg/bubble-light-purple.svg
new file mode 100644
index 00000000..8ddca33e
--- /dev/null
+++ b/apps/level_up/public/svg/bubble-light-purple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/level_up/public/svg/bubble-purple.svg b/apps/level_up/public/svg/bubble-purple.svg
new file mode 100644
index 00000000..b3937652
--- /dev/null
+++ b/apps/level_up/public/svg/bubble-purple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/level_up/public/svg/bubble-white.svg b/apps/level_up/public/svg/bubble-white.svg
new file mode 100644
index 00000000..f3961c56
--- /dev/null
+++ b/apps/level_up/public/svg/bubble-white.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/level_up/public/svg/dark-3d-bulb.svg b/apps/level_up/public/svg/dark-3d-bulb.svg
new file mode 100644
index 00000000..db7a00fa
--- /dev/null
+++ b/apps/level_up/public/svg/dark-3d-bulb.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/level_up/public/svg/dark-3d.svg b/apps/level_up/public/svg/dark-3d.svg
new file mode 100644
index 00000000..b3bfd8ae
--- /dev/null
+++ b/apps/level_up/public/svg/dark-3d.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/dark-flat-bulb.svg b/apps/level_up/public/svg/dark-flat-bulb.svg
new file mode 100644
index 00000000..bdbe7f7a
--- /dev/null
+++ b/apps/level_up/public/svg/dark-flat-bulb.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/dark-flat.svg b/apps/level_up/public/svg/dark-flat.svg
new file mode 100644
index 00000000..d813d66c
--- /dev/null
+++ b/apps/level_up/public/svg/dark-flat.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/discord.svg b/apps/level_up/public/svg/discord.svg
new file mode 100644
index 00000000..7e5553a6
--- /dev/null
+++ b/apps/level_up/public/svg/discord.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/level_up/public/svg/instagram.svg b/apps/level_up/public/svg/instagram.svg
new file mode 100644
index 00000000..4e1c525d
--- /dev/null
+++ b/apps/level_up/public/svg/instagram.svg
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/apps/level_up/public/svg/light-3d-bulb.svg b/apps/level_up/public/svg/light-3d-bulb.svg
new file mode 100644
index 00000000..5dc208da
--- /dev/null
+++ b/apps/level_up/public/svg/light-3d-bulb.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/light-3d.svg b/apps/level_up/public/svg/light-3d.svg
new file mode 100644
index 00000000..a7a0da73
--- /dev/null
+++ b/apps/level_up/public/svg/light-3d.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/light-flat-bulb.svg b/apps/level_up/public/svg/light-flat-bulb.svg
new file mode 100644
index 00000000..1523acc9
--- /dev/null
+++ b/apps/level_up/public/svg/light-flat-bulb.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/light-flat.svg b/apps/level_up/public/svg/light-flat.svg
new file mode 100644
index 00000000..82c17e39
--- /dev/null
+++ b/apps/level_up/public/svg/light-flat.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/pattern.svg b/apps/level_up/public/svg/pattern.svg
new file mode 100644
index 00000000..df3bb833
--- /dev/null
+++ b/apps/level_up/public/svg/pattern.svg
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/prize-1.svg b/apps/level_up/public/svg/prize-1.svg
new file mode 100644
index 00000000..480a6bf5
--- /dev/null
+++ b/apps/level_up/public/svg/prize-1.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/prize-2.svg b/apps/level_up/public/svg/prize-2.svg
new file mode 100644
index 00000000..fc63de5a
--- /dev/null
+++ b/apps/level_up/public/svg/prize-2.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/prize-3.svg b/apps/level_up/public/svg/prize-3.svg
new file mode 100644
index 00000000..32c2851d
--- /dev/null
+++ b/apps/level_up/public/svg/prize-3.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/sad-craft.svg b/apps/level_up/public/svg/sad-craft.svg
new file mode 100644
index 00000000..ae2a570b
--- /dev/null
+++ b/apps/level_up/public/svg/sad-craft.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/telegram.svg b/apps/level_up/public/svg/telegram.svg
new file mode 100644
index 00000000..1a7942a9
--- /dev/null
+++ b/apps/level_up/public/svg/telegram.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/level_up/public/svg/timline-1.svg b/apps/level_up/public/svg/timline-1.svg
new file mode 100644
index 00000000..ae444367
--- /dev/null
+++ b/apps/level_up/public/svg/timline-1.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/timline-2.svg b/apps/level_up/public/svg/timline-2.svg
new file mode 100644
index 00000000..b46a42e4
--- /dev/null
+++ b/apps/level_up/public/svg/timline-2.svg
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/timline-3.svg b/apps/level_up/public/svg/timline-3.svg
new file mode 100644
index 00000000..018c24b4
--- /dev/null
+++ b/apps/level_up/public/svg/timline-3.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/timline-4.svg b/apps/level_up/public/svg/timline-4.svg
new file mode 100644
index 00000000..6c700cb8
--- /dev/null
+++ b/apps/level_up/public/svg/timline-4.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/timline-5.svg b/apps/level_up/public/svg/timline-5.svg
new file mode 100644
index 00000000..c862488a
--- /dev/null
+++ b/apps/level_up/public/svg/timline-5.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/timline-6.svg b/apps/level_up/public/svg/timline-6.svg
new file mode 100644
index 00000000..90dac91d
--- /dev/null
+++ b/apps/level_up/public/svg/timline-6.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/level_up/public/svg/twitter.svg b/apps/level_up/public/svg/twitter.svg
new file mode 100644
index 00000000..1de45e6e
--- /dev/null
+++ b/apps/level_up/public/svg/twitter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/level_up/public/svg/wave-green.svg b/apps/level_up/public/svg/wave-green.svg
new file mode 100644
index 00000000..141d64cf
--- /dev/null
+++ b/apps/level_up/public/svg/wave-green.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/level_up/public/svg/wave-purple-light.svg b/apps/level_up/public/svg/wave-purple-light.svg
new file mode 100644
index 00000000..e698f190
--- /dev/null
+++ b/apps/level_up/public/svg/wave-purple-light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/level_up/public/svg/wave-purple.svg b/apps/level_up/public/svg/wave-purple.svg
new file mode 100644
index 00000000..05cd1d40
--- /dev/null
+++ b/apps/level_up/public/svg/wave-purple.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/apps/level_up/tailwind.config.ts b/apps/level_up/tailwind.config.ts
new file mode 100644
index 00000000..7b3f2823
--- /dev/null
+++ b/apps/level_up/tailwind.config.ts
@@ -0,0 +1,65 @@
+import type { Config } from "tailwindcss";
+
+const config: Config = {
+ content: [
+ "./pages/**/*.{js,ts,jsx,tsx,mdx}",
+ "./components/**/*.{js,ts,jsx,tsx,mdx}",
+ "./app/**/*.{js,ts,jsx,tsx,mdx}",
+ "./lib/**/*.{js,ts,jsx,tsx,mdx}",
+ "../../packages/ui/src/**/*.{js,ts,jsx,tsx,mdx}",
+ ],
+ theme: {
+ extend: {
+ fontFamily: {
+ estedad: ["Estedad", "sans-serif"],
+ vazirmatn: ["Vazirmatn", "sans-serif"],
+ "iran-yekan": ["IRANYekanX", "sans-serif"],
+ "sf-pro": ["SF Pro Rounded", "sans-serif"],
+ },
+ colors: {
+ // Your custom brand colors
+ primary: "#0056D2", // Bright blue
+ action: "#00C897", // Fresh green accent
+ "offline-workshop": "#4E6E81", // Muted teal
+
+ // Ant Design theme colors extracted from provider
+ "antd-primary": "#0056D2",
+ "antd-primary-hover": "#1E6DEB",
+ "antd-primary-active": "#0041A8",
+ "antd-success": "#00C897",
+ "antd-warning": "#FFC93C",
+ "antd-error": "#FF5A5F",
+
+ // Light theme colors
+ "antd-bg-base": "#ffffff",
+ "antd-bg-container": "#f9fafb",
+ "antd-bg-elevated": "#ffffff",
+ "antd-text": "#1a1a1a",
+ "antd-text-secondary": "#4b5563",
+ "antd-layout-header": "#0056D2",
+ "antd-layout-body": "#f4f6f8",
+
+ // Dark theme colors
+ "antd-dark-bg-base": "#0F172A",
+ "antd-dark-bg-container": "#1E293B",
+ "antd-dark-bg-elevated": "#27364A",
+ "antd-dark-text": "#F8FAFC",
+ "antd-dark-text-secondary": "#CBD5E1",
+ "antd-dark-layout-header": "#0056D2",
+ "antd-dark-layout-body": "#0F172A",
+ },
+ backgroundImage: {
+ "gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
+ "gradient-conic":
+ "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
+ },
+ },
+ },
+ plugins: [],
+ darkMode: "class",
+ corePlugins: {
+ preflight: false, // Disable to avoid conflicts with Ant Design
+ },
+};
+
+export default config;
diff --git a/apps/level_up/tsconfig.json b/apps/level_up/tsconfig.json
new file mode 100644
index 00000000..b5a17653
--- /dev/null
+++ b/apps/level_up/tsconfig.json
@@ -0,0 +1,33 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "baseUrl": ".",
+ "outDir": "dist",
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "noEmit": true,
+ "incremental": true,
+ "module": "esnext",
+ "esModuleInterop": true,
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "target": "ES2017",
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 70ad0103..bcc41d2e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -119,6 +119,109 @@ importers:
specifier: ^5.9.2
version: 5.9.2
+ apps/level_up:
+ dependencies:
+ '@ant-design/icons':
+ specifier: ^6.0.0
+ version: 6.0.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ '@ant-design/nextjs-registry':
+ specifier: ^1.1.0
+ version: 1.1.0(@ant-design/cssinjs@1.24.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(antd@5.27.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.5.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ '@ant-design/v5-patch-for-react-19':
+ specifier: ^1.0.3
+ version: 1.0.3(antd@5.27.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ '@bprogress/next':
+ specifier: ^3.2.12
+ version: 3.2.12(next@15.5.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ '@lottiefiles/dotlottie-react':
+ specifier: ^0.15.2
+ version: 0.15.2(react@19.1.1)
+ '@reduxjs/toolkit':
+ specifier: ^2.9.0
+ version: 2.9.0(react-redux@9.2.0(@types/react@19.1.12)(react@19.1.1)(redux@5.0.1))(react@19.1.1)
+ '@ssc/core':
+ specifier: workspace:*
+ version: link:../../packages/core
+ '@ssc/ui':
+ specifier: workspace:*
+ version: link:../../packages/ui
+ '@ssc/utils':
+ specifier: workspace:*
+ version: link:../../packages/utils
+ antd:
+ specifier: ^5.27.1
+ version: 5.27.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ axios:
+ specifier: ^1.11.0
+ version: 1.11.0
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ howler:
+ specifier: ^2.2.4
+ version: 2.2.4
+ next:
+ specifier: ^15.5.2
+ version: 15.5.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ next-auth:
+ specifier: ^4.24.11
+ version: 4.24.11(@auth/core@0.34.2)(next@15.5.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ next-intl:
+ specifier: ^3.26.5
+ version: 3.26.5(next@15.5.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)
+ next-themes:
+ specifier: ^0.4.6
+ version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ react:
+ specifier: ^19.1.1
+ version: 19.1.1
+ react-dom:
+ specifier: ^19.1.1
+ version: 19.1.1(react@19.1.1)
+ react-icons:
+ specifier: ^5.5.0
+ version: 5.5.0(react@19.1.1)
+ react-lottie:
+ specifier: ^1.2.10
+ version: 1.2.10(react@19.1.1)
+ react-redux:
+ specifier: ^9.2.0
+ version: 9.2.0(@types/react@19.1.12)(react@19.1.1)(redux@5.0.1)
+ react-responsive:
+ specifier: ^10.0.1
+ version: 10.0.1(react@19.1.1)
+ react-toastify:
+ specifier: ^11.0.5
+ version: 11.0.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ devDependencies:
+ '@next/bundle-analyzer':
+ specifier: ^15.5.2
+ version: 15.5.2
+ '@ssc/tailwind-config':
+ specifier: workspace:*
+ version: link:../../packages/tailwind-config
+ '@types/node':
+ specifier: ^22.18.0
+ version: 22.18.0
+ '@types/react':
+ specifier: ^19.1.12
+ version: 19.1.12
+ '@types/react-dom':
+ specifier: ^19.1.9
+ version: 19.1.9(@types/react@19.1.12)
+ autoprefixer:
+ specifier: ^10.4.21
+ version: 10.4.21(postcss@8.5.6)
+ postcss:
+ specifier: ^8.5.6
+ version: 8.5.6
+ tailwindcss:
+ specifier: ^3.4.17
+ version: 3.4.17
+ typescript:
+ specifier: ^5.9.2
+ version: 5.9.2
+
apps/ssc:
dependencies:
'@auth/core':
@@ -275,10 +378,10 @@ importers:
version: 9.0.17(@types/react@19.1.8)(storybook@9.0.17(@testing-library/dom@10.4.0))
'@storybook/addon-vitest':
specifier: ^9.0.17
- version: 9.0.17(@vitest/browser@3.2.4(playwright@1.54.1)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))(vitest@3.2.4))(@vitest/runner@3.2.4)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(vitest@3.2.4(@types/node@24.5.1)(@vitest/browser@3.2.4)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))
+ version: 9.0.17(@vitest/browser@3.2.4(playwright@1.54.1)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))(vitest@3.2.4))(@vitest/runner@3.2.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(vitest@3.2.4(@types/node@24.5.1)(@vitest/browser@3.2.4)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))
'@storybook/react-vite':
specifier: ^9.0.17
- version: 9.0.17(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(rollup@4.45.1)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))
+ version: 9.0.17(react-dom@19.1.1(react@19.1.1))(react@19.1.0)(rollup@4.45.1)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))
'@vitest/browser':
specifier: ^3.2.4
version: 3.2.4(playwright@1.54.1)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))(vitest@3.2.4)
@@ -5204,11 +5307,11 @@ snapshots:
'@lottiefiles/dotlottie-web@0.50.2': {}
- '@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.0)':
+ '@mdx-js/react@3.1.0(@types/react@19.1.8)(react@19.1.1)':
dependencies:
'@types/mdx': 2.0.13
'@types/react': 19.1.8
- react: 19.1.0
+ react: 19.1.1
'@napi-rs/wasm-runtime@0.2.11':
dependencies:
@@ -5487,21 +5590,21 @@ snapshots:
'@storybook/addon-docs@9.0.17(@types/react@19.1.8)(storybook@9.0.17(@testing-library/dom@10.4.0))':
dependencies:
- '@mdx-js/react': 3.1.0(@types/react@19.1.8)(react@19.1.0)
+ '@mdx-js/react': 3.1.0(@types/react@19.1.8)(react@19.1.1)
'@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0))
- '@storybook/icons': 1.4.0(react-dom@19.1.1(react@19.1.0))(react@19.1.0)
- '@storybook/react-dom-shim': 9.0.17(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))
- react: 19.1.0
+ '@storybook/icons': 1.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
+ '@storybook/react-dom-shim': 9.0.17(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.0.17(@testing-library/dom@10.4.0))
+ react: 19.1.1
react-dom: 19.1.1(react@19.1.0)
storybook: 9.0.17(@testing-library/dom@10.4.0)
ts-dedent: 2.2.0
transitivePeerDependencies:
- '@types/react'
- '@storybook/addon-vitest@9.0.17(@vitest/browser@3.2.4(playwright@1.54.1)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))(vitest@3.2.4))(@vitest/runner@3.2.4)(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(vitest@3.2.4(@types/node@24.5.1)(@vitest/browser@3.2.4)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))':
+ '@storybook/addon-vitest@9.0.17(@vitest/browser@3.2.4(playwright@1.54.1)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))(vitest@3.2.4))(@vitest/runner@3.2.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(vitest@3.2.4(@types/node@24.5.1)(@vitest/browser@3.2.4)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/icons': 1.4.0(react-dom@19.1.1(react@19.1.0))(react@19.1.0)
+ '@storybook/icons': 1.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.0)
prompts: 2.4.2
storybook: 9.0.17(@testing-library/dom@10.4.0)
ts-dedent: 2.2.0
@@ -5527,23 +5630,34 @@ snapshots:
'@storybook/global@5.0.0': {}
- '@storybook/icons@1.4.0(react-dom@19.1.1(react@19.1.0))(react@19.1.0)':
+ '@storybook/icons@1.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.0)':
dependencies:
react: 19.1.0
react-dom: 19.1.1(react@19.1.0)
- '@storybook/react-dom-shim@9.0.17(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))':
+ '@storybook/icons@1.4.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
+ dependencies:
+ react: 19.1.1
+ react-dom: 19.1.1(react@19.1.0)
+
+ '@storybook/react-dom-shim@9.0.17(react-dom@19.1.1(react@19.1.1))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))':
dependencies:
react: 19.1.0
react-dom: 19.1.1(react@19.1.0)
storybook: 9.0.17(@testing-library/dom@10.4.0)
- '@storybook/react-vite@9.0.17(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(rollup@4.45.1)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))':
+ '@storybook/react-dom-shim@9.0.17(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.0.17(@testing-library/dom@10.4.0))':
+ dependencies:
+ react: 19.1.1
+ react-dom: 19.1.1(react@19.1.0)
+ storybook: 9.0.17(@testing-library/dom@10.4.0)
+
+ '@storybook/react-vite@9.0.17(react-dom@19.1.1(react@19.1.1))(react@19.1.0)(rollup@4.45.1)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))':
dependencies:
'@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))
'@rollup/pluginutils': 5.2.0(rollup@4.45.1)
'@storybook/builder-vite': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0))(vite@7.0.5(@types/node@24.5.1)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.0))
- '@storybook/react': 9.0.17(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)
+ '@storybook/react': 9.0.17(react-dom@19.1.1(react@19.1.1))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)
find-up: 7.0.0
magic-string: 0.30.17
react: 19.1.0
@@ -5558,10 +5672,10 @@ snapshots:
- supports-color
- typescript
- '@storybook/react@9.0.17(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)':
+ '@storybook/react@9.0.17(react-dom@19.1.1(react@19.1.1))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))(typescript@5.8.3)':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/react-dom-shim': 9.0.17(react-dom@19.1.1(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))
+ '@storybook/react-dom-shim': 9.0.17(react-dom@19.1.1(react@19.1.1))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0))
react: 19.1.0
react-dom: 19.1.1(react@19.1.0)
storybook: 9.0.17(@testing-library/dom@10.4.0)
@@ -7465,7 +7579,7 @@ snapshots:
next-auth@4.24.11(@auth/core@0.34.2)(next@15.3.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
- '@babel/runtime': 7.27.6
+ '@babel/runtime': 7.28.3
'@panva/hkdf': 1.2.1
cookie: 0.7.2
jose: 4.15.9