├── public ├── _redirects ├── favicon.ico └── images │ ├── ai.jpg │ ├── bus.jpg │ ├── cal.jpg │ ├── news.jpg │ ├── avatar.png │ ├── energy.jpg │ ├── heart.jpg │ ├── media.jpg │ ├── quote.jpg │ ├── subbu.png │ ├── Thesparks.jpg │ ├── diabeties.jpg │ ├── ekatvaI.jpg │ ├── preview.png │ └── weather.jpg ├── src ├── vite-env.d.ts ├── assets │ ├── user.png │ ├── chatbot.png │ ├── loader.css │ └── skill.css ├── components │ ├── NavText.jsx │ ├── common │ │ ├── Center.jsx │ │ ├── PillButton.jsx │ │ ├── Heading.jsx │ │ ├── SkillPill.jsx │ │ ├── NeoButton.jsx │ │ └── Reveal.jsx │ ├── HeaderPhoto.jsx │ ├── ChatBotHeader.jsx │ ├── SkillsCard.jsx │ ├── SkillsRow.jsx │ ├── IconContainer.jsx │ ├── Footer.jsx │ ├── SocialMediaIcons.jsx │ ├── ContactIcons.jsx │ ├── ChatBotButton.jsx │ ├── CustomLoader.jsx │ ├── ChatBotInput.jsx │ ├── ChatMessage.jsx │ ├── EducationCard.jsx │ ├── ChatBot.jsx │ ├── ContactForm.jsx │ ├── NavBar.jsx │ ├── ProjectCard.jsx │ └── Background.js ├── utils │ ├── utilFunctions.js │ ├── splitWords.js │ ├── chatbot.js │ └── constant.js ├── hook │ ├── useSpinner.js │ ├── useHover.js │ ├── useFormData.js │ └── useChatBot.js ├── App.jsx ├── index.css ├── index.jsx ├── routes │ ├── Routing.jsx │ └── routingdetails.js ├── pages │ ├── Contact.jsx │ ├── Experience.jsx │ ├── Education.jsx │ ├── Skills.jsx │ ├── Projects.jsx │ ├── About.jsx │ └── Header.jsx ├── data │ └── data.js └── App.css ├── vite.config.js ├── .gitignore ├── index.html ├── package.json ├── README.md └── LICENCE /public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 2 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/assets/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/src/assets/user.png -------------------------------------------------------------------------------- /public/images/ai.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/ai.jpg -------------------------------------------------------------------------------- /public/images/bus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/bus.jpg -------------------------------------------------------------------------------- /public/images/cal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/cal.jpg -------------------------------------------------------------------------------- /public/images/news.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/news.jpg -------------------------------------------------------------------------------- /src/assets/chatbot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/src/assets/chatbot.png -------------------------------------------------------------------------------- /public/images/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/avatar.png -------------------------------------------------------------------------------- /public/images/energy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/energy.jpg -------------------------------------------------------------------------------- /public/images/heart.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/heart.jpg -------------------------------------------------------------------------------- /public/images/media.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/media.jpg -------------------------------------------------------------------------------- /public/images/quote.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/quote.jpg -------------------------------------------------------------------------------- /public/images/subbu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/subbu.png -------------------------------------------------------------------------------- /public/images/Thesparks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/Thesparks.jpg -------------------------------------------------------------------------------- /public/images/diabeties.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/diabeties.jpg -------------------------------------------------------------------------------- /public/images/ekatvaI.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/ekatvaI.jpg -------------------------------------------------------------------------------- /public/images/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/preview.png -------------------------------------------------------------------------------- /public/images/weather.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SubramanyaKS/subramanya-portfolio/HEAD/public/images/weather.jpg -------------------------------------------------------------------------------- /src/components/NavText.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const NavText = ({title}) => { 4 | return ( 5 |

< {title} />

6 | ) 7 | } 8 | 9 | export default NavText -------------------------------------------------------------------------------- /src/components/common/Center.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Center = ({children}) => { 4 | return ( 5 |
{children}
6 | ) 7 | } 8 | export default Center -------------------------------------------------------------------------------- /src/components/common/PillButton.jsx: -------------------------------------------------------------------------------- 1 | const PillButton = ({OnClick,title,Icon})=>{ 2 | return ( 3 | 4 | 5 | ) 6 | 7 | } 8 | export default PillButton -------------------------------------------------------------------------------- /src/utils/utilFunctions.js: -------------------------------------------------------------------------------- 1 | export const resume = (link) => { 2 | window.open( 3 | link, 4 | "_blank" 5 | ); 6 | }; 7 | 8 | export const wordVarients = { 9 | hidden: { opacity: 0 }, 10 | reveal: { opacity: 1 }, 11 | } -------------------------------------------------------------------------------- /src/components/common/Heading.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Heading = ({title}) => { 4 | return ( 5 |

  < {title}. /> 6 |

7 | ) 8 | } 9 | 10 | export default Heading -------------------------------------------------------------------------------- /src/components/common/SkillPill.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const SkillPill = ({text}) => { 4 | return ( 5 |
6 | {text} 7 |
8 | ) 9 | } 10 | 11 | export default SkillPill -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react'; 3 | 4 | export default defineConfig(() => { 5 | return { 6 | build: { 7 | outDir: 'build', 8 | }, 9 | plugins: [react()], 10 | }; 11 | }); -------------------------------------------------------------------------------- /src/assets/loader.css: -------------------------------------------------------------------------------- 1 | @keyframes spin { 2 | 0% { transform: rotate(0deg); } 3 | 100% { transform: rotate(360deg); } 4 | } 5 | 6 | .loader-container { 7 | height: 100vh; 8 | display: flex; 9 | justify-content: center; 10 | align-items: center; 11 | } 12 | -------------------------------------------------------------------------------- /src/hook/useSpinner.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | export const useSpinner =()=>{ 4 | const [spinner, setSpinner] = useState(true); 5 | 6 | useEffect(() => { 7 | setTimeout(() => setSpinner(false), 1000); 8 | }, []); 9 | return {spinner} 10 | 11 | } -------------------------------------------------------------------------------- /src/components/common/NeoButton.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const NeoButton = ({link,Icon}) => { 4 | return ( 5 | 6 | {" "} 7 | 10 | 11 | ) 12 | } 13 | 14 | export default NeoButton -------------------------------------------------------------------------------- /src/components/HeaderPhoto.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const HeaderPhoto = ({image}) => { 4 | return ( 5 |
6 |
7 | avatar 8 |
9 |
10 | ) 11 | } 12 | 13 | export default HeaderPhoto -------------------------------------------------------------------------------- /src/assets/skill.css: -------------------------------------------------------------------------------- 1 | .card:hover{ 2 | background-color:#000 !important; 3 | color:"#fff"!important; 4 | transform: scale(1.02) !important; 5 | overflow: hidden !important; 6 | /* box-shadow: 0 4px 4px 5px rgba(129, 72, 144, 0.561) !important; */ 7 | box-shadow: 0 4px 5px 3px #00ff00 !important; 8 | /* rgba(117, 0, 250, 1) */ 9 | } -------------------------------------------------------------------------------- /src/utils/splitWords.js: -------------------------------------------------------------------------------- 1 | function splitWords(sentence) { 2 | sentence = sentence.trim(); 3 | 4 | const wordsAndSpaces = sentence.split(/(\s+)/); 5 | 6 | // Remove empty strings and trim each element 7 | const words = wordsAndSpaces 8 | // .filter(word => word.trim() !== '').map(word => word.trim()); 9 | 10 | return words; 11 | } 12 | 13 | export default splitWords; 14 | -------------------------------------------------------------------------------- /src/hook/useHover.js: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | 3 | export const useHover = ()=>{ 4 | const [isHovered, setIsHovered] = useState(false); 5 | 6 | const handleMouseEnter = () => { 7 | setIsHovered(true); 8 | }; 9 | 10 | const handleMouseLeave = () => { 11 | setIsHovered(false); 12 | }; 13 | 14 | return {handleMouseEnter,handleMouseLeave,isHovered} 15 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .env 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | /build 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | old.js 27 | data.jsx -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import "bootstrap/dist/css/bootstrap.min.css"; 2 | import React from "react"; 3 | import "./App.css"; 4 | import Routing from "./routes/Routing"; 5 | import { useSpinner } from "./hook/useSpinner"; 6 | import CustomLoader from "./components/CustomLoader"; 7 | 8 | function App() { 9 | const { spinner } = useSpinner(); 10 | 11 | return spinner ? : ; 12 | } 13 | 14 | export default App; 15 | -------------------------------------------------------------------------------- /src/components/ChatBotHeader.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Image } from 'react-bootstrap' 3 | 4 | const ChatBotHeader = ({ title, image }) => { 5 | return ( 6 |
9 | chatbot 10 |
{title}
11 |
12 | 13 | ) 14 | } 15 | 16 | export default ChatBotHeader -------------------------------------------------------------------------------- /src/components/SkillsCard.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "bootstrap/dist/css/bootstrap.min.css"; 3 | import Card from "react-bootstrap/Card"; 4 | import '../assets/skill.css' 5 | const SkillsCard = ({ data }) => { 6 | return ( 7 | 8 | 9 | 10 | 11 | 12 | ); 13 | }; 14 | 15 | export default SkillsCard; 16 | -------------------------------------------------------------------------------- /src/components/SkillsRow.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Row } from "react-bootstrap"; 3 | import SkillsCard from "./SkillsCard"; 4 | import "bootstrap/dist/css/bootstrap.min.css"; 5 | 6 | const SkillsRow = ({ skill }) => { 7 | return ( 8 | 9 | {skill.map((item) => ( 10 | 11 | ))} 12 | 13 | ); 14 | }; 15 | 16 | export default SkillsRow; 17 | -------------------------------------------------------------------------------- /src/components/IconContainer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const IconContainer = ({containerClass,href,Icon,className,label}) => { 4 | return ( 5 |
6 | 12 | 13 | 14 |
15 | ) 16 | } 17 | 18 | export default IconContainer -------------------------------------------------------------------------------- /src/components/Footer.jsx: -------------------------------------------------------------------------------- 1 | import { Heart } from "lucide-react"; 2 | import { headerdata } from "../data/data"; 3 | 4 | const Footer = () => { 5 | return ( 6 |
7 |

8 | 9 | ©2025. Designed with{" "} 10 | {" "} 14 | by {headerdata.name} 15 | 16 |

17 |
18 | ); 19 | }; 20 | export default Footer; -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | .body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | height: 100%; 9 | overflow-x: hidden; 10 | overflow-y: visible; 11 | /* background-color: #0c0c0c;*/ 12 | } 13 | 14 | code { 15 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 16 | monospace; 17 | } 18 | -------------------------------------------------------------------------------- /src/index.jsx: -------------------------------------------------------------------------------- 1 | import "bootstrap/dist/css/bootstrap.min.css"; 2 | import React from 'react'; 3 | import ReactDOM from 'react-dom/client'; 4 | import './index.css'; 5 | import App from './App'; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById('root')); 8 | root.render( 9 | 10 | 11 | 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | -------------------------------------------------------------------------------- /src/components/SocialMediaIcons.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import IconContainer from "../components/IconContainer"; 3 | import { socialIcon } from '../data/data'; 4 | 5 | function SocialMediaIcons() { 6 | return ( 7 |
8 | {socialIcon.map((data)=>( 9 |
10 | 12 |
13 | ))} 14 | 15 |
16 | ) 17 | } 18 | 19 | export default SocialMediaIcons -------------------------------------------------------------------------------- /src/components/ContactIcons.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import IconContainer from "../components/IconContainer"; 3 | import { socialIcon } from '../data/data'; 4 | 5 | const ContactIcons = () => { 6 | return ( 7 |
8 | { 9 | socialIcon.map((data)=>( 10 |
11 | 13 |
14 | )) 15 | } 16 |
17 | ) 18 | } 19 | 20 | export default ContactIcons -------------------------------------------------------------------------------- /src/components/ChatBotButton.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Image } from 'react-bootstrap' 3 | import { chatbotImages } from '../utils/chatbot' 4 | 5 | const ChatBotButton = ({ OnClick, title }) => { 6 | return ( 7 | 15 | ) 16 | } 17 | 18 | export default ChatBotButton -------------------------------------------------------------------------------- /src/components/CustomLoader.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import '../assets/loader.css'; 3 | import { Loader, Shell } from 'lucide-react'; 4 | 5 | const CustomLoader = ({ size = 50, speed = "1s" }) => { 6 | return ( 7 |
8 | 19 |
20 | ) 21 | } 22 | 23 | export default CustomLoader -------------------------------------------------------------------------------- /src/components/ChatBotInput.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Send } from 'lucide-react'; 3 | 4 | const ChatBotInput = ({OnChange,OnKeyPress,OnClick,value}) => { 5 | return ( 6 |
7 | 15 | 16 |
17 | ) 18 | } 19 | 20 | export default ChatBotInput; -------------------------------------------------------------------------------- /src/routes/Routing.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Navbar from "../components/NavBar"; 3 | import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; 4 | import Footer from "../components/Footer"; 5 | import routingdetails from './routingdetails'; 6 | import ChatBot from '../components/ChatBot'; 7 | 8 | const Routing = () => { 9 | return ( 10 | 11 | 12 | 13 | {routingdetails.map((data)=>( 14 | 15 | ))} 16 | 17 | 18 |