Interested in front-end development but not sure where to begin? Look no further! In this article, I'll guide you through the essentials, from basics to advanced concepts.
What is Front-end development?
In the world of web and software development, the front-end refers to the part of a website or application that users see and interact with, which includes the User Interface (UI) as a key factor. To create the UI, front-end developers use HTML for structure, CSS for styling, and JavaScript for interactivity. As it becomes more complex, developers rely on tools, frameworks, and libraries to streamline the development process while HTML, CSS, and JavaScript remain the core languages for UI development.
However, in the past, building websites was a more tedious process that involved creating each page and element manually, often in a monolithic architecture. As websites grew in scale and more developers became involved, common elements such as buttons and forms often appeared different across various sections of the site. Furthermore, there were instances where one team ended up building a feature that another team had already completed, unknowingly adding to the confusion. All of these issues resulted in large, unwieldy code bases that were difficult and expensive to maintain, leading to communication breakdowns among developers. You may notice that large corporations such as Microsoft and Amazon have websites that look similar to those from 1997. This is because implementing significant changes to their architecture and culture can be quite challenging.
Can this problem be avoided? Absolutely. However, why does it keep happening repeatedly? Without considering your design and development process early on, you will encounter problems as you expand.
To avoid this problem or to remedy the current lack of consistency in your products, you need three essential tools:
- Style Guide
- Component Library
- Design System
By the end of this article, you'll have gained years' worth of trial and error, research, and development, even if it seems like a lot to take in at first.
What Is a Style Guide?
A style guide is a set of guidelines that outline the rules for how your website or application should look and feel as well as voice and tone. It covers everything from typography and color palettes to iconography and button styles. By following a style guide, you ensure consistency throughout your site, making it easier to maintain and update.
A style guide is an essential tool for creating a consistent visual identity that reflects your brand's personality and values. While not always publicly available, nearly every prominent brand has its own style guide. For example, check Google's style guide.
What is a Component Library?
A component library is a dynamic and functional manifestation of your style guide. It's a collection of pre-built UI components that ca be reused throught your brand website or application. These components can include everything from buttons and forms to entire sections of the site. By using pre-built components, you get:
- Faster development. You can build your site or app faster and more efficiently.
- Consistency. You can ensure consistency across your site.
- Maintainability. You can make it easier to maintain and update your site.
- Accessibility. You can ensure that your site is accessible to all users.
What is a Design System?
A design system serves as a comprehensive guide for the design of your website or application, covering everything from the overall layout to the smallest details. It encompasses your style guide and component library, and includes guidelines for accessibility, responsive design, user experience, and interaction design. A design system ensures consistency across your site while also providing a framework for innovation and growth. Google's Material Design is one of the most widely used and respected design systems.
Where Should You Begin?
Your starting point may vary depending on the stage of your company or product. Before we delve into the details, let's take a look at the big picture:
-
Master HTML or Hyper Text Markup Language. It goes beyond the basics that many developers assume they know. Delve deeper into it and learn about Semantic Markup (the real SEO), Microdata for structured data, and the WCAG accessibility guidelines.
-
Learn CSS or Cascading Style Sheets is the language used to style HTML elements and create visually appealing designs. Start with the basics of CSS, such as selectors, properties, and values, and then move on to more advanced topics like layout, responsive design, and preprocessors like Sass or Less.
-
Learn JavaScript or JS is the language used to create interactive elements on a website or application. It's the most popular programming language in the world, and it's used by developers to create everything from simple animations to complex web applications. Start with the basics such as variables, functions, loops, events, and the Document Object Model (DOM) then move on to more advanced topics like Typescript.
-
Explore React, Vue, or Angular. These are the most popular JavaScript frameworks for building web applications. They provide a robust set of tools and libraries that make it easier to build complex applications, including creating a Component Library. They also provide a solid foundation for learning JavaScript. My recommendation would be React as it's the most popular and widely used framework.
You can skip to the next section if you already know HTML, CSS, JavaScript, and a framework like React.
Here's an outline to guide us as we move into the specifics.
- Compile existing design patterns.
- Define design principles and start a Style Guide.
- Define your design tokens.
- Create or identify an icon set.
- Choose languages/frameworks supported.
- Evaluate Monorepo vs. single package.
- Evaluate CSS/Sass vs. CSS-in-JS.
- Create a Component Library.
- Choose a documentation platform.
- Write design system documentation.
Building the Design System
Compile existing design patterns.
To ensure consistency in the user experience (UX), it's important to identify and document existing design patterns used in your interface, even if you're not starting from scratch.
Begin documenting and reviewing the design patterns within your team, and identify the interaction patterns you prefer to establish the components needed for your style guide.
Define design principles and start a Style Guide.
Create a style guide by translating the documented design patterns into a cohesive system using tools like:
My recommendation would be Figma, but it's ultimately up to your team and company. Here's some helpful Figma for Beginners tutorials.
Define your design tokens.
Design tokens store visual design attributes and are named entities that act as the visual design atoms of the design system, replacing hard-coded values such as hex values for color and pixel values for spacing to maintain consistency and scalability in the UI development.
This includes things like:
- Colors (text, backgrounds, borders)
- Fonts
- Typography sizes
- Spacing values
- Shadows
For example, take a look at Vercel's Design System and Dropbox's Design System.
--geist-foreground: #000;
--geist-background: #fff;
--accents-1: #fafafa;
--accents-2: #eaeaea;
--accents-3: #999999;
--accents-4: #888888;
--accents-5: #666666;
--accents-6: #444444;
--accents-7: #333333;
--accents-8: #111111;
--geist-success: #0070f3;
--geist-error: #ee0000;
--geist-warning: #f5a623;
--dropdown-box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.02);
--dropdown-triangle-stroke: #fff;
--scroller-start: var(--geist-background);
--scroller-end: rgba(255, 255, 255, 0);
--shadow-small: 0 5px 10px rgba(0, 0, 0, 0.12);
--shadow-medium: 0 8px 30px rgba(0, 0, 0, 0.12);
--shadow-large: 0 30px 60px rgba(0, 0, 0, 0.12);
--portal-opacity: 0.25;
Now, designers and developers share a common language.
Create or identify an icon set.
To decide whether to create your own icons, consider the size and priorities of your company, and if you already have existing icons, evaluate which to keep. Alternatively, you can explore open-source icon libraries such as:
To ensure consistency, it's important to standardize the usage and identify consumption patterns of your icons, whether they are created or open source. It's also critical to consider the end-users, such as designers, developers, or marketers. By using SVGs, you can create a single source of truth icon library following these steps:
- Create or provide raw SVGs.
- Optimize and compress SVGs with SVGO.
- Use SVGR to automatically create React components for developers.
- Produce PNGs and JPEGs at various sizes/resolutions for marketing.
- Bundle SVGs into a bundled font for use in mobile applications.
Choose languages/frameworks supported.
It's essential to consider the languages and frameworks your team currently supports and plan accordingly for your component library's architecture. If your application uses script tags instead of ES Modules, you'll need to bundle your library into a single distributable file. For example, a vanilla JavaScript app would require the following script tag in an HTML file:
One can use Webpack or Rollup to accomplish this goal, although Webpack is often preferred as it is the industry standard. If using TypeScript, TSDX is also recommended.
In my opinion, Turbopack seems to be the future because it's an incremental bundler designed for JavaScript and TypeScript, written in Rust with optimization features.
Evaluate Monorepo vs. single package.
A Monorepo is a repository that contains multiple projects or libraries/packages, providing the ability to build and publish multiple libraries from a single codebase. Although it can address substantial hurdles, it also creates others, hence it's crucial to consider both its pros and cons.
Here are some factors to consider when determining the most suitable solution for your company:
- Do you have multiple repositories publishing to NPM?
- Is your build, test, lint infrastructure complex and duplicated in multiple places?
- How many repositories do you have or plan to have in the next year?
- What is the size of your team, and how many people will use the component library?
- Will the library be open-source, and can you leverage industry resources to solve problems?
- Do you anticipate the need for multiple packages in the future? (e.g. icons, codemods, etc)
In my case, for a project solely focused on a website, a monorepo is unnecessary, but for a universal application requiring shared components/configurations across multiple platforms (e.g., web and mobile), a monorepo can provide significant benefits. Solito is a good example.
Evaluate CSS/Sass vs. CSS-in-JS.
CSS-in-JS is an approach that allows you to write CSS code as JavaScript functions and styles are applied dynamically at runtime. For optimal performance, consider using a near-zero runtime solution like Stitches.
Consider using Sass if your component library needs to output raw HTML/CSS, as IBM's Carbon Design System does. You can use CSS variables to contain your design tokens.
If you're using React, check out How Should I Style My React Application?
Create a component library.
Now that you have identified your technical requirements and initiated your style guide, it's time to start building your Component Library. I suggest utilizing Storybook in conjunction with React.
Creating a component library is much more than just translating the style guide into code.
Consider how your consumers will interact with your components and what kind of API would be most clear and self-documenting. For instance, when it comes to buttons, you might have various types like primary and secondary, etc.
Should you have separate components for each?
or should you use a prop?
Additionally, what name should you give to the prop? Would 'variant' or 'type' be appropriate? Have you thought about the fact that 'type' is a reserved attribute for the HTML <button>
element? These are important considerations to keep in mind as you construct your component library.
Here are some additional considerations to think about:
-
Should consumers pass CSS properties in as props or extend/wrap components for styling? Consider styled-system.
-
Build loading states directly into components or have a generic component for loading (spinner, skeleton)?
-
How to test purely visual components? Snapshot testing or Visual diff testing?
-
What's needed for consumers to integrate with the component library? global style reset? Should they add any Babel plugins?
-
Utilize Conventional Commits for auto-generating changelog?
-
Do components need to support web and mobile? Use React Native Web for cross-platform code sharing.
Choose a documentation platform.
To showcase your design system, you'll need a platform. If you're new to this, I'd suggest using Storybook Docs. It provides similar features as other platforms like Docz, Styleguidist, Docusaurus, and Nextra (Recommended for Next.js projects). Here are some of the benefits:
- Copy code snippets from component examples with ease.
- Auto-generate a props table based on
prop-types
anddefaultProps
. - Quickly view all permutations of a component.
- Write custom docs using MDX.
Consider creating a custom solution using MDX if you want your design system to reflect your brand and use your component library. This approach enables the insertion of React components inside Markdown files. For instance, this blog uses this method.
One impressive example of having complete control over documentation is demonstrated by Atomize React.
Write design system documentation.
Now that you've chosen a documentation platform, You should include the following in your documentation:
- Installation and setup instructions for your component library.
- Type definitions and props schemas for each component.
- Examples of each component with copyable code snippets.
- Explanations of the technology choices you made.
Consider also adding:
- A "Getting Started" tutorial section.
- Completed UI templates for users to choose from.
- Information about theming.
- A live code playground for users to interact with the components.
Conclusion
As someone who has been coding for most of my life, starting back in the mid-90s when HTML was still in its early stages and CSS hadn't even been created, I've witnessed a significant evolution in the field. I've seen the rise and fall of frameworks, the growth and decline of JavaScript libraries, and the surge and dip of CSS preprocessors. Learn more about my developer journey!
Building component libraries from the ground up has given me a newfound appreciation for the hard work that goes into front-end development and design. Below, I've compiled a list of design systems that have inspired me and serve as excellent resources. Don't hesitate to reach out if you'd like to talk about building design systems. I'm looking forward to seeing what the next few years have in store for us.
Resources
Design Systems