חיבור שקוף לאתר שלכם
תג script אחד. אין הרשמה, אין מפתח רישוי ואין בקשת רשת
מהתוסף. עובד בכל אתר, בכל טכנולוגיה.
ההתקנה המהירה
הדביקו את השורה הזו לפני תג </body> באתר שלכם.
<script src="https://cdn.jsdelivr.net/npm/@shakuf-widget/widget" defer></script>
מומלץ מאוד להוסיף גם את פרטי הנגישות של האתר. אם לא תוסיפו אותם, החלונית תציג למבקר הודעה שהאתר חסר הצהרת נגישות ורכז נגישות, משום שהדין הישראלי מחייב אתרים רבים בשניהם.
<script src="https://cdn.jsdelivr.net/npm/@shakuf-widget/widget"
data-statement-url="/accessibility"
data-coordinator-name="שם הרכז"
data-coordinator-phone="03-0000000"
data-coordinator-email="access@example.co.il"
defer></script>
פרומפט מוכן לעורך ה-AI שלכם
עובדים עם Claude Code, Cursor, Codex, Lovable, Base44, Windsurf או Bolt? העתיקו את הפרומפט והדביקו. הוא מנוסח כך שהעוזר יתקין נכון, לא יעשה יותר מדי, ולא יכתוב לכם טענות שיווקיות שאסור לפרסם.
פתיחת הפרומפט המלא
הוסף לאתר הזה את תוסף הנגישות "שקוף" (Shakuf).
לפני שאתה מתחיל, שאל אותי את הפרטים הבאים ואל תמשיך עד שתקבל תשובה:
• מהי הכתובת של עמוד הצהרת הנגישות באתר? (למשל /accessibility)
אם עדיין אין עמוד כזה, אמור לי זאת במפורש, כי הדין מחייב אתרים רבים לפרסם אותו.
• מה שמו המלא של רכז הנגישות?
• מה מספר הטלפון שלו?
• מה כתובת הדוא״ל שלו?
אל תמציא ערכים, אל תשתמש בערכי דוגמה ואל תשאיר סוגריים מרובעים בקוד.
אם אני עונה שאין לי רכז נגישות, אמור לי שהדין הישראלי מחייב אתרים רבים
למנות אחד ושכדאי לבדוק אם זה חל עליי, והתקן את התוסף בלי המאפיינים האלה
במקום להמציא אותם.
מה לעשות אחר כך:
1. הוסף את התג הבא ממש לפני </body> בתבנית הראשית של האתר, כך שייטען בכל עמוד,
כשהערכים מולאו מהתשובות שקיבלת:
<script src="https://cdn.jsdelivr.net/npm/@shakuf-widget/widget"
data-statement-url="[כתובת הצהרת הנגישות]"
data-coordinator-name="[שם רכז הנגישות]"
data-coordinator-phone="[טלפון]"
data-coordinator-email="[דוא״ל]"
defer></script>
2. אם זה פרויקט React / Next.js / Vue / Svelte, אל תוסיף את התג ל-JSX של
קומפוננטה בודדת. הוסף אותו ל-layout או ל-index.html הראשי, פעם אחת לכל
האפליקציה. ב-Next.js App Router השתמש ב-next/script עם
strategy="afterInteractive" בתוך app/layout.tsx.
3. ודא שלא נותרו סוגריים מרובעים בקוד שהוספת. כל ערך חייב להגיע מתשובה שלי.
4. אל תשנה שום דבר אחר באתר. אל תוסיף ARIA, אל תשנה כותרות, אל תוסיף alt
לתמונות ואל תשנה סמנטיקה. התוסף הזה נוגע בתצוגה בלבד, וכל שינוי אוטומטי
אחר עלול לפגוע דווקא במשתמשי טכנולוגיה מסייעת.
5. אם יש באתר Content-Security-Policy, ודא ש-script-src מתיר את
cdn.jsdelivr.net, וש-style-src כולל 'unsafe-inline', כי התוסף מוסיף
גיליונות סגנון משלו. אין צורך ב-connect-src, כי התוסף לא מבצע בקשות רשת.
חשוב מאוד, מה לא לכתוב:
אל תוסיף לאתר, לתיעוד או לקוד שום טקסט שטוען שהאתר "עומד בתקן", "נגיש לפי
ת״י 5568", "מוגן מתביעות" או "נגיש ב-100%". התוסף אינו הופך אתר לנגיש; הוא
כלי עזר לתצוגה בלבד. הנגשה אמיתית מחייבת תיקונים בקוד ובתוכן האתר, פרסום
הצהרת נגישות, מינוי רכז נגישות ובדיקה של מורשה נגישות.
בסיום, דווח לי בדיוק אילו קבצים שינית.
סעיף 4 אינו ניסוח מקרי. עוזרי קוד נוטים ״לעזור״ ולהוסיף תיקוני נגישות אוטומטיים, כמו הוספת ARIA, ניחוש טקסט חלופי או שינוי כותרות, וזו בדיוק הפעולה שמקלקלת אתרים למשתמשי קורא מסך.
התקנה לפי פלטפורמה
פתחו את עורך התבנית
לוח הבקרה ← עיצוב ← עורך קובצי ערכת עיצוב, ובחרו
footer.php.הדביקו לפני
</body>את תג ה-script מלמעלה.
שמרו ורעננו
הכפתור יופיע בפינת המסך.
עדיף להשתמש בערכת בת (child theme), אחרת עדכון התבנית ימחק את השינוי. לחלופין, כל תוסף מסוג ״Insert Headers and Footers״ יעשה את העבודה בלי לגעת בקוד.
Settings → Custom Code
בלוח הבקרה של Wix.
Add Custom Code
הדביקו את התג, בחרו All pages ומיקום Body - end.
Apply ואז Publish
הקוד פועל רק באתר המפורסם, לא בעורך.
Online Store → Themes
בתפריט Actions של התבנית הפעילה בחרו Edit code.
פתחו
theme.liquidוהדביקו את התג ממש לפני
</body>.Save
Project settings → Custom code
Footer code
הדביקו את התג בשדה Before </body> tag.
Save ואז Publish
דרך npm, או פשוט להשאיר את תג ה-script ב-index.html.
npm install @shakuf-widget/widget
// Mount once for the whole app, not per component.
import { useEffect } from 'react';
import { mount, unmount } from '@shakuf-widget/widget';
export default function App() {
useEffect(() => {
mount({
statementUrl: '/accessibility',
coordinatorName: 'שם הרכז',
coordinatorEmail: 'access@example.co.il',
});
return () => unmount();
}, []);
return /* ... */;
}
Next.js App Router: הוסיפו <Script src="…" strategy="afterInteractive" /> בתוך app/layout.tsx. אין צורך ב-'use client' עבור תג script.
הדביקו לפני </body> בכל עמוד:
<script src="https://cdn.jsdelivr.net/npm/@shakuf-widget/widget"
data-statement-url="/accessibility"
defer></script>
</body>
</html>
הגדרות
כל ההגדרות אופציונליות ונקראות מתג ה-script עצמו.
| attribute | default | תיאור |
|---|---|---|
| data-statement-url | — | קישור להצהרת הנגישות של האתר |
| data-coordinator-name | — | שם רכז הנגישות |
| data-coordinator-phone | — | טלפון רכז הנגישות |
| data-coordinator-email | — | דוא״ל רכז הנגישות |
| data-position | bottom-right | גם bottom-left · top-right · top-left. בנוסף ערכים לוגיים: bottom-start · bottom-end · top-start · top-end, שנצמדים לכיוון הקריאה ולכן מתהפכים יחד עם השפה, במקום להיות נעולים לפינה פיזית |
| data-offset | 20 | מרחק בפיקסלים משולי המסך, בין 0 ל-200 |
| data-accent | #0b5fff | צבע ראשי בפורמט hex של 3 או 6 ספרות, למשל #1e4fd8. צבע הטקסט נבחר אוטומטית, לבן או כהה. בחרו צבע שמגיע לניגודיות 4.5:1 לפחות מול אחד מהם |
| data-mount | body | סלקטור CSS של האלמנט שאליו התוסף נטען. נדרש באפליקציות שמסמנות inert על צאצאי body, ראו למטה |
| data-motion-exclude | — | סלקטור CSS של אלמנטים ש״עצירת אנימציות״ לא תיגע בהם, כולל הצאצאים שלהם. לאתרים שכתבו בעצמם מצב prefers-reduced-motion ורוצים שה-CSS שלהם ימשיך לנהל את האלמנטים האלה. ראו למטה, ורוב האתרים לא צריכים את זה |
| data-lang | מ-<html lang> | he או en. בלי הערך הזה התוסף עוקב אחר שפת העמוד, כולל שינוי שפה בלי טעינה מחדש. ברירת המחדל היא עברית |
| data-hidden | — | הכפתור מתחיל מוסתר. לאתרים ששומרים בעצמם העדפה של ״להסתיר את כפתור הנגישות״, כדי שהכפתור לא יהבהב בכל טעינה. data-hidden="false" משאיר אותו גלוי |
מתי צריך data-mount
כברירת מחדל התוסף נטען כילד ישיר של body. אפליקציות רבות
ב-React או ב-Vue מסמנות inert על כל ילדי body
כשמוצג מסך חוסם, כמו עדכון גרסה כפוי, ניתוק מהרשת או מודאל מסך מלא,
ומחריגות רק את אלמנט השורש שלהן. במצב כזה התוסף מושבת בדיוק ברגע שבו המבקר תקוע
מול מסך חוסם ואולי דווקא זקוק לניגודיות גבוהה או לעצירת אנימציות.
הפתרון הוא להפנות את התוסף אל תוך אותו שורש:
<script src="https://cdn.jsdelivr.net/npm/@shakuf-widget/widget"
data-mount="#root" defer></script>
אם הסלקטור שגוי או לא מתאים לאף אלמנט, התוסף נטען ל-body
כרגיל ורושם אזהרה ב-console. הוא לא ייעלם בגלל טעות הגדרה.
#shakuf-root עם transform, filter,
perspective, contain או will-change.
כל אחת מהן הופכת אותו ל-containing block עבור כפתור הפתיחה, שממוקם
fixed. התוצאה: הכפתור זז למקום לא צפוי, גולל יחד עם העמוד
ולפעמים יוצא מהמסך, בלי שגיאה ובלי סיבה גלויה.
position: relative רגיל בטוח ואינו עושה זאת.
מיקום בערימה. החל מ-0.3.1 התוסף כותב
position ו-z-index ישירות על אלמנט השורש שלו,
כדי ש-reset גורף באתר המארח (למשל * { z-index: auto }) לא
יבטל אותם בשקט ויסתיר את הכפתור מאחורי שכבות של האתר. אם אתם רוצים בכל
זאת לשלוט במיקום שלנו בערימה, למשל להעלות אותנו מעל שכבה משלכם או
להוריד אותנו מתחתיה, אפשר לגבור על כך במפורש:
#shakuf-root { position: relative !important; z-index: 10001 !important; }
data-mount בתוך אלמנט שיוצר
stacking context משלו, הכלל שלמעלה לא יעזור.
כשההסתרה מגיעה משכבה שיושבת מחוץ לאותו context, כל תת-העץ שלנו נצבע
ברמת אלמנט האב, ולכן שום z-index על
#shakuf-root אינו יכול לחלץ אותנו. נמדד מול overlay חיצוני:
גם הערך המקסימלי לא שינה דבר.
התיקון שייך לאלמנט שאליו הרכבתם ולא לנו. שתי דרכים עובדות: להעלות את יעד ההרכבה עצמו מעל אותה שכבה, או להעביר את השכבה אל תוכו. זו גם הסיבה שאין ולא יהיה
data-z-index: הוא נראה כמו
הפתרון ונכשל בשקט בדיוק במקרה הזה.
אנימציות: כשלאתר כבר יש מצב prefers-reduced-motion משלו
אין דרך שדף יגרום ל-prefers-reduced-motion: reduce להתקיים
מתוך קוד. זו הגדרה של מערכת ההפעלה של המבקר, ו-JavaScript לא יכול להדליק
אותה. לכן כשמבקר מפעיל אצלנו את ״עצירת אנימציות״, כל בלוק
@media (prefers-reduced-motion: reduce) שכתבתם נשאר כבוי,
כולל בלוקים שנכתבו בדיוק למצב הזה.
html[data-shakuf-motion="off"] הוא סלקטור ציבורי
ויציב. אנחנו כותבים את המאפיין הזה על תגית <html>
כשהמבקר מפעיל את הפקד ומסירים אותו כשהוא מכבה. מותר לכתוב עליו CSS משלכם,
והוא לא ישתנה בלי גרסה ראשית חדשה. הכלל שלנו נוגע רק ב-animation-*,
ב-transition-* וב-scroll-behavior, ולכן שאר
ההצהרות שלכם עוברות לצידו בלי התנגשות:
/* the still state, once for the OS setting */
@media (prefers-reduced-motion: reduce) {
.logos-track { animation: none; width: auto; flex-wrap: wrap; justify-content: center }
.logos-track > :nth-child(n+12) { display: none }
.logos-marquee { mask-image: none }
}
/* and once for the Shakuf control. animation is already handled for you. */
html[data-shakuf-motion="off"] .logos-track { width: auto; flex-wrap: wrap; justify-content: center }
html[data-shakuf-motion="off"] .logos-track > :nth-child(n+12) { display: none }
html[data-shakuf-motion="off"] .logos-marquee { mask-image: none }
שתי הרשימות זהות, ואם אתם עובדים עם Sass או PostCSS אפשר לגזור אותן
מ-mixin אחד. למה זה שווה את הטרחה: קרוסלת לוגואים היא לרוב מסילה ברוחב
אלפי פיקסלים עם כמה עותקים של הרשימה, בתוך חלון overflow: hidden
עם דהייה בקצוות, וכל המנגנון הזה קיים רק כדי שהלולאה תיראה רציפה. עצירה
של האנימציה לבדה משאירה כמה לוגואים שנמוגים לתוך הדהייה, וזה נראה כמו
קרוסלה תקועה ולא כמו פריסה מכוונת. זה בדיוק המצב שה-@media
שלכם נכתב כדי למנוע.
וכשה-CSS שלכם צריך לנהל את האנימציה עצמה.
ההצהרות שלנו הן !important, ולכן המתכון שלמעלה עובד כל עוד
מצב הרגיעה שלכם לא נלחם עלינו על אותן תכונות. אם הוא כן, למשל אם אתם
רוצים להאט אנימציה במקום לעצור אותה או להשאיר מחוון טעינה מסתובב, אפשר
לומר לתוסף לא לגעת באלמנטים האלה מלכתחילה:
<script src="https://cdn.jsdelivr.net/npm/@shakuf-widget/widget"
data-motion-exclude=".logos-track, .status-spinner"
defer></script>
ההחרגה כוללת את הצאצאים. מסילת קרוסלה והפריטים שבתוכה הם יחידה אחת, והחרגה שנעצרת באלמנט עצמו הייתה משאירה את הילדים תחת הכלל שלנו ומפספסת את הנקודה. סלקטור לא חוקי, או ערך שמכיל סוגריים מסולסלים, נדחה עם אזהרה ב-console והתוסף מתנהג כאילו לא הוגדר כלום. הערך נכתב לתוך גיליון הסגנון שאנחנו מזריקים, ולכן הוא נבדק לפני.
html[data-shakuf-motion="off"]. השתמשו בזה רק כשהמתכון שלמעלה
באמת לא מספיק.
שליטה מתוך קוד
התקנה דרך תג script מגדירה את window.shakuf.
כל הפעולות סינכרוניות ואינן מבצעות בקשות רשת:
| method | תיאור |
|---|---|
| open() · close() · toggle() | פתיחה וסגירה של החלונית |
| hide() · show() | הסתרה והצגה של כפתור הפתיחה. ההעדפות שהמבקר כבר הפעיל נשארות פעילות |
| hidden | האם הכפתור מוסתר כרגע |
| reset() | איפוס כל ההגדרות, כמו הכפתור בחלונית |
| getPrefs() | ההעדפות הנוכחיות של המבקר, כמזהה־פיצ׳ר → רמה. מוחזר עותק |
| setPrefs(prefs) | שחזור פרופיל שמור. מחליף את כל ההעדפות ומחיל את התוצאה: מה שלא נכלל מכובה. מזהים לא מוכרים ורמות מחוץ לטווח נזרקים. לשינוי הגדרה בודדת: פרישׂה מעל getPrefs() |
| setLanguage(lang) | he או en. מקבע את השפה ומפסיק לעקוב אחר <html lang> |
| lang | השפה הפעילה |
| destroy() | הסרה מלאה של התוסף וביטול כל מה שהחיל |
בהתקנה דרך npm אין window.shakuf. mount()
מחזיר את המופע עצמו, עם אותן שיטות. שם גם אפשר להעביר
mount({ initialPrefs }): העדפות פתיחה למבקר שאין לו עדיין
שמורות אצלנו, לאתרים שמחליפים תוסף נגישות אחר ולא רוצים לאפס בשקט את מי
שכבר הגדיר טקסט גדול או ניגודיות גבוהה. זהו זרע ולא דריסה: הוא
חל רק כשהאחסון שלנו ריק, ולכן אינו דורס בחירות שהמבקר עשה אחר כך.
getPrefs()
בפרופיל משתמש, זו החלטה שלכם ותחת מדיניות הפרטיות שלכם. שווה לדעת
שערכים כמו ״ניגודיות גבוהה״ או ״גופן ידידותי לדיסלקציה״ ניתנים לפירוש
כמסקנה על מוגבלות, כלומר מידע רגיש. זו הסיבה שאנחנו לא נוגעים בהם.
כדי להחיל העדפה שמורה כבר בטעינה, האזינו לאירוע
shakuf:ready על document. האירוע נורה בתוך
הטעינה, לפני ש-window.shakuf קיים, ולכן המופע מגיע בתוך
event.detail:
document.addEventListener('shakuf:ready', function (e) {
if (userPrefersHidden) e.detail.hide();
});
אם אתם כבר יודעים מראש שהכפתור צריך להיות מוסתר, עדיף
data-hidden, שחוסך את ההבהוב.
פרטים טכניים
מה התוסף עושה לעמוד
מוסיף ל-<body> שני אלמנטים: התוסף עצמו, בתוך
Shadow DOM כך שהעיצוב שלו לא יכול לדלוף לאתר ולא יכול
להישבר ממנו, ואזור הכרזות סמוי לקוראי מסך. ל-<head>
הוא מוסיף גיליון סגנון אחד. ההתאמות מיושמות דרך מאפייני
data-shakuf-* על תגית <html>.
התוסף אינו משנה ARIA, roles או סמנטיקה, ואינו מתערב בטכנולוגיה מסייעת של המבקר. כל שינוי הפיך לחלוטין בלחיצה על ״איפוס״.
בקשות רשת ופרטיות
אפס. אין שרת, אין חשבון, אין מפתח רישוי, אין טלמטריה. ההעדפות נשמרות
ב-localStorage על הדומיין שלכם בלבד. משמעות מעשית: התוסף
עצמו אינו יוצר יחסי מעבד-מידע ואינו מוסיף דבר לבאנר הקוקיז.
אבל הקובץ עצמו מגיע מ-jsDelivr. התוסף לא מבצע
בקשות, ובכל זאת הדפדפן של המבקר פונה ל-cdn.jsdelivr.net
כדי להוריד את הסקריפט, ובפנייה הזו נחשפות כתובת ה-IP שלו ומחרוזת
הדפדפן. זה נכון לכל ספרייה שנטענת מ-CDN, אבל שווה לומר אותו במפורש:
אם מדיניות הפרטיות שלכם מונה צדדים שלישיים בשמם, jsDelivr
שייך לרשימה הזו. אתרים שמעדיפים לא להוסיף צד שלישי יכולים
לארח את הקובץ אצלם, ואז אין פנייה חיצונית כלל. ראו
אירוח עצמי למטה.
Content-Security-Policy
אם באתר יש CSP, צריך להתיר את מקור הסקריפט וגם סגנונות מוטמעים. התוסף יוצר שני גיליונות סגנון משלו, אחד בתוך ה-Shadow DOM ואחד ב-<head>, ו-style-src חל על שניהם. בלי זה החלונית מופיעה בלי עיצוב וההתאמות לא חלות.
script-src 'self' https://cdn.jsdelivr.net;
style-src 'self' 'unsafe-inline';
אין צורך ב-connect-src, כי התוסף לא מבצע בקשות.
אם אתם מארחים את הקובץ אצלכם, script-src 'self' מספיק
ואפשר להשמיט את jsDelivr לגמרי. style-src נשאר כמו למעלה. ראו אירוח עצמי.
גודל, ביצועים ונעיצת גרסה
כ-15KB דחוס (gzip), ללא תלויות בזמן ריצה. נטען עם defer
ולכן אינו חוסם את הצגת העמוד. חלונית ההגדרות נבנית רק כשהמבקר פותח
אותה בפועל.
הכתובת בלי מספר גרסה מושכת תמיד את האחרונה, וזו ההמלצה. כך תיקונים מגיעים אליכם בלי לגעת בקוד, וזה משנה: בגרסאות 0.1.0–0.2.0 ארבע הגדרות צבע לא עשו כלום כשהופעלו לבדן, בגרסאות שלפני 0.3.1 כפתור הפתיחה היה עלול להיעלם מאחורי שכבות של האתר, ובגרסאות שלפני 0.4.0 ״עצירת אנימציות״ הייתה עלולה להעלים תוכן שמופיע דרך אנימציה במקום רק לעצור אותו. מי שנעץ גרסה נשאר עם התקלות עד שיעדכן ידנית.
כמה זמן לוקח לתיקון להגיע: הקובץ נשמר במטמון הדפדפן של המבקר לשבוע, ובשרתי ה-CDN לכ-12 שעות. כלומר מבקר שכבר טען את הסקריפט יקבל גרסה מתוקנת תוך ימים ולא מיידית. אנחנו מנקים את מטמון ה-CDN בכל שחרור, כך שהחלק שבשליטתנו קורה מיד.
נעיצת גרסה נכונה אם אתם צריכים שליטה בשינויים:
סביבות מבוקרות, בדיקות רגרסיה, או מדיניות אבטחה שדורשת
integrity (אפשרי רק על כתובת עם גרסה מדויקת, כי התוכן
חייב להיות קבוע). המחיר: אתם אחראים לעדכן, כולל
תיקוני נגישות. עקבו אחרי היומן.
<script src="https://cdn.jsdelivr.net/npm/@shakuf-widget/widget@0.3.1" defer></script>
אפשר גם לנעוץ טווח: @0.3 מקבל תיקוני תיקון בלבד ולא
פיצ׳רים חדשים. פשרה סבירה בין השניים.
אירוח עצמי
שתי סיבות טובות לארח את הקובץ אצלכם: מדיניות פרטיות שלא רוצה להוסיף
צד שלישי, ומדיניות אבטחה שדורשת integrity. שימו לב
שהשנייה מחייבת גם נעיצת גרסה, כי חישוב ה-hash אפשרי רק על תוכן קבוע,
ולכן היא סותרת את ההמלצה שלמעלה. זו החלטה לגיטימית, ובלבד שתדעו
שאתם לוקחים על עצמכם את העדכונים.
curl -o assets/shakuf.js \
https://cdn.jsdelivr.net/npm/@shakuf-widget/widget@0.3.1
<script src="/assets/shakuf.js" defer></script>
ה-script-src הופך ל-'self' ואפשר להוריד את
cdn.jsdelivr.net ממנו. אין שינוי אחר בהתנהגות: כל
ההגדרות נקראות מתג ה-script בדיוק כמו קודם.
למי שנשאר על ה-CDN וצריך integrity, אפשר לחשב את
ה-hash מהגרסה הנעוצה:
curl -sL https://cdn.jsdelivr.net/npm/@shakuf-widget/widget@0.3.1 \
| openssl dgst -sha384 -binary | openssl base64 -A
ואז integrity="sha384-התוצאה" יחד עם
crossorigin="anonymous" על התג. עדכון גרסה מחייב חישוב
מחדש, אחרת הדפדפן יסרב לטעון את הקובץ והתוסף פשוט לא יופיע.
מה עוד צריך כדי באמת להיות נגישים
התוסף הוא הצעד הקטן. אלה הדברים שהוא לא עושה, ושהדין מחייב בהם אתרים רבים:
תיקון האתר עצמו
ניווט מקלדת מלא, טקסט חלופי לתמונות, תוויות לשדות טופס, ניגודיות מספקת, מבנה כותרות תקין, לפי ת״י 5568 (WCAG 2.1 AA).
פרסום הצהרת נגישות
עמוד ייעודי ומתוארך שמפרט את מצב הנגישות באתר, את ההתאמות שבוצעו ואת המגבלות הידועות.
מינוי רכז נגישות
כשהחובה חלה על האתר: אדם בשם ובפרטי קשר, לא כתובת כללית.
ערוץ פניות שעובד
ושמישהו באמת עונה בו.
בדיקה של מורשה נגישות
בדיקה חיצונית מקצועית. שקוף אינו תחליף לה, ואיננו מורשי נגישות.