@bauer-group/accessibility-widget 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +259 -0
  3. package/dist/accessibility-widget-core.min.js +6 -0
  4. package/dist/accessibility-widget-core.min.js.map +7 -0
  5. package/dist/accessibility-widget-loader.min.js +14 -0
  6. package/dist/accessibility-widget-loader.min.js.map +7 -0
  7. package/dist/accessibility-widget.min.css +7 -0
  8. package/dist/accessibility-widget.min.css.map +7 -0
  9. package/dist/config.d.ts +33 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/core.d.ts +31 -0
  12. package/dist/core.d.ts.map +1 -0
  13. package/dist/features/apply.d.ts +3 -0
  14. package/dist/features/apply.d.ts.map +1 -0
  15. package/dist/features/profile.d.ts +3 -0
  16. package/dist/features/profile.d.ts.map +1 -0
  17. package/dist/features/reading-guide.d.ts +2 -0
  18. package/dist/features/reading-guide.d.ts.map +1 -0
  19. package/dist/features/reading-mask.d.ts +2 -0
  20. package/dist/features/reading-mask.d.ts.map +1 -0
  21. package/dist/features/structure-nav.d.ts +2 -0
  22. package/dist/features/structure-nav.d.ts.map +1 -0
  23. package/dist/features/tts.d.ts +7 -0
  24. package/dist/features/tts.d.ts.map +1 -0
  25. package/dist/focus-trap.d.ts +6 -0
  26. package/dist/focus-trap.d.ts.map +1 -0
  27. package/dist/i18n/ar.d.ts +3 -0
  28. package/dist/i18n/ar.d.ts.map +1 -0
  29. package/dist/i18n/bn.d.ts +3 -0
  30. package/dist/i18n/bn.d.ts.map +1 -0
  31. package/dist/i18n/cs.d.ts +3 -0
  32. package/dist/i18n/cs.d.ts.map +1 -0
  33. package/dist/i18n/de.d.ts +3 -0
  34. package/dist/i18n/de.d.ts.map +1 -0
  35. package/dist/i18n/el.d.ts +3 -0
  36. package/dist/i18n/el.d.ts.map +1 -0
  37. package/dist/i18n/en.d.ts +3 -0
  38. package/dist/i18n/en.d.ts.map +1 -0
  39. package/dist/i18n/es.d.ts +3 -0
  40. package/dist/i18n/es.d.ts.map +1 -0
  41. package/dist/i18n/fa.d.ts +3 -0
  42. package/dist/i18n/fa.d.ts.map +1 -0
  43. package/dist/i18n/fr.d.ts +3 -0
  44. package/dist/i18n/fr.d.ts.map +1 -0
  45. package/dist/i18n/he.d.ts +3 -0
  46. package/dist/i18n/he.d.ts.map +1 -0
  47. package/dist/i18n/hi.d.ts +3 -0
  48. package/dist/i18n/hi.d.ts.map +1 -0
  49. package/dist/i18n/hu.d.ts +3 -0
  50. package/dist/i18n/hu.d.ts.map +1 -0
  51. package/dist/i18n/id.d.ts +3 -0
  52. package/dist/i18n/id.d.ts.map +1 -0
  53. package/dist/i18n/index.d.ts +6 -0
  54. package/dist/i18n/index.d.ts.map +1 -0
  55. package/dist/i18n/it.d.ts +3 -0
  56. package/dist/i18n/it.d.ts.map +1 -0
  57. package/dist/i18n/ja.d.ts +3 -0
  58. package/dist/i18n/ja.d.ts.map +1 -0
  59. package/dist/i18n/ko.d.ts +3 -0
  60. package/dist/i18n/ko.d.ts.map +1 -0
  61. package/dist/i18n/nl.d.ts +3 -0
  62. package/dist/i18n/nl.d.ts.map +1 -0
  63. package/dist/i18n/pl.d.ts +3 -0
  64. package/dist/i18n/pl.d.ts.map +1 -0
  65. package/dist/i18n/pt.d.ts +3 -0
  66. package/dist/i18n/pt.d.ts.map +1 -0
  67. package/dist/i18n/ro.d.ts +3 -0
  68. package/dist/i18n/ro.d.ts.map +1 -0
  69. package/dist/i18n/ru.d.ts +3 -0
  70. package/dist/i18n/ru.d.ts.map +1 -0
  71. package/dist/i18n/sv.d.ts +3 -0
  72. package/dist/i18n/sv.d.ts.map +1 -0
  73. package/dist/i18n/th.d.ts +3 -0
  74. package/dist/i18n/th.d.ts.map +1 -0
  75. package/dist/i18n/tr.d.ts +3 -0
  76. package/dist/i18n/tr.d.ts.map +1 -0
  77. package/dist/i18n/types.d.ts +44 -0
  78. package/dist/i18n/types.d.ts.map +1 -0
  79. package/dist/i18n/uk.d.ts +3 -0
  80. package/dist/i18n/uk.d.ts.map +1 -0
  81. package/dist/i18n/ur.d.ts +3 -0
  82. package/dist/i18n/ur.d.ts.map +1 -0
  83. package/dist/i18n/vi.d.ts +3 -0
  84. package/dist/i18n/vi.d.ts.map +1 -0
  85. package/dist/i18n/zh.d.ts +3 -0
  86. package/dist/i18n/zh.d.ts.map +1 -0
  87. package/dist/index.d.ts +10 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/integrity.json +9 -0
  90. package/dist/integrity.txt +12 -0
  91. package/dist/loader.d.ts +2 -0
  92. package/dist/loader.d.ts.map +1 -0
  93. package/dist/panel/drag.d.ts +34 -0
  94. package/dist/panel/drag.d.ts.map +1 -0
  95. package/dist/panel/panel.d.ts +23 -0
  96. package/dist/panel/panel.d.ts.map +1 -0
  97. package/dist/state.d.ts +18 -0
  98. package/dist/state.d.ts.map +1 -0
  99. package/dist/styles/critical.d.ts +16 -0
  100. package/dist/styles/critical.d.ts.map +1 -0
  101. package/dist/types/index.d.ts +3 -0
  102. package/dist/types/index.d.ts.map +1 -0
  103. package/dist/types/locale.d.ts +11 -0
  104. package/dist/types/locale.d.ts.map +1 -0
  105. package/dist/types/widget.d.ts +207 -0
  106. package/dist/types/widget.d.ts.map +1 -0
  107. package/dist/util/debug.d.ts +8 -0
  108. package/dist/util/debug.d.ts.map +1 -0
  109. package/dist/util/dom.d.ts +19 -0
  110. package/dist/util/dom.d.ts.map +1 -0
  111. package/dist/util/events.d.ts +38 -0
  112. package/dist/util/events.d.ts.map +1 -0
  113. package/dist/util/feature-icons.d.ts +33 -0
  114. package/dist/util/feature-icons.d.ts.map +1 -0
  115. package/dist/util/language-names.d.ts +12 -0
  116. package/dist/util/language-names.d.ts.map +1 -0
  117. package/dist/util/svg.d.ts +38 -0
  118. package/dist/util/svg.d.ts.map +1 -0
  119. package/package.json +67 -0
  120. package/src/config.ts +213 -0
  121. package/src/core.ts +173 -0
  122. package/src/features/apply.ts +37 -0
  123. package/src/features/profile.ts +18 -0
  124. package/src/features/reading-guide.ts +25 -0
  125. package/src/features/reading-mask.ts +25 -0
  126. package/src/features/structure-nav.ts +43 -0
  127. package/src/features/tts.ts +73 -0
  128. package/src/focus-trap.ts +35 -0
  129. package/src/globals.d.ts +63 -0
  130. package/src/i18n/ar.ts +48 -0
  131. package/src/i18n/bn.ts +48 -0
  132. package/src/i18n/cs.ts +48 -0
  133. package/src/i18n/de.ts +65 -0
  134. package/src/i18n/el.ts +48 -0
  135. package/src/i18n/en.ts +65 -0
  136. package/src/i18n/es.ts +48 -0
  137. package/src/i18n/fa.ts +48 -0
  138. package/src/i18n/fr.ts +48 -0
  139. package/src/i18n/he.ts +48 -0
  140. package/src/i18n/hi.ts +48 -0
  141. package/src/i18n/hu.ts +48 -0
  142. package/src/i18n/id.ts +48 -0
  143. package/src/i18n/index.ts +70 -0
  144. package/src/i18n/it.ts +48 -0
  145. package/src/i18n/ja.ts +48 -0
  146. package/src/i18n/ko.ts +48 -0
  147. package/src/i18n/nl.ts +48 -0
  148. package/src/i18n/pl.ts +48 -0
  149. package/src/i18n/pt.ts +48 -0
  150. package/src/i18n/ro.ts +48 -0
  151. package/src/i18n/ru.ts +48 -0
  152. package/src/i18n/sv.ts +48 -0
  153. package/src/i18n/th.ts +48 -0
  154. package/src/i18n/tr.ts +48 -0
  155. package/src/i18n/types.ts +36 -0
  156. package/src/i18n/uk.ts +48 -0
  157. package/src/i18n/ur.ts +48 -0
  158. package/src/i18n/vi.ts +48 -0
  159. package/src/i18n/zh.ts +48 -0
  160. package/src/index.ts +9 -0
  161. package/src/loader.ts +533 -0
  162. package/src/panel/drag.ts +210 -0
  163. package/src/panel/panel.ts +617 -0
  164. package/src/state.ts +91 -0
  165. package/src/styles/critical.ts +56 -0
  166. package/src/styles/widget.css +739 -0
  167. package/src/types/index.ts +2 -0
  168. package/src/types/locale.ts +55 -0
  169. package/src/types/widget.ts +300 -0
  170. package/src/util/debug.ts +12 -0
  171. package/src/util/dom.ts +68 -0
  172. package/src/util/events.ts +54 -0
  173. package/src/util/feature-icons.ts +163 -0
  174. package/src/util/language-names.ts +41 -0
  175. package/src/util/svg.ts +93 -0
@@ -0,0 +1,73 @@
1
+ import type { Locale } from '../types/index.js';
2
+
3
+ const LOCALE_TO_BCP47: Record<Locale, string> = {
4
+ de: 'de-DE',
5
+ en: 'en-US',
6
+ fr: 'fr-FR',
7
+ es: 'es-ES',
8
+ it: 'it-IT',
9
+ pl: 'pl-PL',
10
+ tr: 'tr-TR',
11
+ ar: 'ar-SA',
12
+ zh: 'zh-CN',
13
+ hi: 'hi-IN',
14
+ pt: 'pt-PT',
15
+ bn: 'bn-BD',
16
+ ru: 'ru-RU',
17
+ ja: 'ja-JP',
18
+ ko: 'ko-KR',
19
+ vi: 'vi-VN',
20
+ fa: 'fa-IR',
21
+ ur: 'ur-PK',
22
+ th: 'th-TH',
23
+ id: 'id-ID',
24
+ he: 'he-IL',
25
+ nl: 'nl-NL',
26
+ sv: 'sv-SE',
27
+ cs: 'cs-CZ',
28
+ el: 'el-GR',
29
+ hu: 'hu-HU',
30
+ ro: 'ro-RO',
31
+ uk: 'uk-UA',
32
+ };
33
+
34
+ let active = false;
35
+ let utter: SpeechSynthesisUtterance | null = null;
36
+
37
+ export function ttsSupported(): boolean {
38
+ return typeof window !== 'undefined' && 'speechSynthesis' in window;
39
+ }
40
+
41
+ export function ttsActive(): boolean {
42
+ return active;
43
+ }
44
+
45
+ export function ttsStart(text: string, locale: Locale, rate = 1.0): boolean {
46
+ if (!ttsSupported() || !text.trim()) return false;
47
+ ttsStop();
48
+ utter = new SpeechSynthesisUtterance(text);
49
+ utter.lang = LOCALE_TO_BCP47[locale];
50
+ utter.rate = rate;
51
+ utter.onend = () => {
52
+ active = false;
53
+ };
54
+ utter.onerror = () => {
55
+ active = false;
56
+ };
57
+ active = true;
58
+ window.speechSynthesis.speak(utter);
59
+ return true;
60
+ }
61
+
62
+ export function ttsStop(): void {
63
+ if (ttsSupported()) window.speechSynthesis.cancel();
64
+ active = false;
65
+ utter = null;
66
+ }
67
+
68
+ export function collectReadableText(root: Element = document.body, limit = 4000): string {
69
+ const excluded = 'script,style,noscript,[aria-hidden="true"],[data-aw-panel],[data-aw-fab]';
70
+ const clone = root.cloneNode(true) as Element;
71
+ clone.querySelectorAll(excluded).forEach((n) => n.remove());
72
+ return (clone.textContent ?? '').replace(/\s+/g, ' ').trim().slice(0, limit);
73
+ }
@@ -0,0 +1,35 @@
1
+ const FOCUSABLE =
2
+ 'button,[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])';
3
+
4
+ export interface FocusTrap {
5
+ activate(): void;
6
+ deactivate(): void;
7
+ }
8
+
9
+ export function createFocusTrap(root: HTMLElement): FocusTrap {
10
+ function onKey(e: KeyboardEvent): void {
11
+ if (e.key !== 'Tab') return;
12
+ const list = Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(
13
+ (el) => !el.hasAttribute('disabled') && el.offsetParent !== null,
14
+ );
15
+ if (list.length === 0) {
16
+ e.preventDefault();
17
+ return;
18
+ }
19
+ const first = list[0]!;
20
+ const last = list[list.length - 1]!;
21
+ const active = document.activeElement as HTMLElement | null;
22
+ if (e.shiftKey && active === first) {
23
+ last.focus();
24
+ e.preventDefault();
25
+ } else if (!e.shiftKey && active === last) {
26
+ first.focus();
27
+ e.preventDefault();
28
+ }
29
+ }
30
+
31
+ return {
32
+ activate: () => root.addEventListener('keydown', onKey),
33
+ deactivate: () => root.removeEventListener('keydown', onKey),
34
+ };
35
+ }
@@ -0,0 +1,63 @@
1
+ import type { ProfileId, WidgetConfig, WidgetState, Locale } from './types/index.js';
2
+ import type { WidgetEventMap, WidgetEventName } from './util/events.js';
3
+
4
+ export {};
5
+
6
+ declare global {
7
+ /**
8
+ * The package version, injected at build time via esbuild `define`
9
+ * (and by vitest's `define` in tests). Never a literal in source.
10
+ */
11
+ const __AW_VERSION__: string;
12
+
13
+ interface Window {
14
+ /** Public API — set by the loader. */
15
+ AccessibilityWidget?: {
16
+ open(opts?: {
17
+ trigger?: HTMLElement;
18
+ config?: WidgetConfig;
19
+ locale?: Locale;
20
+ statementUrl?: string;
21
+ }): Promise<void>;
22
+ close(): void;
23
+ reset(): void;
24
+ set(id: string, value: unknown): Promise<void>;
25
+ applyProfile(id: string): Promise<boolean>;
26
+ setLocale(locale: string): Promise<boolean>;
27
+ setPosition(pos: { x: number; y: number } | null): void;
28
+ getState(): WidgetState | null;
29
+ on<K extends WidgetEventName>(
30
+ name: K,
31
+ handler: (detail: WidgetEventMap[K]) => void,
32
+ ): () => void;
33
+ version: string;
34
+ };
35
+
36
+ /** Developer-supplied config. */
37
+ AccessibilityWidgetConfig?: WidgetConfig;
38
+
39
+ /** Internal — set by the core bundle once loaded. */
40
+ AccessibilityWidgetCore?: {
41
+ open(opts: {
42
+ trigger?: HTMLElement;
43
+ config?: WidgetConfig;
44
+ locale?: Locale | 'auto';
45
+ statementUrl?: string;
46
+ }): void;
47
+ close(): void;
48
+ set(id: string, value: unknown): void;
49
+ applyProfile(id: string): boolean;
50
+ setLocale(locale: string): boolean;
51
+ reset(): void;
52
+ getState(): WidgetState;
53
+ version: string;
54
+ };
55
+
56
+ /** Internal guard against double-loading. */
57
+ __accessibilityWidgetLoaded?: boolean;
58
+ }
59
+ }
60
+
61
+ // Re-export public types so consumers importing from the package root
62
+ // also get the event map for `window.AccessibilityWidget.on<...>`.
63
+ export type { ProfileId, WidgetConfig, WidgetState, Locale, WidgetEventMap, WidgetEventName };
package/src/i18n/ar.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const ar: Translation = {
4
+ title: 'إمكانية الوصول',
5
+ close: 'إغلاق',
6
+ reset: 'إعادة تعيين جميع الإعدادات',
7
+ resetDone: 'تمت إعادة التعيين.',
8
+ profiles: {
9
+ h: 'ملفات التعريف',
10
+ visionImpaired: 'ضعف البصر',
11
+ motor: 'حركي',
12
+ cognitive: 'معرفي / مساعدة القراءة',
13
+ seizureSafe: 'آمن من النوبات',
14
+ adhd: 'اضطراب فرط الحركة / التركيز',
15
+ blind: 'كفيف (قارئ الشاشة)',
16
+ },
17
+ features: {
18
+ h: 'إعدادات فردية',
19
+ fontSize: 'حجم الخط',
20
+ lineHeight: 'ارتفاع السطر',
21
+ letterSpacing: 'تباعد الأحرف',
22
+ contrast: 'التباين',
23
+ grayscale: 'تدرج الرمادي',
24
+ invertColors: 'عكس الألوان',
25
+ dyslexiaFont: 'خط عسر القراءة',
26
+ highlightLinks: 'تمييز الروابط',
27
+ pauseAnimations: 'إيقاف الحركات',
28
+ bigCursor: 'مؤشر كبير',
29
+ focusOutline: 'إطار تركيز سميك',
30
+ readingMask: 'قناع القراءة',
31
+ readingGuide: 'دليل القراءة',
32
+ tts: 'قراءة بصوت عالٍ',
33
+ structureNav: 'التنقل حسب البنية',
34
+ },
35
+ values: { off: 'مغلق', on: 'مفعل', step: 'مستوى' },
36
+ contrastLabels: { off: 'عادي', high: 'مرتفع', dark: 'داكن', invert: 'مقلوب' },
37
+ aria: {
38
+ dialog: 'إعدادات إمكانية الوصول',
39
+ switch: 'مفتاح:',
40
+ triggerLabel: 'إعدادات إمكانية الوصول',
41
+ dragHandle: 'تحريك اللوحة',
42
+ oversized: 'أداة مكبّرة',
43
+ language: 'اللغة',
44
+ info: 'عن هذه الميزة',
45
+ },
46
+ poweredBy: 'بدعم من',
47
+ statementLink: 'بيان إمكانية الوصول',
48
+ };
package/src/i18n/bn.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const bn: Translation = {
4
+ title: 'অ্যাক্সেসযোগ্যতা',
5
+ close: 'বন্ধ করুন',
6
+ reset: 'সব সেটিংস রিসেট করুন',
7
+ resetDone: 'সেটিংস রিসেট হয়েছে।',
8
+ profiles: {
9
+ h: 'প্রোফাইল',
10
+ visionImpaired: 'দৃষ্টিপ্রতিবন্ধী',
11
+ motor: 'মোটর / চলন',
12
+ cognitive: 'জ্ঞানীয় / পাঠ সহায়তা',
13
+ seizureSafe: 'খিঁচুনি-নিরাপদ',
14
+ adhd: 'ADHD / মনোনিবেশ',
15
+ blind: 'অন্ধ (স্ক্রিন রিডার)',
16
+ },
17
+ features: {
18
+ h: 'একক সেটিংস',
19
+ fontSize: 'হরফের আকার',
20
+ lineHeight: 'পঙক্তির উচ্চতা',
21
+ letterSpacing: 'অক্ষরের ব্যবধান',
22
+ contrast: 'কনট্রাস্ট',
23
+ grayscale: 'গ্রেস্কেল',
24
+ invertColors: 'রং উল্টে দিন',
25
+ dyslexiaFont: 'ডিসলেক্সিয়া ফন্ট',
26
+ highlightLinks: 'লিঙ্কগুলি চিহ্নিত করুন',
27
+ pauseAnimations: 'অ্যানিমেশন থামান',
28
+ bigCursor: 'বড় কার্সর',
29
+ focusOutline: 'মোটা ফোকাস রেখা',
30
+ readingMask: 'পঠন মুখোশ',
31
+ readingGuide: 'পঠন গাইড',
32
+ tts: 'পড়ে শোনান (TTS)',
33
+ structureNav: 'কাঠামো নেভিগেশন',
34
+ },
35
+ values: { off: 'বন্ধ', on: 'চালু', step: 'স্তর' },
36
+ contrastLabels: { off: 'সাধারণ', high: 'উচ্চ', dark: 'গাঢ়', invert: 'উল্টানো' },
37
+ aria: {
38
+ dialog: 'অ্যাক্সেসযোগ্যতা সেটিংস',
39
+ switch: 'টগল',
40
+ triggerLabel: 'অ্যাক্সেসযোগ্যতা সেটিংস',
41
+ dragHandle: 'প্যানেল সরান',
42
+ oversized: 'বড় উইজেট',
43
+ language: 'ভাষা',
44
+ info: 'এই বৈশিষ্ট্য সম্পর্কে',
45
+ },
46
+ poweredBy: 'দ্বারা চালিত',
47
+ statementLink: 'অ্যাক্সেসযোগ্যতা বিবৃতি',
48
+ };
package/src/i18n/cs.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const cs: Translation = {
4
+ title: 'Přístupnost',
5
+ close: 'Zavřít',
6
+ reset: 'Obnovit všechna nastavení',
7
+ resetDone: 'Nastavení obnovena.',
8
+ profiles: {
9
+ h: 'Profily',
10
+ visionImpaired: 'Zrakově postižení',
11
+ motor: 'Motorika',
12
+ cognitive: 'Kognitivní / pomoc při čtení',
13
+ seizureSafe: 'Bezpečné při epilepsii',
14
+ adhd: 'ADHD / soustředění',
15
+ blind: 'Nevidomí (čtečka obrazovky)',
16
+ },
17
+ features: {
18
+ h: 'Jednotlivá nastavení',
19
+ fontSize: 'Velikost písma',
20
+ lineHeight: 'Řádkování',
21
+ letterSpacing: 'Mezery mezi písmeny',
22
+ contrast: 'Kontrast',
23
+ grayscale: 'Stupně šedi',
24
+ invertColors: 'Invertovat barvy',
25
+ dyslexiaFont: 'Písmo pro dyslexii',
26
+ highlightLinks: 'Zvýraznit odkazy',
27
+ pauseAnimations: 'Pozastavit animace',
28
+ bigCursor: 'Velký kurzor',
29
+ focusOutline: 'Tlustý rámeček zaměření',
30
+ readingMask: 'Maska čtení',
31
+ readingGuide: 'Vodítko čtení',
32
+ tts: 'Předčítání (TTS)',
33
+ structureNav: 'Navigace podle struktury',
34
+ },
35
+ values: { off: 'Vyp.', on: 'Zap.', step: 'úroveň' },
36
+ contrastLabels: { off: 'Normální', high: 'Vysoký', dark: 'Tmavý', invert: 'Invertovaný' },
37
+ aria: {
38
+ dialog: 'Nastavení přístupnosti',
39
+ switch: 'Přepínač',
40
+ triggerLabel: 'Nastavení přístupnosti',
41
+ dragHandle: 'Přesunout panel',
42
+ oversized: 'Zvětšený widget',
43
+ language: 'Jazyk',
44
+ info: 'O této funkci',
45
+ },
46
+ poweredBy: 'Poháněno',
47
+ statementLink: 'Prohlášení o přístupnosti',
48
+ };
package/src/i18n/de.ts ADDED
@@ -0,0 +1,65 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const de: Translation = {
4
+ title: 'Barrierefreiheit',
5
+ close: 'Schließen',
6
+ reset: 'Alle Einstellungen zurücksetzen',
7
+ resetDone: 'Einstellungen zurückgesetzt.',
8
+ profiles: {
9
+ h: 'Profile',
10
+ visionImpaired: 'Sehbehinderung',
11
+ motor: 'Motorik',
12
+ cognitive: 'Kognition / Lesehilfe',
13
+ seizureSafe: 'Anfallsicher',
14
+ adhd: 'ADHS / Fokus',
15
+ blind: 'Blind (Screenreader)',
16
+ },
17
+ features: {
18
+ h: 'Einzelne Einstellungen',
19
+ fontSize: 'Schriftgröße',
20
+ lineHeight: 'Zeilenabstand',
21
+ letterSpacing: 'Buchstabenabstand',
22
+ contrast: 'Kontrast',
23
+ grayscale: 'Graustufen',
24
+ invertColors: 'Farben invertieren',
25
+ dyslexiaFont: 'Lese-Schrift (Dyslexie)',
26
+ highlightLinks: 'Links hervorheben',
27
+ pauseAnimations: 'Animationen pausieren',
28
+ bigCursor: 'Großer Cursor',
29
+ focusOutline: 'Dicker Fokusrahmen',
30
+ readingMask: 'Lesemaske',
31
+ readingGuide: 'Leseführung',
32
+ tts: 'Vorlesen (Text-to-Speech)',
33
+ structureNav: 'Strukturnavigation',
34
+ },
35
+ featureDescriptions: {
36
+ fontSize: 'Vergrößert den Seitentext in drei Stufen.',
37
+ lineHeight: 'Vergrößert den Zeilenabstand für besseres Lesen.',
38
+ letterSpacing: 'Erhöht den Abstand zwischen Buchstaben.',
39
+ contrast: 'Wechselt zwischen normal, hoch, dunkel und invertiert.',
40
+ grayscale: 'Entfernt Farben — hilfreich bei Lichtempfindlichkeit.',
41
+ invertColors: 'Kehrt alle Farben um.',
42
+ dyslexiaFont: 'Nutzt eine dyslexiefreundliche Schriftart.',
43
+ highlightLinks: 'Hebt alle Links deutlich hervor.',
44
+ pauseAnimations: 'Stoppt Animationen und Übergänge.',
45
+ bigCursor: 'Ersetzt den Mauszeiger durch eine größere Variante.',
46
+ focusOutline: 'Zeichnet einen dicken Rahmen um fokussierte Elemente.',
47
+ readingMask: 'Verdunkelt die Seite bis auf einen Lesestreifen.',
48
+ readingGuide: 'Horizontaler Leseführer folgt der Maus.',
49
+ tts: 'Liest die Seite mit der Browser-Stimme vor.',
50
+ structureNav: 'Listet alle Überschriften für schnelle Navigation.',
51
+ },
52
+ values: { off: 'Aus', on: 'An', step: 'Stufe' },
53
+ contrastLabels: { off: 'Normal', high: 'Hoch', dark: 'Dunkel', invert: 'Invertiert' },
54
+ aria: {
55
+ dialog: 'Einstellungen zur Barrierefreiheit',
56
+ switch: 'Umschalter für',
57
+ triggerLabel: 'Barrierefreiheit einstellen',
58
+ dragHandle: 'Panel verschieben',
59
+ oversized: 'Vergrößerte Darstellung',
60
+ language: 'Sprache',
61
+ info: 'Info zur Funktion',
62
+ },
63
+ poweredBy: 'Bereitgestellt von',
64
+ statementLink: 'Barrierefreiheitserklärung',
65
+ };
package/src/i18n/el.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const el: Translation = {
4
+ title: 'Προσβασιμότητα',
5
+ close: 'Κλείσιμο',
6
+ reset: 'Επαναφορά όλων των ρυθμίσεων',
7
+ resetDone: 'Οι ρυθμίσεις επαναφέρθηκαν.',
8
+ profiles: {
9
+ h: 'Προφίλ',
10
+ visionImpaired: 'Προβλήματα όρασης',
11
+ motor: 'Κινητικά',
12
+ cognitive: 'Γνωστικά / βοήθεια ανάγνωσης',
13
+ seizureSafe: 'Ασφαλές για επιληψία',
14
+ adhd: 'ΔΕΠΥ / εστίαση',
15
+ blind: 'Τυφλοί (αναγνώστης οθόνης)',
16
+ },
17
+ features: {
18
+ h: 'Επιμέρους ρυθμίσεις',
19
+ fontSize: 'Μέγεθος γραμματοσειράς',
20
+ lineHeight: 'Απόσταση γραμμών',
21
+ letterSpacing: 'Απόσταση χαρακτήρων',
22
+ contrast: 'Αντίθεση',
23
+ grayscale: 'Αποχρώσεις του γκρι',
24
+ invertColors: 'Αντιστροφή χρωμάτων',
25
+ dyslexiaFont: 'Γραμματοσειρά δυσλεξίας',
26
+ highlightLinks: 'Επισήμανση συνδέσμων',
27
+ pauseAnimations: 'Παύση κινούμενων εικόνων',
28
+ bigCursor: 'Μεγάλος δρομέας',
29
+ focusOutline: 'Παχύ πλαίσιο εστίασης',
30
+ readingMask: 'Μάσκα ανάγνωσης',
31
+ readingGuide: 'Οδηγός ανάγνωσης',
32
+ tts: 'Εκφώνηση (TTS)',
33
+ structureNav: 'Πλοήγηση δομής',
34
+ },
35
+ values: { off: 'Ανεν.', on: 'Ενεργ.', step: 'βήμα' },
36
+ contrastLabels: { off: 'Κανονική', high: 'Υψηλή', dark: 'Σκοτεινή', invert: 'Ανεστραμμένη' },
37
+ aria: {
38
+ dialog: 'Ρυθμίσεις προσβασιμότητας',
39
+ switch: 'Εναλλαγή',
40
+ triggerLabel: 'Ρυθμίσεις προσβασιμότητας',
41
+ dragHandle: 'Μετακίνηση πάνελ',
42
+ oversized: 'Μεγεθυμένο widget',
43
+ language: 'Γλώσσα',
44
+ info: 'Σχετικά με τη λειτουργία',
45
+ },
46
+ poweredBy: 'Υποστηρίζεται από',
47
+ statementLink: 'Δήλωση προσβασιμότητας',
48
+ };
package/src/i18n/en.ts ADDED
@@ -0,0 +1,65 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const en: Translation = {
4
+ title: 'Accessibility',
5
+ close: 'Close',
6
+ reset: 'Reset all settings',
7
+ resetDone: 'Settings reset.',
8
+ profiles: {
9
+ h: 'Profiles',
10
+ visionImpaired: 'Vision impaired',
11
+ motor: 'Motor',
12
+ cognitive: 'Cognitive / reading aid',
13
+ seizureSafe: 'Seizure-safe',
14
+ adhd: 'ADHD / focus',
15
+ blind: 'Blind (screen reader)',
16
+ },
17
+ features: {
18
+ h: 'Individual settings',
19
+ fontSize: 'Font size',
20
+ lineHeight: 'Line height',
21
+ letterSpacing: 'Letter spacing',
22
+ contrast: 'Contrast',
23
+ grayscale: 'Grayscale',
24
+ invertColors: 'Invert colors',
25
+ dyslexiaFont: 'Dyslexia font',
26
+ highlightLinks: 'Highlight links',
27
+ pauseAnimations: 'Pause animations',
28
+ bigCursor: 'Big cursor',
29
+ focusOutline: 'Thick focus ring',
30
+ readingMask: 'Reading mask',
31
+ readingGuide: 'Reading guide',
32
+ tts: 'Read aloud (TTS)',
33
+ structureNav: 'Structure navigation',
34
+ },
35
+ featureDescriptions: {
36
+ fontSize: 'Scales page text through three larger steps.',
37
+ lineHeight: 'Increases vertical space between lines.',
38
+ letterSpacing: 'Adds space between letters for easier reading.',
39
+ contrast: 'Cycles normal, high, dark and inverted contrast modes.',
40
+ grayscale: 'Removes colour — useful for light sensitivity.',
41
+ invertColors: 'Inverts all colours page-wide.',
42
+ dyslexiaFont: 'Switches body text to a dyslexia-friendly typeface.',
43
+ highlightLinks: 'Adds an underline and highlight to every link.',
44
+ pauseAnimations: 'Stops animations and transitions.',
45
+ bigCursor: 'Replaces the cursor with a larger version.',
46
+ focusOutline: 'Draws a thick outline around focused elements.',
47
+ readingMask: 'Dims the page except for a horizontal reading strip.',
48
+ readingGuide: 'Follows the mouse with a horizontal guide bar.',
49
+ tts: 'Reads the current page aloud using the browser voice.',
50
+ structureNav: 'Lists headings for one-click navigation.',
51
+ },
52
+ values: { off: 'Off', on: 'On', step: 'step' },
53
+ contrastLabels: { off: 'Normal', high: 'High', dark: 'Dark', invert: 'Inverted' },
54
+ aria: {
55
+ dialog: 'Accessibility settings',
56
+ switch: 'Toggle for',
57
+ triggerLabel: 'Accessibility settings',
58
+ dragHandle: 'Move panel',
59
+ oversized: 'Oversized widget',
60
+ language: 'Language',
61
+ info: 'About this feature',
62
+ },
63
+ poweredBy: 'Powered by',
64
+ statementLink: 'Accessibility statement',
65
+ };
package/src/i18n/es.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const es: Translation = {
4
+ title: 'Accesibilidad',
5
+ close: 'Cerrar',
6
+ reset: 'Restablecer todos los ajustes',
7
+ resetDone: 'Ajustes restablecidos.',
8
+ profiles: {
9
+ h: 'Perfiles',
10
+ visionImpaired: 'Baja visión',
11
+ motor: 'Motriz',
12
+ cognitive: 'Cognitivo / ayuda a la lectura',
13
+ seizureSafe: 'Seguro contra crisis',
14
+ adhd: 'TDAH / enfoque',
15
+ blind: 'Ciego (lector de pantalla)',
16
+ },
17
+ features: {
18
+ h: 'Ajustes individuales',
19
+ fontSize: 'Tamaño del texto',
20
+ lineHeight: 'Altura de línea',
21
+ letterSpacing: 'Espaciado entre letras',
22
+ contrast: 'Contraste',
23
+ grayscale: 'Escala de grises',
24
+ invertColors: 'Invertir colores',
25
+ dyslexiaFont: 'Fuente para dislexia',
26
+ highlightLinks: 'Resaltar enlaces',
27
+ pauseAnimations: 'Pausar animaciones',
28
+ bigCursor: 'Cursor grande',
29
+ focusOutline: 'Foco grueso',
30
+ readingMask: 'Máscara de lectura',
31
+ readingGuide: 'Guía de lectura',
32
+ tts: 'Leer en voz alta',
33
+ structureNav: 'Navegación por estructura',
34
+ },
35
+ values: { off: 'No', on: 'Sí', step: 'nivel' },
36
+ contrastLabels: { off: 'Normal', high: 'Alto', dark: 'Oscuro', invert: 'Invertido' },
37
+ aria: {
38
+ dialog: 'Ajustes de accesibilidad',
39
+ switch: 'Interruptor para',
40
+ triggerLabel: 'Ajustes de accesibilidad',
41
+ dragHandle: 'Mover el panel',
42
+ oversized: 'Widget ampliado',
43
+ language: 'Idioma',
44
+ info: 'Acerca de esta función',
45
+ },
46
+ poweredBy: 'Desarrollado por',
47
+ statementLink: 'Declaración de accesibilidad',
48
+ };
package/src/i18n/fa.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const fa: Translation = {
4
+ title: 'دسترس‌پذیری',
5
+ close: 'بستن',
6
+ reset: 'بازنشانی همهٔ تنظیمات',
7
+ resetDone: 'تنظیمات بازنشانی شد.',
8
+ profiles: {
9
+ h: 'پروفایل‌ها',
10
+ visionImpaired: 'کم‌بینا',
11
+ motor: 'حرکتی',
12
+ cognitive: 'شناختی / کمک خواندن',
13
+ seizureSafe: 'ایمن در برابر تشنج',
14
+ adhd: 'ADHD / تمرکز',
15
+ blind: 'نابینا (صفحه‌خوان)',
16
+ },
17
+ features: {
18
+ h: 'تنظیمات جداگانه',
19
+ fontSize: 'اندازهٔ قلم',
20
+ lineHeight: 'فاصلهٔ خطوط',
21
+ letterSpacing: 'فاصلهٔ حروف',
22
+ contrast: 'کنتراست',
23
+ grayscale: 'خاکستری',
24
+ invertColors: 'وارونه‌سازی رنگ',
25
+ dyslexiaFont: 'قلم نارساخوانی',
26
+ highlightLinks: 'برجسته‌سازی پیوندها',
27
+ pauseAnimations: 'توقف انیمیشن‌ها',
28
+ bigCursor: 'نشانگر بزرگ',
29
+ focusOutline: 'قاب تمرکز ضخیم',
30
+ readingMask: 'ماسک خواندن',
31
+ readingGuide: 'راهنمای خواندن',
32
+ tts: 'خواندن با صدا (TTS)',
33
+ structureNav: 'ناوبری ساختاری',
34
+ },
35
+ values: { off: 'خاموش', on: 'روشن', step: 'مرحله' },
36
+ contrastLabels: { off: 'عادی', high: 'بالا', dark: 'تیره', invert: 'وارونه' },
37
+ aria: {
38
+ dialog: 'تنظیمات دسترس‌پذیری',
39
+ switch: 'تغییر وضعیت',
40
+ triggerLabel: 'تنظیمات دسترس‌پذیری',
41
+ dragHandle: 'انتقال پنل',
42
+ oversized: 'ابزارک بزرگ‌شده',
43
+ language: 'زبان',
44
+ info: 'درباره این ویژگی',
45
+ },
46
+ poweredBy: 'قدرت‌گرفته از',
47
+ statementLink: 'بیانیهٔ دسترس‌پذیری',
48
+ };
package/src/i18n/fr.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { Translation } from './types.js';
2
+
3
+ export const fr: Translation = {
4
+ title: 'Accessibilité',
5
+ close: 'Fermer',
6
+ reset: 'Réinitialiser tous les réglages',
7
+ resetDone: 'Réglages réinitialisés.',
8
+ profiles: {
9
+ h: 'Profils',
10
+ visionImpaired: 'Malvoyance',
11
+ motor: 'Motricité',
12
+ cognitive: 'Cognition / aide à la lecture',
13
+ seizureSafe: 'Anti-crise',
14
+ adhd: 'TDAH / focus',
15
+ blind: 'Aveugle (lecteur d’écran)',
16
+ },
17
+ features: {
18
+ h: 'Réglages individuels',
19
+ fontSize: 'Taille du texte',
20
+ lineHeight: 'Hauteur de ligne',
21
+ letterSpacing: 'Espacement des lettres',
22
+ contrast: 'Contraste',
23
+ grayscale: 'Niveaux de gris',
24
+ invertColors: 'Inverser les couleurs',
25
+ dyslexiaFont: 'Police dyslexie',
26
+ highlightLinks: 'Surligner les liens',
27
+ pauseAnimations: 'Pauser les animations',
28
+ bigCursor: 'Grand curseur',
29
+ focusOutline: 'Contour de focus épais',
30
+ readingMask: 'Masque de lecture',
31
+ readingGuide: 'Guide de lecture',
32
+ tts: 'Lecture à voix haute',
33
+ structureNav: 'Navigation par structure',
34
+ },
35
+ values: { off: 'Off', on: 'On', step: 'niveau' },
36
+ contrastLabels: { off: 'Normal', high: 'Élevé', dark: 'Sombre', invert: 'Inversé' },
37
+ aria: {
38
+ dialog: 'Réglages d’accessibilité',
39
+ switch: 'Bascule pour',
40
+ triggerLabel: 'Réglages d’accessibilité',
41
+ dragHandle: 'Déplacer le panneau',
42
+ oversized: 'Widget agrandi',
43
+ language: 'Langue',
44
+ info: 'À propos de cette fonction',
45
+ },
46
+ poweredBy: 'Propulsé par',
47
+ statementLink: 'Déclaration d’accessibilité',
48
+ };