User Authentication For Web And iOS Apps With AWS Cognito (Part 2)

In today’s digital landscape, developers constantly need to be adding new tools to remain competitive and at the top of their craft. If you regularly create new web or mobile applications, then Amazon Cognito is a powerful tool that can cut 90% of the time it usually takes to set up a custom user-management solution. If that is intriguing to you, then let’s continue the journey to learn more about what Amazon Cognito has to offer.

In Our Last Episode

In the previous article, I introduced the concept of user management and how complicated it is in our current digital landscape. In addition, I introduced Amazon Cognito (henceforth referred to as Cognito), a service provided through Amazon Web Services, as a way to deal with this complexity. To illustrate this, I created an iOS application that uses Cognito to provide a login for users using a custom user pool.

Cognito custom user pool diagram (View large version)

Now that we have the basics of an application in place, I want to implement several aspects of user management within the sample application. These aspects include user signup, email verification, password resetting and multi-factor authentication. After that, I want to talk through some of the additional value that Cognito provides through its security model and how you could use it to secure the back end of your application.

To get up and running for this article, you’ll need to leverage the user pool that was created in the previous article. If you haven’t done that work, you can be up and running in about 30 minutes and ready to move forward with what I am covering today.

Rethinking Common Password Habits

The more services we use, the more passwords we’re forced to remember. Is there a way to improve this? Well, just like everything else, we need to do what’s right for our users. Read a related article →

Sample Code

If you are following along with the sample code, you will need to have set up a user pool, configured it properly, and added the settings to a plist file before the application will work. This is a fairly simple (but lengthy) process that was covered thoroughly in the previous article. Most every section of this article will include a link to the Git tag that is used at that point of the code. I hope this will make it easier to follow along.

Letting Users Sign Up

The first step in a user’s journey in your application is the signup process. Cognito provides the capability to allow for users to sign up or to allow only administrators to sign up users. In the previous article, we configured the user pool to allow users to sign up.

One key element to remember in regards to signup is that this is where your attribute settings and password policy are enforced. If you set attributes as required in the user pool, you will have to submit all of those values in order for your signup call to be successful. In our case, we need to gather the user’s first name, last name, email address and desired password.

In this new view controller, SignupViewController, we have an action that gets called when the user clicks the “Complete Registration” button. We need to respond to a few things if they occur:

  • If there is an error, we need to present the error to the end user and allow them to resubmit the form.
  • If we are successful with the signup, we need to check whether the user requires verification of their email address. According to how we set up the user pool, this is a requirement. In most all cases, the user will be required to go to the next step and verify their email address.

The following code represents this process in action:

@IBAction func signupPressed(_ sender: AnyObject) { // Get a reference to the user pool let userPool = AppDelegate.defaultUserPool() // Collect all of the attributes that should be included in the signup call let emailAttribute = AWSCognitoIdentityUserAttributeType(name: "email", value: email.text!) let firstNameAttribute = AWSCognitoIdentityUserAttributeType(name: "given_name", value: firstName.text!) let lastNameAttribute = AWSCognitoIdentityUserAttributeType(name: "family_name", value: lastName.text!) // Actually make the signup call passing in those attributes userPool.signUp(UUID().uuidString, password: password.text!, userAttributes: [emailAttribute, firstNameAttribute, lastNameAttribute], validationData: nil) .continueWith { (response) -> Any? in if response.error != nil { // Error in the signup process let alert = UIAlertController(title: "Error", message: response.error?.localizedDescription, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler:nil)) self.present(alert, animated: true, completion: nil) } else { self.user = response.result!.user // Does user need verification? if (response.result?.userConfirmed != AWSCognitoIdentityUserStatus.Confirmed.rawValue) { // User needs confirmation, so we need to proceed to the verify view controller DispatchQueue.main.async { self.performSegue(withIdentifier: "VerifySegue", sender: self) } } else { // User signed up but does not need verification DispatchQueue.main.async { self.presentingViewController?.dismiss(animated: true, completion: nil) } } } return nil }}

Verifying Email Addresses

Email verification is configured in the creation of the user pool, which we covered in the previous article. As you can see in the following image, we chose to require email validation for users. By verifying email addresses, we can leverage the addresses for other use cases, such as resetting passwords.

Step 4 of user pool creation: configuring verifications for the user pool. (View large version)

Workflow

The entire signup process will also include verification if the user pool was configured that way. The “happy path” representation of this flow would be as follows:

  1. The user is presented with the login screen when launching the application.
  2. The user presses the “Sign up for an account” option on the login screen.
  3. The user is presented with the signup form.
  4. The user fills out the signup form correctly with their information.
  5. The user is presented with the email verification form.
  6. The user enters the code from their email.
  7. The user is sent back to the login form, where they can now log in with their new account.

This flow can be seen in the following view controllers, which are a part of the sample application:

Signup and verification flow (View large version)

There is one important note about verification to consider. If you decide to require both email address and phone number for verification, Cognito will choose to insert the phone number verification into the signup process. You will then have to detect whether the email address is verified and include the logic required to verify it. However, in most cases, if you verify one of the attributes and use it for password resetting, then there isn’t as much of a need to verify the other. If you plan to use multi-factor authentication, I would recommend requiring phone-number verification only.

Coding the Email Verification

Two key actions need to be supported in the view controller that is handling the verification process: submitting the verification code, and requesting that the code be sent again. Luckily, these two actions are fairly easy to implement, and the code can be seen below:

func resetConfirmation(message:String? = "") { self.verificationField.text = "" let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Retry", style: .default, handler: nil)) self.present(alert, animated: true, completion:nil)}@IBAction func verifyPressed(_ sender: AnyObject) { // Confirm / verify the user based on the text in the verify field self.user?.confirmSignUp(verificationField.text!) .continueWith(block: { (response) -> Any? in if response.error != nil { // In this case, there was some error or the user didn't enter the right code. // We will just rely on the description that Cognito passes back to us. self.resetConfirmation(message: response.error!.localizedDescription) } else { DispatchQueue.main.async { // Return to Login View Controller - this should be handled a bit differently, but added in this manner for simplicity self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) } } return nil })}@IBAction func resendConfirmationCodePressed(_ sender: AnyObject) { self.user?.resendConfirmationCode() .continueWith(block: { (response) -> Any? in let alert = UIAlertController(title: "Resent", message: "The confirmation code has been resent.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion:nil) return nil })}

As discussed in the signup and verification flow section, if the user is successful in verifying their address, they will be sent back to the login screen. After this login, the user will be able to get into the protected view within the application, which will display their attributes.

Signup and verification were relatively painless. If you want to see the code at this point of the article, check out the signup-verify tag of the code on GitHub.

Forgot Password

Another key use case in user management is helping users to reset their password securely. Cognito provides this functionality through either email or text message, depending on how the user pool has been configured.

It is important to note that verification is required for resetting a user’s password. If you don’t specify either the phone number or email address to be verified, then the user will have to reach out to you to reset their password. In short, every user pool should have, at minimum, one verified attribute.

Workflow

Just as with signup and verification, the forgot-password workflow is a multi-step process. To achieve the goal of resetting the user’s password, we need to follow these steps (which only include the happy path):

  1. We need to get the user’s email address to get a reference to the user.
  2. We need to request that a verification code be sent to the user. If the user pool has a verified phone number, it will be sent as an SMS. If there isn’t a verified phone number, it will be sent as an email.
  3. We need to inform the user where to look for the code in a secure manner. Cognito returns a masked version of the phone number or email address, to give the user a heads up of where to look.
  4. We allow the user to fill out a form, including both the verification code and a new password.
  5. We submit the password and verification code to Cognito.
  6. We let the user know that their password reset was successful, and they can now log into the application.
  7. We send them back to the login screen.

This flow can be seen in the following view controllers, which are a part of the sample application:

Forgot-password workflow (View large version)

Coding the Forgot-Password Workflow

The first step in coding this workflow is to request that the user be sent a verification code. To do this, LoginViewController will pass the email address to ForgotPasswordViewController before the segue is performed. Once the new view appears, the email address will be used to get a reference to the user and request a verification code.

override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if !emailAddress.isEmpty { // Get a reference to the user pool let pool = AppDelegate.defaultUserPool() // Get a reference to the user using the email address user = pool.getUser(emailAddress) // Initiate the forgot password process, which will send a verification code to the user user?.forgotPassword() .continueWith(block: { (response) -> Any? in if response.error != nil { // Cannot request password reset due to error (for example, the attempt limit is exceeded) let alert = UIAlertController(title: "Cannot Reset Password", message: (response.error! as NSError).userInfo["message"] as? String, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in self.clearFields() self.presentingViewController?.dismiss(animated: true, completion: nil) })) self.present(alert, animated: true, completion: nil) return nil } // Password reset was requested and message sent. Let the user know where to look for code. let result = response.result let isEmail = (result?.codeDeliveryDetails?.deliveryMedium == AWSCognitoIdentityProviderDeliveryMediumType.email) let destination:String = result!.codeDeliveryDetails!.destination! let medium = isEmail ? "an email" : "a text message" let alert = UIAlertController(title: "Verification Sent", message: "You should receive (medium) with a verification code at (destination). Enter that code here along with a new password.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) return nil }) }}

One point to note on this is that Cognito returns information that enables you to tell the user where to find the code. In the code above, we are detecting whether the code will be sent to an email address or phone number, as well as the masked version of the destination. This can be seen in the sample application in the image below.

Forgot-password prompt

After requesting the code, we need to allow the user to enter the new code and updated password. This code from ForgotPasswordViewController is triggered when the user clicks on the “Reset Password” button.

@IBAction func resetPasswordPressed(_ sender: AnyObject) { // Kick off the 'reset password' process by passing the verification code and password user?.confirmForgotPassword(self.verificationCode.text!, password: self.newPassword.text!) .continueWith { (response) -> Any? in if response.error != nil { // The password could not be reset - let the user know let alert = UIAlertController(title: "Cannot Reset Password", message: (response.error! as NSError).userInfo["message"] as? String, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Resend Code", style: .default, handler: { (action) in self.user?.forgotPassword() .continueWith(block: { (result) -> Any? in print("Code Sent") return nil }) })) alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) in DispatchQueue.main.async { self.presentingViewController?.dismiss(animated: true, completion: nil) } })) self.present(alert, animated: true, completion: nil) } else { // Password reset. Send the user back to the login and let them know they can log in with new password. DispatchQueue.main.async { let presentingController = self.presentingViewController self.presentingViewController?.dismiss(animated: true, completion: { let alert = UIAlertController(title: "Password Reset", message: "Password reset. Please log into the account with your email and new password.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) presentingController?.present(alert, animated: true, completion: nil) self.clearFields() } ) } } return nil }}

Once this process is complete, the user is returned to the login screen and informed that the password reset was successful. At this point, the user can log into the application using their new password.

If you want to see the code at this point of the article, check out the forgot-password tag of the code on GitHub.

Multi-Factor Authentication

Multi-factor authentication (MFA) is becoming a standard for anything requiring heightened security. Right now, if I want to log into my email, my bank, my mortgage account or even GitHub, I have to enter a code that I get via text message. Because of this extra layer of security, we prevent anyone from logging into an account if they have both my username and password. Instead of just using a single factor (the password) with the username, they have to use multiple factors (password and the code via SMS).

The great thing is that Cognito supports this out of the box through SMS. The Cognito team has stated that it is also working to add support for email MFA; however, at the time of writing, this isn’t an option. To make this work, we’ll need to change some configuration settings in AWS and create a new user pool.

New User Pool

To properly demonstrate the capabilities of multi-factor authentication using SMS, I will be creating a new custom user pool with only a few modifications compared to our previous user pool. Note that some features (such as required attributes) cannot be modified once a user pool has been created. Because of this, you’ll want to have a solid strategy around your user pool before starting to use it.

The modifications that I made compared to the previous user pool are detailed below:

  • Phone number has been added as a required attribute.
  • Users can sign in using their email address or phone number (we will still choose the email address here).
  • Multi-factor authentication has been set as optional.
  • Email verification has been disabled, and phone number verification has been enabled.

Using SMS Instead of Email

If you are going to send anything more than a few SMS messages per month, you’ll need to request a higher Simple Notification Service (SNS) limit for SMS messages. This is mostly painless, but it is a requirement if you are going to ship an app. The following excerpt from Cognito’s documentation will point you in the right direction. While the team responds to requests fairly quickly, it isn’t instant. I would recommend submitting the request at least a few weeks before a push to production. According to “Specifying User Pool MFA Setting and Email and Phone Verification Settings” in the Amazon Cognito Documentation:

The default spend limit per account (if not specified) is 1.00 USD per month. If you want to raise the limit, submit an SNS Limit Increase case in the AWS Support Center. For New limit value, enter your desired monthly spend limit. In the Use Case Description field, explain that you are requesting an SMS monthly spend limit increase.

Workflow

Because we aren’t forcing multi-factor authentication for the user pool (although you certainly could), we will have a multi-step process to enable and then execute multi-factor authentication. These steps are detailed below (these are the happy path steps):

  1. When the user signs up for an account, they will be asked to verify their phone number (instead of their email address).
  2. After logging into the application, the user will be able to enable multi-factor authentication in their profile.
  3. After enabling multi-factor authentication, the user will be presented with the authentication challenge upon their next login.
  4. Upon entering the multi-factor authentication code correctly, the user will be able to use the application as expected.

Coding Multi-Factor Authentication

The Cognito SDK triggers the display of the multi-factor authentication view controller. You have to define how you want to handle that trigger. In the sample application, this happens in AppDelegate. Because our AppDelegate implements AWSCognitoIdentityInteractiveAuthenticationDelegate, we have the option to define how we want this to be handled. The code below shows the implementation in the sample application:

func startMultiFactorAuthentication() -> AWSCognitoIdentityMultiFactorAuthentication { if (self.multiFactorAuthenticationController == nil) { self.multiFactorAuthenticationController = self.storyboard?.instantiateViewController(withIdentifier: "MultiFactorAuthenticationController") as? MultiFactorAuthenticationController } DispatchQueue.main.async { if(self.multiFactorAuthenticationController!.isViewLoaded || self.multiFactorAuthenticationController!.view.window == nil) { self.navigationController?.present(self.multiFactorAuthenticationController!, animated: true, completion: nil) } } return self.multiFactorAuthenticationController!}

In the case above, we instantiate the view controller from the storyboard, and then we present it. Finally, this view controller is presented.

Within MultiFactorAuthenticationController, we handle the process much like we did in LoginViewController. The view controller itself implements a protocol that is specific to this use case: AWSCognitoIdentityMultiFactorAuthentication. By implementing this protocol, you get an instance in the getCode method, which you must use to pass in the code for verification. The result of this verification will trigger the didCompleteMultifactorAuthenticationStepWithError method.

class MultiFactorAuthenticationController: UIViewController { @IBOutlet weak var authenticationCode: UITextField! @IBOutlet weak var submitCodeButton: UIButton! var mfaCompletionSource:AWSTaskCompletionSource? @IBAction func submitCodePressed(_ sender: AnyObject) { self.mfaCompletionSource?.set(result: NSString(string: authenticationCode.text!)) }}extension MultiFactorAuthenticationController: AWSCognitoIdentityMultiFactorAuthentication { func getCode(_ authenticationInput: AWSCognitoIdentityMultifactorAuthenticationInput, mfaCodeCompletionSource: AWSTaskCompletionSource) { self.mfaCompletionSource = mfaCodeCompletionSource } func didCompleteMultifactorAuthenticationStepWithError(_ error: Error?) { DispatchQueue.main.async { self.authenticationCode.text = "" } if error != nil { let alertController = UIAlertController(title: "Cannot Verify Code", message: (error! as NSError).userInfo["message"] as? String, preferredStyle: .alert) let resendAction = UIAlertAction(title: "Try Again", style: .default, handler:nil) alertController.addAction(resendAction) let logoutAction = UIAlertAction(title: "Logout", style: .cancel, handler: { (action) in AppDelegate.defaultUserPool().currentUser()?.signOut() self.dismiss(animated: true, completion: { self.authenticationCode.text = nil }) }) alertController.addAction(logoutAction) self.present(alertController, animated: true, completion: nil) } else { self.dismiss(animated: true, completion: nil) } }}

One additional piece needs to be noted. Because we didn’t force every user to use multi-factor authentication, we have to give the user the option to enable it. To do this, we’ll need to update the user’s settings. The code below (from AppViewController) demonstrates how to both enable and disable multi-factor authentication by using UISwitch as input:

let settings = AWSCognitoIdentityUserSettings()if mfaSwitch.isOn { // Enable MFA let mfaOptions = AWSCognitoIdentityUserMFAOption() mfaOptions.attributeName = "phone_number" mfaOptions.deliveryMedium = .sms settings.mfaOptions = [mfaOptions]} else { // Disable MFA settings.mfaOptions = []}user?.setUserSettings(settings).continueOnSuccessWith(block: { (response) -> Any? in if response.error != nil { let alert = UIAlertController(title: "Error", message: (response.error! as NSError).userInfo["message"] as? String, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion:nil) self.resetAttributeValues() } else { self.fetchUserAttributes() } return nil})

To see the code at this point of the article, check out the mfa tag of the code on GitHub.

Taking It Further: API Security

One of the benefits of using Cognito for user management is how it integrates with other AWS services. One great example of this is how it integrates with API Gateway. If you want to have a set of APIs that only logged-in users can access, you can use the user group authorizer for API Gateway. This allows you to pass the token you receive when logging into your API calls, and API Gateway will handle the authorization for you.

This can be particularly powerful if you want to set up a serverless back end (via Lambda) that is exposed through API Gateway. This means you could pretty quickly set up a secured set of API endpoints to power your web or mobile application. If you are interested in exploring this more, feel free to check the following article from the API Gateway documentation: “Use Amazon Cognito User Pools with API Gateway.”

Unfortunately, setting up a back end with Lambda is beyond the scope of this article. However, Amazon has provided a resource on getting started with Lambda: “Build an API to Expose a Lambda Function.”

Conclusion

Within a couple of articles, we have managed to progress from an insecure application to an application that supports all of the common user management use cases. What’s even better is that this user management capability is a service supported by AWS, and until you get over 10,000 active users, it is mostly free to use. I believe that whether you are a web, iOS or Android developer, this toolset will prove to be a valuable one. I’m sure you’ve got an idea of what you can build to test this out. Feel free to use the sample code to help you in that process.

Happy coding!

Links and Resources

Smashing Editorial(da, yk, al, il)

Playing With Color: Vibrant Options For Apps And Websites

(This is a sponsored post). Color is one of the most powerful tools in a designer’s toolkit. Color can draw attention, set a mood, and influence the user’s emotion, perception and actions. When it comes to the web and mobile app design, this is definitely a time of vibrant colors. Designers use vibrant colors to focus people’s attention on important elements and to make their designs memorable.

In this article, I’ll summarize a few popular techniques of using vibrant colors in web and mobile design. Also, if you’d like to get started designing and prototyping your own web and mobile experiences, download Adobe XD.

Make Or Break A User’s Experience

All kinds of visual communication in your designs leave at least some kind of cumulative impression on users. Nevertheless, you still need to be careful not to exaggerate. Read a related article →

Monotone

One of the most popular ways to use vibrant colors is with a monotone color palette. A monotone palette has a single color with a mixture of tints and tones. Such color palettes are visually stimulating. Paired with attention-grabbing typography, a monotone color scheme is able to create a really memorable experience.

Sydney Stockhom uses bold color to create a memorable look in a very simple way.
(Image: Pillow) (View large version)

Tip: Monotone is great for mobile apps. Using a single color with black and white accents is a great way to create visual interest on a small screen.

The color, iconography and simple typeface in the Streaks app creates a striking combination that is easy to read and engage with.

Duotone

As the name suggests, a duotone is made up of two colors. It could be two shades of the same color or two contrasting colors. This technique, once a print staple, has found new life online. Thanks to Spotify, duotones are growing in popularity every day.

Two-color photos have almost become a visual symbol of Spotify. (View large version)

Create Emotions

Duotones enable you to inject any image with the emotional attributes of any color. Different colors evoke different emotions:

  • Soft and modest combinations of colors create a serious atmosphere. In Holm Marcher & Co, shown below, every detail contributes to the businesslike atmosphere, and the background image is no exception.
    The soft duotone effect sets a businesslike atmosphere. (Image: Holm Marcher & Co)

  • A combination of bright colors creates a sense of happiness. The main visual for New Deal Design is striking, thanks to the bold color choice. It creates a friendly atmosphere and sets a positive mood.
One intense image is worth a thousand words. (View large version)

Improve Readability

A duotone can give text plenty of contrast. The color variation in an image is adjusted so that text can be shown in a single color almost anywhere on the image.

(Image: Method) (View large version)
(View large version)

Translates Well on Mobile

Last but not least, while the duotone effect lends itself to large desktop images, it can work on mobile screens as well.

(Image: Ognjen Divljak)

Tip: If you want to use a duotone for a hero image, select a simple high-quality photo with a single, clear subject. A busy photograph with a lot of detail might be harder to interpret.

Gradient

Gradients have made their way back into modern user interfaces, this time as high-contrast complementary colors. Modern gradients can include multiple colors, can radiate from the center, and can come from a corner or fall horizontally.

They serve the following functions in user interfaces.

Create a Modern Look

Gradients have made a comeback and breathed new life into flat design. Paired with flat color palette, they can evoke a feeling of modernism.

By using one of the bright, saturated colors associated with material design, you can evoke a feeling of modernism. (View large version) (Image credit: Ramotion)

Improve Content Comprehension

Gradients can improve visual communication. The transition from orange to pink in Symodd’s example below gives depth and contrast to the interface, and it creates some eye-catching visual effects. The shift from light to dark follows the natural scanning patterns of the human eye, moving from the top left of the page to the bottom right.

Symodd’s home page features a full gradient background from orange to pink. It’s a subtle gradient; the two hues aren’t very different from each other, making this easy on the eyes. (View large version)

Create a Pseudo 3D Effect

While the flat aesthetic is sleek and easy to look at, one potential shortcoming is that it lacks an element of realism. To compensate, designers often use gradients to give depth to their backgrounds. This will likely continue to grow as designers try to incorporate more realism and 3D elements into web design.

(Image: Swiss Army Man) (View large version)

Try a Gradient Accent

While gradients are often used as backgrounds for pages, they can work in smaller places as well. Consider using a gradient as an accent in navigation, for a secondary image or for specific types of content. Smaller areas of gradient give you more freedom to play with this technique. For example, you could create visually interesting pairs of multicolor, as Bloomberg does:

Bloomberg uses a gradient for the “Latest News” ticker. (View large version)

Overlay

A color overlay is probably the most self-explanatory effect. And it is one of the most useful and commonly used effects in popular design. If you want to incorporate it in your design, all you need to do is cover an image or video with a semi-transparent colored box.

Trendy Look

By using one of the bright, saturated colors associated with material design, you can evoke a feeling of modernism.

A color overlay enhances the impact of a photograph and enables the designer to modify tone and interpretation. (Image: Hype)

Strongest Clickability Signifier

Consider using an image overlay for interactive card-style elements, for video content and for call-to-action buttons.

Apply hover animations to cards. (Image: Column Five)

Focus User Attention

Overlay effects can focus users on certain design elements. However, when using a single color as an overlay, think about the degree of saturation and transparency of the color:

  • Heavy color combinations (i.e. less transparency and more saturation) put more focus on the color itself.
Studio Up uses less transparency and more saturation for its color overlay. (View large version)
  • Light combinations put more focus on the image.
The color overlay used by Outlines puts more focus on the image. (Image: Outlines) (View large version)

Conclusion

Few design elements are more fun to play with than color. Color effects can be dramatic, impressive and even serene. You the designer really get to experiment when using color effects. Whether you are a fan of bright, bold hues or prefer a more minimalist black and white, the one thing to remember is that there are no wrong colors. What matters most is how you use them.

This article is part of the UX design series sponsored by Adobe. Adobe Experience Design CC (Beta) tool is made for a fast and fluid UX design process, as it lets you go from idea to prototype faster. Design, prototype and share — all in one app. You can check out more inspiring projects created with Adobe XD on Behance, and also visit the Adobe XD blog to stay updated and informed.

Smashing Editorial(ms, vf, yk, al, il)

Building Inclusive Toggle Buttons

Editor’s Note: This article originally appeared on Inclusive Components. If you’d like to know more about similar inclusive component articles, follow @inclusicomps on Twitter or subscribe to the RSS feed. By supporting inclusive-components.design on Patreon, you can help to make it the most comprehensive database of robust interface components available.

Some things are either on or off and, when those things aren’t on (or off), they are invariably off (or on). The concept is so rudimentary that I’ve only complicated it by trying to explain it, yet on/off switches (or toggle buttons) are not all alike. Although their purpose is simple, their applications and forms vary greatly.

In this inaugural post, I’ll be exploring what it takes to make toggle buttons inclusive. As with any component, there’s no one way to go about this, especially when such controls are examined under different contexts. However, there’s certainly plenty to forget to do or to otherwise screw up, so let’s try to avoid any of that.

Improving Interface Design

Did you know that with just a few simple tricks, you can help make a user’s interaction more pleasant? We’ve got your back, with an inspiring list of dialog and modal windows, signup and login screens, navigation and menus, and even more sliders and toggles. Read a related article →

Changing State

If a web application did not change according to the instructions of its user, the resulting experience would be altogether unsatisfactory. Nevertheless, the luxury of being able to make web documents augment themselves instantaneously, without recourse to a page refresh, has not always been present.

Unfortunately, somewhere along the way we decided that accessible web pages were only those where very little happened — static documents, designed purely to be read. Accordingly, we made little effort to make the richer, stateful experiences of web applications inclusive.

A popular misconception has been that screen readers don’t understand JavaScript. Not only is this entirely untrue — all major screen readers react to changes in the DOM as they occur — but basic state changes, communicated both visually and to assistive technology software, do not necessarily depend on JavaScript to take place anyway.

Checkboxes And Radio Buttons

Form elements are the primitives of interactive web pages and, where we’re not employing them directly, we should be paying close attention to how they behave. Their handling of state changes have established usability conventions we would be foolish to ignore.

Arguably, an out-of-the-box input of the checkbox type is a perfectly serviceable on/off switch all its own. Where labelled correctly, it has all the fundamental ingredients of an accessible control: it’s screen reader and keyboard accessible between platforms and devices, and it communicates its change of state (checked to unchecked or vice versa) without needing to rebuild the entire document.

In the following example, a checkbox serves as the toggle for an email notifications setting.

<input type="checkbox" name="notify" value="on"> <label for="notify">Notify by email</label> 
The notify my email control with checkbox checked

Screen reader software is fairly uniform in its interpretation of this control. On focusing the control (moving to it using the Tab key) something similar to, “Notify by email, checkbox, unchecked” will be announced. That’s the label, role, and state information all present.

On checking the checkbox, most screen reader software will announce the changed state, “checked” (sometimes repeating the label and role information too), immediately. Without JavaScript, we’ve handled state and screen reader software is able to feed back to the user.

Screen readers are not just for the blind

Some operate screen readers to assist their understanding of an interface. Others may be visually dyslexic or have low literacy. There are even those who have little physical or cognitive trouble understanding an interface who simply prefer to have it read out to them sometimes.

Supporting screen reader software is supporting screen reader software, not blind people. Screen readers are a tool a lot of different people like to use.

In this case, the on/off part of the switch is not communicated by the label but the state. Instead, the label is for identifying the thing that we are turning off or on. Should research show that users benefit from a more explicit on/off metaphor, a radio button group can be employed.

<fieldset> <legend>Notify by email</legend> <input type="radio" name="notify" value="on" checked> <label for="notify-on">on</label> <input type="radio" name="notify" value="off"> <label for="notify-off">off</label></fieldset> 
Fieldset with notify by email group label (legend) and radio buttons labeled on and off. The on one is selected.

Group labels are a powerful tool. As their name suggests, they can provide a single label to related (grouped) items. In this case, the <fieldset> group element works together with the <legend> element to provide the group label “Notify by email” to the pair of radio buttons. These buttons are made a pair by sharing a name attribute value, which makes it possible to toggle between them using your arrow keys. HTML semantics don’t just add information but also affect behavior.

In the Windows screen readers JAWS and NVDA, when the user focuses the first control, the group label is prepended to that control’s individual label and the grouped radio buttons are enumerated. In NVDA, the term “grouping” is appended to make things more explicit. In the above example, focusing the first (checked by default) radio button elicits, “Notify by email, grouping, on radio button, checked, one of two”.

Now, even though the checked state (announced as “selected” in some screen readers) is still being toggled, what we’re really allowing the user to do it switch between “on” and “off”. Those are the two possible lexical states, if you will, for the composite control.

Styling form elements

Form elements are notoriously hard to style, but there are well-supported CSS techniques for styling radio and checkbox controls, as I wrote in Replacing Radio Buttons Without Replacing Radio Buttons. For tips on how to style select elements and file inputs, consult WTF Forms? by Mark Otto.

This doesn’t quite feel right

Both the checkbox and radio button implementations are tenable as on/off controls. They are, after all, accessible by mouse, touch, keyboard, and assistive technology software across different devices, browsers, and operating systems.

But accessibility is only a part of inclusive design. These controls also have to make sense to users; they have to play an unambiguous role within the interface.

The trouble with using form elements is their longstanding association with the collection of data. That is, checkboxes and radio buttons are established as controls for designating values. When a user checks a checkbox, they may just be switching a state, but they may suspect they are also choosing a value for submission.

Whether you’re a sighted user looking at a checkbox, a screen reader user listening to its identity being announced, or both, its etymology is problematic. We expect toggle buttons to be buttons, but checkboxes and radio buttons are really inputs.

A True Toggle Button

Sometimes we use <button> elements to submit forms. To be fully compliant and reliable these buttons should take the type value of submit.

<button type="submit">Send</button> 

But these are only one variety of button, covering one use case. In truth, <button> elements can be used for all sorts of things, and not just in association with forms. They’re just buttons. We remind ourselves of this by giving them the type value of button.

<button type="button">Send</button> 

The generic button is your go-to element for changing anything within the interface (using JavaScript and without reloading the page) except one’s location within and between documents, which is the purview of links.

Next to links, buttons should be the interactive element you use most prolifically in web applications. They come prepackaged with the “button” role and are keyboard and screen reader accessible by default. Unlike some form elements, they are also trivial to style.

So how do we make a <button> a toggle button? It’s a case of using WAI-ARIA as a progressive enhancement. WAI-ARIA offers states that are not available in basic HTML, such as the pressed state. Imagine a power switch for a computer. When it’s pressed — or pushed in — that denotes the computer is in its “on” state. When it’s unpressed — poking out — the computer must be off.

<button type="button" aria-pressed="true"> Notify by email</button> 

WAI-ARIA state attributes like aria-pressed behave like booleans but, unlike standard HTML state attributes like checked they must have an explicit value of true or false. Just adding aria-pressed is not reliable. Also, the absence of the attribute would mean the unpressed state would not be communicated (a button without the attribute is just a generic button).

You can use this control inside a form, or outside, depending on your needs. But if you do use it inside a form, the type="button" part is important. If it’s not there, some browsers will default to an implicit type="submit" and try to submit the form. You don’t have to use event.preventDefault() on type="button" controls to suppress form submission.

Switching the state from true (on) to false (off) can be done via a simple click handler. Since we are using a <button>, this event type can be triggered with a mouse click, a press of either the Space or Enter keys, or by tapping the button through a touch screen. Being responsive to each of these actions is something built into <button> elements as standard. If you consult the HTMLButtonElement interface, you’ll see that other properties, such as disabled, are also supported out-of-the-box. Where <button> elements are not used, these behaviors have to be emulated with bespoke scripting.

const toggle = document.querySelector('[aria-pressed]');toggle.addEventListener('click', (e) => { let pressed = e.target.getAttribute('aria-pressed') === 'true'; e.target.setAttribute('aria-pressed', String(!pressed));});

A clearer state

An interesting thing happens when a button with the aria-pressed state is encountered by some screen readers: it is identified as a “toggle button” or, in some cases, “push button”. The presence of the state attribute changes the button’s identity.

When focusing the example button with aria-pressed="true" using NVDA, the screen reader announces,“Notify by email, toggle button, pressed”. The “pressed” state is more apt than “checked”, plus we eschew the form data input connotations. When the button is clicked, immediate feedback is offered in the form of “not pressed”.

Styling

The HTML we construct is an important part of the design work we do and the things we create for the web. I’m a strong believer in doing HTML First Prototyping™, making sure there’s a solid foundation for the styled and branded product.

In the case of our toggle button, this foundation includes the semantics and behavior to make the button interoperable with various input (e.g. voice activation software) and output (e.g. screen reader) devices. That’s possible using HTML, but CSS is needed to make the control understandable visually.

Form should follow function, which is simple to achieve in CSS: everything in our HTML that makes our simple toggle button function can also be used to give it form.

  • <button>button element selector
  • aria-pressed="true"[aria-pressed="true"] attribute selector.

In a consistent and, therefore, easy to understand interface, buttons should share a certain look. Buttons should all look like buttons. So, our basic toggle button styles should probably inherit from the button element block:

/* For example... */button { color: white; background-color: #000; border-radius: 0.5rem; padding: 1em 2em;}

There are a number of ways we could visually denote “pressed”. Interpreted literally, we might make the button look pressed in using some inset box-shadow. Let’s employ an attribute selector for this:

[aria-pressed="true"] { box-shadow: inset 0 0 0 0.15rem #000, inset 0.25em 0.25em 0 #fff;}

To complete the pressed/unpressed metaphor, we can use some positioning and box-shadow to make the unpressed button “poke out”. This block should appear above the [aria-prressed="true"] block in the cascade.

[aria-pressed] { position: relative; top: -0.25rem; left: -0.25rem; box-shadow: 0.125em 0.125em 0 #fff, 0.25em 0.25em #000;}
Left button, sticking out, is labeled aria-pressed equals false. Right button, visually depressed, is labelled aria-pressed equals true.

(Note: This styling method is offered just as one idea. You may find that something more explicit, like the use of “on”/“off” labels in an example to follow, is better understood by more users.)

Don’t rely on color alone

“On” is often denoted by a green color, and “off” by red. This is a well-established convention and there’s no harm in incorporating it. However, be careful not to only use color to describe the button’s two states. If you did, some color blind users would not be able to differentiate them.

The aria-pressed false button has a red background color and the aria-pressed true button has a green background color
These versions of the control would fail WCAG 2.0 1.4.1 Use Of Color (Level A)

Focus styles

It’s important buttons, along with all interactive components, have focus styles. Otherwise people navigating by keyboard cannot see which element is in their control and ready to be operated.

The best focus styles do not affect layout (the interface shouldn’t jiggle around distractingly when moving between elements). Typically, one would use outline, but outline only ever draws a box in most browsers. To fit a focus style around the curved corners of our button, a box-shadow is better. Since we are using box-shadow already, we have to be a bit careful: note the two comma-separated box-shadow styles in the pressed-and-also-focused state.

/* Remove the default outline and add the outset shadow */ [aria-pressed]:focus { outline: none; box-shadow: 0 0 0 0.25rem yellow;}/* Make sure both the inset and outset shadow are present */ [aria-pressed="true"]:focus { box-shadow: 0 0 0 0.25rem yellow, inset 0 0 0 0.15rem #000, inset 0.25em 0.25em 0 #fff; }

Changing Labels

The previous toggle button design has a self-contained, unique label and differentiates between its two states using a change in attribution which elicits a style. What if we wanted to create a button that changes its label from “on” to “off” or “play” to “pause”?

It’s perfectly easy to do this in JavaScript, but there are a couple of things we need to be careful about.

  1. If the label changes, what happens with the state?
  2. If the label is just “on” or “off” (“play” or “pause”; “active” or “inactive”) how do we know what the button actually controls?

In the previous toggle button example, the label described what would be on or off. Where the “what” part is not consistent, confusion quickly ensues: once “off”/unpressed has become “on”/pressed, I have to unpress the “on” button to turn the “off” button back on. What?

As a rule of thumb, you should never change pressed state and label together. If the label changes, the button has already changed state in a sense, just not via explicit WAI-ARIA state management.

In the following example, just the label changes.

const button = document.querySelector('button');button.addEventListener('click', (e) => { let text = e.target.textContent === 'Play' ? 'Pause' : 'Play'; e.target.textContent = text;});

The problem with this method is that the label change is not announced as it happens. That is, when you click the play button, feedback equivalent to “pressed” is absent. Instead, you have to unfocus and refocus the button manually to hear that it has changed. Not an issue for sighted users, but less ergonomic for blind screen reader users.

Play/pause buttons usually switch between a play symbol (a triangle on its side) and a pause symbol (two vertical lines). We could do this while keeping a consistent non-visual label and changing state.

<!-- Paused state --> <button type="button" aria-pressed="false" aria-label="play"> &#x25b6;</button><-- Playing state --> <button type="button" aria-pressed="true" aria-label="play"> &#x23f8;</button> 

Because aria-label overrides the unicode symbol text node, the paused button is announced as something similar to, “Play button, not pressed” and the playing button as ,“Play button, pressed”.

This works pretty well, except for where voice recognition and activation is concerned. In voice recognition software, you typically need to identify buttons by vocalizing their labels. And if a user sees a pause symbol, their first inclination is to say “pause”, not “play”. For this reason, switching the label rather than the state is more robust here.

Three implementation examples. The first just changes label from play to pause and is okay. The second keeps the play label and changes state, which is incorrect because the pause button cannot be identified with voice recognition. The third changes label and state so the button becomes a pause button which is pressed, which is incorrect. Only use one of the first two implementations.
Never change label and state at the same time. In this example, that would result in a paused button in the pressed state. Since the video or audio would be playing at this point, the lexical “pause” state cannot be also be considered “pressed” on “on”.

Auxiliary labeling

In some circumstances, we may want to provide on/off switches which actually read “on/off”. The trick with these is making sure there is a clear association between each toggle switch and a respective, auxiliary label.

Imagine the email notification setting is grouped alongside other similar settings in a list. Each list item contains a description of the setting followed by an on/off switch. The on/off switch uses the terms “on” and “off” as part of its design. Some <span> elements are provided for styling.

<h2>Notifications</h2> <ul> <li> Notify by email <button> <span>on</span> <span>off</span> </button> </li> <li> Notify by SMS <button> <span>on</span> <span>off</span> </button> </li> <li> Notify by fax <button> <span>on</span> <span>off</span> </button> </li> <li> Notify by smoke signal <button> <span>on</span> <span>off</span> </button> </li></ul> 
A list of notifications settings with associated buttons reading with either on or off highlighted, depending on the state

The virtue of lists is that, both visually and non-visually, they group items together, showing they are related. Not only does this help comprehension, but lists also provide navigational shortcuts in some screen readers. For example, JAWS provides the L (list) and I (list item) quick keys for moving between and through lists.

Each ‘label’ and button is associated by belonging to a common list item. However, not providing an explicit, unique label is dangerous territory — especially where voice recognition is concerned. Using aria-labelledby, we can associate each button with the list’s text:

<h2>Notifications</h2> <ul> <li> <span>Notify by email</span> <button aria-labelledby="notify-email"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by SMS</span> <button aria-labelledby="notify-sms"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by fax</span> <button aria-labelledby="notify-fax"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by smoke signal</span> <button aria-labelledby="notify-smoke"> <span>on</span> <span>off</span> </button> </li></ul> 

Each aria-labelledby value matches the appropriate span id, forming the association and giving the button its unique label. It works much like a <label> element’s for attribute identifying a field’s id.

The switch role

Importantly, the ARIA label overrides each button’s textual content, meaning we can once again employ aria-pressed to communicate state. However, since these buttons are explicitly “on/off” switches, we can instead use the WAI-ARIA switch role, which communicates state via aria-checked.

<h2>Notifications</h2> <ul> <li> <span>Notify by email</span> <button role="switch" aria-checked="true" aria-labelledby="notify-email"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by SMS</span> <button role="switch" aria-checked="true" aria-labelledby="notify-sms"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by fax</span> <button role="switch" aria-checked="false" aria-labelledby="notify-fax"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by smoke signal</span> <button role="switch" aria-checked="false" aria-labelledby="notify-smoke"> <span>on</span> <span>off</span> </button> </li></ul> 

How you would style the active state is quite up to you, but I’d personally save on writing class attributes to the <span>s with JavaScript. Instead, I’d write some CSS using pseudo classes to target the relevant span dependent on the state.

[role="switch"][aria-checked="true"] :first-child, [role="switch"][aria-checked="false"] :last-child { background: #000; color: #fff;}

An interesting thing happens when a button with the aria-pressed state is encountered by some screen readers: it is identified as a “toggle button” or, in some cases, “push button”. The presence of the state attribute changes the button’s identity.

When focusing the example button with aria-pressed="true" using NVDA, the screen reader announces,“Notify by email, toggle button, pressed”. The “pressed” state is more apt than “checked”, plus we eschew the form data input connotations. When the button is clicked, immediate feedback is offered in the form of “not pressed”.

Styling

The HTML we construct is an important part of the design work we do and the things we create for the web. I’m a strong believer in doing HTML First Prototyping™, making sure there’s a solid foundation for the styled and branded product.

In the case of our toggle button, this foundation includes the semantics and behavior to make the button interoperable with various input (e.g. voice activation software) and output (e.g. screen reader) devices. That’s possible using HTML, but CSS is needed to make the control understandable visually.

Form should follow function, which is simple to achieve in CSS: everything in our HTML that makes our simple toggle button function can also be used to give it form.

  • <button>button element selector
  • aria-pressed="true"[aria-pressed="true"] attribute selector.

In a consistent and, therefore, easy to understand interface, buttons should share a certain look. Buttons should all look like buttons. So, our basic toggle button styles should probably inherit from the button element block:

/* For example... */button { color: white; background-color: #000; border-radius: 0.5rem; padding: 1em 2em;}

There are a number of ways we could visually denote “pressed”. Interpreted literally, we might make the button look pressed in using some inset box-shadow. Let’s employ an attribute selector for this:

[aria-pressed="true"] { box-shadow: inset 0 0 0 0.15rem #000, inset 0.25em 0.25em 0 #fff;}

To complete the pressed/unpressed metaphor, we can use some positioning and box-shadow to make the unpressed button “poke out”. This block should appear above the [aria-prressed="true"] block in the cascade.

[aria-pressed] { position: relative; top: -0.25rem; left: -0.25rem; box-shadow: 0.125em 0.125em 0 #fff, 0.25em 0.25em #000;}
Left button, sticking out, is labeled aria-pressed equals false. Right button, visually depressed, is labelled aria-pressed equals true.

(Note: This styling method is offered just as one idea. You may find that something more explicit, like the use of “on”/“off” labels in an example to follow, is better understood by more users.)

Don’t rely on color alone

“On” is often denoted by a green color, and “off” by red. This is a well-established convention and there’s no harm in incorporating it. However, be careful not to only use color to describe the button’s two states. If you did, some color blind users would not be able to differentiate them.

The aria-pressed false button has a red background color and the aria-pressed true button has a green background color
These versions of the control would fail WCAG 2.0 1.4.1 Use Of Color (Level A)

Focus styles

It’s important buttons, along with all interactive components, have focus styles. Otherwise people navigating by keyboard cannot see which element is in their control and ready to be operated.

The best focus styles do not affect layout (the interface shouldn’t jiggle around distractingly when moving between elements). Typically, one would use outline, but outline only ever draws a box in most browsers. To fit a focus style around the curved corners of our button, a box-shadow is better. Since we are using box-shadow already, we have to be a bit careful: note the two comma-separated box-shadow styles in the pressed-and-also-focused state.

/* Remove the default outline and add the outset shadow */ [aria-pressed]:focus { outline: none; box-shadow: 0 0 0 0.25rem yellow;}/* Make sure both the inset and outset shadow are present */ [aria-pressed="true"]:focus { box-shadow: 0 0 0 0.25rem yellow, inset 0 0 0 0.15rem #000, inset 0.25em 0.25em 0 #fff; }

Changing Labels

The previous toggle button design has a self-contained, unique label and differentiates between its two states using a change in attribution which elicits a style. What if we wanted to create a button that changes its label from “on” to “off” or “play” to “pause”?

It’s perfectly easy to do this in JavaScript, but there are a couple of things we need to be careful about.

  1. If the label changes, what happens with the state?
  2. If the label is just “on” or “off” (“play” or “pause”; “active” or “inactive”) how do we know what the button actually controls?

In the previous toggle button example, the label described what would be on or off. Where the “what” part is not consistent, confusion quickly ensues: once “off”/unpressed has become “on”/pressed, I have to unpress the “on” button to turn the “off” button back on. What?

As a rule of thumb, you should never change pressed state and label together. If the label changes, the button has already changed state in a sense, just not via explicit WAI-ARIA state management.

In the following example, just the label changes.

const button = document.querySelector('button');button.addEventListener('click', (e) => { let text = e.target.textContent === 'Play' ? 'Pause' : 'Play'; e.target.textContent = text;});

The problem with this method is that the label change is not announced as it happens. That is, when you click the play button, feedback equivalent to “pressed” is absent. Instead, you have to unfocus and refocus the button manually to hear that it has changed. Not an issue for sighted users, but less ergonomic for blind screen reader users.

Play/pause buttons usually switch between a play symbol (a triangle on its side) and a pause symbol (two vertical lines). We could do this while keeping a consistent non-visual label and changing state.

<!-- Paused state --> <button type="button" aria-pressed="false" aria-label="play"> &#x25b6;</button><-- Playing state --> <button type="button" aria-pressed="true" aria-label="play"> &#x23f8;</button> 

Because aria-label overrides the unicode symbol text node, the paused button is announced as something similar to, “Play button, not pressed” and the playing button as ,“Play button, pressed”.

This works pretty well, except for where voice recognition and activation is concerned. In voice recognition software, you typically need to identify buttons by vocalizing their labels. And if a user sees a pause symbol, their first inclination is to say “pause”, not “play”. For this reason, switching the label rather than the state is more robust here.

Three implementation examples. The first just changes label from play to pause and is okay. The second keeps the play label and changes state, which is incorrect because the pause button cannot be identified with voice recognition. The third changes label and state so the button becomes a pause button which is pressed, which is incorrect. Only use one of the first two implementations.
Never change label and state at the same time. In this example, that would result in a paused button in the pressed state. Since the video or audio would be playing at this point, the lexical “pause” state cannot be also be considered “pressed” on “on”.

Auxiliary labeling

In some circumstances, we may want to provide on/off switches which actually read “on/off”. The trick with these is making sure there is a clear association between each toggle switch and a respective, auxiliary label.

Imagine the email notification setting is grouped alongside other similar settings in a list. Each list item contains a description of the setting followed by an on/off switch. The on/off switch uses the terms “on” and “off” as part of its design. Some <span> elements are provided for styling.

<h2>Notifications</h2> <ul> <li> Notify by email <button> <span>on</span> <span>off</span> </button> </li> <li> Notify by SMS <button> <span>on</span> <span>off</span> </button> </li> <li> Notify by fax <button> <span>on</span> <span>off</span> </button> </li> <li> Notify by smoke signal <button> <span>on</span> <span>off</span> </button> </li></ul> 
A list of notifications settings with associated buttons reading with either on or off highlighted, depending on the state

The virtue of lists is that, both visually and non-visually, they group items together, showing they are related. Not only does this help comprehension, but lists also provide navigational shortcuts in some screen readers. For example, JAWS provides the L (list) and I (list item) quick keys for moving between and through lists.

Each ‘label’ and button is associated by belonging to a common list item. However, not providing an explicit, unique label is dangerous territory — especially where voice recognition is concerned. Using aria-labelledby, we can associate each button with the list’s text:

<h2>Notifications</h2> <ul> <li> <span>Notify by email</span> <button aria-labelledby="notify-email"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by SMS</span> <button aria-labelledby="notify-sms"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by fax</span> <button aria-labelledby="notify-fax"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by smoke signal</span> <button aria-labelledby="notify-smoke"> <span>on</span> <span>off</span> </button> </li></ul> 

Each aria-labelledby value matches the appropriate span id, forming the association and giving the button its unique label. It works much like a <label> element’s for attribute identifying a field’s id.

The switch role

Importantly, the ARIA label overrides each button’s textual content, meaning we can once again employ aria-pressed to communicate state. However, since these buttons are explicitly “on/off” switches, we can instead use the WAI-ARIA switch role, which communicates state via aria-checked.

<h2>Notifications</h2> <ul> <li> <span>Notify by email</span> <button role="switch" aria-checked="true" aria-labelledby="notify-email"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by SMS</span> <button role="switch" aria-checked="true" aria-labelledby="notify-sms"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by fax</span> <button role="switch" aria-checked="false" aria-labelledby="notify-fax"> <span>on</span> <span>off</span> </button> </li> <li> <span>Notify by smoke signal</span> <button role="switch" aria-checked="false" aria-labelledby="notify-smoke"> <span>on</span> <span>off</span> </button> </li></ul> 

How you would style the active state is quite up to you, but I’d personally save on writing class attributes to the <span>s with JavaScript. Instead, I’d write some CSS using pseudo classes to target the relevant span dependent on the state.

[role="switch"][aria-checked="true"] :first-child, [role="switch"][aria-checked="false"] :last-child { background: #000; color: #fff;}

Traversing the settings

Now let’s talk about navigating through this settings section using two different strategies: by Tab key (jumping between focusable elements only) and browsing by screen reader (moving through each element).

Even when navigating by Tab key, it’s not only the identity and state of the interactive elements you are focusing that will be announced in screen readers. For example, when you focus the first <button>, you’ll hear that it is a switch with the label “Notify by email”, in its on state. “Switch” is the role and aria-checked="true" is vocalized as “on” where this role is present.

Switch role support

The switch role is not quite as well supported as aria-pressed. For example, it is not recognized by the ChromeVox screen reader extension for Chrome.

However, ChromeVox does support aria-checked. This means that, instead of “Switch, Notify by email, on” being announced, “Button, Notify by email, checked” is instead. This isn’t as evocative, but it is adequate. More than likely, it will simply be mistaken for a checkbox input.

Curiously, NVDA regards a button with role="switch" and aria-checked="true" as a toggle button in its pressed state. Since on/off and pressed/unpressed are equivalent, this is acceptable (though slightly disappointing).

But in most screen readers you’ll also be told you’ve entered a list of four items and that you’re on the first item — useful contextual information that works a bit like the group labelling I covered earlier in this post.

Importantly, because we have used aria-labelledby to associate the adjacent text to the button as its label, that is also available when navigating in this mode.

When browsing from item to item (for example, by pressing the down key when the NVDA screen reader is running), everything you encounter is announced, including the heading (“Notifications, heading level two”). Of course, browsing in this fashion, “Notify by email” is announced on its own as well as in association with the adjacent button. This is somewhat repetitive, but makes sense: “Here’s the setting name, and here’s the on/off switch for the setting of this name.”

How explicitly you need to associate controls to the things they control is a finer point of UX design and worth considering. In this case we’ve preserved our classic on/off switches for sighted users, without confusing or misleading either blind or sighted screen reader users no matter which keyboard interaction mode they are using. It’s pretty robust.

Conclusion

How you design and implement your toggle buttons is quite up to you, but I hope you’ll remember this post when it comes to adding this particular component to your pattern library. There’s no reason why toggle buttons — or any interface component for that matter — should marginalize the number of people they often do.

You can take the basics explored here and add all sorts of design nuances, including animation. It’s just important to lay a solid foundation first.

Checklist

  • Use form elements such as checkboxes for on/off toggles if you are certain the user won’t believe they are for submitting data.
  • Use <button> elements, not links, with aria-pressed or aria-checked.
  • Don’t change label and state together.
  • When using visual “on” and “off” text labels (or similar) you can override these with a unique label via aria-labelledby.
  • Be careful to make sure the contrast level between the button’s text and background color meets WCAG 2.0 requirements.
Smashing Editorial(ms, vf, il)

Uploading Directories At Once With webkitdirectory

If you’ve ever tried to implement a bulletproof, good-looking file uploader, you might have encountered an issue: uploading an entire folder or folders of files is usually quite a hassle, as files in each folder have to be selected manually. And then some folders might contain sub-folders as well.

Well, we can use webkitdirectory, a non-standard attribute that allows users to pick a directory via a file input. Currently supported in Chrome, Firefox and Edge.

input webkitdirectory
We can upload file directories, including sub-folders, at once. A demo by Šime Vidas.

For example, users could just pick a directory, and all files in that directory and its sub-folders would be listed below, represented by their relative path — a demo by Šime Vidas shows how it works. One click to choose them all is enough.

It’s important to note that the attribute is non-standard, so it will not work for everybody. However, it doesn’t break anything as browsers that don’t support it will just ignore it, so you can easily progressively enhance your file upload without relying on the feature being supported everywhere. Being useful in various scenarios, hopefully the attribute will be picked up by and standardized soon, landing in browsers as a directory attribute.

Ah, and if you want to design a slightly better drag’n’drop-experience, Alex Reardon has a few tips on rethinking drag’n’drop altogether. Worth reading!

Further Resources:

We send out this and other useful tips and tricks for designers and developers in our Smashing Email Newsletter — once every two weeks. (Once subscribed, you get a free eBook, too.)

How New Font Technologies Will Improve The Web

Words are the primary component of content for the web. However, until a short while ago, all we had at our disposal were but a few system fonts. Adding to that, those system typefaces weren’t necessarily coherent from operating system to operating system (OS). Fortunately, Windows, macOS and Linux made up font-wise, and since then, all modern fonts have been compatible across those OS’. There’s no question, the future of web typography looks promising.

And it’s looking more and more promising, too. At the 2016 ATypI conference, the world’s biggest type design conference, Microsoft, Google, Apple and Adobe announced that they have been working on a new iteration of the OpenType standard, called variable fonts. Because it gives a lot more control to the user to modify the typeface depending on the context and device, this new version opens new opportunities for web typography and will close the gap in quality between web and print.

Variable fonts and parametric fonts are tools that will undeniably revolutionize responsive web type. They will allow graphic and web designers to explore shapes and sizes on their own and to tailor typefaces to their needs. Let’s learn the ins and outs of these new tools and how to take control of our typography.

Creating Scalable, Fluid Typography

Fluid layouts have been a normal part of front-end development for years. The idea of fluid typography, however, is relatively new and has yet to be fully explored. Read a related article →

Web Is Not Print With Pixels

When a paradigm shift comes forth, such as a new medium for typography, the first thing it encounters is resistance. We feel like we need to push the status quo to its limit before it can break free and make room for a new way of thinking. Typography is no exception, and for a long time designers have considered screen as paper made of pixels instead of trees. Typefaces used on computers were, and still are for the most part, just a static embodiment of physical fonts. Sure, the screen medium brought with it a number of necessary and extra elements, such as hinting, but the legacy of physical fonts still resonate strongly in type design.

Still, it feels like digital typography is behind physical typography on a range of issues, not so much in the diversity or quality of design, but in the huge fragmentation of screen media. For print design, a cast of physical fonts could be optimized depending on the sizes and shapes of the letters to increase readability. Once the fonts were produced, the result was the same every time; you got exactly what you paid for.

On a screen, it’s a lot more complicated. Once you’re lost in a forest of DPI values and different renderers, what the user gets is all up in the air. And because type designers have little incentive to produce different optical sizes, a lot of digital typefaces include only a couple of them, which hinders the readability of web typography.

specimen of the Trianon typeface
Different optical sizes of the Trianon family from Production Type (Image: Production Type) (View large version)

When a graphic designer works on a poster, they already know how it will be displayed or distributed. They know the size of the poster, the size of the font, the colors they will use, etc. All of these are known variables that will contribute to their design choices. Also, the designer knows that, once it’s done and printed, the design will not change, and all viewers will experience the same poster.

example of good text rag and bad text rag
Atta rag! Oh, you’re such a good rag. (View large version)

Let’s look at another aspect that is difficult to fix in web typography: rags. Rags are easy to deal with in print: You can adjust the tracking a bit, insert line breaks or hyphenate to clean up the rags. Unfortunately, achieving this degree of detail in web typography is more complicated. The width changes, and the font size can be changed by the user. The dynamism of web pages makes it difficult to make the right choice of size, letter-spacing, etc.

Fortunately, it is possible to gather some data about the context in which your website will be browsed. Thanks to CSS and JavaScript, you can adapt the typography of a web page. However, as easy as it is to change the size of a typeface gradually, it is still impossible to easily change from one variant to another progressively. The only option left is to set up breakpoints, with one variant on one side and another on the other side.

Loading more variants has a price. Adding 150 KB of fonts might not seem like a bad trade-off, but it compounds every time you add a new font to the website. Because loading time is a major factor in the bounce rate of a page, you wouldn’t want users to bail just because your web page has too much to load.

Responsive Web Type Technologies

Having described the challenges of web typography, let’s dive into the heart of the matter. We’ll go deep into the two main technologies that help us make great typography for the web: variable fonts and parametric fonts.

Variable Fonts

With the ATypI 2016 conference on variable fonts, variable fonts have made a big entrance on the web. They’re pushed by the biggest names in web browsing (Google, Adobe, Apple and Microsoft), and they are here to stay.

If you want to see what people do with and say about variable fonts, we’ve gathered resources from around the web. You’ll have to use a browser that supports variable fonts, either Chrome from version 59.0 or Firefox from version 53.0:

The best source of news on variable fonts is, without question, the Twitter feed led by Nick Sherman, who collects everything on the web about variable fonts (and for which we should be grateful).

Thanks to the new variable fonts format, it will be possible to precisely adapt typography to its context. Variable fonts are based on a pretty simple idea: They contain several variants of a single typeface or, more precisely, a master variant and deltas from other ones, and the user is free to choose an interpolation of these different versions using only CSS. For example, the typeface could contain a light variant and a bold variant, and you would be able to choose a weight between these light and bold weights using CSS, like so:

 h2 { font-variation-settings: "wght" 200;}
two capital A of the same variable font
Simple interpolations (also known as multiple masters) (View large version)

Variable fonts are picky. For them to work, all masters of the font’s base variants must have exactly the same number of points. Morphing between two shapes will be smooth and unique only if the shape you start from and the shape you end up with are similar. Nevertheless, some type creators are used to designing for masters for variable fonts. A similar concept was used for Adobe’s “multiple master” format, and type designers use interpolation to create extended families with tools such as Superpolator. Yet font-variation-settings is still not prevalent in web browsers, and as of the time of writing, only Firefox has implemented the feature. But others should soon follow suit.

There are still a lot of hurdles to jump before variable fonts become an integral part of responsive web typography. Making them is a long endeavor, and type designers now have to think about variations from the get go in order to create typefaces that take full advantage of these new features. Even though converting old typefaces to variable fonts is possible, the old ways are not necessarily suited to the new and more relevant uses that we’ve discussed:

  • generating grades on the spot for screens with different DPI.
  • changing the width of a typeface depending on the way the user wants to fill lines,
  • modifying the optical size depending on the font’s size.

Unfortunately, variable fonts don’t solve every problem with responsive web typography. For example, how do we reduce the number of media queries? How do we handle outliers? How do we make the typeface a part of the web page?

Parametric fonts are intended to fix these issues. They differ from variable fonts in concept and production. They put customization logic at the heart of the font, instead of letting a software do the transformation. All typographic rules are inherently a part of the font, but the font is still easily customizable on the user’s side.

Parametric Fonts

Parametric fonts are an old idea that seems to be revisited regularly by people from different backgrounds. It looks to solve the same issues that variable fonts solve but coming from a more automated way of thinking. So, it has usually been a subject tackled by computer scientists who take an interest in type design.

As with variable fonts, we’ve gathered links from around the web that deal with parametric fonts and their history:

  • Metafont,” Wikipedia

    The father of all modern parametric typeface frameworks
  • Metaflop

    A Metafont graphics interface
  • Metapolator

    A parametric typeface creation tool based on Metaflop
  • Parametric TrueType Fonts,” TrueType Typography

    Information about the now discontinued FontChameleon, which is font software that let you merge fonts from a wide library
  • Elementar, Typotheque

    A bitmap parametric font

It’s been almost 40 years since Donald Knuth pioneered the concept of parametric fonts. By creating Metafont and Tex, Knuth opened up a new era of typography, in which typefaces were created using a series of steps and equations to describe each character.

That’s the big difference between variable fonts and parametric fonts. Variable fonts are interpolated, meaning that they are confined in a design space. The designer is not able to escape this space; moreover, adding dimensions to it requires the type designer to create a new master (i.e. a completely new font). Parametric fonts are extrapolated, meaning that they emerge from a single definition. The space in which they live is not limited because they behave like a mathematical object.

capital A designed with Metafont
An “A” created with Metafont (Image: MAlumni) (View large version)

Take the simple example of a circle. In a variable font world, the type designer would produce two circles and tell you, “Choose either of these circles.” In a parametric font world, the type designer would tell you, “Give the font a radius, and it will produce a circle of that radius.”

difference of design space between variable fonts and parametric fonts
Available design space of variable fonts and parametric fonts (View large version)

Adding a new dimension to your design space is easy with parametric fonts. For variable fonts, it would mean creating a new master. For a parametric font, you just have to bake the new dimension into the existing equations.

It is also easy to add constraints or to alter the rate of change of some points using parametric fonts. As well, you can add logic directly into the font.

animation of a lowercase g designed with prototypo
The “g”s ear will always stay on the curve.

How To Start Working With Parametric Fonts?

Parametric fonts are pretty easy to use, and the result can look gorgeous. As we’ll see in the examples, parametric fonts can mitigate optical differences between different colors of text. You can also create text that responds to its context or to any interface you can imagine.

the writer playing with a kinect hooked up to a parametric font
Feeding a Kinect’s data into a font

To make life easier for you, we’ve created Prototypo, a free web application for tweaking and adjusting parametric fonts. You’ll need a subscription to take full advantage of parametric fonts. But in the free version, you’ll be able to use subsetted fonts that contain lowercase and uppercase glyphs (no diacritics or figures). The paid subscription unlocks the full fonts.

animation of prototypo's ui with moving text spelling smashing magazine
Prototypo, a parametric font web app

Here’s how to start experimenting with parametric fonts:

  • Use our web preview extension to test your parametric font directly on your website.
  • Embed a parametric font on your website using our JavaScript library.

Prototypo Chrome Extension

The extension can be used to try out parameters for different display sizes and layouts. The extension lets you replace the typefaces on your website. All of the modifications you do in Prototypo are applied to your website in real time. This is the perfect tool to try out different optical weights and widths for your fonts in their final context.

a demonstration of prototypo web extension
The Prototypo web extension lets you visualize your customized font in real time.

Prototypo Parametric Typeface Library

The other option is to use Prototypo parametric technology directly. We’ll explain how you can add the Prototypo library to your website. You’ll be able to create parametric fonts on your website and make them interact as your users need. You can see examples of the parametric technology in our lab. For example, you can use a Kinect to generate fonts, or morph and switch letters based on the current timestamp. We’ll discuss how it works and how you can use it in your projects, including how to:

  • set up the project,
  • create a font on the fly,
  • use the created font in CSS,
  • modify the font with JavaScript.

Set Up the Project

This is the tag you will have to add to your HTML to import the Prototypo library.

<script type="application/javascript" src="https://library.prototypo.io/ptypo.js"></script>

You can also import this script asynchronously, but you’ll have to wait for its load event to use the library:

<script async type="application/javascript" src="https://library.prototypo.io/ptypo.js"></script><script type="application/javascript"> document.getElementById('script').addEventListener('load', function() { // You’ll have access to the Ptypo global variable here });</script>

So, what can this library do for you, you ask? Well, it will create a Ptypo global variable that we will use to create our parametric font.

Let’s look at an example to better understand how we can use the library.

Making a Light-Font Mode and a Dark-Font Mode

See the Pen bRKbxY by Francois Poizat (@FranzPoize) on CodePen.

For the first example, we will try to create a font whose weight looks the same whether written in dark on light or light on dark. Text tends to look bolder when written light on dark because light colors tend to bleed on dark colors, making the lighter font seem heavier.

We’ll make a simple HTML document that can be switched from light mode to dark mode, and we will change the parameters of the font accordingly. You could also have several color schemes and produce parameters that would look the same for each color scheme.

Let’s start by creating our font factory.

const ptypoFactory = new Ptypo.default();

Here, you can use your token if you subscribe to the Prototypo application. (You can find more information about that in our documentation.)

Once we have our font factory, it’s time to start creating fonts. For the dynamic part of this example, we’ll create two fonts — named titleFont and paragraphFont for the h1 heading and the paragraph, respectively.

ptypoFactory.createFont( 'titleFont', Ptypo.templateNames.ELZEVIR).then(function(font) { //Setting up the right parameters font.changeParam('thickness', 110);});ptypoFactory.createFont( 'paragraphFont', Ptypo.templateNames.GROTESK).then(function(font) { font.changeParams({thickness: 70, spacing: 0.5});});

The title font uses the Elzevir template, which is a serif template, and the paragraph font uses the Grotesk template, which is a sans-serif. We can set the parameters as we please (you can change the value if you want).

As you can see, we can modify the parameters in two ways:

font.changeParam('nameOfParameter', parameterValue)font.changeParams({ parameter1: parameter1Value, parameter2: parameter2Value, parameter3: parameter3Value …});

You can learn more about the different parameters available in our API documentation.

Now we need to write the HTML that goes with it and the CSS that will assign the correct font to the correct element.

<div> <h1> With Param </h1> <p> Lorem ipsum dolor sit amet.. </p></div>
h1 { font-size: 100px; font-family: 'titleFont'; font-weight: normal;}p { font-size: 18px; line-height: 24px; font-family: 'paragraphFont';}

Here, we’ve created a heading and a paragraph of text and attached the correct font to them: titleFont for the heading and paragraphFont for the paragraph.

We now need to create a button to switch between light and dark mode and create the functions that will modify the fonts.

<a href=”#”> Dark mode</a>

There are many ways to modify our fonts. What we will do is create an array that we will fill with an object literal containing our functions once the fonts are created.

const fontToggles = [];ptypoFactory.createFont( 'titleFont', Ptypo.templateNames.ELZEVIR).then(function(font) { //Setting up the right parameters font.changeParam('thickness', 110); //Storing the function that will be used to change from light to dark //and vice versa fontToggles.push({ lightMode: function() { font.changeParam('thickness', 110); }, darkMode: function() { font.changeParam('thickness', 107); }, });});ptypoFactory.createFont( 'paragraphFont', Ptypo.templateNames.GROTESK).then(function(font) { font.changeParams({thickness: 70, spacing: 0.5}); fontToggles.push({ lightMode: function() { font.changeParam('thickness', 70); }, darkMode: function() { font.changeParam('thickness', 50); }, });});

In this part, we start by creating a font using the ptypoFactory.createFont method.

Ptypo.templateNames.ELZEVIR).then(function(font) { ...});

Once the font is created, we put in default parameters for the thickness. We’ve decided to put a thickness of 110 for the heading font and a thickness of 70 and a spacing of 0.5 for the paragraph font.

font.changeParams({thickness: 70, spacing: 0.5});

For each font, we will add an object to the fontToggles array. This object will contain a lightMode and a darkMode property. These two functions are to be executed when the page enters light mode and dark mode, respectively, using our button.

fontToggles.push({ lightMode: function() { font.changeParam('thickness', 70); }, darkMode: function() { font.changeParam('thickness', 50); },});

Now we can add our listener on the click event of the button and use the functions contained in the array to modify our font according the mode we are in.

let button = document.getElementById('dark-button');button.addEventListener('click', function(e) { document.body.classList.toggle('dark'); fontToggles.forEach(function(toggle) { toggle[document.body.classList.contains('dark') ? 'darkMode' : 'lightMode'](); }); e.preventDefault();});

Thanks to this code, once we click on our dark-mode button, it will add the dark class to the body. It will loop through our font, modifying functions and executing the darkMode one if there a dark class on body and executing lightMode if there is no dark class on body.

In our example, we’ve included a font that does not change in dark mode, to show what the difference will be between the regular font and the slightly modified one.

Customize Fonts With Data

In this example, we’re going to create several fonts, one for each city’s weather that we want to display, customized using the temperature and wind speed of the given city. The thickness of the font will be tied to the temperature, and the slant will be tied to the wind speed.

See the Pen ayYevr by Francois Poizat (@FranzPoize) on CodePen.

First, we’ll create a list of the cities we want to display.

const cities = [ 'Lyon', 'Padova', 'Rennes', 'Tokyo', 'Johannesburg', 'Moscow', 'Beijing', 'San Francisco', 'Marrakech', 'Trondheim',];

We’ve chosen cities from around the world, to have a nice range of temperatures and wind speeds.

function yahooApiQuery(city, callback) { if (!city || !callback) { throw new Error('$.YQL(): Parameters may not be undefined'); } const encodedQuery = encodeURIComponent( `select * from weather.forecast where woeid in (select woeid from geo.places(1) where text='${city}')`.toLowerCase() ); const url = `https://query.yahooapis.com/v1/public/yql?q=${encodedQuery}&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=?`; $.getJSON(url, callback);};

This function requests the Yahoo weather API (which comes with documentation). We’ll use jQuery’s getJson function to get the JSON from the API.

function getValueAndChangeFont(city, font) { yahooApiQuery( city, function(data) { font.changeParams({ thickness: parseInt(data.query.results.channel.item.condition.temp) * 2, slant: parseInt(data.query.results.channel.wind.speed), }); } );}

We’ve created a function that takes the name of a city and the font. Then, we’ve requested the weather for this city and changed the parameters of the font according to the temperature and wind speed.

font.changeParams({ thickness: parseInt(data.query.results.channel.item.condition.temp) * 2, slant: parseInt(data.query.results.channel.wind.speed),});
a demonstration of prototypo web extension
The Prototypo web extension lets you visualize your customized font in real time.

Prototypo Parametric Typeface Library

The other option is to use Prototypo parametric technology directly. We’ll explain how you can add the Prototypo library to your website. You’ll be able to create parametric fonts on your website and make them interact as your users need. You can see examples of the parametric technology in our lab. For example, you can use a Kinect to generate fonts, or morph and switch letters based on the current timestamp. We’ll discuss how it works and how you can use it in your projects, including how to:

  • set up the project,
  • create a font on the fly,
  • use the created font in CSS,
  • modify the font with JavaScript.

Set Up the Project

This is the tag you will have to add to your HTML to import the Prototypo library.

<script type="application/javascript" src="https://library.prototypo.io/ptypo.js"></script>

You can also import this script asynchronously, but you’ll have to wait for its load event to use the library:

<script async type="application/javascript" src="https://library.prototypo.io/ptypo.js"></script><script type="application/javascript"> document.getElementById('script').addEventListener('load', function() { // You’ll have access to the Ptypo global variable here });</script>

So, what can this library do for you, you ask? Well, it will create a Ptypo global variable that we will use to create our parametric font.

Let’s look at an example to better understand how we can use the library.

Making a Light-Font Mode and a Dark-Font Mode

See the Pen bRKbxY by Francois Poizat (@FranzPoize) on CodePen.

For the first example, we will try to create a font whose weight looks the same whether written in dark on light or light on dark. Text tends to look bolder when written light on dark because light colors tend to bleed on dark colors, making the lighter font seem heavier.

We’ll make a simple HTML document that can be switched from light mode to dark mode, and we will change the parameters of the font accordingly. You could also have several color schemes and produce parameters that would look the same for each color scheme.

Let’s start by creating our font factory.

const ptypoFactory = new Ptypo.default();

Here, you can use your token if you subscribe to the Prototypo application. (You can find more information about that in our documentation.)

Once we have our font factory, it’s time to start creating fonts. For the dynamic part of this example, we’ll create two fonts — named titleFont and paragraphFont for the h1 heading and the paragraph, respectively.

ptypoFactory.createFont( 'titleFont', Ptypo.templateNames.ELZEVIR).then(function(font) { //Setting up the right parameters font.changeParam('thickness', 110);});ptypoFactory.createFont( 'paragraphFont', Ptypo.templateNames.GROTESK).then(function(font) { font.changeParams({thickness: 70, spacing: 0.5});});

The title font uses the Elzevir template, which is a serif template, and the paragraph font uses the Grotesk template, which is a sans-serif. We can set the parameters as we please (you can change the value if you want).

As you can see, we can modify the parameters in two ways:

font.changeParam('nameOfParameter', parameterValue)font.changeParams({ parameter1: parameter1Value, parameter2: parameter2Value, parameter3: parameter3Value …});

You can learn more about the different parameters available in our API documentation.

Now we need to write the HTML that goes with it and the CSS that will assign the correct font to the correct element.

<div> <h1> With Param </h1> <p> Lorem ipsum dolor sit amet.. </p></div>
h1 { font-size: 100px; font-family: 'titleFont'; font-weight: normal;}p { font-size: 18px; line-height: 24px; font-family: 'paragraphFont';}

Here, we’ve created a heading and a paragraph of text and attached the correct font to them: titleFont for the heading and paragraphFont for the paragraph.

We now need to create a button to switch between light and dark mode and create the functions that will modify the fonts.

<a href=”#”> Dark mode</a>

There are many ways to modify our fonts. What we will do is create an array that we will fill with an object literal containing our functions once the fonts are created.

const fontToggles = [];ptypoFactory.createFont( 'titleFont', Ptypo.templateNames.ELZEVIR).then(function(font) { //Setting up the right parameters font.changeParam('thickness', 110); //Storing the function that will be used to change from light to dark //and vice versa fontToggles.push({ lightMode: function() { font.changeParam('thickness', 110); }, darkMode: function() { font.changeParam('thickness', 107); }, });});ptypoFactory.createFont( 'paragraphFont', Ptypo.templateNames.GROTESK).then(function(font) { font.changeParams({thickness: 70, spacing: 0.5}); fontToggles.push({ lightMode: function() { font.changeParam('thickness', 70); }, darkMode: function() { font.changeParam('thickness', 50); }, });});

In this part, we start by creating a font using the ptypoFactory.createFont method.

Ptypo.templateNames.ELZEVIR).then(function(font) { ...});

Once the font is created, we put in default parameters for the thickness. We’ve decided to put a thickness of 110 for the heading font and a thickness of 70 and a spacing of 0.5 for the paragraph font.

font.changeParams({thickness: 70, spacing: 0.5});

For each font, we will add an object to the fontToggles array. This object will contain a lightMode and a darkMode property. These two functions are to be executed when the page enters light mode and dark mode, respectively, using our button.

fontToggles.push({ lightMode: function() { font.changeParam('thickness', 70); }, darkMode: function() { font.changeParam('thickness', 50); },});

Now we can add our listener on the click event of the button and use the functions contained in the array to modify our font according the mode we are in.

let button = document.getElementById('dark-button');button.addEventListener('click', function(e) { document.body.classList.toggle('dark'); fontToggles.forEach(function(toggle) { toggle[document.body.classList.contains('dark') ? 'darkMode' : 'lightMode'](); }); e.preventDefault();});

Thanks to this code, once we click on our dark-mode button, it will add the dark class to the body. It will loop through our font, modifying functions and executing the darkMode one if there a dark class on body and executing lightMode if there is no dark class on body.

In our example, we’ve included a font that does not change in dark mode, to show what the difference will be between the regular font and the slightly modified one.

Customize Fonts With Data

In this example, we’re going to create several fonts, one for each city’s weather that we want to display, customized using the temperature and wind speed of the given city. The thickness of the font will be tied to the temperature, and the slant will be tied to the wind speed.

See the Pen ayYevr by Francois Poizat (@FranzPoize) on CodePen.

First, we’ll create a list of the cities we want to display.

const cities = [ 'Lyon', 'Padova', 'Rennes', 'Tokyo', 'Johannesburg', 'Moscow', 'Beijing', 'San Francisco', 'Marrakech', 'Trondheim',];

We’ve chosen cities from around the world, to have a nice range of temperatures and wind speeds.

function yahooApiQuery(city, callback) { if (!city || !callback) { throw new Error('$.YQL(): Parameters may not be undefined'); } const encodedQuery = encodeURIComponent( `select * from weather.forecast where woeid in (select woeid from geo.places(1) where text='${city}')`.toLowerCase() ); const url = `https://query.yahooapis.com/v1/public/yql?q=${encodedQuery}&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=?`; $.getJSON(url, callback);};

This function requests the Yahoo weather API (which comes with documentation). We’ll use jQuery’s getJson function to get the JSON from the API.

function getValueAndChangeFont(city, font) { yahooApiQuery( city, function(data) { font.changeParams({ thickness: parseInt(data.query.results.channel.item.condition.temp) * 2, slant: parseInt(data.query.results.channel.wind.speed), }); } );}

We’ve created a function that takes the name of a city and the font. Then, we’ve requested the weather for this city and changed the parameters of the font according to the temperature and wind speed.

font.changeParams({ thickness: parseInt(data.query.results.channel.item.condition.temp) * 2, slant: parseInt(data.query.results.channel.wind.speed),});

We’ve multiplied the temperature by two because most temperatures in Fahrenheit are between 0 and 100 degrees, and we want the thickness to be between 0 and 200, so that the contrast is stronger. We’ve left the speed of the wind untouched because it can probably take values from 0 to 40, which would be great as an angle for the slant.

const ptypoFactory = new Ptypo.default();cities.forEach(function(city) { $('#city-names').append( `${city} ` ); ptypoFactory.createFont( `${city}WeatherFont`, Ptypo.templateNames.GROTESK).then( function(font) { getValueAndChangeFont(city, font); } );});

For each city, we create a span element that is styled with the right font family. We then create this font using Prototypo’s library. We go through the same process explained in the first example. Let’s create the factory:

const ptypoFactory = new Ptypo.default();

Then, for each city, we create the city’s font with the correct name, ${city}WeatherFont, using our getValueAndChangeFont function to customize the font.

This simple example shows how Prototypo can be very helpful for designing a new kind of data visualization: creating typefaces that are able to express more than the text, directly linked to data. Feel free to test this Codepen with your own city, to try others parameters (x-height, width, etc.) and to show us what you’ve achieved!

This concludes our examples. If you want to see more experiments we’ve created with the library, head over to our lab.

Conclusion

Parametric font technology will help us improve the user experience by enabling us to optimize how fonts are displayed on all sorts of devices. It also enables us to be more creative with fonts using context, outside variables and physical sensors to modify the input parameters. You just need to find ideas to tailor your typefaces to the experiences you want to provide:

  • Create data visualizations that combine text and content. Imagine that your client has a big website about sports. You will be able to produce a design in which the shapes and proportions of fonts used for players’ names could be linked to the number of touchdowns they’ve scored, the number of games they’ve played, etc.
  • Improve the user’s browsing experience with responsive fonts and even adaptive fonts. Because we can already set our text-size preferences, we can imagine a future when users have their own profile to fit their reading habits, especially those who have visual impairments.
  • Design storefronts that respond to passers by. Design theater plays whose words are shaped directly by the voices of the actors. Design screens that are capable of rendering letters according to the distance of the reader. Parametric fonts are made to interact with people.

Parametric font technology is both complex and powerful, and like every design tool, it goes awry when it’s used without constraint or perspective. But once you get the logic behind it, you will never go back to a simple breakpoint design.

The question now is, What would you do if you could morph typefaces to your every whim?

Smashing Editorial(md, il, al)

Monthly Web Development Update 09/2017: Functional CSS, Android 8 And iOS 11

Editor’s Note: Welcome to this month’s web development update. It’s actually the first one that we publish, and from now on, Anselm will summarize the most important things that happened over the past month in one handy list for you. So that you’re always up to date with what’s going on in the web community. Enjoy!

Today, I’d like to begin this update with a question I’m asking myself quite often, and that was fueled by the things I read lately: Where do we see our responsibility, where do we see other people’s responsibilities? And how do companies fit in here?

With governments needing to make rules for how autonomous cars should behave in case of an incident, we can see how technological progress takes these questions to an entirely new dimension. Or take the Diesel gate affair that has been in the news all over the world these weeks. With software developers facing charges for their work, it showed us how important it is for employees to make their own decisions and to stand up for what’s right instead of blindly doing everything their bosses demand. Of course, this requires us to find our own position, our own path, and to stay true to it. An important thing we should reflect on more often if we want to make a change — not only in our work, but also in our community, and our lives.

News

  • Google Chrome 61 brings ECMAScript Modules, navigator.share, the WebUSB API, 8-digit alpha transparency hex-color codes, the CSS scroll-behavior property, and the Visual Viewport API to the browser.
  • Android 8, named “Oreo”, is now available and comes with picture-in-picture support, a system-wide autofill feature, and much more. But, unfortunately, it seems that the new version also brings along quite some issues for us web developers, especially problems with Progressive Web Apps, as Maximiliano Firtman points out.
  • The latest update of Adobe XD ships with some new features. There’s a new “reuse styles and assets” feature, and character styles created in Photoshop, Illustrator or other Creative Cloud applications can be reused in XD, too. The new version also comes with common UI resources for iOS, Google Material, and Windows.
  • Federico Viticci discovered that Apple removed Google AMP versions of a link in iOS 11 and redirects users to the original source URL instead if they are using iMessage or Apple’s Reading List feature. A very interesting step that could be a reaction to users having trouble with AMP URLs or maybe Apple wants to avoid using a third-party proxy that could disappear any time or even change the content of the original URLs.
  • At this year’s developer event, Microsoft announced what’s coming in Edge 16: Updated CSS Grid Layout, object-fit and object-position, support for the Payment Request API, Service Workers, and WebVR.
Adobe XD UI resources
The new Adobe XD update makes designing for iOS, Windows, and Material Design even easier thanks to platform-specific UI components. (Image source)

UI/UX

Feather Icons
Simple and minimalistic — that’s the open-source Feather Icon Set. (Image source)

Tooling

JavaScript

CSS

Understanding the WebView Viewport in iOS 11
How should we deal with fixed position header bars in combination with the new viewport that the iPhone X introduced? Darryl Pogue sheds some light into the dark. (Image source)

Web Performance

Accessibility

Security

  • Some researchers found a way to control voice assistants from Apple, Google, Amazon, Microsoft, Samsung, and Huawei. And this does not only affect the smart home boxes but also every iPhone, MacBook, Windows 10 PC, or Samsung Galaxy phone. By using ultrasonic frequencies, they could control the devices and call people, open websites, and even re-route a navigation system of an Audi Q3 car.
  • Stéphane Bortzmeyer shares the observations made during a technical attack against the WikiLeaks platform last week. This is a good example of how DNS attacks work.
  • Benjamin Caudill introduces CFire, a script to evade Cloudflare’s “Cloud Security Protections”. The article also shares some very interesting details of how Cloudflare’s security system works.

Privacy

Invisible Manipulation.
Invisible Manipulation. Privacy International shares ten examples of how our data is being used against us without us knowing. (Image source)

Work & Life

We hope you’ve enjoyed this first monthly Web Development Update. The next one is scheduled for October 13th. Stay tuned!

We’re Touring Through Southeast Asia: Join The Mozilla Developer Roadshow!

We love exploring opportunities. While many of us are quite familiar with publications and events surrounding us, we often lack the global perspective on what’s happening in the web industry across the world. For example, do you know what the state of web design in Singapore is? What about front-end events in Kuala Lumpur? What about the acceptance of UX-driven processes in Hong Kong? That’s exactly what we want to find out!

For that reason, we’re happy to have teamed up with our friends at Mozilla for the Developer Roadshow Asia, so we can connect and learn from designers and developers in southeastern Asia. Together, we’re planning on organizing a series of informal, free meetup-style events for people who build for the web. On September 19th to 25th, folks from around the globe will be getting together in Singapore, Ho Chi Minh City, Kuala Lumpur, Penang and Hong Kong. Do join us, won’t you?

Mozilla Developer Roadshow Asia
The Mozilla Developer Roadshow Asia is coming to a city near you! Check the dates →

So, What’s The Roadshow About?

Five days, four countries, five cities: the Mozilla Developer Roadshow Asia aims to connect local communities and build lasting relationships. With our meet-ups, we’ll explore how agencies and companies in Southeast Asia work, and what their processes are like: from graphic design tools to build tools, frameworks and libraries.

We’ll also dive deep into bleeding edge web technology, such as VR, CSS Grid, Web Assembly and Service Workers. These are only a few of the topics that will be tackled on this journey, and there’ll be plenty of room to address key items that affect the browsers we use every day, too, of course! After the trip, we’ll sum up our findings in detailed articles right here, on yours truly Smashing Magazine.

Schedule

If you happen to be in southeastern Asia this month, please join in as we’d love to meet you! Please check the schedule below to find out when the roadshow is coming to a city near you.

Date Location Time
Sept. 19, 2017 Singapore @ PayPal 6:00 PM – 9:00 PM (SST)
Sept. 21, 2017 Ho Chi Minh City, Vietnam @ Dreamplex 6:00 PM – 9:00 PM (ICT)
Sept. 23, 2017 Kuala Lumpur, Malaysia @ MaGIC 10:00 AM – 5:00 PM (MYT)
Sept. 25, 2017 Penang, Malaysia @ CAT 10:00 AM – 5:00 PM (MYT)
Sept. 27, 2017 Hong Kong @ Credit Suisse 7:00 PM – 10:00 PM (HKT)

In case you can’t make it, we’ll be posting updates every now and then on Twitter @smashingmag and our dear friend Sandra Persing will make sure you don’t miss out on what’s happening, too. Make sure to mark your calendars! 😉

Get In Touch!

For those in the know-how and those in the loop, please share your experiences with us! We look forward to learning and exploring what’s happening in Southeast Asia, so feel free to get in touch with us via email anytime: roadshow@smashingmagazine.com — we’d love to learn from you!

If you won’t be able to join us this time, who knows, perhaps we’ll come to your part of the world as well. Stay tuned!


_Thanks to Cosima Mielke for helping to prepare this article._

Why I Switched To Sketch For UI Design (And Never Looked Back)

Why I Switched To Sketch For UI Design (And Never Looked Back)

User interface design has changed dramatically in the last few years, as traditional computers have ceded dominance to smaller screens, including tablets, mobile phones, smartwatches and more.

As the craft has evolved, so has its toolset; and from one app to rule them all — looking at you, Photoshop! — we have gotten to a point where it seems like a new contender among UI design tools crops up every month. And I have to admit that many of the new UI design tools look pretty good and promising.

The one app that seems to tower over everything else at the moment, though, is Sketch1. It has grown in popularity like I’ve rarely seen an app do in the recent past, and for a good reason: The developers of Sketch have figured out exactly what interface designers have been looking for and have steadily added functionality to address those needs. The pace of development of Sketch has been phenomenal, to say the least.

Yes, Sketch is Mac-only. I stayed away for a very long time simply because my entire team was using Windows. A couple years ago, I got my first Mac — a MacBook Air — and decided to give Sketch a try. I found Sketch so much better than my solution at the time (I was a proud Fireworks2 aficionado!) that I decided to invest in converting every one of our eight-member design team over to Macs and Sketch. We never looked back! Sure, the options were more limited then: Figma113 was not yet on the scene, Gravit Designer4 was just getting started, and Adobe XD5 was just a fledgling experiment, which we were not ready to bank on. That is not the case today, and you should consider the options if you are in the same boat. For us, though, Sketch has proven to be a great asset — even with all of the baggage. If you want to know why, read on!

Moving From Photoshop And Illustrator To Sketch Link

Unlike Photoshop, Sketch was made for UI design right from the start; UI wasn’t an afterthought. If you’re a UI designer and are still using mostly Photoshop or Illustrator, it may be time to consider using Sketch instead. Read more →6

Fast Evolution Link

Sketch 3 was released in April 2014, marking one of their most substantial updates with the introduction of symbols. It was followed by a bunch of incremental updates over the next two years. These included features such as artboard presets, a consolidated file format, improvements in performance, sharing capabilities and more.

Two years later, in April 2016, version 3.7 introduced much more powerful symbols, with the ability to nest and the option to override text and images in symbols per instance. This also kicked off a much more rapid development cycle, with powerful new features being released much more quickly. Version 39 (3.9) in July 2016 saw the introduction of symbol resizing, taking the first step towards easing responsive and multi-device design in Sketch. This release — and the versioning change — coincided with Sketch’s revenue model changing from one-time purchases to annual subscription. There was some backlash from users, but by and large, designers have embraced the new model in anticipation of faster development cycles. And Bohemian Coding, the developers of Sketch, did not disappoint.

7
Symbol overrides in Sketch.

In November 2016, version 41 brought along a complete visual overhaul of the user interface, and the ability to override nested symbols per instance. Version 43, released in April 2017, seemed like a small update, barring one huge change: a completely reworked file format. Sketch moved from a proprietary format to an open one (or almost open), making it easier than ever for third-party applications to read, parse and manipulate Sketch files outside of the application. AnimaApp’s Sketch Web Viewer8 is a great example of what the new format enables. (Read more in “New File Format in Sketch 439,” an excellent post by Ale Muñoz10, one of Sketch’s developers.)

Version 44 arrived in May 2017 with a completely reworked resizing interface for symbols, groups and artboards — heavily inspired by the UI in Figma113, probably Sketch’s closest competitor at the moment. This has rendered some functionality of the Autolayout plugin12 redundant and was a huge step forward for responsive and scalable design in Sketch. This release also introduced some major updates to artboard management — again, geared towards scalable design and taking advantage of the new, more powerful resizing controls.

New Sketch resizing controls vs Figma13
New resizing controls in Sketch vs Figma’s original UI.

Speed at the Cost of Stability? Link

Some might say that Sketch’s breakneck pace of development has come at the cost of stability and performance. Almost every major release seems to bring with it some performance issues, which take a couple of patches14 to address. For example, Sketch Mirror had a bug that caused the system’s bandwidth usage to skyrocket — and it stayed for a good three to four major releases before being fixed.

Around version 42, an issue was introduced that caused symbols to be duplicated when the user made copies of its instances. This one lingered for a couple of major releases and, in fact, is still a problem when dealing with files that were created in older versions.

These are not deal-breakers by any stretch, but I did consider other options for a brief period, wondering whether I was sailing on a slowly sinking ship. Thankfully, the developers seem to have taken notice of the situation and are doubling down on quality with newer releases. Besides, nothing out there seems to come anywhere close to the power and flexibility of Sketch as of now. The new open file format, a thriving (and mostly free) plugin scene and steadily growing support from third-party applications pretty much ensure that Sketch is here for at least the foreseeable future.

Features Link

What sets Sketch apart from the rest is its well-rounded set of features that cater to my requirements as a UI designer. Sure, it does not have the gazillion functions and filters of Photoshop, the built-in prototyping capabilities of Adobe XD, the collaboration features and vector networks15 of Figma or the cross-platform capabilities of all of the above. Sketch simply does what I need for the most part, does it well, and has a thriving plugin ecosystem that more often than not makes up for what’s not already built in.

What follows is just a sample of Sketch’s features that make life easy for me and the team at my UX design studio day to day.

Artboards and Pages Link

For as long as I can remember, my biggest pet peeve with Photoshop was its single canvas. Creating a new file for every page on a website just didn’t make sense to me. Fireworks understood the problem16, and its pages feature was a godsend. Illustrator got around this with artboards. In today’s mobile and responsive era, though, neither of those concepts is enough. Sketch has both pages and artboards, and having used the application for a while now, I cannot imagine going back to one that doesn’t have them!

For my web and UI design projects, I use artboards for individual screens and pages for flows. For example, I’ll have a page for the onboarding flow of an app, another for the core actions, one more for settings, and so on. This makes it very easy to keep everything together and organized. You can even nest artboards, so that you can get a big-picture PDF of an entire flow, while at the same time exporting individual screens for prototyping.

Nested artboards17
Nested artboards. (Large preview18)

Sketch also comes with a whole set of templates for the most common use cases (iPhone and Android apps, responsive websites, etc.), to be used as starting points for projects. These include artboards with the appropriate dimensions, named properly, and in some cases a basic set of UI elements to boot. The artboard picker was redesigned in a recent version, making it easy to quickly switch between sizes — and even to toggle vertical and horizontal orientation — on the fly. This, combined with the new resizing controls (more on that in a bit), makes designing responsive and multi-platform layouts extremely easy.

Layout Grids Link

Grids are an integral part of the modern UI design arsenal. It is surprising, then, how arcane the process of setting up grids in popular design applications is. I remember dreading the thought of setting up guidelines to precisely match a 12-column Bootstrap grid in Photoshop or Fireworks. (That’s before I hit upon a Fireworks plugin that did it.) But a grid made up of guidelines was still a hack and could be easily lost the moment you started adding more guides of your own.

Sketch addresses this problem by allowing you to set up layout grids for each artboard that are separate from guidelines and the traditional grid (both of which it still supports). You set the total width, number of columns and gutter width, and a nice red translucent grid is overlaid on your design instantly. Edit the numbers as needed and the grid adjusts accordingly. Again, these are per page, so you may have a 12-column grid for the desktop layout and switch to 8 columns for tablet and 4 columns for mobile. What’s more, you can also add rows to the grid, which can be invaluable when working with a set baseline grid19.

Layout grids20
Vertical and horizontal layout grid overlays. (Large preview21)

Couple this with the new resizable symbols and you’re looking at a massive boost in productivity when designing responsive layouts. Add to this the continuous stream of ingenious plugins being developed by the Sketch community and… well, you get my point.

Symbols and Styles Link

Symbols are by far one of the most powerful features in Sketch. And given how much they have improved, it is hard to believe that the feature was introduced less than a year ago. What started as simply a way to reuse a certain component across a design — à la Freehand and Fireworks — today has become a powerful feature in Sketch. I can safely say that symbols have saved hundreds of hours of work for me and my team in the last few months. And things are only getting better with each release.

A symbol could be as humble as a button with a rectangle and text on it, or as complex as an entire calendar with customizable dates, states and statuses. The example below is an extreme case, and I don’t recommend you go this far, but it helps to demonstrate how flexible symbols can be.

Taking symbol overrides to the extreme22
Taking symbol overrides to the extreme. (Large preview23)

You can nest symbols within symbols, toggle them on and off at an instance level, replace or even hide text, replace images, displace elements based on the width of a text object, resize entire symbols (with full control over how each element within the symbol reacts to resizing)… the list goes on and on. Let me demonstrate some of the capabilities below with examples from our UI design projects.

Symbol overrides24
Symbol overrides.

As with any good tool, I keep discovering new and exciting ways to use its feature set every day. As an example, I recently figured out that you can convert an entire artboard to a symbol. Let’s say you’re designing the workflow for an app, and certain screens appear multiple times with subtle changes. Just convert those screens to symbols, and place them wherever you need with the appropriate overrides. Later, when you need to change a color (and trust me, you will), just change it in the original artboard, and every instance will follow.

The power of symbols in Sketch is much broader than I can cover here, so here are a few places to look for more in-depth coverage:

The upcoming version 47 includes an update to the symbols, with the inclusion of shared libraries – individual Sketch files that act as central repositories for symbols across a team and files. It has created quite a buzz within the Sketch community as you can see in this roundup28 of related coverage.

Styles are a set of properties that can be applied to multiple elements and synced throughout a document to ensure consistency. They’re not unlike the styles we have come to know and use in everything from Microsoft Word to Adobe Illustrator and InDesign. In my team, we use these mostly to define text styles for elements such as h1, h2, h3 and p. But they go much beyond, covering fonts, fills, border, shadows and more.

Mirror and Sketch Cloud Link

There was a time when design was usually handled by an individual designer (or two) who worked on individual Photoshop files that didn’t really have much to do with each other. Today, it is not uncommon to see teams of tens or even hundreds(!) of designers working together on a single product. That makes the ability to collaborate on design files extremely critical.

Sketch has enabled a designer to share a read-only view of the file open in the app for some time now. Simply share a URL, and anyone else on the same Wi-Fi network will be able to view the file you’re working on. This is very helpful when you want to share a work in progress with a fellow designer or developer sitting at the other end of the office or even in the same room, where everyone can see the files on their own screens.

Sketch Mirror29
Sketch artboard mirrored on a phone. (Large preview30)

Another use case for Sketch Mirror is for testing mobile UI screens on mobile devices. Simply open the link on a mobile phone — or use one of the many apps on iOS31 and Android32 — to see the preview in real time. Any changes you make to the design in Sketch are immediately reflected in all previews.

Useful as it is, Mirror does have the limitation of being restricted to devices on the same network. Sketch Cloud33 addresses that by allowing you to upload your files to the cloud and have others access them publicly or via a link that you share.

Bits and Pieces Link

Those are not the only big things that make Sketch great. For me, it is the smaller touches that make life just that tiny bit easier every day and make it difficult for me to move to another app.

Need to save an artboard to a file? Just drag and drop the thumbnail from the right panel into Finder.

Working on a slide deck? just drag and drop a group from the layers panel straight into Keynote or PowerPoint.

Found a nice photo on the web to replace an avatar? just drag and drop it from the browser onto the image thumbnail inside the image fill panel of a rectangle. Here’s what I mean:

Image fills34
Images fills can be updated by dropping images directly inside the fill dialog. (Large preview35)

Smarter dimensions are another nice touch. Need to increase the width of an element by 23 pixels? Forget the mental math — append +23 to the width field, and let Sketch do the math for you. The same goes for subtraction, multiplication and division. You can even use percentage values to change dimensions proportionally to the element’s parent (which is the immediate parent group or the artboard, in that order). What’s that, you say? You want to increase the width on the left side instead of the right? Easy. Use +23r instead, and the resizing will be on the left, keeping the object anchored to the right (r) edge. Ditto for left (l), top (t) and bottom (b).

Smart dimensions36
Some examples of smart dimensions supported in Sketch.

You’ve created a bunch of objects and now need to rename them? Hit Cmd + R, change the name, press Tab to go to the immediate next object in the Layers list, and continue typing. Rinse and repeat.

Per-artboard grid toggles are great, too! I like to work with the 8-pixel grid when designing mobile apps, but having it either on or off across all pages is just plain annoying. With Sketch, I can turn the grid on or off at the artboard level.

There’s even more37, but you get the idea.

The (Awesome) Plugin Ecosystem Link

One of the things that makes Sketch so powerful is the almost endless stream of plugins available for it. Bohemian Coding has made it easy for users to build on top of Sketch’s functionality and extend it in almost any way imaginable. Here are just a few stand-out plugins that prove that. There are tons more, and I would encourage you to explore them to see which ones work for you. Or, if you are up to the challenge, try building one yourself38.

Craft Link

InVision Craft39
InVision Craft.

Craft40, from the makers of InVision41, is a powerhouse of a plugin for Sketch — an endeavor so huge that they probably have an entire team of developers chugging at it day in and day out. It would probably take an entire post by itself to talk about everything Craft does, but let’s start with a sample:

  • Data

    We all work with dummy data — be it placeholder images, lorem ipsum text, fake names and addresses, blog post titles, the list goes on and on. Rather than hunting for these every time or copying and pasting the same set of data over and over, Craft lets you insert a whole host of placeholder content, randomized from a prebuilt set, from your own collection, or directly from the web. It even lets you import content from JSON sources! This is by far one of the biggest time-savers for me when working on new designs.

    Craft Data42
    Bringing real data into Sketch. (Image source: Craft for Sketch Plugin: Designing with Real Data4543)
  • Duplicate

    OK, so you’ve created a card with placeholder content, but it is just one of a list. The duplicate feature lets you take that card and create as many duplicates as you need, all with randomized content from the same sources that you used for the first instance. No more copying and pasting and changing text — or even images — manually. Need to increase the size of the grid? Just resize the container, and Craft is clever enough to fill the space with more duplicates (with different content). Genius!

    Craft Duplicate44
    Craft duplicate in action. (Image source: Craft for Sketch Plugin: Designing with Real Data4543)
  • Library

    As projects and teams grow bigger, collaborating on source files gets trickier. The library feature in Craft tries to address that by allowing you to define and share symbols, styles and colors with your team and by allowing for quick changes that reflect across all files and team members. It is a bit tricky to set up and has its quirks, but once you’ve set it up, it can be a huge time-saver for the entire team.

    Craft Library46
    The Craft Library panel.
  • Sync

    If you use InVision to share mockups and collaborate with colleagues and clients, this is a big step up from what used to be the Sketch-to-InVision workflow. With Sync, you can upload any or all of the artboards in a Sketch file to an InVision prototype or board.
  • Prototype

    Here’s a great example of a plugin adding essential functionality to Sketch. This brings the often requested prototyping tools right inside Sketch. Just select an element, tap C and pick the artboard it should link to. The only limitation, really, is that your prototypes can only be previewed by syncing the screens with a project on InVision.

    Craft Prototype47
    Prototyping inside Sketch with Craft. (Large preview48)

Craft continues to add new features on a regular basis. Two new additions are Stock — a quick way to find and add stock images from Getty49 to your designs — and Freehand — a digital whiteboard tool for collaborating on Sketch files with teams or clients.

Runner Link

Sketch Runner50
Sketch Runner.

Spotlight is one of my most used features on the Mac. Having one search field to rule them all — to open apps, access files, search documents, heck, even check currency conversion rates — is infinitely powerful. Runner51 brings the same power to Sketch. It lets you launch any command, create and fetch symbols, navigate pages and artboard, even install and manage Sketch plugins from a single unified search field. It is the kind of tool that, once you start using it, will be impossible to imagine the app without.

Sketch Runner commands52
Sketch Runner commands panel. (Large preview53)

Sketch Measure Link

Sketch Measure54
Sketch Measure.

Not long ago, we used to spend an insane amount of time creating specifications and assets for our designs, so that developers could translate them into code exactly as we intended. This involved manually adding dimensions, spacing, text properties and more for each design element, along with the appropriate overlays and rules. Sure, Fireworks extensions made things slightly easier, but it was a chore all the same.

With Sketch Measure55, we have managed to bring that time down from a few hours to just a few minutes — and with richer and more useful data than ever. In short, the plugin lets you instantly add overlays, with pretty much any specification, for any element in your design — including width and height, spacing, text properties and more.

The most useful feature by far, though, is its ability to create HTML that shows a preview of each artboard, complete with all the specifications and assets the developer needs. Simply select an element, and a panel will appear with all of the properties of the element, including text content and CSS properties, to be simply copied and pasted into the code. For elements that have been marked for exporting, developers can download all defined versions (2x, 3x and so on, plus their Android equivalents) in one click.

Sketch Measure56
Design specs exported via Sketch Measure. (Large preview57)

Other apps provide this feature — Zeplin58, Avocode59, even InVision via the Inspect60 feature — but Sketch Measure is free and works directly from inside Sketch.

Icon Font Link

I was never a big fan of icon fonts. They’re nifty and all, but having to copy and paste character codes from a cheat sheet just didn’t seem like the right way to pull icons into Sketch. Then I found the Icon Font61 plugin and things changed. This plugin provides a visual grid of all icons in an icon font, letting you quickly pick the character you want to add or (even better!) search through the glyphs by context. Although it doesn’t come bundled with any icon fonts, there’s an easy tutorial for adding a few of the most popular free sets, and you can add your own as needed. No more hunting the web for an icon or messing with character codes. This one is a huge productivity booster in my workflow.

Insert icon fonts via grid62
The Icon Font grid to insert icons in Sketch.

User Flows Link

One of the pains with using artboards for screens in an app or workflow is showing links between them. Elements can only stay within a single artboard, so arrows between artboards have to be on a common layer at the page level. Besides, updating those links every time you move the screens around or add or remove any can be frustrating, to say the least. User Flows63 solves that by letting you add pretty linking arrows simply by selecting a pair of an element and an artboard. It nicely adds everything on a separate locked layer and even updates them with a single command, no matter how much you have moved things around. You can customize the look and feel of the arrows to match your design, then export the whole set as a single user flow diagram to share with your colleagues and clients.

User flows64
User Flows in action. (Large preview65)

Font Finder Link

How often have you had to change a primary font across an entire design, spanning multiple pages and artboards? For me, I’ve lost count. It could be a change from the client, or I see that a font just isn’t working very well as the design progresses. The bottom line is that changing a font across the board can be a daunting task. Font Finder66 makes it that much easier by allowing you to find everything on a page that uses a particular font, and then it changes it at once, while keeping the weight selections intact (in most cases, at least).

Font finder67
The Font Finder dialog.

It is not the perfect solution, of course. Different fonts invariably end up breaking the layout in various places due to character size variations, but at least it saves you the effort of finding and changing the font of each text element individually.

And More Link

There are more plugins that do any number of things, including replacing text68 and colors69, organizing symbols70, publishing websites71, even creating native apps72 directly from Sketch. There’s a good chance that, if you need it, someone has already built it. You only have to search for the plugin.

Summary Link

Sketch remains the most important tool in my design toolkit at the moment, but I’m keeping my eye on other contenders for now. Figma is probably the front-runner73, given how much it has matured in the last year or so. A lot will depend on whether Sketch can build on the momentum it has picked up over the last year or so.

If you’re considering coming on board the Sketch train or have already boarded, here are a few resources geared to helping UI designers:

(mb, yk, al, il)

Footnotes Link

  1. 1 https://www.smashingmagazine.com/tag/sketch/
  2. 2 https://www.smashingmagazine.com/category/fireworks/
  3. 3 https://www.figma.com/
  4. 4 https://www.smashingmagazine.com/2017/08/introduction-gravit-designer-designing-weather-app-part-1/
  5. 5 https://www.smashingmagazine.com/2016/07/how-to-create-icons-adobe-xd/
  6. 6 https://www.smashingmagazine.com/2017/04/photoshop-illustrator-sketch-ui/
  7. 7 https://www.smashingmagazine.com/wp-content/uploads/2017/08/01-symbol-overrides-800w-opt.png
  8. 8 https://animaapp.github.io/sketch-web-viewer/
  9. 9 http://sketchplugins.com/d/87-new-file-format-in-sketch-43
  10. 10 https://twitter.com/bomberstudios?lang=en
  11. 11 https://www.figma.com/
  12. 12 https://medium.com/sketch-app-sources/introducing-auto-layout-for-sketch-24e7b5d068f9
  13. 13 https://www.smashingmagazine.com/wp-content/uploads/2017/08/02-sketch-resizing-vs-figma-800w-opt.png
  14. 14 https://twitter.com/ivomynttinen/status/895380288880226304
  15. 15 https://blog.figma.com/introducing-vector-networks-3b877d2b864f
  16. 16 https://www.smashingmagazine.com/2012/06/developing-a-design-workflow-in-adobe-fireworks/#creating-pages
  17. 17 https://www.smashingmagazine.com/wp-content/uploads/2017/08/03-nested-artboards-large-opt.png
  18. 18 https://www.smashingmagazine.com/wp-content/uploads/2017/08/03-nested-artboards-large-opt.png
  19. 19 https://www.linkedin.com/pulse/android-design-102-baseline-grid-mark-dappollone
  20. 20 https://www.smashingmagazine.com/wp-content/uploads/2017/08/04-layouts-large-opt.png
  21. 21 https://www.smashingmagazine.com/wp-content/uploads/2017/08/04-layouts-large-opt.png
  22. 22 https://www.smashingmagazine.com/wp-content/uploads/2017/08/05-calendar.gif
  23. 23 https://www.smashingmagazine.com/wp-content/uploads/2017/08/05-calendar.gif
  24. 24 https://www.smashingmagazine.com/wp-content/uploads/2017/08/06-symbol-overrides-760w-opt.gif
  25. 25 https://www.smashingmagazine.com/2017/04/symbols-sketch/
  26. 26 https://blog.prototypr.io/using-sketch-symbols-to-quickly-swap-between-different-os-designs-5a692cebc333
  27. 27 https://medium.com/sketch-app-sources/sketch-workflow-atomic-symbols-2b3c67babf08
  28. 28 http://sketchhunt.com/2017/09/05/roundup-sketch-libraries-v47-beta-articles-videos/
  29. 29 https://www.smashingmagazine.com/wp-content/uploads/2017/08/07-sketch-mirror-large-opt.png
  30. 30 https://www.smashingmagazine.com/wp-content/uploads/2017/08/07-sketch-mirror-large-opt.png
  31. 31 https://itunes.apple.com/in/app/sketch-mirror/id677296955?mt=8
  32. 32 https://play.google.com/store/apps/details?id=com.smithyproductions.crystal&hl=en
  33. 33 https://sketch.cloud/
  34. 34 https://www.smashingmagazine.com/wp-content/uploads/2017/08/08-image-fill.gif
  35. 35 https://www.smashingmagazine.com/wp-content/uploads/2017/08/08-image-fill.gif
  36. 36 https://www.smashingmagazine.com/wp-content/uploads/2017/08/09-dimensions-math-600w-opt.gif
  37. 37 https://medium.com/sketch-app-sources/sketch-app-awesomeness-d6db04bf9ccb
  38. 38 https://medium.com/@marianomike/the-beginners-guide-to-writing-sketch-plugins-part-1-28a5e3f01c68
  39. 39 https://www.smashingmagazine.com/wp-content/uploads/2017/08/10-invision-craft-800w-opt.png
  40. 40 https://www.invisionapp.com/craft
  41. 41 https://www.invisionapp.com/
  42. 42 https://www.smashingmagazine.com/wp-content/uploads/2017/08/11-craft-data-500w-opt.gif
  43. 43 https://www.smashingmagazine.com/2017/02/design-with-real-data-sketch-using-craft-plugin/
  44. 44 https://www.smashingmagazine.com/wp-content/uploads/2017/08/12-craft-duplicate-500w-opt.gif
  45. 45 https://www.smashingmagazine.com/2017/02/design-with-real-data-sketch-using-craft-plugin/
  46. 46 https://www.smashingmagazine.com/wp-content/uploads/2017/08/13-craft-library-800w-opt.png
  47. 47 https://www.smashingmagazine.com/wp-content/uploads/2017/08/14-craft-prototype-large-opt.png
  48. 48 https://www.smashingmagazine.com/wp-content/uploads/2017/08/14-craft-prototype-large-opt.png
  49. 49 http://www.gettyimages.in/
  50. 50 https://www.smashingmagazine.com/wp-content/uploads/2017/08/15-sketch-runner-800w-opt.png
  51. 51 http://sketchrunner.com/
  52. 52 https://www.smashingmagazine.com/wp-content/uploads/2017/08/16-runner-commands-large-opt.png
  53. 53 https://www.smashingmagazine.com/wp-content/uploads/2017/08/16-runner-commands-large-opt.png
  54. 54 https://www.smashingmagazine.com/wp-content/uploads/2017/08/17-sketch-measure-logo-800w-opt.png
  55. 55 http://utom.design/measure/
  56. 56 https://www.smashingmagazine.com/wp-content/uploads/2017/08/18-sketch-measure.gif
  57. 57 https://www.smashingmagazine.com/wp-content/uploads/2017/08/18-sketch-measure.gif
  58. 58 https://zeplin.io
  59. 59 https://avocode.com
  60. 60 https://www.invisionapp.com/feature/inspect
  61. 61 https://github.com/keremciu/sketch-iconfont
  62. 62 https://www.smashingmagazine.com/wp-content/uploads/2017/08/19-icon-font-800w-opt.png
  63. 63 https://abynim.github.io/UserFlows/
  64. 64 https://www.smashingmagazine.com/wp-content/uploads/2017/08/20-User-flows-large-opt.png
  65. 65 https://www.smashingmagazine.com/wp-content/uploads/2017/08/20-User-flows-large-opt.png
  66. 66 https://github.com/ukn530/FontFinder
  67. 67 https://www.smashingmagazine.com/wp-content/uploads/2017/08/21-font-finder-800w-opt.png
  68. 68 https://github.com/thierryc/Sketch-Find-And-Replace
  69. 69 https://github.com/lewishowles/sketch-replace-colour
  70. 70 https://github.com/sonburn/symbol-organizer
  71. 71 https://launchpad.animaapp.com/
  72. 72 https://supernova.studio/
  73. 73 https://www.smashingmagazine.com/2017/03/sketch-figma-showdown/
  74. 74 https://www.goabstract.com/2017/04/12/component-based-workflow-sketch.html
  75. 75 https://medium.com/sketch-app-sources/exploration-of-responsive-design-in-sketch-part-1-1af4cf415a82
  76. 76 https://www.smashingmagazine.com/2017/01/designing-responsive-music-player-sketch-part-1/
  77. 77 https://medium.com/sketch-app-sources/sketch-app-awesomeness-d6db04bf9ccb
  78. 78 https://medium.com/sketch-app-sources/sketch-symbols-b36f7355414a
  79. 79 https://medium.com/@andrewcouldwell/harness-the-power-of-symbols-204448baaef3
  80. 80 https://www.smashingmagazine.com/sketch-handbook/

↑ Back to topTweet itShare on Facebook

Launching Your Design Career: Which Type Of Education Is Best For You?

Launching Your Design Career: Which Type Of Education Is Best For You?

If you’re stuck in a job you hate and have dreams of becoming a designer and working in a creative role that fills you with excitement daily, the road to entering this completely new industry can feel daunting. Making a major career shift late in life to follow your passion is scary. Not only is it sometimes difficult to know where to start to learn about an expansive field like design, but it can also feel risky, especially if you’re working a secure job.

Luckily, you’re not alone! According to a study by the Bureau of Labor Statistics1, the average worker changes jobs two times every four years during their 20s and 30s, driven by a desire to follow their passion, improve work-life balance and gain a stronger sense of fulfillment in their work. Additionally, over 2 million Americans quit their jobs2 every month, driven by a lack of fulfillment and recognition for their work. Thankfully, becoming a professional creative is now more accessible than ever because of the numerous educational resources available.

However, with so many resources out there for learning design, how do you choose the perfect method that fits your life? Rest assured, there is something for you. Whether you’re a high-school student getting ready to graduate or have been working in another career for 40 years and are looking for a major change, the right education exists!

Regardless of the type of design education throughout history, one of the most consistent things emphasized is the importance of learning from experts. Expert-based one-on-one learning is proven3 to be more impactful than learning by yourself and has been taught for thousands of years. Michelangelo himself, and most other painters throughout history, apprenticed4 with an established artist (Michelangelo apprenticed with Florentine painter Domenico Ghirlandaio). Many acclaimed modern designers did not attend traditional schools but instead learned by immersing themselves in design and finding a teacher to mentor them. For example, Stefan Sagmeister5 (the founder of global design agency Sagmeister and Walsh) started his design career by working on layout and typography for the design team of an Austrian magazine called Alphorn, long before receiving a formal design education.

6
Stefan Sagmeister of Sagmeister and Walsh (View large version7)

Let’s return to the present. With so many options available just a few mouse clicks away, how do you decide which option is the best fit for you? And how do you ensure you’re getting feedback and critiques from experts that will help you quickly and efficiently build up your skills. We know that the options can feel overwhelming, so we’ve put together a list of the best ways to learn design according to your personality, budget, lifestyle and personal goals.

Before you read the rest of the article, we recommend answering the following questions first (write your answers down):

  • What is your preferred learning style? Do you learn best in a classroom or working on your own?
  • Do you learn best when surrounded by other students and teachers?
  • What type of learner are you? Do you learn best by listening to lessons or seeing things taught visually?
  • What are your restrictions on time, budget or family? How much do you want to spend on your education? How much time can you devote to it?
  • Do you like to learn quickly or go at your own pace?

Once you have answered those questions, everything else should fall into place.

Do You Prefer To Learn In Person Or In A Classroom? Link

If you’re the type of learner who absorbs things best when you’re in a real classroom surrounded by teachers and other students, and assuming you have the luxury of going to a classroom full-time, you’ll want to consider an in-person design education. The two main ways to do this are via a traditional design college or an intensive bootcamp.

Parsons School, one of the most renowned design colleges in the world8
Parsons School, one of the most renowned design colleges in the world (View large version9)

Traditional Design College Link

If you have the budget and time, then a formal education at an accredited design school is still one of the best ways to become a designer. Not only will you spend years learning the fundamentals and practicing with modern design tools, but you’ll also be constantly surrounded by students who are just as passionate as you and by teachers with decades of experience in several industries. Top Universities10 and Learn How to Become11 both offer a list of the best design schools in the world, and Niche lists12 the best schools in the US.

Upsides:

  • You’ll spend years learning the fundamentals at a design college. This can really help to set you apart when you’re looking for a job and expanding your technical abilities.
  • You will be surrounded by hundreds of people who are always trying to do their best work and by teachers who live and breathe design education.
  • Many top design schools pride themselves on constantly updating their curriculum to keep up with modern design trends.
  • An incredible alumni community and career services department will help you find a job upon graduation.

Downsides:

  • It’s slow. If you’re hoping to become a designer as quickly as possible, then design school likely isn’t the best option for you, because most programs take at least three years to complete. Some colleges have expedited programs, but those will still take at least a year.
  • It’s expensive. Most traditional design schools will set you back at least $100,000.
  • The curriculum is fairly inflexible. After choosing a major, you will have more choice in which classes to take, but you’ll still be required to spend at least a year focusing on a set core curriculum at most schools.

Perfect for anyone who:

  • learns best in a small classroom setting and likes to have someone to hold them accountable;
  • thrives when surrounded by other people who are trying to accomplish the same things as them;
  • has a high budget (design school can cost well north of $100,000 over several years);
  • has the flexibility to quit their job and not work for several years (or just work part-time).

How well does this option prepare you for the job market:

  • Attending design school will prepare you for a design job better than anything else, if you have the time and financial resources to invest in it.
  • You’ll spend a tremendous amount of time learning both the fundamentals of design and the technical skills needed to land a job in the field. You’ll also graduate with hundreds of portfolio projects to choose from when presenting yourself to employers.
  • It’s undeniable that a traditional university will give you the most well-rounded education and require the least continued education after graduation. You’ll get exposure to every aspect of the design world, from fashion design to illustration to UX design.

In-Person Bootcamp Link

If you don’t like your job and are looking to move to a more fulfilling career as quickly as possible, then an in-person bootcamp might be the best bet for you. In-person bootcamps come in many shapes and sizes, but they generally include 40+ hours of weekly classroom instruction, as well as frequent group assignments, one-on-one sessions with an assigned mentor, and great job placement opportunities once you complete the program.

General Assembly holds in-person design bootcamps around the world13
General Assembly holds in-person design bootcamps around the world. (View large version14)

Many bootcamps allow you to pay up front or take the course for free if you agree to pay them a fixed percentage of the salary from your first post-bootcamp job! Some of the best-reviewed in-person bootcamps are run by General Assembly15 and Shillington16. Course Report has a full list of in-person bootcamps17.

Upsides:

  • The job placement opportunities are extensive. Bootcamps cater to people who are trying to find a job quickly. Upon graduation, most bootcamps hold job fairs, with a lot of companies in attendance (mostly from the tech world).
  • You’ll be surrounded by a lot of other hyper-motivated people just like you. During most bootcamps, you’ll work on group projects with your classmates and be paired with mentors to give you feedback and critiques.
  • It’s fast. Most bootcamps pack an entire design education into three months. They’re hard work, but you can bet you’ll come out the other end with more knowledge than you thought possible in such a short timeframe.
  • The curriculum is built around the most modern and up-to-date design theories and tools, with a focus on preparing you for the job market.

Downsides:

  • It’s still expensive. While much cheaper than a traditional school, a bootcamp can still run you $10,000 to $15,000 over three months.
  • The curriculum is not flexible. Bootcamps are intended to teach you the basics and to make you proficient as quickly as possible, so they adhere to a single curriculum for everyone. If you’ve already spent several months taking online courses on the subject you’re pursuing, you might find yourself bored for the first month or two of the bootcamp.
  • You’ll have to keep learning once the bootcamp finishes. Three months isn’t a lot of time, and many employers will want to see that you have not just completed a bootcamp but have also actively continued to learn and build your portfolio afterwards.

Perfect for anyone who:

  • has the flexibility to quit their job and dive head first into their design education;
  • prefers learning in a small classroom setting, with a lot of one-on-one interaction between teachers and students;
  • is interested in entering the tech industry (most of the jobs available after a bootcamp will come from tech companies that see the value in hiring motivated newcomers, even ones who haven’t spent years in the field);
  • anyone who likes to learn in an intense, fast-paced environment (a bootcamp will push you to your limit, because it usually includes 50+ hours of classroom learning per week and runs for about 13 weeks nonstop — be ready to work hard).

How much will this option prepare you for the job market?:

  • Next to a design college, a bootcamp is the most effective way to quickly learn design skills while having constant access to teachers and a classroom of peers who want to help you succeed and improve. This helps bootcamps stand out from most other educational paths.
  • While you’ll spend time learning the fundamentals, it’s impossible to get a full education about every aspect of design history and concepts in just a couple months. And you’ll likely produce only a few portfolio pieces that you’re truly proud of, because many bootcamps focus on a lot of small projects, which the class works on each day, and they allow time for only a few larger personalized projects that you can showcase in a portfolio.
  • If you attend a bootcamp, you will need to continue your education on your own after graduating. Many employers are hesitant to hire bootcamp graduates right out of the program because they know their skills are still fresh. In order to stand out and land a job, you’ll need to continue learning afterwards (both concepts and technical skills) and build a handful of laser-focused projects that demonstrate not only that you are adept at basic design skills, but also that you have a unique style and you grasp tangential skills such as UX design and front-end development.

Apprenticeship on a Design Team Link

Finally, one of the most traditional ways to become a designer historically has been to enter into an apprenticeship on a design team at an established company. While apprenticeships can be a bit more difficult to find these days, many companies are still willing to teach young designers via hands-on experience, similar to an internship. And while apprenticeship opportunities are easier to find if you have at least a bit of experience or have done some design education on your own, if you’re able to secure a position, it can be one of the most effective ways to learn quickly. You might have more luck finding an apprenticeship (or internship, as they are more likely to be called these days) at a large company with established HR and recruiting teams. Smaller agencies and studios are likely looking for interns who can immediately contribute to projects with little to no hand-holding. There’s no better way to learn the real day-to-day skills of a designer than by working alongside professionals at the height of their careers.

Apprenticeship provides an opportunity to learn design in a real-world environment18
Apprenticeship provides an opportunity to learn design in a real-world environment. (View large version19)

How much will this option prepare you for the job market?:

  • If you’re able to secure an apprenticeship at a company you like, then a strong performance and demonstrated willingness to learn and improve could be a direct pathway to a job offer. And even if the company doesn’t have any openings, hardly anything is more valuable to other employers than a personal reference letter from a designer at a real company who has enjoyed working with you.
  • Working as an apprentice, you’ll likely learn hands-on skills that are much more readily applicable in a real office environment than what you’d learn in an online course on the same subject. Learning the short-hand of designers and seeing how design actually functions and works in a job is invaluable.

Do You Want To Learn Online? Link

Quitting your job to attend a bootcamp or a full-time program at a university isn’t a realistic option for most people. Luckily, a wide array of options cater to people who prefer to learn at their own pace and who don’t have a big budget. These alternatives still let you work through a structured curriculum built for those who are trying to build a career in the design field, and many of them even feature one-on-one components.

Online Bootcamps Link

Schools such as Bloc20 and Springboard21 have been paving the way for online bootcamps. Their curricula largely mirror those of their in-person counterparts, the difference being that you work from a laptop instead of spending 40 hours a week in a classroom. Course Report has a full list of online bootcamps22.

Upsides:

  • Like in-person bootcamps, online bootcamps offer extensive job placement opportunities.
  • They’re fast. Also like in-person bootcamps, online bootcamps pack years of education into a few short months.
  • They’re flexible. Online bootcamps generally let you take lessons at your own pace. Some lessons are taught live, and others are prerecorded videos, allowing you to work around the other responsibilities in your life.

Downsides:

  • They’re still expensive. An online bootcamp will run you between $5,000 and $15,000 for three months of education.
  • The curriculum is not flexible. While the speed at which you take lessons is a bit flexible, you’ll still need to adhere to a rigid curriculum and complete assignments by certain deadlines.
  • They’re not highly personalized. While you’ll be assigned a mentor and will work with other students on projects, you’ll be missing out on one of the things that makes bootcamps so effective: being constantly surrounded by other motivated students and teachers. The benefits of an in-person education are hard to quantify, but they exist.

Perfect for anyone who:

  • wants to dive headfirst into a design education but can’t necessarily spend 40+ hours per week in a classroom;
  • likes to learn on their own but also thrives when working on assignments with peers;
  • likes to learn in an intense, fast-paced environment (like an in-person bootcamp, an online bootcamp will push you to devote yourself to it entirely — expect to spend 40 hours a week learning, with a bit more flexibility around what time of day you’re learning).

How much will this option prepare you for the job market?:

  • Similar to an in-person bootcamp, an online bootcamp is another effective way to learn the skills you’ll need in a real job environment.
  • In an online environment, you’ll need to make a concerted effort to connect with the students in your class and to chat with them online every day. Because the curriculum in these programs is a bit more self-guided, you’ll need to set up recurring video chats with your classmates to get the most out of the program and to ensure you’re able to learn from each other.
  • And just like an in-person bootcamp, you’ll need to focus on continuing your education afterwards and building up personalized projects that match your interests and the type of job you want.

Structured Online Courses Link

For many people, a full-time design education might be too much, for a variety of reasons. Luckily, many design schools have built lighter-weight courses that allow you to learn design at your own pace and still get the benefit of periodic one-on-one feedback from mentors.

If you want to learn with a mentor, there are a few great options that pair curriculum with periodic mentorship sessions. Skillcrush23 is an awesome resource for anyone looking for a part-time education. It will hook you up with projects, periodic feedback sessions and frameworks to help you learn design and accomplish your goals. Thinkful24 has its own part-time design program for people looking to learn at their own pace.

On the other hand, if you prefer a totally self-paced course, with no mentorship, then services such as Treehouse25 have hundreds of courses covering every aspect of the design world, from design fundamentals to freelancing. These courses allow you to go through a preplanned “track” at your own pace, complete with projects, online communities of other students and great customer service. However, one-on-one mentorship is still crucial, regardless of which online platform you use. If you decide to learn via a service such as Treehouse, which doesn’t offer mentorship, then we’d suggest setting up periodic mentoring chats with outside services that let you schedule individual video chats with design mentors26 whenever you need some feedback or advice.

Upsides:

  • They’re affordable! These courses generally run between $20 to $300 per month.
  • Work at your own pace. These courses allow you to enjoy the benefits of a structured curriculum, while moving at your own pace and spending as much time as you need to master skills.
  • They’re flexible. While the basic curriculum is fixed for many of these part-time courses, you can easily supplement your education by taking as many different part-time courses as you want from other websites.

Downsides:

  • Mentorship is not a focus. Some of the pricier self-paced courses let you chat with a mentor periodically, but you won’t have as much constant access to teachers as you would in a bootcamp.
  • You won’t have classmates or peers to help you stay motivated and grow.
  • Job placement opportunities are not built in. If you go down this route, you’ll be on your own for finding a job. Luckily, there are many great job placement services27 for people trying to break into new industries.

Perfect for people who:

  • don’t like a traditional classroom setting;
  • prefer to move at their own pace and learn on their own;
  • want to keep their current job while learning to become a designer on the side;
  • don’t have tens of thousands of dollars to spend but still want a quality education!

How much will this option prepare you for the job market?:

  • Following a structured online course is a great way to learn design skills on your own. Because the courses are built on a curriculum that teaches you design in a logical order, you don’t have to worry about whether you’re learning things in the right order or missing any major concepts.
  • The most important thing to remember for this option is that the amount of work you do is completely up to you, which could be good or bad depending on how motivated you are! Taking a few online courses will definitely not be enough on its own to prepare you for a real job. You’ll need to create a strict schedule for yourself each day, in which you force yourself to watch the video course and then dive into projects that apply the skills you’ve learned that day in Photoshop, InDesign and Illustrator. Making the most out of your mentoring sessions (if the platform you choose offers them) is also crucial. For each project you work on, write down detailed questions whenever you’re having trouble, and be sure to ask for detailed feedback on every iteration of your projects. The only way to improve is by practicing and iterating.
  • After completing a structured online course, you’ll need to continue working on projects every day. The benefit of an online course is that you’ll have more time to study specific things that interest you, whereas in a bootcamp or college you’d have a prescribed educational track. As you go through your program, note what types of design are most interesting to you. Afterwards, find similar videos and tutorials that dive into those skills, and start building up projects.
  • One of the most important things in your arsenal when applying for a job is your portfolio. Whether you’re trying to land a client as a freelancer or a regular job, you’ll need to have a focused portfolio of projects that showcase your general design skills, your process and thinking and, ideally, a specialty or hook that is unique to you. For this type of design education, you’ll need to go far beyond the generic projects assigned in these courses and develop projects that are specific to you!

Other Unstructured Online Platforms Link

If you’re the type of person who has very specific goals and doesn’t want to waste any time learning unnecessary skills to achieve those goals, this could be the option for you. There are literally thousands of websites, resources and platforms online designed to empower the true self-learner, and they come in all forms. They’re also, for the most part, incredibly cheap (or free)! Note that most of the resources in this section focus on traditional lectures and videos, rather than mentor-led projects. If you go down this route, you’ll need to come up with your own projects and hold yourself accountable to keep practicing as you go!

Massive open online courses (MOOCs) such as Coursera28 have paved the way for affordable education online. These services take real university courses and rebuild them in an online environment. By taking these courses, you will be receiving almost the same education as people enrolled at universities.

Skillshare offers thousands of classes to learn design at your own pace29
Skillshare offers thousands of classes to learn design at your own pace. (View large version30)

Skillshare31 and Udemy32 are two of our favorite marketplaces for online courses. Anyone can create a course on these platforms, but their teams monitor submissions to ensure quality. You can also read reviews from thousands of students who have already taken these courses to ensure you’re making the right picks.

YouTube33 is perhaps the most extensive repository of design resources available anywhere, and it’s free. Check out this list34 for some suggestions on great design channels to follow. While YouTube has millions of videos on every aspect of the design world, it unfortunately doesn’t help you figure out which videos to watch and in what order. We’d suggest finding a great book35 about the fundamentals of design, and supplementing it with YouTube videos on specific topics whenever you want more in-depth explanation of a concept.

Finally, there are thousands of other resources to teach yourself design skills, from blogs36 to individual online learning websites37 to podcasts38. If you’re a savvy Googler, the skills you can learn are limited only by your imagination. It can be hard to know which websites are reputable and which aren’t, so be sure to check out a website’s social pages to see what sort of community it has before diving too deep into it.

Upsides:

  • Because you’ll only be consuming content that relates to your specific goals, you can build any curriculum you want across any number of resources.
  • Most of these services are completely free, and even the paid ones (such as Skillshare) usually max out at around $10 per month.
  • They’re diverse. By leveraging resources across multiple websites, you can be sure you’ll be learning design thinking from people across a huge number of backgrounds and perspectives.

Downsides:

  • There is no personalization. Having an experienced designer to talk to while learning design skills is crucial. If you decide to go this self-guided route, we’d suggest chatting with a design mentor4139 periodically to get feedback and direction.
  • You’ll get no job placement opportunities. But remember that there are thousands of job boards (such as AIGA’s40) to get you started.
  • You’ll be given no direction. If you decide to learn by yourself, be sure to do a lot of online research to find out what skills you’ll need to learn to achieve your goals.

Perfect for people who:

  • want to learn design in a completely unstructured way and cheaply;
  • thrive when holding themselves accountable;
  • don’t want to quit their jobs or spend significant amounts of money to learn design.

How much will this option prepare you for the job market?:

  • Among those who enroll in open online programs such as Coursera’s, up to 95% of students never finish the course! This is a shocking statistic, but it shows just how important accountability is when teaching yourself design on a totally unstructured and mentor-free platform. No one will keep you on track but yourself, so you’ll need to be extremely diligent about your education on a daily basis.
  • If you go down this route, draw a list of 30 to 50 courses and videos that seem the most interesting to you, or work with a design mentor4139 to build up a curriculum that fits your goals. As you work through your courses, try to engage with other students who have taken these courses, either by commenting in the discussion section of the websites or by joining online communities such as Designers Guild42. Try to find a few other aspiring designers at your skill level who you can chat with as you learn. Ask each other for feedback and critiques on your projects. Because these courses are entirely impersonal, finding someone to work through them with is one of the best ways to stay accountable and get ongoing feedback.
  • If you create a personalized project for yourself each time you start learning a new skill, you should be able to build a solid portfolio of projects over the course of several months. Try to think of real problems you’d like to solve, whether you’re creating a brand for a fictional company in an industry that interests you or redesigning the user experience for the app of a company you’d like to work for. Remember that having a strong list of projects is crucial for landing a job, and that quality is better than quantity.

The Self-Taught Route Link

Last but certainly not least, we want to cover perhaps the simplest way to learn design: by teaching yourself! This is similar to the unstructured online platforms discussed above, but many modern designers have never even taken an online course on Coursera or a similar service. In all honesty, all you really need to do is download Adobe Creative Cloud (and Sketch if you’re an aspiring product designer) and start playing around.

For this route, YouTube will be your best friend. The beauty of the entirely self-taught route is that you can truly design an education 100% tailor-made to you. Want to land a freelance gig as a logo designer in the next two months? Great! You can create a laser-focused YouTube playlist of logo design tutorials and concepts. There are literally millions of tutorial videos online describing how to do the most specific and niche tasks in design software, so the answers to your questions have most likely already been asked and answered. In some ways, you can think of YouTube as an automated teacher, because you can get an answer to any question you have within a few seconds.

For the self-taught route, focus on connecting with other aspiring designers and finding a mentor (as we mentioned in earlier sections), because ongoing feedback is one of the best ways to ensure that you can turn basic skills into deep expertise. If you’re able to find like-minded designers and are committed to learning skills by yourself, you can go as quickly as you’d like. Being scrappy and resourceful is a skill that many employers will love, and if you’re able to show them that you went down a self-taught route because you know what you wanted to achieve and knew you could get there more efficiently by designing your own education, you’ll be in great shape!

Learning design completely on your own is becoming increasingly popular and feasible thanks to platforms such as YouTube43
Learning design completely on your own is becoming increasingly popular and feasible thanks to platforms such as YouTube. (View large version44)

Conclusion Link

Having reviewed the different ways to become a designer in the modern world, you might still be wondering which option objectively gives you the best chance of landing a job in the design industry. The answer totally depends on your timeframe, budget and learning style. If budget and time are no matter, then attending a two- to four-year full-time program at a design university is an incredible way to build a deep set of design skills that will increase your chances of launching your career. Spending several years learning something every day is undeniably the most effective way to become an expert in something.

On the other hand, most people don’t have the luxury of going back to school for several years, in which case we’d recommend finding a bootcamp (either in-person or online) that fits your schedule. Spending three months fully immersed in design and being accountable to a teacher and other students for assignments and projects is the second best way to develop design skills quickly. However, after finishing the bootcamp, you’ll have to continue investing yourself in design. Employers are sometimes skeptical that a bootcamp can give aspiring designers a strong enough foundation to be an effective designer in an actual job setting, so you’ll need to prove your passion and work hard to stand above the competition once the bootcamp wraps up.

Spend several hours every day learning new skills, reading books and working on projects directly related to the kind of job and industry you want to work in. Outside of a traditional college, learning from a teacher for several months in a bootcamp and then continuing your education on your own (with the periodic help of a mentor, if possible) and never slowing down is the best way to demonstrate to employers that you’re a serious candidate who’s ready to invest everything in your new career.

So, now that you have a good idea of the types of design education at your fingertips, get out there and find the perfect one for you! If you set your mind to it and immerse yourself fully in the creative world, you’ll be able to learn the skills necessary to build a career in design, no matter which educational route you go down. And look out for an upcoming article on how to find a mentor to help you progress as a new designer, regardless of which educational route you choose.

(ah, yk, al, il)

Footnotes Link

  1. 1 https://www.thebalance.com/how-often-do-people-change-jobs-2060467
  2. 2 https://www.forbes.com/sites/alanhall/2013/03/11/im-outta-here-why-2-million-americans-quit-every-month-and-5-steps-to-turn-the-epidemic-around/#2625c29d6484
  3. 3 http://web.mit.edu/5.95/readings/bloom-two-sigma.pdf
  4. 4 https://en.wikipedia.org/wiki/Michelangelo_and_the_Medici
  5. 5 http://www.aiga.org/medalist-stefan-sagmeister
  6. 6 https://www.smashingmagazine.com/wp-content/uploads/2017/08/sagmeister-large-opt.jpg
  7. 7 https://www.smashingmagazine.com/wp-content/uploads/2017/08/sagmeister-large-opt.jpg
  8. 8 https://www.smashingmagazine.com/wp-content/uploads/2017/08/Parsons-large-opt.jpg
  9. 9 https://www.smashingmagazine.com/wp-content/uploads/2017/08/Parsons-large-opt.jpg
  10. 10 https://www.topuniversities.com/university-rankings-articles/university-subject-rankings/top-art-design-schools-2016
  11. 11 http://www.learnhowtobecome.org/graphic-designer/
  12. 12 https://www.niche.com/colleges/rankings/best-colleges-for-design/
  13. 13 https://www.smashingmagazine.com/wp-content/uploads/2017/08/generalassemblybootcamp-large-opt.jpg
  14. 14 https://www.smashingmagazine.com/wp-content/uploads/2017/08/generalassemblybootcamp-large-opt.jpg
  15. 15 https://generalassemb.ly/
  16. 16 https://www.shillingtoneducation.com/us/graphic-design-course/
  17. 17 https://www.coursereport.com/
  18. 18 https://www.smashingmagazine.com/wp-content/uploads/2017/08/meetup-large-opt.jpg
  19. 19 https://www.smashingmagazine.com/wp-content/uploads/2017/08/meetup-large-opt.jpg
  20. 20 https://www.bloc.io/
  21. 21 https://www.springboard.com/
  22. 22 https://www.coursereport.com/
  23. 23 https://skillcrush.com/blueprint/visual-designer/
  24. 24 https://www.thinkful.com/courses/learn-ux-online/
  25. 25 https://teamtreehouse.com/
  26. 26 https://www.rookieup.com/find-a-mentor/graphic-visual-design-mentors/
  27. 27 https://www.planted.com/
  28. 28 https://www.coursera.org/courses?languages=en&query=design
  29. 29 https://www.smashingmagazine.com/wp-content/uploads/2017/08/skillshare-large-opt.jpg
  30. 30 https://www.smashingmagazine.com/wp-content/uploads/2017/08/skillshare-large-opt.jpg
  31. 31 https://www.skillshare.com/home
  32. 32 https://www.udemy.com/
  33. 33 https://www.youtube.com/
  34. 34 http://www.howdesign.com/resources-education/20-graphic-designers-to-watch-on-youtube/
  35. 35 https://www.fastcodesign.com/3047814/35-books-every-designer-should-read
  36. 36 https://www.shillingtoneducation.com/blog/50-best-design-blogs/
  37. 37 http://hackdesign.org/
  38. 38 http://www.creativebloq.com/design/best-podcasts-designers-12121517
  39. 39 http://www.rookieup.com/
  40. 40 http://designjobs.aiga.org/
  41. 41 http://www.rookieup.com/
  42. 42 https://www.facebook.com/groups/designguild/
  43. 43 https://www.smashingmagazine.com/wp-content/uploads/2017/08/Photoshop-large-opt.jpeg
  44. 44 https://www.smashingmagazine.com/wp-content/uploads/2017/08/Photoshop-large-opt.jpeg

↑ Back to topTweet itShare on Facebook

UX At Scale 2017: Free Webinars To Get Scaling Design Right

UX At Scale 2017: Free Webinars To Get Scaling Design Right

Design doesn’t scale as cleanly as engineering. It’s not enough that each element and page is consistent with each other — the much bigger challenge lies in keeping the sum of the parts intact, too. And accomplishing that with a lot of designers involved in the same project.

If you’re working in a growing startup or a large corporation, you probably know the issues that come with this: The big-picture falls from view easily as everyone is focusing on the details they are responsible for, and conceptions about the vision of the design might be interpreted differently, too. What we need is a set of best practices to remove this friction and make the process smoother. A strategy to scale design without hurting it.

That’s exactly what our friends at UXPin thought, too, when they were creating a new design systems platform. And since they didn’t find sufficient answers, they decided to tackle these questions in a free, virtual “scaling” conference: the UX at Scale Virtual Summit 201721. And, well, you’re invited to it.

What’s The Virtual Summit About? Link

Four days, 14 live webinars. That’s the UX at Scale Virtual Summit 201721 which UXPin will host from October 3rd to 6th. Throughout the four days, design leaders from Atlassian, Salesforce, Airbnb, GE Digital, IDEO, Google, ADP, Linkedin, and Shopify, to name a few, will share their best practices for scaling products and UX processes.

3
The free UX at Scale Virtual Summit4 shares tips and best practices for scaling design.

The event will tackle the issues that weigh heavily on the minds of design teams, but that usually stay under-addressed: How can collaboration in large teams succeed? How can we keep a product consistent even with a lot of people working on it? And how can we make documentation work? These are just a few of the topics that will be discussed along the way.

Sounds good? Well, you can join the event for free from anywhere. The webinars will take place from 9:00 AM to 3:00 PM (PDT) each of the four days (see the schedule below for more details), and a virtual lobby will provide an opportunity to connect with fellow minds from across the globe — right from your office desk.

Schedule Link

Four days dedicated to getting scaling design right. If your schedule doesn’t allow you to make time for all of them, you can cherry-pick those webinars you’re most interested in, too, of course. Recordings will be sent to all registrants afterwards, so that you won’t miss out on anything. All times are PDT.

Tuesday, October 3rd 2017 Link

  • 9:00–10:00 AM

    Creating a Structured UX Process at Salesforce, Kyle Haskins (Salesforce)
  • 10:30–11:30 AM

    Design Systems First: Creating a Scaleable UX Process, Marcin Treder (UXPin)
  • 11:45–12:15 PM

    UXPin Demo: Creating a Consistent Design System, Lindsey Meredith (UXPin)
  • 2:00–3:00 PM

    Scaling a UX Team: 6 to 126 Designers in 4 Years, Alastair Simpson (Atlassian)

Wednesday, October 4th 2017 Link

  • 9:00–10:00 AM

    The Evolution of the GE Design System, David Cronin (GE Digital)
  • 10:30–11:30 AM

    Hiring and Leading Design Teams for Large Projects at LinkedIn, Amy Parnell (LinkedIn)
  • 11:45–12:15 PM

    UXPin Demo: Creating an Agile UX Process, Lindsey Meredith (UXPin)
  • 12:30–1:30 PM

    Design and Data Strategy at Google, Dr Laura Granka (Google)
  • 2:00–3:00 PM

    Design Transformation at Autodesk, Maria Giudice (Autodesk)

Thursday, October 5th 2017 Link

  • 9:00–10:00 AM

    Three’s a Party: How Product, Engineering, and Design Collaborate at Scale, Davis Neable (Shopify Plus)
  • 10:30–11:30 AM

    Design Systems: Accounting for Quantity and Scalability, Courtney Clark (Forumone) & Amy Vainieri (Taoti Creative)
  • 11:45–12:15 PM

    UXPin Demo: Improving Designer/Developer Collaboration and Handoff, Lindsey Meredith (UXPin)
  • 12:30–1:30 PM

    Calculating UX ROI with Financial Models, Aaron Powers (Athena Health)
  • 2:00–3:00 PM

    The 3 Cs of Design: Charters, Critique, and Culture, Russ Unger (18F)

Friday, October 6th 2017 Link

  • 9:00–10:00 AM

    Automating Design Processes for Teams: An IDEO Case Study, Matt Cooper Wright (IDEO)
  • 10:30–11:30 AM

    Developing UX ROI in Enterprise Land: An ADP Case Study, Jondelina Buckley (ADP)
  • 11:45–12:15 PM

    UXPin Demo: Collaborative Lo-fi to Hi-fi Prototyping, Lindsey Meredith (UXPin)
  • 2:00–3:00 PM

    Scaling UX at Airbnb: The 4-Step Framework, Jason Culbertson (Airbnb)

How Do You Join The Event? Link

You can register for the live event directly on the Virtual Summit site5. It’s free, no strings attached. Enjoy!

Footnotes Link

  1. 1 https://www.uxpin.com/ux-at-scale-virtual-summit-2017/
  2. 2 https://www.uxpin.com/ux-at-scale-virtual-summit-2017/
  3. 3 https://www.uxpin.com/ux-at-scale-virtual-summit-2017/
  4. 4 https://www.uxpin.com/ux-at-scale-virtual-summit-2017/
  5. 5 https://www.uxpin.com/ux-at-scale-virtual-summit-2017/

↑ Back to topTweet itShare on Facebook

Meet XRespond Testing Tool: Let’s Make Building Responsive Websites Simpler

Meet XRespond Testing Tool: Let’s Make Building Responsive Websites Simpler

The way people consume information is constantly evolving. As web designers and developers, we keep up with all of the different screen shapes and sizes, learning to create beautiful, flexible software. Yet most of the available tools still don’t reflect the nature and diversity of the platform we’re building for: the browser.

When I was making my first responsive website in 2012, I quickly realized how inefficient and time-consuming the constant browser window resizing was. I had just moved from Estonia to Australia, and with a newborn, time was very much a precious resource.

I began looking for better ways to see the effects of my media queries.

I came across Matt Kersley’s Responsive Web Design Testing Tool1 and was blown away. It cut my development time in half. Even though the app was quite basic, it quickly became indispensable, and I continued to use it for several years.

2
Matt Kersley’s Responsive Web Design Testing Tool. (View large version3)

It was very much to my surprise that I never saw this brilliant concept taken any further. This, combined with the lack of features, set me on a journey to create the open-source virtual device lab XRespond74.

The new Smashing Magazine website previewed in XRespond5
The new Smashing Magazine website previewed in XRespond (View large version6)

Understanding The Problem Link

When it comes to developing responsive websites, the problem lies in having to constantly resize the browser window. Although this unavoidable action feels second nature to most, it also masks aspects of design we don’t often appreciate — most notably, inconsistency and time management.

With designs usually appearing in some combination of mobile, tablet and desktop context, anything in between is left in a somewhat uncertain state. And filling these gaps requires a lot of time and effort.

The problem lies in the difficulty of looking at one screen size at a time, as opposed to getting an all-in-one overview of different screen sizes. When we’re building for a variety of screen types, it doesn’t make sense to view only a single instance of a design at any given time — we’d be unable to gain the context of how the styles of elements change across breakpoints.

Current practices just don’t cater to these modern ways of developing. Fortunately, it’s not all bad news.

Simple Solution Link

XRespond74 is a virtual device lab for designing, developing and testing responsive websites. The idea is simple: It enables you to make website comparisons side by side, as if you had different devices on the wall in front of you.

You don’t have to leave your desk, laptop or even favorite browser. And with zero setup, you can start comparing websites right away.

8
(View large version9)

XRespond can help if you’re building a pattern library or a style guide, because you can focus on a single component at different screen sizes simultaneously. As you’d expect from a development tool, it works well with local servers.

Just bear in mind that, as with any emulation, XRespond can’t compete with testing on real devices, but it will get you 90% of the way there — and in a fraction of the time.

How To Use It? Link

Enter a website address, click the button, and XRespond will automatically display the website on different virtual devices — which you can choose and customize as you see fit.

XRespond works well with other development tools, notably one of my favorites: Browsersync10. Browsersync enables you to set up live reloads and synchronized scrolling — all simultaneously across virtual (and real) devices. This makes spotting problems simpler, because issues become more apparent.

Synchronized scrolling across devices with Browsersync11
Synchronized scrolling across devices with Browsersync (View large version12)

What To Do If Your Website Won’t Load? Link

Occasionally, you might run into a problem of your website failing to load. This most likely has to do with your website preventing itself from being loaded in an iframe. If you own the website, you can temporarily disable X-Frame-Options13 or the Content Security Policy14, depending on your setup.

Conclusion Link

I love XRespond — and not just because I love making it, but because it simplifies my life. I can spend less time and effort working, and use the spare time for something else. It’s given me an opportunity to improve the quality of my work. I hope you’ll find XRespond just as useful and will start enjoying the time it saves you.

Feel free to share, and follow me15 on Twitter for updates. Cheers!

(da, il, al)

Footnotes Link

  1. 1 http://mattkersley.com/responsive/
  2. 2 https://www.smashingmagazine.com/wp-content/uploads/2017/08/mattkersley-large-opt.png
  3. 3 https://www.smashingmagazine.com/wp-content/uploads/2017/08/mattkersley-large-opt.png
  4. 4 https://www.xrespond.com
  5. 5 https://www.smashingmagazine.com/wp-content/uploads/2017/08/xrespond-large-opt.png
  6. 6 https://www.smashingmagazine.com/wp-content/uploads/2017/08/xrespond-large-opt.png
  7. 7 https://www.xrespond.com
  8. 8 https://www.smashingmagazine.com/wp-content/uploads/2017/08/xrespond-banner-large-opt.png
  9. 9 https://www.smashingmagazine.com/wp-content/uploads/2017/08/xrespond-banner-large-opt.png
  10. 10 https://www.browsersync.io/
  11. 11 https://www.smashingmagazine.com/wp-content/uploads/2017/08/browsersync.gif
  12. 12 https://www.smashingmagazine.com/wp-content/uploads/2017/08/browsersync.gif
  13. 13 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
  14. 14 https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
  15. 15 https://twitter.com/indrekpaas

↑ Back to topTweet itShare on Facebook

The CSS Grid Challenge: Build A Template, Win Some Smashing Prizes!

The CSS Grid Challenge: Build A Template, Win Some Smashing Prizes!

Layout on the web has always been tricky, but with CSS Grid being now supported in all major browsers, most of the hacks that helped to achieve complex layouts have become obsolete. Firefox even has a CSS Grid Inspector1 built in, so that there’s nothing to hold you back from making even the most challenging flexible layout reality.

To explore the possibilities and features of CSS Grid together, we’d love to invite you to a little contest. Because there’s nothing better to completely grasp a new technology as getting your hands dirty and playing with it, right?

Show your CSS Grid skills and, with a bit of luck, win a smashing prize.

The Challenge Link

Now, here’s the challenge: You create an interesting, accessible layout with CSS Grid, or use CSS Grid to rebuild an existing layout. What you design is entirely up to you. Feel free to use Flexbox additionally as well, e.g. as fallback for browsers not supporting CSS Grid. The only requirement is that the template you submit doesn’t break in IE9 and is still fully accessible in IE8. Deadline: September 30th.

At the end of the contest, all templates and layouts will be made available to everyone for free download under the MIT license. So you can use them for personal and commercial projects without any restrictions. The aim is to build a community repository full of CSS Grid goodness that inspires fellow developers and helps spread the wide adoption of CSS Grid.

So, What Can You Win? Link

After the deadline has ended, we’ll announce the lucky winners who’ll win a quite extraordinary smashing prize (and a couple of other Smashing extras, see below):

  • a round-trip flight to Barcelona, Spain,
  • full accommodation in a fancy hotel,
  • a ticket to the Smashing Conference Barcelona 20172,
  • a Smashing workshop of your choice,
  • a signed edition of our upcoming book Design Systems3 by Alla Kholmatova,
  • your very own Smashing caricature, designed just for you.

Getting Started With CSS Grid Link

Last but not least, before you dive right into the challenge, here are some helpful resources to kick-start your CSS Grid adventure.

Resources and References Link

Demos Link

Tutorials Link

Talks Link

Inspiration Link

Finally, to get your ideas flowing, some inspiring CodePen experiments that illustrate the magic of CSS Grid:

Responsive Magazine Layout16
Responsive Magazine Layout17 by Heather Buchel
Minimalistic CSS Grid Layout18
Minimalistic CSS Grid Layout19 by Nate Green
CSS Grid Layout and Comics20
CSS Grid Layout and Comics21 by Envato Tuts+
Auto Hexagonal CSS Grid Layout22
Auto Hexagonal CSS Grid Layout23 by Kseso
CSS Grid Layout with @support Flexbox Fallback24
CSS Grid Layout with @support Flexbox Fallback25 by Gustaf Holm
Image Areas in CSS Grid Layout26
Image Areas in CSS Grid Layout27 by Michael Gehrmann
Mondrian Art in CSS Grid28
Mondrian Art in CSS Grid29 by Jen Simmons
CSS Grid Layout Slideshow30
CSS Grid Layout Slideshow31 by Manoela Ilic

Join In! Link

Want to be a part of it? Great, we’d love to see what you’ll come up with!

  • Once you’ve completed your shiny CSS Grid layout, please send us a link to cssgrid@smashingmagazine.com (a CodePen link works just fine),
  • The deadline is September 30.

Ready to take on the challenge? Let’s go! We’re already looking forward to your submissions. Have fun!

Footnotes Link

  1. 1 https://hacks.mozilla.org/2017/06/new-css-grid-layout-panel-in-firefox-nightly/
  2. 2 http://smashingconf.com/barcelona-2017/
  3. 3 https://www.smashingmagazine.com/design-systems-book/
  4. 4 http://cssgridgarden.com/
  5. 5 https://github.com/rachelandrew/gridbugs
  6. 6 https://github.com/valentinogagliardi/awesome-css-grid
  7. 7 https://gridbyexample.com/
  8. 8 https://www.smashingmagazine.com/2016/11/css-grids-flexbox-box-alignment-new-layout-standard/
  9. 9 https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout
  10. 10 https://github.com/ademilter/chrome-css-grid-highlighter
  11. 11 http://labs.jensimmons.com/
  12. 12 https://codepen.io/collection/XRRJGq/
  13. 13 https://www.smashingmagazine.com/2017/06/building-production-ready-css-grid-layout/
  14. 14 https://www.smashingmagazine.com/2017/07/enhancing-css-layout-floats-flexbox-grid/
  15. 15 https://hackernoon.com/getting-started-with-css-grid-layout-8e00de547daf
  16. 16 https://codepen.io/hbuchel/pen/qOxGzW
  17. 17 https://codepen.io/hbuchel/pen/qOxGzW
  18. 18 https://codepen.io/nategreen/pen/GpRLXY
  19. 19 https://codepen.io/nategreen/pen/GpRLXY
  20. 20 https://codepen.io/tutsplus/pen/pNgZpj
  21. 21 https://codepen.io/tutsplus/pen/pNgZpj
  22. 22 https://codepen.io/Kseso/pen/xqNdmO
  23. 23 https://codepen.io/Kseso/pen/xqNdmO
  24. 24 https://codepen.io/primalivet/pen/ryjKmV
  25. 25 https://codepen.io/primalivet/pen/ryjKmV
  26. 26 https://codepen.io/g12n/pen/PPpGvL
  27. 27 https://codepen.io/g12n/pen/PPpGvL
  28. 28 https://codepen.io/jensimmons/pen/aNjXLz
  29. 29 https://codepen.io/jensimmons/pen/aNjXLz
  30. 30 https://tympanus.net/Development/GridLayoutSlideshow/
  31. 31 https://tympanus.net/Development/GridLayoutSlideshow/

↑ Back to topTweet itShare on Facebook

Dwelling On The Past: The Importance Of Project Retrospectives (Part 1)

Dwelling On The Past: The Importance Of Project Retrospectives (Part 1)

We should always look for opportunities to grow and improve. Retrospectives and reflections allow you to codify what you’ve learned from experience, to document mistakes and avoid future ones, and to increase your potential to grow in the future. Agile methodologies typically include time for retrospectives throughout a project. Regardless of your methodology, all teams would benefit from having a retrospective at the conclusion of a project.

Additionally, we can learn from our mistakes, identify what works well, and better understand ourselves through personal reflection. Retrospectives and reflections do not have to be time-consuming. I’ll show you a few approaches that you and your team can immediately incorporate into your practice.

I have found post-project retrospectives to be one of the most effective ways to grow as a professional. I see this in my design team colleagues as well. We’ll walk through post-project retrospectives in this first article. I have also seen evidence of the effectiveness of structured reflection for both personal and professional growth. In a second article, I will present some lessons learned and researched-backed techniques that those who wish to engage in reflection can attempt to include in their routine.

Defining Goals And Outcomes Link

Facilitation leads to better user experiences through smoother, more collaborative and more satisfying design processes. It also helps you understand how people work and how to work better with them. Read more →1

What Is A Retrospective? Link

A retrospective is a structured meeting to review the process and outcomes of a particular project. You can conduct a retrospective at any point in a project. If you practice agile principles, then you probably incorporate retrospectives after every couple of iterations (or sprints). However, everyone would benefit from a postmortem, or post-project retrospective, regardless of your specific design and development methodology.

Retrospectives do not require intense resources to plan or conduct. Some costs are associated with retrospectives, particularly with getting your team together to work on something that will pull them away from their projects. You will need to budget expenses for time if you work with contractors on your team. You will need to consider when to hold the retrospective; you don’t want to pull members away from other work at critical times or to disrupt their productivity.

The rewards of running effective retrospectives outweigh the costs. Effective retrospectives require a commitment to maintain an open mind and open communication with your team, as well as a willingness to be vulnerable. If you engage in retrospectives with these commitments, you can expect your team members to grow individually and as a group. You can expect your team and each member to better understand how to improve their process.

2
Engaging in retrospectives helps to finely tune your team. (Image: Wikimedia3)

What Isn’t A Retrospective? Link

Project retrospectives are an important component of healthily functioning teams. In order to fully benefit from retrospectives, you should keep in mind some limitations and guidelines:

  • Retrospectives do not replace communication or action taken to fix team or project issues at the time of occurrence.
  • Retrospectives are not an excuse to spend an hour complaining (although it is important to let some venting happen during the session).
  • Retrospectives are not an opportunity to lecture your team on what they could have done better. Ideally, you would be proactively coaching your team throughout the project.
  • Retrospectives should not be a huge burden on your time and resources. I recommend 60 to 90 minutes for reflection if you have a team of 5 or 6 people. This gives everyone ample time to discuss each of the broad themes we’ll cover later. This also forces people to be wise with the time they have during the retrospective.

Why Conduct A Retrospective? Link

Your team would benefit greatly from properly planned and executed retrospectives. We learn something new about ourselves, our product and our team in every project. We also risk losing this knowledge or failing to incorporate the lessons if we don’t engage in retrospectives. You codify the lessons learned when you conduct retrospectives. You solve team issues as a team.

Researchers have identified many benefits from software design and development teams engaging in project retrospectives (see the links at the bottom for references). Some of these benefits include:

  • ensuring that team members recognize and remember what they’ve learned,
  • allowing team members to share their experiences with each other,
  • identifying opportunities for the team to improve,
  • providing an opportunity to initiate change,
  • acknowledging what went well during a project.

Project retrospectives are a means to show your commitment to your team. When you engage in retrospectives, you are signalling to others that you take learning from experience seriously. You are telling the team that you understand that perfection isn’t possible; there is always something to learn from experience. You are prioritizing growth and learning over pushing out a product and moving on to the next challenge. Team morale and performance improve when you reflect these values.

Planning A Retrospective Link

Allow for sufficient time to plan your retrospective. Whoever is facilitating the session should have an idea of how the project went. They should have a few talking points for each area to be discussed, in case the conversation needs prompting.

I have participated in retrospectives facilitated by project managers, by team or project leaders and by managers. Appoint someone who has training in facilitating conversations. If you have a team member trained in agile methods, they are likely to have some training on running retrospectives. Regardless of who facilitates the session, they should have a neutral stance towards all of the information that members of the team present. They should be fair in how they run the meeting. They should not be someone in a position of power who might intimidate any team members from speaking up.

Team members should know, preferably at the beginning of the project, that a retrospective will be taking place. You can suggest to team members to keep logs or make diary-type entries in a notebook or online in order to keep track of how they feel about the project as it unfolds. It’s difficult to recall specific things that worked well or that needed improvement at the end of a project. Proactively logging one’s experience helps to avoid this.

Your team’s logs could look similar to the prompts used during a retrospective:

Project Name and Date
What’s working well? Notes
We are all on the same page with the work being done. We frequently meet internally to discuss who is doing what. We are keeping our sprint backlog up to date.
What isn’t working well? Notes
The client has complained that communication isn’t streamlined. We were given multiple points of contact (PoC) at the kickoff meeting. We have had trouble getting replies from one of them. Maybe this is why.
How could we improve? Notes
Reduce the number of people we are going through to get permission. Determine who needs to be contacted and what we need to contact them about. We need to determine a single PoC for our team and their team. The client feels that not all of their team needs to be involved in our communication.

Most retrospectives require very few resources to be planned. At a basic level, you can conduct a retrospective with a comfortable meeting room, a whiteboard, dry-erase markers (at least three different colors), a conference-call line, and screen-sharing software or video (for remote team members to participate). Finding a time that works for all team members can be the most difficult part of planning a retrospective.

Whiteboard and dry-erase markers4
Conducting a retrospective does not require a lot of resources. (Image: StartupStockPhotos5) (View large version6)

Below are some specific steps to take to plan your retrospective. Incorporate others as relevant.

Preparing as a Facilitator Link

Determine your list of participants; make sure everyone involved is invited (even remote folks!). Your retrospective is only as good as the people you include. It would be more effective if everyone who has been involved in the project is invited to attend. Perhaps one designer took over for another designer halfway through the project — invite them both. You would benefit from understanding how the transition went, from the viewpoint of both the designer who started on the project and the one who took over. You would benefit from a deeper understanding of the bumps along the road if you include people who were a part of the process in unique ways. However, including some people might not be necessary if their role was extremely limited.

Remote staff are critical to a project retrospective. These team members have a unique perspective. You’ll want to know whether they felt included and actively engaged with their on-site colleagues. You’ll also want to know whether they have suggestions to make their lives easier as remote staff. Likewise, your on-site staff should have a voice regarding what it felt like to work with remote staff and any suggestions they have to improve collaboration with remote team members. We often include video options such as WebEx or FaceTime on iPads to give our remote staff a greater presence at retrospectives.

Ask your team to review their notes and come with the following input:

  • What went well

    For example, “Good communication between research, design and development throughout the project.”
  • What didn’t go well

    For example, “Finalization of deliverables felt rushed throughout the project.”
  • How to fix it

    For example, “Clearly state deadlines throughout the project; have frequent progress check-ins; build in time to review deliverables so that changes can be made.”

Have your team do this prior to the retrospective. You don’t want to put your team on the spot in the meeting. Be clear in the invitation about what the topics of discussion will be. Also, be clear that everyone attending is expected to participate in the discussion.

Reach out to see who is going to say what. You don’t want to get blindsided during the retrospective. You need to know whether something major happened that is going to lead to a longer discussion, in which case you’ll need to plan the right amount of time for that discussion. You also want to try to defuse anything that might seem personal prior to the session. Likewise, if you find that no one has anything critical to say about the project, then you might encourage them to think of some things they could mention.

Important: The point here is not to reach out to argue with team members you don’t agree with, but to have an idea of what folks are going to bring up. Take action prior to the retrospective only if absolutely necessary. You aren’t doing it right if team members feel shut down prior to the session.

Determine your assessment of the project. You should know where the project succeeded and where the project fell short, according to your expectations and performance indicators. You can use these to focus the conversation and to support any arguments made for or against certain issues in the project.

Make the retrospective a celebration of your team. Provide food and drink or some type of treats. Team members will appreciate the effort to create a positive atmosphere, and it will reduce the potential distractions of hunger and thirst.

Preparing as a Participant Link

A retrospective participant shouldn’t have to invest much time preparing. But coming to the session prepared is important. I’ve suggested keeping a log or journal noting how the project unfolded. You can use this yourself as part of your preparation for the retrospective. Come up with a list of three or four things that went well in the project, and three or four things that could have gone better.

Once you’ve refined the list, make sure you haven’t created a list of gripes and personal complaints. Those are valid, but they don’t serve to create a positive retrospective. Resolve any personal issues you’ve had with team members in a more appropriate setting than a retrospective. Convert gripes into problem statements that you can then use to identify solutions in the retrospective.

Conducting A Project Retrospective Link

Many resources are available for conducting a retrospective. Esther Derby provides a five-step approach for retrospectives7 in Scrumpedia. Although the focus is on two-week retrospectives, you can use the same steps for a post-project retrospective. Derby’s steps include: (1) set the stage, (2) gather data, (3) generate insights, (4) decide what to do, and (5) close the retrospective.

Elise Keith presents a three-step process on the Lucid Meetings Blog8: (1) review the project, (2) discuss what worked well and what didn’t, and (3) action planning: identify specific ways to improve future work.

Norman Kerth’s handbook on project retrospectives9 provides four questions to guide a retrospective: (1) What did we learn? (2) What should we do differently next time? (3) What did we do well? (4) What still puzzles us?

There isn’t one right way to do a retrospective. A quick search on Google yields dozens more articles on how to conduct a retrospective. Below, I discuss some key features that every retrospective needs to include.

Managing Discussion Link

Time management is critical for a successful retrospective. You run the risk of having to cut people off if you don’t schedule enough time. You run the risk of people losing interest if your meeting is too long.

Allow discussion to occur when necessary, but with a focus on the solution. You will often find that people agree in a number of areas. For example, everyone might think the project’s timeline was too tight. You can save time by asking people to indicate their agreement with something stated and not bring it up again when it’s their turn.

Be aware of the order you expect people to speak. You can determine the order at random by assigning everyone a number and drawing from a hat. You might want to use a predetermined order based on your awareness of the reality. For example, you might want to encourage junior staff to contribute their own ideas and ask them to go first to discourage them from echoing what senior staff say.

Create a Safe Atmosphere for Sharing Link

This is the most important step. Your retrospectives are worthless if people are not comfortable sharing their true thoughts and feelings. The facilitator should make it immediately clear to participants that everyone’s viewpoint needs to be respected. Ground rules should be set: no confrontational comments or personal attacks, but also no sugarcoating problems.

There will be situations in which specific aspects that need improvement are related to the attitude or skills of an individual team member. I encourage managers or team leads to find ways to have this discussion individually, outside of the retrospective.

On the other hand, if there is an issue related to an individual making decisions that didn’t work out, that’s appropriate to discuss as a group. You can approach these types of situations in a less threatening way by referring to the group rather than the individual. For example, rather than saying, “Victor dragged his feet with starting to recruit people to participate in research, so we fell behind schedule,” you could say, “We thought it would be a good idea to hold off on identifying our research participants, but this led to us falling behind schedule.” This allows the discussion to lead to the conclusion that the person in charge of recruitment should be more proactive about scheduling in the future.

Your retrospective should take place in a comfortable setting, with ample time set aside for attendees to provide feedback. You could consider holding the retrospective off site, in order to put participants at ease.

Create Ownership Link

The project team owns the result of the project. They also own the quality of the retrospective and the ideas coming from it. Challenge your team to constantly improve. You are the facilitator, but the team is tasked with solving issues that arose during the project.

Don’t excuse areas where improvement can be found. For example, if your team struggled with fitting in all the project tasks in a timely manner, don’t provide the excuse that many team members were busy on multiple projects. Instead, push for how to better provide a balance among team members’ duties and other obligations.

Document Everything, Even If Only One Person Says It Link

Ensuring that everyone has a voice is a part of the purpose of a retrospective. You don’t need to gain a consensus on every item someone brings up. You show respect for the individual experience when you acknowledge everyone’s thoughts. You gain buy-in and trust when you do this. Documenting thoughts on the white board allows everyone to see what was said and enables you to track what has been said.

Celebrate the Good Link

Everyone should have something positive to say, even if it’s just “Hey, everyone is alive!” Your team likely contains a mix of personalities. You help to create a positive vibe for the whole group when you call out people for jobs well done and congratulate those who made progress and accomplishments over the course of the project. You also increase team members’ receptiveness to criticism when you provide positive feedback in a retrospective. Did anyone get a promotion during the project? Celebrate that. Did anyone gain a new skill or tool? Celebrate that. Find things to celebrate.

Discuss What Worked Well Link

Do you want the good news first or the bad news? My preference is the good news. We often have much longer discussions about what didn’t work so well for our projects. You don’t want to run out of time and not talk about what worked. Discuss what worked before discussing what your team could have done better.

Discuss What Didn’t Work Link

You’re rarely perfect. Even in a feel-good project, you can find areas to improve. Often, you’ll identify areas around communication that could use tweaking. At one point during an otherwise smooth-running project, I called a meeting to review how we were incorporating research findings into our design concepts. My managing director said something like, “Now let’s hear what development has to say.” I had forgotten to include anyone from development in the meeting, so there was no response. Actually, I hadn’t even thought of the need to include development — we were talking about design and research, right? I had become complacent at that point in the project, forgetting to include key team members in a meeting. We discussed why this happened and the need to invite people to our retrospective throughout the duration of the project.

Identify a Specific Path to Improvement Link

Your team should engage in dialogue to identify possible remedies for the areas in need of improvement. The solutions should be as specific as possible. For example, instead of saying “Invite everyone relevant to each meeting,” say “Invite representatives from every discipline (research, design, development and engagement) to each meeting.” Instead of saying “Begin the process of recruiting research participants earlier,” say “Draft the recruitment screener and email prior to the kickoff meeting, and send the recruitment email immediately following the kickoff meeting, or earlier if possible.”

Come to a Conclusion Link

A project retrospective is meant to be all-encompassing. Cover the project from start to finish, major milestones and deliverables and all other aspects relevant to the project. Your team should feel that they’ve put everything out and had it recorded on the white board. Any issues should have solutions identified. No one should leave the retrospective feeling they didn’t have a chance to participate fully. No issue should be left unresolved, or at least not without a concrete timeline for you to come back to address it.

Post-Retrospective Link

You’ll need to go beyond the retrospective to fully realize its benefit. Document every retrospective and the outcomes your team agreed on. Include a list of who attended, the purpose of the project and any other details to explain the context of the retrospective. You will look back on these at a time when the project will not be as clear in your memory as it is immediately following the retrospective.

You don’t need to do anything time-consuming to document the session. We typically write out everything from the session on a white board. The facilitator takes pictures of the white board and later transfers the information into a document. You can use a simple chart to record what was said:

What worked well? What didn’t work well? Specific steps to improve

Retrospectives become wonderful data points for tracking a team’s progress. Proactively remind your team members of what was agreed upon in the retrospective, and ask them to show evidence that they’ve followed through on any solutions proposed. Track your retrospectives across time to see whether what was in the “Needs improvement” column eventually moves out or even into the “What worked well” column. If you see that the same items continue to find their way into the “Needs improvement” column, then your solutions either aren’t effective or aren’t being implemented. Create a spreadsheet with different tabs based on the projects completed. Record the results of each project’s retrospective in a separate tab. This allows you to consolidate your retrospectives in a way that makes it easy to review progress.

Save the tracking spreadsheet to a storage space that all staff can access. Another benefit of tracking retrospectives is the opportunity to implement successful improvements across projects. You won’t always have the same team members in every project. You can disseminate your findings to the broader team when you track retrospectives. If a solution to a problem in project A is successful, you could try implementing the same solution if you see the issue pop up in a retrospective for project B. You avoid having to reinvent the wheel this way. Similarly, you can avoid solutions that don’t work for problems that reappear in other projects in the future.

A chart showing an increase in performance10
Tracking retrospectives enables you to observe the team’s performance over time. (Image: janjf9311) (View large version12)

So, you’ve conducted a few retrospectives and seen growth. You can call it quits, right? No. Your team members will change over time. Your projects will change in complexity and purpose. By making project retrospectives a standard part of your practice, you reduce volatility and continue on the path of growth.

Case Study: Using Retrospectives With The Same Team Across One Year Of Projects Link

I had a unique opportunity to serve as a core member of a team that spent a year working together on various projects. I served as the lead researcher for each project. The lead designer and lead developer also remained consistent for each project. Our usual model for staffing projects does not specify that teams should stay the same, so this was an experiment.

We conducted a retrospective at the end of each project. At the end of the year, we realized that issues we identified as “What didn’t work well” in earlier projects had moved to the “What worked well” column in later projects. We used this information to create a list of best practices.

Our managing director led the retrospectives. She had played an oversight role for all of the projects, so she had a working knowledge of the topics, successes and challenges we faced. The bulk of each retrospective was spent answering the questions:

  • What worked well?
  • What didn’t work well?
  • What specific ways can we improve our future work?

I’m going to focus on real examples of what came up during our retrospectives. For the sake of brevity, I’m going to provide only a few examples. Our actual lists for each question listed above were extensive. I’ve added highlights to track the progression of issues whose status changed over the course of multiple projects. Each highlight color corresponds to a particular issue as it was tracked across retrospectives.

Project A Link

What worked well? What didn’t work well? Ways to improve
Client working session at our studio Research participant recruitment began too late. We relied on the client to recruit participants due to the sensitive nature of their relationship with users. • Emphasize the importance of clients beginning recruitment ASAP during kickoff meeting.

• Draft recruitment email and send to client for use immediately following kickoff meeting.
Research findings integrated seamlessly into design concepts. Transition to visual design was difficult. Visual design needs were minimal; we waited to identify a visual designer until the project was half-finished. Look for additional opportunities to have clients visit our studio.
Technology assessment findings and user research findings were presented as separate sections. (Would prefer to have seamless presentation of all research and to have tech assessment themes align with user research themes where possible.) Technology and research to meet to integrate findings better into final report.

Project A’s retrospective identified a number of things our team had done well. Specifically, we held a client working session at our studio that went very well and that helped to set up a great final presentation. We continued to look for these opportunities as a way to document their importance.

We also identified three specific issues that could have been better executed on:

  • We were relying on the client to recruit research participants due to the user types we needed access to. Our client had not begun the process of recruiting participants when the project kicked off. This led to a delay in starting the research according to the initial timeline.
  • We limited the involvement of the visual designer until it was absolutely necessary. This was not ideal — the visual designer didn’t have insight into the reasoning for certain design decisions, and getting everyone on the same page took longer, which led to personal frustration for the visual designer assigned to the project.
  • Our technology assessment was presented separate from our research findings, which felt disjointed. This aligned with how we traditionally reported these findings. However, we felt we could challenge ourselves to evolve.

Working as a group, we came up with a list of potential ways to improve on these three areas. Our managing director documented the retrospective and preserved our takeaways in a brief report that we were able to access through our shared storage.

Project B Link

What worked well? What didn’t work well? Ways to improve
Client working session at our studio Research participant recruitment began too late. We relied on the client to recruit participants due to the sensitive nature of their relationship with users. • Emphasize the importance of clients beginning recruitment in pre-kickoff phone call.

• Draft recruitment email and send to client prior to the kickoff meeting.
Seamless transition between all project phases and disciplines. Technology assessment findings and user research findings were presented together, but themes felt disconnected. Technology and research teams work together throughout project to ensure alignment on research themes.

Project B’s retrospective identified that we had done a better job of identifying who would be involved from all disciplines from the start of the project. This led to a sense that the project unfolded seamlessly as we went from research to design and then development.

We also realized that we still fell short of completely resolving two of our previous issues:

  • We were relying on the client to recruit research participants due to the user types we needed access to. Our client had not begun the process of recruiting participants when the project kicked off. This led to a delay in starting the research according to the initial timeline.

We had attempted to address this issue by coming to the kickoff meeting prepared with some of the critical items that we knew our clients would need in order to recruit participants.

  • Technology assessment findings and user research findings were presented together, but the themes felt disconnected.

We improved on this issue between project A and project B, but we didn’t feel we had completely addressed it. The technology assessment findings were presented alongside the user research in the “Research findings” section, yet the themes remained distinct.

Working as a group, we came up with a list of potential ways to improve on these three areas. Our managing director documented the retrospective and preserved our takeaways in a brief report that we were able to access through our shared storage.

Project C Link

What worked well? What didn’t work well? Ways to improve
Client working session at our studio Staff vacations overlapped key meetings and dates. • Avoid overlap between team member vacations and key project dates.

• Identify potential substitutes ASAP for vacation coverage, preferably at the start of the project or as soon as vacation is known about.
Seamless transition between all project phases and disciplines. Create and implement guidelines for information shared during pre-kickoff calls, so that future projects benefit.
Pre-kickoff phone call alleviated issues of time with user recruitment. Continue pre-kickoff calls.
Research, design and technology themes presented seamlessly. Continue involving technology team in analysis of research from the beginning.

Project C was when our team really started to gel. This also marked six months of working together as a stable core team. We’d had time to learn how each other works and to support each other better. We were able to move both of the issues identified as “not working well” in project B to the “worked well” column in project C.

We had refined our process to the point that we were identifying the minor bumps that can arise over the course of a project as the ones we needed to focus on for improvement in future. We would not have been able to get to this point without conducting retrospectives after each project. Retrospectives enabled us to focus on what we were doing well in order to make sure we kept doing those things. We were also able to identify issues in need of improvement, with specific potential solutions to implement in the next project.

We did not achieve perfection by the end of our year-long experiment. But we did refine our process to the point that we had gotten beyond simply meeting our key performance indicators. We were actively looking for opportunities to implement better solutions; we were able to accomplish more, faster and with fewer resources; and we had developed positive healthy working relationships across the team.

Conclusion Link

You will find many potential benefits from conducting project retrospectives. You don’t need to invest a lot of time or money in them. There is no one-size-fits-all approach. I’ve given you some of the lessons I’ve learned as both a participant and a facilitator of retrospectives in digital design projects. Feel free to try what you want, and only use what works well for your team and situation.

However, we don’t always have the luxury of working in teams or having team retrospectives. I’ll focus on personal reflection in the second article of this two-part series. I’ll provide examples of written and verbal reflection that practitioners and students can apply to grow both personally and professionally.

Stay tuned!

References Link

  1. 1 https://www.smashingmagazine.com/2017/01/becoming-better-facilitator/
  2. 2 https://www.smashingmagazine.com/wp-content/uploads/2017/08/Gears-800w-opt.jpg
  3. 3 https://commons.wikimedia.org/wiki/File:Reduction_Gear.jpg
  4. 4 https://www.smashingmagazine.com/wp-content/uploads/2017/08/tools-large-opt.jpg
  5. 5 https://pixabay.com/p-593370/?no_redirect
  6. 6 https://www.smashingmagazine.com/wp-content/uploads/2017/08/tools-large-opt.jpg
  7. 7 http://scrumpedia.com/articles/a_five-step_approach_to_retrospectives
  8. 8 http://blog.lucidmeetings.com/blog/how-to-lead-a-successful-project-retrospective-meeting
  9. 9 https://www.amazon.com/Project-Retrospectives-Handbook-Team-Reviews/dp/0932633447/ref=sr_1_1?ie=UTF8&qid=1327347085&sr=8-1
  10. 10 https://www.smashingmagazine.com/wp-content/uploads/2017/08/Progress-large-opt.png
  11. 11 https://pixabay.com/en/graphic-progress-chart-1714230/
  12. 12 https://www.smashingmagazine.com/wp-content/uploads/2017/08/Progress-large-opt.png
  13. 13 https://www.idi.ntnu.no/~dingsoyr/ieee_software2002_birk_dingsoyr_stalhane_postmortem_never_leave_a_project_without_it.pdf
  14. 14 http://www.pinnacleprojects.com/index.php/project-retrospectives
  15. 15 http://misqe.org/ojs2/index.php/misqe/article/view/85&lt;/ee&gt

↑ Back to topTweet itShare on Facebook