Wszystkie wpisy, których autorem jest admin

Passkeys: What the Heck and Why?

Post pobrano z: Passkeys: What the Heck and Why?

These things called passkeys sure are making the rounds these days. They were a main attraction at W3C TPAC 2022, gained support in Safari 16, are finding their way into macOS and iOS, and are slated to be the future for password managers like 1Password. They are already supported in Android, and will soon find their way into Chrome OS and Windows in future releases.

Geeky OS security enhancements don’t exactly make big headlines in the front-end community, but it stands to reason that passkeys are going to be a “thing”. And considering how passwords and password apps affect the user experience of things like authentication and form processing, we might want to at least wrap our minds around them, so we know what’s coming.

That’s the point of this article. I’ve been studying and experimenting with passkeys — and the WebAuthn API they are built on top of — for some time now. Let me share what I’ve learned.

Table of contents

Terminology

Here’s the obligatory section of the terminology you’re going to want to know as we dig in. Like most tech, passkeys are wrought with esoteric verbiage and acronyms that are often roadblocks to understanding. I’ll try to de-mystify several for you here.

  • Relying Party: the server you will be authenticating against. We’ll use “server” to imply the Relying Party in this article.
  • Client: in our case, the web browser or operating system.
  • Authenticator: Software and/or hardware devices that allow generation and storage for public key pairs.
  • FIDO: An open standards body that also creates specifications around FIDO credentials.
  • WebAuthn: The underlying protocol for passkeys, Also known as a FIDO2 credential or single-device FIDO credentials.
  • Passkeys: WebAuthn, but with cloud syncing (also called multi-device FIDO credentials, discoverable credentials, or resident credentials).
  • Public Key Cryptography: A generated key pair that includes a private and public key. Depending on the algorithm, it should either be used for signing and verification or encrypting and decrypting. This is also known as asymmetric cryptography.
  • RSA: An acronym of the creators’ names, Rivest Shamir and Adel. RSA is an older, but still useful, family of public key cryptography based on factoring primes.
  • Elliptic Curve Cryptography (ECC): A newer family of cryptography based on elliptic curves.
  • ES256: An elliptic curve public key that uses an ECDSA signing algorithm (PDF) with SHA256 for hashing.
  • RS256: Like ES256, but it uses RSA with RSASSA-PKCS1-v1.5 and SHA256.

What are passkeys?

Before we can talk specifically about passkeys, we need to talk about another protocol called WebAuthn (also known as FIDO2). Passkeys are a specification that is built on top of WebAuthn. WebAuthn allows for public key cryptography to replace passwords. We use some sort of security device, such as a hardware key or Trusted Platform Module (TPM), to create private and public keys.

The public key is for anyone to use. The private key, however, cannot be removed from the device that generated it. This was one of the issues with WebAuthn; if you lose the device, you lose access.

Passkeys solves this by providing a cloud sync of your credentials. In other words, what you generate on your computer can now also be used on your phone (though confusingly, there are single-device credentials too).

Currently, at the time of writing, only iOS, macOS, and Android provide full support for cloud-synced passkeys, and even then, they are limited by the browser being used. Google and Apple provide an interface for syncing via their Google Password Manager and Apple iCloud Keychain services, respectively.

How do passkeys replace passwords?

In public key cryptography, you can perform what is known as signing. Signing takes a piece of data and then runs it through a signing algorithm with the private key, where it can then be verified with the public key.

Anyone can generate a public key pair, and it’s not attributable to any person since any person could have generated it in the first place. What makes it useful is that only data signed with the private key can be verified with the public key. That’s the portion that replaces a password — a server stores the public key, and we sign in by verifying that we have the other half (e.g. private key), by signing a random challenge.

As an added benefit, since we’re storing the user’s public keys within a database, there is no longer concern with password breaches affecting millions of users. This reduces phishing, breaches, and a slew of other security issues that our password-dependent world currently faces. If a database is breached, all that’s stored in the user’s public keys, making it virtually useless to an attacker.

No more forgotten emails and their associated passwords, either! The browser will remember which credentials you used for which website — all you need to do is make a couple of clicks, and you’re logged in. You can provide a secondary means of verification to use the passkey, such as biometrics or a pin, but those are still much faster than the passwords of yesteryear.

More about cryptography

Public key cryptography involves having a private and a public key (known as a key pair). The keys are generated together and have separate uses. For example, the private key is intended to be kept secret, and the public key is intended for whomever you want to exchange messages with.

When it comes to encrypting and decrypting a message, the recipient’s public key is used to encrypt a message so that only the recipient’s private key can decrypt the message. In security parlance, this is known as “providing confidentiality”. However, this doesn’t provide proof that the sender is who they say they are, as anyone can potentially use a public key to send someone an encrypted message.

There are cases where we need to verify that a message did indeed come from its sender. In these cases, we use signing and signature verification to ensure that the sender is who they say they are (also known as authenticity). In public key (also called asymmetric) cryptography, this is generally done by signing the hash of a message, so that only the public key can correctly verify it. The hash and the sender’s private key produce a signature after running it through an algorithm, and then anyone can verify the message came from the sender with the sender’s public key.

How do we access passkeys?

To access passkeys, we first need to generate and store them somewhere. Some of this functionality can be provided with an authenticator. An authenticator is any hardware or software-backed device that provides the ability for cryptographic key generation. Think of those one-time passwords you get from Google Authenticator1Password, or LastPass, among others.

For example, a software authenticator can use the Trusted Platform Module (TPM) or secure enclave of a device to create credentials. The credentials can be then stored remotely and synced across devices e.g. passkeys. A hardware authenticator would be something like a YubiKey, which can generate and store keys on the device itself.

To access the authenticator, the browser needs to have access to hardware, and for that, we need an interface. The interface we use here is the Client to Authenticator Protocol (CTAP). It allows access to different authenticators over different mechanisms. For example, we can access an authenticator over NFC, USB, and Bluetooth by utilizing CTAP.

One of the more interesting ways to use passkeys is by connecting your phone over Bluetooth to another device that might not support passkeys. When the devices are paired over Bluetooth, I can log into the browser on my computer using my phone as an intermediary!

The difference between passkeys and WebAuthn

Passkeys and WebAuthn keys differ in several ways. First, passkeys are considered multi-device credentials and can be synced across devices. By contrast, WebAuthn keys are single-device credentials — a fancy way of saying you’re bound to one device for verification.

Second, to authenticate to a server, WebAuthn keys need to provide the user handle for login, after which an allowCredentials list is returned to the client from the server, which informs what credentials can be used to log in. Passkeys skip this step and use the server’s domain name to show which keys are already bound to that site. You’re able to select the passkey that is associated with that server, as it’s already known by your system.

Otherwise, the keys are cryptographically the same; they only differ in how they’re stored and what information they use to start the login process.

The process… in a nutshell

The process for generating a WebAuthn or a passkey is very similar: get a challenge from the server and then use the navigator.credentials.create web API to generate a public key pair. Then, send the challenge and the public key back to the server to be stored.

Upon receiving the public key and challenge, the server validates the challenge and the session from which it was created. If that checks out, the public key is stored, as well as any other relevant information like the user identifier or attestation data, in the database.

The user has one more step — retrieve another challenge from the server and use the navigator.credentials.get API to sign the challenge. We send back the signed challenge to the server, and the server verifies the challenge, then logs us in if the signature passes.

There is, of course, quite a bit more to each step. But that is generally how we’d log into a website using WebAuthn or passkeys.

The meat and potatoes

Passkeys are used in two distinct phases: the attestation and assertion phases.

The attestation phase can also be thought of as the registration phase. You’d sign up with an email and password for a new website, however, in this case, we’d be using our passkey.

The assertion phase is similar to how you’d log in to a website after signing up.

Attestation

View full size

The navigator.credentials.create API is the focus of our attestation phase. We’re registered as a new user in the system and need to generate a new public key pair. However, we need to specify what kind of key pair we want to generate. That means we need to provide options to navigator.credentials.create.

// The `challenge` is random and has to come from the server
const publicKey: PublicKeyCredentialCreationOptions = {
  challenge: safeEncode(challenge),
  rp: {
    id: window.location.host,
    name: document.title,
  },
  user: {
    id: new TextEncoder().encode(crypto.randomUUID()), // Why not make it random?
    name: 'Your username',
    displayName: 'Display name in browser',
  },
  pubKeyCredParams: [
    {
      type: 'public-key',
      alg: -7, // ES256
    },
    {
      type: 'public-key',
      alg: -256, // RS256
    },
  ],
  authenticatorSelection: {
    userVerification: 'preferred', // Do you want to use biometrics or a pin?
    residentKey: 'required', // Create a resident key e.g. passkey
  },
  attestation: 'indirect', // indirect, direct, or none
  timeout: 60_000,
};
const pubKeyCredential: PublicKeyCredential = await navigator.credentials.create({
  publicKey
});
const {
  id // the key id a.k.a. kid
} = pubKeyCredential;
const pubKey = pubKeyCredential.response.getPublicKey();
const { clientDataJSON, attestationObject } = pubKeyCredential.response;
const { type, challenge, origin } = JSON.parse(new TextDecoder().decode(clientDataJSON));
// Send data off to the server for registration

We’ll get PublicKeyCredential which contains an AuthenticatorAttestationResponse that comes back after creation. The credential has the generated key pair’s ID.

The response provides a couple of bits of useful information. First, we have our public key in this response, and we need to send that to the server to be stored. Second, we also get back the clientDataJSON property which we can decode, and from there, get back the typechallenge, and origin of the passkey.

For attestation, we want to validate the typechallenge, and origin on the server, as well as store the public key with its identifier, e.g. kid. We can also optionally store the attestationObject if we wish. Another useful property to store is the COSE algorithm, which is defined above in our  PublicKeyCredentialCreationOptions with alg: -7 or alg: -256, in order to easily verify any signed challenges in the assertion phase.

Assertion

View full size

The navigator.credentials.get API will be the focus of the assertion phase. Conceptually, this would be where the user logs in to the web application after signing up.

// The `challenge` is random and has to come from the server
const publicKey: PublicKeyCredentialRequestOptions = {
  challenge: new TextEncoder().encode(challenge),
  rpId: window.location.host,
  timeout: 60_000,
};
const publicKeyCredential: PublicKeyCredential = await navigator.credentials.get({
  publicKey,
  mediation: 'optional',
});
const {
  id // the key id, aka kid
} = pubKeyCredential;
const { clientDataJSON, attestationObject, signature, userHandle } = pubKeyCredential.response;
const { type, challenge, origin } = JSON.parse(new TextDecoder().decode(clientDataJSON));
// Send data off to the server for verification

We’ll again get a PublicKeyCredential with an AuthenticatorAssertionResponse this time. The credential again includes the key identifier.

We also get the typechallenge, and origin from the clientDataJSON again. The signature is now included in the response, as well as the authenticatorData. We’ll need those and the clientDataJSON to verify that this was signed with the private key.

The authenticatorData includes some properties that are worth tracking First is the SHA256 hash of the origin you’re using, located within the first 32 bytes, which is useful for verifying that request comes from the same origin server. Second is the signCount, which is from byte 33 to 37. This is generated from the authenticator and should be compared to its previous value to ensure that nothing fishy is going on with the key. The value should always 0 when it’s a multi-device passkey and should be randomly larger than the previous signCount when it’s a single-device passkey.

Once you’ve asserted your login, you should be logged in — congratulations! Passkeys is a pretty great protocol, but it does come with some caveats.

Some downsides

There’s a lot of upside to Passkeys, however, there are some issues with it at the time of this writing. For one thing, passkeys is somewhat still early support-wise, with only single-device credentials allowed on Windows and very little support for Linux systems. Passkeys.dev provides a nice table that’s sort of like the Caniuse of this protocol.

Also, Google’s and Apple’s passkeys platforms do not communicate with each other. If you want to get your credentials from your Android phone over to your iPhone… well, you’re out of luck for now. That’s not to say there is no interoperability! You can log in to your computer by using your phone as an authenticator. But it would be much cleaner just to have it built into the operating system and synced without it being locked at the vendor level.

Where are things going?

What does the passkeys protocol of the future look like? It looks pretty good! Once it gains support from more operating systems, there should be an uptake in usage, and you’ll start seeing it used more and more in the wild. Some password managers are even going to support them first-hand.

Passkeys are by no means only supported on the web. Android and iOS will both support native passkeys as first-class citizens. We’re still in the early days of all this, but expect to see it mentioned more and more.

After all, we eliminate the need for passwords, and by doing so, make the world safer for it!

Resources

Here are some more resources if you want to learn more about Passkeys. There’s also a repository and demo I put together for this article.


Passkeys: What the Heck and Why? originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

Some Cross-Browser DevTools Features You Might Not Know

Post pobrano z: Some Cross-Browser DevTools Features You Might Not Know

I spend a lot of time in DevTools, and I’m sure you do too. Sometimes I even bounce between them, especially when I’m debugging cross-browser issues. DevTools is a lot like browsers themselves — not all of the features in one browser’s DevTools will be the same or supported in another browser’s DevTools.

But there are quite a few DevTools features that are interoperable, even some lesser-known ones that I’m about to share with you.

For the sake of brevity, I use “Chromium” to refer to all Chromium-based browsers, like Chrome, Edge, and Opera, in the article. Many of the DevTools in them offer the exact same features and capabilities as one another, so this is just my shorthand for referring to all of them at once.

Search nodes in the DOM tree

Sometimes the DOM tree is full of nodes nested in nodes that are nested in other nodes, and so on. That makes it pretty tough to find the exact one you’re looking for, but you can quickly search the DOM tree using Cmd + F (macOS) or Ctrl + F (Windows).

Additionally, you can also search using a valid CSS selector, like .red, or using an XPath, like //div/h1.

DevTools screenshots of all three browsers.
Searching text in Chrome DevTools (left), selectors in Firefox DevTools (center), and XPath in Safari DevTools (right)

In Chromium browsers, the focus automatically jumps to the node that matches the search criteria as you type, which could be annoying if you are working with longer search queries or a large DOM tree. Fortunately, you can disable this behavior by heading to Settings (F1) → PreferencesGlobalSearch as you typeDisable.

After you have located the node in the DOM tree, you can scroll the page to bring the node within the viewport by right-clicking on the nod, and selecting “Scroll into view”.

Showing a highlighted node on a webpage with a contextual menu open to scroll into view

Access nodes from the console

DevTools provides many different ways to access a DOM node directly from the console.

For example, you can use $0 to access the currently selected node in the DOM tree. Chromium browsers take this one step further by allowing you to access nodes selected in the reverse chronological order of historic selection using, $1, $2, $3, etc.

Currently selected node accessed from the Console in Edge DevTools

Another thing that Chromium browsers allow you to do is copy the node path as a JavaScript expression in the form of document.querySelector by right-clicking on the node, and selecting CopyCopy JS path, which can then be used to access the node in the console.

Here’s another way to access a DOM node directly from the console: as a temporary variable. This option is available by right-clicking on the node and selecting an option. That option is labeled differently in each browser’s DevTools:

  • Chromium: Right click → “Store as global variable”
  • Firefox: Right click → “Use in Console”
  • Safari: Right click → “Log Element”
Screenshot of DevTools contextual menus in all three browsers.
Access a node as a temporary variable in the console, as shown in Chrome (left), Firefox (center), and Safari (right)

Visualize elements with badges

DevTools can help visualize elements that match certain properties by displaying a badge next to the node. Badges are clickable, and different browsers offer a variety of different badges.

In Safari, there is a badge button in the Elements panel toolbar which can be used to toggle the visibility of specific badges. For example, if a node has a display: grid or display: inline-grid CSS declaration applied to it, a grid badge is displayed next to it. Clicking on the badge will highlight grid areas, track sizes, line numbers, and more, on the page.

A grid overlay visualized on top of a three-by-three grid.
Grid overlay with badges in Safari DevTools

The badges that are currently supported in Firefox’s DevTools are listed in the Firefox source docs. For example, a scroll badge indicates a scrollable element. Clicking on the badge highlights the element causing the overflow with an overflow badge next to it.

Overflow badge in Firefox DevTools located in the HTML panel

In Chromium browsers, you can right-click on any node and select “Badge settings…” to open a container that lists all of the available badges. For example, elements with scroll-snap-type will have a scroll-snap badge next to it, which on click, will toggle the scroll-snap overlay on that element.

Taking screenshots

We’ve been able to take screenshots from some DevTools for a while now, but it’s now available in all of them and includes new ways to take full-page shots.

The process starts by right-clicking on the DOM node you want to capture. Then select the option to capture the node, which is labeled differently depending on which DevTools you’re using.

Screenshot of DevTools in all three browsers.
Chrome (left), Safari (middle), and Firefox (right)

Repeat the same steps on the html node to take a full-page screenshot. When you do, though, it’s worth noting that Safari retains the transparency of the element’s background color — Chromium and Firefox will capture it as a white background.

Two screenshots of the same element, one with a background and one without.
Comparing screenshots in Safari (left) and Chromium (right)

There’s another option! You can take a “responsive” screenshot of the page, which allows you to capture the page at a specific viewport width. As you might expect, each browser has different ways to get there.

  • Chromium: Cmd + Shift + M (macOS) or Ctrl + Shift + M (Windows). Or click the “Devices” icon next to the “Inspect” icon.
  • Firefox: Tools → Browser Tools → “Responsive Design Mode”
  • Safari: Develop → “Enter Responsive Design Mode”
Enter responsive mode options in DevTools for all three browsers.
Launching responsive design mode in Safari (left), Firefox (right), and Chromium (bottom)

Chrome tip: Inspect the top layer

Chrome lets you visualize and inspect top-layer elements, like a dialog, alert, or modal. When an element is added to the #top-layer, it gets a top-layer badge next to it, which on click, jumps you to the top-layer container located just after the </html> tag.

The order of the elements in the top-layer container follows the stacking order, which means the last one is on the top. Click the reveal badge to jump back to the node.

Firefox tip: Jump to ID

Firefox links the element referencing the ID attribute to its target element in the same DOM and highlights it with an underline. Use CMD + Click (macOS) or CTRL + Click (Windows) )to jump to the target element with the identifier.

Wrapping up

Quite a few things, right? It’s awesome that there are some incredibly useful DevTools features that are supported in Chromium, Firefox, and Safari alike. Are there any other lesser-known features supported by all three that you like?

There are a few resources I keep close by to stay on top of what’s new. I thought I’d share them with here:


Some Cross-Browser DevTools Features You Might Not Know originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

Making Calendars With Accessibility and Internationalization in Mind

Post pobrano z: Making Calendars With Accessibility and Internationalization in Mind

Doing a quick search here on CSS-Tricks shows just how many different ways there are to approach calendars. Some show how CSS Grid can create the layout efficiently. Some attempt to bring actual data into the mix. Some rely on a framework to help with state management.

There are many considerations when building a calendar component — far more than what is covered in the articles I linked up. If you think about it, calendars are fraught with nuance, from handling timezones and date formats to localization and even making sure dates flow from one month to the next… and that’s before we even get into accessibility and additional layout considerations depending on where the calendar is displayed and whatnot.

Many developers fear the Date() object and stick with older libraries like moment.js. But while there are many “gotchas” when it comes to dates and formatting, JavaScript has a lot of cool APIs and stuff to help out!

January 2023 calendar grid.

I don’t want to re-create the wheel here, but I will show you how we can get a dang good calendar with vanilla JavaScript. We’ll look into accessibility, using semantic markup and screenreader-friendly <time> -tags — as well as internationalization and formatting, using the Intl.Locale, Intl.DateTimeFormat and Intl.NumberFormat-APIs.

In other words, we’re making a calendar… only without the extra dependencies you might typically see used in a tutorial like this, and with some of the nuances you might not typically see. And, in the process, I hope you’ll gain a new appreciation for newer things that JavaScript can do while getting an idea of the sorts of things that cross my mind when I’m putting something like this together.

First off, naming

What should we call our calendar component? In my native language, it would be called “kalender element”, so let’s use that and shorten that to “Kal-El” — also known as Superman’s name on the planet Krypton.

Let’s create a function to get things going:

function kalEl(settings = {}) { ... }

This method will render a single month. Later we’ll call this method from [...Array(12).keys()] to render an entire year.

Initial data and internationalization

One of the common things a typical online calendar does is highlight the current date. So let’s create a reference for that:

const today = new Date();

Next, we’ll create a “configuration object” that we’ll merge with the optional settings object of the primary method:

const config = Object.assign(
  {
    locale: (document.documentElement.getAttribute('lang') || 'en-US'), 
    today: { 
      day: today.getDate(),
      month: today.getMonth(),
      year: today.getFullYear() 
    } 
  }, settings
);

We check, if the root element (<html>) contains a lang-attribute with locale info; otherwise, we’ll fallback to using en-US. This is the first step toward internationalizing the calendar.

We also need to determine which month to initially display when the calendar is rendered. That’s why we extended the config object with the primary date. This way, if no date is provided in the settings object, we’ll use the today reference instead:

const date = config.date ? new Date(config.date) : today;

We need a little more info to properly format the calendar based on locale. For example, we might not know whether the first day of the week is Sunday or Monday, depending on the locale. If we have the info, great! But if not, we’ll update it using the Intl.Locale API. The API has a weekInfo object that returns a firstDay property that gives us exactly what we’re looking for without any hassle. We can also get which days of the week are assigned to the weekend:

if (!config.info) config.info = new Intl.Locale(config.locale).weekInfo || { 
  firstDay: 7,
  weekend: [6, 7] 
};

Again, we create fallbacks. The “first day” of the week for en-US is Sunday, so it defaults to a value of 7. This is a little confusing, as the getDay method in JavaScript returns the days as [0-6], where 0 is Sunday… don’t ask me why. The weekends are Saturday and Sunday, hence [6, 7].

Before we had the Intl.Locale API and its weekInfo method, it was pretty hard to create an international calendar without many **objects and arrays with information about each locale or region. Nowadays, it’s easy-peasy. If we pass in en-GB, the method returns:

// en-GB
{
  firstDay: 1,
  weekend: [6, 7],
  minimalDays: 4
}

In a country like Brunei (ms-BN), the weekend is Friday and Sunday:

// ms-BN
{
  firstDay: 7,
  weekend: [5, 7],
  minimalDays: 1
}

You might wonder what that minimalDays property is. That’s the fewest days required in the first week of a month to be counted as a full week. In some regions, it might be just one day. For others, it might be a full seven days.

Next, we’ll create a render method within our kalEl-method:

const render = (date, locale) => { ... }

We still need some more data to work with before we render anything:

const month = date.getMonth();
const year = date.getFullYear();
const numOfDays = new Date(year, month + 1, 0).getDate();
const renderToday = (year === config.today.year) && (month === config.today.month);

The last one is a Boolean that checks whether today exists in the month we’re about to render.

Semantic markup

We’re going to get deeper in rendering in just a moment. But first, I want to make sure that the details we set up have semantic HTML tags associated with them. Setting that up right out of the box gives us accessibility benefits from the start.

Calendar wrapper

First, we have the non-semantic wrapper: <kal-el>. That’s fine because there isn’t a semantic <calendar> tag or anything like that. If we weren’t making a custom element, <article> might be the most appropriate element since the calendar could stand on its own page.

Month names

The <time> element is going to be a big one for us because it helps translate dates into a format that screenreaders and search engines can parse more accurately and consistently. For example, here’s how we can convey “January 2023” in our markup:

<time datetime="2023-01">January <i>2023</i></time>

Day names

The row above the calendar’s dates containing the names of the days of the week can be tricky. It’s ideal if we can write out the full names for each day — e.g. Sunday, Monday, Tuesday, etc. — but that can take up a lot of space. So, let’s abbreviate the names for now inside of an <ol> where each day is a <li>:

<ol>
  <li><abbr title="Sunday">Sun</abbr></li>
  <li><abbr title="Monday">Mon</abbr></li>
  <!-- etc. -->
</ol>

We could get tricky with CSS to get the best of both worlds. For example, if we modified the markup a bit like this:

<ol>
  <li>
    <abbr title="S">Sunday</abbr>
  </li>
</ol>

…we get the full names by default. We can then “hide” the full name when space runs out and display the title attribute instead:

@media all and (max-width: 800px) {
  li abbr::after {
    content: attr(title);
  }
}

But, we’re not going that way because the Intl.DateTimeFormat API can help here as well. We’ll get to that in the next section when we cover rendering.

Day numbers

Each date in the calendar grid gets a number. Each number is a list item (<li>) in an ordered list (<ol>), and the inline <time> tag wraps the actual number.

<li>
  <time datetime="2023-01-01">1</time>
</li>

And while I’m not planning to do any styling just yet, I know I will want some way to style the date numbers. That’s possible as-is, but I also want to be able to style weekday numbers differently than weekend numbers if I need to. So, I’m going to include data-* attributes specifically for that: data-weekend and data-today.

Week numbers

There are 52 weeks in a year, sometimes 53. While it’s not super common, it can be nice to display the number for a given week in the calendar for additional context. I like having it now, even if I don’t wind up not using it. But we’ll totally use it in this tutorial.

We’ll use a data-weeknumber attribute as a styling hook and include it in the markup for each date that is the week’s first date.

<li data-day="7" data-weeknumber="1" data-weekend="">
  <time datetime="2023-01-08">8</time>
</li>

Rendering

Let’s get the calendar on a page! We already know that <kal-el> is the name of our custom element. First thing we need to configure it is to set the firstDay property on it, so the calendar knows whether Sunday or some other day is the first day of the week.

<kal-el data-firstday="${ config.info.firstDay }">

We’ll be using template literals to render the markup. To format the dates for an international audience, we’ll use the Intl.DateTimeFormat API, again using the locale we specified earlier.

The month and year

When we call the month, we can set whether we want to use the long name (e.g. February) or the short name (e.g. Feb.). Let’s use the long name since it’s the title above the calendar:

<time datetime="${year}-${(pad(month))}">
  ${new Intl.DateTimeFormat(
    locale,
    { month:'long'}).format(date)} <i>${year}</i>
</time>

Weekday names

For weekdays displayed above the grid of dates, we need both the long (e.g. “Sunday”) and short (abbreviated, ie. “Sun”) names. This way, we can use the “short” name when the calendar is short on space:

Intl.DateTimeFormat([locale], { weekday: 'long' })
Intl.DateTimeFormat([locale], { weekday: 'short' })

Let’s make a small helper method that makes it a little easier to call each one:

const weekdays = (firstDay, locale) => {
  const date = new Date(0);
  const arr = [...Array(7).keys()].map(i => {
    date.setDate(5 + i)
    return {
      long: new Intl.DateTimeFormat([locale], { weekday: 'long'}).format(date),
      short: new Intl.DateTimeFormat([locale], { weekday: 'short'}).format(date)
    }
  })
  for (let i = 0; i < 8 - firstDay; i++) arr.splice(0, 0, arr.pop());
  return arr;
}

Here’s how we invoke that in the template:

<ol>
  ${weekdays(config.info.firstDay,locale).map(name => `
    <li>
      <abbr title="${name.long}">${name.short}</abbr>
    </li>`).join('')
  }
</ol>

Day numbers

And finally, the days, wrapped in an <ol> element:

${[...Array(numOfDays).keys()].map(i => {
  const cur = new Date(year, month, i + 1);
  let day = cur.getDay(); if (day === 0) day = 7;
  const today = renderToday && (config.today.day === i + 1) ? ' data-today':'';
  return `
    <li data-day="${day}"${today}${i === 0 || day === config.info.firstDay ? ` data-weeknumber="${new Intl.NumberFormat(locale).format(getWeek(cur))}"`:''}${config.info.weekend.includes(day) ? ` data-weekend`:''}>
      <time datetime="${year}-${(pad(month))}-${pad(i)}" tabindex="0">
        ${new Intl.NumberFormat(locale).format(i + 1)}
      </time>
    </li>`
}).join('')}

Let’s break that down:

  1. We create a “dummy” array, based on the “number of days” variable, which we’ll use to iterate.
  2. We create a day variable for the current day in the iteration.
  3. We fix the discrepancy between the Intl.Locale API and getDay().
  4. If the day is equal to today, we add a data-* attribute.
  5. Finally, we return the <li> element as a string with merged data.
  6. tabindex="0" makes the element focusable, when using keyboard navigation, after any positive tabindex values (Note: you should never add positive tabindex-values)

To “pad” the numbers in the datetime attribute, we use a little helper method:

const pad = (val) => (val + 1).toString().padStart(2, '0');

Week number

Again, the “week number” is where a week falls in a 52-week calendar. We use a little helper method for that as well:

function getWeek(cur) {
  const date = new Date(cur.getTime());
  date.setHours(0, 0, 0, 0);
  date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
  const week = new Date(date.getFullYear(), 0, 4);
  return 1 + Math.round(((date.getTime() - week.getTime()) / 86400000 - 3 + (week.getDay() + 6) % 7) / 7);
}

I didn’t write this getWeek-method. It’s a cleaned up version of this script.

And that’s it! Thanks to the Intl.Locale, Intl.DateTimeFormat and Intl.NumberFormat APIs, we can now simply change the lang-attribute of the <html> element to change the context of the calendar based on the current region:

January 2023 calendar grid.
de-DE
January 2023 calendar grid.
fa-IR
January 2023 calendar grid.
zh-Hans-CN-u-nu-hanidec

Styling the calendar

You might recall how all the days are just one <ol> with list items. To style these into a readable calendar, we dive into the wonderful world of CSS Grid. In fact, we can repurpose the same grid from a starter calendar template right here on CSS-Tricks, but updated a smidge with the :is() relational pseudo to optimize the code.

Notice that I’m defining configurable CSS variables along the way (and prefixing them with ---kalel- to avoid conflicts).

kal-el :is(ol, ul) {
  display: grid;
  font-size: var(--kalel-fz, small);
  grid-row-gap: var(--kalel-row-gap, .33em);
  grid-template-columns: var(--kalel-gtc, repeat(7, 1fr));
  list-style: none;
  margin: unset;
  padding: unset;
  position: relative;
}
Seven-column calendar grid with grid lines shown.

Let’s draw borders around the date numbers to help separate them visually:

kal-el :is(ol, ul) li {
  border-color: var(--kalel-li-bdc, hsl(0, 0%, 80%));
  border-style: var(--kalel-li-bds, solid);
  border-width: var(--kalel-li-bdw, 0 0 1px 0);
  grid-column: var(--kalel-li-gc, initial);
  text-align: var(--kalel-li-tal, end); 
}

The seven-column grid works fine when the first day of the month is also the first day of the week for the selected locale). But that’s the exception rather than the rule. Most times, we’ll need to shift the first day of the month to a different weekday.

Showing the first day of the month falling on a Thursday.

Remember all the extra data-* attributes we defined when writing our markup? We can hook into those to update which grid column (--kalel-li-gc) the first date number of the month is placed on:

[data-firstday="1"] [data-day="3"]:first-child {
  --kalel-li-gc: 1 / 4;
}

In this case, we’re spanning from the first grid column to the fourth grid column — which will automatically “push” the next item (Day 2) to the fifth grid column, and so forth.

Let’s add a little style to the “current” date, so it stands out. These are just my styles. You can totally do what you’d like here.

[data-today] {
  --kalel-day-bdrs: 50%;
  --kalel-day-bg: hsl(0, 86%, 40%);
  --kalel-day-hover-bgc: hsl(0, 86%, 70%);
  --kalel-day-c: #fff;
}

I like the idea of styling the date numbers for weekends differently than weekdays. I’m going to use a reddish color to style those. Note that we can reach for the :not() pseudo-class to select them while leaving the current date alone:

[data-weekend]:not([data-today]) { 
  --kalel-day-c: var(--kalel-weekend-c, hsl(0, 86%, 46%));
}

Oh, and let’s not forget the week numbers that go before the first date number of each week. We used a data-weeknumber attribute in the markup for that, but the numbers won’t actually display unless we reveal them with CSS, which we can do on the ::before pseudo-element:

[data-weeknumber]::before {
  display: var(--kalel-weeknumber-d, inline-block);
  content: attr(data-weeknumber);
  position: absolute;
  inset-inline-start: 0;
  /* additional styles */
}

We’re technically done at this point! We can render a calendar grid that shows the dates for the current month, complete with considerations for localizing the data by locale, and ensuring that the calendar uses proper semantics. And all we used was vanilla JavaScript and CSS!

But let’s take this one more step

Rendering an entire year

Maybe you need to display a full year of dates! So, rather than render the current month, you might want to display all of the month grids for the current year.

Well, the nice thing about the approach we’re using is that we can call the render method as many times as we want and merely change the integer that identifies the month on each instance. Let’s call it 12 times based on the current year.

as simple as calling the render-method 12 times, and just change the integer for monthi:

[...Array(12).keys()].map(i =>
  render(
    new Date(date.getFullYear(),
    i,
    date.getDate()),
    config.locale,
    date.getMonth()
  )
).join('')

It’s probably a good idea to create a new parent wrapper for the rendered year. Each calendar grid is a <kal-el> element. Let’s call the new parent wrapper <jor-el>, where Jor-El is the name of Kal-El’s father.

<jor-el id="app" data-year="true">
  <kal-el data-firstday="7">
    <!-- etc. -->
  </kal-el>

  <!-- other months -->
</jor-el>

We can use <jor-el> to create a grid for our grids. So meta!

jor-el {
  background: var(--jorel-bg, none);
  display: var(--jorel-d, grid);
  gap: var(--jorel-gap, 2.5rem);
  grid-template-columns: var(--jorel-gtc, repeat(auto-fill, minmax(320px, 1fr)));
  padding: var(--jorel-p, 0);
}

Final demo

CodePen Embed Fallback

Bonus: Confetti Calendar

I read an excellent book called Making and Breaking the Grid the other day and stumbled on this beautiful “New Year’s poster”:

Source: Making and Breaking the Grid (2nd Edition) by Timothy Samara

I figured we could do something similar without changing anything in the HTML or JavaScript. I’ve taken the liberty to include full names for months, and numbers instead of day names, to make it more readable. Enjoy!

CodePen Embed Fallback

Making Calendars With Accessibility and Internationalization in Mind originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

5 Mistakes I Made When Starting My First React Project

Post pobrano z: 5 Mistakes I Made When Starting My First React Project

You know what it’s like to pick up a new language or framework. Sometimes there’s great documentation to help you find your way through it. But even the best documentation doesn’t cover absolutely everything. And when you work with something that’s new, you’re bound to find a problem that doesn’t have a written solution.

That’s how it was for me the first time I created a React project — and React is one of those frameworks with remarkable documentation, especially now with the beta docs. But I still struggled my way through. It’s been quite a while since that project, but the lessons I gained from it are still fresh in my mind. And even though there are a lot of React “how-to” tutorials in out there, I thought I’d share what I wish I knew when I first used it.

So, that’s what this article is — a list of the early mistakes I made. I hope they help make learning React a lot smoother for you.

Using create-react-app to start a project

TL;DR Use Vite or Parcel.

Create React App (CRA) is a tool that helps you set up a new React project. It creates a development environment with the best configuration options for most React projects. This means you don’t have to spend time configuring anything yourself.

As a beginner, this seemed like a great way to start my work! No configuration! Just start coding!

CRA uses two popular packages to achieve this, webpack and Babel. webpack is a web bundler that optimizes all of the assets in your project, such as JavaScript, CSS, and images. Babel is a tool that allows you to use newer JavaScript features, even if some browsers don’t support them.

Both are good, but there are newer tools that can do the job better, specifically Vite and Speedy Web Compiler (SWC).

These new and improved alternatives are faster and easier to configure than webpack and Babel. This makes it easier to adjust the configuration which is difficult to do in create-react-app without ejecting.

To use them both when setting up a new React project you have to make sure you have Node version 12 or higher installed, then run the following command.

npm create vite

You’ll be asked to pick a name for your project. Once you do that, select React from the list of frameworks. After that, you can select either Javascript + SWC or Typescript + SWC

Then you’ll have to change directory cd into your project and run the following command;

npm i && npm run dev

This should run a development server for your site with the URL localhost:5173

And it’s as simple as that.

Using defaultProps for default values

TL;DR Use default function parameters instead.

Data can be passed to React components through something called props. These are added to a component just like attributes in an HTML element and can be used in a component’s definition by taking the relevant values from the prop object passed in as an argument.

// App.jsx
export default function App() {
  return <Card title="Hello" description="world" />
}

// Card.jsx
function Card(props) {
  return (
    <div>
      <h1>{props.title}</h1>
      <p>{props.description}</p>
    </div>
  );
}

export default Card;

If a default value is ever required for a prop, the defaultProp property can be used:

// Card.jsx
function Card(props) {
  // ...
}

Card.defaultProps = {
  title: 'Default title',
  description: 'Desc',
};

export default Card;

With modern JavaScript, it is possible to destructure the props object and assign a default value to it all in the function argument.

// Card.jsx
function Card({title = "Default title", description= "Desc"}) {
  return (
    <div>
      <h1>5 Mistakes I Made When Starting My First React Project</h1>
      <p>{description}</p>
    </div>
  )
}

export default Card;

This is more favorable as the code that can be read by modern browsers without the need for extra transformation.

Unfortunately, defaultProps do require some transformation to be read by the browser since JSX (JavaScript XML) isn’t supported out of the box. This could potentially affect the performance of an application that is using a lot of defaultProps.

Don’t use propTypes

TL;DR Use TypeScript.

In React, the propTypes property can be used to check if a component is being passed the correct data type for its props. They allow you to specify the type of data that should be used for each prop such as a string, number, object, etc. They also allow you to specify if a prop is required or not.

This way, if a component is passed the wrong data type or if a required prop is not being provided, then React will throw an error.

// Card.jsx
import { PropTypes } from "prop-types";

function Card(props) {
  // ...
}

Card.propTypes = {
  title: PropTypes.string.isRequired,
  description: PropTypes.string,
};

export default Card;

TypeScript provides a level of type safety in data that’s being passed to components. So, sure, propTypes were a good idea back when I was starting. However, now that TypeScript has become the go-to solution for type safety, I would highly recommend using it over anything else.

// Card.tsx
interface CardProps {
  title: string,
  description?: string,
}

export default function Card(props: CardProps) {
  // ...
}

TypeScript is a programming language that builds on top of JavaScript by adding static type-checking. TypeScript provides a more powerful type system, that can catch more potential bugs and improves the development experience.

Using class components

TL;DR: Write components as functions

Class components in React are created using JavaScript classes. They have a more object-oriented structure and as well as a few additional features, like the ability to use the this keyword and lifecycle methods.

// Card.jsx
class Card extends React.Component {
  render() {
    return (
      <div>
        <h1>{this.props.title}</h1>
        <p>{this.props.description}</p>
      </div>
    )
  }
}

export default Card;

I prefer writing components with classes over functions, but JavaScript classes are more difficult for beginners to understand and this can get very confusing. Instead, I’d recommend writing components as functions:

// Card.jsx
function Card(props) {
  return (
    <div>
      <h1>{props.title}</h1>
      <p>{props.description}</p>
    </div>
  )
}

export default Card;

Function components are simply JavaScript functions that return JSX. They are much easier to read, and do not have additional features like the this keyword and lifecycle methods which make them more performant than class components.

Function components also have the advantage of using hooks. React Hooks allow you to use state and other React features without writing a class component, making your code more readable, maintainable and reusable.

Importing React unnecessarily

TL;DR: There’s no need to do it, unless you need hooks.

Since React 17 was released in 2020, it’s now unnecessary to import React at the top of your file whenever you create a component.

import React from 'react'; // Not needed!
export default function Card() {}

But we had to do that before React 17 because the JSX transformer (the thing that converts JSX into regular JavaScript) used a method called React.createElement that would only work when importing React. Since then, a new transformer has been release which can transform JSX without the createElement method.

You will still need to import React to use hooks, fragments, and any other functions or components you might need from the library:

import { useState } from 'react';

export default function Card() {
  const [count, setCount] = useState(0);
  // ...
}

Those were my early mistakes!

Maybe “mistake” is too harsh a word since some of the better practices came about later. Still, I see plenty of instances where the “old” way of doing something is still being actively used in projects and other tutorials.

To be honest, I probably made way more than five mistakes when getting started. Anytime you reach for a new tool it is going to be more like a learning journey to use it effectively, rather than flipping a switch. But these are the things I still carry with me years later!

If you’ve been using React for a while, what are some of the things you wish you knew before you started? It would be great to get a collection going to help others avoid the same struggles.


5 Mistakes I Made When Starting My First React Project originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

How to Add Fonts to Photoshop (Mac and Windows)

Post pobrano z: How to Add Fonts to Photoshop (Mac and Windows)

Final product imageFinal product imageFinal product image
What You’ll Be Creating

Want to add a new font to Adobe Photoshop? Using Adobe Fonts is an easy way to do so via Adobe’s Creative Cloud. We can use this tool to add new fonts to Photoshop, as well as other Creative Cloud apps, quickly and easily!

In this article, we’ll learn how to use Adobe Fonts to easily add fonts to Photoshop, as well as some other ways to install fonts for both Windows and Mac.

Please note that we’ll be using Adobe Creative Cloud in this tutorial; Adobe Fonts are included with your Creative Cloud subscription.

Watch How to Add Fonts to Photoshop (Mac and Windows)

If you prefer to learn about adding fonts to Photoshop via video, you can follow along with us over on our Envato Tuts+ YouTube channel:

What You’ll Learn in This Tutorial on Adding Fonts to Photoshop

  • How to use Adobe Fonts to add fonts to Photoshop
  • How to install new fonts on Windows 10
  • How to add fonts on Mac

1. How to Use Adobe Fonts

Step 1

Learning how to add fonts to Photoshop with Adobe Fonts is easy. Begin by opening up Adobe Creative Cloud. Make sure that you’ve updated and you’re running the latest version.

Not sure where to find it? 

  • On Windows, you can find the Creative Cloud application by searching for it in the taskbar. 
  • On Mac, you can find the Creative Cloud application by searching for it on your launchpad (or you could ask Siri!). 
Opening Creative CloudOpening Creative CloudOpening Creative Cloud

Step 2

Next, click on the font icon at the top right of the window, and select Manage Fonts. This will open Adobe Fonts in your default browser.

Note: You can also find a link to Adobe Fonts in the resource link.

Adobe Creative CloudAdobe Creative CloudAdobe Creative Cloud

Step 3

Note, you may need to log in to your Adobe account, if you aren’t already logged in. Remember to log in with the same account associated with your Creative Cloud subscription.

From here, within our browser, we can search for fonts, based on any criteria we like! Type in a search term or use the filters to find fonts suitable for your project.

Adobe Fonts in BrowserAdobe Fonts in BrowserAdobe Fonts in Browser

Step 4

For example, let’s check out some of the Classifications—like Sans Serif. This might be a great fit for body copy. Looking for something with a bit more variety? Try out Hand or Decorative. 

Font FiltersFont FiltersFont Filters

Step 5

If you’re looking for a very particular kind of style, you can also use the Properties search options. Looking for bold fonts, for example? Try the thicker weight. 

Adjust these settings until you find what’s right for you.

Browse through the fonts to pick out one that appeals to you and select the View Family button.

Searching for fontsSearching for fontsSearching for fonts

Step 6

We also have several options for previewing fonts. We can, for example, change the sample text to get a better feel for how the type looks before we install it. This can be helpful if you’re looking for a font for a specific word or phrase.

You can also adjust the text size in this preview. For example, we could make it quite small to test out readability and legibility at smaller sizes—or to take it for a test run for something like body copy.

Searching for fontsSearching for fontsSearching for fonts

Step 7

Once you’ve found a font that you’d like to use, we can select View Family to get a more detailed look at it. 

Select a font, and then click on View Family to proceed.

Viewing a Font FamilyViewing a Font FamilyViewing a Font Family

Step 8

In this example, I’ve chosen to take a closer look at the Macho font. 

If you’ve decided you’d like to use a font, click on Activate Font, as highlighted below. It’s that easy! Adobe Creative Cloud will then activate that font and make it available for you.

Activating an Adobe FontActivating an Adobe FontActivating an Adobe Font

Step 9

Now, I can return to Photoshop and search for my newly activated font. With the Text Tool selected, I typed the name of my font into the Options Bar

Check it out! There’s Macho—my newly activated font. And that’s that—piece of cake. You just learned to add a font to Photoshop.

Selecting a fontSelecting a fontSelecting a font

2. How to Install New Fonts in Windows 10

Adobe Fonts is handy, but it’s not the only way to learn how to import fonts to Photoshop. We can also do so outside of Creative Cloud. 

Not sure how? Check out this step-by-step tutorial. It has both a text walk-through and a video to help you out, specifically for Windows 10:

Or here’s a quick guide to learn how to import fonts to Photoshop on Windows 10:

  • Download your font from a source on the Internet.
  • Many times, font files will come in a compressed zip file. Extract the font files to your Desktop (or another place on your computer).
  • Then, locate your Windows folder, where your operating system has been installed.
  • Inside the Windows folder, open up the Fonts folder.
  • Drag your extracted font files to the Fonts folder.

Then, you should see visual confirmation that Windows is installing your font. Voila!

3. How to Add Fonts on Mac

On a Mac instead? Like Windows, you also have the option to install fonts in other ways—particularly using Font Book. Here’s how to install fonts in Photoshop on Mac:

  • Download your font from a source on the Internet. Again, many times, font files will come in a compressed zip file.
  • Extract these files by double-clicking on the zip file. Your Mac should automatically create a folder with the contents inside.
  • Click on the font file and a preview will open up in Font Book for you.
  • Then, click Install Font to install your font.
  • This will take you to your fonts within Font Book, where you can preview your newly installed font.

Simple, right? You can also arrange, enable, disable, and uninstall fonts from Font Book!

Want to know more or need a little extra help? Check out this step-by-step tutorial, with both a text and video guide for how to install fonts in Photoshop on a Mac:

And There You Have It!

We have plenty of options when it comes to adding fonts to Photoshop on our computers. Now you know many ways to add a font to Photoshop. Whether you choose the convenience of installation via Adobe Fonts and Creative Cloud or you prefer another method, it’s a great idea to know more than one way to do these things. Why? Sometimes, one way might prove to be a little more convenient than another!

Love typography? Want more font-related tips and tricks? Check out these articles:

23 Best Norse Fonts (Viking, Rune, and Nordic-Style Fonts)

Post pobrano z: 23 Best Norse Fonts (Viking, Rune, and Nordic-Style Fonts)

Norse fonts possess a mythical quality that can really transform a design project. If you are in the market for a Nordic writing font, then you’ll love this collection of 23 best Viking fonts from Envato Elements we’re featuring today.

Envato Elements is a terrific resource for a wide variety of fonts and other thousands of premium digital assets like graphic templates, mockups, add-ons, photos, and much more. Moreover, for one low monthly fee, you can download as many of these digital assets as you like, as often as you like.

Let’s take a look at some of the wonderful Viking rune fonts and other Nordic fonts available from Envato Elements.

23 Best Norse Style Fonts

1. Nordica Viking Font (OTF, TTF)

Nordica Viking FontNordica Viking FontNordica Viking Font

The beautiful Nordica Viking Font helps you bring the soul of the north into your design work. Great for posters, apparel design, branding, greeting cards, and invitations, Nordica comes with upper-case only characters, numerals, and basic punctuation.

2. Lexaviers Nordic Font (TTF, OTF, WOFF)

Lexaviers Nordic FontLexaviers Nordic FontLexaviers Nordic Font

Lexaviers Nordic Font is an excellent font for giving your text that strong Nordic touch. Use it for titles, labels, T-shirts, product packaging, invitations, advertising, and more.

3. Modern Nordic Font (TTF, OTF, WOFF)

Modern Nordic FontModern Nordic FontModern Nordic Font

This wonderfully whimsical font is a perfect display font for posters, titles, headlines, and the like. The Nordic font includes uppercase and lowercase characters, special glyphs, and multilingual support.

4. Scourge Nordic Font Style (TTF, OTF)

Scourge Nordic Font Style (TTF, OTF, WOFF)Scourge Nordic Font Style (TTF, OTF, WOFF)Scourge Nordic Font Style (TTF, OTF, WOFF)

Scourge Nordic Font Style is a textured runic typeface that includes uppercase multilingual letters, numbers, and punctuation. Add this interesting font to your special projects to give them an air of the mysterious.

5. Christmas Nordic Font (TTF, OTF, WOFF)

Christmas Nordic FontChristmas Nordic FontChristmas Nordic Font

In the festive spirit? Try Christmas Nordic Font, a hand-drawn display font that will charm everyone who sees it. The font is offered in regular and bold styles and includes uppercase and lowercase characters

6. Jotunheim Norse Rune Font (TTF, OTF)

Jotunheim Norse Rune FontJotunheim Norse Rune FontJotunheim Norse Rune Font

Jotunheim Norse Rune Font is inspired by ancient runes. The Nordic font features three different versions. The first is the most simple and legible style, the second is a bit more complex with some reduced legibility, and the third is the most intricate of the three styles. Mix the three versions to achieve unique results.

7. Legendary Norse Runes Font (TTF, OTF, WOFF)

Legendary Norse Runes FontLegendary Norse Runes FontLegendary Norse Runes Font

Legendary Norse Runes Font is a fantasy font inspired by Nordic mythology. The font includes upper and lowercase characters, symbols, punctuation, and loads of ligatures and alternates to help you create your own unique look.

8. Viking Runic Alphabet Font (OTF)

Viking Runic Alphabet FontViking Runic Alphabet FontViking Runic Alphabet Font

The Viking Runic Alphabet Font combines old Norse fonts with contemporary expressions.

9. Paraoh Sacred Norse Font (TTF, OTF)

Paraoh Sacred Norse FontParaoh Sacred Norse FontParaoh Sacred Norse Font

Paraoh Sacred Norse Font is a stylish handwritten Norse script font that you can use when you need a unique display font for that special project. You can use it for signage, titles, logos, and more.

10. Mjölnir Old Norse Style Font (TTF, OTF, WOFF)

Mjölnir Old Norse Style FontMjölnir Old Norse Style FontMjölnir Old Norse Style Font

Mjölnir Old Norse Style Font is a tribal font inspired by Nordic runes and the Viking era. This tribal font is meant to be used for headlines, titles, logos, posters, etc. The font offers uppercase and lowercase characters, special glyphs, and multilingual support.

11. Forestarms Norse Letters Font (OTF)

Forestarms Norse Letters FontForestarms Norse Letters FontForestarms Norse Letters Font

Forestarms Norse Letters Font is a mystical sans serif font designed with thin, tall, straight letters with sharp corners. The Nordic font offers uppercase and lowercase characters and numbers.

12. Noatun Viking Letters Font (TTF, OTF, WOFF)

Noatun Viking Letters FontNoatun Viking Letters FontNoatun Viking Letters Font

Noatun Viking Letters Font is a gorgeous and enigmatic font. It comes in two different versions and features a unique geometric style. It’s perfect for titles, logos, posters, and other projects where a display font is needed.

13. Solaire Norse Rune Font (TTF, OTF, WOFF)

Solaire Norse Rune FontSolaire Norse Rune FontSolaire Norse Rune Font

Solaire Norse Rune Font is a fantasy font with a runic feel to it. Some letters have alternates which can be toggled via caps lock.

14. Garked Nordic Lettering (OTF, TTF, WOFF)

Garked Typeface FontGarked Typeface FontGarked Typeface Font

Garked is a beautiful display font that features runic elements of the Viking Age and contemporary font elements. All the letters have a decorative and geometric appearance that will elevate your design projects. 

15. Darksword: Modern Runic Font (OTF, TTF, WOFF)

Darksword FontDarksword FontDarksword Font

Use this Viking font style when you need a less stylized Nordic display font. This light font is great for large-scale projects with a minimalist aesthetic.

16. Gareon: A Nordic Lettering for Posters (OTF, TTF, WOFF)

Gareon FontGareon FontGareon Font

The Gareon font has a unique and modern geometric style. It’s great for creating logos, film titles, music posters, and other projects that need a strong and unique Nordic font.

17. Requiem Viking Font (TTF, OTF, WOFF)

Viking Rune FontViking Rune FontViking Rune Font

Requiem Viking font offers uniquely styled letters that retain a high degree of legibility. The Nordic font is offered in two styles and includes uppercase characters, multilingual letters, numbers, and punctuation.

18. Loura Norse Style Fonts Style (TTF, OTF, WOFF)

Loura Norse FontsLoura Norse FontsLoura Norse Fonts

Loura is a modern runic font with a fancy touch. If you’re looking for a more stylish, toned-down rune font, try this one. This norse font has uppercase letters, numbers, punctuation marks, and alternates.

19. Haext Rune Font (OTF, TTF)

Haext Rune FontHaext Rune FontHaext Rune Font

There’s a strong influence of neo-gothic, rustic, and Scandinavian fonts in the Haext Font. Create beautiful designs by pairing this Nordic font with black and white or color.

20. Playful Scandinavian Font (TTF, OTF, WOFF)

Playful Scandinavian FontPlayful Scandinavian FontPlayful Scandinavian Font

Here’s a fun and modern take on Scandinavian font styles. It’s a great font for large projects, titles, headers, and children’s projects. 

21. Ornacle Modern Font With Runic Designs (TTF, OTF, WOFF)

Ornacle Futuristic Nordic FontOrnacle Futuristic Nordic FontOrnacle Futuristic Nordic Font

Ornacle is a futuristic and modern runic font. This Norse font is ideal for logos, headers, titles, prints, and other creative possibilities.

22. Mqpegrh: Norse Style Fonts (TTF, OTF, WOFF)

Norse Style FontsNorse Style FontsNorse Style Fonts

Mqpegrh is a fun and linear Viking font style. From letterheads and titles to stationery, its one-of-a-kind look will help you create amazing designs!

23. Relic Island Nordic Font (OTF, TTF)

Relic Island FontRelic Island FontRelic Island Font

Relic Island is a beautiful, bold typeface with a unique twist. It has a thick shape and some rune-inspired designs, as well as many letter combinations. Get inspired by adventure and nostalgia!

Choose Your Favorite Modern Runic Fonts

Now you know just where to find the best Nordic fonts when you need them. Head on over to Envato Elements and download your favorite font today.

And if you’re interested in learning more about a wide variety of fonts, check out these super helpful articles below:

How to Storyboard: A Basic Guide for Aspiring Artists

Post pobrano z: How to Storyboard: A Basic Guide for Aspiring Artists

Final product imageFinal product imageFinal product image
What You’ll Be Creating

Have you ever what wondered what kind of planning goes into making commercials, short films, or animations? Well, for starters, the backbone of any of these projects is a storyboard or a storyboard artist.

Storyboard artists are individuals who take a script/concept and turn it into a visual story.

If you want to become a storyboard artist on any type of production set, whether it’s a freelance job, personal project, TV show, commercial, or music video, there are some guidelines you need to follow in order to get the storyboards created.

Contrary to what many might think, you don’t need to be a great artist to illustrate a storyboard, although of course it’s a bonus. Generally, all that is really required is an understanding of the basic techniques and principles of storyboard art. Your role is to be able to communicate the vision and concept as accurately as possible.

If you want to learn how to be a storyboard artist, this is the tutorial for you. Along the way, you will learn what essential skills you need to get you motivated and started in the creative field and art of storyboarding.

Let’s get you started!!

1. Introduction to Storyboarding

1.1 What Is a Storyboard?

Storyboarding is the practice of producing storyboard sketches for a script/concept. It is an essential part of the preproduction process of any animation. 

It’s a sequence of hand-drawn sketches or visual images that are supported by script notes or dialogue and placed in a sequence, for the viewer to visualise an animation before production. 

Each shot in a storyboard represents a type of camera shot, angle, action, or special effect, to effectively tell a story.

storyboard script notes dialogue camera shot angle action special effectsstoryboard script notes dialogue camera shot angle action special effectsstoryboard script notes dialogue camera shot angle action special effects

1.2 What Is a Storyboard Used For?

Storyboarding helps the production team envision and develop an idea, visualise and test out concepts, and highlight any potential obstacles with the structure or layout of a story before it heads into production. 

What is a storyboard and why do you need one?

  1. It is a step-by-step guide to the production process, so it helps manage timing in production, and it saves money.
  2. Builds a connection with the viewer and between the production teams on a project, so all can communicate from one source of reference.
  3. Helps communicate a vision and understanding of the story.
  4. Helps in production direction.
  5. Most importantly, it’s used to sell/pitch the idea to clients to get funding in!

1.3 Who Directs & Lays Out the Storyboard?

Depending on the type of shoot or budget, the director might sit down with the storyboard artist to present their vision and place their input in the storyboard process. However, in most cases the budget isn’t available, and you will need to break down the scenes and rely on your own experience to direct the shots as you see fit. 

The key to storyboarding is to practice, by understanding how moving productions work. 

  • Watch plenty of movies, TV series or commercials, and try to study by sketching out the scenes as you watch. 
  • Look for camera angles and how a story is cut up and told visually. 
  • Keep in mind that storyboards are not a frame-by-frame breakdown, but more a scene-by-scene development, and each scene must serve a purpose in the storytelling.
storyboard storyboard scene sequence breakdown of camera angles and action shotsstoryboard storyboard scene sequence breakdown of camera angles and action shotsstoryboard storyboard scene sequence breakdown of camera angles and action shots
Check out this drawing storyboard example with scene-by-scene development.

2. Storyboard Lingo & Techniques 

Now, let’s learn some essential lingo to get you started on the right foot and familiarise you with the terms used in the industry. The following list will give you some up-front information.

2.1 What Are Film Aspect Ratios?

As you know, storyboards showcase a series of images, of what the audience will see on screen. These are shown in formats called a Storyboard Panel or Storyboard Frame, which is basically a rectangular box presented digitally or on paper. 

The size and shape of the panels are different, depending on what is called the Aspect Ratio (the relationship between the width & height of your video). The most common aspect ratios are 4:3 and 16:9

  • TV aspect ratio is known as 4:3. 
  • HDTV is 16:9
  • Standard Widescreen is 1.85:1. 
  • Anamorphic is 2.39:1, also known today as „two-four-o”.

Note that the dimensions of your panels should be the same as the aspect ratio the animation will be at the end.

storyboard panel aspect ratio 43 169 1851 2391 240 HDTV TV anamorphicstoryboard panel aspect ratio 43 169 1851 2391 240 HDTV TV anamorphicstoryboard panel aspect ratio 43 169 1851 2391 240 HDTV TV anamorphic
Storyboard panel sizes.

2.2 What Are Different Types of Camera Shots?

There are some different types of camera shots that you should know before starting. We will go over just the basic shots. Note that most shots are named in connection with the subject framed in the panel.

  • Establishing Shot (ES) is usually shown at the beginning of a scene to present where the action is taking place—for example, an island, a school, a basement, etc.
  • Close Up (CU) shots, are obviously close-range views. They’re often used in emotional scenes to show reactions or create intimacy. They can also increase tension, allow close views of characters or products, or accentuate an action.
  • Extreme Close Up (ECU or XCU) shots are sparingly used, usually when you need to add drama or focus to an event or scene, or represent some aggression or discomfort. 
  • Mid Shot (MS) or Medium Shot is a frame from the character’s waist and up. Typically used to show emotions and reactions, or during dialogue sequences. 
  • Medium Close Up (MCU) is what is sometimes called a Head & Shoulders. It’s basically a head shot from shoulder up, used to focus on a character’s expressions or during dialogue scenes between two or three people.
  • Long Shot (LS), also known as Full Shot, is a shot taken from a distance. It’s typically used to show the entire character or subject, and when you want to point something out between the subject and its surroundings or release tension in a scene. It’s like giving breathing space to an event/action.
  • Medium Long Shot (MLS) frames the subject from the knees and up. It’s a mix between a long shot and a medium shot and is usually used when there are a group of people in a frame or you wish to show the subject’s hands and expressions.
  • Extreme Long Shot (ELS or XLS) is more long range and is used to establish the surrounding setting.
camera shot types storyboarding Establishing ES Close Up CU Extreme close up ECU Mid shot MS camera shot types storyboarding Establishing ES Close Up CU Extreme close up ECU Mid shot MS camera shot types storyboarding Establishing ES Close Up CU Extreme close up ECU Mid shot MS
Drawing storyboard examples.
Storyboard Camera Shots Mid shot MS Medium Long shot MLS Extreme Long Shot ELS LSStoryboard Camera Shots Mid shot MS Medium Long shot MLS Extreme Long Shot ELS LSStoryboard Camera Shots Mid shot MS Medium Long shot MLS Extreme Long Shot ELS LS
Storyboard panel examples.

2.3 What Are the Basic Camera Angles?

Camera Angle refers to where the camera is shooting from. When storyboarding, always imagine yourself holding the camera, and ask yourself what’s the best way to portray the action or subject in a scene. Do that by establishing the most effective way to place the camera angle:

  • Point of View (POV) camera angles are used when you want the viewer to understand what the character is seeing. The view can be close, mid, or long.
  • Over the Shoulder Shot (OSS or OTS or also known as ‘Third-Person) is a view from behind an individual and towards a subject. It’s typically used between people in conversation, and the frame has one person/thing on the side of the frame.
  • Two-Shot is an angle where two subjects are both in a single frame together, and usually speaking. When drawing dialogue frames, alternate between two-shots and OTS shots.
  • Up Shot / Worm’s Eye View are angles that look up at a subject/object.
  • Down Shots / Bird’s Eye View are angles that look down at a subject/object.
camera angles Point of View POV Over the Shoulder OSS  OTS Two shot U shot Down shot angles  storyboardcamera angles Point of View POV Over the Shoulder OSS  OTS Two shot U shot Down shot angles  storyboardcamera angles Point of View POV Over the Shoulder OSS  OTS Two shot U shot Down shot angles  storyboard

2.4 What Are the Standard Camera Movements?

Next, let’s familiarise ourselves with the following list of camera motions:

  • Pan/Tilt. Pan is short for Panorama Shot. The camera is on a tripod, and moves right or left. A Tilt is when you move up or down.
  • Zoom In or Out is when you adjust the lens to view in or out, and is used to increase the significance of something. Draw arrows from the edge of the panel inwards/outwards.
  • Dolly is similar to a Zoom, but the entire camera moves towards a subject or away from it. Use thick arrows to show this motion.
  • Truck In & Truck Out is similar to dolly, but the whole camera moves left to right or vice versa.
  • Pan or Panning are when the camera rotates sideways in one direction, often used in dialogue scenes or when following a subject or revealing something near. When storyboarding, draw an arrow in the camera’s direction.
  • Track or Tracking is another way of following subjects. It’s when the camera moves and follows the subject/action without cutting. It’s typically used in walk cycles and is symbolised by using an arrow in the motion of direction. It can also be Hand-held or on a Dolly.
  • Hand-held is carrying a camera by hand, to give a more natural documentary feel to a scene, typically used in police or war scenes.
  • Rack Focus is when the camera focuses on a subject in the foreground and the background is blurry, and then it reverses so that the focus shifts to a clear background and blurred foreground. In a storyboard, just draw where the focus starts and an arrow and rectangle where it moves to.
standard camera movements pan tilt zoom in out dolly arrows storyboardstandard camera movements pan tilt zoom in out dolly arrows storyboardstandard camera movements pan tilt zoom in out dolly arrows storyboard
Camera Movements Truck In Out Pan Storyboard arrowsCamera Movements Truck In Out Pan Storyboard arrowsCamera Movements Truck In Out Pan Storyboard arrows
storyboard panel rack focus hand held camera movements tracking storyboard panel rack focus hand held camera movements tracking storyboard panel rack focus hand held camera movements tracking

3. The Art of Storyboarding

3.1 Before Starting to Storyboard

Next, let’s take a glimpse at the art of storyboard making.

Before you get started, gather your notes, read over your script, and research whatever source materials you need. Clients might give you some reference material, but in most cases you need to gather your own.

Consider asking the client a few questions before storyboarding:

  • Do you have a script or breakdown of the script?
  • Who is the storyboard for?
  • Color or black and white?
  • Budget?
  • Format to be used?
  • Reference material?
  • Delivery date?

3.2 What Are Thumbnail Storyboards?

Before you start illustrating the storyboard, you need to break down the script, in order to examine the scenes and translate them into individual storyboard panels. 

The easiest way is to add Thumbnails to your storyboard scenes. 

Thumbnail storyboards are sketches, mainly quick illustrations of stick figure forms, notes, and laid-out sequences of events on a page. This is done to quickly determine how each shot/camera angle/movement will be used. It also helps to evaluate which images need to be storyboarded and which not. With thumbnails, you can swiftly step back and analyze your entire animation in individual panels, before even starting with the actual storyboard work.

Here is an example:

before storyboarding prepare thumbnail stick figures noted directionbefore storyboarding prepare thumbnail stick figures noted directionbefore storyboarding prepare thumbnail stick figures noted direction

3.3 How to Break Down the Script 

Once you have thumbnailed your script and gathered all your material, it’s time to start drawing out your frames.

Figure out what aspect ratio will be used, lay out what each panel needs to show, and then transform those ideas into a series of storyboard panels.

Decide what elements are in each frame of the storyboard (characters, objects, background), and the best shot type to communicate the event.

break down script storyboard camera angles motion backgroundsbreak down script storyboard camera angles motion backgroundsbreak down script storyboard camera angles motion backgrounds
Here you can see a storyboard with characters and other visual elements.

3.4  Lay Out, Structure & The Best Storyboard Software

Every artist has a preferred method of drawing and structuring their panels. You can work with a number of templates available online (one example is the „6panel” single-page template below) or create your own. There is no right way of drafting a storyboard. You can use the good old-fashioned pen/pencil and paper, Adobe Photoshop, or any sketch app and storyboard software available today!

Here is a short list of the best storyboard software and apps you can lean on:

  1. Storyboarder (Free storyboard software) – Screenshot Below*
  2. StoryBoard Artist Studio ($$$)
  3. Toon Boom Storyboard Pro ($$-$$$)
  4. Procreate (iPad Pro) ($)
  5. Paper By FiftyThree (iPad) (Free storyboard software)
  6. Autodesk Sketchbook (Free storyboard software)
template panel storyboard sketch frame label scenes description and notestemplate panel storyboard sketch frame label scenes description and notestemplate panel storyboard sketch frame label scenes description and notes
storyboarder software animation sequence panelsstoryboarder software animation sequence panelsstoryboarder software animation sequence panels

3.5 How to Label the Storyboard Panels

Learn to label your shots correctly, so that they are in order and you and the team can stay organised.

There’s more than one way to effectively number storyboards. 

In short, the process is like having an ID for each panel. If you’re using storyboard software, it will automatically assign panel numbers. However, if you’re not on any software, and a client/director wants to move, add, or delete a panel, you can’t name a panel, for example, Panel_6_New_New_New. You will end up needing to find old/new files, and it becomes a messy, time-consuming burden. 

The proper way would be to follow this order: Project Name_Script#_Scene_Frame_01.jpg

3.6 Numbering Presentation vs. Production Boards

It’s important to know which style of boards your client wants: Presentation or Production boards.

Presentation boards are typically short and are presented internally or used in pitches. They represent only the key shots needed, and not every shot of the director’s vision. Only the key elements are illustrated in individual frames.

So, in numbering presentations, it’s easy to add a letter, number, or decimal at the end of each panel number. 

For example, if you want to add a shot between 23 and 24, then you would call it 23-1. If you want to convey a single shot, in several panels, it could be 23i, 23ii, 23iii, etc.

If you make an alteration to your panel then the correction will be labelled 23-a. That way they’re clearly connected, but still have their own unique ID numbers.

Production boards are numbered the same, but the difference is that they are a breakdown of every scene’s „action”, so each action is broken into camera angles. This means that whenever the camera cuts, you must change the scene number to represent a new shot. So, for example: 

  • Scene# 2: Shot 1A
  • Scene# 2: Shot 1B
  • Scene# 2: Shot 2
  • Scene# 2: Shot 3
  • Scene# 3: Shot 1…

Once you have submitted the board, your job is done. The client might transform it into an animatic.

3.7 What’s an Animatic?

An Animatic is simply an animated storyboard!

Once you submit your storyboard, the production team might take the illustrated panels, import them into an editing program, and add a Voice Over (VO), audio, sound effects and/or demo music, to prepare the timing and pace of the production for presentation purposes. 

4. Storyboard Artist Job, Tips & Hints 

4.1 How to Storyboard Effectively

The whole concept of storyboarding is to represent the concept, as closely as possible to what the animation will look like in the end. So your audience should be able to follow and understand the story through the sequence of frames you illustrate. Your job is to make the script come to life.

Elements that might help communicate a story more accurately include:

  • Use of storyboard Arrows or Symbols to show camera movements. Storyboard Arrows help show movement, direction, and transitions.
  • Color an object/subject to differentiate it from the surroundings.
  • Add Captions under or in the images
elements arrows color caption to communicate better storyboardelements arrows color caption to communicate better storyboardelements arrows color caption to communicate better storyboard
Here’s an example of how storyboard arrows can help show camera movements.

4.2 How to Enhance the Look & Feel of the Storyboard Frames

Creating a comprehensive storyboard that looks and feels professional is not just an art but a skill. 

If the audience doesn’t understand a part of the storyboard then usually it will need to be enhanced or altered. They should be able to understand the visuals without the dialog. Your best „test” audience would be your parents, siblings, or cat/dog. Try it out.

There are different approaches to illustrating a storyboard. Some artists like to use splashes of ink and color, others draw rough doodles and scribbles, some may only draw outlines, or in greyscale, or you may be the type that adds lots of details.

There are no rules to storyboarding, but there are some guidelines and tips to enhance your images and help stretch out your skills:

  • Add details to a scene or character—this helps the viewer’s imagination. For example, add utensils in a kitchen scene, or a zebra crossing on a street scene. The more you communicate through a board, the more accurate the production will be.
  • Experiment with different camera angles, especially within dramatic scenes. Try over the shoulder shots, worm’s eye views, or extreme close-ups.
  • Avoid positioning the subject in the center of a panel, and make use of most of your negative space.
  • Avoid tilted frames, complicated angles, or splitting screens in half with horizontal lines.
  • When drawing people or a setting, where a crowd is needed, add a number of people, instead of just two people in the background.
  • Be sure your subject/character is facing the correct camera direction.
  • Ask yourself what type of camera shot/angle you will use. Do you need a close-up? Will the camera move?
  • Make every frame count.
  • It pays to practice! Practice at home while watching your favourite movies.
altaltalt

4.3 Understanding the Job

Now that you have equipped yourself with some visual references and storyboard terminology, here are a few things to remember.

Be professional and punctual, and add your personal touch to the work.

Being able to draw is one thing, but you need to grasp the technique of good visual storytelling. 

Understanding how to frame shots will help the production team to save time and costs.

You should be able to take the client’s script, notes, and references and turn them into a readable visual. If you can analyse how a scene can be transformed into a great visual, that’s a bonus.

You also need to draw fast!! Like really fast. Delivery on time is essential. Be punctual!

Clients tend to need storyboards delivered the next day, or within two days, or you might get emergency work to be done the same night. They might even request additional frames after delivery, and you will need to deliver them by the hour. So, unfortunately, there is not the luxury of time.

Storyboarding is paid by frame, so the longer you take, the less you make.

If you also have a specific artistic style/touch that clients like/want, you will make good money and be on your way to becoming a good storyboard artist!

storyboard panel vs commercial shoot transformationstoryboard panel vs commercial shoot transformationstoryboard panel vs commercial shoot transformation

4.4 How to Land the Job?

The best way? Well, you can start by working for free or a small fee.

  • Seek internships.
  • Apply to entry-level storyboard artist positions.
  • Apply to little production studios first, to test out your skills.
  • Build a portfolio that will show off your abilities.
  • Draw, draw, draw.
  • Be ready to take criticism. Constructive feedback will help you develop.

That’s It! 

I hope you found our post on how to be a storyboard artist was useful. Now you have your basics ready, so it’s time to get started.

Chances are if you continually get called on for work, then either your price rates are cheap or your delivery is fast or your style is just right!

On the other hand, if you feel you are not cut out for the task and wish to hire a storyboard artist then feel free to email me, anytime.

Good luck! 

altaltalt

20 Best Instagram Post Templates Using an Instagram Post Creator

Post pobrano z: 20 Best Instagram Post Templates Using an Instagram Post Creator

Brands are competing for popularity by jumping on the Instagram bandwagon in record numbers. It can be a challenge to create new and eye-catching posts daily. This is where templates for Instagram posts from Envato Elements can save you hours of time!

Envato Elements is an all-included subscription-based marketplace. It’s perfect if you’re a community manager, or if you want to keep your Instagram account on point. For a flat monthly fee, you’ll get unlimited Instagram text post templates, premium fonts, stock photos, all kinds of graphic templates, and more.

10 Best Instagram Post Templates 

1. Instagram Post Template (FIG, PSD, SKETCH, XD)

Instagram PostInstagram PostInstagram Post

This is a great Instagram text template for startups and small businesses. Edit this template in Photoshop, Figma, Adobe XD, or Sketch. All files come with organized layers, and the post size is 1080×1080 px.

2. Trendy Instagram Post Templates (PSD, JPG)

Trendy Instagram Post TemplatesTrendy Instagram Post TemplatesTrendy Instagram Post Templates

Work with trendy post templates for your next campaign. This blank Instagram post template pack comes with 20+ stylish designs. The files are 1080×1080 px Instagram post size. It uses free Google Fonts, and all the images, text, and colours are fully editable.

3. Sale Instagram Post (AI, PSD)

Sale Instagram PostSale Instagram PostSale Instagram Post

Looking for an Instagram writing template for sale posts? This template for IG posts offers a clean and bold design. Change the photos, text, and colours to make this your own. Both AI and PSD files come fully layered and well organized.

4. 22 Animated Instagram Post Templates: Minimalist (PSD)

22 Animated Instagram Post Templates - Minimalist22 Animated Instagram Post Templates - Minimalist22 Animated Instagram Post Templates - Minimalist

Check out this animated and creative Instagram post design. You’ll get 22 Photoshop templates for IG posts. Work with smart objects to change the images and use shape layers to change the colours. Export as video, and you’re all set to start posting! 

5. Instagram Post Template (AI, FIG, PSD, SKETCH)

Instagram Post Template Instagram Post Template Instagram Post Template

Work with a versatile Instagram introduction post template. This download contains nine fully editable and customizable templates for Instagram posts. Edit them in Sketch, Photoshop, or Illustrator. Easily place your images with smart objects and add your brand’s text and colours. 

6. Aesthetic Instagram Post (AI, PSD)

Aesthetic Instagram PostAesthetic Instagram PostAesthetic Instagram Post

Looking for a beautiful Instagram post layout template? This download contains four templates for IG posts. Customize them in Photoshop or Illustrator. Work with a creative Instagram post design for your next campaign. 

7. Minimal Instagram Feed Template (FIG, SKETCH, XD)

Minimal Instagram Feed TemplateMinimal Instagram Feed TemplateMinimal Instagram Feed Template

This Instagram post outline is perfect for lovers of minimalism. You’ll get six unique IG post template designs to choose from. Add your own text and images in Sketch, Figma, or Adobe XD. Work with a blank Instagram post template to bring your ideas to life! 

8. Fun Instagram Post Template (AI, PSD)

Fun Instagram Post TemplateFun Instagram Post TemplateFun Instagram Post Template

Check out this Instagram post layout template. It uses a fun yet simple design. This download comes with five templates for Instagram posts. All of them are great if you’re looking for an Instagram writing template. Just add your content, change the colours, and you’re all set.

9. Oakheart Instagram Post Template (PSD)

Oakheart Instagram Post TemplateOakheart Instagram Post TemplateOakheart Instagram Post Template

Oakheart is a simple and eye-catching template for IG posts. Work with a set of nine templates for Instagram posts where you can add your images and content. These IG post templates come in 2000 x 2000px format and use free fonts.

10. Clean Instagram Post Templates (PSD, XD, FIG, SKETCH)

Clean Instagram Post TemplatesClean Instagram Post TemplatesClean Instagram Post Templates

Create an eye-catching and creative Instagram post design. This blank Instagram post template is the perfect place to start. Add your own images, select your colours, and adjust the copy. All the files are fully layered and well organized.

How to Use an Editable Instagram Post Template

Wondering how a tool like the Instagram Post Creator can be a lifesaver? Follow these steps to help you create your own striking Instagram ad template. Alternatively, you can follow along over on our Envato Tuts+ YouTube channel:

1. Navigate to the Templates for Instagram Posts at Placeit.

Navigate to the Instagram Post Templates at PlaceitNavigate to the Instagram Post Templates at PlaceitNavigate to the Instagram Post Templates at Placeit

2. Review the Instagram post templates on offer and select the one you like the most.

Review fake Instagram post templates on offer and select the one you like the mostReview fake Instagram post templates on offer and select the one you like the mostReview fake Instagram post templates on offer and select the one you like the most

3. Customise your blank Instagram post template as much or as little as you like. 

Starting with the controls on the left, you can add your own text and change the font style and colour to match your brand. 

Customise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you like

Moving to the controls on the right, you can change the graphics used in the design and their colour. 
Customise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you like

Using the settings on the bottom right, you can also change your background image by using any of the ones provided or uploading your own. 

Customise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you like

You can resize any of your text and graphics and move them around to find the layout that’s right for you. If you’re not happy with the changes you’ve made, you can hit the Reset Layout button to return the design to its original layout.

Customise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you like

4. Once you’re satisfied with your Instagram template, hit the download button at the top of the screen.

Download your Instagram template for a small fee, or if you regularly need blank Instagram post templates and other resources like flyers, posters, social media banners, etc., then the monthly plan may be the best deal for you. 

And that’s how you use an Instagram post template to make your own unique Instagram post in four simple steps. 

Customise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you likeCustomise your blank instagram post template as much or as little as you like

10 Best Instagram Post Creator Templates 

Check out these Instagram post designs made using the Instagram ad template creator. You can use these as a starting point to create your own Instagram post.

1. Cool Instagram Post Generator for a Giveaway

Cool Instagram Post Generator for a GiveawayCool Instagram Post Generator for a GiveawayCool Instagram Post Generator for a Giveaway

A terrific template for fashion brands that want a professional template for use in Instagram posts, this IG post template offers a gorgeous selection of fonts, loads of cool images, and stylish graphics. 

2. Instagram Post Template for Pride Month

Instagram Post Template for Pride MonthInstagram Post Template for Pride MonthInstagram Post Template for Pride Month

For those times when you want to celebrate LGBTQI people, there is this wonderful editable Instagram Post Template. It’s a creative Instagram post design that inspires equality and love. 

3. Instagram Post Maker for a Giveaway

Instagram Post Maker for a GiveawayInstagram Post Maker for a GiveawayInstagram Post Maker for a Giveaway

This blank Instagram post template will help your post stand out in a busy Instagram timeline. Just upload a photo of your product, change the text, and your template is ready for use. 

4. Edgy Instagram Post Creator for Fashion Sales

Edgy Instagram Post Creator for Fashion SalesEdgy Instagram Post Creator for Fashion SalesEdgy Instagram Post Creator for Fashion Sales

The best thing about customizing an Instagram post outline is that you can easily make it your own. Here’s an IG post template with a cool photo, banner, and frame colours. You can just edit and add different text and colours for your audience. 

5. Happiness Quotes Instagram Post Maker

Happiness Quotes Instagram Post MakerHappiness Quotes Instagram Post MakerHappiness Quotes Instagram Post Maker

Who doesn’t love a great quote? Use this great template for an Instagram post as your go-to signature style for quotes, and update the background and colours to make it uniquely yours. 

6. Philosophy Quote Post Maker for Instagram

Philosophy Quote Post Maker for InstagramPhilosophy Quote Post Maker for InstagramPhilosophy Quote Post Maker for Instagram

Lovers of quirky illustration will adore this template theme, which features a wonderful selection of endearing illustrations to which you can add your favourite quotes. 

7. Followers Number Landmark Post Maker for Instagram

Followers Number Landmark Post Maker for InstagramFollowers Number Landmark Post Maker for InstagramFollowers Number Landmark Post Maker for Instagram

Celebrate your follower count landmark with this awesome editable Instagram post template. Choose your background, add your text, download your template, and upload it to your Instagram account.

8. Social Media Post Template With Makeup Graphics

Social Media Post Template with Makeup GraphicsSocial Media Post Template with Makeup GraphicsSocial Media Post Template with Makeup Graphics

A template dedicated to beauty bloggers and others working in the beauty industry, this editable Instagram post template uses fun illustrations and striking text to hold your viewers’ attention.

9. Social Media Post Template Adventure

Social Media Post Template AdventureSocial Media Post Template AdventureSocial Media Post Template Adventure

Here’s an awesome Instagram template for travel businesses. Start your customisation by adding your text, and then select an image or upload your own images, customise the colours, and experiment with the hundreds of great graphics available. 

10. Social Media Post Template: Twitter Post Photo

Social Media Post Template - Twitter Post PhotoSocial Media Post Template - Twitter Post PhotoSocial Media Post Template - Twitter Post Photo

The great thing about templates is that you can access stylish designs with no effort whatsoever. This template is no exception. It would take you much longer to create your own Instagram post template PSD file in Photoshop than the two minutes this awesome template takes to customise. 

Create Your Own Unique Instagram Posts

Instagram post templates are a terrific tool for helping you make an Instagram post quickly and easily. Use your favourite template to make your own Instagram post and share it with us on Twitter. We’d love to see what you come up with.

Here are more great templates for you: