Removing jQuery from GOV.UK

Post pobrano z: Removing jQuery from GOV.UK

The GOV.UK team recently published “How and why we removed jQuery from GOV.UK“. This was an insightful look at how an organization can assess its tooling and whether something is still the best tool for the job. This is not a nudge to strip libraries out of your current project right now! Many of us may still be supporting legacy projects and browser requirements that prevent this from being a viable option.

Some of the criticism appears to be that the library size argument is negligible on modern network speeds and caching.

GOV.UK posted an update to address this criticism with metrics – “The impact of removing jQuery on our web performance“.

This article also makes the case for improving maintenance. Instead of upgrading disparate outdated versions of code and having to address security updates in a piecemeal approach, removing the dependency reduces this footprint. This is the dream of having the luxury for addressing technical debt.

Previously, GitHub also documented how they incrementally decoupled jQuery from their front-end code. Improving maintenance and developer experience played a role into their decision.

What caught my eye in particular was the link to the documentation on how to remove jQuery. Understanding how to decouple and perform migration steps are maintenance tasks that will continue to come up for websites and it’s reassuring to have a guide from someone that had to do the same.

Further musing on this subject turned up the old chestnuts “You Might Not Need jQuery” (2014), “(Now More Than Ever) You Might Not Need jQuery” (2017), “Is jQuery still relevant? (1)” (2016), and “Is jQuery still relevant? (2)” (2017).

To Shared LinkPermalink on CSS-Tricks


Removing jQuery from GOV.UK originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

CSS Grid and Custom Shapes, Part 2

Post pobrano z: CSS Grid and Custom Shapes, Part 2

Alright, so the last time we checked in, we were using CSS Grid and combining them with CSS clip-path and mask techniques to create grids with fancy shapes.

Here’s just one of the fantastic grids we made together:

CodePen Embed Fallback

Ready for the second round? We are still working with CSS Grid, clip-path, and mask, but by the end of this article, we’ll end up with different ways to arrange images on the grid, including some rad hover effects that make for an authentic, interactive experience to view pictures.

And guess what? We’re using the same markup that we used last time. Here’s that again:

<div class="gallery">
  <img src="..." alt="...">
  <img src="..." alt="...">
  <img src="..." alt="...">
  <img src="..." alt="...">
  <!-- as many times as we want -->
</div>

Like the previous article, we only need a container with images inside. Nothing more!

Nested Image Grid

Last time, our grids were, well, typical image grids. Other than the neat shapes we masked them with, they were pretty standard symmetrical grids as far as how we positioned the images inside.

Let’s try nesting an image in the center of the grid:

CodePen Embed Fallback

We start by setting a 2✕2 grid for four images:

.gallery {
  --s: 200px; /* controls the image size */
  --g: 10px; /* controls the gap between images */

  display: grid;
  gap: var(--g);
  grid-template-columns: repeat(2, auto);
}
.gallery > img {
  width: var(--s);
  aspect-ratio: 1;
  object-fit: cover;
}

Nothing complex yet. The next step is to cut the corner of our images to create the space for the nested image. I already have a detailed article on how to cut corners using clip-path and mask. You can also use my online generator to get the CSS for masking corners.

What we need here is to cut out the corners at an angle equal to 90deg. We can use the same conic-gradient technique from that article to do that:

.gallery > img {
   mask: conic-gradient(from var(--_a), #0000 90deg, #000 0);
}
.gallery > img:nth-child(1) { --_a: 90deg; }
.gallery > img:nth-child(2) { --_a: 180deg; }
.gallery > img:nth-child(3) { --_a: 0deg; }
.gallery > img:nth-child(4) { --_a:-90deg; }

We could use the clip-path method for cutting corners from that same article, but masking with gradients is more suitable here because we have the same configuration for all the images — all we need is a rotation (defined with the variable --_a) get the effect, so we’re masking from the inside instead of the outside edges.

Two by two grid of images with a white square stacked on top in the center.

Now we can place the nested image inside the masked space. First, let’s make sure we have a fifth image element in the HTML:

<div class="gallery">
  <img src="..." alt="...">
  <img src="..." alt="...">
  <img src="..." alt="...">
  <img src="..." alt="...">
  <img src="..." alt="...">
</div>

We are going to rely on the good ol’ absolute positioning to place it in there:

.gallery > img:nth-child(5) {
  position: absolute;
  inset: calc(50% - .5*var(--s));
  clip-path: inset(calc(var(--g) / 4));
}

The inset property allows us to place the image at the center using a single declaration. We know the size of the image (defined with the variable --s), and we know that the container’s size equals 100%. We do some math, and the distance from each edge should be equal to (100% - var(--s))/2.

Diagram of the widths needed to complete the design.

You might be wondering why we’re using clip-path at all here. We’re using it with the nested image to have a consistent gap. If we were to remove it, you would notice that we don’t have the same gap between all the images. This way, we’re cutting a little bit from the fifth image to get the proper spacing around it.

The complete code again:

.gallery {
  --s: 200px; /* controls the image size */
  --g: 10px;  /* controls the gap between images */
  
  display: grid;
  gap: var(--g);
  grid-template-columns: repeat(2, auto);
  position: relative;
}

.gallery > img {
  width: var(--s);
  aspect-ratio: 1;
  object-fit: cover;
  mask: conic-gradient(from var(--_a), #0000 90deg, #000 0);
}

.gallery > img:nth-child(1) {--_a: 90deg}
.gallery > img:nth-child(2) {--_a:180deg}
.gallery > img:nth-child(3) {--_a:  0deg}
.gallery > img:nth-child(4) {--_a:-90deg}
.gallery > img:nth-child(5) {
  position: absolute;
  inset: calc(50% - .5*var(--s));
  clip-path: inset(calc(var(--g) / 4));
}

Now, many of you might also be wondering: why all the complex stuff when we can place the last image on the top and add a border to it? That would hide the images underneath the nested image without a mask, right?

That’s true, and we will get the following:

CodePen Embed Fallback

No mask, no clip-path. Yes, the code is easy to understand, but there is a little drawback: the border color needs to be the same as the main background to make the illusion perfect. This little drawback is enough for me to make the code more complex in exchange for real transparency independent of the background. I am not saying a border approach is bad or wrong. I would recommend it in most cases where the background is known. But we are here to explore new stuff and, most important, build components that don’t depend on their environment.

Let’s try another shape this time:

CodePen Embed Fallback

This time, we made the nested image a circle instead of a square. That’s an easy task with border-radius But we need to use a circular cut-out for the other images. This time, though, we will rely on a radial-gradient() instead of a conic-gradient() to get that nice rounded look.

.gallery > img {
  mask: 
    radial-gradient(farthest-side at var(--_a),
      #0000 calc(50% + var(--g)/2), #000 calc(51% + var(--g)/2));
}
.gallery > img:nth-child(1) { --_a: calc(100% + var(--g)/2) calc(100% + var(--g)/2); }
.gallery > img:nth-child(2) { --_a: calc(0%   - var(--g)/2) calc(100% + var(--g)/2); }
.gallery > img:nth-child(3) { --_a: calc(100% + var(--g)/2) calc(0%   - var(--g)/2); }
.gallery > img:nth-child(4) { --_a: calc(0%   - var(--g)/2) calc(0%   - var(--g)/2); }

All the images use the same configuration as the previous example, but we update the center point each time.

Diagram showing the center values for each quadrant of the grid.

The above figure illustrates the center point for each circle. Still, in the actual code, you will notice that I am also accounting for the gap to ensure all the points are at the same position (the center of the grid) to get a continuous circle if we combine them.

Now that we have our layout let’s talk about the hover effect. In case you didn’t notice, a cool hover effect increases the size of the nested image and adjusts everything else accordingly. Increasing the size is a relatively easy task, but updating the gradient is more complicated since, by default, gradients cannot be animated. To overcome this, I will use a font-size hack to be able to animate the radial gradient.

If you check the code of the gradient, you can see that I am adding 1em:

mask: 
    radial-gradient(farthest-side at var(--_a),
      #0000 calc(50% + var(--g)/2 + 1em), #000 calc(51% + var(--g)/2 + 1em));

It’s known that em units are relative to the parent element’s font-size, so changing the font-size of the .gallery will also change the computed em value — this is the trick we are using. We are animating the font-size from a value of 0 to a given value and, as a result, the gradient is animated, making the cut-out part larger, following the size of the nested image that is getting bigger.

Here is the code that highlights the parts involved in the hover effect:

.gallery {
  --s: 200px; /* controls the image size */
  --g: 10px; /* controls the gaps between images */

  font-size: 0; /* initially we have 1em = 0 */
  transition: .5s;
}
/* we increase the cut-out by 1em */
.gallery > img {
  mask: 
    radial-gradient(farthest-side at var(--_a),
      #0000 calc(50% + var(--g)/2 + 1em), #000 calc(51% + var(--g)/2 + 1em));
}
/* we increase the size by 2em */
.gallery > img:nth-child(5) {
  width: calc(var(--s) + 2em);
}
/* on hover 1em = S/5 */
.gallery:hover {
  font-size: calc(var(--s) / 5);
}

The font-size trick is helpful if we want to animate gradients or other properties that cannot be animated. Custom properties defined with @property can solve such a problem, but support for it is still lacking at the time of writing.

I discovered the font-size trick from @SelenIT2 while trying to solve a challenge on Twitter.

Another shape? Let’s go!

CodePen Embed Fallback

This time we clipped the nested image into the shape of a rhombus. I’ll let you dissect the code as an exercise to figure out how we got here. You will notice that the structure is the same as in our examples. The only differences are how we’re using the gradient to create the shape. Dig in and learn!

Circular Image Grid

We can combine what we’ve learned here and in previous articles to make an even more exciting image grid. This time, let’s make all the images in our grid circular and, on hover, expand an image to reveal the entire thing as it covers the rest of the photos.

CodePen Embed Fallback

The HTML and CSS structure of the grid is nothing new from before, so let’s skip that part and focus instead on the circular shape and hover effect we want.

We are going to use clip-path and its circle() function to — you guessed it! — cut a circle out of the images.

Showing the two states of an image, the natural state on the left, and the hovered state on the right, including the clip-path values to create them.

That figure illustrates the clip-path used for the first image. The left side shows the image’s initial state, while the right shows the hovered state. You can use this online tool to play and visualize the clip-path values.

For the other images, we can update the center of the circle (70% 70%) to get the following code:

.gallery > img:hover {
  --_c: 50%; /* same as "50% at 50% 50%" */
}
.gallery > img:nth-child(1) {
  clip-path: circle(var(--_c, 55% at 70% 70%));
}
.gallery > img:nth-child(2) {
  clip-path: circle(var(--_c, 55% at 30% 70%));
}
.gallery > img:nth-child(3) {
  clip-path: circle(var(--_c, 55% at 70% 30%));
}
.gallery > img:nth-child(4) {
  clip-path: circle(var(--_c, 55% at 30% 30%));
}

Note how we are defining the clip-path values as a fallback inside var(). This way allows us to more easily update the value on hover by setting the value of the --_c variable. When using circle(), the default position of the center point is 50% 50%, so we get to omit that for more concise code. That’s why you see that we are only setting 50% instead of 50% at 50% 50%.

Then we increase the size of our image on hover to the overall size of the grid so we can cover the other images. We also ensure the z-index has a higher value on the hovered image, so it is the top one in our stacking context.

.gallery {
  --s: 200px; /* controls the image size */
  --g: 8px;   /* controls the gap between images */

  display: grid;
  grid: auto-flow var(--s) / repeat(2, var(--s));
  gap: var(--g);
}

.gallery > img {
  width: 100%; 
  aspect-ratio: 1;
  cursor: pointer;
  z-index: 0;
  transition: .25s, z-index 0s .25s;
}
.gallery > img:hover {
  --_c: 50%; /* change the center point on hover */
  width: calc(200% + var(--g));
  z-index: 1;
  transition: .4s, z-index 0s;
}

.gallery > img:nth-child(1){
  clip-path: circle(var(--_c, 55% at 70% 70%));
  place-self: start;
}
.gallery > img:nth-child(2){
  clip-path: circle(var(--_c, 55% at 30% 70%));
  place-self: start end;
}
.gallery > img:nth-child(3){
  clip-path: circle(var(--_c, 55% at 70% 30%));
  place-self: end start;
}
.gallery > img:nth-child(4){
  clip-path: circle(var(--_c, 55% at 30% 30%));
  place-self: end;
}

What’s going on with the place-self property? Why do we need it and why does each image have a specific value?

Do you remember the issue we had in the previous article when creating the grid of puzzle pieces? We increased the size of the images to create an overflow, but the overflow of some images was incorrect. We fixed them using the place-self property.

Same issue here. We are increasing the size of the images so each one overflows its grid cells. But if we do nothing, all of them will overflow on the right and bottom sides of the grid. What we need is:

  1. the first image to overflow the bottom-right edge (the default behavior),
  2. the second image to overflow the bottom-left edge,
  3. the third image to overflow the top-right edge, and
  4. the fourth image to overflow the top-left edge.

To get that, we need to place each image correctly using the place-self property.

Diagram showing the place-self property values for each quadrant of the grid.

In case you are not familiar with place-self, it’s the shorthand for justify-self and align-self to place the element horizontally and vertically. When it takes one value, both alignments use that same value.

Expanding Image Panels

In a previous article, I created a cool zoom effect that applies to a grid of images where we can control everything: number of rows, number of columns, sizes, scale factor, etc.

A particular case was the classic expanding panels, where we only have one row and a full-width container.

CodePen Embed Fallback

We will take this example and combine it with shapes!

Before we continue, I highly recommend reading my other article to understand how the tricks we’re about to cover work. Check that out, and we’ll continue here to focus on creating the panel shapes.

First, let’s start by simplifying the code and removing some variables

CodePen Embed Fallback

We only need one row and the number of columns should adjust based on the number of images. That means we no longer need variables for the number of rows (--n) and columns (--m ) but we need to use grid-auto-flow: column, allowing the grid to auto-generate columns as we add new images. We will consider a fixed height for our container; by default, it will be full-width.

Let’s clip the images into a slanted shape:

A headshot of a calm red wolf looking downward with vertices overlayed showing the clip-path property points.
clip-path: polygon(S 0%, 100% 0%, (100% - S) 100%, 0% 100%);
CodePen Embed Fallback

Once again, each image is contained in its grid cell, so there’s more space between the images than we’d like:

A six-panel grid of slanted images of various wild animals showing the grid lines and gaps.

We need to increase the width of the images to create an overlap. We replace min-width: 100% with min-width: calc(100% + var(--s)), where --s is a new variable that controls the shape.

CodePen Embed Fallback

Now we need to fix the first and last images, so they sort of bleed off the page without gaps. In other words, we can remove the slant from the left side of the first image and the slant from the right side of the last image. We need a new clip-path specifically for those two images.

We also need to rectify the overflow. By default, all the images will overflow on both sides, but for the first one, we need an overflow on the right side while we need a left overflow for the last image.

.gallery > img:first-child {
  min-width: calc(100% + var(--s)/2);
  place-self: start;
  clip-path: polygon(0 0,100% 0,calc(100% - var(--s)) 100%,0 100%);
}
.gallery > img:last-child {
  min-width: calc(100% + var(--s)/2);
  place-self: end;
  clip-path: polygon(var(--s) 0,100% 0,100% 100%,0 100%);
}

The final result is a nice expanding panel of slanted images!

CodePen Embed Fallback

We can add as many images as you want, and the grid will adjust automatically. Plus, we only need to control one value to control the shape!

We could have made this same layout with flexbox since we are dealing with a single row of elements. Here is my implementation.

Sure, slanted images are cool, but what about a zig-zag pattern? I already teased this one at the end of the last article.

CodePen Embed Fallback

All I’m doing here is replacing clip-path with mask… and guess what? I already have a detailed article on creating that zig-zag shape — not to mention an online generator to get the code. See how all everything comes together?

The trickiest part here is to make sure the zig-zags are perfectly aligned, and for this, we need to add an offset for every :nth-child(odd) image element.

.gallery > img {
  mask: 
    conic-gradient(from -135deg at right, #0000, #000 1deg 89deg, #0000 90deg) 
      100% calc(50% + var(--_p, 0%))/51% calc(2*var(--s)) repeat-y,
    conic-gradient(from   45deg at left,  #0000, #000 1deg 89deg, #0000 90deg) 
      0%   calc(50% + var(--_p, 0%))/51% calc(2*var(--s)) repeat-y;
}
/* we add an offset to the odd elements */
.gallery > img:nth-child(odd) {
  --_p: var(--s);
}
.gallery > img:first-child {
  mask: 
    conic-gradient(from -135deg at right, #0000, #000 1deg 89deg, #0000 90deg) 
      0 calc(50% + var(--_p, 0%))/100% calc(2*var(--s));
}
.gallery > img:last-child {
  mask: 
    conic-gradient(from 45deg at left, #0000, #000 1deg 89deg, #0000 90deg) 
      0 calc(50% + var(--_p, 0%)) /100% calc(2*var(--s));
}

Note the use of the --_p variable, which will fall back to 0% but will be equal to --_s for the odd images.

Here is a demo that illustrates the issue. Hover to see how the offset — defined by --_p — is fixing the alignment.

CodePen Embed Fallback

Also, notice how we use a different mask for the first and last image as we did in the previous example. We only need a zig-zag on the right side of the first image and the left side of the last image.

And why not rounded sides? Let’s do it!

CodePen Embed Fallback

I know that the code may look scary and tough to understand, but all that’s going on is a combination of different tricks we’ve covered in this and other articles I’ve already shared. In this case, I use the same code structure as the zig-zag and the slanted shapes. Compare it with those examples, and you will find no difference! Those are the same tricks in my previous article about the zoom effect. Then, I am using my other writing and my online generator to get the code for the mask that creates those rounded shapes.

If you recall what we did for the zig-zag, we had used the same mask for all the images but then had to add an offset to the odd images to create a perfect overlap. In this case, we need a different mask for the odd-numbered images.

The first mask:

mask: 
  linear-gradient(-90deg,#0000 calc(2*var(--s)),#000 0) var(--s),
  radial-gradient(var(--s),#000 98%,#0000) 50% / calc(2*var(--s)) calc(1.8*var(--s)) space repeat;

The second one:

mask:
  radial-gradient(calc(var(--s) + var(--g)) at calc(var(--s) + var(--g)) 50%,#0000 98% ,#000) 
  calc(50% - var(--s) - var(--g)) / 100% calc(1.8*var(--s))

The only effort I did here is update the second mask to include the gap variable (--g) to create that space between the images.

The final touch is to fix the first and last image. Like all the previous examples, the first image needs a straight left edge while the last one needs a straight right edge.

For the first image, we always know the mask it needs to have, which is the following:

.gallery > img:first-child {
  mask: 
    radial-gradient(calc(var(--s) + var(--g)) at right, #0000 98%, #000) 50% / 100% calc(1.8 * var(--s));
}
A brown bear headshot with a wavy pattern for the right border.

For the last image, it depends on the number of elements, so it matters if that element is :nth-child(odd) or :nth-child(even).

The complete grid of wild animal photos with all of the correct borders and gaps between images.
.gallery > img:last-child:nth-child(even) {
  mask: 
    linear-gradient(to right,#0000 var(--s),#000 0),
    radial-gradient(var(--s),#000 98%,#0000) left / calc(2*var(--s)) calc(1.8*var(--s)) repeat-y
}
A single-row grid of three wild animal photos with wavy borders where the last image is an odd-numbered element.
.gallery > img:last-child:nth-child(odd) {
  mask: 
    radial-gradient(calc(var(--s) + var(--g)) at left,#0000 98%,#000) 50% / 100% calc(1.8*var(--s))
}

That’s all! Three different layouts but the same CSS tricks each time:

  • the code structure to create the zoom effect
  • a mask or clip-path to create the shapes
  • a separate configuration for the odd elements in some cases to make sure we have a perfect overlap
  • a specific configuration for the first and last image to keep the shape on only one side.

And here is a big demo with all of them together. All you need is to add a class to activate the layout you want to see.

CodePen Embed Fallback

And here is the one with the Flexbox implementation

CodePen Embed Fallback

Wrapping up

Oof, we are done! I know there are many CSS tricks and examples between this article and the last one, not to mention all of the other tricks I’ve referenced here from other articles I’ve written. It took me time to put everything together, and you don’t have to understand everything at once. One reading will give you a good overview of all the layouts, but you may need to read the article more than once and focus on each example to grasp all the tricks.

Did you notice that we didn’t touch the HTML at all other than perhaps the number of images in the markup? All the layouts we made share the same HTML code, which is nothing but a list of images.

Before I end, I will leave you with one last example. It’s a “versus” between two anime characters with a cool hover effect.

CodePen Embed Fallback

What about you? Can you create something based on what you have learned? It doesn’t need to be complex — imagine something cool or funny like I did with that anime matchup. It can be a good exercise for you, and we may end with an excellent collection in the comment section.


CSS Grid and Custom Shapes, Part 2 originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

When Do You Use CSS Columns?

Post pobrano z: When Do You Use CSS Columns?

That ain’t rhetorical: I’m really interested in finding great use cases for CSS multi-column layouts.

The answer seems straightforward. Use columns when you want to split any content into columns, right? Here is generally the sort of example you’ll find in articles that show how CSS mutli-column layouts work, including our very own Almanac:

CodePen Embed Fallback

Right on. But is this an actual use case? Mmmmmaybe. If the text is relatively brief, then perhaps it’s a nice touch. That’s how I sold it to myself when redesigning my website a few years ago. It’s not that way today, but this is what it looked like then:

But an entire long-form article split into columns? I love it in newspapers but am hesitant to scroll down a webpage to read one column, only to scroll back up to do it again.

I suppose we can use it to place two elements side-by-side, but flexbox is way more suited for that. Plus, a limitation prevents us from selecting the columns to size them individually. The columns have to be the same width.

One thing columns have going for them is that they are the only CSS layout method that fragments content. (That is, unless we’re counting CSS Regions… what happened to those, anyway?!) So, if you wanna split a paragraph up into columns, it’s already possible without additional wrappers.

When else might you need to split a continuous block of content into columns? I remember needing to do that when I had a big ol’ unordered list of items. I like the way lists can make content easy to scan, but long lists can make one side of the page look super heavy. Let’s say, for example, that we were listing out all the post tags for CSS-Tricks in alphabetical groups. A multi-column layout works beautifully for that:

CodePen Embed Fallback

Go ahead and try resizing the viewport width. Three columns are defined but the number will change based on the amount of available space. Gotta love all that responsive goodness without the media query work!

I was working on a demo for the :left pseudo-class and reached for columns because it’s a great way to fragment things for printing demos. So, I guess there’s another use case. And while making a demo, I realized that a multi-column layout could be used to create a masonry grid of items, like an image gallery:

CodePen Embed Fallback

But what else? Are we limited to short paragraphs, long lists, and free-flowing grids?


When Do You Use CSS Columns? originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

Using CSS Cascade Layers to Manage Custom Styles in a Tailwind Project

Post pobrano z: Using CSS Cascade Layers to Manage Custom Styles in a Tailwind Project

If a utility class only does one thing, chances are you don’t want it to be overridden by any styles coming from elsewhere. One approach is to use !important to be 100% certain the style will be applied, regardless of specificity conflicts.

The Tailwind config file has an !important option that will automatically add !important to every utility class. There’s nothing wrong with using !important this way, but nowadays there are better ways to handle specificity. Using CSS Cascade Layers we can avoid the heavy-handed approach of using !important.

Cascade layers allow us to group styles into “layers”. The precedence of a layer always beats the specificity of a selector. Specificity only matters inside each layer. Establishing a sensible layer order helps avoid styling conflicts and specificity wars. That’s what makes CSS Cascade Layers a great tool for managing custom styles alongside styles from third-party frameworks, like Tailwind.

A Tailwind source .css file usually starts something like this:

@tailwind base;
@tailwind components;
@tailwind utilities;
@tailwind variants;

Let’s take a look at the official Tailwind docs about directives:

Directives are custom Tailwind-specific at-rules you can use in your CSS that offer special functionality for Tailwind CSS projects. Use the @tailwind directive to insert Tailwind’s base, components, utilities and variants styles into your CSS.

In the output CSS file that gets built, Tailwind’s CSS reset — known as Preflight — is included first as part of the base styles. The rest of base consists of CSS variables needed for Tailwind to work. components is a place for you to add your own custom classes. Any utility classes you’ve used in your markup will appear next. Variants are styles for things like hover and focus states and responsive styles, which will appear last in the generated CSS file.

The Tailwind @layer directive

Confusingly, Tailwind has its own @layer syntax. This article is about the CSS standard, but let’s take a quick look at the Tailwind version (which gets compiled away and doesn’t end up in the output CSS). The Tailwind @layer directive is a way to inject your own extra styles into a specified part of the output CSS file.

For example, to append your own styles to the base styles, you would do the following:

@layer base {
  h1 {
    font-size: 30px;
  }
}

The components layer is empty by default — it’s just a place to put your own classes. If you were doing things the Tailwind way, you’d probably use @apply (although the creator of Tailwind recently advised against it), but you can also write classes the regular way:

@layer components {
  .btn-blue {
    background-color: blue;
    color: white;
  }
}

The CSS standard is much more powerful. Let’s get back to that…

Using the CSS standard @layer

Here’s how we can rewrite this to use the CSS standard @layer:

@layer tailwind-base, my-custom-styles, tailwind-utilities;

@layer tailwind-base {
  @tailwind base;
}

@layer tailwind-utilities {
  @tailwind utilities;
  @tailwind variants;
} 

Unlike the Tailwind directive, these don’t get compiled away. They’re understood by the browser. In fact, DevTools in Edge, Chrome, Safari, and Firefox will even show you any layers you’ve defined.

CSS Cascade Layers with Tailwind CSS layers in DevTools.

You can have as many layers as you want — and name them whatever you want — but in this example, all my custom styles are in a single layer (my-custom-styles). The first line establishes the layer order:

@layer tailwind-base, my-custom-styles, tailwind-utilities;

This needs to be provided upfront. Be sure to include this line before any other code that uses @layer. The first layer in the list will be the least powerful, and the last layer in the list will be the most powerful. That means tailwind-base is the least powerful layer and any code in it will be overridden by all the subsequent layers. That also means tailwind-utilities will always trump any other styles — regardless of source order or specificity. (Utilities and variants could go in separate layers, but the maintainers of Tailwind will ensure variants always trump utilities, so long as you include the variants below the utilities directive.)

Anything that isn’t in a layer will override anything that is in a layer (with the one exception being styles that use !important). So, you could also opt to leave utilities and variants outside of any layer:

@layer tailwind-base, tailwind-components, my-custom-styles;

@layer tailwind-base {
  @tailwind base;
}

@layer tailwind-components {
  @tailwind components;
}

@tailwind utilities;
@tailwind variants;

What did this actually buy us? There are plenty of times when advanced CSS selectors come in pretty handy. Let’s create a version of :focus-within that only responds to keyboard focus rather than mouse clicks using the :has selector (which lands in Chrome 105). This will style a parent element when any of its children receive focus. Tailwind 3.1 introduced custom variants — e.g. <div class="[&:has(:focus-visible)]:outline-red-600"> — but sometimes it’s easier to just write CSS:

@layer tailwind-base, my-custom-styles;
@layer tailwind-base {
  @tailwind base;
}

@tailwind utilities;

@layer my-custom-styles {
  .radio-container {
    padding: 4px 24px;
    border: solid 2px rgb(230, 230, 230);
  }
  .radio-container:has(:focus-visible) {
    outline: solid 2px blue;
  }
}

Let’s say in just one instance we want to override the outline-color from blue to something else. Let’s say the element we’re working with has both the Tailwind class .outline-red-600 and our own .radio-container:has(:focus-visible) class:

<div class="outline-red-600 radio-container"> ... </div>

Which outline-color will win?

Ordinarily, the higher specificity of .radio-container:has(:focus-visible) would mean the Tailwind class has no effect — even if it’s lower in the source order. But, unlike the Tailwind @layer directive that relies on source order, the CSS standard @layer overrules specificity.

As a result, we can use complex selectors in our own custom styles but still override them with Tailwind’s utility classes when we need to — without having to resort to heavy-handed !important usage to get what we want.


Using CSS Cascade Layers to Manage Custom Styles in a Tailwind Project originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

How to Create a Stucco Brush in Photoshop

Post pobrano z: How to Create a Stucco Brush in Photoshop

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

Stucco is a type of mixture that, when applied to a wall, gives it a nice, rough texture. If you want to recreate the effect of this texture in your digital project, in this tutorial I’ll show you how to create a stucco brush in Photoshop—both from a photo and from a stucco texture made from scratch.

And if you want to save time, you can also download a brush set from Envato Elements! One subscription gives you access to millions of creative assets, including this set of stone stamp brushes:

stone texture brush packstone texture brush packstone texture brush pack

What You’ll Learn in This Stucco Brush Photoshop Tutorial

  • How to create a Photoshop stucco texture brush
  • How to create a stucco texture in Photoshop
  • How to make a stucco texture brush seamless

What You’ll Need

Your stucco Photoshop brush will be most realistic if you make it out of a photo. Here’s the one I’ve used, but you can use your own photo, or a different photo from Envato Elements.

1. How to Create a Stucco Brush in Photoshop

Step 1

Download the stucco texture and open it in Photoshop. Take the Crop Tool (C) and crop the edges slightly—their level of brightness breaks the uniformity of the whole texture.

crop the photocrop the photocrop the photo

Step 2

Go to Edit > Define Brush Preset and give the brush a name.

create new brushcreate new brushcreate new brush

Step 3

The stucco brush Photoshop is done, so you can now apply the same texture to any background. However, if you just apply it straight away, you may get a „dirty” result like this:

dirty texture effectdirty texture effectdirty texture effect

To fix this, change the Blend Mode to Overlay

change mode to overlaychange mode to overlaychange mode to overlay
overlay mode effectoverlay mode effectoverlay mode effect

… then duplicate the layer (Control-J) and change its Blend Mode to Multiply. Adjust the Opacity to create the level of brightness that looks best on this background.

change mode to multiplychange mode to multiplychange mode to multiply
multiply mode effectmultiply mode effectmultiply mode effect

2. How to Create a Stucco Texture in Photoshop

Step  1

You can also create a stucco Photoshop brush from scratch, without using a photo. Create a New File with these dimensions: 3000 x 3000 px.

create a new filecreate a new filecreate a new file

Step 2

Go to Filter > Noise > Add Noise, and add as much noise as possible.

add noiseadd noiseadd noise
noise addednoise addednoise added

Step 3

Go to Filter > Blur > Gaussian Blur, and make the noise slightly blurry, so that the individual points are no longer visible.

add gaussian bluradd gaussian bluradd gaussian blur
gaussian blur addedgaussian blur addedgaussian blur added

Step 4

Go to the Channels tab and take the selection from the RGB channel by Control-clicking its thumbnail.

select RGB channelselect RGB channelselect RGB channel
make the selectionmake the selectionmake the selection

Step 5

Invert the selection with Control-Shift-I, create a New Layer, and fill it with black.

fill selection with blackfill selection with blackfill selection with black

Step 6

Create a New Layer below and fill it with white.

fill layer with whitefill layer with whitefill layer with white

Step 7

Double-click Layer 1 and add the following Bevel & Emboss settings:

  • Style: Inner Bevel
  • Technique: Chisel Soft
  • Depth: 1000%
  • Direction: Up
  • Size: 13 px
  • Soften: 5 px
  • Angle: 90
  • Altitude: 30
  • Highlights: Screen, white, 100%
  • Shadows: Multiply, black, 100%

You can use a different Gloss Contour for a different type of stucco texture!

bevel and emboss settingsbevel and emboss settingsbevel and emboss settings
style addedstyle addedstyle added

Step 8

Add a Stroke as well:

  • Size: 1 px
  • Position: Center
  • Blend Mode: Normal
  • Opacity: 67%
  • Fill Type: Color
  • Color: white
stroke settingsstroke settingsstroke settings
stroke addedstroke addedstroke added

Step 9

The stucco texture is done! Now you can just create a brush out of it, like before.

custom stucco brush effectcustom stucco brush effectcustom stucco brush effect

3. How to Create a Seamless Stucco Texture Brush

Step 1

What if you want to paint more freely with your stucco Photoshop brush, without having to worry about the edges? Then you need to create a seamless brush. First, open your stucco texture (the photo or the one we’ve just created). Then make the texture seamless, for example using the method described in this tutorial:

make the texture seamlessmake the texture seamlessmake the texture seamless

Step 2

This time, instead of creating a brush right away, go to Edit > Define Pattern.

define a patterndefine a patterndefine a pattern

Step 3

Create a New File—make it quite big.

create new filecreate new filecreate new file

Step 4

Open the Brushes panel and go to Dry Media Brushes > Kyle’s Ultimate Pastel Palooza.

select a brushselect a brushselect a brush

Step 5

Go to the Brush Settings. Go to the Texture tab and select the stucco texture we’ve just created. Then adjust the settings until the brush works as you expect it to.

Here are the settings I’ve used:

  • Scale: 190% (it can be smaller, if you have a bigger area to cover)
  • Brightness: 0
  • Contrast: -25
  • Texture Each Tip: checked
  • Mode: Height
  • Depth: 7%
  • Minimum Depth & Depth Jitter: 0%
adjust brush settingsadjust brush settingsadjust brush settings
brush effectbrush effectbrush effect

Step 6

When you’re done, create a new brush by clicking the plus icon on the bottom. Your seamless Photoshop stucco texture brush is all done now! However, keep in mind that this texture has fewer shades of gray than a normal stamp brush, so the effect may look less convincing.

create new brushcreate new brushcreate new brush
stucco brush seamlessstucco brush seamlessstucco brush seamless

Good Job!

Now you know how to create a stucco texture in Photoshop, as well as how to create a stamp or a seamless brush from it.

stucco brush photoshopstucco brush photoshopstucco brush photoshop

Textured Photoshop Brushes Available to Download

Photoshop brushes are really powerful, and they can save you a lot of time—but having to create them first often defeats the purpose. Fortunately, on Envato Elements, you’ll find plenty of professional brushes, ready to download and use! Here are a few great options:

Grunge Photoshop Brushes [ABR, PNG]

Grunge Photoshop BrushesGrunge Photoshop BrushesGrunge Photoshop Brushes

If you want to add some chaos to your image, it’s very easy to do with grunge brushes. This set contains ten of them, all in high resolution.

20 Grunge Artistic Brushes [ABR, PDF]

20 Grunge Artistic Brushes 20 Grunge Artistic Brushes 20 Grunge Artistic Brushes

Do you need more control over the chaos? These 20 brushes will work great with a graphics tablet—with them, you can turn every stroke into a detailed texture.

Photoshop Scatter & Stipple Brushes [ABR, PNG]

Photoshop Scatter & Stipple BrushesPhotoshop Scatter & Stipple BrushesPhotoshop Scatter & Stipple Brushes

These brushes may look simple, but you’d be surprised what effects you can achieve with them! You can use them to add noise, make a surface look more detailed, or turn smooth surfaces into rough ones.

24 Distressed Texture Brushes [ABR, PSD]

24 Distressed Texture Brushes24 Distressed Texture Brushes24 Distressed Texture Brushes

Realistic photo textures are the best way to quickly add some grunge style to a photo. This set contains as many as 24 brushes based on hand-drafted texture—you just can’t go wrong with them!

12 Texture Spray Photoshop Brushes [ABR]

12 Texture Spray Photoshop Brushes12 Texture Spray Photoshop Brushes12 Texture Spray Photoshop Brushes

If you want to quickly make your image less „clean”, a simple spray brush may be exactly what you need. This set contains 12 of them, each with a slightly different look, but they all come in a high resolution and are easy to control.

More Photoshop Brush Tutorials

If you’re interested in Photoshop brushes, you may also enjoy these tutorials:

How to Change the Baseline Shift in Illustrator

Post pobrano z: How to Change the Baseline Shift in Illustrator

In this Adobe Illustrator baseline shift tutorial, you’ll learn what a baseline is, where the baseline shift is, and how to change it in Illustrator.

We’ll use the Alma Mono font from Envato Elements to better exemplify baseline shift in Illustrator and learn how to change the baseline shift in Illustrator.

baseline shift illustrator fontbaseline shift illustrator fontbaseline shift illustrator font

Interested in learning more about working with fonts in Illustrator? Don’t miss these useful resources:

What You’ll Learn in This Adobe Illustrator Baseline Shift Tutorial

  • What is a baseline?
  • What is Baseline Shift?
  • Where is Baseline Shift in Illustrator?
  • How to change the Baseline Shift in Illustrator

What Is a Baseline?

baseline is the invisible line on which letters sit. Using baseline shift in Illustrator, you can move the entire text or selected characters up or down relative to the baseline.

illustrator baselineillustrator baselineillustrator baseline

Where Is Baseline Shift in Illustrator?

To adjust the baseline shift in Adobe Illustrator, you need to go to the Character panel.

You can either go to Window > Type > Character or use the Control-T keyboard shortcut to open this panel. As long as you have some text selected, the Character panel can also be accessed from the control panel. All you have to do is click that underlined Character text which will open the Character fly-out panel.

How to Change the Baseline Shift in Illustrator

Select a piece of text or use the Type Tool (T) to select a part of that text, focus on the Baseline Shift box, and edit the existing value to move the selection relative to the baseline. Additionally, you can deselect your text and set a baseline shift value for the text that you’re about to add.

adjust baseline shift illustratoradjust baseline shift illustratoradjust baseline shift illustrator

Alternatively, you can use a keyboard shortcut to adjust the baseline shift in Illustrator. Select your text and press Alt-Shift-Up Arrow to increase the baseline shift or Alt-Shift-Down Arrow to decrease the baseline shift value.

baseline shift illustrator shortcutbaseline shift illustrator shortcutbaseline shift illustrator shortcut

Baseline shift can be particularly useful when you’re working with text on a path as it provides a quick way for you to align and move text along that path.

baseline shift illustrator type pathbaseline shift illustrator type pathbaseline shift illustrator type path

Congratulations! You’re Done!

Now that you know how to change the baseline shift in Illustrator, feel free to use the technique in your future projects.

You can find some great sources of inspiration at Envato Elements, with interesting solutions to improve your design portfolio.

Want to Learn More?

We have loads of tutorials on Envato Tuts+, from beginner to intermediate level. Take a look!

10 Best Print-Inspired Halftone Effects (Color and Black-and-White) for Photoshop

Post pobrano z: 10 Best Print-Inspired Halftone Effects (Color and Black-and-White) for Photoshop

halftone effect is a technique that makes an image from dots of different sizes and opacities. You might recognize this distinctive look from comic books and newspaper photos.

In the digital era, you can apply the halftone effect to your existing photos, illustrations, or designs, and you don’t have to be a designer to create your own halftone effect. Instead, apply Photoshop actions or premade textures that will help you skip ahead in the process.

Corrupted Halftone EffectCorrupted Halftone EffectCorrupted Halftone Effect
This is a great example of the cool results you can get in halftone photography.

One of my favorite places to grab this type of effect is from the library at Envato Elements. This all-you-can-download subscription service has the shortcuts you need to apply halftone effects.

In this roundup, we’ll look at five Photoshop actions and five general-purpose images that can help you apply a halftone effect to your files. Each of these brings a slightly different effect to the table.

5 Best Photoshop Halftone Effects

Photoshop halftone effect actions are the one-click „easy buttons” for applying a style to an existing image. The selections below are a combination of actions and textures that each apply halftones easily.

1. Photoshop Halftone Effect Actions (ATN)

This is the classic pop-art style effect that can bring the halftone effect in Photoshop to an image with a single click. Download these actions and apply them to create halftone photography.

Halftone Photo Filter ActionHalftone Photo Filter ActionHalftone Photo Filter Action

2. Dot Grid Photoshop Actions (ATN, PAT)

Here’s another flexible option for applying a pseudo-halftone effect. You can even use a variety of Photoshop halftone effects in this package to vary the size of the dots for complete creative control!

Dot Grid Photoshop ActionsDot Grid Photoshop ActionsDot Grid Photoshop Actions

3. 10 Special Effects (ATN)

This is a package of ten different effects, but it shines for the halftone effect for Photoshop included in the package. This takes more of a square halftone approach to the effect on your image.

10 Special Effects 10 Special Effects 10 Special Effects

4. Letterpress & Screenprint Texture Effects Vol.3

Do you want to create halftone prints? This download includes a number of different texture effects, including a really slick halftone texture you can apply to any typeface.

Letterpress & Screenprint Texture Effects Vol.3Letterpress & Screenprint Texture Effects Vol.3Letterpress & Screenprint Texture Effects Vol.3

5. 40 Halftone Illustration Brushes (ABR)

Brushes are another way of applying the halftone effect, and these illustration brushes can help you apply a halftone effect to any part of an image. Load these halftone brushes into Photoshop and brush over an image to selectively add halftone details. It’s perfect for halftone prints.

40 Halftone Illustration Brushes40 Halftone Illustration Brushes40 Halftone Illustration Brushes

5 Halftone Image Effects

Whether you use Photoshop or another app, the images in this section of the roundup are flexible enough to apply to many projects. These textures and premade images feature alpha channels so that you can use them with your existing projects.

1. Subtle Halftone Textures (EPS, PNG)

This package is a great example of how helpful textures can be. This is a set of ten different halftone effects that you can overlay on any image in either EPS or PNG format.

Subtle Halftone TexturesSubtle Halftone TexturesSubtle Halftone Textures

2. Halftone Dots Texture Pack 10 (AI, EPS, PSD, PNG)

Here’s another vector texture that you can apply in practically any situation. Thanks to the vector format, you can scale the overlay up to any size and layer it onto any file to add the halftone effect in Photoshop. You can also work with this as a halftone effect in Illustrator.

Halftone Dots Texture Pack 10Halftone Dots Texture Pack 10Halftone Dots Texture Pack 10

3. Clean Vector Halftones (EPS, PNG)

This halftone print package is flexible and can be used for a variety of images, including the thumbnail for this tutorial! Because it’s packaged as a vector-based halftone effect Illustrator file, you can scale it up to any size and apply the halftone fade to any of your projects. 

Clean Vector HalftonesClean Vector HalftonesClean Vector Halftones

4. Crumpled Paper Halftone Textures (AI, EPS, PNG)

This paper-style effect still integrates the halftone effect but in a more organic way thanks to the layered paper textures. Try this out for a true paper effect with halftone printing styles for your content.

Crumpled Paper HalftonesCrumpled Paper HalftonesCrumpled Paper Halftones

5. Halftone Stains #1 Texture Pack (PNG, PDF, AI)

Halftone effects don’t have to be clean and homogeneous. This package of halftone effects for Illustrator has a „crime scene meets comic book” effect. Drop these in for a touch of halftone without covering your image.

Halftone Stains Texture PackHalftone Stains Texture PackHalftone Stains Texture Pack

More Photoshop Actions in Action

Editorial Note: This post has been updated with contributions from Janila Castañeda. Janila is a staff writer with Envato Tuts+.

How to Make a Tiny Planet in Photoshop

Post pobrano z: How to Make a Tiny Planet in Photoshop

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

In this tutorial, you will learn how to make a tiny planet in Photoshop. I will explain everything in so much detail that everyone can create the tiny planet Photoshop effect, even those who have just opened Photoshop for the first time.

Do you want to save time with a ready-made effects? Check out Photoshop actions on Envato Elements, where you can find over 1,000 awesome photo effects!

island photoshop actionisland photoshop actionisland photoshop action

What You’ll Learn in This Little Planet Tutorial

  • How to set up a photo to transform it into a little planet Photoshop effect
  • How to transform a photo to a panorama of a tiny planet
  • How to remove the seam from our little planet effect
  • How to make final adjustments to the planet Photoshop effect
  • How to create your own tiny world photo effect

What You’ll Need

To recreate the design above, you will need the following resources:

1. How to Start Creating the Little Planet Effect

Step 1

First, open the photo that you want to work with. To open your photo, go to File > Open, choose your photo, and click Open.

opening photoopening photoopening photo

Step 2

Now we need to make sure that once we transform the photo into a planet Photoshop effect, the edges will be aligned as much as possible where they meet. To do so, choose the Crop Tool (C), click on the Straighten icon, and click and hold on the bottom-left edge of the sand and drag to draw a line to the end at the bottom-right edge of the sand.

cropping imagecropping imagecropping image

Step 3

We need to contract the canvas on the top and bottom so that we have more balanced circular panorama. Go to Image > Canvas Size and use the settings below:

changing canvas sizechanging canvas sizechanging canvas size

2. How to Create a Little Planet Photoshop Effect

Step 1

In this section, we are going to transform a photo into a panorama of a tiny planet. Double-click on the Background layer to create a new layer from the background.

creating new layer from backgroundcreating new layer from backgroundcreating new layer from background

Step 2

Now go to Image > Image Size, click on the link icon to unlink the image aspect ratio, and copy and paste the Height value to the Width value to make the image square.

changing image sizechanging image sizechanging image size

Step 3

Go to Edit > Transform > Flip Vertical to flip the image vertically.

flipping image verticallyflipping image verticallyflipping image vertically

Step 4

Now go to Filter > Distort > Polar Coordinates and select the Rectangular to Polar option.

adding polar coordinates filteradding polar coordinates filteradding polar coordinates filter

Step 5

Press Control-J on your keyboard to duplicate this layer, and then Control-E to merge the original and copy layers into one layer. You can repeat this step a few times until the meeting edge transparency fills in.

duplicating and merging layersduplicating and merging layersduplicating and merging layers

Step 6

Now we need to make the edges of the circle panorama Photoshop effect meet seamlessly. To do so, I have used the Spot Healing Brush Tool (J), Healing Brush Tool (J), and Clone Stamp Tool (S). You can use any tool that you prefer, and you can skip over the ocean part in this step.

removing seamremoving seamremoving seam

Step 7

Choose the Elliptical Marquee Tool (M), and Shift-click and drag to draw a selection as shown below.

making selectionmaking selectionmaking selection

Step 8

Now choose the Rectangular Marquee Tool (M), and Alt-click and drag to delete the left part of the circle selection.

adjusting selectionadjusting selectionadjusting selection

Step 9

Press Control-J on your keyboard to create a new layer using the selection. Then, go to Edit > Transform > Flip Horizontal to flip the layer horizontally, and position it as shown below. After that, you can add a layer mask to this layer to soften the edges.

creating new layer using selectioncreating new layer using selectioncreating new layer using selection

Step 10

Now press Control-E on your keyboard to merge the two layers into one. Name this new layer Tiny Planet.

merging layersmerging layersmerging layers

Step 11

You can check once more if any seams need to be adjusted, using the same methods that we have used previously, or make any other changes. Here is my result:

adjusting seamadjusting seamadjusting seam

Step 12

Now Right-click on the Tiny Planet layer and choose Convert to Smart Object. Then, press Control-T on your keyboard to transform this layer, and set the Width and Height to 125% and the Angle to 75°.

transforming layertransforming layertransforming layer

3. How to Make Final Adjustments to the Tiny World Photo

Step 1

In this section, we are going to make some final adjustments to the little planet effect. Press D on your keyboard to reset the swatches, go to Layer > New Adjustment Layer > Gradient Map to create a new gradient map adjustment layer, and name it Contrast. Then, change the Blending Mode of this layer to Luminosity and set the Opacity to 30%.

creating new gradient map adjustment layercreating new gradient map adjustment layercreating new gradient map adjustment layer

Step 2

Now go to Layer > New Adjustment Layer > Levels to create a new levels adjustment layer, and name it Brightness. Then, Double-click on this layer thumbnail and, in the Properties panel, set the Highlight Input Level to 245.

creating new levels adjustment layercreating new levels adjustment layercreating new levels adjustment layer

Step 3

Go to Layer > New Adjustment Layer > Vibrance to create a new vibrance adjustment layer and name it Vibrance/Saturation. Then, Double-click on this layer thumbnail and, in the Properties panel, set the Vibrance to +35 and Saturation to +20.

creating new vibrance adjustment layercreating new vibrance adjustment layercreating new vibrance adjustment layer

You Made It!

Congratulations, you’ve succeeded! You’ve now learned how to make a tiny planet in Photoshop. Here is the final result of our tiny world photo effect:

final resultfinal resultfinal result

5 Creative Photoshop Actions From Envato Elements

If you liked this circle panorama Photoshop effect, you may want to see some cool Photoshop actions. Check out this list of Photoshop actions from Envato Elements.

Watercolor Photoshop Action (ABR, ATN, PAT)

watercolor photoshop actionwatercolor photoshop actionwatercolor photoshop action

Create watercolor artworks with just a couple of clicks! This action will do all the work for you, leaving you fully layered and customizable results, along with even 30 color looks to choose from.

Polygon Photo Effect for Photoshop (ATN)

polygon photo effect for photoshoppolygon photo effect for photoshoppolygon photo effect for photoshop

With this Photoshop action you can create polygon effect from your photos quick and easy! There are 7 levels of polygon detail to choose from, and there is a lot of options for customizing the results.

Anaglyph / Glitch Photo FX (PSD)

anaglyph glitch photo fxanaglyph glitch photo fxanaglyph glitch photo fx

Give your photos a glitch effect with this template! It’s easy to use, and there is a video tutorial included demonstrating how to use the product.

Double Exposure Action (ATN)

double exposure actiondouble exposure actiondouble exposure action

Blend two photos of your choice into a double exposure photo effect with this action! The action works with any Photoshop version and language.

Geometrical Collage Generator Photoshop Plugin (ABR, ATN, PAT, ZXP)

geometrical collage generator photoshop plugingeometrical collage generator photoshop plugingeometrical collage generator photoshop plugin

Using this plugin, you can create this abstract effect from your photos in an easy way. The script creates a random look, so every time you run it, you will get a unique look!

Discover More Photoshop Tutorials and Resources

Hope you liked this little planet tutorial. Now that you know how to create a tiny planet in Photoshop, here are some other tutorials you may also like:

Agregator najlepszych postów o designie, webdesignie, cssie i Internecie