updates, updates, updates

package updates
added projects
updated career page
updated resume
cleaned up a bit
This commit is contained in:
Kaushik Narayan R 2025-06-06 21:29:57 -07:00
parent 574eded634
commit 7d6afd6f2c
17 changed files with 6399 additions and 18794 deletions

24847
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,18 +3,16 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.14.16",
"@mui/material": "^5.14.16",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"swiper": "^11.0.3",
"web-vitals": "^2.1.4"
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
"@mui/icons-material": "^7.1.1",
"@mui/material": "^7.1.1",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"swiper": "^11.2.8"
},
"devDependencies": {
"react-scripts": "5.0.1"
},
"scripts": {
"start": "react-scripts start",
@ -39,8 +37,5 @@
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 KiB

Binary file not shown.

View File

@ -1,38 +0,0 @@
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}

View File

@ -1,5 +1,4 @@
import { createContext, useEffect, useState } from 'react';
import './App.css';
import Menu from './components/Menu';
export const WidthContext = createContext();
@ -23,9 +22,7 @@ function App() {
}, []);
return (
<WidthContext.Provider value={width}>
<div className="App">
<Menu />
</div>
</WidthContext.Provider>
);
}

View File

@ -1,8 +0,0 @@
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});

View File

@ -1,30 +1,33 @@
import { Divider, List, ListItem, ListItemText, Typography } from '@mui/material'
import React from 'react'
import React, { Fragment } from 'react'
export const experiencesData = [
{
key: 'grad-res-asu', type: 'prof', location: 'Arizona State University', designation: 'Graduate Researcher',
desc: [
'Modelled the TCP protocol using high-level Petri nets to enable mathematical analysis of its state machine',
'Modified the protocol model to design variants to help achieve censorship circumvention',
'Employed CTL checking and Markov chain analysis to formally verify and test performance'
],
startDate: 'Jan 2025', endDate: 'June 2025'
},
{
key: 'sde-intern-rq', type: 'prof', location: 'RootQuotient Technologies', designation: 'Software Developer Intern',
desc: [
'Developed interactive user interfaces for client applications using ReactJS, TypeScript, and the Ant Design library.',
// eslint-disable-next-line
'Implemented a comprehensive admin dashboard for a clients banking administration application, following MVC\
patterns for seamless backend integration.',
'Actively contributed to bug fixes and enhanced an internal package by adding API documentation.'
'Built user-friendly web applications using ReactJS, ExpressJS, TypeScript, and the Ant Design library',
'Implemented a comprehensive admin dashboard for a clients banking administration application, following MVC patterns for seamless backend integration.',
'Actively contributed to fixing persistent bugs and enhanced internal packages by adding API documentation'
],
startDate: 'May 2022', endDate: 'July 2022'
},
{
key: 'tech-sd-ctf', type: 'extra', location: 'CEG Tech Forum', designation: 'Student Director of Technical Operations',
key: 'tech-sd-ctf', type: 'extra', location: 'CEG Tech Forum', designation: 'Student Director - Technical Operations',
desc: [
'Headed a 20-member strong technical operations team as the Lead Developer, Sysadmin, and Project Manager.',
// eslint-disable-next-line
'Spearheaded multiple web apps developed for various purposes, such as a custom ERP mobile app, admin dashboards,\
and the flagship website for Kurukshetra, the international techno-management fest of CEG.',
// eslint-disable-next-line
'Organized a technical summit on "Innovation and Transformation: AI, Autonomous Systems, and Disruptive Trends"\
featuring projects by local innovators and keynotes from BNY Mellon, Microsoft, and startups.'
'Headed a 20-member strong technical operations team as the Lead Developer, Sysadmin, and Project Manager',
'Spearheaded multiple web apps developed for various purposes, such as a custom ERP mobile app, admin dashboards, and the flagship website for Kurukshetra, the international techno-management fest of CEG',
'Organized a technical summit on "Innovation and Transformation: AI, Autonomous Systems, and Disruptive Trends" featuring projects by local innovators and keynotes from BNY Mellon, Microsoft, and startups'
],
startDate: 'July 2022', endDate: 'July 2023'
startDate: 'July 2022', endDate: 'June 2023'
},
{
key: 'sec-nss', type: 'extra', location: 'National Service Scheme', designation: 'Secretary',
@ -32,20 +35,19 @@ export const experiencesData = [
'Organized cleanliness campaigns, awareness rallies, and the annual village development camp.',
'Conducted a 3-day city-wide waste collection and awareness drive in collaboration with AWCEM, Chennai.'
],
startDate: 'Nov 2021', endDate: 'Oct 2022'
startDate: 'November 2021', endDate: 'October 2022'
},
{
key: 'cs-ms-asu', type: 'edu', location: 'Arizona State University', designation: 'MS, Computer Science',
desc: [
// Add relevant coursework in the future
'Learnt some more: OS, cloud computing, software security, network security, distributed databases'
],
startDate: 'Aug 2023', endDate: 'May 2025'
startDate: 'August 2023', endDate: 'May 2025'
},
{
key: 'cse-be-ceg', type: 'edu', location: 'College of Engineering, Guindy', designation: 'BE, Computer Science and Engineering',
desc: [
'Graduated first-class with distinction with a 9.12 CGPA',
'Relevant coursework: DBMS, OOPS, full-stack development, cloud computing, deep learning, computer networks',
'Learnt a lot: DBMS, OS, compilers, comp-arch., networking, network security and cryptography, cloud computing, distributed systems, deep learning, big data analytics, software project management',
],
startDate: 'July 2019', endDate: 'June 2023'
},
@ -54,64 +56,64 @@ export const experiencesData = [
const Career = () => {
return (
<>
<Typography p={1} align="left" variant="h5">
<Typography p={2} align="left" variant="h5">
Professional
</Typography>
{experiencesData.filter(exp => exp.type === 'prof').map(exp =>
<>
<Typography p={1} align="left" fontSize={16}>
{experiencesData.filter(exp => exp.type === 'prof').map((exp, idx) =>
<Fragment key={idx}>
<Typography px={2} align="left" fontSize={16}>
<b>{exp.designation}, {exp.location}</b>, <i>{exp.startDate} - {exp.endDate}</i>
</Typography>
<Typography p={1} align="left">
<List disablePadding>
<Typography component="div" p={2} align="left">
<List disablePadding sx={{ pl: 2, listStyleType: 'disc' }}>
{exp.desc.map((line, index) =>
<ListItem disablePadding key={index}>
<ListItemText primaryTypographyProps={{ p: 0, fontSize: 13 }} primary={line} />
<ListItem disablePadding key={index} sx={{ display: 'list-item' }}>
<ListItemText slotProps={{ primary: { fontSize: 13 } }} primary={line} />
</ListItem>
)}
</List>
</Typography>
</>
</Fragment>
)}
<Divider />
<Typography p={1} align="left" variant="h5">
<Typography p={2} align="left" variant="h5">
Education
</Typography>
{experiencesData.filter(exp => exp.type === 'edu').map(exp =>
<>
<Typography p={1} align="left" fontSize={16}>
{experiencesData.filter(exp => exp.type === 'edu').map((exp, idx) =>
<Fragment key={idx}>
<Typography px={2} align="left" fontSize={16}>
<b>{exp.designation}, {exp.location}</b>, <i>{exp.startDate} - {exp.endDate}</i>
</Typography>
<Typography p={1} align="left">
<List disablePadding>
<Typography component="div" p={2} align="left">
<List disablePadding sx={{ pl: 2, listStyleType: 'disc' }}>
{exp.desc.map((line, index) =>
<ListItem disablePadding key={index}>
<ListItemText primaryTypographyProps={{ p: 0, fontSize: 13 }} primary={line} />
<ListItem disablePadding key={index} sx={{ display: 'list-item' }}>
<ListItemText slotProps={{ primary: { fontSize: 13 } }} primary={line} />
</ListItem>
)}
</List>
</Typography>
</>
</Fragment>
)}
<Divider />
<Typography p={1} align="left" variant="h5">
<Typography p={2} align="left" variant="h5">
Volunteering
</Typography>
{experiencesData.filter(exp => exp.type === 'extra').map(exp =>
<>
<Typography p={1} align="left" fontSize={16}>
{experiencesData.filter(exp => exp.type === 'extra').map((exp, idx) =>
<Fragment key={idx}>
<Typography px={2} align="left" fontSize={16}>
<b>{exp.designation}, {exp.location}</b>, <i>{exp.startDate} - {exp.endDate}</i>
</Typography>
<Typography p={1} align="left">
<List disablePadding>
<Typography component="div" p={2} align="left">
<List disablePadding sx={{ pl: 2, listStyleType: 'disc' }}>
{exp.desc.map((line, index) =>
<ListItem disablePadding key={index}>
<ListItemText primaryTypographyProps={{ p: 0, fontSize: 13 }} primary={line} />
<ListItem disablePadding key={index} sx={{ display: 'list-item' }}>
<ListItemText slotProps={{ primary: { fontSize: 13 } }} primary={line} />
</ListItem>
)}
</List>
</Typography>
</>
</Fragment>
)}
</>
)

View File

@ -18,17 +18,18 @@ const Landing = () => {
return (
<>
<List>
{/* one-liner summary */}
{/* summary */}
<ListItem>
<ListItemText
primary={"I'll be brief: Aspiring SWE whose passions lie in cloud technologies,\
web development and machine learning, but open to much more."} />
primary={"Welcome to my (messy) homepage. I'm an aspiring software developer\
whose passions lie in distributed technologies, networks and security,\
web development, and machine learning, but open to much more." } />
</ListItem>
{/* education, for now */}
{/* current endeavor */}
<ListItem>
<ListItemText
primary={"I'm currently pursuing my masters in computer\
science at ASU, and will be graduating in the summer of 2025."} />
primary={"I'm currently looking for a job! If you know any openings that\
you think I would be a good fit for, do reach out." } />
</ListItem>
{/* current stuff */}
<ListItem>
@ -42,14 +43,9 @@ const Landing = () => {
experiencesData.filter(exp => exp.type === 'prof')[0].location + " as a " +
experiencesData.filter(exp => exp.type === 'prof')[0].designation + "."} />
</ListItem>
{/* last stint */}
<ListItem>
<ListItemText
primary={"Yes it's a simple website, and yes it's not finished yet :)"} />
</ListItem>
</List>
<Divider />
<Typography paragraph p={1}>
<Typography p={2}>
More at:
</Typography>
<ButtonGroup

View File

@ -4,7 +4,7 @@ import * as React from 'react'
const LoremIpsum = () => {
return (
<>
<Typography paragraph>
<Typography>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Rhoncus dolor purus non
enim praesent elementum facilisis leo vel. Risus at ultrices mi tempus
@ -18,7 +18,7 @@ const LoremIpsum = () => {
consectetur lorem. Velit sed ullamcorper morbi tincidunt. Lorem donec massa
sapien faucibus et molestie ac.
</Typography>
<Typography paragraph>
<Typography>
Consequat mauris nunc congue nisi vitae suscipit. Fringilla est ullamcorper
eget nulla facilisi etiam dignissim diam. Pulvinar elementum integer enim
neque volutpat ac tincidunt. Ornare suspendisse sed nisi lacus sed viverra

View File

@ -18,11 +18,11 @@ import Typography from '@mui/material/Typography';
// import Link from '@mui/material/Link';
import LandingIcon from '@mui/icons-material/Home';
import ProjIcon from '@mui/icons-material/AccountTree';
import ExpIcon from '@mui/icons-material/Work';
import SkilIcon from '@mui/icons-material/Laptop';
import IntsIcon from '@mui/icons-material/SportsEsports';
import ProjectsIcon from '@mui/icons-material/AccountTree';
import CareerIcon from '@mui/icons-material/Work';
import InterestsIcon from '@mui/icons-material/Headphones';
import ArticleIcon from '@mui/icons-material/Article';
import BlogIcon from '@mui/icons-material/RateReview';
import Landing from './Landing';
// import LoremIpsum from './LoremIpsum';
@ -35,47 +35,54 @@ const drawerWidth = 240;
const menuSections = [
{
key: 'landing', display_name: 'Home', appbar_text: 'Hello There!', display_icon: <LandingIcon />,
key: 'landing', display_name: 'About', appbar_text: 'Hello There!', display_icon: <LandingIcon />,
extLink: false, component: <Landing />
},
{
key: 'proj', display_name: 'Projects', appbar_text: 'My Projects', display_icon: <ProjIcon />,
key: 'proj', display_name: 'Stuff', appbar_text: 'Workbench', display_icon: <ProjectsIcon />,
extLink: false, component: <Projects />
},
{
key: 'exp', display_name: 'Career', appbar_text: 'My Journey', display_icon: <ExpIcon />,
key: 'exp', display_name: 'Work', appbar_text: 'Journey', display_icon: <CareerIcon />,
extLink: false, component: <Career />
},
{
key: 'skil', display_name: 'Skills', appbar_text: 'My Skills', display_icon: <SkilIcon />,
key: 'ints', display_name: 'Interests', appbar_text: 'My Interests', display_icon: <InterestsIcon />,
extLink: false, component: <UnderConstruction />
},
{
key: 'ints', display_name: 'Interests', appbar_text: 'My Interests', display_icon: <IntsIcon />,
extLink: false, component: <UnderConstruction />
},
{
key: 'resume', display_name: 'Resume', appbar_text: 'My Resume', display_icon: <ArticleIcon />,
key: 'resume', display_name: 'Resume/CV', appbar_text: 'Resume/CV', display_icon: <ArticleIcon />,
extLink: true, link: process.env.PUBLIC_URL + "myresume.pdf"
},
{
key: 'blog', display_name: 'My Scribbles', appbar_text: 'My Scribbles', display_icon: <BlogIcon />,
extLink: true, link: "https://blog.knravish.me"
},
];
export default function Menu(props) {
const { window } = props;
function Menu(props) {
const [mobileOpen, setMobileOpen] = React.useState(false);
const [isClosing, setIsClosing] = React.useState(false);
const [activeSection, setActiveSection] = React.useState(menuSections[0]);
const handleDrawerClose = () => {
setIsClosing(true);
setMobileOpen(false);
};
const handleDrawerTransitionEnd = () => {
setIsClosing(false);
};
const handleDrawerToggle = () => {
if (!isClosing) {
setMobileOpen(!mobileOpen);
}
};
const handleDrawerSelect = (selectedSectionKey) => {
handleDrawerToggle();
handleDrawerClose();
const menuSection = menuSections.filter((menuItem) => menuItem.key === selectedSectionKey)[0];
if (menuSection.extLink === true) {
handleLinkClick(menuSection.link);
return;
}
setActiveSection(menuSection);
}
@ -83,12 +90,12 @@ export default function Menu(props) {
<div>
{/* <Toolbar /> */}
<Box component="div" align="center" padding={2}>
<Avatar src={process.env.PUBLIC_URL + "pappu2.jpg"} alt='' sx={{ width: 120, height: 120 }} />
<Avatar src={process.env.PUBLIC_URL + "pappu2.jpg"} alt='profile pic' sx={{ width: 120, height: 120 }} />
<Typography sx={{ padding: 2 }}>Kaushik Narayan Ravishankar</Typography>
</Box>
<Divider />
<List>
{menuSections.map((menuItem, index) => (
{menuSections.filter(menuItem => menuItem.extLink === false).map(menuItem => (
<ListItem onClick={() => { handleDrawerSelect(menuItem.key); }} key={menuItem.key} disablePadding>
<ListItemButton selected={activeSection.key === menuItem.key}>
<ListItemIcon>
@ -100,6 +107,19 @@ export default function Menu(props) {
))}
</List>
<Divider />
<List>
{menuSections.filter(menuItem => menuItem.extLink === true).map(menuItem => (
<ListItem onClick={() => { handleLinkClick(menuItem.link); }} key={menuItem.key} disablePadding>
<ListItemButton>
<ListItemIcon>
{menuItem.display_icon}
</ListItemIcon>
<ListItemText primary={menuItem.display_name} />
</ListItemButton>
</ListItem>
))}
</List>
<Divider />
{/* <Box component="div" align="center" padding={2}>
<Link sx={{ padding: 1 }} href="https://mui.com" underline="hover">
Made with MUI
@ -108,8 +128,6 @@ export default function Menu(props) {
</div>
);
const container = window !== undefined ? () => window().document.body : undefined;
return (
<Box sx={{ display: 'flex' }}>
<CssBaseline />
@ -138,15 +156,17 @@ export default function Menu(props) {
<Box
component="nav"
sx={{ width: { sm: drawerWidth }, flexShrink: { sm: 0 } }}
aria-label="mailbox folders"
aria-label="page links"
>
<Drawer
container={container}
variant="temporary"
open={mobileOpen}
onClose={handleDrawerToggle}
ModalProps={{
onTransitionEnd={handleDrawerTransitionEnd}
onClose={handleDrawerClose}
slotProps={{
root: {
keepMounted: true, // Better open performance on mobile.
},
}}
sx={{
display: { xs: 'block', sm: 'none' },
@ -166,7 +186,6 @@ export default function Menu(props) {
{drawer}
</Drawer>
</Box>
{/* content goes here */}
<Box
component="main"
sx={{ flexGrow: 1, padding: 1, width: { sm: `calc(100% - ${drawerWidth}px)` } }}
@ -177,3 +196,5 @@ export default function Menu(props) {
</Box>
);
}
export default Menu;

View File

@ -8,14 +8,35 @@ import { WidthContext } from '../App';
import { handleLinkClick } from '../utils/linkClick';
export const projectsData = [
{
key: 'spot-pl-mgr', oneliner: 'the Spotify API to manage playlists in a graph-based flow',
name: 'Spotify Playlist Manager',
img: 'spot-pl-mgr.png',
desc: [
'Webapp to sync tracks between your Spotify playlists using the Spotify Web API',
'Implemented directed acyclic graph data structures and search algorithms',
'Built with ExpressJS, React, PostgreSQL, Docker and deployed on Oracle Cloud VM'
],
tools: ['React', 'ExpressJS', 'PostgreSQL', 'Spotify API', 'Docker'],
link: 'https://spotify-manager.knravish.me'
},
{
key: 'kafka-ch-grafana', oneliner: 'a distributed ETL pipeline for analyzing large-scale Internet traffic traces, using Clickhouse, Kafka and Grafana',
name: 'Real-Time Internet Traffic Data Analysis',
img: 'kchg-arch-diag.png',
desc: [
'An end-to-end ETL pipeline for ingesting and analyzing terabyte-scale Internet traffic traces',
'Designed using Clickhouse, Kafka, Grafana, and Docker to achieve autoscaling and fault tolerance'
],
tools: ['Docker', 'Kafka', 'Clickhouse', 'Grafana'],
link: 'https://github.com/20kaushik02/real-time-traffic-analysis-clickhouse'
},
{
key: 'fyp-tcp-rl', oneliner: 'adversarial attacks on reinforcement learning-based congestion control for TCP',
name: 'TCP-RL',
img: 'fyp-arch-diag.png',
desc: [
// eslint-disable-next-line
'Implemented RL based TCP congestion control (deep Q-learning and PPO models), which were 2% more performant\
compared to TCPNewReno.',
'Implemented RL based TCP congestion control (deep Q-learning and PPO models), which were 2% more performant compared to TCPNewReno.',
'Demonstrated that performance under simple adversarial attacks was dampened by 40%.',
'Utilized the ns-3 network simulator, TensorFlow and OpenAIs Gym framework.'
],
@ -28,10 +49,10 @@ export const projectsData = [
img: 'k-site-landing.png',
desc: [
'Flagship website for the 2023 edition of Kurukshetra, CEG\'s international techno-management fest.',
'Avg. traffic of 1,000 daily users and transactions',
'Built with React and Express.js',
'Averaged traffic of 1,000 daily users and transactions.',
'Built with React, ExpressJS, PostgreSQL and deployed on AWS EC2',
],
tools: ['React', 'Express.js', 'AWS'],
tools: ['React', 'ExpressJS', 'PostgreSQL', 'AWS EC2'],
link: 'https://k23.kurukshetraceg.org.in'
},
{
@ -71,13 +92,13 @@ const Projects = () => {
onClick={() => handleLinkClick(process.env.PUBLIC_URL + "Projects/" + project.img)}
/>
<CardContent align="left">
<Typography gutterBottom primaryTypographyProps={{ fontSize: 16 }} component="div">
<Typography gutterBottom component="div">
{project.name}
</Typography>
<List>
{project.desc.map((line, index) =>
<ListItem disableGutters key={index}>
<ListItemText primaryTypographyProps={{ fontSize: 12 }} primary={line} />
<ListItemText slotProps={{ primary: { fontSize: 12 } }} primary={line} />
</ListItem>
)}
</List>
@ -114,7 +135,7 @@ const Projects = () => {
navigation
speed={400}
spaceBetween={10}
slidesPerView={width >= 480 ? 2.4 : 1.1}
slidesPerView={width >= 480 ? 2.6 : 1.1}
// centeredSlides
grabCursor
>

View File

@ -12,10 +12,6 @@ code {
monospace;
}
.App-logo {
animation: spin 1s infinite linear;
}
@keyframes spin {
from {
transform: rotate(0deg);

View File

@ -2,7 +2,6 @@ import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
@ -10,8 +9,3 @@ root.render(
<App />
</React.StrictMode>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -1,13 +0,0 @@
const reportWebVitals = onPerfEntry => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);
getLCP(onPerfEntry);
getTTFB(onPerfEntry);
});
}
};
export default reportWebVitals;