ngp-accessibility 1.0.6 → 1.0.8

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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # NGP Accessibility
2
2
 
3
- React accessibility package with translation, text sizing, contrast modes, and voice commands.
3
+ React accessibility package with translation, text sizing, contrast modes, and more.
4
4
 
5
5
  ## Features
6
6
 
@@ -12,7 +12,6 @@ React accessibility package with translation, text sizing, contrast modes, and v
12
12
  - 💡 Light background mode
13
13
  - 🔗 Links underline toggle
14
14
  - 📖 Readable font mode
15
- - 🎤 Voice command support
16
15
  - ✅ TypeScript & JavaScript compatible
17
16
  - 📦 Zero dependencies (peer: React)
18
17
 
@@ -65,18 +64,6 @@ function App() {
65
64
  }
66
65
  ```
67
66
 
68
- ## Voice Commands
69
-
70
- When voice command is enabled, you can use:
71
-
72
- - "increase text" / "palakihin"
73
- - "decrease text" / "paliitin"
74
- - "high contrast" / "mataas"
75
- - "negative contrast" / "negatibo"
76
- - "light background" / "maliwanag"
77
- - "underline" / "guhit"
78
- - "readable font" / "madaling"
79
-
80
67
  ## API
81
68
 
82
69
  ### AccessibilityProvider
@@ -185,7 +172,6 @@ Hook that returns:
185
172
  - `lightBackground`, `toggleLightBackground()`
186
173
  - `underlineLinks`, `toggleUnderlineLinks()`
187
174
  - `readableFont`, `toggleReadableFont()`
188
- - `voiceEnabled`, `toggleVoice()`
189
175
  - `translate(key)` - Get translated package UI text with English fallback
190
176
  - `t(key)` - Get your app-specific manual text for the current language, then fall back to English, then the raw key
191
177
 
@@ -10,10 +10,10 @@ interface AccessibilityState {
10
10
  highContrast: boolean;
11
11
  negativeContrast: boolean;
12
12
  lightBackground: boolean;
13
+ darkMode: boolean;
13
14
  underlineLinks: boolean;
14
15
  highlightTitles: boolean;
15
16
  readableFont: boolean;
16
- voiceEnabled: boolean;
17
17
  readAloud: boolean;
18
18
  colorBlindMode: ColorBlindMode;
19
19
  focusIndicator: boolean;
@@ -28,10 +28,10 @@ interface AccessibilityContextType extends AccessibilityState {
28
28
  toggleHighContrast: () => void;
29
29
  toggleNegativeContrast: () => void;
30
30
  toggleLightBackground: () => void;
31
+ toggleDarkMode: () => void;
31
32
  toggleUnderlineLinks: () => void;
32
33
  toggleHighlightTitles: () => void;
33
34
  toggleReadableFont: () => void;
34
- toggleVoice: () => void;
35
35
  toggleReadAloud: () => void;
36
36
  setColorBlindMode: (mode: ColorBlindMode) => void;
37
37
  toggleFocusIndicator: () => void;
@@ -4,7 +4,6 @@ export interface AccessibilityToolbarClasses {
4
4
  select?: string;
5
5
  button?: string;
6
6
  activeButton?: string;
7
- voiceButton?: string;
8
7
  }
9
8
  export interface AccessibilityToolbarProps {
10
9
  className?: string;
package/dist/index.esm.js CHANGED
@@ -9,12 +9,12 @@ const translations = {
9
9
  highContrast: "High Contrast",
10
10
  negativeContrast: "Negative Contrast",
11
11
  lightBackground: "Light Background",
12
+ darkMode: "Dark Mode",
12
13
  underlineLinks: "Underline Links",
13
14
  highlightTitles: "Highlight Titles",
14
15
  readableFont: "Readable Font",
15
16
  pauseAnimations: "Pause Animations",
16
17
  readingGuide: "Reading Guide",
17
- voiceCommand: "Voice Command",
18
18
  readAloud: "Read Aloud",
19
19
  colorBlindMode: "Color Blind Mode",
20
20
  focusIndicator: "Focus Indicator",
@@ -27,12 +27,12 @@ const translations = {
27
27
  highContrast: "Mataas na Contrast",
28
28
  negativeContrast: "Negatibong Contrast",
29
29
  lightBackground: "Maliwanag na Background",
30
+ darkMode: "Madilim na Mode",
30
31
  underlineLinks: "May Guhit na Links",
31
32
  highlightTitles: "I-highlight ang Mga Pamagat",
32
33
  readableFont: "Madaling Basahin na Font",
33
34
  pauseAnimations: "I-pause ang mga Animation",
34
35
  readingGuide: "Reading Guide",
35
- voiceCommand: "Voice Command",
36
36
  readAloud: "Basahin nang Malakas",
37
37
  colorBlindMode: "Color Blind Mode",
38
38
  focusIndicator: "Focus Indicator",
@@ -45,12 +45,12 @@ const translations = {
45
45
  highContrast: "Taas nga Contrast",
46
46
  negativeContrast: "Negatibo nga Contrast",
47
47
  lightBackground: "Hayag nga Background",
48
+ darkMode: "Ngitngit nga Mode",
48
49
  underlineLinks: "Linya sa Ubos sa Links",
49
50
  highlightTitles: "I-highlight ang mga Ulohan",
50
51
  readableFont: "Sayon Basahon nga Font",
51
52
  pauseAnimations: "Ihunong ang mga Animation",
52
53
  readingGuide: "Reading Guide",
53
- voiceCommand: "Voice Command",
54
54
  readAloud: "Basaha og Kusog",
55
55
  colorBlindMode: "Color Blind Mode",
56
56
  focusIndicator: "Focus Indicator",
@@ -114,10 +114,10 @@ const AccessibilityProvider = ({ children, translations: customTranslations, goo
114
114
  highContrast: false,
115
115
  negativeContrast: false,
116
116
  lightBackground: false,
117
+ darkMode: false,
117
118
  underlineLinks: false,
118
119
  highlightTitles: false,
119
120
  readableFont: false,
120
- voiceEnabled: false,
121
121
  readAloud: false,
122
122
  colorBlindMode: "none",
123
123
  focusIndicator: false,
@@ -167,6 +167,7 @@ const AccessibilityProvider = ({ children, translations: customTranslations, goo
167
167
  root.classList.toggle("high-contrast", state.highContrast);
168
168
  root.classList.toggle("negative-contrast", state.negativeContrast);
169
169
  root.classList.toggle("light-background", state.lightBackground);
170
+ root.classList.toggle("dark-mode", state.darkMode);
170
171
  root.classList.toggle("underline-links", state.underlineLinks);
171
172
  root.classList.toggle("highlight-titles", state.highlightTitles);
172
173
  root.classList.toggle("readable-font", state.readableFont);
@@ -438,54 +439,6 @@ const AccessibilityProvider = ({ children, translations: customTranslations, goo
438
439
  tooltip.remove();
439
440
  };
440
441
  }, [state.textMagnifier]);
441
- useEffect(() => {
442
- if (!state.voiceEnabled ||
443
- !("webkitSpeechRecognition" in window || "SpeechRecognition" in window))
444
- return;
445
- const SpeechRecognition = window.SpeechRecognition ||
446
- window.webkitSpeechRecognition;
447
- const recognition = new SpeechRecognition();
448
- recognition.continuous = true;
449
- recognition.lang =
450
- state.language === "tl"
451
- ? "tl-PH"
452
- : state.language === "ceb"
453
- ? "ceb-PH"
454
- : "en-US";
455
- recognition.onresult = (event) => {
456
- const transcript = event.results[event.results.length - 1][0].transcript.toLowerCase();
457
- if (transcript.includes("increase text") ||
458
- transcript.includes("palakihin"))
459
- increaseText();
460
- if (transcript.includes("decrease text") ||
461
- transcript.includes("paliitin"))
462
- decreaseText();
463
- if (transcript.includes("high contrast") || transcript.includes("mataas"))
464
- toggleHighContrast();
465
- if (transcript.includes("negative contrast") ||
466
- transcript.includes("negatibo"))
467
- toggleNegativeContrast();
468
- if (transcript.includes("light background") ||
469
- transcript.includes("maliwanag"))
470
- toggleLightBackground();
471
- if (transcript.includes("underline") || transcript.includes("guhit"))
472
- toggleUnderlineLinks();
473
- if (transcript.includes("highlight titles") ||
474
- transcript.includes("title highlight"))
475
- toggleHighlightTitles();
476
- if (transcript.includes("pause animations") ||
477
- transcript.includes("stop animations"))
478
- togglePauseAnimations();
479
- if (transcript.includes("reading guide") ||
480
- transcript.includes("reading line"))
481
- toggleReadingGuide();
482
- if (transcript.includes("readable font") ||
483
- transcript.includes("madaling"))
484
- toggleReadableFont();
485
- };
486
- recognition.start();
487
- return () => recognition.stop();
488
- }, [state.voiceEnabled, state.language]);
489
442
  const setLanguage = (lang) => setState((s) => (Object.assign(Object.assign({}, s), { language: lang })));
490
443
  const increaseText = () => setState((s) => (Object.assign(Object.assign({}, s), { textSize: Math.min(s.textSize + 10, 200) })));
491
444
  const decreaseText = () => setState((s) => (Object.assign(Object.assign({}, s), { textSize: Math.max(s.textSize - 10, 80) })));
@@ -494,11 +447,11 @@ const AccessibilityProvider = ({ children, translations: customTranslations, goo
494
447
  const toggleReadingGuide = () => setState((s) => (Object.assign(Object.assign({}, s), { readingGuide: !s.readingGuide })));
495
448
  const toggleHighContrast = () => setState((s) => (Object.assign(Object.assign({}, s), { highContrast: !s.highContrast, negativeContrast: false })));
496
449
  const toggleNegativeContrast = () => setState((s) => (Object.assign(Object.assign({}, s), { negativeContrast: !s.negativeContrast, highContrast: false })));
497
- const toggleLightBackground = () => setState((s) => (Object.assign(Object.assign({}, s), { lightBackground: !s.lightBackground })));
450
+ const toggleLightBackground = () => setState((s) => (Object.assign(Object.assign({}, s), { lightBackground: !s.lightBackground, darkMode: s.lightBackground ? s.darkMode : false })));
451
+ const toggleDarkMode = () => setState((s) => (Object.assign(Object.assign({}, s), { darkMode: !s.darkMode, lightBackground: s.darkMode ? s.lightBackground : false })));
498
452
  const toggleUnderlineLinks = () => setState((s) => (Object.assign(Object.assign({}, s), { underlineLinks: !s.underlineLinks })));
499
453
  const toggleHighlightTitles = () => setState((s) => (Object.assign(Object.assign({}, s), { highlightTitles: !s.highlightTitles })));
500
454
  const toggleReadableFont = () => setState((s) => (Object.assign(Object.assign({}, s), { readableFont: !s.readableFont })));
501
- const toggleVoice = () => setState((s) => (Object.assign(Object.assign({}, s), { voiceEnabled: !s.voiceEnabled })));
502
455
  const toggleReadAloud = () => setState((s) => (Object.assign(Object.assign({}, s), { readAloud: !s.readAloud })));
503
456
  const setColorBlindMode = (mode) => setState((s) => (Object.assign(Object.assign({}, s), { colorBlindMode: mode })));
504
457
  const toggleFocusIndicator = () => setState((s) => (Object.assign(Object.assign({}, s), { focusIndicator: !s.focusIndicator })));
@@ -583,10 +536,10 @@ const AccessibilityProvider = ({ children, translations: customTranslations, goo
583
536
  toggleHighContrast,
584
537
  toggleNegativeContrast,
585
538
  toggleLightBackground,
539
+ toggleDarkMode,
586
540
  toggleUnderlineLinks,
587
541
  toggleHighlightTitles,
588
542
  toggleReadableFont,
589
- toggleVoice,
590
543
  toggleReadAloud,
591
544
  setColorBlindMode,
592
545
  toggleFocusIndicator,
@@ -603,9 +556,9 @@ const useAccessibility = () => {
603
556
 
604
557
  const cn$1 = (...parts) => parts.filter(Boolean).join(" ");
605
558
  const AccessibilityToolbar = ({ className, style, classes, }) => {
606
- const { language, setLanguage, increaseText, decreaseText, toggleTextMagnifier, togglePauseAnimations, toggleReadingGuide, toggleHighContrast, toggleNegativeContrast, toggleLightBackground, toggleUnderlineLinks, toggleHighlightTitles, toggleReadableFont, toggleVoice, toggleReadAloud, setColorBlindMode, toggleFocusIndicator, translate, textMagnifier, pauseAnimations, readingGuide, highContrast, negativeContrast, lightBackground, underlineLinks, highlightTitles, readableFont, voiceEnabled, readAloud, colorBlindMode, focusIndicator, } = useAccessibility();
559
+ const { language, setLanguage, increaseText, decreaseText, toggleTextMagnifier, togglePauseAnimations, toggleReadingGuide, toggleHighContrast, toggleNegativeContrast, toggleLightBackground, toggleDarkMode, toggleUnderlineLinks, toggleHighlightTitles, toggleReadableFont, toggleReadAloud, setColorBlindMode, toggleFocusIndicator, translate, textMagnifier, pauseAnimations, readingGuide, highContrast, negativeContrast, lightBackground, darkMode, underlineLinks, highlightTitles, readableFont, readAloud, colorBlindMode, focusIndicator, } = useAccessibility();
607
560
  return (React.createElement("div", { className: cn$1("accessibility-toolbar notranslate", classes === null || classes === void 0 ? void 0 : classes.root, className), style: style, translate: "no" },
608
- React.createElement("select", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.select), value: language, onChange: (e) => setLanguage(e.target.value) },
561
+ React.createElement("select", { className: cn$1("notranslate", classes === null || classes === void 0 ? void 0 : classes.select), value: language, onChange: (e) => setLanguage(e.target.value), translate: "no" },
609
562
  React.createElement("option", { value: "en" }, "English"),
610
563
  React.createElement("option", { value: "tl" }, "Tagalog"),
611
564
  React.createElement("option", { value: "ceb" }, "Cebuano")),
@@ -619,14 +572,12 @@ const AccessibilityToolbar = ({ className, style, classes, }) => {
619
572
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, highContrast && "active", highContrast && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": highContrast, onClick: toggleHighContrast }, translate("highContrast")),
620
573
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, negativeContrast && "active", negativeContrast && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": negativeContrast, onClick: toggleNegativeContrast }, translate("negativeContrast")),
621
574
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, lightBackground && "active", lightBackground && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": lightBackground, onClick: toggleLightBackground }, translate("lightBackground")),
575
+ React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, darkMode && "active", darkMode && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": darkMode, onClick: toggleDarkMode }, translate("darkMode")),
622
576
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, underlineLinks && "active", underlineLinks && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": underlineLinks, onClick: toggleUnderlineLinks }, translate("underlineLinks")),
623
577
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, highlightTitles && "active", highlightTitles && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": highlightTitles, onClick: toggleHighlightTitles }, translate("highlightTitles")),
624
578
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, readableFont && "active", readableFont && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": readableFont, onClick: toggleReadableFont }, translate("readableFont")),
625
579
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, pauseAnimations && "active", pauseAnimations && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": pauseAnimations, onClick: togglePauseAnimations }, translate("pauseAnimations")),
626
580
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, readingGuide && "active", readingGuide && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": readingGuide, onClick: toggleReadingGuide }, translate("readingGuide")),
627
- React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, classes === null || classes === void 0 ? void 0 : classes.voiceButton, voiceEnabled && "active", voiceEnabled && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": voiceEnabled, onClick: toggleVoice },
628
- "\uD83C\uDFA4 ",
629
- translate("voiceCommand")),
630
581
  React.createElement("button", { className: cn$1(classes === null || classes === void 0 ? void 0 : classes.button, readAloud && "active", readAloud && (classes === null || classes === void 0 ? void 0 : classes.activeButton)), "data-active": readAloud, onClick: toggleReadAloud },
631
582
  "\uD83D\uDD0A ",
632
583
  translate("readAloud")),
@@ -641,7 +592,7 @@ const AccessibilityToolbar = ({ className, style, classes, }) => {
641
592
  const cn = (...parts) => parts.filter(Boolean).join(" ");
642
593
  const AccessibilityDropdown = ({ className, style, classes, triggerLabel = "♿ Accessibility", renderTrigger, }) => {
643
594
  const [isOpen, setIsOpen] = useState(false);
644
- const { language, setLanguage, textSize, increaseText, decreaseText, toggleTextMagnifier, togglePauseAnimations, toggleReadingGuide, toggleHighContrast, toggleNegativeContrast, toggleLightBackground, toggleUnderlineLinks, toggleHighlightTitles, toggleReadableFont, toggleVoice, translate, textMagnifier, pauseAnimations, readingGuide, highContrast, negativeContrast, lightBackground, underlineLinks, highlightTitles, readableFont, voiceEnabled, } = useAccessibility();
595
+ const { language, setLanguage, textSize, increaseText, decreaseText, toggleTextMagnifier, togglePauseAnimations, toggleReadingGuide, toggleHighContrast, toggleNegativeContrast, toggleLightBackground, toggleDarkMode, toggleUnderlineLinks, toggleHighlightTitles, toggleReadableFont, translate, textMagnifier, pauseAnimations, readingGuide, highContrast, negativeContrast, lightBackground, darkMode, underlineLinks, highlightTitles, readableFont, } = useAccessibility();
645
596
  const toggle = () => setIsOpen(!isOpen);
646
597
  const closePanel = () => setIsOpen(false);
647
598
  const textScaleDelta = textSize - 100;
@@ -657,12 +608,11 @@ const AccessibilityDropdown = ({ className, style, classes, triggerLabel = "♿
657
608
  isOpen && (React.createElement("div", { className: cn("a11y-panel", classes === null || classes === void 0 ? void 0 : classes.panel) },
658
609
  React.createElement("div", { className: cn("a11y-panel-header", classes === null || classes === void 0 ? void 0 : classes.panelHeader) },
659
610
  React.createElement("div", { className: "a11y-panel-heading" },
660
- React.createElement("span", { className: "a11y-panel-eyebrow" }, "NGP"),
661
611
  React.createElement("label", { className: cn("a11y-panel-title", classes === null || classes === void 0 ? void 0 : classes.title) }, "Accessibility Options")),
662
612
  React.createElement("button", { type: "button", className: cn("a11y-panel-close", classes === null || classes === void 0 ? void 0 : classes.closeButton), onClick: closePanel, "aria-label": "Close accessibility panel" }, "\u00D7")),
663
613
  React.createElement("div", { className: cn("a11y-language", classes === null || classes === void 0 ? void 0 : classes.section) },
664
614
  React.createElement("label", { htmlFor: "a11y-language-select", className: cn("a11y-language-label", classes === null || classes === void 0 ? void 0 : classes.title) }, translate("language")),
665
- React.createElement("select", { id: "a11y-language-select", value: language, onChange: (e) => setLanguage(e.target.value) },
615
+ React.createElement("select", { id: "a11y-language-select", className: "notranslate", value: language, onChange: (e) => setLanguage(e.target.value), translate: "no" },
666
616
  React.createElement("option", { value: "en" }, "English"),
667
617
  React.createElement("option", { value: "tl" }, "Tagalog"),
668
618
  React.createElement("option", { value: "ceb" }, "Cebuano"),
@@ -690,13 +640,13 @@ const AccessibilityDropdown = ({ className, style, classes, triggerLabel = "♿
690
640
  React.createElement("div", { className: cn("a11y-grid", classes === null || classes === void 0 ? void 0 : classes.section) },
691
641
  React.createElement("button", { className: cn("a11y-card", highContrast && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: toggleHighContrast }, translate("highContrast")),
692
642
  React.createElement("button", { className: cn("a11y-card", negativeContrast && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: toggleNegativeContrast }, translate("negativeContrast")),
693
- React.createElement("button", { className: cn("a11y-card", lightBackground && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: toggleLightBackground }, translate("lightBackground")))),
643
+ React.createElement("button", { className: cn("a11y-card", lightBackground && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: toggleLightBackground }, translate("lightBackground")),
644
+ React.createElement("button", { className: cn("a11y-card", darkMode && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: toggleDarkMode }, translate("darkMode")))),
694
645
  React.createElement("section", { className: cn("a11y-section", classes === null || classes === void 0 ? void 0 : classes.section) },
695
646
  React.createElement("h3", { className: cn("a11y-section-title", classes === null || classes === void 0 ? void 0 : classes.title) }, "Accessibility Tools"),
696
647
  React.createElement("div", { className: cn("a11y-grid", classes === null || classes === void 0 ? void 0 : classes.section) },
697
648
  React.createElement("button", { className: cn("a11y-card", pauseAnimations && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: togglePauseAnimations }, translate("pauseAnimations")),
698
- React.createElement("button", { className: cn("a11y-card", readingGuide && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: toggleReadingGuide }, translate("readingGuide")),
699
- React.createElement("button", { className: cn("a11y-card", voiceEnabled && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: toggleVoice }, translate("voiceCommand"))))))));
649
+ React.createElement("button", { className: cn("a11y-card", readingGuide && "active", classes === null || classes === void 0 ? void 0 : classes.button), onClick: toggleReadingGuide }, translate("readingGuide"))))))));
700
650
  };
701
651
 
702
652
  const T = ({ k, children }) => {