跳到正文
cccskills
免费在 GitHub 公开

handsontable-a11y

Plan and verify accessibility when changing Handsontable interfaces. Covers keyboard navigation, screen reader messages, focus behavior, and theme contrast, with Playwright tests and axe scans to check changes and resolve reported issues.

中文简介正在准备中。当前显示英语简介。

原文查看原文说明

Use whenever a change touches anything a user can see or operate in Handsontable - DOM a plugin, editor, renderer, menu, dialog or bar creates; ARIA roles or attributes; keyboard shortcuts; focus; screen reader announcements; theme colors, sizes or focus rings - and when fixing a finding of the axe scan (`tests/a11y/`, `a11y-findings.json`, the `A11y / axe report` check). Covers the bar (WCAG 2.2 A and AA), the accessibility plan to write before coding, the build rules on top of core's ARIA helpers, focus scopes, shortcut contexts and announcer, how to prove it (keyboard-only Playwright flows, accessible names, the scan and its coverage map), and the loop for fixing a tracked finding.

集成工具Playwright
查看安装方法

适用场景

  • Adding accessible menus or dialogs
  • Checking keyboard navigation and focus
  • Fixing issues reported by axe scans
  • Verifying contrast across themes

包含的文件(3)

  • SKILL.md7.9 KB
  • references/patterns.md6.7 KB
  • references/proving.md4.4 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Accessibility in every development round

The bar is WCAG 2.2 Level A and AA, the level the published conformance report claims (docs/content/guides/accessibility/accessibility-conformance-report/). The axe scan catches part of it after the fact; this skill makes the rest part of the round. Accessibility is planned with the change, built with core's helpers, proven in tests, and reviewed like any other dimension.

The round

  1. Plan. Before writing code for a UI change, write its accessibility plan into the plan or the PR description (template below). A surface without a plan gets its roles, names and keys invented while coding, which is how the menus ended up with roles their structure contradicts.
  2. Build by the rules below. Pick the pattern from references/patterns.md.
  3. Prove it with the proofs that apply, from references/proving.md: a change to something a user operates (keys, focus, a control, a name, an announcement) ships a keyboard-only Playwright flow with accessible-name and state assertions; a color or size change proves itself with the axe scan in all three themes. A new plugin or editor adds its entry to tests/a11y/coverage.mjs, and the root test:tooling fails until it does.
  4. Review with the accessibility dimension of the handsontable-code-review skill (references/performance-a11y.md), and read the A11y / axe report check on the pushed PR: neutral means a finding needs action.

The accessibility plan

**Accessibility plan**
- Surface: <what appears, where it mounts: grid root, portal, dialog>
- Pattern: <APG pattern, from references/patterns.md> – roles, and their required parents and children
- Names: <the accessible name of every control, and its i18n phrase>
- Keyboard: <the keys, the shortcut context they register in, how a keyboard user enters and leaves>
- Focus: <the focus scope, where focus lands on open, where it returns on close>
- Announcements: <what changes without a focus move, and the message, polite or assertive>
- Theme: <tokens for color and size it touches; contrast and target size in all three themes>
- Proof: <the E2E flow, the scan page in tests/a11y/pages.mjs, the coverage entry>

Write "none" for a line that does not apply, never leave it out: "Announcements: none, every change moves focus" is a decision; a missing line is not.

Build rules

  • Native element first. An action is a <button type="button">, a field is an <input> or <textarea> with a name. A role goes only where no native element fits, and never a click handler on a bare <div>.
  • Roles and attributes through src/helpers/a11y.ts. Write them with setAttribute(element, [A11Y_MENU(), A11Y_LABEL(name)]) from src/helpers/dom/element. A missing attribute gets a helper there, not a string literal at the call site.
  • Required structure holds. Every role has the parents and children the ARIA spec requires: a menuitem sits in a menu, an option in a listbox, a row in a grid or rowgroup. When a widget role is drawn with table markup (the menus and lists are Handsontable grids), the table, tbody and tr in between carry role="presentation". One role per interactive element, and no interactive element inside another.
  • States only where the role supports them. aria-selected goes on gridcell, option, row or tab, never on menuitem; a checkable item is menuitemcheckbox with aria-checked.
  • Every control has a name, and the visible text is part of it. A name comes from visible text, a <label>, aria-labelledby or aria-label, and always from an i18n phrase (src/i18n/constants.ts, hot.getTranslatedPhrase()): never hard-coded English (the i18n-translations skill). Decorative icons carry aria-hidden="true".
  • ariaTags: false changes nothing but ARIA. Where a surface writes its ARIA only when hot.getSettings().ariaTags is on (the grid, the menus), a new attribute there follows the same check. No behavior may read an aria-* attribute or depend on one existing.
  • Every pointer action has a keyboard path (2.1.1), and a drag also has a single-pointer alternative that needs no dragging, such as a button, a menu item or an input (2.5.7); a keyboard path alone does not meet 2.5.7. Keys register in a shortcut context (hot.getShortcutManager().getContext('grid'), or the surface's own context, which its focus scope switches on), never as a raw keydown listener. A new shortcut goes into the keyboard shortcuts guide (docs/content/guides/navigation/keyboard-shortcuts/).
  • A surface that takes focus registers a focus scope (hot.getFocusScopeManager().registerScope(id, container, { shortcutsContextName, … }), as dialog and pagination do), puts focus inside on open, returns it to the cell or the opener on close, and unregisters in disablePlugin() and destroy().
  • A change without a focus move is announced through announce() from src/utils/a11yAnnouncer.ts. It defaults to 'assertive', so a status message passes 'polite' explicitly, as nested rows do for a row expanded or collapsed. assertive is for errors only, and one user action makes one announcement. Pagination, the sheets bar and row selection announce assertively today: a known gap, not the model to copy.
  • Colors and sizes come from theme tokens (the handsontable-css-dev skill), and each pair clears its ratio in main, horizon and classic, light and dark: text 4.5:1 (3:1 from 24px, or 18.66px bold), icons, borders and focus rings 3:1 (1.4.11), pointer targets 24 by 24 CSS pixels (2.5.8). A focused element is never fully hidden by a sticky overlay (2.4.11). Keep the forced-colors and prefers-reduced-motion blocks working.

Fixing a finding the scan reports

  1. Read a11y-findings.json (local run: tests/test-results/a11y/; CI: the a11y-axe-results artifact, gh run download <run-id> -n a11y-axe-results -D <dir>). needsAction has what the PR changed; issues[].locations has every place a known issue shows, with the steps per page in pages.
  2. Reproduce on the fixture (url plus steps), fix the cause in the product, and re-scan: npm --prefix tests run test:a11y after build:umd, build:styles.min and build:themes-css.min. Scope a run with -g " <page-id> on <theme>$" (the leading space and the $ keep sheets-bar from also matching data-provider-sheets-bar).
  3. Delete the entries the fix removed from tests/a11y/axe-baseline.json, and the issue with its last entry; lower nodes where only some elements were fixed. The scan names each as improved or stale.
  4. A finding the PR caused is fixed in the PR, never baselined to quiet the check. Only a finding that already existed and a new page exposes gets an entry, under an issue (tests/AGENTS.md, "Baselining a finding, and fixing one").

References

  • references/patterns.md: each Handsontable surface, its ARIA pattern, the helpers and the traps the scan has found.
  • references/proving.md: the Playwright assertions for keyboard, names, states, focus and announcements; the scan, its coverage map and what it cannot see.
  • tests/AGENTS.md, "A11y: the axe scan and its baseline": the scan's rules, the baseline and the reports.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Develop and modify the Handsontable Angular wrapper with guidance on component lifecycle, settings updates, and NgZone, which controls change detection. It also covers standalone examples, global configuration, and the build and test workflow.

中文简介正在准备中。当前显示英语简介。

  • Fix settings updates in the Angular wrapper
  • Review change detection around grid operations
  • Update examples to standalone components
handsontable/handsontable2.2万2026年10月22日 更新

Open local or public web pages in BrowserStack Live for checks on real mobile devices or desktop browsers. The skill prepares temporary access to a local server, launches the requested session, and shares its dashboard link.

中文简介正在准备中。当前显示英语简介。

  • Check a local page on an Android device
  • Open a page in Safari on an iPhone or iPad
  • Inspect behavior in a specific desktop browser
handsontable/handsontable2.2万2026年10月22日 更新

Prepare user-facing changelog entries for source code changes. The skill determines whether an entry is needed, classifies the change, writes a clear title, and uses the project CLI to create a JSON file tied to the pull request.

中文简介正在准备中。当前显示英语简介。

  • Add a changelog entry for a bug fix
  • Classify a new feature or behavior change
  • Explain a breaking change and its replacement
handsontable/handsontable2.2万2026年10月22日 更新

Explore relationships between functions and files using a prebuilt code graph, a map of code dependencies. Trace bugs, inspect callers and execution paths, and assess the impact of refactoring or proposed changes.

中文简介正在准备中。当前显示英语简介。

  • Explore callers and dependencies in unfamiliar code
  • Trace a bug across multiple files
  • Assess the impact of renaming or removing code
handsontable/handsontable2.2万2026年10月22日 更新

Work with Handsontable row and column positions by distinguishing source data, displayed order, and rendered cells. It guides index conversion and helps investigate misplaced data when sorting, filtering, hiding, or moving rows and columns.

中文简介正在准备中。当前显示英语简介。

  • Investigating misplaced rows or columns
  • Converting between source and displayed indexes
  • Combining filters with manual column movement
handsontable/handsontable2.2万2026年10月22日 更新

Create Handsontable documentation examples for JavaScript, TypeScript, React, Angular, and Vue. The skill explains source files, generated JavaScript, required imports and license settings, embedding examples in guides, and checking that each framework version displays correctly.

中文简介正在准备中。当前显示英语简介。

  • Adding a code example to a feature guide
  • Preparing examples for multiple frameworks
  • Generating JavaScript examples from TypeScript
handsontable/handsontable2.2万2026年10月22日 更新

查看 handsontable 的全部技能

报告此技能的问题