diff --git a/.env.example b/.env.example index f5e861c..ca5d3cd 100644 --- a/.env.example +++ b/.env.example @@ -8,5 +8,8 @@ CONVEX_DEPLOYMENT=dev:perfect-panther-605 NEXT_PUBLIC_CONVEX_URL=https://perfect-panther-605.convex.cloud NEXT_PUBLIC_GEMINI_API_KEY_DOC=your-gemini-api-key NEXT_PUBLIC_GEMINI_API_KEY_FLOWCHART=your-gemini-api-key -NEXT_PUBLIC_FORMSPREE_ID='your_id' +NEXT_PUBLIC_EMAILJS_TEMPLATE_ID=your_id +NEXT_PUBLIC_EMAILJS_API_KEY=your_id +NEXT_PUBLIC_EMAILJS_SERVICE_ID=your_id +RESEND_API_KEY=your_api_key #use these variables only ;) \ No newline at end of file diff --git a/.github/workflows/autocommetn-iss-raised.yml b/.github/workflows/autocommetn-iss-raised.yml new file mode 100644 index 0000000..417c4a9 --- /dev/null +++ b/.github/workflows/autocommetn-iss-raised.yml @@ -0,0 +1,36 @@ +name: Auto Comment on Issue + +on: + issues: + types: [opened] + +permissions: + issues: write + +jobs: + comment: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Add Comment to Issue + run: | + COMMENT=$(cat < { - const result=await ctx.db.query('user') - .filter((q)=>q.eq(q.field('email'),args.email)) - .collect() + handler: async (ctx, args) => { + const result = await ctx.db + .query("user") + .filter((q) => q.eq(q.field("email"), args.email)) + .collect(); return result; - }, -}) + }, +}); -export const createUser=mutation({ - args:{ - name:v.string(), - email:v.string(), - image:v.string() - }, - handler:async(ctx, args)=> { - return await ctx.db.insert("user",args); - }, -}) \ No newline at end of file +export const createUser = mutation({ + args: { + name: v.string(), + email: v.string(), + image: v.string(), + }, + handler: async (ctx, args) => { + return await ctx.db.insert("user", args); + }, +}); + +export const updateUser = mutation({ + args: { + _id: v.id("user"), + name: v.string(), + email: v.string(), + image: v.string(), + }, + handler: async (ctx, args) => { + const { _id } = args; + return await ctx.db.patch(_id, args); + }, +}); diff --git a/package.json b/package.json index a23ba6c..67321fc 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@editorjs/simple-image": "^1.6.0", "@editorjs/table": "^2.3.0", "@editorjs/warning": "^1.4.0", + "@emailjs/browser": "^4.3.3", "@excalidraw/excalidraw": "^0.17.6", "@excalidraw/mermaid-to-excalidraw": "^0.3.0", "@formspree/react": "^2.5.1", @@ -25,6 +26,7 @@ "@kinde-oss/kinde-auth-nextjs": "^2.2.6", "@langchain/google-genai": "^0.0.16", "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", @@ -45,6 +47,8 @@ "convex": "^1.11.3", "cors": "^2.8.5", "editorjs-button": "^3.0.3", + "emailjs": "^4.0.3", + "emailjs-com": "^3.2.0", "embla-carousel-autoplay": "^8.0.4", "embla-carousel-react": "^8.0.4", "express": "^4.19.2", @@ -63,8 +67,9 @@ "react-spring": "^9.7.3", "remark": "^15.0.1", "remark-parse": "^11.0.0", + "resend": "^3.3.0", "sharp": "^0.33.3", - "sonner": "^1.4.41", + "sonner": "^1.5.0", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", "three": "^0.164.1", diff --git a/public/about-pic.png b/public/about-pic.png new file mode 100644 index 0000000..c470e11 Binary files /dev/null and b/public/about-pic.png differ diff --git a/public/bdkjv.png b/public/bdkjv.png deleted file mode 100644 index 27f360f..0000000 Binary files a/public/bdkjv.png and /dev/null differ diff --git a/public/doodle.png b/public/doodle.png new file mode 100644 index 0000000..0ebe928 Binary files /dev/null and b/public/doodle.png differ diff --git a/public/insta.svg b/public/insta.svg index e19ff2d..a6a5d3e 100644 --- a/public/insta.svg +++ b/public/insta.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/linkedin.svg b/public/linkedin.svg index 8ea1fa8..0de7c98 100644 --- a/public/linkedin.svg +++ b/public/linkedin.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/login.png b/public/login.png new file mode 100644 index 0000000..c513c0e Binary files /dev/null and b/public/login.png differ diff --git a/public/teamInvite.svg b/public/teamInvite.svg index 72ea2dd..59d80d8 100644 --- a/public/teamInvite.svg +++ b/public/teamInvite.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/public/twitter.svg b/public/twitter.svg index a8d6860..7a32f8b 100644 --- a/public/twitter.svg +++ b/public/twitter.svg @@ -1,3 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/public/whatsapp.svg b/public/whatsapp.svg index 33767fa..04c9631 100644 --- a/public/whatsapp.svg +++ b/public/whatsapp.svg @@ -1,3 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/app/[...not_found]/page.ts b/src/app/[...not_found]/page.ts new file mode 100644 index 0000000..a238563 --- /dev/null +++ b/src/app/[...not_found]/page.ts @@ -0,0 +1,5 @@ +import {notFound} from "next/navigation" + +export default function NotFoundCatchAll() { + notFound() +} \ No newline at end of file diff --git a/src/app/aboutus/Typewriter.tsx b/src/app/aboutus/Typewriter.tsx new file mode 100644 index 0000000..ec1cbd1 --- /dev/null +++ b/src/app/aboutus/Typewriter.tsx @@ -0,0 +1,55 @@ +// components/Typewriter.tsx +"use client"; +import React, { useEffect, useState } from 'react'; + +const Typewriter: React.FC<{ text: string }> = ({ text }) => { + const [displayedText, setDisplayedText] = useState(text[0] || ''); + const [isDeleting, setIsDeleting] = useState(false); + const [pause, setPause] = useState(false); + + const typingSpeed = 150; // Speed for typing (milliseconds) + const deletingSpeed = 100; // Speed for deleting (milliseconds) + const pauseDuration = 500; // Pause duration (milliseconds) + + useEffect(() => { + if (pause) { + return; + } + + const handleTyping = () => { + const firstLetter = text[0]; + const remainingText = text.slice(1); + const currentDisplayedText = displayedText.slice(1); + + if (isDeleting) { + if (currentDisplayedText.length > 0) { + setDisplayedText(firstLetter + currentDisplayedText.slice(0, -1)); + } else { + setIsDeleting(false); + setPause(true); + setTimeout(() => setPause(false), pauseDuration); + } + } else { + if (currentDisplayedText.length < remainingText.length) { + setDisplayedText(firstLetter + remainingText.slice(0, currentDisplayedText.length + 1)); + } else { + setIsDeleting(true); + setPause(true); + setTimeout(() => setPause(false), pauseDuration); + } + } + }; + + const interval = setInterval(handleTyping, isDeleting ? deletingSpeed : typingSpeed); + + return () => clearInterval(interval); + }, [displayedText, isDeleting, pause, text]); + + return ( +

+ {displayedText} +

+ ); +}; + +export default Typewriter; diff --git a/src/app/features/Lottie.tsx b/src/app/aboutus/features/Lottie.tsx similarity index 100% rename from src/app/features/Lottie.tsx rename to src/app/aboutus/features/Lottie.tsx diff --git a/src/app/features/page.tsx b/src/app/aboutus/features/page.tsx similarity index 99% rename from src/app/features/page.tsx rename to src/app/aboutus/features/page.tsx index 91b5691..317d487 100644 --- a/src/app/features/page.tsx +++ b/src/app/aboutus/features/page.tsx @@ -96,7 +96,7 @@ interface Feature { const FeatureSection = () => { return ( <> -
+ {/*
*/}

diff --git a/src/app/aboutus/page.tsx b/src/app/aboutus/page.tsx new file mode 100644 index 0000000..c2b53b3 --- /dev/null +++ b/src/app/aboutus/page.tsx @@ -0,0 +1,99 @@ +import Footer from "@/components/shared/Footer"; +import Header from "@/components/shared/Header"; +import { Button } from "@/components/ui/button"; +import Image from "next/image"; +import type { Metadata } from "next"; +import Link from "next/link"; +import FeatureSection from "./features/page"; +import Typewriter from "./Typewriter"; + +export const metadata: Metadata = { + title: "Blox AI | About", + description: "About Blox AI.", +}; + +const page = () => { + return ( + <> +
+
+
+ +

+ +

+

+ Effortlessly create diagrams, and collaborate with your team, all + with AI-driven analysis. +
+ All in one secure and easy-to-use platform. +

+
+
+ Overlay +
+
+
+
+
+
+
+ +
+ +
+

+ What is Blox AI? +

+ +

+ Blox AI is an innovative platform designed to make creating + flowcharts, diagrams, and rich documentation effortless. + Leveraging intuitive tools and the advanced capabilities of the + Google Gemini AI model, Blox AI enhances your ability to + visualize complex processes and ideas. It provides seamless + collaboration features, secure workspaces, and AI-driven + insights, making it the go-to solution for individuals and teams + aiming to turn their concepts into clear, visual + representations. +

+ + +
+
+
+
+
+
+ +
+
+
+ + ); +}; + +export default page; diff --git a/src/app/api/mail/route.ts b/src/app/api/mail/route.ts new file mode 100644 index 0000000..a9e0482 --- /dev/null +++ b/src/app/api/mail/route.ts @@ -0,0 +1,23 @@ +// app/api/send-email.ts +import { NextRequest, NextResponse } from 'next/server'; +import { Resend } from 'resend'; + +const resend = new Resend(process.env.RESEND_API_KEY || ''); + +export async function POST(req: NextRequest) { + const { to, text } = await req.json(); + const subject = 'Welcome to Resend!'; + try { + const response = await resend.emails.send({ + from: 'Acme ', + to, + subject, + text, + }); + + return NextResponse.json({ success: true, data: response }); + } catch (error: any) { + console.error('Error sending email:', error); + return NextResponse.json({ success: false, error: error.message }, { status: 500 }); + } +} diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index ebce04e..4964730 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -10,6 +10,7 @@ import Contact from "@/components/shared/contactform"; import type { Metadata } from "next"; import Footer from "@/components/shared/Footer"; +import ScrollToTopButton from "@/components/shared/ScrollUp"; export const metadata: Metadata = { title: "Blox AI | Contact Us", @@ -27,6 +28,7 @@ const page = () => {

+ ); }; diff --git a/src/app/contributors/ContributorsData.ts b/src/app/contributors/ContributorsData.ts index 2fde4dd..4f971e0 100644 --- a/src/app/contributors/ContributorsData.ts +++ b/src/app/contributors/ContributorsData.ts @@ -120,9 +120,44 @@ export const ContributorsData = [ github: "https://github.com/thevijayshankersharma", imageUrl: "https://avatars.githubusercontent.com/u/109781385?v=4" }, + { + name: "Mukilan .T", + github: "https://github.com/mukilan2815", + imageUrl: "https://avatars.githubusercontent.com/u/66477893?v=4", + }, { name: "Vaibhav Gangurde", github: "https://github.com/Vaibhavsg17", - imageUrl: "https://avatars.githubusercontent.com/u/66477893?v=4", + imageUrl: "https://avatars.githubusercontent.com/u/71129858?v=4", + }, + { + name: "Ayushmaan Agarwal", + github: "https://github.com/Ayushmaanagarwal1211", + imageUrl: "https://avatars.githubusercontent.com/u/118350936?v=4", + }, + { + name: "Ramakrushna Biswal", + github: "https://github.com/RamakrushnaBiswal", + imageUrl: "https://avatars.githubusercontent.com/u/125277258?v=4", + }, + { + name: "Akhila Sunesh", + github: "https://github.com/AkhilaSunesh", + imageUrl: "https://avatars.githubusercontent.com/u/140897461?v=4", + }, + { + name: "Chaanakyaa Milkuri", + github: "https://github.com/chaanakyaam", + imageUrl: "https://avatars.githubusercontent.com/u/131477601?v=4", + }, + { + name: "Adarsh Singh Tomar", + github: "https://github.com/AdarshGT33", + imageUrl: "https://avatars.githubusercontent.com/u/144033708?v=4", + }, + { + name: "Sivaprasath", + github: "https://github.com/sivaprasath2004", + imageUrl: "https://avatars.githubusercontent.com/u/121082414?v=4", }, ]; diff --git a/src/app/contributors/page.tsx b/src/app/contributors/page.tsx index 280c68a..5c832bf 100644 --- a/src/app/contributors/page.tsx +++ b/src/app/contributors/page.tsx @@ -5,6 +5,7 @@ import Header from "@/components/shared/Header"; import { Creators } from "@/components/shared/Creators"; import { GlobeDemo } from "@/components/shared/GlobeCard"; import Footer from "@/components/shared/Footer"; +import ScrollToTopButton from "@/components/shared/ScrollUp"; export const metadata: Metadata = { title: "Blox AI | Contributors", @@ -61,6 +62,7 @@ const page = () => {