Skip to content
  • Unlock Pro
  • Log in with GitHub
Profile
OverviewSolutions
14
Comments
11

Nurcholis

@cholis04420 points

I love graphic design and am passionate about coding.

I’m currently learning...

Web Development

Latest solutions

  • Easybank Landing Page using SASS and BEM Naming Convention

    #accessibility#bem#parcel#sass/scss#typescript

    Nurcholis•420
    Submitted about 3 years ago

    0 comments
  • Country List Web App using Next.js + useSWR

    #axios#next#styled-components#typescript#accessibility

    Nurcholis•420
    Submitted over 3 years ago

    3 comments
  • Tip Calculator App using Intl.NumberFormat() as Format Currency

    #accessibility#next#react-testing-library#styled-components#typescript

    Nurcholis•420
    Submitted over 3 years ago

    3 comments
  • Advice Generator using Next.js, Axios and styled-component

    #accessibility#axios#next#styled-components#typescript

    Nurcholis•420
    Submitted over 3 years ago

    11 comments
  • Fylo Dark Theme Landing Page using SCSS and BEM Naming Convention

    #accessibility#bem#sass/scss

    Nurcholis•420
    Submitted over 3 years ago

    2 comments
  • Interactive pricing with Input Range and Checkbox as Toggle Button

    #accessibility#firebase#typescript

    Nurcholis•420
    Submitted over 3 years ago

    4 comments
View more solutions

Latest comments

  • Emerson Melo Martins•110
    @emersonmelomartins
    Submitted about 3 years ago

    Social media dashboard with theme switcher with React

    #react#typescript#vite
    1
    Nurcholis•420
    @cholis04
    Posted about 3 years ago

    Hi Emerson Melo Martins,

    When you pass custom props to a style component, you need to add a prefix ($) to the props name to prevent the props from being an invalid attribute on the DOM.

    export  function  PrimaryCard(...) {
    	return (
    		<CardContainer  $type={type}>
    			...
    			...
    			<CardFooter  $color={footerColor}>
    				...
    			</CardFooter>
    		</CardContainer>
    	);
    }
    
    interface IPrimaryCardFooterProps {
    	$color:  PrimaryCardFooterColorType;
    }
    
    export  const CardFooter = styled.footer<IPrimaryCardFooterProps>`
    	position:  relative;
    	color:  ${(props) =>  props.theme[CARD_FOOTER_COLORS[props.$color]]};
    	display:  flex;
    	align-items:  center;
    	gap:  0.5rem;
    `;
    

    Transient props reference here

    To improve accessibility, you can add a label to the tag <input type="checkbox" aria-label="Toggle theme" />

    Marked as helpful
  • Mariano Alvarez•270
    @Cachilox
    Submitted about 3 years ago

    Responsive landing page using CSS flexbox.

    #accessibility#bem#sass/scss
    1
    Nurcholis•420
    @cholis04
    Posted about 3 years ago

    Hi Mariano Alvarez, congrats on your work.

    It's a bit tricky to make the svg change color when hovered. I guess you can remove the img tag and replace it with the svg tag itself.

    <div class="footer__social">
    	...
    	<a href="#" class="footer__media">
    		<svg class="footer__icon" ...>
    			<path .../>
    		</svg>
    	</a>
    	...
    </div>
    

    then you can select the path in sass to change the fill color.

    footer__media:hover {
    	& > svg > path {
    		fill: hsl(176, 68%, 64%);
    		}
    	}
    }
    

    And if I may add, make sure the img tag has the alt attribute, but if the image is used for decoration, use the empty alt value <img src="..." alt="" />


    To use the <section> tag you must include the heading tag inside the <h1> - <h6>. If you want to wrap an element, use the meaningless <div> tag

    <div class="footer__container container">
    	<figure class="footer__picture">
    		<img src="./images/logo.svg" class="footer__img">
    	</figure>
    
    	<div class="footer__links">
    		<a href="#" class="footer__link">FAQs</a>
    		<a href="#" class="footer__link two">Contact Us</a>
    		<a href="#" class="footer__link">Privacy Policy</a>
    		<a href="#" class="footer__link four">Press Kit</a>
    		<a href="#" class="footer__link">Install Guide</a>
    	</div>
    </div>
    
    <div class="brands container">
    	<img src="./images/logo-google.png" class="brands__item">
    	<img src="./images/logo-ibm.png" class="brands__item">
    	<img src="./images/logo-microsoft.png" class="brands__item">
    	<img src="./images/logo-hp.png" class="brands__item">
    	<img src="./images/logo-vector-graphics.png" class="brands__item">
    </div>
    

    You can do the same with other tags.


    And lastly, I don't see the background as it is in the design, try to add it.

    Marked as helpful
  • Hector Brito•470
    @hectorjbd
    Submitted about 3 years ago

    Responsibe Preview product

    3
    Nurcholis•420
    @cholis04
    Posted about 3 years ago

    Hi Hector Brito, You did a good job!

    Flex can be used for alignment on one axis, horizontally or vertically. But Grid can do alignment on both, vertical and horizontal.

    And to improve accessibility you should wrap the main content with the <main> tag.

    Marked as helpful
  • Samuel•200
    @samupapati
    Submitted about 3 years ago

    advice generator using flex

    1
    Nurcholis•420
    @cholis04
    Posted about 3 years ago

    Hi Samuel,

    The advice sentence is taken from the API and it takes a few seconds to load depending on the internet connection speed. You can provide a load state while the data is fetching.

    And if I may add, there are a few problems listed :

    1. Buttons must have discernible text

    To improve accessibility, each button should have visible text. However, if you are using an image in the button and there is no text listed, you can add the aria-label attribute to the button :

    <button id="buttonGerar" aria-label="Generate Advice"><img src="./assets/images/icon-dice.svg"></button>
    

    2. Images must have alternate text

    For images intended for decoration, add an alt attribute with an empty value.

    <img id="divider" src="./assets/images/pattern-divider-desktop.svg" alt="">
    <img src="./assets/images/icon-dice.svg" alt="">
    

    3. Document should have one main landmark

    Make sure you wrap the main content with the <main> tag.

    <main>
    	<div class="container">
    	...
    	</div>
    </main>
    

    4. Page should contain a level-one heading

    And lastly, each page must have one <h1> tag. In this case, you can replace the <p id="advice">Advice #117</p> tag with <h1 id="advice"> Advice #117</h1>

    Hope this helps you, and happy coding

    Marked as helpful
  • ANIKET DUBEY•110
    @Aniket1026
    Submitted about 3 years ago

    HMTL CSS JS

    1
    Nurcholis•420
    @cholis04
    Posted about 3 years ago

    Good job ANIKET DUBEY

    However, to increase the accessibility of your page, wrap the main content with <main> tag.

  • Pon Huang•210
    @ponhuang
    Submitted about 3 years ago

    Signup Form - SCSS

    1
    Nurcholis•420
    @cholis04
    Posted about 3 years ago

    Hi Pon Huang. Great job on this challenge!

    Looks like you're having a little trouble in this challenge. Let's take a look at the problem you're having:

    - Error icon and message appear only on first input

    All icons and error messages have the same class name. So you need to tell the browser specifically which icon and error message is given the class name 'hidden'

    You can select the icon and error message based on the input element itself :

    const  invalidateElement = (element) => {	
    	const currentElement =  element;
    	const errorIcon = currentElement.nextElementSibling;
    	const errorMessage = currentElement.parentElement.nextElementSibling;
    
    	currentElement.classList.add('invalid');
    	errorIcon.classList.remove('hidden');
    	errorMessage.classList.remove('hidden');
    };
    

    You can do the same for your reset element function. So you don't have to select icons and error messages by document, you can delete the previous code :

    
    const errorMessage = document.querySelector(".error-message"); // remove this line
    const errorIcon = document.querySelector(".error-icon"); //remove this line
    

    - Error icon not center align

    You should remove the margin-bottom property on the input tag.

    input {
    	display: block;
    	width: 100%;
    	height: 5.6rem;
    	/* margin-bottom: 0.6rem;  Remove this line */
    	padding-left: 2.5rem;
    	font-family: inherit;
    	border: 1px solid $color-grayish-blue;
    	border-radius: 5px;
    }
    

    Maybe a little suggestion, you should give the margin-top and margin-bottom properties with the value 1rem in your error message.

    Hopefully can help. Happy coding

    Marked as helpful
View more comments

Stay up to datewith new challenges, featured solutions, selected articles, and our latest news

Frontend Mentor

  • Unlock Pro
  • Contact us
  • FAQs
  • Become a partner

Explore

  • Learning paths
  • Challenges
  • Solutions
  • Articles

Community

  • Discord
  • Guidelines

For companies

  • Hire developers
  • Train developers
© Frontend Mentor 2019 - 2025
  • Terms
  • Cookie Policy
  • Privacy Policy
  • License

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub

Oops! 😬

You need to be logged in before you can do that.

Log in with GitHub