Handsontable Visual Test Demos
handsontable/handsontable
Explains how to add or change the demo pages that Handsontable's visual regression suite photographs, including per-feature routes in the js demo and the shared grid.
Set up component testing with Playwright using a story gallery — scaffold stories and a gallery dev page driven by the built-in mount fixture, no dedicated component-testing runtime.
$ npx skills add mellowagain/gitarena --skill playwright-component-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mellowagain/gitarena playwright-component-testing --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/mellowagain/gitarena.git skills-src && mkdir -p .claude/skills && cp -r skills-src/gitarena-frontend/.claude/skills/playwright-component-testing .claude/skills/playwright-component-testing && 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 "playwright-component-testing" agent skill from https://github.com/mellowagain/gitarena/tree/main/gitarena-frontend/.claude/skills/playwright-component-testing into .claude/skills/playwright-component-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-component-testing", 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/mellowagain/gitarena/tree/main/gitarena-frontend/.claude/skills/playwright-component-testingType 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 mellowagain/gitarena --skill playwright-component-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mellowagain/gitarena playwright-component-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mellowagain/gitarena.git skills-src && mkdir -p .agents/skills && cp -r skills-src/gitarena-frontend/.claude/skills/playwright-component-testing .agents/skills/playwright-component-testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "playwright-component-testing" agent skill from https://github.com/mellowagain/gitarena/tree/main/gitarena-frontend/.claude/skills/playwright-component-testing into .agents/skills/playwright-component-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-component-testing", 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 mellowagain/gitarena --skill playwright-component-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mellowagain/gitarena playwright-component-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mellowagain/gitarena.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/gitarena-frontend/.claude/skills/playwright-component-testing .cursor/skills/playwright-component-testing && 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 "playwright-component-testing" agent skill from https://github.com/mellowagain/gitarena/tree/main/gitarena-frontend/.claude/skills/playwright-component-testing into .cursor/skills/playwright-component-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-component-testing", 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/mellowagain/gitarena.git --path gitarena-frontend/.claude/skills/playwright-component-testing--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 mellowagain/gitarena --skill playwright-component-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mellowagain/gitarena playwright-component-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mellowagain/gitarena.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/gitarena-frontend/.claude/skills/playwright-component-testing .gemini/skills/playwright-component-testing && 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 "playwright-component-testing" agent skill from https://github.com/mellowagain/gitarena/tree/main/gitarena-frontend/.claude/skills/playwright-component-testing into .gemini/skills/playwright-component-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-component-testing", 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 mellowagain/gitarena playwright-component-testingInstalls 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 mellowagain/gitarena --skill playwright-component-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mellowagain/gitarena.git skills-src && mkdir -p .github/skills && cp -r skills-src/gitarena-frontend/.claude/skills/playwright-component-testing .github/skills/playwright-component-testing && 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 "playwright-component-testing" agent skill from https://github.com/mellowagain/gitarena/tree/main/gitarena-frontend/.claude/skills/playwright-component-testing into .github/skills/playwright-component-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-component-testing", 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 mellowagain/gitarena --skill playwright-component-testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install mellowagain/gitarena playwright-component-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mellowagain/gitarena.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/gitarena-frontend/.claude/skills/playwright-component-testing .opencode/skills/playwright-component-testing && 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 "playwright-component-testing" agent skill from https://github.com/mellowagain/gitarena/tree/main/gitarena-frontend/.claude/skills/playwright-component-testing into .opencode/skills/playwright-component-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-component-testing", 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.
playwright-component-testingSet up component testing with Playwright using a story gallery — scaffold stories and a gallery dev page driven by the built-in mount fixture, no dedicated component-testing runtime.
Playwright Component Testing is an agent skill from mellowagain/gitarena. Set up component testing with Playwright using a story gallery — scaffold stories and a gallery dev page driven by the built-in mount fixture, no dedicated component-testing runtime. Use when asked to test React or Vue components in isolation with Playwright, or to migrate off @playwright/experimental-ct-react / -vue.
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/gallery-spec.md`, `references/migration.md` and `references/react.md`).
It sits in Testing & QA, covering Browser testing. It works with Playwright, Vue.js, React and Vite. The repository describes itself as: Rust-based Software development platform (forge) with built-in vcs, issue tracking and code review. The licence is MIT.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit a9b0bf7. 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.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
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.
Playwright Component Testing loads about 2.6k tokens when it runs, and up to ~9.2k if it reads all its reference files. Until then it costs about 87 tokens; SKILL.md has 1,129 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 mellowagain/gitarena at commit a9b0bf7, republished under its MIT licence (© mellowagain). 1,129 words, ~2,621 tokens.
.claude/skills/playwright-component-testing/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Test components with regular Playwright e2e tests against a small story gallery page hosted by the app's own dev server. No extra test runner, bundler integration or npm packages are required.
*.story.tsx (or .ts/.jsx/.js/.vue) files; each named export is one story.references/gallery-spec.md: it exposes window.mount(params) / window.unmount() that render a story — resolved from your story files (e.g. with import.meta.glob) — into #root. It is framework-specific and yours to own — there is no template to copy for it.mount(storyId, props?) fixture (from @playwright/test) drives the gallery's window.mount and returns a Locator for the gallery root (#root). Scope the queries from there — component.getByRole('button').click(), not component.click(). Nothing to scaffold for it.Everything the component needs must be set up inside the story (it runs in the browser); everything the test asserts must be observable through the page (DOM, URL, network). Where the component takes callbacks, the story creates the state, provides the callbacks and records the state into a hidden form for the test to assert on. mount(id, props) passes plain serializable props to the story.
Detect the framework and bundler. React vs Vue decides the framework notes and example story to follow. Then:
vite.config.*): the gallery is served by the existing dev server at /playwright/gallery/index.html — Vite serves any .html file under the project root, the app's plugins/aliases/CSS apply automatically, and vite build ignores it. No extra server needed.baseURL at it. Requires vite and the framework plugin as devDependencies.Implement the gallery to references/gallery-spec.md: a page at <project>/playwright/gallery/ that renders the requested story into #root. Start from the worked example in the spec and the framework notes in references/react.md / references/vue.md. Keep story discovery (import.meta.glob) and the framework mount here — this is the only framework-specific glue, so keep it small. Import the app's global CSS the same way the app's own entry does.
Configure Playwright — add to playwright.config.ts:
projects: [
{
name: 'components',
testDir: './tests/components',
use: { ...devices['Desktop Chrome'], baseURL: 'http://localhost:5173/playwright/gallery/index.html', serviceWorkers: 'block', reuseContext: true },
},
],
webServer: {
command: 'npm run dev', // or: npx vite --config playwright/vite.config.ts
url: 'http://localhost:5173/playwright/gallery/index.html', // standalone server: http://localhost:3100/playwright/gallery/index.html
reuseExistingServer: !process.env.CI,
}, Match the port to the dev server. mount navigates to baseURL, so set baseURL to the gallery's URL. serviceWorkers: 'block' keeps the app's own service worker from serving cached responses that would shadow your page.route() mocks. reuseContext: true reuses the browser context across tests in a worker (as the old component-testing runtime did) — a large speedup for component suites. If the config already has projects/webServer, merge instead of replacing.
Write a first story next to an existing component, modeled on templates/<react|vue>/Button.story.*.
Write a first spec, modeled on templates/react/button.spec.ts, importing test/expect from @playwright/test.
Run: npx playwright test --project=components. Open http://localhost:5173/playwright/gallery/index.html in a browser to eyeball all stories.
src/ without the .story.* extension, plus the export name — src/components/Button.story.tsx export Primary → components/Button/Primary. Any unique suffix works too: mount('Button/Primary'). A .story.vue single-file component is one story, addressable by its path alone (its default export). With gallery types (references/typing.md) ids are prefixed with the package name: acme-ui/components/Button/Primary.Examples are React; the Vue equivalents differ only in story syntax.
The story owns the state and provides the callbacks. Where the component takes callbacks, create the state inside the story, wire the callbacks to it, and record the state into a hidden form next to the component. Tests perform operations and assert on the recorded values:
export const Stateful = () => {
const [expanded, setExpanded] = useState(false);
return (
<>
<Expandable expanded={expanded} setExpanded={setExpanded} title="Title">
Details
</Expandable>
<form hidden>
<input data-testid="expanded" readOnly value={String(expanded)} />
</form>
</>
);
};test("click should expand", async ({ mount }) => {
const component = await mount("components/Expandable/Stateful");
await component.locator(".codicon-chevron-right").click();
await expect(component.getByTestId("expanded")).toHaveValue("true");
});This keeps the whole scenario in the browser: no callback marshalling, the story doubles as documentation, and the recorded state is visible when eyeballing the gallery. Record each observed value in its own data-testid input (String(...) or JSON.stringify(...) for payloads) and assert with toHaveValue() — a web-first assertion that retries until the state lands. The negative direction works the same way: perform the operation, then assert the value did not change.
When a scenario is genuinely parametric (e.g. a boundary-value sweep), pass props as the second argument to mount; the gallery hands them to the story as its props. Keep props to plain serializable data — callbacks belong inside the story.
export const WithTitle = ({ title = "Default" }: { title?: string }) => <Button title={title} />;const component = await mount("components/Button/WithTitle", { title: "Hello" });Props are type-checked in two optional ways, see references/typing.md: pass the story type as a template argument (mount<typeof WithTitle>('components/Button/WithTitle', { title: 'Hello' }), no setup), or generate gallery types with a small Vite plugin so the id itself is typed (mount('acme-ui/components/Button/WithTitle', { title: 'Hello' }), with autocomplete and rename safety). Vue stories must additionally declare the props at runtime — see the Typed props sections in references/react.md / references/vue.md.
update()To test how a component reacts to a prop change without remounting (state preserved), call component.update(newProps) — it re-renders the same story with new props on the existing root:
const component = await mount("components/Counter/Default", { value: 1 });
await expect(component.getByTestId("value")).toHaveText("1");
await component.update({ value: 2 });
await expect(component.getByTestId("value")).toHaveText("2");This requires the gallery to reuse its root/instance (references/gallery-spec.md); state survives as long as the story stays the same.
Each mount() navigates fresh, so tests are fully isolated and mounting several stories in one test is cheap:
await expect(await mount("Button/Primary")).toHaveScreenshot("primary.png");
await expect(await mount("Button/Disabled")).toHaveScreenshot("disabled.png");For visual comparison, screenshot the returned root locator (as above), not the page, to avoid asserting on browser chrome.
Use page.route() as usual — register routes before mount(), since mounting navigates. serviceWorkers: 'block' (set in the config above) keeps the app's own service worker from serving cached responses that shadow the routes. Teams with MSW handler libraries can start the worker inside a story or decorator instead.
Open your gallery URL (baseURL) in a browser and call await window.mount({ story: 'components/Button/Primary' }) from the devtools console — that is exactly what the mount fixture does. An unknown story rejects window.mount, which surfaces as the test's mount() throwing with a real stack. To browse without the console, give your gallery an optional index page.
src layouts: change the glob and the id derivation in your gallery (references/gallery-spec.md) to match, and prefix ids with the package name (references/typing.md).decorator helper next to the gallery and wrap components in stories; see references/react.md / references/vue.md.references/gallery-spec.md — the gallery endpoint contract to implement (start here).references/typing.md — optional typing for mount: explicit story types vs generated gallery types, with the Vite plugin.references/react.md — React walkthrough: providers, StrictMode, CSS.references/vue.md — Vue walkthrough: .story.ts and .story.vue stories, plugins.references/migration.md — migrating off @playwright/experimental-ct-react / -vue.© mellowagain, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references) in gitarena-frontend/.claude/skills/playwright-component-testing of mellowagain/gitarena.
Open the folder on GitHubat commit a9b0bf7
We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in mellowagain/gitarena, which our catalogue first saw on October 7, 2026.
Playwright Component Testing 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 |
|---|---|---|---|---|---|---|
| Playwright Component Testing this skillmellowagain/gitarena | 115 | 1 repos | ~2.6k | Automated safety check: Pass | MIT | |
| Handsontable Visual Test Demoshandsontable/handsontable | 22k | — | ~1.3k | Automated safety check: Pass | Custom licence | |
| Awt E2E Testingsickn33/agentic-awesome-skills | 47k | 2 repos | ~556 | Automated safety check: Pass | MIT | |
| Liteyuki Webui FrontendLiteyukiStudio/LiteyukiBot | 157 | — | ~2.5k | Automated safety check: Pass | Custom licence | |
| Desktopgridaco/grida | 2.7k | — | ~3.2k | Automated safety check: Notes | Apache-2.0 | |
| Playwright Coretestdino-hq/playwright-skill | 386 | 1 repos | ~1.4k | Automated safety check: Pass | MIT |
handsontable/handsontable
Explains how to add or change the demo pages that Handsontable's visual regression suite photographs, including per-feature routes in the js demo and the shared grid.
sickn33/agentic-awesome-skills
AI-powered E2E web testing — eyes and hands for AI coding tools.
LiteyukiStudio/LiteyukiBot
Build, review, or test LiteyukiBot v7's React/Vite WebUI under webui/ and its packaged static delivery in packages/webui/.
gridaco/grida
Grida Desktop Electron shell and release-impact work: BrowserWindow, preload, window.grida, menus, protocol/deep links, file associations, Forge, path-scoped bridge security, Electron-only UI bugs…
testdino-hq/playwright-skill
Battle-tested Playwright patterns for writing and debugging reliable E2E, API, component, visual, accessibility, and security tests.
vaadin/web-components
Reproduce a Vaadin web component bug from a GitHub issue in vaadin/web-components.
mellowagain/gitarena
Inspect Playwright trace files from the command line — list actions, view requests, console, errors, snapshots and screenshots.
mellowagain/gitarena
Applies GitArena's official design system, colors, and typography to frontend components and pages.
Categories
Set up component testing with Playwright using a story gallery — scaffold stories and a gallery dev page driven by the built-in mount fixture, no dedicated component-testing runtime. Playwright Component Testing is an agent skill from mellowagain/gitarena. Set up component testing with Playwright using a story gallery — scaffold stories and a gallery dev page driven by the built-in mount fixture, no dedicated component-testing runtime.
Playwright Component Testing fits situations like: asked to test React; vue components in isolation with Playwright; migrate off @playwright/experimental-ct-react / -vue.
Run `npx skills add mellowagain/gitarena --skill playwright-component-testing -a claude-code`. Or copy the skill folder (gitarena-frontend/.claude/skills/playwright-component-testing in mellowagain/gitarena) into .claude/skills/playwright-component-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mellowagain/gitarena --skill playwright-component-testing -a codex`. Or copy the skill folder (gitarena-frontend/.claude/skills/playwright-component-testing in mellowagain/gitarena) into .agents/skills/playwright-component-testing 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 mellowagain/gitarena --skill playwright-component-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/playwright-component-testing, .gemini/skills/playwright-component-testing, .github/skills/playwright-component-testing and .opencode/skills/playwright-component-testing in your project.
Going by SKILL.md and its folder, Playwright Component Testing needs the command-line tools its instructions call (npx). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. 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.
Playwright Component Testing 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.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.6k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Playwright Component Testing: Handsontable Visual Test Demos (handsontable/handsontable, 22k stars), Awt E2E Testing (sickn33/agentic-awesome-skills, 47k stars), Liteyuki Webui Frontend (LiteyukiStudio/LiteyukiBot, 157 stars) and Desktop (gridaco/grida, 2.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
mellowagain (a GitHub user) maintains it in mellowagain/gitarena, which has 115 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: mellowagain/gitarena on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.