Contents

What we support

You already generated CSS for Maya's homepage hero. This page is the rest of the menu — what compiles, what is skipped, the silent surprises, and what to paste for Tailwind v3 versus v4. If a class produced nothing, start here.

The rest of the menu

You already generated CSS for Maya's homepage hero on Generate Tailwind CSS. This page is what compiles, what is skipped, the surprises that do not show up in the skipped list, and what to paste for Tailwind v3 versus v4. If a class produced nothing, start here.

Keep that hero in mind. rounded-xl is a stock utility. bg-brand-500 needs her theme. The tables below are the rest of that job — a hex in the class name, a plugin class, a dark: toggle that follows the operating system instead of .dark.

The walkthrough of how to open Generate Tailwind CSS, read the preview, and publish lives on Generate Tailwind CSS. This page does not replace that first path.

Why some things cannot work

The limits below are architectural, not missing polish. They exist because a widget is a guest on someone else's page, and because RuleCMS cannot run code you paste.

ConstraintWhat that means for you
A widget cannot reset the host pageTailwind Preflight — the base layer that zeros margins and sets box-sizing — is never applied. If the hero depended on those resets, add them yourself under Widget chrome.
We never run your JavaScriptA pasted tailwind.config.js is read as text, not executed. Plugins, require(), spreads, and function calls cannot run. That is why plugin classes such as prose never generate.
Class names have a character allowlistNames cannot contain !, #, =, @, *, &, >, or parentheses. Square brackets are allowed, so w-[42px] works and bg-[#1a4f8a] does not.
Only class names written in the tree are seenA class computed at runtime — bg-${color}-500 — is invisible, the same way Tailwind's own scanner would miss it. The name has to appear literally on the widget or a child collection.
This is a snapshotGeneration writes CSS this widget owns. It is not connected to her repository. Re-run it when you add classes or change the theme.

What we support

These compile when the class name is stored on the widget and, for design-system names, when the matching token is available.

CategoryExamples
Plain utilitiesflex z-50 w-full truncate sr-only
Theme-backed spacing, type, radiusp-4 rounded-xl text-base font-sans
Fractions, negatives, pxw-1/2 -mt-4 mt-px
Alpha modifierstext-red-500/50 ring-brand/30
Breakpointssm: md: lg: xl: 2xl: max-md: min-[600px]:
Pseudo-classes and pseudo-elementshover: focus: focus-visible: before: after: placeholder:
Relational variantsgroup-hover: peer-checked: — the group / peer marker classes themselves generate nothing; leave them on the markup. See Silent surprises.
Media, direction, ARIAdark: motion-reduce: print: rtl: aria-expanded:
Stacked variantsdark:hover: sm:focus-visible:
Composable utilitiesshadow-sm ring-1 blur-sm scale-95 from-red-500
Arbitrary values with safe charactersw-[42px] has-[:checked]:flex supports-[display:grid]:flex

Design-system classes such as bg-brand-500 work only when the matching token is on this widget or in the paste. Without that token they look exactly like a typo.

What we do not support

This classWhy it is skippedWhat to do
bg-[#1a4f8a]# is not allowed in a class nameAdd --color-brand: #1a4f8a to the theme and use bg-brand
data-[state=open]:flex= is not allowedDefine the rule under Class Definitions
!flex! is not allowedWrite the declaration with !important by hand, or rely on catalog order — generated utilities already win over earlier hand-written classes
@md:flex, @container@ is not allowed; container queries drop outUse a breakpoint variant such as md:flex, or write the container query under Class Definitions
*:p-4, [&>*]:p-4*, &, and > are not allowedPut p-4 on the children, or write the child selector under Class Definitions
bg-(--my-color)Parentheses are not allowedRegister the colour as a theme token and use bg-my-color
prose, other plugin classesPlugins never runCopy the plugin CSS into Class Definitions
Your own btn from @utility or @applyOnly @theme tokens are read from a pasteDefine btn under Class Definitions
A class built in JavaScript at runtimeNothing in the tree to findPut the full class name on the component as a literal string

Silent surprises

Most failures appear in the skipped list. These three do not, or they appear in a way that is easy to misread.

Class-based dark mode follows the operating system

Generated dark: classes use @media (prefers-color-scheme: dark). If Maya's project redefined the variant — Tailwind v4 @custom-variant dark (&:where(.dark, .dark *)), or v3 darkMode: 'class' — that redefinition is dropped. The class is generated, the CSS is valid, and nothing is reported as skipped. It just responds to the OS setting instead of a .dark ancestor.

If her site has a dark-mode toggle, check it by hand after you generate. To keep the class-based trigger, add a theme under Themes that sets the tokens under .dark, or rewrite the dark: rules under Class Definitions.

group and peer in the skipped list are expected

They are marker classes. They carry no CSS, so generation reports them as "Not a Tailwind utility." The variants that depend on them — group-hover:flex, peer-checked:hidden — do generate, and they match the literal class in the markup. Do not remove group or peer from the component because the report mentioned them.

A token that overrides a Tailwind default retunes every utility

If her paste (or this widget's variables) sets --spacing: 8px, then p-4 becomes 32px instead of 16px. That is what her project does, so it is correct — and it is listed in the preview under "Overrides a Tailwind default" so you can see the reach before you confirm.

Workarounds

What you wantedDo this instead
A hex colour in the class nameMove the colour into the theme as --color-* and use bg-* / text-*
Plugin output such as TypographyPaste the compiled plugin CSS into Class Definitions
A custom @utility or @apply classRecreate it under Class Definitions. Generation will not delete a hand-written class on the next run
Class-based dark modeUse Themes to override tokens under .dark, or rewrite the generated dark: bodies
Resets you used to get from PreflightAdd them on Widget chrome
A class only assembled in codeWrite the full name on the node so generation can see it
A computed value in a v3 configPaste the resolved literal, or paste the v4 @theme block

v3 versus v4 paste

The field on the dialog is Paste your Tailwind theme or config. You do not have to tell us the version. Paste either of the following and we detect the format. Leave the box blank if Maya has no custom theme or config. The short version of this step — enough to try — is on Generate Tailwind CSS.

Tailwind v4 — the @theme block in your CSS file

Usually app/globals.css or src/index.css, next to @import "tailwindcss". You can paste the whole stylesheet; only @theme declarations are read. A bare list of --token: value lines also works.

@theme {
  --color-brand: #6d28d9;
  --radius-card: 12px;
}

Tailwind v3 — your tailwind.config.js

In her project root. Paste the whole file, or just the theme object. Nested keys flatten: colors.brand becomes --color-brand, which is what lets bg-brand compile.

module.exports = {
  theme: {
    extend: {
      colors: { brand: '#6d28d9' },
      borderRadius: { card: '12px' },
    },
  },
};
We read the config without running it. Values built from require(), a variable, a function call, or a spread cannot be resolved. Those tokens are listed after you generate under "Tokens we could not read." Paste the resolved values, or paste the v4 @theme block if you have one.

After the first successful generate, the tokens that were actually used are stored on this widget. A later run can reuse them without another paste. Only used tokens are stored — paste seven colours and use three, and three persist. Start using a fourth later and paste again, or put the full set on CSS Variables yourself so they all stay.

After you generate

  • Review the new entries on Class Definitions and CSS Variables. You can edit any of them; the next generate overwrites a generated name and leaves names that exist only on the widget.
  • Publish the widget. Composer and Preview already read the draft; the live embed does not change until you publish.
  • Generate again after you add class names or change the theme. The second run does not need a paste if the tokens are already on this widget.

Related guides

  • Generate Tailwind CSS — the first walkthrough: paste, generate, publish
  • Class Definitions — hand-write anything generation cannot store
  • CSS Variables — keep the full token set on the widget so later generates do not need another paste
  • Themes — host dark-mode strategy when dark: should not follow the OS
  • Widget chrome — resets you no longer get from Preflight
  • Publishing — draft versus live
  • Widgets — CSS Settings and the rest of the widget