Sanity Visual Regression
sanity-io/sanity
Add, review, and maintain Chromatic visual regression coverage in the Sanity monorepo via dev/storybook stories, the vitest browser-mode suite, and Playwright e2e snapshots.
Extract and compare computed CSS styles between a baseline URL and a dev/Storybook URL using Playwright MCP evaluate calls.
$ npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install bitovi/ai-enablement-prompts computed-styles --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/bitovi/ai-enablement-prompts.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/playwright/skills/computed-styles .claude/skills/computed-styles && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "computed-styles" agent skill from https://github.com/bitovi/ai-enablement-prompts/tree/main/plugins/playwright/skills/computed-styles into .claude/skills/computed-styles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "computed-styles", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/bitovi/ai-enablement-prompts/tree/main/plugins/playwright/skills/computed-stylesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install bitovi/ai-enablement-prompts computed-styles --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bitovi/ai-enablement-prompts.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/playwright/skills/computed-styles .agents/skills/computed-styles && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "computed-styles" agent skill from https://github.com/bitovi/ai-enablement-prompts/tree/main/plugins/playwright/skills/computed-styles into .agents/skills/computed-styles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "computed-styles", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install bitovi/ai-enablement-prompts computed-styles --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bitovi/ai-enablement-prompts.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/playwright/skills/computed-styles .cursor/skills/computed-styles && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "computed-styles" agent skill from https://github.com/bitovi/ai-enablement-prompts/tree/main/plugins/playwright/skills/computed-styles into .cursor/skills/computed-styles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "computed-styles", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/bitovi/ai-enablement-prompts.git --path plugins/playwright/skills/computed-styles--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install bitovi/ai-enablement-prompts computed-styles --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bitovi/ai-enablement-prompts.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/playwright/skills/computed-styles .gemini/skills/computed-styles && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "computed-styles" agent skill from https://github.com/bitovi/ai-enablement-prompts/tree/main/plugins/playwright/skills/computed-styles into .gemini/skills/computed-styles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "computed-styles", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install bitovi/ai-enablement-prompts computed-stylesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/bitovi/ai-enablement-prompts.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/playwright/skills/computed-styles .github/skills/computed-styles && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "computed-styles" agent skill from https://github.com/bitovi/ai-enablement-prompts/tree/main/plugins/playwright/skills/computed-styles into .github/skills/computed-styles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "computed-styles", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install bitovi/ai-enablement-prompts computed-styles --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bitovi/ai-enablement-prompts.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/playwright/skills/computed-styles .opencode/skills/computed-styles && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "computed-styles" agent skill from https://github.com/bitovi/ai-enablement-prompts/tree/main/plugins/playwright/skills/computed-styles into .opencode/skills/computed-styles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "computed-styles", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
computed-stylesExtract and compare computed CSS styles between a baseline URL and a dev/Storybook URL using Playwright MCP evaluate calls.
Computed Styles is an agent skill from bitovi/ai-enablement-prompts. Extract and compare computed CSS styles between a baseline URL and a dev/Storybook URL using Playwright MCP evaluate calls. Use when visual differences have been identified and you need to find the exact CSS property mismatches to fix. Pairs with the visual-diff skill for a complete visual QA workflow.
Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Visual regression testing, Browser testing and CSS and styling. It works with Storybook, Tailwind CSS, Model Context Protocol and Playwright. The repository describes itself as: Prompts Bitovi uses for software development. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit df229b1. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript and typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Computed Styles loads about 2.4k tokens when it runs. Until then it costs about 80 tokens; SKILL.md has 899 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from bitovi/ai-enablement-prompts at commit df229b1, republished under its MIT licence (© bitovi). 899 words, ~2,448 tokens.
.claude/skills/computed-styles/SKILL.md (or your agent's skills folder).Use Playwright MCP's evaluate to extract getComputedStyle() values from a baseline page and a current page, compare them property-by-property, and fix the differences with Tailwind classes.
visual-diff skill has identified pixel differences between two pagesvisual-diff first).vscode/mcp.jsonStorybook renders stories inside an iframe. You must access elements through it:
// Inside mcp_playwright_browser_evaluate
const iframe = document.querySelector('#storybook-preview-iframe');
const doc = iframe.contentDocument;
const cs = doc.defaultView.getComputedStyle.bind(doc.defaultView);
const element = doc.querySelector('nav');
const styles = cs(element);For production or dev server pages, access elements directly:
const cs = window.getComputedStyle.bind(window);
const element = document.querySelector('nav');
const styles = cs(element);This project uses Tailwind v4 with a custom theme in src/styles/bitovi-theme.css. Standard utility classes may not map to expected values. For example, text-xl in this project is 1.5rem (24px), not the standard 20px. Always verify with getComputedStyle() after applying Tailwind classes, and use arbitrary values like text-[20px] when standard classes don't produce the right output.
Tailwind v4 uses CSS layers, so class order in the HTML doesn't determine specificity the way it did in v3. If you apply both lg:text-teal-950 and lg:text-teal-600 to the same element, whichever comes later in the generated CSS wins, not whichever is last in the class attribute. To conditionally apply colors, use ternary expressions:
// WRONG: both classes always present, CSS layer order wins
className={`lg:text-teal-950 ${isActive ? 'lg:text-teal-600' : ''}`}
// RIGHT: only one color class at a time
className={isActive ? 'lg:text-teal-600' : 'lg:text-teal-950'}Based on the visual-diff results, identify the regions with differences and map them to DOM elements. Build a list of element/property pairs to extract.
Common element targets:
| Region | Typical selector | Key properties |
|---|---|---|
| Nav container | nav, nav parent | height, padding, maxWidth, boxShadow, backgroundColor |
| Logo | nav img, nav svg | width, height |
| Nav items | nav ul > li | fontSize, fontWeight, color, lineHeight, margin, fontFamily |
| CTA button | button with CTA text | height, padding, borderRadius, backgroundColor, fontSize |
| Dropdown panel | [id^="dropdown-"] | backgroundColor, borderRadius, overflow, maxWidth |
| Card / list items | li, .card | margin, padding, fontSize, fontWeight, color, lineHeight |
| Headings | h1–h6, [class*="uppercase"] | fontSize, fontWeight, color, letterSpacing, textTransform |
| Links | a | color, fontSize, fontWeight, textDecoration |
Common properties to compare:
fontSize, fontWeight, fontFamily, lineHeight, letterSpacing, textTransform,
color, backgroundColor, borderRadius, boxShadow,
width, height, maxWidth, minHeight,
padding, margin, gap,
display, alignItems, justifyContent, flexDirection,
overflow, opacityNavigate to the baseline URL and use mcp_playwright_browser_evaluate to extract all target properties in a single call. Return a structured object.
Template for production pages:
// mcp_playwright_browser_evaluate
() => {
const cs = window.getComputedStyle.bind(window);
// Find elements — use text content or structure, not brittle selectors
const nav = document.querySelector('nav');
// ... find other elements ...
return {
nav: {
height: cs(nav).height,
padding: cs(nav).padding,
maxWidth: cs(nav).maxWidth,
},
// ... other elements ...
};
}Tips for finding elements on production pages:
querySelectorAll + .textContent filtering[class*="nav-icon"]getComputedStyle(el).display !== 'none'element.closest('li'), .parentElementNavigate to the current URL and run the same extraction. For Storybook, use the iframe access pattern.
Template for Storybook:
// mcp_playwright_browser_evaluate
() => {
const iframe = document.querySelector('#storybook-preview-iframe');
const doc = iframe.contentDocument;
const cs = doc.defaultView.getComputedStyle.bind(doc.defaultView);
const nav = doc.querySelector('nav');
// ... find other elements ...
return {
nav: {
height: cs(nav).height,
padding: cs(nav).padding,
maxWidth: cs(nav).maxWidth,
},
// ... other elements ...
};
}Compare every extracted value. Build a table like:
| Element | Property | Baseline | Current | Match |
|---|---|---|---|---|
| nav | height | 80px | 60px | NO |
| nav | padding | 0px 128px | 0px 32px | NO |
| nav item | fontSize | 20px | 24px | NO |
| nav item | fontWeight | 600 | 600 | YES |
Focus on the mismatches.
For each mismatch, determine the correct Tailwind class. Prefer standard utilities; use arbitrary values when the theme doesn't have an exact match.
| Desired value | Tailwind approach |
|---|---|
| Standard spacing (4px, 8px, 16px...) | p-1, p-2, p-4 etc. |
| Non-standard spacing | p-[13px], m-[38px] |
| Standard colors in theme | text-teal-600, bg-teal-950 |
| Box shadows | shadow-[0_0_24px_-4px_rgb(191,197,198)] |
| Font sizes matching theme | Check bitovi-theme.css @theme block first |
| Font sizes not in theme | text-[20px] |
After applying changes, re-extract computed styles from the current page and confirm the values now match the baseline. This is critical because:
Work through the diff table systematically. After fixing a batch of related properties (e.g., all nav container styles), re-extract and verify before moving to the next batch.
For efficiency, extract all properties in a single evaluate call rather than making many small calls. Here's a pattern for extracting a full nav component:
() => {
const cs = window.getComputedStyle.bind(window);
const props = (el) => !el ? null : ({
fontSize: cs(el).fontSize,
fontWeight: cs(el).fontWeight,
fontFamily: cs(el).fontFamily.split(',')[0].trim(),
color: cs(el).color,
backgroundColor: cs(el).backgroundColor,
lineHeight: cs(el).lineHeight,
letterSpacing: cs(el).letterSpacing,
height: cs(el).height,
width: cs(el).width,
padding: cs(el).padding,
margin: cs(el).margin,
borderRadius: cs(el).borderRadius,
boxShadow: cs(el).boxShadow,
});
const nav = document.querySelector('nav');
// ... find elements ...
return {
nav: props(nav),
// ... other elements ...
};
}Storybook iframe: Always access through #storybook-preview-iframe. Queries on the top-level document won't find story content.
Multiple matching elements: Production pages often have duplicate elements (mobile vs desktop nav). Filter by display !== 'none' or check for the presence of child elements unique to the visible version.
React state in Storybook: You cannot trigger React state changes via dispatchEvent inside evaluate. Use Storybook story variants (e.g., --services-dropdown-open) or the play function in stories to set the desired state.
Color format differences: rgb(0, 132, 139) and #00848B are the same color. Compare numerically if needed, but getComputedStyle always returns rgb() or rgba() format on both sides.
Subpixel rendering: Values like 37.6406px vs 38px are acceptable matches. Don't chase fractional pixel differences.
Font family strings: getComputedStyle returns the full stack (e.g., Inter, sans-serif). Split on comma and compare only the first family.
No files are created on disk. All data lives in the evaluate return values and the conversation context.
© bitovi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/playwright/skills/computed-styles of bitovi/ai-enablement-prompts.
Open the folder on GitHubat commit df229b1
Computed Styles next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Computed Styles this skillbitovi/ai-enablement-prompts | 121 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Sanity Visual Regressionsanity-io/sanity | 6.4k | — | ~3.4k | Automated safety check: Pass | MIT | |
| Economical Visual Testsigrlk/storybook-addon-test-codegen | 154 | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Playwright Testingchongdashu/vibejam-starter-pack | 149 | — | ~2.2k | Automated safety check: Pass | None | |
| Plugin InstallerIgorWarzocha/Opencode-Workflows | 122 | — | ~1.3k | Automated safety check: Pass | None | |
| Smartui Skillsickn33/agentic-awesome-skills | 47k | 1 repos | ~1.1k | Automated safety check: Pass | MIT |
sanity-io/sanity
Add, review, and maintain Chromatic visual regression coverage in the Sanity monorepo via dev/storybook stories, the vitest browser-mode suite, and Playwright e2e snapshots.
igrlk/storybook-addon-test-codegen
Author economical visual tests — full visual coverage in the fewest billable snapshots.
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
IgorWarzocha/Opencode-Workflows
Find, install, and configure OpenCode plugins from the catalog or community.
sickn33/agentic-awesome-skills
Generates SmartUI visual regression test configurations for screenshot comparison on TestMu AI cloud.
PostHog/posthog
Inspects PostHog Visual Review (VR) runs that gate PR merges with screenshot regression checks.
bitovi/ai-enablement-prompts
Track reusable UI components and unextracted patterns. An agent skill from bitovi/ai-enablement-prompts.
bitovi/ai-enablement-prompts
A skill your agent uses when the user asks to "create a plugin", "add a plugin", "make a new plugin", "build a plugin", or wants to package skills into an installable plugin for this marketplace.
bitovi/ai-enablement-prompts
Create React components, hooks, or utilities following the modlet pattern.
bitovi/ai-enablement-prompts
A skill your agent uses when the user asks to "create a skill", "add a skill", "make a new skill", "build a skill", or wants to automate a repeated workflow into a reusable prompt.
bitovi/ai-enablement-prompts
Create new Agent Skills for this project. An agent skill from bitovi/ai-enablement-prompts.
bitovi/ai-enablement-prompts
Type flow patterns for tRPC + Prisma monorepos. An agent skill from bitovi/ai-enablement-prompts.
Categories
Extract and compare computed CSS styles between a baseline URL and a dev/Storybook URL using Playwright MCP evaluate calls. Computed Styles is an agent skill from bitovi/ai-enablement-prompts. Extract and compare computed CSS styles between a baseline URL and a dev/Storybook URL using Playwright MCP evaluate calls.
Computed Styles fits situations like: visual differences have been identified and you need to find the exact CSS property mismatches to fix; tasks that involve Visual regression testing; tasks that involve Browser testing.
Run `npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a claude-code`. Or copy the skill folder (plugins/playwright/skills/computed-styles in bitovi/ai-enablement-prompts) into .claude/skills/computed-styles in your project. Claude Code loads it when a task matches its description.
Run `npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a codex`. Or copy the skill folder (plugins/playwright/skills/computed-styles in bitovi/ai-enablement-prompts) into .agents/skills/computed-styles in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add bitovi/ai-enablement-prompts --skill computed-styles -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/computed-styles, .gemini/skills/computed-styles, .github/skills/computed-styles and .opencode/skills/computed-styles in your project.
SKILL.md names no scripts, command-line tools or credentials: Computed Styles is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Computed Styles is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Computed Styles: Sanity Visual Regression (sanity-io/sanity, 6.4k stars), Economical Visual Tests (igrlk/storybook-addon-test-codegen, 154 stars), Playwright Testing (chongdashu/vibejam-starter-pack, 149 stars) and Plugin Installer (IgorWarzocha/Opencode-Workflows, 122 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
bitovi (a GitHub organization) maintains it in bitovi/ai-enablement-prompts, which has 121 GitHub stars. The repository holds 40 skills in this directory. The repository was last updated on September 11, 2026.
Source: bitovi/ai-enablement-prompts on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.