-
Notifications
You must be signed in to change notification settings - Fork 54
Jennifer - Portfolio #50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
…ded img for later use
…from card/button/icons
…from card/button/icons
…nd also imported usestate react
AgnesSj01
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Really impressive portfolio, everything works exactly as it should.
You have a clear and logical structure in your code, with a good separation between components, data, and sections. This made the project easy to follow and understand.
Each part of the codebase is also well-organized and straightforward to read, and you’ve chosen good, descriptive names for your functions and props.
Your code is clean and readable on its own, but adding a few small comments to explain the purpose of certain layout decisions, accessibility choices, or more complex style rules could make it even clearer.
Great work!
| aria-hidden="true" | ||
| focusable="false" | ||
| xmlns="http://www.w3.org/2000/svg" | ||
| {...props} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice use of spreading props!
| focusable="false" | ||
| {...props}> | ||
| <path | ||
| d="M12.1094 22.6562C12.1094 22.5625 12.0156 22.4688 11.875 22.4688C11.7344 22.4688 11.6406 22.5625 11.6406 22.6562C11.6406 22.75 11.7344 22.8438 11.875 22.7969C12.0156 22.7969 12.1094 22.75 12.1094 22.6562ZM10.6562 22.4219C10.6562 22.5156 10.75 22.6562 10.8906 22.6562C10.9844 22.7031 11.125 22.6562 11.1719 22.5625C11.1719 22.4688 11.125 22.375 10.9844 22.3281C10.8438 22.2812 10.7031 22.3281 10.6562 22.4219ZM12.7656 22.375C12.625 22.375 12.5312 22.4688 12.5312 22.6094C12.5312 22.7031 12.6719 22.75 12.8125 22.7031C12.9531 22.6562 13.0469 22.6094 13 22.5156C13 22.4219 12.8594 22.3281 12.7656 22.375ZM15.8125 4.375C9.34375 4.375 4.375 9.34375 4.375 15.8125C4.375 21.0156 7.60938 25.4688 12.2969 27.0625C12.9062 27.1562 13.0938 26.7812 13.0938 26.5C13.0938 26.1719 13.0938 24.5781 13.0938 23.5938C13.0938 23.5938 9.8125 24.2969 9.10938 22.1875C9.10938 22.1875 8.59375 20.8281 7.84375 20.5C7.84375 20.5 6.76562 19.75 7.89062 19.75C7.89062 19.75 9.0625 19.8438 9.71875 20.9688C10.75 22.7969 12.4375 22.2812 13.1406 21.9531C13.2344 21.2031 13.5156 20.6875 13.8906 20.3594C11.2656 20.0781 8.59375 19.7031 8.59375 15.2031C8.59375 13.8906 8.96875 13.2812 9.71875 12.4375C9.57812 12.1094 9.20312 10.8906 9.85938 9.25C10.7969 8.96875 13.0938 10.5156 13.0938 10.5156C14.0312 10.2344 15.0156 10.1406 16 10.1406C17.0312 10.1406 18.0156 10.2344 18.9531 10.5156C18.9531 10.5156 21.2031 8.92188 22.1875 9.25C22.8438 10.8906 22.4219 12.1094 22.3281 12.4375C23.0781 13.2812 23.5469 13.8906 23.5469 15.2031C23.5469 19.7031 20.7812 20.0781 18.1562 20.3594C18.5781 20.7344 18.9531 21.4375 18.9531 22.5625C18.9531 24.1094 18.9062 26.0781 18.9062 26.4531C18.9062 26.7812 19.1406 27.1562 19.75 27.0156C24.4375 25.4688 27.625 21.0156 27.625 15.8125C27.625 9.34375 22.3281 4.375 15.8125 4.375Z" /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The path is quite long, you could shorten it by moving the path data into a separate constant. That keeps the component cleaner without changing how it works. For example, this might work:
const githubPath = "M12.1094 22.6562C12.1094 ..."; // moved out for readability
export const CodeIcon = (props) => (
<svg
width="32"
height="32"
viewBox="0 0 32 32"
fill="currentColor"
aria-hidden="true"
focusable="false"
{...props}
<path d={githubPath} />
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you, really good tip! :D
| export const SeeMoreButton = ({ label, ...props }) => { | ||
| return ( | ||
| <SeeMoreButtonBase type="button" {...props}> | ||
| <SeeMoreIcon /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great that you're using an icon componen, keeps things reusable.
| @media ${media.tablet} { | ||
| padding: 96px 16px; | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice responsive spacing here, clean and consistent.
| a { | ||
| text-decoration: none; | ||
| color: #fff; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You might consider adding :hover styles for links for better feedback.
| align-items: center; | ||
| gap: 16px; | ||
| align-self: stretch; | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice responsive spacing and clean layout structure.
Npahlfer
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
✅
| <h1>Portfolio</h1> | ||
| <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptatem, laborum! Maxime animi nostrum facilis distinctio neque labore consectetur beatae eum ipsum excepturi voluptatum, dicta repellendus incidunt fugiat, consequatur rem aperiam.</p> | ||
| <GlobalStyle /> | ||
| <SkipLink href="#main-content">Skip to main content</SkipLink> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice that you use a skip to main content link!
| </Info> | ||
|
|
||
| <SocialRow aria-label="Social media links"> | ||
| <a |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would have been nice to collect repeatable content like this in an array and then loop out the elements. Then if you add more social media its real easy to just add the data for it. This is also usually how it comes into the app from the cms/api:
const soMe = [
{
name: 'LinkedIn'.
link: 'https://www.linkedin.com/in/jennifer-jansson',
icon: LinkedInIcon,
},
{...},
{...},
]
// And in jsx:
{soMe.map((item, index) => {
const IconComponent = item.icon
return (
<a
href={item.link}
target="_blank"
rel="noreferrer"
aria-label={item.name}
>
<IconComponent />
</a>
))There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for the suggestion! I will look into how I can do this, super good tip!
| <SkillsTitle>Skills</SkillsTitle> | ||
|
|
||
| <Columns> | ||
| <Column> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some repetition here could have been nice to loop not just the list items, but also the columns
const columns = [
{
// This title could even have been picked from the key in the skillsData object
// via the `Object.keys()` function, but maybe thats a bit too much 😅
title: 'Code',
items: skillsData.code,
},
...
]
{columns.map((column, index) => (
<Column key={index}>
<Tag>
<TagTitle>{column.title}</TagTitle>
</Tag>
<List>
{column.items.map((item, idx) => (
<Item key={`${column.title}-${idx}`}>{item}</Item>
))}
</List>
</Column>
))
}Why is it good to loop out content like this? Because it's less to write and if you need to change anything then you only change in one place.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Really appriciate the feedback, I learned new things of these comments and will use this in the future! Always looking for ways to keep code clean and dry and ways to keep code shorter and consice.
|
Really good job! Would have wanted to see some more extensive use of the theme, and there were some repetition that could have been avoided (DRY), but otherwise good! |
Netlify
Figma
So this is my Portfolio :)
My section structure:
Hero/header
Tech
Projects
SKills
Journey/My words
Contact/footer
Reusable components:
Buttons
Card
Globalstyles
Icons
See more button
If i had more time I would have tried to do a typography and theme file, will try to implement it after this project is graded!