.claude/skills/klytos-accessibility/SKILL.md
Guide ensuring all page content in Klytos CMS meets WCAG 2.1 AA accessibility standards. Use when creating page content, building admin pages, testing HTML/CSS output, ensuring compliance with keyboard navigation, screen reader compatibility, color contrast, forms, tables, video captions, semantic HTML, ARIA attributes, and language settings. Essential for EU legal compliance (European Accessibility Act) and SEO.
npx skillsauth add joseconti/klytos klytos-accessibilityInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
All page content created via MCP MUST be accessible. Accessibility is not optional — it is a legal requirement in the EU (European Accessibility Act) and improves SEO.
Every image MUST have an alt attribute.
<!-- wp:image {"sizeSlug":"large"} -->
<figure class="wp-block-image size-large">
<img src="/assets/images/dashboard.jpg"
alt="Klytos admin dashboard showing 5 published pages and real-time analytics graph" />
</figure>
<!-- /wp:image -->
<!-- wp:image {"sizeSlug":"large"} -->
<figure class="wp-block-image size-large">
<img src="/assets/images/decorative-wave.svg" alt="" role="presentation" />
</figure>
<!-- /wp:image -->
Rules:
alt="" (empty, NOT omitted)Screen readers use headings to navigate. The hierarchy MUST be logical.
Rules:
<h1> per page<!-- CORRECT -->
<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">Our Services</h1>
<!-- /wp:heading -->
<!-- wp:heading -->
<h2 class="wp-block-heading">Web Development</h2>
<!-- /wp:heading -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Frontend Development</h3>
<!-- /wp:heading -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Backend Development</h3>
<!-- /wp:heading -->
<!-- wp:heading -->
<h2 class="wp-block-heading">Digital Marketing</h2>
<!-- /wp:heading -->
Rules:
<!-- CORRECT -->
<!-- wp:paragraph -->
<p>Read our <a href="/docs/getting-started/">complete getting started guide</a> to set up Klytos in 5 minutes.</p>
<!-- /wp:paragraph -->
<!-- For external links -->
<!-- wp:paragraph -->
<p>View the <a href="https://spec.modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">MCP Protocol specification <span class="screen-reader-text">(opens in new window)</span></a> for technical details.</p>
<!-- /wp:paragraph -->
<!-- WRONG -->
<p>To learn more, <a href="/docs/">click here</a>.</p>
<p><a href="/pricing/">Read more</a></p>
Text MUST have sufficient contrast against its background.
WCAG AA minimum contrast ratios:
Safe combinations with common backgrounds:
| Background | Safe Text Colors |
|-----------|-----------------|
| #ffffff (white) | #1e293b, #334155, #475569 (NOT #94a3b8) |
| #f1f5f9 (light gray) | #1e293b, #334155 (NOT #64748b) |
| #1e293b (dark) | #ffffff, #f1f5f9, #e2e8f0 (NOT #64748b) |
| #3b82f6 (blue) | #ffffff only |
When setting colors in blocks:
<!-- CORRECT: White text on dark background (contrast > 12:1) -->
<!-- wp:group {"style":{"color":{"background":"#1e293b","text":"#f1f5f9"}}} -->
<!-- WRONG: Gray text on light background (contrast ~2.5:1, FAILS) -->
<!-- wp:group {"style":{"color":{"background":"#f1f5f9","text":"#94a3b8"}}} -->
Every form field MUST have a visible label.
<!-- wp:html -->
<form action="/contact/" method="post">
<div class="form-group">
<label for="name">Full Name <span aria-label="required">*</span></label>
<input type="text" id="name" name="name" required
aria-describedby="name-help"
autocomplete="name" />
<span id="name-help" class="form-help">Enter your first and last name.</span>
</div>
<div class="form-group">
<label for="email">Email Address <span aria-label="required">*</span></label>
<input type="email" id="email" name="email" required
autocomplete="email"
aria-describedby="email-error" />
<span id="email-error" class="form-error" role="alert" hidden>Please enter a valid email address.</span>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" name="message" rows="5"></textarea>
</div>
<button type="submit">Send Message</button>
</form>
<!-- /wp:html -->
Rules:
<input> has a <label> with matching for/idrequired attribute AND visual indicatorrole="alert" for screen readersautocomplete attributes for common fieldsaria-describedby to link help text to inputs<!-- wp:table -->
<figure class="wp-block-table">
<table>
<caption>Comparison of CMS features and capabilities</caption>
<thead>
<tr>
<th scope="col">Feature</th>
<th scope="col">Klytos</th>
<th scope="col">WordPress</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Page Speed</th>
<td>100/100</td>
<td>60-80/100</td>
</tr>
<tr>
<th scope="row">AI Native</th>
<td>Yes (MCP)</td>
<td>No (plugin)</td>
</tr>
</tbody>
</table>
</figure>
<!-- /wp:table -->
Rules:
<caption> to describe the table's purpose<th scope="col"> for column headers<th scope="row"> for row headers<!-- wp:video -->
<figure class="wp-block-video">
<video controls>
<source src="/assets/video/demo.mp4" type="video/mp4" />
<track kind="captions" src="/assets/video/demo-captions-en.vtt" srclang="en" label="English" default />
<track kind="captions" src="/assets/video/demo-captions-es.vtt" srclang="es" label="Español" />
Your browser does not support the video element.
</video>
<figcaption class="wp-element-caption">Product demo showing how to create a page with AI. <a href="/assets/video/demo-transcript.txt">Read transcript</a>.</figcaption>
</figure>
<!-- /wp:video -->
Rules:
<track kind="captions">)controls attribute| Content | Correct Element | Wrong Element |
|---------|----------------|---------------|
| Navigation links | <nav> | <div> |
| Page header | <header> | <div> |
| Page footer | <footer> | <div> |
| Main content | <main> | <div> |
| Article/post | <article> | <div> |
| Section | <section> | <div> |
| Sidebar | <aside> | <div> |
| Emphasis | <strong>, <em> | <b>, <i> (for non-semantic bold/italic) |
| List | <ul>, <ol> | <div> with dashes |
| Quote | <blockquote> | <div class="quote"> |
| Time/date | <time datetime="..."> | plain text |
Rule: Use native HTML first. ARIA is a last resort.
<!-- Live region for dynamic content updates -->
<div aria-live="polite" aria-atomic="true" id="status-message">
Page saved successfully.
</div>
<!-- Custom toggle button -->
<button aria-expanded="false" aria-controls="menu-panel">
Menu
</button>
<div id="menu-panel" hidden>...</div>
<!-- Tab interface -->
<div role="tablist">
<button role="tab" aria-selected="true" aria-controls="tab-panel-1">Tab 1</button>
<button role="tab" aria-selected="false" aria-controls="tab-panel-2">Tab 2</button>
</div>
<div id="tab-panel-1" role="tabpanel">Content 1</div>
<div id="tab-panel-2" role="tabpanel" hidden>Content 2</div>
<!-- DON'T: <div role="button"> → DO: <button> -->
<!-- DON'T: <div role="navigation"> → DO: <nav> -->
<!-- DON'T: <span role="link"> → DO: <a href="..."> -->
<!-- DON'T: <div role="heading" aria-level="2"> → DO: <h2> -->
All interactive elements MUST be keyboard accessible.
Rules:
tabindex="0" if not natively focusableoutline: none without an alternative)<!-- Page language is set by Klytos via the lang field -->
<!-- For mixed-language content within a page: -->
<!-- wp:paragraph -->
<p>The French word <span lang="fr">bonjour</span> means hello.</p>
<!-- /wp:paragraph -->
alt text (or alt="" for decorative)<caption>, <th scope="col/row"><nav>, <main>, <header>, etc.)development
Guide for working with dates, times, and timezones in Klytos CMS. Use when formatting dates, converting timezones, scheduling actions with timestamps, displaying local time, working with UTC storage, building timezone selectors, or using any klytos_date/klytos_gmdate/klytos_timezone functions.
tools
Guide for developing and extending the Klytos web terminal. Use when modifying terminal commands, adding terminal commands from plugins, fixing terminal bugs, extending the pseudo-terminal, working with TerminalExecutor class, registering custom permissions, adding custom category labels, or managing terminal UI and security.
development
--- name: klytos-site-builder description: Guide for building a complete website from scratch with Klytos CMS. Use when creating a new site, configuring a site after installation, setting up design/content/SEO/navigation, or when the user pastes the post-install prompt. Covers 9 phases: discovery, design reference, global config, theme, content structure, templates, content creation, additional features, and launch. --- # Klytos Site Builder ## Overview The Site Builder is a conversational AI
development
Use when creating or editing page content in Klytos CMS. Ensures every page has proper SEO structure, HTML semantics, meta tags, structured data, accessibility for maximum search engine visibility. Apply when writing page titles, descriptions, content, headings, images, internal links, JSON-LD schema, or following the SEO checklist before publishing pages.