Dynamic rules

Our fancy-button-purple shortcut works fine but what if we want lots of colors? Creating a separate shortcut for each color is a lot of work. Instead we can use dynamic shortcuts.

Dynamic shortcuts are rules with a regex in the name. Let’s make a dynamic fancy-button-(color here) utility that will change the button color to the specified color.

The name should be this: /^fancy-button-(.*)$/

New to regex?

Inside of uno.config.js we can modify "fancy-button-purple" to accept a regex instead. The syntax changes slightly and now looks like this:

[/^fancy-button-(.*)$/, ([, c]) => `py-2 px-4 border-1 border-${c}-600 bg-${c}-300 hover:bg-${c}-400 rounded-lg shadow-md`],

Matching numbers in regex

We now have this arrow function which starts with ([, c]) where c will match whatever is after fancy- and allow us to use the c value in the color utilities like bg-${c}-300.

You should end up with something like this:

import { defineConfig, presetWind3 } from "unocss";
export default defineConfig({
presets: [presetWind3()],
shortcuts: [
[
/^fancy-button-(.*)$/,
([, c]) =>
`py-2 px-4 border-1 border-${c}-600 bg-${c}-300 hover:bg-${c}-400 rounded-lg shadow-md`,
],
],
});

After creating the new dynamic rule all of the text in the preview should have its own color. There is a potential problem though, since we used the bg-${c}-300 syntax we can’t really get a skyblue or hotpink button like before. Can we fix this? We’ll look at this in the next lesson.

Powered by WebContainers
Files
Preparing Environment
  • Installing dependencies
  • Starting http server