The html element should have a lang or xml:lang attribute which describes the language of the document.
<html><head><link rel="preconnect" hr...</html>
<html><head><link rel="preconnect" hr...</html>
<form id="dropdown-filter-options" aria-labelledby="dropdown-filter-header" class="Dropdown__Options-tngoct-2 hxPvRS"><label class="DropdownOption__S...</form>
Hello, everybody! 👋
This is my 30th solution on Frontend Mentor! 🎉 (And my first Guru level challenge submission.) 😎 This was definitely a tricky challenge, but I got to learn and try out many new things! 😀
I used React and Next.js to build the site, styled-components to style it, Formik (and Yup) to handle the forms in this challenge, and Framer Motion to add some page transitions and animations. 😄
There were quite a few things I had to learn in order to complete this challenge, and I'm not sure if I did them all correctly. 😥 Looking back, there are a few things I wish I would have differently, but it's a learning experience! 🙂
If anyone could share some resources on how to manage and organize larger projects like this, I'd really appreciate it! 👍 Lots of resources that I find only focus on specific things (like creating a popup or using certain features of a tool) and not so much how to approach and think about an entire app. 🙃
If you'd like to learn more about my project, see the README in my Git repo (where I also list a few quirks in my solution).
Feedback welcome and appreciated! 😊
Happy coding! 😁
BTW, click on the sidebar avatar for the attribution.
Congrats on completing your 30th (!!) challenge overall and your 1st Guru level challenge! I'd agree with Em and say this is your best one yet (although you've posted lots of brilliant solutions!) 🎉
Here are some thoughts related to some of the bugs and issues you mentioned in your
localStorage. So it's partially rendered by the time it can read the state. In a typical app where you're pulling data, this configuration would be stored as a user preference in the database. This means it wouldn't have the flash, as everything would be set during server-side rendering in Next.js. That might not be the issue, but that would be my guess anyway.
display: none;on the
inputelements. Instead, I'd recommend using a
.sr-onlyclass to visually hide the checkboxes and keep them accessible to screen readers. Here's a good article from the A11y Project about visually hiding content to learn more.
After looking at your code, here are a few recommendations:
&&operator so much. That means this line:
filteredInvoices && filteredInvoices.length === 0could become this
filteredInvoices?.length === 0.
spanelements to display the invoice page's addresses. Instead, you could add more context in the HTML by using the
addresselement. You can read more about the address element on MDN here.
It's awesome to see you adding animations and extra details like the attribution overlay. Your attention to detail is incredible!
A couple of feature suggestions I'd love to see would be:
Overall, you've done an AMAZING job on this challenge! Especially considering you're still new to React and this was your first time using most of these packages.
Keep up the brilliant work! 🙌
Marked as helpful
I'm just reading here throw all the above feedback, and it's so warm and inspiring, also like overall community here. It's very valuable experience to have a touch with such folks like you, thanks for that :)
I'm pretty new here, try out your app something, and have a small question. Is it suggested any validation on form fields content? I just tapped my keyboard randomly a lot and just three fields produce some warnings, actually number data fields (so, I typed into those fields very big numbers, my invoice had a price over 10e+40 though...), and also e-mail field. Also my colleague told me a story, when he while testing the web app sent around 2Gb strings in authorization forms :D So, is it suggested such kinds of validation mechanisms to apply into Frontend Mentor challenges, or is it an overhead for this type of tasks and not suggested here?
Happy coding :)
Edit: here are some pictures with artifacts of such an irresponsible input :D https://drive.google.com/drive/folders/1DWqMXkqhrISK1GLCX2N2tE8rEul9wNcC?usp=sharing
Hey, there! Thanks for the feedback! 😀
I did add some basic form validation to the forms in this challenge (like to make sure that data of the correct type is entered into each form field), but I don't think I considered what would happen if a user entered really long numbers. 😅
Most of the Frontend Mentor challenges come with a README that outlines the basic steps and goals for the challenge, but if you want to add any other details then you're more than welcome to! 😉 Of course, taking care of any issues that you find in your solution (such as this one) is encouraged.
But solutions aren't usually perfect (like mine)—so thanks for pointing this one out! 😊
This is excellent APG! I think it's your best one yet. Great attention to detail. Smooth transitions and I like the little extras, like the number of invoices on the browser tab and the surprise when clicking on your avatar 😀 Hopefully someone comments regarding architecture since I'm curious about that as well. Filter works perfectly for a single category, my feature request would be to add for multiple categories lol :-)
Wow! Thank you so much, emestabillo! 😊
I actually initially thought of allowing multiple filters to be selected on the home page, but I changed my mind for some reason after looking at the design files. But I do agree that's a good idea! Thanks! 😀
I love the cool animations and you also did an excellent job!
Thanks, BurritoDoggie! 😀
@ApplePieGiraffe Sorry I am late, with my response but I must say this is very great work. You have really done it bro! I love everything about it and just as you guessed... the first thing I did was switch to dark mode 😂 Anyways, Cheers man! Happy coding (...and Keep on coding too!)😎
Haha, thanks, dude! 🙌
Wow!! This is so awesome.
You did a fantastic job from the animations to the light and dark themes to the filters and responsiveness. I will definately take time to learn how all this was achieved from your repo. And congrats for submiting your guru solution.
I'm stuck on your projects. Amazing stuff. I love the way you document them on github. Gave me some ideas. I've been curious about the dark theme switch thingy. Will take time to study how you achieved the functionality. Maybe you could apply margins to the filter options to make it more breathable and easily distinguishable
I'm working on the same project and I will submit it in a few days. Your build is awesome, it's very responsive and reactive. However, using react dev tools, I saw that a lot of re-renderings happening on your application, mostly from components on your Invoice page. So I started looking at your code and I saw that you're not using memo or useCallback on your functions and components. What's happing is that every time the state of your parent element changes, all the components are going to re-render again, even if they don't need to re-render. If possible, I would like to copy your repo and create a solution for this problem. Let me know if I can, and maybe, we could work together to solve this problem!
Thanks for your time and happy coding :)
Yes—that's totally fine! Feel free to fork the repository and play around/change stuff. Thanks for taking a look and mentioning that issue. I'm still learning a lot about React, so any suggestions and improvements are welcome! 😊
Happy coding to you, too! 😀
In a few days, I'm gonna copy the repo and when the job is finished I'll create a README.md with all the changes I made, all the problems I solved and how everything works so you can learn new important things as a react developer :)
Thank you again and happy coding!
Thanks, Galielo! I'll be looking forward to that! 😀
This is soo neat! APG, I'll use your site as the inspiration for the animations. This is phenomenal work!!! <3
FWIW, I'm currently working on this project and have made it into a full stack app with React/Nextjs and Fauna (including authentication and with plans to turn it into a SaaS). I'm looking forward to deploy it in a few weeks.
Hey, APG! Congrats on your 30th solution! 🥳🎉
I'm nowhere near the point where I could give this a proper critique, and it seems like you've already gotten some amazing feedback, so I guess I'll just pile on the praise bandwagon! 😄
The animations and transitions are fantastic as always - the UX feels great. I know you've utilized various versions of the attribution button/avatar in previous projects, and it remains a great touch (and something I might have to steal!).
Definitely bookmarked for reference. 👍 Looking forward to the next one!
Thanks as always, Anna! 😊
Your solutions remind me to pay extra-careful attention to detail (which I tried to do). 😅
I'm very happy to hear the UX feels great for you and that you liked the attribution! 😉 I thought a bunch about those things and really hoped they would come out well! 🤞
Congratulations, another amazing solution from you (as expected). I love the soft and cool animations you used. Your work impresses me, again, congratulations, mate ;).
This is a great version of the Invoice App, i couldn't find big issues playing with the invoices and testing the responsive layouts.
Only thing i noticed is that the new invoice animation vs edit invoice animation are at different speeds. To open and close an existing invoice takes a bit long... but the animations are sweet! :)
Looking forward to solve this challenge myself someday.
Honestly I really admire your work, especially what you do with animations, I'm getting there someday and you're juss motivating me to get there. I love the dark and light theme, well done APG!! Mobile design is pretty solid.
Join over 180,000 people taking the challenges, talking about their code, helping each other, and chatting about all things front-end!