[
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"extends\": \"next/core-web-vitals\"\n}\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env*.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n"
  },
  {
    "path": "README.md",
    "content": "This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).\n\n## Getting Started\n\nFirst, run the development server:\n\n```bash\nnpm run dev\n# or\nyarn dev\n# or\npnpm dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\nYou can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.\n\nThis project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.\n\n## Learn More\n\nTo learn more about Next.js, take a look at the following resources:\n\n- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.\n- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.\n\nYou can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!\n\n## Deploy on Vercel\n\nThe easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.\n\nCheck out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.\n"
  },
  {
    "path": "components.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema.json\",\n  \"style\": \"default\",\n  \"rsc\": true,\n  \"tsx\": true,\n  \"tailwind\": {\n    \"config\": \"tailwind.config.ts\",\n    \"css\": \"src/app/globals.css\",\n    \"baseColor\": \"gray\",\n    \"cssVariables\": true\n  },\n  \"aliases\": {\n    \"components\": \"@/components\",\n    \"utils\": \"@/lib/utils\"\n  }\n}"
  },
  {
    "path": "emails/index.tsx",
    "content": "import {\n\tBody,\n\tContainer,\n\tHead,\n\tHeading,\n\tHr,\n\tHtml,\n\tImg,\n\tLink,\n\tPreview,\n\tSection,\n\tText,\n} from \"@react-email/components\";\nimport * as React from \"react\";\n\ninterface SupaAuthVerifyEmailProp {\n\tverificationCode?: string;\n}\n\nexport default function SupaAuthVerifyEmail({\n\tverificationCode = \"596853\",\n}: SupaAuthVerifyEmailProp) {\n\treturn (\n\t\t<Html>\n\t\t\t<Head />\n\t\t\t<Preview>Supauth Email Verification</Preview>\n\t\t\t<Body style={main}>\n\t\t\t\t<Container style={container}>\n\t\t\t\t\t<Section style={coverSection}>\n\t\t\t\t\t\t<Section style={imageSection}></Section>\n\t\t\t\t\t\t<Section style={upperSection}>\n\t\t\t\t\t\t\t<Heading style={h1}>\n\t\t\t\t\t\t\t\tSupaAuth Verify your email address\n\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t\t<Text style={mainText}>\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"Thanks for starting the new account creation process. We want to make sure it's really you. Please enter the following verification code when prompted. If you don&apos;t want to create an account, you can ignore this message.\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t<Section style={verificationSection}>\n\t\t\t\t\t\t\t\t<Text style={verifyText}>\n\t\t\t\t\t\t\t\t\tVerification code\n\t\t\t\t\t\t\t\t</Text>\n\n\t\t\t\t\t\t\t\t<Text style={codeText}>{verificationCode}</Text>\n\t\t\t\t\t\t\t\t<Text style={validityText}>\n\t\t\t\t\t\t\t\t\t(This code is valid for 1 hour)\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</Section>\n\t\t\t\t\t\t</Section>\n\t\t\t\t\t</Section>\n\t\t\t\t</Container>\n\t\t\t</Body>\n\t\t</Html>\n\t);\n}\n\nconst main = {\n\tbackgroundColor: \"#fff\",\n\tcolor: \"#212121\",\n};\n\nconst container = {\n\tpadding: \"20px\",\n\tmargin: \"0 auto\",\n\tbackgroundColor: \"#eee\",\n};\n\nconst h1 = {\n\tcolor: \"#333\",\n\tfontFamily:\n\t\t\"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n\tfontSize: \"20px\",\n\tfontWeight: \"bold\",\n\tmarginBottom: \"15px\",\n};\n\nconst link = {\n\tcolor: \"#2754C5\",\n\tfontFamily:\n\t\t\"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n\tfontSize: \"14px\",\n\ttextDecoration: \"underline\",\n};\n\nconst text = {\n\tcolor: \"#333\",\n\tfontFamily:\n\t\t\"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\",\n\tfontSize: \"14px\",\n\tmargin: \"24px 0\",\n};\n\nconst imageSection = {\n\tbackgroundColor: \"#252f3d\",\n\tdisplay: \"flex\",\n\tpadding: \"20px 0\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n};\n\nconst coverSection = { backgroundColor: \"#fff\" };\n\nconst upperSection = { padding: \"25px 35px\" };\n\nconst lowerSection = { padding: \"25px 35px\" };\n\nconst footerText = {\n\t...text,\n\tfontSize: \"12px\",\n\tpadding: \"0 20px\",\n};\n\nconst verifyText = {\n\t...text,\n\tmargin: 0,\n\tfontWeight: \"bold\",\n\ttextAlign: \"center\" as const,\n};\n\nconst codeText = {\n\t...text,\n\tfontWeight: \"bold\",\n\tfontSize: \"36px\",\n\tmargin: \"10px 0\",\n\ttextAlign: \"center\" as const,\n};\n\nconst validityText = {\n\t...text,\n\tmargin: \"0px\",\n\ttextAlign: \"center\" as const,\n};\n\nconst verificationSection = {\n\tdisplay: \"flex\",\n\talignItems: \"center\",\n\tjustifyContent: \"center\",\n};\n\nconst mainText = { ...text, marginBottom: \"14px\" };\n"
  },
  {
    "path": "middleware.ts",
    "content": "import { updateSession } from \"@/lib/supabase/supabaseMiddleware\";\nimport { type NextRequest } from \"next/server\";\n\nexport async function middleware(request: NextRequest) {\n\treturn await updateSession(request);\n}\n\nexport const config = {\n\tmatcher: [\n\t\t/*\n\t\t * Match all request paths except for the ones starting with:\n\t\t * - _next/static (static files)\n\t\t * - _next/image (image optimization files)\n\t\t * - favicon.ico (favicon file)\n\t\t * Feel free to modify this pattern to include more paths.\n\t\t */\n\t\t\"/((?!_next/static|_next/image|favicon.ico|.*\\\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)\",\n\t],\n};\n"
  },
  {
    "path": "next.config.mjs",
    "content": "/** @type {import('next').NextConfig} */\nconst nextConfig = {\n    \n};\n\nexport default nextConfig;"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"client\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\"\n  },\n  \"dependencies\": {\n    \"@dnd-kit/core\": \"^6.0.8\",\n    \"@dnd-kit/modifiers\": \"^6.0.1\",\n    \"@dnd-kit/sortable\": \"^7.0.2\",\n    \"@dnd-kit/utilities\": \"^3.2.1\",\n    \"@hookform/resolvers\": \"^3.9.0\",\n    \"@iconify/react\": \"^4.1.1\",\n    \"@radix-ui/react-alert-dialog\": \"^1.1.1\",\n    \"@radix-ui/react-avatar\": \"^1.0.4\",\n    \"@radix-ui/react-dialog\": \"^1.0.5\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.1\",\n    \"@radix-ui/react-label\": \"^2.1.0\",\n    \"@radix-ui/react-select\": \"^2.0.0\",\n    \"@radix-ui/react-slot\": \"^1.1.0\",\n    \"@react-email/components\": \"0.0.22\",\n    \"@supabase/ssr\": \"^0.4.0\",\n    \"@supabase/supabase-js\": \"^2.45.1\",\n    \"@types/node\": \"20.6.0\",\n    \"@types/react\": \"18.2.21\",\n    \"@types/react-dom\": \"18.2.7\",\n    \"@vercel/og\": \"^0.5.17\",\n    \"autoprefixer\": \"10.4.15\",\n    \"canvas-confetti\": \"^1.9.3\",\n    \"class-variance-authority\": \"^0.7.0\",\n    \"clsx\": \"^2.0.0\",\n    \"encoding\": \"^0.1.13\",\n    \"eslint\": \"8.49.0\",\n    \"eslint-config-next\": \"13.4.19\",\n    \"firebase\": \"^10.4.0\",\n    \"framer-motion\": \"^11.2.13\",\n    \"input-otp\": \"^1.2.4\",\n    \"js-base64\": \"^3.7.5\",\n    \"lucide-react\": \"^0.276.0\",\n    \"next\": \"^14.1.4\",\n    \"next-auth\": \"^5.0.0-beta.20\",\n    \"postcss\": \"8.4.29\",\n    \"react\": \"18.2.0\",\n    \"react-dom\": \"18.2.0\",\n    \"react-email\": \"2.1.6\",\n    \"react-hook-form\": \"^7.52.2\",\n    \"react-icons\": \"^4.12.0\",\n    \"resend\": \"^3.5.0\",\n    \"sonner\": \"^1.5.0\",\n    \"tailwind-merge\": \"^1.14.0\",\n    \"tailwindcss\": \"3.3.3\",\n    \"tailwindcss-animate\": \"^1.0.7\",\n    \"typescript\": \"5.2.2\",\n    \"vaul\": \"^0.7.1\",\n    \"zod\": \"^3.23.8\"\n  },\n  \"devDependencies\": {\n    \"@types/canvas-confetti\": \"^1.6.4\"\n  }\n}\n"
  },
  {
    "path": "postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n}\n"
  },
  {
    "path": "src/app/1/[slug]/page.tsx",
    "content": "import { decodeData } from \"@/lib/utils\";\nimport { BACKGROUND_OPTIONS } from \"@/components/Background/BgSnippets\";\nimport DisplayScreen from \"@/components/screen/DisplayScreen\";\nimport { supabaseServer } from \"@/lib/supabase/supabaseServer\";\nimport NotFound from \"@/app/Not-found\";\nimport DataLoading from \"../loading\";\ntype Props = {\n  params: {\n    slug: string;\n  };\n};\nexport async function generateMetadata({ params }: Props) {\n    const path = await supabaseServer()\n    .from(\"links\")\n    .select(\"*\")\n    .eq(\"path\", params.slug);\n  if (path.data?.length === 0) return NotFound();\n\n  const data = decodeData(path?.data?.[0].link);\n  if (!data) {\n    return {};\n  }\n\n  return {\n    title: `${data.n}'s`,\n    description: `Find all of ${data.n}'s links in one place.`,\n    openGraph: {\n      type: \"website\",\n      locale: \"en_US\",\n      url: \"https://itZmyLink.vercel.app\",\n      title: `${data.n}'s - itZmyLink`,\n      description: `Find all of ${data.n}'s links in one place.`,\n      images: `https://itZmyLink.vercel.app/api/og?data=${encodeURI(data.n)}`,\n      siteName: `${data.n}'s - itZmyLink`,\n    },\n    twitter: {\n      card: \"summary_large_image\",\n      title: `${data.n} - itZmyLink`,\n      description: `Find all of ${data.n}'s links in one place.`,\n      images: `https://itZmyLink.vercel.app/api/og?data=${encodeURI(data.n)}`,\n      creator: \"@Taquiimam14\",\n    },\n  };\n}\n\nconst linkLandingPage: React.FC<Props> = async ({ params }) => {\n  const path = await supabaseServer()\n    .from(\"links\")\n    .select(\"*\")\n    .eq(\"path\", params.slug);\n  if (path.data?.length === 0) return NotFound();\n\n  const data = decodeData(path?.data?.[0].link);\n  const selectedBgOption = data\n    ? BACKGROUND_OPTIONS.find((option) => option.code === data.bg)\n    : null;\n\n  const selectedBgComponent = selectedBgOption\n    ? selectedBgOption.component\n    : null;\n\n  return (\n    <>\n      <div className=\"fixed left-0 top-0 -z-10 h-full w-full\">\n        {selectedBgComponent}\n      </div>\n      <div className=\"p-2 pt-10 hide_scrollbar\">\n        {data ? <DisplayScreen myData={data} /> : <DataLoading />}\n      </div>\n    </>\n  );\n};\n\nexport default linkLandingPage;\n"
  },
  {
    "path": "src/app/1/error.tsx",
    "content": "'use client'\n\nimport { Button } from \"@/components/ui/button\"\nimport Link from \"next/link\"\n\n\nexport default function Error() {\n    return (\n        <div className=\"grid h-screen px-4 bg-white place-content-center\">\n            <div className=\"text-center space-y-5\">\n                <h1 className=\"text-lg md:text-xl text-accent-foreground dark:text-gray-400\">Sorry, there is mistake in url.</h1>\n                <Button  size={'sm'}>\n                    <Link href=\"/\">Create new page</Link>\n                </Button>\n            </div>\n        </div>\n    )\n}"
  },
  {
    "path": "src/app/1/loading.tsx",
    "content": "import { Skeleton } from '@/components/ui/skeleton'\nimport React from 'react'\n\nexport default function DataLoading() {\n    return (\n        <div className=\"p-2 h-full w-full space-y-8  max-w-lg mx-auto overflow-y-scroll hide_scrollbar pt-12\">\n            <div className=\"flex flex-col gap-3 justify-center items-center\">\n                <Skeleton className=\"h-20 w-20 rounded-full\" />\n                <Skeleton className=\"h-[30px] w-[200px] rounded-2xl\" />\n                <Skeleton className=\"h-[50px] w-full rounded-2xl\" />\n            </div>\n            <div className=\"flex items-center justify-center flex-wrap gap-3\">\n                <Skeleton className=\"h-8 w-8 rounded-full\" />\n                <Skeleton className=\"h-8 w-8 rounded-full\" />\n                <Skeleton className=\"h-8 w-8 rounded-full\" />\n                <Skeleton className=\"h-8 w-8 rounded-full\" />\n                <Skeleton className=\"h-8 w-8 rounded-full\" />\n                <Skeleton className=\"h-8 w-8 rounded-full\" />\n            </div>\n            <ul className=\"space-y-2\">\n                <Skeleton className=\"h-[50px] w-full rounded-2xl\" />\n                <Skeleton className=\"h-[50px] w-full rounded-2xl\" />\n                <Skeleton className=\"h-[50px] w-full rounded-2xl\" />\n                <Skeleton className=\"h-[50px] w-full rounded-2xl\" />\n            </ul>\n        </div>\n    )\n}"
  },
  {
    "path": "src/app/1/page.tsx",
    "content": "import { decodeData } from \"@/lib/utils\";\nimport NotFound from \"../Not-found\";\nimport { BACKGROUND_OPTIONS } from \"@/components/Background/BgSnippets\";\nimport DataLoading from \"./loading\";\nimport DisplayScreen from \"@/components/screen/DisplayScreen\";\n\nexport async function generateMetadata({ searchParams }: any) {\n  const data = decodeData(searchParams.data);\n\n  if (!data) {\n    return {};\n  }\n\n  return {\n    title: `${data.n}'s`,\n    description: `Find all of ${data.n}'s links in one place.`,\n    openGraph: {\n      type: \"website\",\n      locale: \"en_US\",\n      url: \"https://itZmyLink.vercel.app\",\n      title: `${data.n}'s - itZmyLink`,\n      description: `Find all of ${data.n}'s links in one place.`,\n      images: `https://itZmyLink.vercel.app/api/og?data=${encodeURI(data.n)}`,\n      siteName: `${data.n}'s - itZmyLink`,\n    },\n    twitter: {\n      card: \"summary_large_image\",\n      title: `${data.n} - itZmyLink`,\n      description: `Find all of ${data.n}'s links in one place.`,\n      images: `https://itZmyLink.vercel.app/api/og?data=${encodeURI(data.n)}`,\n      creator: \"@Taquiimam14\",\n    },\n  };\n}\n\nconst linkLandingPage = ({ searchParams }: any) => {\n  if (!searchParams.data) NotFound();\n\n  const data = decodeData(searchParams.data);\n  \n  const selectedBgOption = data\n    ? BACKGROUND_OPTIONS.find((option) => option.code === data.bg)\n    : null;\n\n  const selectedBgComponent = selectedBgOption\n    ? selectedBgOption.component\n    : null;\n\n  return (\n    <>\n      <div className=\"fixed left-0 top-0 -z-10 h-full w-full\">\n        {selectedBgComponent}\n      </div>\n      <div className=\"p-2 pt-10 hide_scrollbar\">\n        {data ? <DisplayScreen myData={data} /> : <DataLoading />}\n      </div>\n    </>\n  );\n};\n\nexport default linkLandingPage;\n"
  },
  {
    "path": "src/app/Not-found.tsx",
    "content": "import { Button } from '@/components/ui/button'\nimport Link from 'next/link'\nimport React from 'react'\n\nexport default function NotFound() {\n    return (\n        <section className=\"bg-white dark:bg-gray-900 \">\n            <div className=\"container flex items-center min-h-screen px-6 py-12 mx-auto\">\n                <div className=\"flex flex-col justify-center items-center max-w-sm mx-auto text-center\">\n                    <p className=\"p-3 text-sm font-medium text-blue-500 rounded-full bg-blue-50 dark:bg-gray-800\">\n                        <svg xmlns=\"https://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth=\"2\" stroke=\"currentColor\" className=\"w-6 h-6\">\n                            <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\" />\n                        </svg>\n                    </p>\n                    <h1 className=\"mt-3 text-2xl font-semibold text-gray-800 dark:text-white md:text-3xl\">Opps! Page not found.</h1>\n                    <p className=\"mt-4 text-gray-500 dark:text-gray-400\">Organize your links with itZmyLink and make them easy to find and share.</p>\n                    <div className=\"flex justify-center items-center w-full mt-6 gap-x-3 shrink-0 sm:w-auto\">\n                        <Button size={'sm'} >\n                            <Link href={'/'}>\n                                Create your itZmyLink\n                            </Link>\n                        </Button>\n                    </div>\n                </div>\n            </div>\n        </section>\n    )\n}"
  },
  {
    "path": "src/app/api/auth/[...nextauth]/route.ts",
    "content": "import { handlers } from \"@/components/auth\";\n\nexport const {GET, POST} = handlers;"
  },
  {
    "path": "src/app/api/og/route.tsx",
    "content": "import { NextRequest } from \"next/server\";\nimport type { ServerRuntime} from \"next\"\nimport { ImageResponse } from \"@vercel/og\"\n\nexport const runtime: ServerRuntime = \"edge\"\n\nfunction truncateString({ str, maxLength }: { str: string, maxLength: number }) {\n    if (str.length > maxLength) {\n        return str.substring(0, maxLength);\n    }\n    return str;\n}\n\nexport async function GET(req: NextRequest) {\n    try {\n        const url = new URL(req.url)\n        const { data } = Object.fromEntries(url.searchParams)\n\n        if (!data || !data.trim()) {\n            return new Response(\"Data not in URL or empty.\", {\n                status: 400,\n            });\n        }\n        const maxNameLength = 25;\n        let name = data.trim();\n        name = truncateString({ str: name, maxLength: maxNameLength });\n        return new ImageResponse(\n            (\n                <div tw=\"flex flex-col w-full h-full items-center justify-center bg-white mx-auto\">\n                    <div tw=\"flex text-6xl font-bold tracking-tight leading-tight px-8\" style={{ overflowWrap: \"break-word\" }}>\n                        {name}&#39;s - itZmyLink\n                    </div>\n                </div>\n            ),\n            {\n                width: 1200,\n                height: 630,\n            }\n        )\n    } catch (error) {\n        console.error(error);\n        return new Response(`Failed to generate the image`, {\n            status: 500,\n        })\n    }\n}"
  },
  {
    "path": "src/app/auth/signin/page.tsx",
    "content": "import React from 'react'\nimport Link from \"next/link\"\n\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\"\nimport LoginGoogleBtn from '@/components/forms/LoginGoogleBtn';\ntype Props = {\n  searchParams:{\n    callbackUrl?:string\n  }\n};\nconst page: React.FC<Props> = async({searchParams}) => {\n  return (\n   \n      <div className=\"grid place-content-center min-h-screen w-full\">\n        <Card className=\"mx-auto max-w-sm\">\n      <CardHeader>\n      <CardTitle className=\"text-2xl\">Welcome Back</CardTitle>\n        <CardDescription>\n          Select your registered email to continue.\n        </CardDescription>\n      </CardHeader>\n      <CardContent>\n      <div className=\"grid gap-4\">\n     \n         <LoginGoogleBtn callbackUrl={searchParams.callbackUrl as string}/>\n        </div>\n        <div className=\"mt-4 text-center text-sm\">\n          Don&apos;t have an account?{\" \"}\n          <Link href=\"/auth/signup\" className=\"underline\">\n            Sign up\n          </Link>\n        </div>\n      </CardContent>\n    </Card>\n      </div>\n      )\n    }\n\n    export default page"
  },
  {
    "path": "src/app/create/loading.tsx",
    "content": "import { Skeleton } from '@/components/ui/skeleton'\nimport React from 'react'\n\nexport default function SiteLoading() {\n    return (\n        <main className='relative grid lg:grid-cols-3 h-screen px-2 lg:px-0 md:container'>\n            <section className='lg:col-span-2 flex flex-col items-center justify-center py-6 lg:px-20 gap-6 h-screen '>\n                <div className='overflow-y-auto w-full hide_scrollbar flex flex-col gap-5 pb-20 lg:pb-0 '>\n                    <Skeleton className=\"h-[250px] w-full rounded-2xl\" />\n                    <Skeleton className=\"h-[250px] w-full rounded-2xl\" />\n                    <Skeleton className=\"h-[250px] w-full rounded-2xl\" />\n                </div>\n            </section>\n            <section className='hidden lg:flex pl-6 items-center'>\n                <Skeleton className=\"h-[700px] w-[350px] rounded-2xl\" />\n            </section>\n        </main>\n    )\n}"
  },
  {
    "path": "src/app/create/page.tsx",
    "content": "import PreviewButton from \"@/components/ActionButtons/ResponsivePreviewBtn\";\nimport HomeEditor from \"@/components/HomeEditor\";\n\n\nconst CreateLink = async() => {\n  \n\n\n  \n  return (\n    <div className=\"h-screen w-full \">\n     \n      {/* EDITING PART  */}\n      <div className=\"w-full flex \">\n        <HomeEditor />\n      </div>\n      <div className='lg:hidden'>\n        <PreviewButton />\n      </div>\n    </div>\n  );\n};\n\nexport default CreateLink;\n"
  },
  {
    "path": "src/app/globals.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n \n  \n\n\n\n@layer base {\n  :root {\n    --background: 0 0% 100%;\n    --foreground: 20 14.3% 4.1%;\n    --card: 0 0% 100%;\n    --card-foreground: 20 14.3% 4.1%;\n    --popover: 0 0% 100%;\n    --popover-foreground: 20 14.3% 4.1%;\n    --primary: 47.9 95.8% 53.1%;\n    --primary-foreground: 26 83.3% 14.1%;\n    --secondary: 60 4.8% 95.9%;\n    --secondary-foreground: 24 9.8% 10%;\n    --muted: 60 4.8% 95.9%;\n    --muted-foreground: 25 5.3% 44.7%;\n    --accent: 60 4.8% 95.9%;\n    --accent-foreground: 24 9.8% 10%;\n    --destructive: 0 84.2% 60.2%;\n    --destructive-foreground: 60 9.1% 97.8%;\n    --border: 20 5.9% 90%;\n    --input: 20 5.9% 90%;\n    --ring: 20 14.3% 4.1%;\n    --radius: 0.5rem;\n  }\n\n  .dark {\n    --background: 20 14.3% 4.1%;\n    --foreground: 60 9.1% 97.8%;\n    --card: 20 14.3% 4.1%;\n    --card-foreground: 60 9.1% 97.8%;\n    --popover: 20 14.3% 4.1%;\n    --popover-foreground: 60 9.1% 97.8%;\n    --primary: 47.9 95.8% 53.1%;\n    --primary-foreground: 26 83.3% 14.1%;\n    --secondary: 12 6.5% 15.1%;\n    --secondary-foreground: 60 9.1% 97.8%;\n    --muted: 12 6.5% 15.1%;\n    --muted-foreground: 24 5.4% 63.9%;\n    --accent: 12 6.5% 15.1%;\n    --accent-foreground: 60 9.1% 97.8%;\n    --destructive: 0 62.8% 30.6%;\n    --destructive-foreground: 60 9.1% 97.8%;\n    --border: 12 6.5% 15.1%;\n    --input: 12 6.5% 15.1%;\n    --ring: 35.5 91.7% 32.9%;\n  }\n}\n\n\n\n \n@layer base {\n  * {\n    @apply border-border;\n  }\n  body {\n    @apply bg-background text-foreground;\n  }\n}\nhtml, body, :root{\n  height: 100%;\n}\n.hide_scrollbar::-webkit-scrollbar {\n  display: none;\n  -ms-overflow-style: none;  /* IE and Edge */\n  scrollbar-width: none;  /* Firefox */\n}\n\n\nbody::-webkit-scrollbar {\n  display: none;\n  -ms-overflow-style: none;  /* IE and Edge */\n  scrollbar-width: none;  /* Firefox */\n}\n/* MOBILE TEMPLATE DESIGN  */\n.container{\n  max-width: 600px;\n  margin: 4px auto;\n}\n\n.phone{\n  position: relative;\n  background: #1e1e1e;\n  height: 625px;\n  width: 345px;\n  border-radius: 25px;\n  margin: 0 auto;\n}\n\n.camera{\n  position: absolute;\n  background: #7A7A7A;\n  height: 15px;\n  width: 15px;\n  border-radius: 15px;\n  top: 7px;\n  left: 166px;\n  z-index: +9;\n}\n\n.speaker{\n  position: absolute;\n  background: #000;\n  height: 23px;\n  width: 45px;\n  border-radius: 0 0 27px 27px;\n  top: 7px;\n  left: 151px;\n  z-index: +8;\n}\n\n.sleep-button{\n  position: absolute;\n  background: #1e1e1e;\n  height: 35px; \n  width: 3px;\n  border-top-right-radius: 3px 3px;\n  border-bottom-right-radius: 3px 3px;\n  top: 111px;\n  left: 345px;\n}\n\n.silent-switch{\n  position: absolute;\n  background: #1e1e1e;\n  height: 25px;\n  width: 3px;\n  border-top-left-radius: 3px 3px;\n  border-bottom-left-radius: 3px 3px;\n  top: 60px;\n  left: -3px;\n}\n\n.volume{\n  position: absolute;\n  background: #1e1e1e;\n  width: 3px;\n  height: 35px;\n  border-top-left-radius: 3px 3px;\n  border-bottom-left-radius: 3px 3px;\n  left: -3px;\n}\n\n.up{\n  top: 105px;\n}\n\n.down{\n  top: 145px;\n}\n\n.screen{\n  position: absolute;\n  overflow: hidden;\n  height: 593px;\n  width: 325px;\n  top: 10px;\n  left: 10px; \n  border-radius: 15px;\n}\n\n.home-button{\n  position: absolute;\n  border: 1px solid #7A7A7A;\n  height: 35px;\n  width: 35px;\n  border-radius: 25px;\n  bottom: 12px;\n  left: 50%;\n  margin-left: -18px;\n  display: none;\n}\n\n\n"
  },
  {
    "path": "src/app/layout.tsx",
    "content": "import \"./globals.css\";\nimport type { Metadata } from \"next\";\nimport { siteConfig } from \"./page\";\nimport { Inter } from \"next/font/google\";\nimport { Providers } from \"@/components/Provider\";\n\nconst inter = Inter({ subsets: [\"latin\"] });\n\n// Original source: https://github.com/sadmann7/skateshop/blob/main/src/app/layout.tsx\nexport const metadata: Metadata = {\n  metadataBase: new URL(\"https://itzmylink.vercel.app\"),\n  title: {\n    default: siteConfig.name,\n    template: `%s - itZmyLink`,\n  },\n  description: siteConfig.description,\n\n  // added new keywords for seo\n  keywords: [\n    \"bitly url shortener\",\n    \"bitly link shortener\",\n    \"link shortener\",\n    \"url shortener\",\n    \"bitly link\",\n    \"tinyurls\",\n    \"all in one link\",\n    \"free url shortener\",\n    \"linknode\",\n    \"onelink\",\n    \"social links\",\n    \"free linktree\",\n    \"link in bio\",\n    \"short my url\",\n    \"my links\",\n    \"itzmylink\",\n    \"itZmyLink\",\n    \"mtLink\",\n  ],\n  authors: [\n    {\n      name: \"Taqui Imam\",\n      url: \"https://github.com/taqui-786\",\n    },\n  ],\n  creator: \"Taqui imam\",\n \n  openGraph: {\n    type: \"website\",\n    locale: \"en_US\",\n    url: siteConfig.url,\n    title: siteConfig.name,\n    description: siteConfig.description,\n    images: [`${siteConfig.url}/og-image.png`],\n    siteName: siteConfig.name,\n  },\n  twitter: {\n    card: \"summary_large_image\",\n    title: siteConfig.name,\n    description: siteConfig.description,\n    images: [`${siteConfig.url}/og-image.png`],\n    creator: \"@Taquiimam14\",\n  },\n  icons: {\n    icon: \"/favicon.ico\",\n  },\n};\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  return (\n    <html lang=\"en\">\n      <body className={inter.className}>\n        <main className=\"relative flex flex-col min-h-screen\">\n          <Providers>\n            {/* <Navbar /> */}\n            <div className=\" relative flex-grow flex-1\">{children}</div>\n            {/* <Footer /> */}\n          </Providers>\n        </main>\n      </body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "src/app/links/page.tsx",
    "content": "import { Card, CardContent } from \"@/components/ui/card\"\nimport { Button, buttonVariants } from \"@/components/ui/button\"\nimport { Construction } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { cn } from \"@/lib/utils\"\n\nexport default function Component() {\n  return (\n    <div className=\"flex items-center justify-center min-h-screen bg-gradient-to-br from-gray-100 to-gray-200 p-4\">\n      <Card className=\"w-full max-w-3xl\">\n        <CardContent className=\"flex flex-col items-center space-y-6 p-6 text-center\">\n          <Construction className=\"w-24 h-24 text-primary\" />\n          <h1 className=\"text-4xl sm:text-5xl md:text-6xl font-bold text-primary\">\n            Under Construction\n          </h1>\n          <p className=\"text-xl sm:text-2xl text-muted-foreground\">\n            This page will be available soon.\n          </p>\n            <Link href=\"/\" className={cn(buttonVariants({size:'lg'}))}>Go Home</Link>\n        </CardContent>\n      </Card>\n    </div>\n  )\n}"
  },
  {
    "path": "src/app/page.tsx",
    "content": "import Link from \"next/link\";\nimport landingPageImg from '../../public/landingPage.png'\nimport Image from \"next/image\";\nimport { auth } from \"@/components/auth\";\nimport { redirect } from \"next/navigation\";\n\n\nexport const siteConfig = {\n  name: \"itZmyLink - one page, many links.\",\n  description: \"itZmyLink help you to Create a personalized page to showcase all your social media profiles in one place.\",\n  ogImage: \"https://itzmylink.vercel.app/og-image.png\",\n  url: \"https://itzmylink.vercel.app\",\n}\nexport default async function Home() {\n  const session = await auth()\n  if(session?.user) return redirect('/create')\n  return (\n    <div className=\" relative h-screen w-full flex justify-center items-center\">\n      <div className=\"bg-white\">\n    \n\n    <section className=\"bg-[#FCF8F1] bg-opacity-30 py-10 sm:py-16 lg:py-24\">\n        <div className=\"px-4 mx-auto max-w-7xl sm:px-6 lg:px-8\">\n            <div className=\"grid items-center grid-cols-1 gap-12 lg:grid-cols-2\">\n                <div>\n                    <p className=\"text-base font-semibold tracking-wider text-blue-600 uppercase\">Simplify your online presence!</p>\n                    <h1 className=\"mt-4 text-4xl font-bold text-black lg:mt-8 sm:text-6xl xl:text-[5.3rem]\">Take control of your links with itzmylink</h1>\n                    <p className=\"mt-4 text-base text-black lg:mt-8 sm:text-xl\">Your all-in-one link management solution</p>\n\n                    <Link href=\"/create\" title=\"signup\" className=\"inline-flex items-center px-6 py-4 mt-8 font-semibold text-black transition-all duration-200 bg-yellow-300 rounded-full lg:mt-16 hover:bg-yellow-400 focus:bg-yellow-400\" role=\"button\">\n                        Get your Link\n                        <svg className=\"w-6 h-6 ml-8 -mr-2\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n                            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M13 9l3 3m0 0l-3 3m3-3H8m13 0a9 9 0 11-18 0 9 9 0 0118 0z\" />\n                        </svg>\n                    </Link>\n\n                    <p className=\"mt-5 text-gray-600\">Already joined us? <Link href=\"/auth/signin\" title=\"signin\" className=\"text-black transition-all duration-200 hover:underline\">Log in</Link></p>\n                </div>\n\n                <div>\n                    <Image className=\"w-full\" src={landingPageImg} alt=\"heroImg\" />\n                </div>\n            </div>\n        </div>\n    </section>\n</div>\n\n\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/app/preview/layout.tsx",
    "content": "export default function PreviewLayout({\n    children,\n  }: {\n    children: React.ReactNode\n  }) {\n    return <main className=\"min-h-screen flex flex-col relative w-full\">\n      {children}</main>\n  }"
  },
  {
    "path": "src/app/preview/page.tsx",
    "content": "import React from \"react\";\nimport NotFound from \"../Not-found\";\nimport { decodeData } from \"@/lib/utils\";\nimport ComputerMockup from \"@/components/mockup/ComputerMockup\";\nimport { BACKGROUND_OPTIONS } from \"@/components/Background/BgSnippets\";\nimport PreviewPage from \"@/components/PreviewPage\";\nimport PreviewFooter from \"@/components/ActionButtons/PreviewFooter\";\n\nfunction page({ searchParams }: any) {\n  if (!searchParams.data) NotFound();\n\n  const data = decodeData(searchParams.data);\n  const selectedBgOption = data\n    ? BACKGROUND_OPTIONS.find((option) => option.code === data.bg)\n    : null;\n\n  const selectedBgComponent = selectedBgOption\n    ? selectedBgOption.component\n    : null;\n  return (\n    <>\n    <ComputerMockup>\n        <div className=\"absolute left-0 top-0  h-full w-full\">\n          {selectedBgComponent}\n        </div>\n        <PreviewPage data={data} />\n\n    </ComputerMockup>\n    <PreviewFooter MyLink={data} inputLink={searchParams.data}/>\n    \n    </>\n  );\n}\n\nexport default page;\n"
  },
  {
    "path": "src/components/ActionButtons/CustomLinkDialog.tsx",
    "content": "\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogHeader,\n  DialogTitle,\n  DialogTrigger,\n} from \"@/components/ui/dialog\";\nimport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { ClipboardCopy, Check, PenSquare } from \"lucide-react\";\nimport { createCustomPath } from \"@/lib/supabase/actions\";\n\n// Mock function to simulate checking if a path exists in the database\nconst checkPathExists = async (path: string): Promise<boolean> => {\n  await new Promise((resolve) => setTimeout(resolve, 1000));\n  return path.toLowerCase().includes(\"taken\");\n};\n\nexport default function Component({localLink}:{localLink:string}) {\n  const [customPath, setCustomPath] = useState(\"\");\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [success, setSuccess] = useState<string | null>(null);\n  const [isCopied, setIsCopied] = useState(false);\n  const baseUrl = \"itzmylink.vercel.app/1\";\n\n  const fullUrl = `${baseUrl}/${customPath}`;\n\n  const copyToClipboard = useCallback(() => {\n    navigator.clipboard\n      .writeText(fullUrl)\n      .then(() => {\n        setIsCopied(true);\n        // toast({\n        //   title: \"Copied!\",\n        //   description: \"Link copied to clipboard\",\n        // })\n        setTimeout(() => setIsCopied(false), 2000);\n      })\n      .catch((err) => {\n        console.error(\"Failed to copy text: \", err);\n        // toast({\n        //   title: \"Error\",\n        //   description: \"Failed to copy link\",\n        //   variant: \"destructive\",\n        // })\n      });\n  }, [fullUrl]);\n\n  const handleCreate = useCallback(async () => {\n    if (!customPath) {\n      setError(\"Please enter a custom path\");\n      return;\n    }\n\n    setIsLoading(true);\n    setError(null);\n    setSuccess(null);\n\n    try {\n      const exists = await checkPathExists(customPath);\n      if (exists) {\n        setError(\"This custom path is already taken. Please try another.\");\n      } else {\n        const res = await createCustomPath(customPath,localLink);\n        if (res.status !== \"notAuthenticated\") {\n            res.status === 'created'?\n          setSuccess(res.message):\n          setError(res.message)\n        }\n      }\n    } catch (err) {\n      console.error(\"Error creating custom path:\", err);\n      setError(\"An error occurred while creating the custom path\");\n    } finally {\n      setIsLoading(false);\n    }\n  }, [customPath]);\n\n  return (\n    <>\n      <Dialog>\n        <DialogTrigger asChild>\n        <Button variant=\"ghost\" className=\"rounded-full hover:bg-gray-100 transition-colors duration-200\">\n            <PenSquare className=\"w-4 h-4 mr-2\" />\n            Create Custom URL\n          </Button>\n        </DialogTrigger>\n        <DialogContent className=\"sm:max-w-[425px]\">\n          <DialogHeader>\n            <DialogTitle>Create Custom Link</DialogTitle>\n            <DialogDescription>\n              Enter your custom path to create a unique link.\n            </DialogDescription>\n          </DialogHeader>\n          <div className=\"grid gap-4 py-4\">\n            <div className=\"flex items-center gap-2\">\n              <span className=\"col-span-1 font-medium text-right\">\n                {baseUrl}/\n              </span>\n              <Input\n                id=\"custom-path\"\n                value={customPath}\n                onChange={(e) => setCustomPath(e.target.value)}\n                className=\"col-span-3\"\n                placeholder=\"your-custom-path\"\n              />\n            </div>\n            <div className=\"flex items-center gap-2\">\n              <Input value={fullUrl} readOnly className=\"flex-grow\" />\n              <Button onClick={copyToClipboard} size=\"icon\" variant=\"outline\">\n                {isCopied ? (\n                  <Check className=\"h-4 w-4\" />\n                ) : (\n                  <ClipboardCopy className=\"h-4 w-4\" />\n                )}\n                <span className=\"sr-only\">\n                  {isCopied ? \"Copied\" : \"Copy to clipboard\"}\n                </span>\n              </Button>\n            </div>\n            <Button onClick={handleCreate} disabled={isLoading}>\n              {isLoading ? \"Creating...\" : \"Create Link\"}\n            </Button>\n          </div>\n        </DialogContent>\n      </Dialog>\n\n      <AlertDialog open={!!error || !!success}>\n        <AlertDialogContent>\n          <AlertDialogHeader>\n            <AlertDialogTitle>{error ? \"Already Exists 😅\" : \"Congratulation🎉\"}</AlertDialogTitle>\n            <AlertDialogDescription>\n              {error || success}\n              {success && (\n                <div className=\"mt-4\">\n                  <p className=\"font-semibold\">Your custom link:</p>\n                  <div className=\"flex items-center gap-2 mt-2\">\n                    <Input value={fullUrl} readOnly className=\"flex-grow\" />\n                    <Button\n                      onClick={copyToClipboard}\n                      size=\"icon\"\n                      variant=\"outline\"\n                    >\n                      {isCopied ? (\n                        <Check className=\"h-4 w-4\" />\n                      ) : (\n                        <ClipboardCopy className=\"h-4 w-4\" />\n                      )}\n                      <span className=\"sr-only\">\n                        {isCopied ? \"Copied\" : \"Copy to clipboard\"}\n                      </span>\n                    </Button>\n                  </div>\n                </div>\n              )}\n            </AlertDialogDescription>\n          </AlertDialogHeader>\n          <AlertDialogFooter>\n            <AlertDialogCancel\n              onClick={() => {\n                setError(null);\n                setSuccess(null);\n              }}\n            >\n              Close\n            </AlertDialogCancel>\n            {success && (\n              <AlertDialogAction onClick={copyToClipboard}>\n                Copy URL\n              </AlertDialogAction>\n            )}\n          </AlertDialogFooter>\n        </AlertDialogContent>\n      </AlertDialog>\n    </>\n  );\n}\n"
  },
  {
    "path": "src/components/ActionButtons/DemoBtn.tsx",
    "content": "\"use client\"\nimport React, { FC } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { Play } from 'lucide-react'\nimport { useData } from '@/lib/Context'\n\ninterface DemoDataProps { }\n\nconst DemoBtn: FC<DemoDataProps> = ({ }) => {\n    const { showDemo } = useData()\n    return (\n        <Button className='w-full' onClick={showDemo}>\n            <Play className='mr-2 h-4 w-4' />\n            Demo\n        </Button>\n    )\n}\n\nexport default DemoBtn"
  },
  {
    "path": "src/components/ActionButtons/PreviewFooter.tsx",
    "content": "\"use client\";\nimport React from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Check, Clipboard, Share } from \"lucide-react\";\n\nimport CustomLinkDialog from \"./CustomLinkDialog\";\n\nfunction PreviewFooter({\n  MyLink,\n  inputLink,\n}: {\n  MyLink: any;\n  inputLink: string;\n}) {\n  const [hasCopied, setHasCopied] = React.useState<boolean>(false);\n  const copyToClipboard = React.useCallback(() => {\n    const url = `${window.location.origin}/1?data=${inputLink}`;\n    navigator.clipboard.writeText(url);\n    return url;\n  }, [MyLink]);\n  return (\n    <div className=\" absolute z-50 bottom-0 left-0 right-0 m-auto w-fit flex flex-row gap-2 items-center justify-center mb-4 p-1 rounded-full bg-gradient-to-r from-purple-400 via-pink-500 to-red-500 animate-bounce\">\n      <div className=\"bg-white rounded-full shadow-lg p-1\">\n        <div className=\"flex space-x-1\">\n          <Button\n            variant=\"ghost\"\n            className=\"rounded-full hover:bg-gray-100 transition-colors duration-200\"\n            onClick={() => {\n              navigator.share({\n                title: `${MyLink.n} - itZmyLink`,\n                text: `Find all of ${MyLink.n}'s links in one place.`,\n                url: `${inputLink}`,\n              });\n            }}\n          >\n            <Share className=\"w-4 h-4 mr-2\" />\n            Share\n          </Button>\n          <Button\n            variant=\"ghost\"\n            className=\"rounded-full hover:bg-gray-100 transition-colors duration-200\"\n            onClick={() => {\n              copyToClipboard();\n              setHasCopied(true);\n            }}\n          >\n            {hasCopied ? (\n              <>\n                <Check className=\"w-4 h-4 mr-2\" />\n                Copied\n              </>\n            ) : (\n              <>\n                <Clipboard className=\"w-4 h-4 mr-2\" /> Local URL\n              </>\n            )}\n          </Button>\n          <CustomLinkDialog localLink={inputLink} />\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default PreviewFooter;\n"
  },
  {
    "path": "src/components/ActionButtons/PublishBtn.tsx",
    "content": "\"use client\"\n\nimport React, { FC } from 'react'\nimport { Button, buttonVariants } from '@/components/ui/button'\nimport { cn, encodeData } from '@/lib/utils';\n\nimport { Check, Copy, Send, Share2 } from 'lucide-react';\nimport {\n    Dialog,\n    DialogContent,\n    DialogDescription,\n    DialogFooter,\n    DialogHeader,\n    DialogTitle,\n    DialogTrigger\n} from '@/components/ui/dialog';\nimport { Input } from '@/components/ui/input';\nimport { DialogClose } from '@radix-ui/react-dialog';\nimport { useData } from '@/lib/Context';\nimport Link from 'next/link';\n\ninterface PublishProps {\n    loggedIn:any\n }\n\nconst Publish: FC<PublishProps> = ({ loggedIn}) => {\n    const { MyLink } = useData()\n\n    const isEmpty = isEmptyValues(MyLink)\n    const [inputLink, setInputLink] = React.useState<string>(\"\")\n    const [hasCopied, setHasCopied] = React.useState<boolean>(false)\n\n    function isEmptyValues(obj: any) {\n        for (let key in obj) {\n            if (obj[key] !== \"\" && obj[key].length !== 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    const copyToClipboard = React.useCallback(() => {\n        const url = `${window.location.origin}/1?data=${encodeData(MyLink)}`;\n        navigator.clipboard.writeText(url)\n        return url\n    }, [MyLink]);\n\n    React.useEffect(() => {\n        setHasCopied(false);\n    }, [MyLink]);\n\n    function publish() {\n        if (!isEmpty) {\n            const getUrl = copyToClipboard()\n            setInputLink(getUrl)\n        }\n    }\n\n    return (\n        <Dialog>\n            <DialogTrigger asChild>\n                <Button className='w-full' onClick={publish}>\n                    <Send className='mr-2 h-4 w-4' />\n                    Publish\n                </Button>\n            </DialogTrigger>\n\n            <DialogContent className=\"sm:max-w-[425px]\">\n                <DialogHeader>\n                    <DialogTitle className=\"flex items-center\">\n                        Share your page\n                    </DialogTitle>\n                    <DialogDescription className=\"text-left\">\n                        You can share your page with others and make it accessible from anywhere.\n                    </DialogDescription>\n                </DialogHeader>\n                \n                {!isEmpty ? (\n                    loggedIn ? \n                    <Link href={`/preview?data=${encodeData(MyLink)} ` } className={cn(buttonVariants())} >Confirm to publish</Link>:\n                    <Link href={`/auth/signin?callbackUrl=/preview?data=${encodeData(MyLink)} ` } className={cn(buttonVariants())} >Login To Continue</Link>\n                    // <>\n                    //     <Input\n                    //         value={inputLink}\n                    //         readOnly\n                    //     />\n                    //     <DialogFooter>\n                    //         <div className=\"flex gap-3 w-full justify-between items-center\">\n                    //             <Button\n                    //                 className=\"w-full\"\n                                    // onClick={() => {\n                                    //     navigator.share({\n                                    //         title: `${MyLink.n} - itZmyLink`,\n                                    //         text: `Find all of ${MyLink.n}'s links in one place.`,\n                                    //         url: `${inputLink}`,\n                                    //     })\n                                    // }}\n                    //             >\n                    //                 <Share2 className=\"mr-2 h-4 w-4\" />\n                    //                 Share\n                    //             </Button>\n                    //             <Button\n                    //                 className=\"w-full\"\n                                //     onClick={() => {\n                                //         copyToClipboard()\n                                //         setHasCopied(true);\n                                //     }}\n                                // >\n                    //                 {\n                    //                     hasCopied\n                    //                         ? (\n                    //                             <>\n                    //                                 <Check className=\"mr-2 h-4 w-4\" />\n                    //                                 Copied\n                    //                             </>\n                    //                         )\n                    //                         : (\n                    //                             <>\n                    //                                 <Copy className=\"mr-2 h-4 w-4\" />\n                    //                                 Copy Link\n                    //                             </>\n                    //                         )\n                    //                 }\n\n                    //             </Button>\n                    //         </div>\n                    //     </DialogFooter>\n                    // </>\n                ) : (\n                    <DialogClose>\n                        <Button className=\"w-full\">\n                            Can&#39;t publish with empty fields!\n                        </Button>\n                    </DialogClose>\n                )}\n            </DialogContent>\n        </Dialog>\n    )\n}\n\nexport default Publish"
  },
  {
    "path": "src/components/ActionButtons/ResponsivePreviewBtn.tsx",
    "content": "\"use client\"\n\nimport React, { FC } from 'react'\nimport { Button } from \"@/components/ui/button\"\nimport { Drawer } from \"vaul\"\nimport { useData } from '@/lib/Context'\nimport { BACKGROUND_OPTIONS } from '../Background/BgSnippets'\nimport { DrawerContent, DrawerTrigger } from '../ui/Drrawer'\nimport DisplayData from '../DisplayData'\n\ninterface PreviewButtonProps { }\n\nconst PreviewButton: FC<PreviewButtonProps> = () => {\n    const { MyLink } = useData();\n\n    const [isEmpty, setIsEmpty] = React.useState<boolean>(false)\n\n    React.useEffect(() => {\n        function isEmptyValues(obj: any) {\n            for (let key in obj) {\n                if (obj[key] !== \"\" && obj[key].length !== 0) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        setIsEmpty(isEmptyValues(MyLink))\n    }, [MyLink])\n\n    const selectedBgOption = MyLink\n        ? BACKGROUND_OPTIONS.find((option) => option.code === MyLink.bg)\n        : null;\n\n    const selectedBgComponent = selectedBgOption ? selectedBgOption.component : null;\n\n    return (\n        <div className=\"fixed inset-x-0 bottom-0 p-4 z-10 flex justify-center items-center backdrop-blur-sm \">\n            <Drawer.Root>\n                <DrawerTrigger asChild>\n                    <Button className=\"rounded-full max-w-[350px] w-full tracking-wide overflow-y-auto\" >\n                        Preview page\n                    </Button>\n                </DrawerTrigger>\n                <DrawerContent className=\"h-[75%] pb-2\">\n                    {\n                        isEmpty\n                            ? <div className='w-full text-sm text-muted-foreground h-[90%] flex justify-center items-center'>Nothing to show...</div>\n                            : (\n                                <>\n                                    {!isEmpty && selectedBgComponent}\n                                    <div className='h-full pt-10 px-2'>\n                                        <DisplayData myData={MyLink} />\n                                    </div>\n                                </>\n                            )\n                    }\n                </DrawerContent>\n            </Drawer.Root>\n        </div>\n    )\n}\n\nexport default PreviewButton"
  },
  {
    "path": "src/components/AdditionalLinkCards.tsx",
    "content": "import React, { FC } from 'react'\nimport { Icon } from '@iconify/react';\n\ninterface AdditionalLinkCardProps {\n    label: string;\n    url: string;\n    icon?: string;\n}\nconst AdditionalLinkCard: FC<AdditionalLinkCardProps> = ({ label, url, icon }) => {\n    return (\n        <li>\n            {label && url && (\n                <a href={url} target=\"_blank\">\n                    <dt className=\"flex items-center space-x-2 p-1 -m-1 rounded-xl hover:bg-slate-100 bg-slate-50\">\n                        <div className=\"flex-shrink-0 flex h-10 w-10 items-center justify-center rounded-lg text-slate-500\">\n                            {icon ? (\n                                <Icon icon={icon} className='h-5 w-5' />\n                            ) : (\n                                <Icon icon=\"ph:link-simple\" className='h-5 w-5' />\n                            )}\n                        </div>\n                        <div className=\"w-full flex-grow min-w-0\">\n                            <p className=\"font-medium text-sm leading-6 text-accent-foreground\">\n                                {label}\n                            </p>\n                        </div>\n                    </dt>\n                </a>\n            )}\n        </li>\n    )\n}\n\nexport default AdditionalLinkCard"
  },
  {
    "path": "src/components/AdditionalLinkForm.tsx",
    "content": "\"use client\"\n\nimport React, { FC } from 'react'\nimport {\n    Card,\n    CardContent,\n    CardDescription,\n    CardHeader,\n    CardTitle\n} from '@/components/ui/card'\nimport { Button } from '@/components/ui/button'\nimport {\n    DndContext,\n    closestCenter,\n    KeyboardSensor,\n    PointerSensor,\n    useSensor,\n    useSensors,\n} from '@dnd-kit/core';\nimport {\n    SortableContext,\n    sortableKeyboardCoordinates,\n    verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport {\n    restrictToVerticalAxis,\n    restrictToParentElement,\n} from '@dnd-kit/modifiers';\nimport {SortableLinks} from '@/components/ui/SortableLink'\nimport { useData } from '@/lib/Context';\n\n\n\nconst AdditionalLinkForm = () =>{\n    const sensors = useSensors(\n        useSensor(PointerSensor),\n        useSensor(KeyboardSensor, {\n            coordinateGetter: sortableKeyboardCoordinates,\n        }),\n    );\n\n    const scrollDownRef = React.useRef<HTMLDivElement | null>(null)\n    const [shouldScroll, setShouldScroll] = React.useState(false);\n    const { MyLink, addNewData, updateIndex } = useData();\n\n    const addLinkDetailForm = () => {\n        const newLink: AdditionalLinkProps = { id: Date.now(), i: '', l: '', u: '' };\n        addNewData(newLink);\n        setShouldScroll(true);\n    };\n\n    React.useEffect(() => {\n        if (shouldScroll && scrollDownRef.current) {\n            scrollDownRef.current.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' });\n            setShouldScroll(false);\n        }\n    }, [shouldScroll]);\n\n        // \"handleDragEnd\" function written by chatGPT\n        function handleDragEnd(event: any) {\n            const { active, over } = event;\n    \n            if (active.id !== over.id) {\n                const updatedItems = [...MyLink.ls]; // Accessing items from the context\n                const draggedItem: any = updatedItems.find((item) => item.id === active.id);\n                const targetItem: any = updatedItems.find((item) => item.id === over.id);\n    \n                const draggedIndex = updatedItems.indexOf(draggedItem);\n                const targetIndex = updatedItems.indexOf(targetItem);\n    \n                if (draggedIndex !== -1 && targetIndex !== -1) {\n                    // Remove the dragged item from its original position\n                    updatedItems.splice(draggedIndex, 1);\n                    // Insert the dragged item at the target position\n                    updatedItems.splice(targetIndex, 0, draggedItem);\n    \n                    updateIndex(updatedItems);\n                }\n            }\n        }\n    \n    return(\n        <>\n         <Card className='w-full'>\n                <CardHeader className=\"space-y-1\">\n                    <CardTitle className=\"text-2xl flex justify-between items-center\">\n                        Extra Links\n                        {/* <GetIconInfo /> */}\n                    </CardTitle>\n                    <CardDescription>\n                        Enter your additional link details here.\n                    </CardDescription>\n                </CardHeader>\n                <CardContent className=\"grid gap-4\">\n                    <DndContext\n                        sensors={sensors}\n                        collisionDetection={closestCenter}\n                        onDragEnd={handleDragEnd}\n                        modifiers={[restrictToVerticalAxis, restrictToParentElement]}\n                    >\n                        <SortableContext\n                            items={MyLink.ls.map(link => link.id)}\n                            strategy={verticalListSortingStrategy}\n                        >\n                            {MyLink.ls.map((link, index) => {\n                                return <SortableLinks key={link.id} id={link} index={index} />\n                            })}\n                        </SortableContext>\n                    </DndContext>\n                    <Button\n                        variant={\"outline\"}\n                        onClick={addLinkDetailForm}\n                    >\n                        +\n                    </Button>\n                </CardContent>\n            </Card>\n            <div ref={scrollDownRef}></div>\n        </>\n    )\n}\n\n\nexport default AdditionalLinkForm;"
  },
  {
    "path": "src/components/Animation/BlurText.tsx",
    "content": "\"use client\";\n\nimport { motion } from \"framer-motion\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface BlurIntProps {\n  word: string;\n  className?: string;\n  variant?: {\n    hidden: { filter: string; opacity: number };\n    visible: { filter: string; opacity: number };\n  };\n  duration?: number;\n}\nconst BlurIn = ({ word, className, variant, duration = 1 }: BlurIntProps) => {\n  const defaultVariants = {\n    hidden: { filter: \"blur(10px)\", opacity: 0 },\n    visible: { filter: \"blur(0px)\", opacity: 1 },\n  };\n  const combinedVariants = variant || defaultVariants;\n\n  return (\n    <motion.p\n      initial=\"hidden\"\n      animate=\"visible\"\n      transition={{ duration }}\n      variants={combinedVariants}\n      className={cn(\n        className,\n        \" drop-shadow-sm \",\n      )}\n    >\n      {word}\n    </motion.p>\n  );\n};\n\nexport default BlurIn;\n"
  },
  {
    "path": "src/components/Animation/FlipText.tsx",
    "content": "\"use client\";\n\nimport { AnimatePresence, motion, Variants } from \"framer-motion\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface SlightFlipProps {\n  word: string;\n  duration?: number;\n  delayMultiple?: number;\n  framerProps?: Variants;\n  className?: string;\n}\n\nexport default function SlightFlip({\n  word,\n  duration = 0.5,\n  delayMultiple = 0.08,\n  framerProps = {\n    hidden: { rotateX: -90, opacity: 0 },\n    visible: { rotateX: 0, opacity: 1 },\n  },\n  className,\n}: SlightFlipProps) {\n  return (\n    <div className=\"flex justify-center space-x-1\">\n      <AnimatePresence mode=\"wait\">\n        {word.split(\"\").map((char, i) => (\n          <motion.span\n            key={i}\n            initial=\"hidden\"\n            animate=\"visible\"\n            exit=\"hidden\"\n            variants={framerProps}\n            transition={{ duration, delay: i * delayMultiple }}\n            className={cn(\"origin-center drop-shadow-sm\", className)}\n          >\n            {char}\n          </motion.span>\n        ))}\n      </AnimatePresence>\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/Animation/FramerWrapper.tsx",
    "content": "\"use client\";\nimport React, { useState } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\ntype FramerMotionProps = {\n    children: React.ReactNode,\n    className?:any,\n    y?:number\n    x?:number\n    delay?:number\n    duration?: number\n    scale?:number\n}\nfunction FramerWrapper({children,delay = 0.25 ,y = 15, x = 0,duration = 0.20,scale = 0, className}:FramerMotionProps) {\n    const [animateConfig, setAnimateConfig] = useState({\n        opacity:1, y:0, x:0\n    })\n  return (\n    <AnimatePresence>\n      <motion.div\n      initial={scale === 0 ?{opacity:0, y:y, x:x,}:{opacity:0, y:y, x:x, scale:scale}}\n      animate={scale === 0 ? {opacity:1, y:0, x:0} : {opacity:1, y:0, x:0, scale: 1}}\n      exit={{opacity:0, y:15}}\n      transition={{delay:delay, duration:duration}}\n      className={className}\n      >{children}</motion.div>\n    </AnimatePresence>\n  );\n}\n\nexport default FramerWrapper;"
  },
  {
    "path": "src/components/Animation/TextEffect.tsx",
    "content": "'use client';\nimport { motion, Variants } from 'framer-motion';\nimport React from 'react';\n\ntype PresetType = 'blur' | 'shake' | 'scale' | 'fade' | 'slide';\n\ntype TextEffectProps = {\n  children: string;\n  per?: 'word' | 'char';\n  as?: keyof JSX.IntrinsicElements;\n  variants?: {\n    container?: Variants;\n    item?: Variants;\n  };\n  className?: string;\n  preset?: PresetType;\n};\n\nconst defaultContainerVariants: Variants = {\n  hidden: { opacity: 0 },\n  visible: {\n    opacity: 1,\n    transition: {\n      staggerChildren: 0.05,\n    },\n  },\n};\n\nconst defaultItemVariants: Variants = {\n  hidden: { opacity: 0 },\n  visible: {\n    opacity: 1,\n  },\n};\n\nconst presetVariants: Record<\n  PresetType,\n  { container: Variants; item: Variants }\n> = {\n  blur: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, filter: 'blur(12px)' },\n      visible: { opacity: 1, filter: 'blur(0px)' },\n    },\n  },\n  shake: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { x: 0 },\n      visible: { x: [-5, 5, -5, 5, 0], transition: { duration: 0.5 } },\n    },\n  },\n  scale: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, scale: 0 },\n      visible: { opacity: 1, scale: 1 },\n    },\n  },\n  fade: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0 },\n      visible: { opacity: 1 },\n    },\n  },\n  slide: {\n    container: defaultContainerVariants,\n    item: {\n      hidden: { opacity: 0, y: 20 },\n      visible: { opacity: 1, y: 0 },\n    },\n  },\n};\n\nconst AnimationComponent: React.FC<{\n  word: string;\n  variants: Variants;\n  per: 'word' | 'char';\n}> = React.memo(({ word, variants, per }) => {\n  if (per === 'word') {\n    return (\n      <motion.span\n        aria-hidden='true'\n        variants={variants}\n        className='inline-block whitespace-pre'\n      >\n        {word}\n      </motion.span>\n    );\n  }\n\n  return (\n    <span className='inline-block whitespace-pre'>\n      {word.split('').map((char, charIndex) => (\n        <motion.span\n          key={`char-${charIndex}`}\n          aria-hidden='true'\n          variants={variants}\n          className='inline-block whitespace-pre'\n        >\n          {char}\n        </motion.span>\n      ))}\n    </span>\n  );\n});\n\nAnimationComponent.displayName = 'AnimationComponent';\n\nexport function TextEffect({\n  children,\n  per = 'word',\n  as = 'p',\n  variants,\n  className,\n  preset,\n}: TextEffectProps) {\n  const words = children.split(/(\\S+)/);\n  const MotionTag = motion[as as keyof typeof motion];\n  const selectedVariants = preset\n    ? presetVariants[preset]\n    : { container: defaultContainerVariants, item: defaultItemVariants };\n  const containerVariants = variants?.container || selectedVariants.container;\n  const itemVariants = variants?.item || selectedVariants.item;\n\n  return (\n    <MotionTag\n      initial='hidden'\n      animate='visible'\n      aria-label={children}\n      variants={containerVariants}\n      className={className}\n    >\n      {words.map((word, wordIndex) => (\n        <AnimationComponent\n          key={`word-${wordIndex}`}\n          word={word}\n          variants={itemVariants}\n          per={per}\n        />\n      ))}\n    </MotionTag>\n  );\n}\n"
  },
  {
    "path": "src/components/Background/BackgroundCards.tsx",
    "content": "import React from 'react';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport { BACKGROUND_OPTIONS } from './BgSnippets';\nimport { useData } from '@/lib/Context';\n\ntype BackgroundCardProps = {};\n\nconst BackgroundCard: React.FC<BackgroundCardProps> = () => {\n    const { MyLink,selectBackground} = useData()\n    return (\n        \n            <div className=\"flex h-fit w-full flex-wrap justify-center items-center gap-4 space-x-4 pb-4\">\n                {BACKGROUND_OPTIONS.map((background, index) => {\n                    return (\n                        <Button\n                            key={index}\n                            variant={\"outline\"}\n                            className={cn(\"relative min-h-[60px] min-w-[110px] sm:min-w-[150px] overflow-hidden text-muted-foreground\", {\n                                'bg-accent text-accent-foreground': MyLink.bg === background.code\n                            })}\n                            onClick={() => {\n                                selectBackground(background.code)\n                            }}\n                        >\n                            {background.name}\n                        </Button>\n                    );\n                })}\n            </div>\n           \n    );\n};\n\nexport default BackgroundCard"
  },
  {
    "path": "src/components/Background/BackgroundForm.tsx",
    "content": "\"use client\"\n\nimport React from 'react'\nimport {\n    Card,\n    CardContent,\n    CardDescription,\n    CardHeader,\n    CardTitle\n} from '@/components/ui/card'\nimport BackgroundCard from './BackgroundCards'\n\nexport default function Background() {\n    return (\n        <Card className='w-full'>\n            <CardHeader className=\"space-y-1\">\n                <CardTitle className=\"text-2xl flex justify-between items-center\">\n                    Background\n                </CardTitle>\n                <CardDescription>\n                    Customize your background theme from here.\n                </CardDescription>\n            </CardHeader>\n            <CardContent className=\"grid gap-4 pb-2.5\">\n                <BackgroundCard />\n            </CardContent>\n        </Card>\n    )\n}"
  },
  {
    "path": "src/components/Background/BgSnippets.tsx",
    "content": "// original source: https://github.com/ibelick/background-snippets/blob/main/app/components/background.tsx\n\nconst BgTheme1 = () => {\n    return (\n        <div className=\"absolute inset-0  h-full w-full bg-white\" />\n    );\n};\n\nconst BgTheme8 = () => {\n    return (\n        <div className=\"absolute h-full   w-full bg-white\"><div className=\"absolute bottom-0 left-0 right-0 top-0 bg-[linear-gradient(to_right,#4f4f4f2e_1px,transparent_1px),linear-gradient(to_bottom,#4f4f4f2e_1px,transparent_1px)] bg-[size:14px_24px] [mask-image:radial-gradient(ellipse_80%_50%_at_50%_0%,#000_70%,transparent_110%)]\"></div></div>\n    );\n};\n\nconst BgTheme2 = () => {\n    return (\n        <div className=\"absolute inset-0   h-full w-full bg-white bg-[linear-gradient(to_right,#f0f0f0_1px,transparent_1px),linear-gradient(to_bottom,#f0f0f0_1px,transparent_1px)] bg-[size:6rem_4rem]\"><div className=\"absolute bottom-0 left-0 right-0 top-0 bg-[radial-gradient(circle_500px_at_50%_200px,#C9EBFF,transparent)]\"></div></div>\n    );\n};\n\nconst BgTheme9 = () => {\n    return (\n        <div className=\"absolute inset-0 h-full   w-full bg-white bg-[radial-gradient(#e5e7eb_1px,transparent_1px)] [background-size:16px_16px]\"></div>\n    );\n};\n\nconst BgTheme7 = () => {\n    return (\n        <div className=\"absolute inset-0 h-full   w-full bg-white bg-[linear-gradient(to_right,#8080800a_1px,transparent_1px),linear-gradient(to_bottom,#8080800a_1px,transparent_1px)] bg-[size:14px_24px]\"><div className=\"absolute left-0 right-0 top-0 m-auto h-[310px] w-[310px] rounded-full bg-fuchsia-400 opacity-20 blur-[100px]\"></div></div>\n    );\n};\n\nconst BgTheme10 = () => {\n    return (\n        <div className=\"absolute h-full    w-full bg-white\"><div className=\"absolute h-full w-full bg-[radial-gradient(#e5e7eb_1px,transparent_1px)] [background-size:16px_16px] [mask-image:radial-gradient(ellipse_50%_50%_at_50%_50%,#000_70%,transparent_100%)]\"></div></div>\n    );\n};\nconst BgTheme11 = () => {\n    return (\n        <div className=\"absolute inset-0  h-full   w-full bg-white bg-[linear-gradient(to_right,#8080800a_1px,transparent_1px),linear-gradient(to_bottom,#8080800a_1px,transparent_1px)] bg-[size:14px_24px]\"></div>\n    );\n};\n\nconst BgTheme12 = () => {\n    return (\n        <div className=\"absolute inset-0 h-full   w-full bg-white bg-[linear-gradient(to_right,#f0f0f0_1px,transparent_1px),linear-gradient(to_bottom,#f0f0f0_1px,transparent_1px)] bg-[size:6rem_4rem]\"></div>\n    );\n};\n\n\nconst BgTheme4 = () => {\n    return (\n        <div className=\"absolute top-0 h-full  w-full bg-white bg-[radial-gradient(100%_50%_at_50%_0%,rgba(0,163,255,0.13)_0,rgba(0,163,255,0)_50%,rgba(0,163,255,0)_100%)]\"></div>\n    );\n};\n\nconst BgTheme5 = () => {\n    return (\n        <div className=\"absolute top-0 h-full   w-full bg-white\"><div className=\"absolute bottom-auto left-auto right-0 top-0 h-[500px] w-[500px] -translate-x-[30%] translate-y-[20%] rounded-full bg-[rgba(173,109,244,0.5)] opacity-50 blur-[80px]\"></div></div>\n    );\n};\n\nconst BgTheme6 = () => {\n    return (\n        <div className=\"absolute inset-0 h-full   w-full bg-white [background:radial-gradient(125%_125%_at_50%_10%,#fff_40%,#63e_100%)]\"></div>\n    );\n};\n\nconst BgTheme3 = () => {\n    return (\n        <div className=\"absolute inset-0  h-full w-full bg-white bg-[linear-gradient(to_right,#f0f0f0_1px,transparent_1px),linear-gradient(to_bottom,#f0f0f0_1px,transparent_1px)] bg-[size:6rem_4rem]\"><div className=\"absolute bottom-0 left-0 right-0 top-0 bg-[radial-gradient(circle_800px_at_100%_200px,#d5c5ff,transparent)]\"></div></div>\n    );\n};\n\n\n\nexport const BACKGROUND_OPTIONS = [\n    {\n        code: '#FFFFFF',\n        component: <BgTheme1 />,\n        name: 'WhiteCanvas'\n    },\n    {\n        code: '#4F4F4F',\n        component: <BgTheme8 />,\n        name: 'ShadowyGray'\n    },\n    {\n        code: '#C9EBFF',\n        component: <BgTheme2 />,\n        name: 'LinearSky',\n    },\n    {\n        code: '#E6E7EB',\n        component: <BgTheme9 />,\n        name: 'SubtleGrayDots',\n    },\n    {\n        code: '#FF00FF',\n        component: <BgTheme7 />,\n        name: 'BlurredFuchsia',\n    },\n    {\n        code: '#E5E7EB',\n        component: <BgTheme10 />,\n        name: 'MaskedGray',\n    },\n    {\n        code: '#808080',\n        component: <BgTheme11 />,\n        name: 'GradientGrid',\n    },\n    {\n        code: '#F0F0F0',\n        component: <BgTheme12 />,\n        name: 'LightGrayLines',\n    },\n    {\n        code: '#00A3FF',\n        component: <BgTheme4 />,\n        name: 'RadiantBlue',\n    },\n    {\n        code: '#AD6DF4',\n        component: <BgTheme5 />,\n        name: 'GradientOrb',\n    },\n    {\n        code: '#63E',\n        component: <BgTheme6 />,\n        name: 'RadialHalo',\n    },\n    {\n        code: '#D5C5FF',\n        component: <BgTheme3 />,\n        name: 'VividCircles',\n    }\n   \n    \n] as const;"
  },
  {
    "path": "src/components/DisplayData.tsx",
    "content": "\"use client\";\nimport { ImageIcon } from \"lucide-react\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\";\nimport { Icon } from \"@iconify/react/dist/iconify.js\";\nimport AdditionalLinkCard from \"./AdditionalLinkCards\";\n\nconst DisplayData:React.FC<DisplayDataProps> = ({ myData }) => {\n  const EmptySocialLiks =\n    !myData.fb &&\n    !myData.ig &&\n    !myData.tg &&\n    !myData.em &&\n    !myData.tw &&\n    !myData.lk &&\n    !myData.yt &&\n    !myData.gt &&\n    !myData.wh;\n\n  const iconMap: Record<string, string> = {\n    fb: \"ph:facebook-logo-duotone\",\n    tw: \"ph:twitter-logo-duotone\",\n    ig: \"ph:instagram-logo-duotone\",\n    tg: \"ph:telegram-logo-duotone\",\n    wh: \"ph:whatsapp-logo-duotone\",\n    yt: \"ph:youtube-logo-duotone\",\n    em: \"ph:envelope-duotone\",\n    gt: \"ph:github-logo-duotone\",\n    lk: \"ph:linkedin-logo-duotone\",\n  };\n  return (\n    <>\n      <div className=\"p-[.5rem] h-full relative w-full space-y-8 max-w-lg mx-auto overflow-y-scroll hide_scrollbar\">\n        <div className=\"text-center z-50\">\n          {/* USER IMAGE  */}\n          <Avatar className=\"h-20 w-20 rounded-full overflow-hidden ring ring-slate-200 mx-auto\">\n            <AvatarImage\n              src={myData.i}\n              alt={`PIC`}\n              className=\"h-full w-full object-cover\"\n            />\n            <AvatarFallback>\n              <ImageIcon className=\"h-8 w-8 text-gray-300\" />\n            </AvatarFallback>\n          </Avatar>\n          {/* USER NAME AND BIO */}\n          <h1 className=\"text-2xl font-bold mt-4 text-slate-800\">{myData.n}</h1>\n          <p className=\"text-sm mt-2 text-slate-600\">{myData.a}</p>\n        </div>\n        {/* {!EmptySocialLiks && ( */}\n          <div className=\"flex items-center justify-center flex-wrap\">\n            { Object.entries(myData).map(([key, value]) => {\n             \n              \n                const excludedKeys = [\"i\", \"n\", \"a\", \"bg\"];\n                if (key !== \"ls\" && value && !excludedKeys.includes(key)) {\n                    const propIcon = iconMap[key as keyof typeof iconMap];\n                    if (key === \"em\") {\n                        // Handle email link generation\n                        return (\n                            <span className=\"p-1\" key={key}>\n                                <a href={`mailto:${value}`}>\n                                    <Icon icon={propIcon} className=\"h-6 w-6\" />\n                                </a>\n                            </span>\n                        );\n                    } else if (key === \"wh\") {\n                        // Handle WhatsApp link generation\n                        const whatsappValue = value.startsWith(\"https://wa.me/\")\n                            ? value // If it already starts with the correct prefix\n                            : `https://wa.me/${value}`;\n\n                        return (\n                            <span className=\"p-1\" key={key}>\n                                <a href={whatsappValue} target=\"_blank\" rel=\"noopener noreferrer\">\n                                    <Icon icon={propIcon} className=\"h-6 w-6\" />\n                                </a>\n                            </span>\n                        );\n                    } else {\n                        return (\n                            <span className=\"p-1\" key={key}>\n                                <a href={value} target=\"_blank\" rel=\"noopener noreferrer\">\n                                    <Icon icon={propIcon} className=\"h-6 w-6\" />\n                                </a>\n                            </span>\n                        );\n                    }\n                }\n                return null;\n            })}\n          </div>\n\n        {/* )} */}\n         <ul className=\"space-y-2\">\n                {myData.ls && myData.ls.map((link, id) => (\n                    <AdditionalLinkCard\n                        label={link.l}\n                        icon={link.i}\n                        url={link.u}\n                        key={id}\n                    />\n                ))}\n            </ul>\n      </div>\n    </>\n  );\n};\n\nexport default DisplayData;\n"
  },
  {
    "path": "src/components/HomeEditor.tsx",
    "content": "import PersonalInfo from \"./PersonalInfo\";\nimport SocialLinksForm from \"./SocialLinkForm\";\nimport Background from \"./Background/BackgroundForm\";\nimport AdditionalLinkForm from \"./AdditionalLinkForm\";\nimport Publish from \"./ActionButtons/PublishBtn\";\nimport DemoBtn from \"./ActionButtons/DemoBtn\";\nimport Link from \"next/link\";\nimport { ShoppingCart ,Link2, Github, Coffee} from \"lucide-react\";\nimport { buttonVariants } from \"./ui/button\";\nimport Navbar from \"./Navbar\";\nimport { auth } from \"./auth\";\nimport MobileMockup from \"./mockup/MobileMockup\";\nconst HomeEditor = async() => {\n  const session = await auth()\n  return (\n    <>\n\n    <div className=\"h-screen min-h-screen  w-full overflow-y-auto gap-4 flex flex-col bg-gray-100 py-1 px-1 sm:py-8 sm:px-16\">\n    <Navbar/>\n    <PersonalInfo/>\n    <SocialLinksForm/>\n    <AdditionalLinkForm/>\n    <Background/>\n    <div className='grid grid-cols-2 md:grid-cols-4 gap-2 justify-center items-center w-full mb-20'>\n    <Publish loggedIn={session?.user || null} />\n    <DemoBtn/>\n    <Link\n              target='_blank'\n              href=\"https://github.com/taqui-786/itZmyLink\"\n              className={buttonVariants()}>\n              <Github className='mr-2 h-4 w-4' />\n              Github \n            </Link>\n            <Link\n              target='_blank'\n              href=\"https://buymeacoffee.com/taquidevloper\"\n              className={buttonVariants()}>\n              <Coffee className='mr-2 h-4 w-4' />\n              Buy Me a Coffee\n            </Link>\n    </div>\n      </div>\n      <div className=\"h-auto w-[35%]   hidden bg-gray-100 lg:flex items-center justify-center\">\n        {/* MOBILE MOCKUP  */}\n        <MobileMockup />\n      </div>\n    </>\n  );\n};\nexport default HomeEditor;\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "src/components/Navbar.tsx",
    "content": "\nimport Link from \"next/link\";\nimport React from \"react\";\nimport { auth, signOut } from \"./auth\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\nimport { cn } from \"@/lib/utils\";\nimport { buttonVariants } from \"./ui/button\";\nimport { supabaseServer } from \"@/lib/supabase/supabaseServer\";\n\nasync function Navbar() {\n  const session = await auth();\n  let linkCount = 0\nconst supabase = await supabaseServer().from('links').select('*').eq('email',session?.user?.email)\nif(supabase.data?.length){\n  linkCount = supabase.data.length\n}\n  return (\n    <nav className=\"bg-white border-gray-200 dark:bg-gray-900\">\n      <div className=\"flex flex-wrap justify-between items-center mx-auto max-w-screen-xl p-4\">\n        <a\n          href=\"https://flowbite.com\"\n          className=\"flex items-center space-x-3 rtl:space-x-reverse\"\n        >\n          <span className=\"self-center text-2xl font-semibold whitespace-nowrap dark:text-white\">\n            itZmyLink\n          </span>\n        </a>\n        <div className=\"flex items-center space-x-6 rtl:space-x-reverse\">\n          {/* <a href=\"tel:5541251234\" className=\"text-sm  text-gray-500 dark:text-white hover:underline\">(555) 412-1234</a> */}\n          {session?.user ? (\n            <div className=\"flex gap-3 h-full w-fit\">\n              <Link href={'/links'} className={cn(buttonVariants({variant:\"outline\"}),\"flex gap-1\")}>My Links <span className=\"inline-flex items-center py-0.5 px-1.5 rounded-full text-xs font-medium bg-red-500 text-white\">{linkCount}</span></Link>\n            <DropdownMenu>\n              <DropdownMenuTrigger>\n                <Avatar>\n                  <AvatarImage src={session?.user.image as string}/>\n                  <AvatarFallback>Ti</AvatarFallback>\n                </Avatar>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuLabel><div className=\"flex flex-col\">\n                    <h1 className=\"text-sm font-semibold\">{session?.user.name}</h1>\n                    <p className=\"text-xs font-semibold\">{session?.user.email}</p>\n                    </div></DropdownMenuLabel>\n                <DropdownMenuSeparator />\n                <DropdownMenuItem>Setting</DropdownMenuItem>\n                <DropdownMenuItem  ><Link href={'/api/auth/signout'}>Logout</Link></DropdownMenuItem>\n             \n              </DropdownMenuContent>\n            </DropdownMenu></div>\n          ) : (\n            <Link href={\"/auth/signin\"} className={cn(buttonVariants({variant:'default'}))}>Login</Link>\n          )}\n        </div>\n      </div>\n    </nav>\n  );\n}\n\nexport default Navbar;\n"
  },
  {
    "path": "src/components/PersonalInfo.tsx",
    "content": "\"use client\";\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from \"@/components/ui/card\";\nimport { Label } from \"./ui/label\";\nimport { Input } from \"./ui/input\";\nimport { Textarea } from \"./ui/textarea\";\nimport { useData } from \"@/lib/Context\";\nimport PhotoUpload from \"./PhotoUpload\";\n\ntype InputChangeEvent = React.ChangeEvent<\n  HTMLInputElement | HTMLTextAreaElement\n>;\n\nconst PersonalInfo = () => {\n  const { MyLink, updateProfileInfo } = useData();\n  const handleInfoChange = (event: InputChangeEvent) => {\n    const { name, value } = event.target;\n    updateProfileInfo(name, value);\n  };\n\n  return (\n    <>\n      <Card className=\"w-full\">\n        <CardHeader className=\"space-y-1\">\n          <CardTitle className=\"text-2xl\">Profile Information</CardTitle>\n          <CardDescription>\n            Enter your profile or title information here.\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"grid gap-4\">\n          <div className=\"grid md:grid-cols-2 gap-2\">\n            <div>\n              <Label htmlFor=\"name\">Name</Label>\n              <Input\n                id=\"name\"\n                name=\"n\"\n                type=\"text\"\n                placeholder=\"John Doe\"\n                value={MyLink.n}\n                onChange={handleInfoChange}\n              />\n            </div>\n            <div className=\"relative\">\n           <PhotoUpload  />\n            </div>\n          </div>\n          <div className=\"grid gap-2\">\n            <Label htmlFor=\"description\">About yourself</Label>\n            <Textarea\n              id=\"description\"\n              name=\"a\"\n              placeholder=\"type something here...\"\n              value={MyLink.a}\n              onChange={handleInfoChange}\n            />\n          </div>\n        </CardContent>\n      </Card>\n    </>\n  );\n};\n\nexport default PersonalInfo;\n"
  },
  {
    "path": "src/components/PhotoUpload.tsx",
    "content": "\"use client\"\nimport { storage } from \"@/lib/Firebase\";\nimport { ref, uploadBytes, getDownloadURL } from \"firebase/storage\";\nimport { Label } from \"./ui/label\";\nimport { Input } from \"./ui/input\";\nimport { useData } from \"@/lib/Context\";\nimport { useState } from \"react\";\nimport { Loader2 } from \"lucide-react\";\n\n\nconst PhotoUpload = () =>{\n    const { updateProfileInfo } = useData();\n\n\n\n    const [loading ,setLoading] = useState<boolean>(false)\n\n    async function handleImageUpload (file:File) {\n\n        const storageRef = ref(storage, `images/${file.name}`);\n            await uploadBytes(storageRef, file);\n        const res =  await getDownloadURL(storageRef);\n        return  res\n          \n      };\n   //  FUNCTION IMAGE UPLOAD \n   const onImageChange = async (e:React.ChangeEvent<HTMLInputElement>) => {\n     setLoading(true)\n       try {\n       const [file]:any = e.target.files;\n       if(!file) return\n       \n       const uploading = await handleImageUpload(file)\n       updateProfileInfo('i', uploading);\n       \n       \n     } catch (error) { \n       console.log(error);\n       \n     } finally{\n       setLoading(false)\n     }\n     };\n\n  \n\n    return(<>\n       <Label htmlFor=\"Profile-url\">Profile Url</Label>\n       {loading ? <Loader2 className='absolute top-0 bottom-0 left-0 right-0 m-auto h-4 w-4 animate-spin' /> : \n              <Input\n              id=\"Profile-url\"\n              name=\"i\"\n              type=\"file\"\n              onChange={onImageChange}\n              />\n            }\n    </>)\n}\n\nexport default PhotoUpload"
  },
  {
    "path": "src/components/PreviewPage.tsx",
    "content": "'use client'\nimport React, { useEffect } from 'react'\nimport DisplayScreen from './screen/DisplayScreen'\nimport DataLoading from '@/app/1/loading'\nimport confetti from 'canvas-confetti';\n\nfunction PreviewPage({data}:{data:any}) {\n    const handleClick = () => {\n        const duration = 5 * 1000;\n        const animationEnd = Date.now() + duration;\n        const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 100 };\n    \n        const randomInRange = (min: number, max: number) =>\n          Math.random() * (max - min) + min;\n    \n        const interval = window.setInterval(() => {\n          const timeLeft = animationEnd - Date.now();\n    \n          if (timeLeft <= 0) {\n            return clearInterval(interval);\n          }\n    \n          const particleCount = 50 * (timeLeft / duration);\n          confetti({\n            ...defaults,\n            particleCount,\n            origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },\n          });\n          confetti({\n            ...defaults,\n            particleCount,\n            origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },\n          });\n        }, 250);\n      };\n      useEffect(() => {\n        handleClick();\n      }, [data]);\n  return (\n    <>\n        {data ? <DisplayScreen myData={data} /> : <DataLoading />}\n    </>\n  )\n}\n\nexport default PreviewPage"
  },
  {
    "path": "src/components/Provider.tsx",
    "content": "'use client';\n\nimport { DataProvider } from \"@/lib/Context\";\nimport React from \"react\";\n\n// import { Toaster } from \"@/components/ui/toaster\";\n\nexport function Providers({ children }: { children: React.ReactNode }) {\n    return (\n        <DataProvider>\n            {children}\n            {/* <Toaster /> */}\n        </DataProvider>\n    );\n}"
  },
  {
    "path": "src/components/SocialLinkForm.tsx",
    "content": "\"use client\"\n\nimport React, { FC } from 'react'\nimport {\n    Card,\n    CardContent,\n    CardDescription,\n    CardHeader,\n    CardTitle\n} from '@/components/ui/card'\nimport { SocialInput } from './ui/SocialInput';\nimport { useData } from '@/lib/Context';\n\nconst socialLinksProvider: SocialLinkProviderProps[] = [\n    { name: 'facebook', icon: \"ph:facebook-logo-duotone\", id: \"fb\" },\n    { name: 'twitter', icon: \"ph:twitter-logo-duotone\", id: \"tw\" },\n    { name: 'instagram', icon: \"ph:instagram-logo-duotone\", id: \"ig\" },\n    { name: 'telegram', icon: \"ph:telegram-logo-duotone\", id: \"tg\" },\n    { name: 'youtube', icon: \"ph:youtube-logo-duotone\", id: \"yt\" },\n    { name: 'email', icon: \"ph:envelope-duotone\", id: \"em\" },\n    { name: 'github', icon: \"ph:github-logo-duotone\", id: \"gt\" },\n    { name: 'linkedin', icon: \"ph:linkedin-logo-duotone\", id: \"lk\" },\n    { name: 'whatsapp', icon: \"ph:whatsapp-logo-duotone\", id: \"wh\" },\n]\n\ntype InputChangeEvent = React.ChangeEvent<HTMLInputElement>;\n\ninterface SocialLinksFormProps { }\n\nconst SocialLinksForm: FC<SocialLinksFormProps> = () => {\n\n    const { MyLink, updateProfileInfo } = useData();\n  const handleInfoChange = (event: InputChangeEvent) => {\n    const { name, value } = event.target;\n    updateProfileInfo(name, value);\n  };\n\n\n    return (\n        <Card className='w-full'>\n            <CardHeader className=\"space-y-1\">\n                <CardTitle className=\"text-2xl\">Social Links</CardTitle>\n                <CardDescription>\n                    Enter your social media links here.\n                </CardDescription>\n            </CardHeader>\n            <CardContent className=\"grid md:grid-cols-2 gap-4\">\n                {socialLinksProvider.map((link) => {\n                    return (\n                        <SocialInput\n                            key={link.name}\n                            id={link.name}\n                            name={link.id}\n                            icon={link.icon}\n                            placeholder={`${link.name}.com/johndoe`}\n                            value={MyLink[link.id]}\n                            onChange={handleInfoChange}\n                        />\n                    );\n                })}\n            </CardContent>\n        </Card>\n    )\n}\n\nexport default SocialLinksForm"
  },
  {
    "path": "src/components/auth.ts",
    "content": "import type { NextAuthConfig } from \"next-auth\";\nimport \"next-auth/jwt\";\nimport NextAuth from \"next-auth\";\nimport GoogleProvider from \"next-auth/providers/google\";\nimport { createUser, isUserExists } from \"@/lib/supabase/actions\";\nconst config = {\n  providers: [\n    GoogleProvider({\n      clientId: process.env.GOOGLE_CLIENT_ID as string,\n      clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,\n    }),\n  ],\n  callbacks: {\n    authorized({ request, auth }) {\n      const { pathname } = request.nextUrl;\n      if (pathname === \"/middleware-example\") return !!auth;\n      return true;\n    },\n    jwt({ token, trigger, session, account }) {\n      if (trigger === \"update\") token.name = session.user.name;\n\n      return token;\n    },\n    async session({ session, token }) {\n      if (token?.accessToken) {\n        session.accessToken = token.accessToken;\n      }\n      return session;\n    },\n    async signIn({ account, profile }: any) {\n      if (account?.provider === \"google\") {\n        const isExists = await isUserExists(profile?.email);\n\n        if (isExists.status === \"success\") {\n          await createUser(profile);\n          return true;\n        }\n        return true;\n      }\n      return true;\n    },\n  },\n} satisfies NextAuthConfig;\n\nexport const { handlers, auth, signIn, signOut } = NextAuth(config);\n\ndeclare module \"next-auth\" {\n  interface Session {\n    accessToken?: string;\n  }\n}\n\ndeclare module \"next-auth/jwt\" {\n  interface JWT {\n    accessToken?: string;\n  }\n}\n"
  },
  {
    "path": "src/components/forms/LoginGoogleBtn.tsx",
    "content": "'use client'\nimport React from 'react'\nimport { Button } from '../ui/button'\nimport { handleGoogleAuth } from './formAction'\n\n function LoginGoogleBtn({callbackUrl = '/'}:{callbackUrl:string}) {\n  return (\n    // <form  className=\"w-full\" action={() => handleGoogleAuth(callbackUrl)}>\n    <Button variant=\"subtle\" type='submit'  className=\"w-full bg-gray-200\" onClick={() => handleGoogleAuth(callbackUrl)} >\n          <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              className=\"mr-2 h-5 w-5\"\n              x=\"0px\"\n              y=\"0px\"\n              width=\"20\"\n              height=\"20\"\n              viewBox=\"0 0 48 48\"\n            >\n              <path\n                fill=\"#FFC107\"\n                d=\"M43.611,20.083H42V20H24v8h11.303c-1.649,4.657-6.08,8-11.303,8c-6.627,0-12-5.373-12-12c0-6.627,5.373-12,12-12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C12.955,4,4,12.955,4,24c0,11.045,8.955,20,20,20c11.045,0,20-8.955,20-20C44,22.659,43.862,21.35,43.611,20.083z\"\n              ></path>\n              <path\n                fill=\"#FF3D00\"\n                d=\"M6.306,14.691l6.571,4.819C14.655,15.108,18.961,12,24,12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C16.318,4,9.656,8.337,6.306,14.691z\"\n              ></path>\n              <path\n                fill=\"#4CAF50\"\n                d=\"M24,44c5.166,0,9.86-1.977,13.409-5.192l-6.19-5.238C29.211,35.091,26.715,36,24,36c-5.202,0-9.619-3.317-11.283-7.946l-6.522,5.025C9.505,39.556,16.227,44,24,44z\"\n              ></path>\n              <path\n                fill=\"#1976D2\"\n                d=\"M43.611,20.083H42V20H24v8h11.303c-0.792,2.237-2.231,4.166-4.087,5.571c0.001-0.001,0.002-0.001,0.003-0.002l6.19,5.238C36.971,39.205,44,34,44,24C44,22.659,43.862,21.35,43.611,20.083z\"\n              ></path>\n            </svg>\n            Continue with Google\n          </Button>\n          // </form>\n  )\n}\n\nexport default LoginGoogleBtn"
  },
  {
    "path": "src/components/forms/SignupForm.tsx",
    "content": "'use client'\nimport React from 'react'\nimport { Input } from \"@/components/ui/input\"\nimport { Label } from \"@/components/ui/label\"\nimport { Button } from \"@/components/ui/button\"\nfunction SignupForm() {\n  return (\n    <div className=\"grid gap-4\">\n        <div className=\"grid grid-cols-2 gap-4\">\n          <div className=\"grid gap-2\">\n            <Label htmlFor=\"first-name\">First name</Label>\n            <Input id=\"first-name\" placeholder=\"Max\" required className='border-input'/>\n          </div>\n          <div className=\"grid gap-2\">\n            <Label htmlFor=\"last-name\">Last name</Label>\n            <Input id=\"last-name\" placeholder=\"Robinson\" required />\n          </div>\n        </div>\n        <div className=\"grid gap-2\">\n          <Label htmlFor=\"email\">Email</Label>\n          <Input\n            id=\"email\"\n            type=\"email\"\n            placeholder=\"m@example.com\"\n            required\n          />\n        </div>\n        <div className=\"grid gap-2\">\n          <Label htmlFor=\"password\">Password</Label>\n          <Input id=\"password\" type=\"password\" />\n        </div>\n        <Button type=\"submit\" className=\"w-full\">\n          Create an account\n        </Button>\n        <Button variant=\"outline\" className=\"w-full\">\n        <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              className=\"mr-2 h-5 w-5\"\n              x=\"0px\"\n              y=\"0px\"\n              width=\"20\"\n              height=\"20\"\n              viewBox=\"0 0 48 48\"\n            >\n              <path\n                fill=\"#FFC107\"\n                d=\"M43.611,20.083H42V20H24v8h11.303c-1.649,4.657-6.08,8-11.303,8c-6.627,0-12-5.373-12-12c0-6.627,5.373-12,12-12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C12.955,4,4,12.955,4,24c0,11.045,8.955,20,20,20c11.045,0,20-8.955,20-20C44,22.659,43.862,21.35,43.611,20.083z\"\n              ></path>\n              <path\n                fill=\"#FF3D00\"\n                d=\"M6.306,14.691l6.571,4.819C14.655,15.108,18.961,12,24,12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C16.318,4,9.656,8.337,6.306,14.691z\"\n              ></path>\n              <path\n                fill=\"#4CAF50\"\n                d=\"M24,44c5.166,0,9.86-1.977,13.409-5.192l-6.19-5.238C29.211,35.091,26.715,36,24,36c-5.202,0-9.619-3.317-11.283-7.946l-6.522,5.025C9.505,39.556,16.227,44,24,44z\"\n              ></path>\n              <path\n                fill=\"#1976D2\"\n                d=\"M43.611,20.083H42V20H24v8h11.303c-0.792,2.237-2.231,4.166-4.087,5.571c0.001-0.001,0.002-0.001,0.003-0.002l6.19,5.238C36.971,39.205,44,34,44,24C44,22.659,43.862,21.35,43.611,20.083z\"\n              ></path>\n            </svg>\n          Sign up with GitHub\n        </Button>\n      </div>\n  )\n}\n\nexport default SignupForm"
  },
  {
    "path": "src/components/forms/formAction.ts",
    "content": "'use server'\nimport { signIn, signOut } from \"../auth\";\n\nexport async function handleGoogleAuth(myCallbackUrl:string){\n    await signIn('google', {redirectTo:myCallbackUrl})\n    // await signOut({redirectTo:\"/\"})\n}"
  },
  {
    "path": "src/components/mockup/ComputerMockup.tsx",
    "content": "import React from 'react'\n\nfunction ComputerMockup({\n    children,\n  }: {\n    children: React.ReactNode;\n  })  {\n  return (\n    <div className=\"min-h-screen w-full flex  items-center justify-center relative\">\n      <div className=\"flex flex-col w-auto h-fit px-1 lg:px-0  \">\n        <figure className=\"ms-auto relative z-[1] w-full lg:w-[68rem] h-auto rounded-b-lg shadow-[0_2.75rem_3.5rem_-2rem_rgb(45_55_75_/_20%),_0_0_5rem_-2rem_rgb(45_55_75_/_15%)] dark:shadow-[0_2.75rem_3.5rem_-2rem_rgb(0_0_0_/_20%),_0_0_5rem_-2rem_rgb(0_0_0_/_15%)]\">\n          <div className=\"relative flex items-center max-w-full bg-gray-800 rounded-t-lg py-2 px-24 dark:bg-neutral-700\">\n            <div className=\"flex space-x-1 absolute top-2/4 start-4 -translate-y-1\">\n              <span className=\"h-4 w-4  bg-red-600 rounded-full dark:bg-neutral-600\"></span>\n              <span className=\"h-4 w-4 bg-green-600 rounded-full dark:bg-neutral-600\"></span>\n              <span className=\"h-4 w-4 bg-yellow-600 rounded-full dark:bg-neutral-600\"></span>\n            </div>\n            <div className=\"flex justify-center items-center w-full bg-gray-700 text-[.5rem] text-gray-400 rounded-sm sm:text-[1rem] dark:bg-neutral-600 dark:text-neutral-400\">\n              https.itzmylink.vercel.app/...\n            </div>\n          </div>\n\n          <div className=\"bg-zinc-100 rounded-b-lg h-[38rem] border relative overflow-hidden\">\n           {children}\n          </div>\n        </figure>\n      </div>\n    </div>\n  )\n}\n\nexport default ComputerMockup"
  },
  {
    "path": "src/components/mockup/MobileMockup.tsx",
    "content": "import MobileScreen from \"./MobileScreen\";\n\nconst MobileMockup = () => {\n  return (\n    <div className=\"relative mx-auto border-gray-800 dark:border-gray-800 bg-gray-800 border-[14px] rounded-[2.5rem] h-[658px] w-[354px] shadow-xl\">\n      <div className=\"w-[148px] h-[18px] bg-gray-800 top-0 rounded-b-[1rem] left-1/2 -translate-x-1/2 absolute z-50\"></div>\n      <div className=\"h-[46px] w-[3px] bg-gray-800 absolute -start-[17px] top-[124px] rounded-s-lg\"></div>\n      <div className=\"h-[46px] w-[3px] bg-gray-800 absolute -start-[17px] top-[178px] rounded-s-lg\"></div>\n      <div className=\"h-[64px] w-[3px] bg-gray-800 absolute -end-[17px] top-[142px] rounded-e-lg\"></div>\n      <MobileScreen />\n    </div>\n  );\n};\n\nexport default MobileMockup;\n"
  },
  {
    "path": "src/components/mockup/MobileScreen.tsx",
    "content": "\"use client\"\nimport { cn } from \"@/lib/utils\"\nimport { useData } from \"@/lib/Context\"\nimport React from \"react\"\nimport { BACKGROUND_OPTIONS } from \"../Background/BgSnippets\"\nimport DisplayScreen from \"../screen/DisplayScreen\"\n\nconst MobileScreen = () =>{\nconst {MyLink} = useData()\n\nconst [isEmpty, setIsEmpty] = React.useState<boolean>(false)\n\n    React.useEffect(() => {\n        function isEmptyValues(obj: any) {\n            for (let key in obj) {\n                if (obj[key] !== \"\" && obj[key].length !== 0) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        setIsEmpty(isEmptyValues(MyLink))\n    }, [MyLink])\n\n\n\nconst selectedBgOption = MyLink\n? BACKGROUND_OPTIONS.find((option) => option.code === MyLink.bg)\n: null;\n\nconst selectedBgComponent = selectedBgOption ? selectedBgOption.component : null;\n\n\n    return(\n        <div className={cn(\"rounded-[2rem] overflow-hidden w-full h-full relative\",{\"bg-white\": !MyLink.bg} )}>\n            {\n                isEmpty\n                ? <div className='bg-white w-full  text-sm text-muted-foreground h-full flex justify-center items-center z-20'>Nothing to show...</div>\n                : (\n                    <>\n                        {!isEmpty && selectedBgComponent}\n                        \n                        <div className='h-full pt-10 px-2'>\n                                <DisplayScreen myData={MyLink}/>\n                        </div>\n                    </>\n                )\n            }\n        </div>\n    )\n} \n\nexport default MobileScreen"
  },
  {
    "path": "src/components/screen/DisplayScreen.tsx",
    "content": "\"use client\";\nimport { Icon } from \"@iconify/react/dist/iconify.js\";\nimport React from \"react\";\nimport AdditionalLinkCard from \"../AdditionalLinkCards\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport SlightFlip from \"../Animation/FlipText\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\nimport BlurIn from \"../Animation/BlurText\";\nimport FramerWrapper from \"../Animation/FramerWrapper\";\nimport { TextEffect } from \"../Animation/TextEffect\";\nimport { ImageIcon } from \"lucide-react\";\n\nconst DisplayScreen: React.FC<DisplayDataProps> = ({ myData }) => {\n  const EmptySocialLiks =\n    !myData.fb &&\n    !myData.ig &&\n    !myData.tg &&\n    !myData.em &&\n    !myData.tw &&\n    !myData.lk &&\n    !myData.yt &&\n    !myData.gt &&\n    !myData.wh;\n\n  const iconMap: Record<string, string> = {\n    fb: \"ph:facebook-logo-duotone\",\n    tw: \"ph:twitter-logo-duotone\",\n    ig: \"ph:instagram-logo-duotone\",\n    tg: \"ph:telegram-logo-duotone\",\n    wh: \"ph:whatsapp-logo-duotone\",\n    yt: \"ph:youtube-logo-duotone\",\n    em: \"ph:envelope-duotone\",\n    gt: \"ph:github-logo-duotone\",\n    lk: \"ph:linkedin-logo-duotone\",\n  };\n  \n \n  return (\n    <AnimatePresence>\n      <motion.div className=\" relative flex-grow flex-1 grid place-content-center\">\n        <div className=\"flex flex-col items-center justify-center min-h-[100px] mx-auto w-full \">\n          {/* Avatar------- */}\n          <div className=\"w-full flex items-center justify-center  h-fit px-2 py-4   \">\n            <motion.div\n              className=\"aspect-square relative h-[5.5rem] w-auto bg-gray-100 rounded-full overflow-hidden ring ring-slate-200\"\n              initial={{ scale: 0 }}\n              animate={{ rotate: 360, scale: 1 }}\n              transition={{\n                type: \"spring\",\n                stiffness: 260,\n                damping: 20,\n              }}\n            >\n              <Avatar className=\"h-full w-auto object-fill\">\n            <AvatarImage\n              src={myData.i}\n              alt={`PIC`}\n              className=\"h-full w-full object-cover\"\n            />\n            <AvatarFallback>\n              <ImageIcon className=\"h-8 w-8 text-gray-300\" />\n            </AvatarFallback>\n          </Avatar>\n            </motion.div>\n          </div>\n          {/* Name & About------- */}\n          <div className=\"w-full flex my-2 flex-col items-center justify-center \">\n            <TextEffect\n              per=\"char\"\n              preset=\"fade\"\n              className=\"text-lg font-bold  text-slate-800 dark:text-white md:text-xl\"\n            >\n              {myData.n as string}\n            </TextEffect>\n            <BlurIn\n              word={myData.a as string}\n              className=\" text-xs md:text-sm mt-2 text-slate-600 text-center max-w-[581px]\"\n            />\n          </div>\n          {/* Social Icons------- */}\n          {!EmptySocialLiks && (\n            <div className=\"w-full flex mt-5 mb-9 items-center justify-center flex-wrap \">\n              {Object.entries(myData).map(([key, value], indx) => {\n                const timing = 0.55 + indx * 0.125;\n                const excludedKeys = [\"i\", \"n\", \"a\", \"bg\"];\n                if (key !== \"ls\" && value && !excludedKeys.includes(key)) {\n                  const propIcon = iconMap[key as keyof typeof iconMap];\n                  if (key === \"em\") {\n                    // Handle email link generation\n                    return (\n                      <FramerWrapper\n                        key={indx}\n                        className=\"p-1\"\n                        scale={0.8}\n                        y={50}\n                        delay={timing}\n                      >\n                        <span key={key}>\n                          <a href={`mailto:${value}`}>\n                            {/* <Icon icon={propIcon as any} className=\"h-6 w-6\" /> */}\n                          </a>\n                        </span>\n                      </FramerWrapper>\n                    );\n                  } else if (key === \"wh\") {\n                    // Handle WhatsApp link generation\n                    const whatsappValue = value.startsWith(\"https://wa.me/\")\n                      ? value // If it already starts with the correct prefix\n                      : `https://wa.me/${value}`;\n\n                    return (\n                      <FramerWrapper\n                        key={indx}\n                        className=\"p-1\"\n                        scale={0.8}\n                        y={50}\n                        delay={timing}\n                      >\n                        <span key={key}>\n                          <a\n                            href={whatsappValue}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                          >\n                            <Icon\n                              icon={propIcon as string}\n                              className=\"h-6 w-6\"\n                            />\n                          </a>\n                        </span>\n                      </FramerWrapper>\n                    );\n                  } else {\n                    return (\n                      <FramerWrapper\n                        key={indx}\n                        className=\"p-1\"\n                        scale={0.8}\n                        y={50}\n                        delay={timing}\n                      >\n                        <span key={key}>\n                          <a\n                            href={value}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                          >\n                            <Icon\n                              icon={propIcon as string}\n                              className=\"h-6 w-6\"\n                            />\n                          </a>\n                        </span>\n                      </FramerWrapper>\n                    );\n                  }\n                }\n                return null;\n              })}\n            </div>\n          )}\n          {/* Links------- */}\n          <div className=\"w-full   min-h-[300px]\">\n            <ul className=\"space-y-2\">\n              {myData.ls &&\n                myData.ls.map((link, id) => {\n                  // Define the alternating values for x and y\n                  const positions = [\n                    { x: -200, y: 0 },\n                    { x: 200, y: 0 },\n                  ];\n                  const timing = 0.55 + id * 0.125;\n                  // Use modulus operator to cycle through the positions array\n                  const { x, y } = positions[id % positions.length];\n\n                  return (\n                    <FramerWrapper y={y} x={x} delay={timing} key={id}>\n                    <AdditionalLinkCard\n                        label={link.l}\n                        icon={link.i}\n                        url={link.u}\n                        key={id}\n                    />\n                    </FramerWrapper>\n                  );\n                })}\n            </ul>\n          </div>\n        </div>\n      </motion.div>\n    </AnimatePresence>\n  );\n};\n\nexport default DisplayScreen;\n"
  },
  {
    "path": "src/components/ui/Drrawer.tsx",
    "content": "\"use client\"\n\nimport { forwardRef } from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst DrawerTrigger = DrawerPrimitive.Trigger\n\nconst DrawerContent = forwardRef<\n    React.ElementRef<typeof DrawerPrimitive.Content>,\n    React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n    <DrawerPrimitive.Portal>\n        <DrawerPrimitive.Overlay className=\"fixed inset-0 z-50 bg-zinc-950/60\" />\n        <DrawerPrimitive.Content\n            ref={ref}\n            className={cn(\n                \"fixed inset-x-0 bottom-0 z-50 mt-24 h-[96%] rounded-t-[10px] bg-background overflow-hidden\",\n                className\n            )}\n            {...props}\n        >\n            <div className=\"absolute left-1/2 top-3 h-1.5 w-[50px] translate-x-[-50%] rounded-full bg-muted z-50\" />\n            {children}\n        </DrawerPrimitive.Content>\n    </DrawerPrimitive.Portal>\n))\nDrawerContent.displayName = \"DrawerContent\"\n\nexport { DrawerTrigger, DrawerContent }"
  },
  {
    "path": "src/components/ui/SocialInput.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Icon } from '@iconify/react';\n\nexport interface InputProps\n    extends React.InputHTMLAttributes<HTMLInputElement> {\n    icon: string\n}\n\nconst SocialInput = React.forwardRef<HTMLInputElement, InputProps>(\n    ({ className, icon: propIcon, ...props }, ref) => {\n        return (\n            <div className=\"relative\">\n                <Icon icon={propIcon} className=\"h-5 w-5 absolute left-2.5 -translate-y-2/4 top-2/4 \" />\n                <input\n                    type=\"search\"\n                    className={cn(\n                        \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 pl-10\",\n                        className\n                    )}\n                    ref={ref}\n                    {...props}\n                />\n            </div>\n        )\n    }\n)\nSocialInput.displayName = \"SocialInput\"\n\nexport { SocialInput }"
  },
  {
    "path": "src/components/ui/SortableLink.tsx",
    "content": "\"use client\";\nimport React, { FC } from \"react\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { Card } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { useData } from \"@/lib/Context\";\nimport {\n    Select,\n    SelectContent,\n    SelectGroup,\n    SelectItem,\n    SelectLabel,\n    SelectTrigger,\n    SelectValue,\n  } from \"@/components/ui/select\"\n\n\ninterface SortableLinksProps {\n  id: AdditionalLinkProps;\n  index: number;\n}\n\nexport const SortableLinks: FC<SortableLinksProps> = ({ id, index }) => {\n  let uniqueID = id.id;\n\n  const { attributes, listeners, setNodeRef, transform, transition } =\n    useSortable({ id: uniqueID });\n\n  const style = {\n    transform: CSS.Transform.toString(transform),\n    transition,\n  };\n\n  const { MyLink, updateAdditionalInfo } = useData();\n\n//   ICONS LISTS \nconst iconsLists = [ \n    {name:'My Portfolio',code:'ph:laptop-duotone'},\n    {name:'Chatbot project',code:'ant-design:robot-outlined'},\n    {name:'Ai project',code:'fluent:brain-circuit-20-regular'},\n    {name:'Web Project',code:'icon-park-outline:blockchain'},\n    {name:'My Blogs',code:'ph:pencil-duotone'},\n]\n\n\n  const showWhatvalue = (e:any) =>{\n    const newLinks = [...MyLink.ls];\n    newLinks[index].i = e\n    updateAdditionalInfo(newLinks);\nconsole.log(e);\n\n  }\n\n  return (\n    <div ref={setNodeRef} style={style} key={uniqueID}>\n      <Card className=\"p-4 relative\">\n        <div className=\"space-y-4\">\n          <div className=\"grid md:grid-cols-2 gap-2\">\n            <div className=\"grid gap-2\">\n              <Label htmlFor={`link-icon-${uniqueID}`}>Icon Key</Label>\n              <Select onValueChange={showWhatvalue} name=\"i\" value={id.i}>\n                <SelectTrigger className=\"w-[180px]\">\n                  <SelectValue placeholder=\"Select a Icons\" />\n                </SelectTrigger>\n                <SelectContent >\n                  <SelectGroup >\n                    <SelectLabel>none</SelectLabel>\n                    {iconsLists.map((val,i)=>{\n                         return <SelectItem key={i} value={`${val.code}`}>{val.name}</SelectItem>\n                    })}\n                    \n                  </SelectGroup>\n                </SelectContent>\n              </Select>\n             \n            </div>\n            <div className=\"grid gap-2\">\n              <Label htmlFor={`link-name-${uniqueID}`}>Label</Label>\n              <Input\n                id={`link-name-${uniqueID}`}\n                name=\"l\"\n                type=\"text\"\n                placeholder=\"Amazon\"\n                value={id.l}\n                onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n                  const newLinks = [...MyLink.ls];\n                  newLinks[index].l = e.target.value;\n                  updateAdditionalInfo(newLinks);\n                }}\n              />\n            </div>\n          </div>\n          <div className=\"grid gap-2\">\n            <Label htmlFor={`link-name-${uniqueID}`}>Destination URL</Label>\n            <Input\n              id={`link-url-${uniqueID}`}\n              name=\"u\"\n              type=\"url\"\n              placeholder=\"https://example.com\"\n              value={id.u}\n              onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n                const newLinks = [...MyLink.ls];\n                newLinks[index].u = e.target.value;\n                updateAdditionalInfo(newLinks);\n              }}\n            />\n          </div>\n        </div>\n        <button\n          className=\"DragHandle absolute -top-2 right-5 bg-white\"\n          {...attributes}\n          {...listeners}\n        >\n          <svg viewBox=\"0 0 20 20\" width=\"15\">\n            <path\n              d=\"M7 2a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 2zm0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 8zm0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 7 14zm6-8a2 2 0 1 0-.001-4.001A2 2 0 0 0 13 6zm0 2a2 2 0 1 0 .001 4.001A2 2 0 0 0 13 8zm0 6a2 2 0 1 0 .001 4.001A2 2 0 0 0 13 14z\"\n              transform=\"rotate(-90,10,10)\"\n              fill={\"currentcolor\"}\n            ></path>\n          </svg>\n        </button>\n      </Card>\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/components/ui/alert-dialog.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Overlay\n    className={cn(\n      \"fixed inset-0 z-50 bg-black/80  data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPortal>\n    <AlertDialogOverlay />\n    <AlertDialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n        className\n      )}\n      {...props}\n    />\n  </AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-2 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\n\nconst AlertDialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n)\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\n\nconst AlertDialogTitle = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Title\n    ref={ref}\n    className={cn(\"text-lg font-semibold\", className)}\n    {...props}\n  />\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nAlertDialogDescription.displayName =\n  AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Action>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Action\n    ref={ref}\n    className={cn(buttonVariants(), className)}\n    {...props}\n  />\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Cancel\n    ref={ref}\n    className={cn(\n      buttonVariants({ variant: \"outline\" }),\n      \"mt-2 sm:mt-0\",\n      className\n    )}\n    {...props}\n  />\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n  AlertDialog,\n  AlertDialogPortal,\n  AlertDialogOverlay,\n  AlertDialogTrigger,\n  AlertDialogContent,\n  AlertDialogHeader,\n  AlertDialogFooter,\n  AlertDialogTitle,\n  AlertDialogDescription,\n  AlertDialogAction,\n  AlertDialogCancel,\n}\n"
  },
  {
    "path": "src/components/ui/avatar.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Avatar = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n      className\n    )}\n    {...props}\n  />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Image>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Image\n    ref={ref}\n    className={cn(\"aspect-square h-full w-full\", className)}\n    {...props}\n  />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Fallback>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Fallback\n    ref={ref}\n    className={cn(\n      \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n      className\n    )}\n    {...props}\n  />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"
  },
  {
    "path": "src/components/ui/button.tsx",
    "content": "import { cn } from '@/lib/utils'\nimport { cva, VariantProps } from 'class-variance-authority'\nimport { Loader2 } from 'lucide-react'\nimport * as React from 'react'\n\nconst buttonVariants = cva(\n  'active:scale-95 inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 disabled:opacity-50 dark:focus:ring-slate-400 disabled:pointer-events-none dark:focus:ring-offset-slate-900',\n  {\n    variants: {\n      variant: {\n        default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n        destructive:\n          \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n        outline:\n          'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n        custom:\n          ' bg-[#343e44] text-white  hover:bg-[#5c6165]  hover:shadow-lg',\n        subtle:\n          'border border-input bg-background hover:bg-[#6aa2e6] hover:text-white',\n        ghost:\n          'bg-transparent hover:bg-zinc-100 text-zinc-800 data-[state=open]:bg-transparent data-[state=open]:bg-transparent',\n        link: 'bg-transparent dark:bg-transparent underline-offset-4 hover:underline text-slate-900 dark:text-slate-100 hover:bg-transparent dark:hover:bg-transparent',\n      },\n      size: {\n        default: 'h-10 py-2 px-4',\n        sm: 'h-9 px-2 rounded-md',\n        xs: 'h-8 px-1.5 rounded-sm',\n        lg: 'h-11 px-8 rounded-md',\n        icon: \"h-10 w-10\",\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n)\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n  VariantProps<typeof buttonVariants> {\n  isLoading?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, children, variant, isLoading, size, ...props }, ref) => {\n    return (\n      <button\n        className={cn(buttonVariants({ variant, size, className }))}\n        ref={ref}\n        disabled={isLoading}\n        {...props}>\n        {isLoading ? <Loader2 className='mr-2 h-4 w-4 animate-spin' /> : null}\n        {children}\n      </button>\n    )\n  }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }"
  },
  {
    "path": "src/components/ui/card.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\n      \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n      className\n    )}\n    {...props}\n  />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n    {...props}\n  />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n  <h3\n    ref={ref}\n    className={cn(\n      \"text-2xl font-semibold leading-none tracking-tight\",\n      className\n    )}\n    {...props}\n  />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <p\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"flex items-center p-6 pt-0\", className)}\n    {...props}\n  />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n"
  },
  {
    "path": "src/components/ui/dialog.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogOverlay = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Overlay\n    ref={ref}\n    className={cn(\n      \"fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n  />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n  <DialogPortal>\n    <DialogOverlay />\n    <DialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n        <X className=\"h-4 w-4\" />\n        <span className=\"sr-only\">Close</span>\n      </DialogPrimitive.Close>\n    </DialogPrimitive.Content>\n  </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-1.5 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Title\n    ref={ref}\n    className={cn(\n      \"text-lg font-semibold leading-none tracking-tight\",\n      className\n    )}\n    {...props}\n  />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n  Dialog,\n  DialogPortal,\n  DialogOverlay,\n  DialogTrigger,\n  DialogContent,\n  DialogHeader,\n  DialogFooter,\n  DialogTitle,\n  DialogDescription,\n}\n"
  },
  {
    "path": "src/components/ui/dropdown-menu.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n    inset?: boolean\n  }\n>(({ className, inset, children, ...props }, ref) => (\n  <DropdownMenuPrimitive.SubTrigger\n    ref={ref}\n    className={cn(\n      \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <ChevronRight className=\"ml-auto h-4 w-4\" />\n  </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n  DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n  <DropdownMenuPrimitive.SubContent\n    ref={ref}\n    className={cn(\n      \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuSubContent.displayName =\n  DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n  <DropdownMenuPrimitive.Portal>\n    <DropdownMenuPrimitive.Content\n      ref={ref}\n      sideOffset={sideOffset}\n      className={cn(\n        \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n        className\n      )}\n      {...props}\n    />\n  </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <DropdownMenuPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n  <DropdownMenuPrimitive.CheckboxItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    checked={checked}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n  DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n  <DropdownMenuPrimitive.RadioItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuPrimitive.ItemIndicator>\n        <Circle className=\"h-2 w-2 fill-current\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <DropdownMenuPrimitive.Label\n    ref={ref}\n    className={cn(\n      \"px-2 py-1.5 text-sm font-semibold\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <DropdownMenuPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n    {...props}\n  />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return (\n    <span\n      className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n      {...props}\n    />\n  )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n  DropdownMenu,\n  DropdownMenuTrigger,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuCheckboxItem,\n  DropdownMenuRadioItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuShortcut,\n  DropdownMenuGroup,\n  DropdownMenuPortal,\n  DropdownMenuSub,\n  DropdownMenuSubContent,\n  DropdownMenuSubTrigger,\n  DropdownMenuRadioGroup,\n}\n"
  },
  {
    "path": "src/components/ui/form.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport {\n  Controller,\n  ControllerProps,\n  FieldPath,\n  FieldValues,\n  FormProvider,\n  useFormContext,\n} from \"react-hook-form\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Label } from \"@/components/ui/label\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<\n  TFieldValues extends FieldValues = FieldValues,\n  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n> = {\n  name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n  {} as FormFieldContextValue\n)\n\nconst FormField = <\n  TFieldValues extends FieldValues = FieldValues,\n  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n>({\n  ...props\n}: ControllerProps<TFieldValues, TName>) => {\n  return (\n    <FormFieldContext.Provider value={{ name: props.name }}>\n      <Controller {...props} />\n    </FormFieldContext.Provider>\n  )\n}\n\nconst useFormField = () => {\n  const fieldContext = React.useContext(FormFieldContext)\n  const itemContext = React.useContext(FormItemContext)\n  const { getFieldState, formState } = useFormContext()\n\n  const fieldState = getFieldState(fieldContext.name, formState)\n\n  if (!fieldContext) {\n    throw new Error(\"useFormField should be used within <FormField>\")\n  }\n\n  const { id } = itemContext\n\n  return {\n    id,\n    name: fieldContext.name,\n    formItemId: `${id}-form-item`,\n    formDescriptionId: `${id}-form-item-description`,\n    formMessageId: `${id}-form-item-message`,\n    ...fieldState,\n  }\n}\n\ntype FormItemContextValue = {\n  id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n  {} as FormItemContextValue\n)\n\nconst FormItem = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const id = React.useId()\n\n  return (\n    <FormItemContext.Provider value={{ id }}>\n      <div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n    </FormItemContext.Provider>\n  )\n})\nFormItem.displayName = \"FormItem\"\n\nconst FormLabel = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n  const { error, formItemId } = useFormField()\n\n  return (\n    <Label\n      ref={ref}\n      className={cn(error && \"text-destructive\", className)}\n      htmlFor={formItemId}\n      {...props}\n    />\n  )\n})\nFormLabel.displayName = \"FormLabel\"\n\nconst FormControl = React.forwardRef<\n  React.ElementRef<typeof Slot>,\n  React.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n  const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n  return (\n    <Slot\n      ref={ref}\n      id={formItemId}\n      aria-describedby={\n        !error\n          ? `${formDescriptionId}`\n          : `${formDescriptionId} ${formMessageId}`\n      }\n      aria-invalid={!!error}\n      {...props}\n    />\n  )\n})\nFormControl.displayName = \"FormControl\"\n\nconst FormDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n  const { formDescriptionId } = useFormField()\n\n  return (\n    <p\n      ref={ref}\n      id={formDescriptionId}\n      className={cn(\"text-sm text-muted-foreground\", className)}\n      {...props}\n    />\n  )\n})\nFormDescription.displayName = \"FormDescription\"\n\nconst FormMessage = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n  const { error, formMessageId } = useFormField()\n  const body = error ? String(error?.message) : children\n\n  if (!body) {\n    return null\n  }\n\n  return (\n    <p\n      ref={ref}\n      id={formMessageId}\n      className={cn(\"text-sm font-medium text-destructive\", className)}\n      {...props}\n    >\n      {body}\n    </p>\n  )\n})\nFormMessage.displayName = \"FormMessage\"\n\nexport {\n  useFormField,\n  Form,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormDescription,\n  FormMessage,\n  FormField,\n}\n"
  },
  {
    "path": "src/components/ui/input-otp.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { Dot } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst InputOTP = React.forwardRef<\n  React.ElementRef<typeof OTPInput>,\n  React.ComponentPropsWithoutRef<typeof OTPInput>\n>(({ className, containerClassName, ...props }, ref) => (\n  <OTPInput\n    ref={ref}\n    containerClassName={cn(\n      \"flex items-center gap-2 has-[:disabled]:opacity-50\",\n      containerClassName\n    )}\n    className={cn(\"disabled:cursor-not-allowed\", className)}\n    {...props}\n  />\n))\nInputOTP.displayName = \"InputOTP\"\n\nconst InputOTPGroup = React.forwardRef<\n  React.ElementRef<\"div\">,\n  React.ComponentPropsWithoutRef<\"div\">\n>(({ className, ...props }, ref) => (\n  <div ref={ref} className={cn(\"flex items-center\", className)} {...props} />\n))\nInputOTPGroup.displayName = \"InputOTPGroup\"\n\nconst InputOTPSlot = React.forwardRef<\n  React.ElementRef<\"div\">,\n  React.ComponentPropsWithoutRef<\"div\"> & { index: number }\n>(({ index, className, ...props }, ref) => {\n  const inputOTPContext = React.useContext(OTPInputContext)\n  const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index]\n\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md\",\n        isActive && \"z-10 ring-2 ring-ring ring-offset-background\",\n        className\n      )}\n      {...props}\n    >\n      {char}\n      {hasFakeCaret && (\n        <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n          <div className=\"h-4 w-px animate-caret-blink bg-foreground duration-1000\" />\n        </div>\n      )}\n    </div>\n  )\n})\nInputOTPSlot.displayName = \"InputOTPSlot\"\n\nconst InputOTPSeparator = React.forwardRef<\n  React.ElementRef<\"div\">,\n  React.ComponentPropsWithoutRef<\"div\">\n>(({ ...props }, ref) => (\n  <div ref={ref} role=\"separator\" {...props}>\n    <Dot />\n  </div>\n))\nInputOTPSeparator.displayName = \"InputOTPSeparator\"\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n"
  },
  {
    "path": "src/components/ui/input.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface InputProps\n  extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n  ({ className, type, ...props }, ref) => {\n    return (\n      <input\n        type={type}\n        className={cn(\n          \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n"
  },
  {
    "path": "src/components/ui/label.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n  \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n    VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n  <LabelPrimitive.Root\n    ref={ref}\n    className={cn(labelVariants(), className)}\n    {...props}\n  />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n"
  },
  {
    "path": "src/components/ui/select.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <SelectPrimitive.Icon asChild>\n      <ChevronDown className=\"h-4 w-4 opacity-50\" />\n    </SelectPrimitive.Icon>\n  </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectContent = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n  <SelectPrimitive.Portal>\n    <SelectPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n        position === \"popper\" &&\n          \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n        className\n      )}\n      position={position}\n      {...props}\n    >\n      <SelectPrimitive.Viewport\n        className={cn(\n          \"p-1\",\n          position === \"popper\" &&\n            \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n        )}\n      >\n        {children}\n      </SelectPrimitive.Viewport>\n    </SelectPrimitive.Content>\n  </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Label\n    ref={ref}\n    className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n    {...props}\n  />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <SelectPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </SelectPrimitive.ItemIndicator>\n    </span>\n\n    <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n  </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n    {...props}\n  />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n  Select,\n  SelectGroup,\n  SelectValue,\n  SelectTrigger,\n  SelectContent,\n  SelectLabel,\n  SelectItem,\n  SelectSeparator,\n}\n"
  },
  {
    "path": "src/components/ui/skeleton.tsx",
    "content": "import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n  return (\n    <div\n      className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n      {...props}\n    />\n  )\n}\n\nexport { Skeleton }\n"
  },
  {
    "path": "src/components/ui/textarea.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface TextareaProps\n  extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n  ({ className, ...props }, ref) => {\n    return (\n      <textarea\n        className={cn(\n          \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n"
  },
  {
    "path": "src/lib/Context.tsx",
    "content": "import React, { createContext, useContext, useState } from \"react\";\n\ninterface LinkProps {\n  n: string; //Name\n  i: string; // image\n  a: string; //About\n  bg: string; //Background\n  fb: string; //facebook\n  ig: string; //instagram\n  tg: string; //telegram\n  em: string; //email\n  tw: string; //twitter\n  lk: string; //linkedin\n  yt: string; //youtube\n  gt: string; //github\n  wh: string; //whatsup\n  ls: AdditionalLinkProps[]; // Additional Forms\n}\nconst initialData: LinkProps = {\n  n: \"\", //Name\n  i: \"\", // image\n  a: \"\", //About\n  bg: \"\", //Background\n  fb: \"\", //facebook\n  ig: \"\", //instagram\n  tg: \"\", //telegram\n  em: \"\", //email\n  tw: \"\", //twitter\n  lk: \"\", //linkedin\n  yt: \"\", //youtube\n  gt: \"\", //github\n  wh: \"\", //whatsup\n  ls: [], //Additional Forms\n};\ninterface DataContextType {\n  // Todo: fix type props\n  data: string;\n  MyLink: LinkProps;\n  addNewData: (linkData: AdditionalLinkProps) => void;\n  setData: (val: string) => void;\n  updateProfileInfo: (name: any, value: any) => void;\n  selectBackground: (bgcode: string) => void;\n  updateIndex: (updatedIndex: AdditionalLinkProps[]) => void;\n  updateAdditionalInfo: (updatedIndex: any) => void;\n  showDemo: () => void;\n}\n\nconst demoData: LinkProps = {\n  n: \"Md Taqui Imam\",\n  i: \"https://firebasestorage.googleapis.com/v0/b/projectfriendz-45b49.appspot.com/o/images%2FSocialLogo.png?alt=media&token=551c9a3c-07e4-486d-9d26-96c619d817a9&_gl=1*uluah4*_ga*NDUyNjQ5MjYxLjE2OTcyMjI3MDU.*_ga_CW55HF8NVT*MTY5NzIyMjcwNS4xLjEuMTY5NzIyMjg0Ni4xMy4wLjA.\",\n  a: \"I'm a self-taught Web developer who is always learning and creating cool Project stuffs.\",\n  fb: \"https://www.facebook.com/shahina.khatun.1044\",\n  tw: \"https://twitter.com/Taquiimam14\",\n  ig: \"https://www.instagram.com/taqui_imam_786/\",\n  tg: \"https://t.me/@Taqui_devloper\",\n  gt: \"https://github.com/taqui-786\",\n  lk: \"https://linkedin.com/in/taqui-imam\",\n  em: \"mdtaqui.jhar@gmail.com\",\n  wh: \"+916666666666\",\n  yt: \"https://youtube.com/@james_smith\",\n  bg: \"#4F4F4F\",\n  ls: [\n    {\n      id: 1,\n      i: \"ph:laptop-duotone\",\n      l: \"My Portfolio Website\",\n      u: \"https://example.com\",\n    },\n    {\n      id: 2,\n      i: \"ant-design:robot-outlined\",\n      l: \"My Chatbot Project\",\n      u: \"https://example.com/chatbot\",\n    },\n    {\n      id: 3,\n      i: \"fluent:brain-circuit-20-regular\",\n      l: \"My Machine Learning Project\",\n      u: \"https://example.com/ml\",\n    },\n    {\n      id: 4,\n      i: \"icon-park-outline:blockchain\",\n      l: \"My Blockchain Project\",\n      u: \"https://example.com/blockchain\",\n    },\n    {\n      id: 5,\n      i: \"ph:pencil-duotone\",\n      l: \"My Blog Posts\",\n      u: \"https://taquideveloper.hashnode.dev/\",\n    },\n  ],\n};\n\nconst DataContext = createContext<DataContextType | undefined>(undefined);\n\nexport const DataProvider = ({ children }: { children: React.ReactNode }) => {\n  const [data, setData] = useState<string>(\"\");\n  const [MyLink, setMyLink] = useState<LinkProps>(initialData);\n\n  // UPDATE PERSONAL INFORMATION\n  const updateProfileInfo = (name: any, value: any) => {\n    setMyLink((prevState) => ({\n      ...prevState,\n      [name]: value,\n    }));\n  };\n  // SELECT BACKGROUND FUNCTION\n  const selectBackground = (bgcode: string) => {\n    setMyLink((prevState) => ({\n      ...prevState,\n      bg: bgcode,\n    }));\n  };\n  // ADDITIONAL INFO FUNCTIONS\n  const updateIndex = (updatedIndex: AdditionalLinkProps[]) => {\n    setMyLink((prevState) => ({\n      ...prevState,\n      ls: updatedIndex,\n    }));\n  };\n  const updateAdditionalInfo = (updatedIndex: any) => {\n    setMyLink((prevState) => ({\n      ...prevState,\n      ls: updatedIndex,\n    }));\n  };\n  const addNewData = (linkData: AdditionalLinkProps) => {\n    setMyLink((prevData) => ({\n      ...prevData,\n      ls: [...prevData.ls, linkData],\n    }));\n  };\n  // SHOW DEMO FUNCTION\n  const showDemo = () => {\n  \n    setMyLink(demoData);\n  };\n  return (\n    <DataContext.Provider\n      value={{\n        data,\n        addNewData,\n        setData,\n        showDemo,\n        MyLink,\n        updateProfileInfo,\n        updateIndex,\n        selectBackground,\n        updateAdditionalInfo,\n      }}\n    >\n      {children}\n    </DataContext.Provider>\n  );\n};\n\nexport const useData = () => {\n  const context = useContext(DataContext);\n  if (!context) {\n    throw new Error(\"useData must be used within a DataProvider\");\n  }\n  return context;\n};\n"
  },
  {
    "path": "src/lib/Firebase.ts",
    "content": "\nimport { initializeApp } from 'firebase/app';\nimport { getStorage } from 'firebase/storage';\nconst firebaseConfig = {\n    apiKey: process.env.APIKEY,\n    authDomain:\"projectfriendz-45b49.firebaseapp.com\",\n    projectId: \"projectfriendz-45b49\",\n    storageBucket: \"projectfriendz-45b49.appspot.com\",\n    messagingSenderId: \"186662584426\",\n    appId: \"1:186662584426:web:b37a6002f57c2af7578a13\",\n    measurementId:\"G-ZCMDL02FYD\"\n    };\n    const app = initializeApp(firebaseConfig);\n    const storage = getStorage(app);\n    export{ storage };"
  },
  {
    "path": "src/lib/RateLimiter.tsx",
    "content": "// Function written by ChatGPT\n\nclass RateLimiter {\n    private limit: number; // Maximum allowed requests\n    private interval: number; // Time window (in milliseconds)\n    private requests: Map<string, number[]>; // In-memory storage for request timestamps\n\n    constructor(limit: number, interval: number) {\n        this.limit = limit;\n        this.interval = interval;\n        this.requests = new Map<string, number[]>();\n    }\n\n    isAllowed(key: string): boolean {\n        const now = Date.now();\n        const requests = this.requests.get(key) || [];\n\n        // Remove expired timestamps\n        const validRequests = requests.filter((timestamp) => now - timestamp <= this.interval);\n\n        if (validRequests.length < this.limit) {\n            // Add the current timestamp to the list\n            validRequests.push(now);\n            this.requests.set(key, validRequests);\n            return true;\n        } else {\n            return false; // Rate limit exceeded\n        }\n    }\n}\n\nexport default RateLimiter;"
  },
  {
    "path": "src/lib/supabase/actions.ts",
    "content": "\"use server\";\n\nimport { auth } from \"@/components/auth\";\nimport { supabaseServer } from \"./supabaseServer\";\n\n\n\nexport const isUserExists = async (email: string) => {\n  const supabase = await supabaseServer()\n    .from(\"users\")\n    .select(\"*\")\n    .eq(\"email\", email);\n    \n  if (supabase.data?.length) {\n    return { status: \"exists\"};\n  }\n  return { status: \"success\" };\n};\n\nexport const createUser = async (payload:any) => {\n    const supabase = await supabaseServer().from('users').insert({fullname:payload?.name, email: payload?.email})\n      \n    if (supabase.statusText === 'Created') {\n      return { status: \"success\"};\n    }\n    return { status: \"error\", message: supabase.error };\n  };\n\n  type CreateCustomPathResponse = \n  | { status: \"exists\"; message: string }\n  | { status: \"notAuthenticated\"; message: string }\n  | { status: \"created\"; message: string };\n\nexport const createCustomPath = async (path: string,localLink:string): Promise<CreateCustomPathResponse> => {\n  const session = await auth();\n  if (session?.user) {\n    const supabase = await supabaseServer();\n    const isExists = await supabase.from('links').select('*').eq('path', path);\n\n    if (isExists.data?.length) {\n      return { status: \"exists\", message: `This '/${path}' already exists.` };\n    }\n\n    const create = await supabase.from('links').insert({ path, email: session.user?.email, link:localLink });\n    \n    if (create.statusText === 'Created') {\n      return { status: \"created\", message: \"Link created successfully\" };\n    }\n  }\n  \n  return { status: \"notAuthenticated\", message: \"Not authenticated\" };\n};\n  "
  },
  {
    "path": "src/lib/supabase/supabaseClient.ts",
    "content": "import { createBrowserClient } from '@supabase/ssr'\n\nexport function supabaseClient() {\n  // Create a supabase client on the browser with project's credentials\n  return createBrowserClient(\n    process.env.NEXT_PUBLIC_SUPABASE_URL!,\n    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!\n  )\n}"
  },
  {
    "path": "src/lib/supabase/supabaseMiddleware.ts",
    "content": "import { createServerClient, type CookieOptions } from '@supabase/ssr'\nimport { NextResponse, type NextRequest } from 'next/server'\n\nexport async function updateSession(request: NextRequest) {\n  let supabaseResponse = NextResponse.next({\n    request,\n  })\n\n  const supabase = createServerClient(\n    process.env.NEXT_PUBLIC_SUPABASE_URL!,\n    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n    {\n      cookies: {\n        getAll() {\n          return request.cookies.getAll()\n        },\n        setAll(cookiesToSet) {\n          cookiesToSet.forEach(({ name, value, options }) => request.cookies.set(name, value))\n          supabaseResponse = NextResponse.next({\n            request,\n          })\n          cookiesToSet.forEach(({ name, value, options }) =>\n            supabaseResponse.cookies.set(name, value, options)\n          )\n        },\n      },\n    }\n  )\n\n  // refreshing the auth token\n  await supabase.auth.getUser()\n\n  return supabaseResponse\n}"
  },
  {
    "path": "src/lib/supabase/supabaseServer.ts",
    "content": "import { createServerClient, type CookieOptions } from '@supabase/ssr'\nimport { cookies } from 'next/headers'\n\nexport function supabaseServer() {\n  const cookieStore = cookies()\n\n  // Create a server's supabase client with newly configured cookie,\n  // which could be used to maintain user's session\n  return createServerClient(\n    process.env.NEXT_PUBLIC_SUPABASE_URL!,\n    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n    {\n      cookies: {\n        getAll() {\n          return cookieStore.getAll()\n        },\n        setAll(cookiesToSet) {\n          try {\n            cookiesToSet.forEach(({ name, value, options }) =>\n              cookieStore.set(name, value, options)\n            )\n          } catch {\n            // The `setAll` method was called from a Server Component.\n            // This can be ignored if you have middleware refreshing\n            // user sessions.\n          }\n        },\n      },\n    }\n  )\n}"
  },
  {
    "path": "src/lib/utils.ts",
    "content": "import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n \nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\nimport { encode, decode } from 'js-base64';\n\nexport const encodeData = (obj: any): string => {\n  return encode(JSON.stringify(obj));\n};\n\nexport const decodeData = (base64: string): any => {\n  return JSON.parse(decode(base64));\n};"
  },
  {
    "path": "src/middleware.ts",
    "content": "import { type NextRequest } from 'next/server'\nimport { updateSession } from './lib/supabase/supabaseMiddleware'\n\n\nexport async function middleware(request: NextRequest) {\n  // update user's auth session\n  return await updateSession(request)\n}\n\nexport const config = {\n  matcher: [\n    /*\n     * Match all request paths except for the ones starting with:\n     * - _next/static (static files)\n     * - _next/image (image optimization files)\n     * - favicon.ico (favicon file)\n     * Feel free to modify this pattern to include more paths.\n     */\n    '/((?!_next/static|_next/image|favicon.ico|.*\\\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)',\n  ],\n}"
  },
  {
    "path": "src/types/Types.ts",
    "content": "\ninterface DataProps {\n    n?: string;\n    a?: string;\n    i?: string;\n    bg?: string;\n    fb?: string;\n    tg?: string;\n    ig?: string;\n    gt?: string;\n    tw?: string;\n    lk?: string;\n    em?: string;\n    wh?: string;\n    yt?: string;\n    ls?: AdditionalLinkProps[];\n};\n\nconst socialLinksData = {\n    fb: 'facebook',\n    tw: 'twitter',\n    ig: 'instagram',\n    gt: 'github',\n    tg: 'telegram',\n    lk: 'linkedin',\n    em: 'email',\n    wh: 'whatsapp',\n    yt: 'youtube',\n};\n\ninterface SocialLinkProviderProps {\n    name: string;\n    icon: string;\n    id: keyof typeof socialLinksData;\n}\ninterface DisplayDataProps {\nmyData: DataProps\n}\ninterface AdditionalLinkProps {\n    id: number\n    i: string;\n    l: string;\n    u: string;\n}\n"
  },
  {
    "path": "tailwind.config.ts",
    "content": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  darkMode: [\"class\"],\n  content: [\n    './pages/**/*.{ts,tsx}',\n    './components/**/*.{ts,tsx}',\n    './app/**/*.{ts,tsx}',\n    './src/**/*.{ts,tsx}',\n\t],\n  theme: {\n    container: {\n      center: true,\n      padding: \"2rem\",\n      screens: {\n        \"2xl\": \"1400px\",\n      },\n    },\n    extend: {\n      colors: {\n        border: \"hsl(var(--border))\",\n        input: \"hsl(var(--input))\",\n        ring: \"hsl(var(--ring))\",\n        background: \"hsl(var(--background))\",\n        foreground: \"hsl(var(--foreground))\",\n        primary: {\n          DEFAULT: \"hsl(var(--primary))\",\n          foreground: \"hsl(var(--primary-foreground))\",\n        },\n        secondary: {\n          DEFAULT: \"hsl(var(--secondary))\",\n          foreground: \"hsl(var(--secondary-foreground))\",\n        },\n        destructive: {\n          DEFAULT: \"hsl(var(--destructive))\",\n          foreground: \"hsl(var(--destructive-foreground))\",\n        },\n        muted: {\n          DEFAULT: \"hsl(var(--muted))\",\n          foreground: \"hsl(var(--muted-foreground))\",\n        },\n        accent: {\n          DEFAULT: \"hsl(var(--accent))\",\n          foreground: \"hsl(var(--accent-foreground))\",\n        },\n        popover: {\n          DEFAULT: \"hsl(var(--popover))\",\n          foreground: \"hsl(var(--popover-foreground))\",\n        },\n        card: {\n          DEFAULT: \"hsl(var(--card))\",\n          foreground: \"hsl(var(--card-foreground))\",\n        },\n      },\n      borderRadius: {\n        lg: \"var(--radius)\",\n        md: \"calc(var(--radius) - 2px)\",\n        sm: \"calc(var(--radius) - 4px)\",\n      },\n      keyframes: {\n        \"accordion-down\": {\n          from: { height: 0 },\n          to: { height: \"var(--radix-accordion-content-height)\" },\n        },\n        \"accordion-up\": {\n          from: { height: \"var(--radix-accordion-content-height)\" },\n          to: { height: 0 },\n        },\n      },\n      animation: {\n        \"accordion-down\": \"accordion-down 0.2s ease-out\",\n        \"accordion-up\": \"accordion-up 0.2s ease-out\",\n      },\n    },\n  },\n  plugins: [require(\"tailwindcss-animate\")],\n}"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"paths\": {\n      \"@/*\": [\"./src/*\"]\n    }\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  }
]