HandsontableのAngular向けラッパーを開発・修正するために、設定更新や破棄処理、変更検知の負荷を抑える実装、サンプル作成とテストの規約を案内するスキル。
- Angularの設定反映を修正したいとき
- 表操作に伴う変更検知の見直し
- サンプルをStandaloneへ更新したいとき
Handsontableの画面変更に合わせて、キーボード操作や読み上げ、配色を設計・検証し、アクセシビリティの問題修正まで進めるスキル。
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.
Handsontableの画面や操作を変更するときに、アクセシビリティの計画から実装、検証、指摘の修正までを支援します。WCAG 2.2のレベルA・AAを基準に、操作部品の名前、キーボード操作、フォーカスの移動先、スクリーンリーダーへの通知を整理します。ARIAという支援技術向けの役割・属性には、既存のヘルパーを使う方針です。
メニューやダイアログ、プラグインを追加するときや、テーマの色・サイズを変えるときに向いています。操作の変更はキーボードだけで進めるPlaywrightテストで、配色やサイズの変更は3つのテーマでのaxeスキャンで検証します。検出済みの問題を再現し、修正後に記録を更新する手順も扱います。
Handsontableの内部ヘルパーやテスト構成を前提とします。axeの再実行には指定のビルドが必要です。自動スキャンで確認できるのは基準の一部であり、操作テストも併用します。
この紹介文は、公開されている SKILL.md をもとに AI(OpenAI Codex)が作成しました。正確な仕様は下の原文を確認してください。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
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.
references/patterns.md.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.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.**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.
<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>.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.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.aria-selected goes on gridcell, option,
row or tab, never on menuitem; a checkable item is menuitemcheckbox with aria-checked.<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.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/).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().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.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.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.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).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.tests/AGENTS.md,
"Baselining a finding, and fixing one").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.まだレビューはありません。使ってみた感想をお寄せください。
ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。
まだコメントはありません。最初のコメントを書いてみませんか。
HandsontableのAngular向けラッパーを開発・修正するために、設定更新や破棄処理、変更検知の負荷を抑える実装、サンプル作成とテストの規約を案内するスキル。
ローカル開発中のページや公開URLをBrowserStackで開き、Android・iOSの実機や指定したデスクトップブラウザで動作確認する準備を支援します。
ソースコードの変更に必要な変更履歴を判断し、利用者に伝わる説明と変更区分を整え、PR番号に対応したJSON形式の履歴ファイルの作成を支援します。
コードの呼び出し関係や依存関係を、構築済みのグラフから調べます。複数ファイルにまたがる不具合調査、変更の影響確認、リファクタリングやレビューを支援します。
Handsontableの行・列の位置を表す3種類のインデックスを使い分け、並べ替えや非表示、列移動に伴う位置ずれの調査と修正を支援するスキル。
Handsontableのドキュメントに載せるコード例を作成します。TypeScriptを元にJavaScript版を生成し、React・Angular・Vue向けの例も整えます。