print — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited print (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Canonical source:examples/PRINT_ACCESSIBILITY_BEST_PRACTICES.mdinmgifford/ACCESSIBILITY.mdThis skill is derived from that file. When in doubt, the example is authoritative.
Apply these rules when implementing or reviewing print stylesheets. Only load this skill if the project has print CSS in scope.
Printing is an accessibility feature. Users with cognitive disabilities may find printed material easier to process; users with low vision may enlarge it; users without reliable internet need offline copies. Print styles must keep content useful, readable, and free of colour-only meaning. Print CSS should be a progressive enhancement — write screen styles first, then layer @media print on top, and confirm the content is still comprehensible in the browser's default print mode before adding custom styles.
| Level | Meaning |
|---|---|
| Critical | Print output is completely unusable (blank page, navigation only) |
| Serious | Content lost or meaning broken due to colour stripping; tables unreadable |
| Moderate | Orphaned headings; link URLs not revealed; layout breaks across pages |
| Minor | Typography not print-optimised; missing QR alternative to long URLs |
/* Preferred: single inline block */
@media print {
/* all print styles here */
}
/* Alternative: separate file */
/* <link rel="stylesheet" href="print.css" media="print"> */A site with no @media print block at all may print navigation, cookie banners, and sidebars while omitting content — Critical. Prefer the inline approach to keep styles co-located and reduce HTTP requests.
@media print {
nav, header nav, footer, aside, .sidebar,
.cookie-banner, .skip-link, .ad, .social-share,
.print-hide, video, audio, iframe,
[role="complementary"],
form button[type="submit"]:not(.print-show) {
display: none !important;
}
}Utility classes:
.print-hide — elements to suppress in print only (navigation buttons,interactive controls)
.print-show — elements hidden on screen but needed in print (e.g., postaladdress, expanded content, supplementary notes)
When browsers print with backgrounds off (the default in most browsers), any information conveyed via background colour is lost. This is Serious for data tables or status indicators that use colour alone. Ink colour rendering also varies significantly between printers — always test print output in grayscale mode.
@media print {
.status-error::after { content: " [Error]"; }
.status-success::after { content: " [OK]"; }
.status-warning::after { content: " [Warning]"; }
/* Remove colour-coded highlights; use borders instead */
.status-warning {
border: 2pt solid #000;
color: #000;
background: none;
}
}For table cells with coloured backgrounds, ensure the cell already contains a text label — do not rely on background colour to convey meaning. Force-print backgrounds only when the SVG/image requires it:
@media print {
.required-background {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}Grayscale testing checklist:
Printed links are dead without the URL. Missing URL expansion is Serious for content-heavy pages where links carry information.
@media print {
a[href]::after {
content: " (" attr(href) ")";
font-size: 0.875em;
color: #333;
word-break: break-all;
}
/* Suppress non-informative and internal links */
a[href^="#"]::after,
a[href^="javascript:"]::after,
a[href].no-print-url::after {
content: "";
}
}For pages with many long URLs, consider providing QR codes as an alternative. A QR code adjacent to key links is printable, scannable, and avoids long URL wrapping issues:
<!-- Print-only QR code linking to the page -->
<img src="/qr/this-page.png"
alt="QR code linking to this page online"
class="print-show">@media print {
body {
font-family: Georgia, "Times New Roman", Times, serif;
font-size: 12pt;
line-height: 1.5;
color: #000;
background: #fff;
}
h1 { font-size: 22pt; }
h2 { font-size: 18pt; }
h3 { font-size: 14pt; }
p, li, td, th {
font-size: 11pt;
orphans: 3; /* Minimum lines at bottom of page */
widows: 3; /* Minimum lines at top of next page */
}
blockquote {
border-left: 3pt solid #555;
padding-left: 12pt;
margin-left: 0;
font-style: italic;
}
}Use serif typefaces for body text — they are conventionally more readable in print. Use pt units for font sizes in print stylesheets. Set orphans and widows to prevent isolated single lines.
@page {
margin: 2cm; /* Minimum for most printers; leave more for bound documents */
}
@page :first {
margin-top: 3cm;
}
@page :left { margin-left: 3cm; }
@page :right { margin-right: 3cm; }Avoid specifying size: A4 unless the document is specifically designed for A4. US readers use Letter (8.5×11in). Omit size and let the printer/user decide, or document the choice explicitly.
Running headers/footers can be added via @page margin boxes:
@page {
@top-center {
content: "Document Title — " string(doc-title);
font-size: 9pt;
color: #555;
}
@bottom-right {
content: "Page " counter(page) " of " counter(pages);
font-size: 9pt;
color: #555;
}
}@page margin boxes are primarily supported in paged-media renderers (Prince, WeasyPrint, Paged.js), not all browsers. For cross-browser page numbers, use JavaScript or server-side PDF generation.
@media print {
h1, h2, h3 {
page-break-after: avoid;
break-after: avoid; /* Modern equivalent */
}
figure, img, table, pre, blockquote {
page-break-inside: avoid;
break-inside: avoid;
}
.page-break-before {
page-break-before: always;
break-before: always;
}
}Use both page-break-* (legacy) and break-* (modern) properties for broad browser support.
@media print {
table { border-collapse: collapse; width: 100%; }
th, td {
border: 1pt solid #333;
padding: 6pt;
text-align: left;
}
thead { display: table-header-group; } /* Repeat header on each page */
tr { page-break-inside: avoid; }
}thead { display: table-header-group } is the most important table rule for accessibility — without it, column headers only appear on the first page, making multi-page tables unreadable. Missing this is Serious for data-heavy tables.
@media print {
img, svg {
max-width: 100% !important;
height: auto;
page-break-inside: avoid;
break-inside: avoid;
}
}Browsers typically suppress CSS background images in print output by default. Ensure meaningful images use <img> elements with descriptive alt text rather than CSS backgrounds — do not rely on alt text appearing only for broken images.
Offering a dedicated "Print this page" button improves discoverability:
<button type="button" class="print-trigger print-hide" onclick="window.print()">
Print this page
</button>type="button" to prevent accidental form submission.print-hide)Browser testing:
printCtrl+P / Cmd+P for native print preview across paper sizes and orientationsAutomated testing: run axe-core against the print-rendered DOM by activating print media emulation before scanning. Lighthouse does not directly test print styles, but screen-version violations also affect print output.
@media print.status-error::after etc.)::after (fragment and javascript: links suppressed)pt units, 12pt base size, orphans/widows set@page margins defined (at least 2cm); size omitted or documentedbreak-after: avoidbreak-inside: avoidthead { display: table-header-group } for multi-page tablesalt text when backgrounds are suppressedStandards horizon: These rules target WCAG 2.2 AA. No significant changes anticipated for print accessibility in WCAG 3.0. Monitor: <https://www.w3.org/TR/wcag-3.0/>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.