Everyone is familiar with .com and .net, but did you know you get your own free .design domain?
Because it’s a fairly new domain, there are still plenty of short .design names available. So the good news is, you can shorten or improve your existing branding by switching to the .design domain. Eg. johnsmithdesign.com -> johnsmith.design
You can also get your own unique email address such as hola@yourname.design or you can even use it as a clever redirect to another site, like a Behance profile.
Get Your FREE .design Domain
We have teamed up with Porkbun to offer all Webdesigner Depot subscribers a free .design domain name. The first year is free, and yearly renewals will be just $35 instead of the $70 offered at some registrars.
You also get:
Free email hosting – you can add an email address (or multiple addresses!) that matches your domain name. For example, anne@goldsmith.design or info@goldsmith.design, or any other name you want.
SSL Security – An SSL certificate will encrypt your visitors’ sensitive data, and also display your site with “HTTPS” in your address bar, which will let visitors know that you’ve made their security your top priority. You’ll also avoid the “NOT SECURE” label from Google.
Free WHOIS Privacy – Your contact information will be private, and protected forever. Other registrars charge you for this. PorkBun won’t.
Free website builder – If you want to build your .design website with no code, you can build it for free using their site builder, powered by Weebly. And with this option you don’t have to pay for website hosting.
Free domain connection – Whether you built your website (or plan to build it) with other services like WIX, SquareSpace, or Weebly, you can easily connect your .design domain to your website platform. Your website content will stay exactly the same, but you’ll have a modern .design domain name for your website to show off!
Here’s your chance to get a free website domain name that reflects what you do and helps you showcase your work.
Date is weird in JavaScript. It gets on our nerves so much that we reach for libraries (like Date-fns and Moment) the moment (ha!) we need to work with date and time.
But we don’t always need to use libraries. Date can actually be quite simple if you know what to watch out for. In this article, I’ll walk you through everything you need to know about the Date object.
First, let’s acknowledge the existence of timezones.
Timezones
There are hundreds of timezones in our world. In JavaScript, we only care about two—Local Time and Coordinated Universal Time (UTC).
Local time refers to the timezone your computer is in.
UTC is synonymous with Greenwich Mean Time (GMT) in practice.
By default, almost every date method in JavaScript (except one) gives you a date/time in local time. You only get UTC if you specify UTC.
With this, we can talk about creating dates.
Creating a date
You can create a date with new Date(). There are four possible ways to use new Date():
With a date-string
With date arguments
With a timestamp
With no arguments
The date-string method
In the date-string method, you create a date by passing a date-string into new Date.
new Date('1988-03-21')
We tend towards the date-string method when we write dates. This is natural because we’ve been using date strings all our lives.
If I write 21-03-1988, you have no problems deducing it’s 21st of March, 1988. Yeah? But if you write 21-03-1988 in JavaScript, you get Invalid Date.
There’s a good reason for this.
We interpret date strings differently in different parts of the world. For example 11-06-2019 is either 11th June, 2019 or 6th November 2019. But you can’t be sure which one I’m referring to, unless you know the date system I’m using.
In JavaScript, if you want to use a date string, you need to use a format that’s accepted worldwide. One of these formats is the ISO 8601 Extended format.
// ISO 8601 Extended format
`YYYY-MM-DDTHH:mm:ss:sssZ`
Here’s what the values mean:
YYYY: 4-digit year
MM: 2-digit month (where January is 01 and December is 12)
DD: 2-digit date (0 to 31)
-: Date delimiters
T: Indicates the start of time
HH: 24-digit hour (0 to 23)
mm: Minutes (0 to 59)
ss: Seconds (0 to 59)
sss: Milliseconds (0 to 999)
:: Time delimiters
Z: If Z is present, date will be set to UTC. If Z is not present, it’ll be Local Time. (This only applies if time is provided.)
Hours, minutes, seconds and milliseconds are optional if you’re creating a date. So, if you want to create a date for 11th June 2019, you can write this:
new Date('2019-06-11')
Pay special attention here. There’s a huge problem with creating dates with date strings. You can spot the problem if you console.log this date.
If you live in an area that’s behind GMT, you’ll get a date that says 10th June.
If you live in an area that’s ahead of GMT, you’ll get a date that says 11th June.
This happens because the date-string method has a peculiar behavior: If you create a date (without specifying time), you get a date set in UTC.
In the above scenario, when you write new Date('2019-06-11'), you actually create a date that says 11th June, 2019, 12am UTC. This is why people who live in areas behind GMT get a 10th June instead of 11th June.
If you want to create a date in Local Time with the date-string method, you need to include the time. When you include time, you need to write the HH and mm at a minimum (or Google Chrome returns an invalid date).
new Date('2019-06-11T00:00')
The whole Local Time vs. UTC thing with date-strings can be a possible source of error that’s hard to catch. So, I recommend you don’t create dates with date strings.
(By the way, MDN warns against the date-string approach since browsers may parse date strings differently).
If you want to create dates, use arguments or timestamps.
Creating dates with arguments
You can pass in up to seven arguments to create a date/time.
Year: 4-digit year.
Month: Month of the year (0-11). Month is zero-indexed. Defaults to 0 if omitted.
Day: Day of the month (1-31). Defaults to 1 if omitted.
Hour: Hour of the day (0-23). Defaults to 0 if omitted.
Minutes: Minutes (0-59). Defaults to 0 if omitted.
Seconds: Seconds (0-59). Defaults to 0 if omitted.
Milliseconds: Milliseconds (0-999). Defaults to 0 if omitted.
// 11th June 2019, 5:23:59am, Local Time
new Date(2019, 5, 11, 5, 23, 59)
Many developers (myself included) avoid the the arguments approach because it looks complicated. But it’s actually quite simple.
Try reading numbers from left to right. As you go left to right, you insert values in decreasing magnitude: year, month, day, hours, minutes, seconds, and milliseconds.
new Date(2017, 3, 22, 5, 23, 50)
// This date can be easily read if you follow the left-right formula.
// Year: 2017,
// Month: April (because month is zero-indexed)
// Date: 22
// Hours: 05
// Minutes: 23
// Seconds: 50
The most problematic part with Date is that the Month value is zero-indexed, as in, January === 0, February === 1, March === 2 and so on.
We have no idea why month in JavaScript is zero-indexed, but it is. Rather than argue about why January should be 1 (and not 0), it’s better to accept that month is zero-indexed in JavaScript. Once you accept this fact, dates become much easier to work with.
Here are some more examples for you to familiarize yourself:
// 21st March 1988, 12am, Local Time.
new Date(1988, 2, 21)
// 25th December 2019, 8am, Local Time.
new Date(2019, 11, 25, 8)
// 6th November 2023, 2:20am, Local Time
new Date(2023, 10, 6, 2, 20)
// 11th June 2019, 5:23:59am, Local Time
new Date(2019, 5, 11, 5, 23, 59)
Notice dates created with arguments are all in Local Time?
That’s one of the perks of using arguments—you won’t get confused between Local Time and UTC. If you ever need UTC, you create a date in UTC this way:
// 11th June 2019, 12am, UTC.
new Date(Date.UTC(2019, 5, 11))
Creating dates with timestamps
In JavaScript, a timestamp is the amount of milliseconds elapsed since 1 January 1970 (1 January 1970 is also known as Unix epoch time). From my experience, you rarely use timestamps to create dates. You only use timestamps to compare between different dates (more on this later).
// 11th June 2019, 8am (in my Local Time, Singapore)
new Date(1560211200000)
With no arguments
If you create a date without any arguments, you get a date set to the current time (in Local Time).
new Date()
You can tell from the image that it’s 25th May, 11:10am in Singapore when I wrote this article.
Summary about creating dates
You can create date with new Date().
There are four possible syntaxes:
With a date string
With arguments
With timestamp
With no arguments
Never create a date with the date string method.
It’s best to create dates with the arguments method.
Remember (and accept) that month is zero-indexed in JavaScript.
Next, let’s talk about converting a date into a readable string.
Formatting a date
Most programming languages give you a formatting tool to create any Date format you want. For example, in PHP, you can write date("d M Y") to a date like 23 Jan 2019.
But there’s no easy way to format a date in JavaScript.
The native Date object comes with seven formatting methods. Each of these seven methods give you a specific value (and they’re quite useless).
const date = new Date(2019, 0, 23, 17, 23, 42)
toString gives you Wed Jan 23 2019 17:23:42 GMT+0800 (Singapore Standard Time)
toDateString gives you Wed Jan 23 2019
toLocaleString gives you 23/01/2019, 17:23:42
toLocaleDateString gives you 23/01/2019
toGMTString gives you Wed, 23 Jan 2019 09:23:42 GMT
toUTCString gives you Wed, 23 Jan 2019 09:23:42 GMT
toISOString gives you 2019-01-23T09:23:42.079Z
If you need a custom format, you need to create it yourself.
Writing a custom date format
Let’s say you want something like Thu, 23 January 2019. To create this value, you need to know (and use) the date methods that comes with the Date object.
To get dates, you can use these four methods:
getFullYear: Gets 4-digit year according to local time
getMonth: Gets month of the year (0-11) according to local time. Month is zero-indexed.
getDate: Gets day of the month (1-31) according to local time.
getDay: Gets day of the week (0-6) according to local time. Day of the week begins with Sunday (0) and ends with Saturday (6).
It’s simple to create 23 and 2019 for Thu, 23 January 2019. We can use getFullYear and getDate to get them.
const d = new Date(2019, 0, 23)
const year = d.getFullYear() // 2019
const date = d.getDate() // 23
It’s harder to get Thu and January.
To get January, you need to create an object that maps the value of all twelve months to their respective names.
Yes, it tedious. But it’s not impossible once you get the hang of it.
If you ever need to create a custom-formatted time, you can use the following methods:
getHours: Gets hours (0-23) according to local time.
getMinutes: Gets minutes (0-59) according to local time.
getSeconds: Gets seconds (0-59) according to local time.
getMilliseconds: Gets milliseconds (0-999) according to local time.
Next, let’s talk about comparing dates.
Comparing dates
If you want to know whether a date comes before or after another date, you can compare them directly with >, <, >= and <=.
const earlier = new Date(2019, 0, 26)
const later = new Date(2019, 0, 27)
console.log(earlier < later) // true
It’s more difficult if you want to check if two dates fall exactly at the same time. You can’t compared them with == or ===.
const a = new Date(2019, 0, 26)
const b = new Date(2019, 0, 26)
console.log(a == b) // false
console.log(a === b) // false
To check whether two dates fall exactly at the same time, you can check their timestamps with getTime.
const isSameTime = (a, b) => {
return a.getTime() === b.getTime()
}
const a = new Date(2019, 0, 26)
const b = new Date(2019, 0, 26)
console.log(isSameTime(a, b)) // true
If you want to check whether two dates fall on the same day, you can check their getFullYear, getMonth and getDate values.
const isSameDay = (a, b) => {
return a.getFullYear() === b.getFullYear() &&
a.getMonth() === b.getMonth() &&
a.getDate()=== b.getDate()
}
const a = new Date(2019, 0, 26, 10) // 26 Jan 2019, 10am
const b = new Date(2019, 0, 26, 12) // 26 Jan 2019, 12pm
console.log(isSameDay(a, b)) // true
There’s one final thing we have to cover.
Getting a date from another date
There are two possible scenarios where you want to get a date from another date.
Set a specific date/time value from another date.
Add/subtract a delta from another date.
Setting a specific date/time
You can use these methods to set a date/time from another date:
setFullYear: Set 4-digit year in Local Time.
setMonth: Set month of the year in Local Time.
setDate: Set day of the month in Local Time.
setHours: Set hours in Local Time.
setMinutes: Set minutes in Local Time.
setSeconds: Set seconds in Local Time.
setMilliseconds: Set milliseconds in Local Time.
For example, if you want to set a date to the 15th of the month, you can use setDate(15).
const d = new Date(2019, 0, 10)
d.setDate(15)
console.log(d) // 15 January 2019
If you want to set the month to June, you can use setMonth. (Remember, month in JavaScript is zero-indexed!)
const d = new Date(2019, 0, 10)
d.setMonth(5)
console.log(d) // 10 June 2019
Note: The setter methods above mutate the original date object. In practice, we should not mutate objects (more on why here). We should perform these operations on a new date object instead.
const d = new Date(2019, 0, 10)
const newDate = new Date(d)
newDate.setMonth(5)
console.log(d) // 10 January 2019
console.log(newDate) // 10 June 2019
Adding/Subtracting delta from another date
A delta is a change. By adding/subtracting delta from another date, I mean this: You want to get a date that’s X from another date. It can be X year, X month, X day, etc.
To get a delta, you need to know the current date’s value. You can get it using these methods:
getFullYear: Gets 4-digit year according to local time
getMonth: Gets month of the year (0-11) according to local time.
getDate: Gets day of the month (1-31) according to local time.
getHours: Gets hours (0-23) according to local time.
getMinutes: Gets minutes (0-59) according to local time.
getSeconds: Gets seconds (0-59) according to local time.
getMilliseconds: Gets milliseconds (0-999) according to local time.
There are two general approaches to add/subtract a delta. The first approach is more popular on Stack Overflow. It’s concise, but harder to grasp. The second approach is more verbose, but easier to understand.
Let’s go through both approaches.
Say you want to get a date that’s three days from today. For this example, let’s also assume today is 28 March 2019. (It’s easier to explain when we’re working with a fixed date).
The first approach (the set approach)
// Assumes today is 28 March 2019
const today = new Date(2019, 2, 28)
First, we create a new Date object (so we don’t mutate the original date)
const finalDate = new Date(today)
Next, we need to know the value we want to change. Since we’re changing days, we can get the day with getDate.
const currentDate = today.getDate()
We want a date that’s three days from today. We’ll use add the delta (3) to the current date.
finalDate.setDate(currentDate + 3)
Full code for the set approach:
const today = new Date(2019, 2, 28)
const finalDate = new Date(today)
finalDate.setDate(today.getDate() + 3)
console.log(finalDate) // 31 March 2019
The second approach (the new Date approach)
Here, we use getFullYear, getMonth, getDate and other getter methods until we hit the type of value we want to change. Then, we use create the final date with new Date.
const today = new Date(2019, 2, 28)
// Getting required values
const year = today.getFullYear()
const month = today.getMonh()
const day = today.getDate()
// Creating a new Date (with the delta)
const finalDate = new Date(year, month, day + 3)
console.log(finalDate) // 31 March 2019
Both approaches work. Choose one and stick with it.
Automatic date correction
If you provide Date with a value that’s outside of its acceptable range, JavaScript recalculates the date for you automatically.
Here’s an example. Let’s say we set date to 33rd March 2019. (There’s no 33rd March on the calendar). In this case, JavaScript adjusts 33rd March to 2nd April automatically.
// 33rd March => 2nd April
new Date(2019, 2, 33)
This means you don’t need to worry about calculating minutes, hours, days, months, etc. when creating a delta. JavaScript handles it for you automatically.
// 33rd March => 2nd April
new Date(2019, 2, 30 + 3)
And that’s everything you need to know about JavaScript’s native Date object.
Interested to learn more JavaScript?
If you found this intro to Date useful, you might love Learn JavaScript, a course I created to teach people everything they need to know about JavaScript.
In the course, I cover the basic concepts of what you need to know, then I show you how to use the concepts you learned to build real-world components.
(This is a sponsored article.) One of the cool things about accessibility is that it forces you to see and think about your application beyond the typical sighted, mouse-based user experience. Users who navigate via keyboard only (KO) and/or assistive technology (AT) are heavily dependent not only on your application’s information architecture being thoughtful, but the affordances your application makes for keeping the experience as straightforward as possible for all types of users.
In this article, we’re going to go over a few of those affordances that can make your KO/AT user experiences better without really changing the experience for anyone else.
Additions To Your Application’s UX
These are features that you can add to your application to improve the UX for KO/AT users.
Skip Links
A skip link is a navigation feature that invisibly sits at the top of websites or applications. When it is present, it is evoked and becomes visible on your application’s first tab stop.
A skip link allows your user to “skip” to various sections of interest within the application without having to tab-cycle to it. The skip link can have multiple links to it if your application has multiple areas of interest you feel your users should have quick access to your application’s point of entry.
For KO/AT users, this is a helpful tool to both allow them to rapidly traverse your app and can help orient them to your application’s information architecture. For all other users, they likely will never even know this feature exists.
Here‘s an example with how we handle skip links. After you click the link, hit Tab ? and look in the upper-left corner. The skip link has two links: Main Content and Code Samples. You can use Tab ? to move between them, hit Enter to navigate to the link.
Shortcuts/Hotkey Menus
This is a feature that I think everyone is familiar with: shortcuts and hotkeys. You’ve likely used them from time to time, they are very popular amongst power users of an application, and come in a variety of incarnations.
For KO/AT users, shortcuts/hotkeys are invaluable. They allow them to use the applications, as intended, without having to visually target anything or tab through the application to get to an element or content. While frequent actions and content are always appreciated when represented in a shortcut/hotkey menu, you may also want to consider some slightly less frequent actions that may be buried in your UI (for good reason) but are still something that a user would want to be able to access.
Making shortcuts for those functions will be extremely helpful to KO/AT users. You can make the command a bit more involved, such as using (3) keystrokes to evoke it, to imply it’s a less frequently used piece of functionality. If you have a shortcut/hotkey menu make sure to find a way to promote it in your applications so your users, especially your KO/AT users, can find it and use it effectively.
User Education
User education refers to a piece of functionality that directs the users on what to do, where to go, or what to expect. Tooltips, point outs, info bubbles, etc. are all examples of user education.
One thing you should ask yourself when designing, placing, and/or writing copy for your user education is:
“If I couldn’t see this, would it still be valuable to understand ______?”
Many times it’s just reorienting the user education through that lens that can lead to a much better experience for everyone. For example, rather than saying “Next, click on the button below,” you may want to write, “To get started, click the START button.” The second method removes the visual orientation and instead focus on the common information both a sighted and KO/AT user would have at their disposal.
Note: I should mention it’s perfectly OK to use user education features, like point outs, to visually point out things on the application just make sure the companion text lets your KO/AT users understand the same things which are referred to visually.
Augmentations To Your Application’s UX
There are changes or tweaks you can make to common components/features to improve the UX for KO/AT users.
Modal Focusing
Now we’re getting into the nitty-gritty. One of the great things about accessibility is how it opens the doorway to novel ways to solve problems you may have not considered before. You can make something fully WCAG 2.0 AA accessible and solve the problem with very different approaches. For modals, we at Deque came up with an interesting approach that would be totally invisible to most sighted-users but would be noticed by KO/AT users almost immediately.
For a modal to be accessible it needs to announce itself when evoked. Two common ways to do this are: focus the modal’s body after the modal is open or focus the modal’s header (if it has one) after the modal is open. You do this so the user’s AT can read out the modal’s intent like “Edit profile” or “Create new subscription”.
After you focus the body or header, hitting Tab ? will send focus to the next focusable element in the modal — commonly a field or, if it’s in the header, sometimes it’s the close button (X). Continuing to tab will move you through all the focusable elements in the modal, typically finishing with terminal buttons like SAVE and/or CANCEL.
Now we get to the interesting part. After you focus the final element in the modal, hitting Tab ? again will “cycle” you back to the first tab stop, which in the case of the modal will be either the body or the header because that’s where we started. However, in our modals we “skip” that initial tab stop and take you to the second stop (which in our modals is the close (X) in the upper corner. We do this because the modal doesn’t need to keep announcing itself over and over each cycle. It only needs to do it on the initial evocation not on any subsequent trips through, so we have a special programmatic stop which skips itself after the first time.
This is a small (but appreciated) usability improvement we came up with exclusively for KO/AT users which would be completely unknown to everyone else.
Navigation Menus Traversing And Focus/Selected Management
Navigation menus are tricky. They can be structured in a multitude of ways, tiered, nested, and have countless mechanisms of evocation, disclosure, and traversing. This makes it important to consider how they are interacted with and represented for KO/AT users during the design phase. Good menus should be “entered” and “exited”, meaning you tab into a menu to use it and tab out of it to exit it (if you don’t use it).
This idea is best illustrated with a literal example, so let’s take a look at our 2-tier, vertical navigation from Cauldron.
Hit Tab ? three times. The first tab stop is the skip link (which we went over previously), the second is the logo which acts as “return to home” link, and the third tab enters the menu;
Now that you are in the menu, use the arrow keys (? and ?) to move and open sections of the menu;
Hitting Tab ? at any point will exit you from the menu and send you to the content of the page.
Navigation menus can also work in conjunction with some of the previous topics such as shortcut/hotkey menus to make using the menu even more efficient.
Logical Focus Retention (I.E. Deleting Row, Returning Back To A Page)
Focus retention is very important. Most people are familiar, at least in concept, with focusing elements in their logical intended order on the page; however, it can get murky when an element or content changes/appears/disappears.
Where does focus go when then field you are on is deleted?
What about when you’re sent to another tab where the application has a new context?
What about after a modal is closed due to a terminal action like SAVE?
For a sighted user there are visual cues which can inform them of what happened.
Here’s an example: You have an Edit Recipe modal which lets your user add and remove any ingredients. There is one ingredient field with an “Add another ingredient” button below it. (Yes, it’s styled as a link but that’s a topic for another day.) Your focus is on the button. You click the button and a new field appears between the button and the first field. Where should the focus go? Most likely your user added another ingredient to engage with it so the focus should shift from the button into the newly added field.
The big takeaway from all this isn’t so much the specific examples but the mentality which supports them — consider the UX for your application through the lens of the KO/AT user as well sighted, mouse-only user. Some of the best and most clever ideas come from the most interesting and important challenges.
If you need help ensuring that your features are accessible, all of the examples above plus countless more can be tested using Deque’s free web accessibility testing application: axe pro. It’s free and you can sign up here.
This really depends on why you’re hiring someone as well as the direction you see your business going.
Consider the following:
Your client base is growing and you’re tired of turning down work. In that case, you’d likely want to hire designers and developers to share your workload with.
You spend more time responding to emails and managing finances than actually building websites. If you’re passionate about doing the revenue-generating activities in your business, you should hire an assistant, sales rep, or maybe even an accountant to pass the tedious and ill-filling tasks to.
You want to offer an end-to-end digital solution, but don’t have the capacity or skills to do it. First, you need to clearly define the services your agency is going to offer. If they’re not in your wheelhouse, that’s exactly who you need to hire for: copywriter, marketer, SEO specialist, and other creatives will round out your team.
Do You Need Full- or Part-Time Assistance?
Just because you’re in a position to bring someone onto your team doesn’t mean that they automatically need to become a full-time employee.
Evaluate where your business currently stands:
How much overflow work do you have?
How much work have you turned away in the last six months?
Do you have enough clients and a predictable revenue stream that can support a new hire?
Decide how much time you need from a new hire along with how much you can realistically pay before setting a work schedule.
What Kind of New Hire Do You Need?
There are three kinds of new hires you might need:
An independent contractor
A part-time employee
A full-time employee
Keep in mind that contractors cannot be managed the same way employees are. This means you can’t dictate when they work, where they work from, which tools they use, and so on. You can provide guidelines and processes for their work, but there can be no direct training or supervision.
How Much Do You Pay Them?
First, you have to determine how much you can afford to pay someone and whether or not that’s enough for the work they’re being hired to do.
Then, it’s important to recognize the difference between paying a contractor and an employee. Whereas contractors get paid the hourly or flat rate you agree upon, payments are much more complicated for employees.
When you hire someone as an employee, don’t forget to factor in additional costs like:
You will also either need to invest in payroll software or to hire someone to handle it for you.
Should They Work On-Site or Remotely?
If you hire an employee that’s going to work closely with you, it might be beneficial to hire someone locally to work from the same office space. That would be a good idea for someone like a fellow designer or an assistant.
Then again, many creative professionals and administrators do just as well working remotely.
What you need to figure out then is the following:
Can you afford to rent an office that’s convenient to get to and conducive to collaboration and productivity?
Or: If working remotely, can you cover the costs of the tools your employee must use to do their job (e.g. computer, software, wi-fi, etc.)?
Or: Is something in between — like a co-work space where you can occasionally hold in-person meetings — the most cost-effective and productive way to work with your employee?
Are There Any Legal Matters You Have to Deal With as an Employer?
Yes. While these may vary from country to country, the basic idea is the same. You’ll want to:
Register your business with the local government and acquire an employer identification number.
Obtain a business license.
Register with your local labor department.
Prepare all necessary paperwork to hire an employee and provide verification to the government that they’re eligible for work.
Set yourself up with a payroll service to ensure you make all payments to employees and the government on time.
To be on the safe side, review the guidelines provided by your local government for small business owners to make sure you cover all your bases.
Where Do You Find Candidates?
The first place to start is by asking for referrals from people you trust and who also understand your work style and personality well.
If you’re unable to find candidates through that channel, you’ll find them in a variety of locations around the web:
Your favorite Facebook or LinkedIn groups
Professional job boards like Indeed
Freelancer marketplaces like Guru or Toptal
Or you can post the job description on your website, optimize it for search or paid ads, and let them find you.
How Do You Vet Job Candidates?
For starters, you don’t need to interview everyone that applies to the position. However, you do need a system that enables you to quickly vet each candidate:
Confirm that they follow all instructions in the job description/application.
Review their resume and make sure they have all the qualifications you require.
Have a look at their portfolio and verify the quality is at the desired level.
Scan their social media profiles to make sure there’s nothing there that indicates they’d be unprofessional and, as a consequence, harm your business.
Once you’ve narrowed down the pool of candidates, schedule video calls with the remaining few. This gives you a chance to see if they know how to use basic technology, if they’re punctual, how their personality jibes with your own, as well as to make sure their goals and interests align with your company’s.
You should then talk to the references provided by the candidates you’re interested in. This final step will help you determine who is best-suited to the position.
How Do You Onboard New Hires?
Before you send an offer letter, contract, and tax forms to your new hire, make sure your business is ready to bring them on.
Create an employee handbook with information about your business, mission, values, information on holidays and time off, payment schedules, and general company rules and expectations.
Aggregate the process documentation you’ve developed for yourself and store it in a well-organized repository for employee training and future reference.
Create a training program and schedule it with a mix of written, video, and hands-on learning experiences.
Set up a “toolbox” for them that includes all of the software and login information they need to get moving.
When you’re sure everything is in order, send them a welcome email and packet, and get them started!
Congratulations on Hiring Your First Employee
Hiring someone is going to change your business — hopefully, for the better. Just do your due diligence and make sure they’re the perfect fit for the role as well as for you. Then, give them all the tools they need to hit the ground running. If you can prepare them for success, they’ll have no problem contributing to your own.
People go to the theme parks to get something that they cannot get in their homes.
Hence, theme parks continually change to incorporate new technologies to provide a seamless digital experience to their visitors. With the technological advances, many of the theme parks have started to incorporate AR/VR technologies by hiring an AR/VR development company to give an all-new an amazing feeling to the customers. For instance, renowned Universal Studios had utilized OMNIMAX screens many years back, in which they take their visitors to the impossible places by making use of the motion bases and massive 3D domes to provide the visuals. The result? A heightened and seamless experience, however, the person is indeed aware that they’re seated in a hydraulic seat, just watching a huge screen.
Let’s now talk about these two technologies and how they are helping the theme parks to get more attention and make more money and why should the theme parks adopt these technologies.
What is AR technology?
Augmented Reality is moving the virtual image over real-world gadgets. The overlay is executed all the while with the info got from a camera or another information gadget like savvy glasses. This super-imposition of virtual pictures over genuine items makes a deception that can adequately connect with clients in a virtual world.
Augmented reality turns the surrounding around into the digital space by keeping the virtual objects in place of the real-time objects. AR is usually experienced in gaming, in creating the immersive gaming experiences that make use of the actual surroundings.
What is Virtual Reality?
Virtual Reality (VR) is a new interface which immerses an individual in the 3D environment instead of making them watch on-screen display. Computer generated & content provide a simulating real experience with the help of senses (touch, sight, hearing).
Virtual reality recreation requires two primary parts: a source of the content and a client gadget. Programming and equipment, at the end of the day. As of now such frameworks incorporate headsets, all-headings treadmills, unique gloves, goggles. VR instruments ought to give sensible, characteristic, superb pictures and connection conceivable outcomes. For this, gadgets depend on estimations like:
Pixel Persistence
Motion delay
Audio/video synchronization
Image resolution
Field of view
VR needs many devices such as a computer/smartphone, headset or other machines in order to create the digital surrounding, & a motion tracker gadget in some of the cases.
VR requires several devices such as a headset, a computer/smartphone or another machine to create a digital environment, and a motion tracking device in some cases.
The above table image shows a basic understanding of the AR/VR technologies.
AR and VR technology together incorporated in the theme parks and rides:
As per statistics, the virtual reality and augmented reality market amounted to about 12 billion US dollars and is now expected to dramatically expand in the near future, with the forecasts for the year 2022 amounting to whopping 192 billion US dollars. Check the image below:
Benefits that the theme parks get after making use of these technologies:
Theme parks have incorporated the Virtual Reality technology to the other existing attractions, including turning rides and drop towers. Artificial Intelligence is the technology that offers a way for the theme parks to have conversations with the guests when individuals are not around. By making use of the vast amount of data, the machines can make smart recommendations and also offer useful information based on the visitor’s query. A number of amusement parks have started using these technologies and have gained a lot of attention and positive response from the visitors. This has also increased its revenue manifolds. Stand-alone AR/VR parks are also becoming a norm because of the fact that they are in great demand & when demand is there, profits are guaranteed.
The Future?
AR/VR technologies have all the potential in the near future to improve the theme parks in a great way. With time, it seems that the frame rate, resolution and other such variables controlling the VR’s visual imagery will be improving more. It may go up to the extent that the real and virtual world will almost be indistinguishable. Moreover, the developers and designers will definitely figure out some ways to merge a free-roaming VR experience with the more enhanced and advanced VR-operated ride vehicle. Anyway, whatever the future holds, you as an end user and a theme park fan, must be in for an amazing roller-coaster ride!
Sorting is a super handy JavaScript method that can display the values of an array in a certain order. Whether that’s real estate listings by price, burger joints by distance, or best nearby happy hours by rating, sorting arrays of information is a common need.
If you’re already doing this with JavaScript on a project, you are will likely using the built-in array .sort method, which is in the same family of array methods that includes .filter, .map and .reduce.
Let’s take a look at how to do that!
A quick note about side effects
Before going into the details of how to use .sort, there is a very important detail that needs to be addressed. While many of the ES5 array methods such as .filter, .map, and .reduce will return a new array and leave the original untouched, .sort will sort the array in place. If this is unwanted, an ES6 technique to avoid this is using the spread operator to concisely create a new array.
foo and fooSorted both reference the same array, but bar and barSorted are now individual arrays.
General overview
The only parameter of the .sort method is a function. The spec refers to this as the compareFn — I will refer to it as the “comparison function” for the rest of the post. This comparison function accepts two parameters, which I will refer to as a and b. a and b are the two elements that we will be comparing. If you do not provide a comparison function, the array will coerce each element into a string and sort according to Unicode points.
If you would like the a to be ordered first in the array, the comparison function should return a negative integer; for b, a positive integer. If you would like the two to maintain their current order, return a 0.
If you don’t understand, don’t worry! Hopefully it will become much more clear with a few examples.
Comparing numbers
One of the simplest callbacks to write is a number comparison.
If a is greater than b, a - b will return a positive number, so b will be sorted first.
Comparing strings
When comparing strings, the > and < operators will compare values based on each string’s Unicode value. This means that all uppercase letters will be “less” than all lowercase letters, which can lead to unexpected behavior.
JavaScript does have a method to help with comparing strings: the String.prototype.localeCompare method. This method accepts a comparison string, a locale, and an options object. The options object accepts a few properties (all of which you can view here), but I find that the most useful is “sensitivity.” This will affect how comparisons work between letter variations such as case and accent.
To me, baseSorted seems to be the most logical for most alphabetical sorting — ‘ü’, ‘u’, ‘Ü’, and ‘U’ are equivalent, so they remain in the order of the original array.
Running functions before comparing values
You may want to run a comparison function on a value that is derived from each array’s element. First, let’s write a comparison function factory that will “map” over the element before calling the comparison function.
There are some cases where you may want to reverse the outcome of a comparison function. This is subtly different than doing a sort and then reversing the result in the way ties are handled: if you reverse the outcome, ties will also be reversed in order.
To write a higher order function that accepts a comparison function and returns a new one, you will need to flip the sign of the comparison’s return value.
You might want to sort an array “randomly.” One technique that I have seen is to use the following function as the comparison function.
const byRandom = () => Math.random() - .5;
Since Math.random() returns a “random” number between 0 and 1, the byRandom function should return a positive number half of the time and a negative number the other half. This seems like it would be a good solution, but unfortunately, since the comparison function is not “consistent” — meaning it may not return the same value when called multiple times with the same values — it may result in some unexpected results.
For example, let’s take an array of numbers between 0 and 4. If this byRandom function was truly random, it would be expected that the new index of each number would be spread out equally over enough iterations. The original 0 value would be just as likely to be in index 4 as index 0 in the new array. However, in practice, this function will bias each number to its original position.
The “diagonal” from the top-left will statistically have the greatest value. In an ideal and truly random sort, each table cell would hover around 20%.
The fix for this is to find a way to ensure that the comparison function remains consistent. One way to do this is to map the random value to each array element before the comparison, then map it away after.
This ensures that each element has a single random value that is only calculated once per element rather than once per comparison. This removes the sorting bias towards the original position.
In music, that might be a bit of a melody that asserts itself periodically and kinda informs the rest of the song. It’s equally interesting in design, where a theme — perhaps a geometric element — is sprinkled in tastefully that helps the gestalt. Ties the room together, as they say.
Anyway, if you’re serious about getting better at design, his course is where it’s at and opens up in mid-June. So, now’s the time to think about it.
If you search for how to style apps for the web, you’ll come across many different approaches and libraries, some even changing day by day. Block Element Modifier (BEM); preprocessors such as Less and SCSS; CSS-in-JS libraries, including JSS and styled-components; and, lately, design systems. You come across all of these in articles and blogs, tutorials and talks, and — of course — debates on Twitter.
How do we choose between them? Why do so many approaches exist in the first place? If you’re already comfortable with one method, why even consider moving to another?
In this article, I’m going to take a look at the tools I have used for production apps and sites I’ve worked on, comparing features from what I’ve actually encountered rather than summarizing the content from their readmes. This is my journey through BEM, SCSS, styled-components, and design systems in particular; but note that even if you use different libraries, the basic principles and approach remain the same for each of them.
CSS Back In The Day
When websites were just getting popular, CSS was primarily used to add funky designs to catch the user’s attention, such as neon billboards on a busy street:
Its use wasn’t for layout, sizing, or any of the basic needs we routinely use CSS for today, but as an optional add-on to make things fancy and eye-catching. As features were added to CSS, newer browsers supporting a whole new range of functionality and features appeared, and the standard for websites and user interfaces evolved — CSS became an essential part of web development.
It’s rare to find websites without a minimum of a couple hundred lines of custom styling or a CSS framework (at least, sites that don’t look generic or out of date):
What came next is quite predictable. The complexity of user interfaces kept on increasing, along with the use of CSS; but without any guidelines suggested and with a lot of flexibility, styling became complicated and dirty. Developers had their own ways of doing things, with it all coming down to somehow getting things to look the way the design said it was supposed to be.
This, in turn, led to a number of common issues that many developers faced, like managing big teams on a project, or maintaining a project over a long period of time, while having no clear guides. One of the main reasons this happens even now, sadly, is that CSS is still often dismissed as unimportant and not worth paying much attention to.
CSS Is Not Easy To Manage
There’s nothing built into CSS for maintenance and management when it comes to large projects with teams, and so the common problems faced with CSS are:
Lack of code structure or standards greatly reduces readability;
Maintainability as project size increases;
Specificity issues due to code not being readable in the first place.
If you’ve worked with Bootstrap, you’ll have noticed you’re unable to override the default styles and you might have fixed this by adding !important or considering the specificity of selectors. Think of a big project’s style sheets, with their large number of classes and styles applied to each element. Working with Bootstrap would be fine because it has great documentation and it aims to be used as a solid framework for styling. This obviously won’t be the case for most internal style sheets, and you’ll be lost in a world of cascaded styles.
In projects, this would be like a couple thousand lines of CSS in a single file, with comments if you’re lucky. You could also see a couple of !important used to finally get certain styles to work overriding others.
You may have faced specificity issues but not understood how specificity works. Let’s take a look.
Which of the styles applied to the same element would be applied to the image on the right, assuming they both point to it?
What is the order of weight of selectors such as inline styles, IDs, classes, attributes, and elements? Okay, I made it easy there, they’re in order of weight:
Start at 0; add 1,000 for a style attribute; add 100 for each id; add 10 for each attribute, class or pseudo-class; add 1 for each element name or pseudo-element.
So, for instance, taking the above example:
Do you see why the second example was the correct answer? The id selector clearly has far more weight than element selectors. This is essentially the reason why your CSS rule sometimes doesn’t seem to apply. You can read about this in detail in Vitaly Friedman’s article, “CSS Specificity: Things You Should Know”.
The larger the codebase, the greater the number of classes. These might even apply to or override different styles based on specificity, so you can see how quickly it can become difficult to deal with. Over and above this we deal with code structure and maintainability: it’s the same as the code in any language. We have atomic design, web components, templating engines; there’s a need for the same in CSS, and so we’ve got a couple of different approaches that attempt to solve these different problems.
Block Element Modifier (BEM)
“BEM is a design methodology that helps you to create reusable components and code sharing in front-end development.”
— getbem.com
The idea behind BEM is to create components out of parts of apps that are reused or are independent. Diving in, the design process is similar to atomic design: modularize things and think of each of them as a reusable component.
I chose to start out managing styles with BEM as it was very similar the way React (that I was already familiar with) breaks down apps into reusable components.
Using BEM
BEM is nothing more than a guide: no new framework or language to learn, just CSS with a naming convention to organize things better. Following this methodology, you can implement the patterns you’ve already been using, but in a more structured manner. You can also quite easily do progressive enhancements to your existing codebase as it requires no additional tooling configuration or any other complexities.
Advantages
At its heart BEM manages reusable components, preventing random global styles overriding others. In the end, we have more predictable code, which solves a lot of our specificity problems.
There’s not much of a learning curve; it is just the same old CSS with a couple of guides to improve maintainability. It is an easy way of making code modular by using CSS itself.
Drawbacks
While promoting reusability and maintainability, a side effect of the BEM naming principle is making naming the classes difficult and time-consuming.
The more nested your component is in the block, the longer and more unreadable the class names become. Deeply nested or grandchild selectors often face this issue.
<div class="card__body">
<p class="card__body__content">Lorem ipsum lorem</p>
<div class="card__body__links">
<!-- Grandchild elements -->
<a href="#" class="card__body__links__link--active">Link</a>
</div>
</div>
That was just a quick intro to BEM and how it solves our problems. If you’d like to take a deeper look into its implementation, check out “BEM For Beginners” published here in Smashing Magazine.
Sassy CSS (SCSS)
Put blandly, SCSS is CSS on steroids. Additional functionality such as variables, nesting selectors, reusable mixins, and imports help SCSS make CSS more of a programming language. For me, SCSS was fairly easy to pick up (go through the docs if you haven’t already) and once I got to grips with the additional features, I’d always prefer to use it over CSS just for the convenience it provided. SCSS is a preprocessor, meaning the compiled result is a plain old CSS file; the only thing you need to set up is tooling to compile down to CSS in the build process.
Super handy features
Imports help you split style sheets into multiple files for each component/section, or whichever makes readability easier.
Note: SCSS mixin: Check out more handy SCSS features over here.
Nesting of selectors improves readability as it works the same way HTML elements are arranged: in a nested fashion. This approach helps you recognize hierarchy at a glance.
BEM With SCSS
It is possible to group the code for components into blocks, and this greatly improves readability and helps in ease of writing BEM with SCSS:
Note: For further reading on how this would work, check out Victor Jeman’s “BEM with Sass” tutorial.
Styled-Components
This is one of the most widely used CSS-in-JS libraries. Without endorsing this particular library, it has worked well for me, and I’ve found its features quite useful for my requirements. Take your time in exploring other libraries out there and pick the one that best matches your needs.
I figured a good way to get to know styled-components was to compare the code to plain CSS. Here’s a quick look at how to use styled-components and what it’s all about:
Instead of adding classes to elements, each element with a class is made into a component. The code does look neater than the long class names we have with BEM.
Interestingly, what styled-components does under the hood is take up the job of adding relevant classes to elements as per what’s specified. This is essentially what we do in style sheets (note that it is in no way related to inline styling).
Why Are Styled-Components One Of The Widely Used CSS-In-JS Libraries?
For styling, here we’re just using template literals with normal CSS syntax. This allows you to use the full power of JavaScript to handle the styling for you: conditionals, properties passed in as arguments (using an approach similar to React), and essentially all the functionality that can be implemented by JavaScript.
While SCSS has variables, mixins, nesting, and other features, styled-components only adds on, making it even more powerful. Its approach, based heavily on components, might seem daunting at first since it’s different from traditional CSS. But as you get used to the principles and techniques, you’ll notice that everything possible with SCSS can be done in styled-components, as well as a lot more. You just use JavaScript instead.
Note: Template literals in styled-components allow you to use JS directly for conditional styling and more.
Another thing to note is how perfectly this fits into the world of web components. A React component has its own functionality with JavaScript, JSX template, and now CSS-in-JS for styling: it’s fully functional all by itself and handles everything required internally.
Without us realizing, that was the answer to a problem we’ve been talking about for too long: specificity. While BEM was a guideline to enforce component-based structure for elements and styles but still relying on classes, styled-components impose it for you.
Styled-components has a couple of additional features I’ve found especially useful: themes, which can configure a global prop (variable) passed down to each styled-component; automatic vendor prefixing; and automatic clean-up of unused code. The amazingly supportive and active community is just the icing on the cake.
Note: There’s a lot more to check out and take advantage of. Read more in the styled-components docs.
Quick Recap On Features
Template literals are used for syntax, the same as traditional CSS.
It imposes modular design.
It solves specificity issues by handling class names for you.
Everything that can be done with SCSS and more, implemented with JS.
Why It Might Not Be For You
It obviously relies on JavaScript, which means without it the styles don’t load, resulting in a cluttered mess.
Previously readable class names are replaced with hashes that really have no meaning.
The concept of components rather than cascading classes might be a bit hard to wrap your head around, especially since this affects the way you arrange things a lot.
Design Systems
As usage of web components increases, as well as the need for atomic design (basically breaking down UI into basic building blocks), many companies are choosing to create component libraries and design systems. Unlike the technologies or approaches on how to handle styling mentioned above, design systems represent an organizational approach to handling components and consistent design across whole platforms or apps.
It’s possible to use an approach we’ve discussed within a design system to organize styles, while the design system itself focuses on the building blocks of the apps rather than internal implementations.
“Design systems are essentially collections of rules, constraints, and principles implemented in design and code.”
Design systems and component libraries are aimed at whole ecosystems spanning different platforms and media, and can determine the overall outlook of the company itself.
“A design system is an amalgamation of style, components, and voice.”
Once they gain momentum, tech businesses sometimes have to scale up extremely fast, and it can be hard for the design and development teams to keep up. Different apps, new features and flows, constant reevaluation, changes, and enhancements are to be shipped as rapidly as possible when the business requires them.
Take the case of a simple modal; for instance, one screen has a confirmation modal which simply accepts a negative or positive action. This is worked on by Developer A. Then the design team ships another screen that has a modal comprising a small form with a few inputs — Developer B takes this up. Developers A and B work separately and have no idea that both of them are working on the same pattern, building two different components that are essentially the same at base level. If different developers worked on the different screens we might even see UI inconsistencies committed to the codebase.
Now imagine a large company of multiple designers and developers — you could end up with a whole collection of components and flows that are supposed to be consistent, but instead are distinct components existing independently.
The main principle of design systems is to help meet business requirements: build and ship new features, functionality, and even full apps while maintaining standards, quality, and consistency of design.
When talking about styling in particular, we’d be specifically interested in the component library part, although the design system itself is far more than just a collection of components. A component handles its functionality, template, and styling internally. A developer working on the app needn’t be aware of all of the internal working of the components, but would just need to know how to put them together within the app.
Now imagine a couple of these components that are further made reusable and maintainable, and then organized into a library. Developing apps could be almost as simple as drag-and-drop (well, not exactly, but a component could be pulled in without worrying about any internal aspects of its working). That’s essentially what a component library does.
Why You Might Want To Think About Building A Design System
As mentioned earlier, it helps the engineering and design teams keep up with rapidly changing business needs while maintaining standards and quality.
It ensures consistency of design and code throughout, helping considerably with maintainability over a long period of time.
One of the greatest features of design systems is that they bring the design and development teams closer, making work more of a continuous collaboration. Rather than whole pages of mock-ups given to developers to work on from scratch, components and their behaviors are well-defined first. It’s a whole different approach, but a better and faster way to develop consistent interfaces.
Why It Might Not Be The Best Fit For You
Design systems require a lot of time and effort up front to plan things out and organize from scratch — both code- and design-wise. Unless really required, it might not be worth delaying the development process to focus on building the design system at first.
If a project is relatively small, a design system can add unnecessary complexity and end up a waste of effort when what was actually required was just a couple of standards or guidelines to ensure consistency. Because several high-profile companies have adopted design systems, the hype can influence developers into thinking this is the always best approach, without analyzing the requirements and ensuring this could actually be practical.
Conclusion
Styling applications is a world in itself, one not often given the importance and attention it deserves. With complex modern user interfaces, it’s only matter of time before your app becomes a mess of unordered styles, reducing consistency and making it harder for new code to be added or changes made to the existing codebase.
Distilling what we’ve discussed so far: BEM, along with SCSS, could help you organize your style sheets better, take a programming approach to CSS, and create meaningful structured class names for cleaner code with minimal configuration. Building over a front-end framework like React or Vue, you might it find it convenient to hand class naming to a CSS-in-JS library if you’re comfortable with a component-based approach, putting an end to all your specificity issues, along with a couple of other benefits. For larger applications and multiple platforms, you might even consider building a design system in combination with one of the other methods, to boost development speeds while maintaining consistency.
Essentially, depending on your requirements and the size and scale of your software, it’s important to spend time determining your best approach to styling.
Hey WDD Readers, it’s June! Depending on where you live, you could either be heading out for a day of Summer fun, or curling up in your home at the bottom of Chile with a hot drink. And if you’re in Chile keeping warm, can I join you?
This month, we got lucky enough to have lots and lots of pretty colorful designs in the mix, as well as a bit of classic minimalism and monochromatic goodness. Enjoy.
Note: I’m judging these sites by how good they look to me. If they’re creative and original, or classic but really well-done, it’s all good to me. Sometimes, UX and accessibility suffer. For example, many of these sites depend on JavaScript to display their content at all; this is a Bad Idea, kids. If you find an idea you like and want to adapt to your own site, remember to implement it responsibly.
The McBride Company
The McBride Company has a simple portfolio that makes excellent use of a vector-based background to maintain a consistent visual identity all across the site. While there are parts of the design that might benefit from more contrast and larger body text, the overall effect is striking and beautiful.
Platform: Craft CMS
Paulina Hanzel
Paulina Hanzel’s portfolio is minimalist, visually striking, and does little more than it needs to to get the job done (something I can always respect). While the neon-on-white color scheme can occasionally blast the eyeballs, it’s a memorable design.
Plus the “hamburger menu” icon actually includes text that says, “menu”, and I can absolutely get behind that kind of microcopy.
Platform: Static Site
The Digital Panda
The Digital Panda combines two things I absolutely love: pandas (and who doesn’t love them?), and those sort of blob-like design elements that I’m still a bit obsessed with. And let’s be honest, I’m most likely going to be obsessed with them until I next redesign my own portfolio.
Now the main navigation doesn’t always get all the contrast it needs as you scroll down the page, but on the other hand, those are some of the smoothest drop shadows I’ve seen in a while.
Platform: Static Site
estudio nk
estudio/nk’s agency portfolio has a simple, clean design that is fairly standard, though the choice to display blog posts as a slidable carousel on the home page is… interesting. Where it really stands out is in their use of smooth, quality animations. Overall, it’s just a pleasure to browse.
Platform: Custom CMS (I think)
Stimmt
Stimmt mixes the ever-classic put-the-grid-in-the-background design aesthetic with a lot more color than you usually get from that kind of design, dressed up with some admittedly great animation. Plus I like their use of illustration.
Platform: Static Site
Zolderkamer Collectief
The Zolderkamer Collectief spices up a rather simplistic, mostly-one-column portfolio with only a background gradient, and some good-looking type. The fact that you can only see the rest of their portfolio upon request (because they’re not allowed to show you otherwise) might seem annoying to some, but creates a sense of mystery for me.
Platform: Static Site
ATTCK
ATTCK makes a bold impression with some lovely constellation-based imagery, and some rather cheeky boasting, including: “We let the dogs out”, “We know the way to Sesame Street”, and even “We are the crypto to your blockchain”. (I dare you to use that line to try and pick someone up in a bar, bonus points if you live nowhere near Silicon Valley.)
They back up their boasting with some great typography, and a visually pleasing layout.
Platform: WordPress
Blubolt
Blubolt is here because it looks good. It’s not going to blow your mind or blast your eyeballs, but it’s well made, and pretty. Enjoy.
Platform: WordPress
Diko
Diko’s agency website is a highly PowerPoint-ish site that depends a lot on its animation and video, and it works. It won’t blow your mind, but I have no real complaints beyond the usual “It’s too JS-dependent” thing.
Platform: Contentful
C&I
C&I embraces that sort of prefessional-elegant aesthetic that video and photo agencies are known for, though they do a lot more than that. Still, they mostly depend on the imagery to carry them through, and it works for them.
Platform: WordPress
Array
Array’s portfolio is a pleasantly minimalist affair with a bit of asymmetry thrown in. It’s a small note, but these designers know the value of keeping a single-column layout from getting too wide to easily read the text. It’s a lesson some designers seem, to have forgotten these days.
Platform: Custom CMS (I think)
Nick Losacco
Nick Losacco does a lot of different things, but his typeface design is listed first for a reason. In keeping with the theme, his portfolio relies heavily on its typography for navigation and visual spice.
Platform: Custom CMS (I think)
Boris Verks
Boris Verks’ one-page portfolio is a lovely example of type-based design with a little asymmetry thrown in for good measure. And I absolutely love the anteater that is deconstructed/reconstructed as you scroll down the page… I just do.
Platform: Static Site
Orkestra
Orkestra brings us another beautiful and nearly monochromatic design that’s heavy on the animation and outlined type. I have to say, I never get tired of seeing flawlessly executed grid-based layouts.
Platform: Static Site
Eva Garcia
Eva Garcia’s makeup artist portfolio is a classic example of its style: elegant, sophisticated, and artsy as all heck, while still being fairly intuitive and usable.
Platform: Statc Site
Spark44
Spark44 leans into its self-described theme of “big and lean”. Everything on the site including the type is big, and none of it is contrived or overly fancy. There’s just enough solid red and imagery the offset the mostly-monochromatic theme. It’s not minimalism for its own sake: it’s minimalism with powerful intention behind it.
Platform: Static Site
Sylvain Julé
Sylvain Julé’s portfolio is as minimalist as they get, and I have to admit that I quite like the way they pulled off the two-column layout. I also appreciate the way they use video to show off their portfolio pieces… even if it does load a bit slowly on my current Internet.
Platform: Static Site
Animal
Animal takes us back (yes, back) to that sort of post-minimalism with some asymmetry, a whole lot of white space, and a case study-focused approach to showing off their work.
Platform: WordPress
Optima Ninja
Optima Ninja brings us another great design with lots of purple, diagonally-orientated elements (I always like those), and clean sans-serif typography. It’s maybe the single most classically “business-friendly” design on the list this month, and it’s actually kind of a nice break from all of the super artsy stuff.
Platform: Static Site
Oxymoron
Oxymoron (love the name) gets wild with illustration, a giant mobile phone “frame”, emoji, spaghetti, and a page that you can scroll down (or up) infinitely because it loops.
They ask if you want to see their “credentials” in PDF format, and clicking “no” will actually get you a message that says “Ok, we totally respect that.” It’s… it’s just… Look guys, I don’t have any reason or the budget to hire you, but can we be friends?
User experience (UX) is arguably the most crucial aspect of a website. It affects every part of a customer’s journey – from how they perceive the brand to how easily they make a purchase.
Despite this importance, a survey by Econsultancy revealed that 12% of businesses do not carry out user testing and have no plans to implement it. Furthermore, a third of respondents stated they currently didn’t but plan to rectify that within the next year.
Of those who didn’t do any form of UX testing, more than 50% revealed that cost was a barrier to implementation. Although great UX has the potential to be the most profitable part of an organization, it is true that execution can be expensive. Afterall, according to Upwork, the average freelance UX designer can charge up to $65 per hour just for user research.
Although choosing an established professional or agency is usually the best course of action when creating a great user experience, there are several budget-friendly options which can still pay dividends. All businesses, from small firms to multinationals, have the potential to benefit from these:
Use data to learn how customers use the website
Google Analytics (GA) is an essential tool for businesses, providing firms with all the data they need to investigate website performance. Furthermore, this tool carries several benefits when evaluating UX.
For example, GA demonstrates when visitors leave a website or drop out before conversion. Timings can also be assessed to investigate how long, on average, it takes for individuals to navigate around the page.
Separately, heatmap tools can highlight where users are clicking on a webpage as well as how far they scroll. These might highlight, for example, that very few individuals are responding favorably to a call to action or reacting to a specific button.
As a result, this data can demonstrate areas for improvement which require just a few simple changes to fix. However, one downside of this approach is that it highlights problems – but doesn’t specify why these occur. That will require further analysis to determine.
Competitor analysis
Customers expect certain aspects from websites and understanding this can be crucial to success. For example, due to the growth of organizations such as Amazon, individuals generally expect e-commerce businesses to follow a precise formula.
On product pages, this might include elements such as reviews, multiple images, frequently asked questions, and in-depth descriptions.
While there is scope for innovation in UX, taking inspiration from competitors never hurts. By evaluating these organizations, going through their customer processes, and identifying elements which succeed, these own features can potentially be replicated.
There is always something to learn from competitor analysis – especially if several websites follow similar conventions.
Ask the customer
Customers are often an untapped source of feedback. Despite social media and review websites making it easier than ever for customers to express their opinions, businesses can be slow to capitalize on this opportunity.
For example, companies could potentially provide a small discount in exchange for users completing a questionnaire. We suggest following this format:
Why did you visit the website?
Were you able to achieve your goal?
If not, why was this not possible?
This information can help pinpoint specific errors across a website and might also identify new opportunities for expansion.
Focus on the fundamentals
As you are working on a budget, it is essential to focus on the foundations of UX.
Use the budget you do have to get the fundamentals right, and you will see the greatest benefit from this (an obvious point, but worth mentioning).
Earlier we discussed the importance of business data in making informed UX choices. However, there is something to be said for taking a more basic approach. For example, by following the customer journey around the website, individuals can review common UX concerns and determine if they should be improved. These include:
Website navigation – Does the website have clear menus, options, and an interface which allows customers to easily locate what they need?
Page speed – Does the website, or certain pages, take too long to load? To put this into context, anything longer than two to three seconds may need to be investigated.
The checkout process – Can customers easily purchase goods or services using the current system? In the event of an error, is this information clearly displayed? Furthermore:
Can you use the checkout as a guest?
Can you easily click on the links and buttons?
Is it easy to read?
Think of the 80/20 rule, 20% of your input into the right places will likely give you 80% of your desired output.
Implement guerrilla testing
Guerrilla testing involves gathering UX feedback from users by taking a website – or item – into a public location and asking individuals to try it. However, this low-cost, simple solution has positives and negatives.
For example, while this has the potential to get a large number of fresh eyes on a situation – leading to several new ideas – the individuals approached may not belong to the target market. Therefore, any data collected might not be entirely relevant. Furthermore, it can be time-consuming to implement this process.
As a result, guerrilla testing is not something which can be completed in a few hours. To get the best results possible, it needs careful strategy and planning. We recommend this guide to guerrilla testing to learn more.
Remote Testing
For the opposite of guerilla testing, look no further than this option. Remote testing uses screen-sharing software to record how customers interact with a website. Participants are set a series of tasks to perform – such as purchasing a product – then their actions are recorded.
When selecting this option, testers will need to decide whether or not to moderate the process. By moderating, testers are in the room and thus able to question participants further about their choices – usually leading to valuable additional insights. However, unmoderated users may browse the website more realistically, away from the gaze and questions of a moderator.
Regardless, remote testing takes place in an environment which is closer to how customers interact with a website.
Cost is not a barrier to implementing UX
Remember that user experience is all about the user, when working on a tight budget it’s important to base your decisions on data and testing, rather than instinct or following the HiPPO (Highest Paid Person’s Opinion). Do this, and you will have a website which is designed around the user.
Good user experience is fundamental to the success of a website and those which make even the smallest investment will start seeing results. In this article, we have covered several budget-friendly approaches, each one demonstrating that cost really is not a barrier.