@m00rl0ck/a11y-widget 0.1.0 → 0.2.0
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 +25 -0
- package/dist/colorblind-adapt.js +474 -0
- package/dist/colorblind-adapt.js.map +7 -0
- package/dist/index.js +474 -2
- package/dist/index.js.map +4 -4
- package/package.json +2 -1
- package/src/colorblind-adapt/index.js +575 -0
- package/src/colorblind-adapt/locales.js +131 -0
- package/src/colorblind-adapt/quiz.js +78 -0
- package/src/colorblind-adapt/styles.js +175 -0
- package/src/index.js +2 -0
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/vision-a11y/locales.js", "../src/vision-a11y/index.js"],
|
|
4
|
-
"sourcesContent": ["export const locales = {\n uk: {\n panelTitle: '\u041B\u044E\u0434\u044F\u043C \u0456\u0437 \u043F\u043E\u0440\u0443\u0448\u0435\u043D\u043D\u044F\u043C \u0437\u043E\u0440\u0443',\n panelSubtitle: '\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0439\u0442\u0435 \u0440\u043E\u0437\u043C\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443, \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442 \u0456 \u0447\u0438\u0442\u0430\u0431\u0435\u043B\u044C\u043D\u0456\u0441\u0442\u044C \u0441\u0430\u0439\u0442\u0443.',\n closeLabel: '\u0417\u0430\u043A\u0440\u0438\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C',\n fontSizeLabel: '\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443:',\n themeLabel: '\u041A\u043E\u043B\u0456\u0440 \u0441\u0430\u0439\u0442\u0443:',\n extraLabel: '\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E:',\n readableFont: '\u041F\u0440\u043E\u0441\u0442\u0438\u0439 \u0448\u0440\u0438\u0444\u0442',\n letterSpacing: '\u0411\u0456\u043B\u044C\u0448\u0456 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0438',\n reset: '\u0417\u0432\u0438\u0447\u0430\u0439\u043D\u0430 \u0432\u0435\u0440\u0441\u0456\u044F \u0441\u0430\u0439\u0442\u0443',\n toggleLabel: '\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0434\u043B\u044F \u043B\u044E\u0434\u0435\u0439 \u0456\u0437 \u043F\u043E\u0440\u0443\u0448\u0435\u043D\u043D\u044F\u043C \u0437\u043E\u0440\u0443',\n toggleText: '\u041B\u044E\u0434\u044F\u043C \u0456\u0437 \u043F\u043E\u0440\u0443\u0448\u0435\u043D\u043D\u044F\u043C \u0437\u043E\u0440\u0443',\n },\n en: {\n panelTitle: 'Vision Accessibility',\n panelSubtitle: 'Adjust text size, contrast, and readability of the site.',\n closeLabel: 'Close panel',\n fontSizeLabel: 'Font size:',\n themeLabel: 'Color scheme:',\n extraLabel: 'Additional:',\n readableFont: 'Readable font',\n letterSpacing: 'Letter spacing',\n reset: 'Default view',\n toggleLabel: 'Open vision accessibility settings',\n toggleText: 'Vision accessibility',\n },\n de: {\n panelTitle: 'Barrierefreiheit',\n panelSubtitle: 'Passen Sie Schriftgr\u00F6\u00DFe, Kontrast und Lesbarkeit der Seite an.',\n closeLabel: 'Schlie\u00DFen',\n fontSizeLabel: 'Schriftgr\u00F6\u00DFe:',\n themeLabel: 'Farbschema:',\n extraLabel: 'Zus\u00E4tzlich:',\n readableFont: 'Lesbare Schrift',\n letterSpacing: 'Buchstabenabstand',\n reset: 'Standardansicht',\n toggleLabel: 'Barrierefreiheit-Einstellungen \u00F6ffnen',\n toggleText: 'Barrierefreiheit',\n },\n}\n\nexport function detectLang() {\n const html = document.documentElement\n const htmlLang = (html.lang || navigator.language || 'en').slice(0, 2).toLowerCase()\n return htmlLang in locales ? htmlLang : 'en'\n}\n", "import { locales, detectLang } from './locales.js'\n\nconst storageKey = 'vision-a11y-settings'\nconst styleId = 'vision-a11y-global-styles'\n\nconst defaults = {\n fontSize: 'normal',\n theme: 'default',\n letterSpacing: false,\n readableFont: false,\n}\n\nclass VisionAccessibilityWidget extends HTMLElement {\n static observedAttributes = ['lang', 'position', 'label-title', 'label-subtitle', 'label-reset']\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n this._state = { ...defaults, open: false }\n }\n\n get lang() {\n return this.getAttribute('lang') || detectLang()\n }\n\n t(key) {\n const dict = locales[this.lang] || locales.en\n const overrides = this._getLabelOverrides()\n return overrides[key] || dict[key] || key\n }\n\n _getLabelOverrides() {\n const map = {\n 'label-title': 'panelTitle',\n 'label-subtitle': 'panelSubtitle',\n 'label-reset': 'reset',\n }\n const overrides = {}\n for (const [attr, key] of Object.entries(map)) {\n const val = this.getAttribute(attr)\n if (val) overrides[key] = val\n }\n return overrides\n }\n\n connectedCallback() {\n this._loadState()\n this._render()\n this._applySettings()\n }\n\n attributeChangedCallback() {\n if (this.shadowRoot.innerHTML) {\n this._render()\n }\n }\n\n _loadState() {\n try {\n const saved = JSON.parse(localStorage.getItem(storageKey))\n if (saved) {\n this._state = { ...defaults, ...saved, open: false }\n }\n } catch {}\n }\n\n _saveState() {\n const { open, ...settings } = this._state\n localStorage.setItem(storageKey, JSON.stringify(settings))\n }\n\n _setState(next) {\n this._state = { ...this._state, ...next }\n this._saveState()\n this._render()\n this._applySettings()\n }\n\n _reset() {\n localStorage.removeItem(storageKey)\n this._state = { ...defaults, open: false }\n this._render()\n this._applySettings()\n }\n\n _applySettings() {\n const root = document.documentElement\n\n root.classList.remove(\n 'va-font-normal', 'va-font-large', 'va-font-xlarge',\n 'va-theme-default', 'va-theme-contrast', 'va-theme-light',\n 'va-readable-font', 'va-letter-spacing',\n )\n\n root.classList.add(`va-font-${this._state.fontSize}`)\n root.classList.add(`va-theme-${this._state.theme}`)\n\n if (this._state.readableFont) root.classList.add('va-readable-font')\n if (this._state.letterSpacing) root.classList.add('va-letter-spacing')\n\n this._ensureGlobalStyles()\n }\n\n _ensureGlobalStyles() {\n if (document.getElementById(styleId)) return\n\n const style = document.createElement('style')\n style.id = styleId\n style.textContent = `\n html.va-font-large { font-size: 112.5%; }\n html.va-font-xlarge { font-size: 125%; }\n\n html.va-readable-font body,\n html.va-readable-font button,\n html.va-readable-font input,\n html.va-readable-font textarea,\n html.va-readable-font select {\n font-family: Arial, Helvetica, sans-serif !important;\n }\n\n html.va-letter-spacing body {\n letter-spacing: 0.04em;\n line-height: 1.7;\n }\n\n html.va-theme-contrast body {\n background: #000 !important;\n color: #fff !important;\n }\n html.va-theme-contrast a {\n color: #ffff00 !important;\n text-decoration: underline !important;\n }\n html.va-theme-contrast button,\n html.va-theme-contrast input,\n html.va-theme-contrast textarea,\n html.va-theme-contrast select {\n background: #000 !important;\n color: #fff !important;\n border-color: #fff !important;\n }\n html.va-theme-contrast img,\n html.va-theme-contrast video,\n html.va-theme-contrast canvas {\n filter: grayscale(1) contrast(1.15);\n }\n\n html.va-theme-light body {\n background: #fff !important;\n color: #000 !important;\n }\n html.va-theme-light a {\n color: #003cff !important;\n text-decoration: underline !important;\n }\n html.va-theme-light button,\n html.va-theme-light input,\n html.va-theme-light textarea,\n html.va-theme-light select {\n background: #fff !important;\n color: #000 !important;\n border-color: #000 !important;\n }\n `\n document.head.appendChild(style)\n }\n\n _render() {\n const s = this._state\n const open = s.open\n\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n position: fixed;\n ${this._getPositionStyles()}\n z-index: 99999;\n font-family: Arial, Helvetica, sans-serif;\n }\n * { box-sizing: border-box; }\n .widget {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 10px;\n }\n .toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n border: 2px solid #111;\n border-radius: 999px;\n padding: 12px 16px;\n background: #fff;\n color: #111;\n font-size: 15px;\n font-weight: 700;\n cursor: pointer;\n box-shadow: 0 10px 30px rgba(0,0,0,.18);\n transition: transform 160ms ease, box-shadow 160ms ease;\n }\n .toggle:hover {\n transform: translateY(-1px);\n box-shadow: 0 14px 34px rgba(0,0,0,.22);\n }\n .toggle:focus-visible,\n .control:focus-visible,\n .reset:focus-visible,\n .close:focus-visible {\n outline: 3px solid #ffcc00;\n outline-offset: 3px;\n }\n .icon { font-size: 20px; line-height: 1; }\n .panel {\n width: min(340px, calc(100vw - 32px));\n padding: 18px;\n border: 2px solid #111;\n border-radius: 18px;\n background: #fff;\n color: #111;\n box-shadow: 0 18px 50px rgba(0,0,0,.25);\n }\n .panel[hidden] { display: none; }\n .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 14px;\n }\n .title {\n margin: 0;\n font-size: 18px;\n line-height: 1.25;\n font-weight: 800;\n }\n .subtitle {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 1.4;\n color: #555;\n }\n .close {\n width: 32px; height: 32px;\n border: 1px solid #ddd;\n border-radius: 50%;\n background: #f7f7f7;\n cursor: pointer;\n font-size: 20px;\n line-height: 1;\n }\n .group {\n padding-top: 14px;\n margin-top: 14px;\n border-top: 1px solid #e5e5e5;\n }\n .label {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n font-weight: 700;\n }\n .controls {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n }\n .controls.two { grid-template-columns: repeat(2, 1fr); }\n .control, .reset {\n min-height: 42px;\n border: 2px solid #d6d6d6;\n border-radius: 12px;\n background: #fafafa;\n color: #111;\n cursor: pointer;\n font-weight: 700;\n transition: border-color 140ms ease, background 140ms ease;\n }\n .control:hover, .reset:hover {\n border-color: #111;\n background: #f0f0f0;\n }\n .control.active {\n border-color: #111;\n background: #111;\n color: #fff;\n }\n .font-a { font-size: 16px; }\n .font-aa { font-size: 20px; }\n .font-aaa { font-size: 24px; }\n .theme-default { background: #fff; color: #111; }\n .theme-contrast { background: #000; color: #fff; border-color: #000; }\n .theme-light { background: #fff; color: #000; border-color: #000; }\n .reset {\n width: 100%;\n margin-top: 14px;\n background: #fff4f4;\n border-color: #f0b4b4;\n color: #8a0000;\n }\n @media (max-width: 520px) {\n :host {\n right: 12px !important;\n bottom: 12px !important;\n }\n .toggle {\n padding: 11px 14px;\n font-size: 14px;\n }\n }\n </style>\n\n <div class=\"widget\">\n <section class=\"panel\" ${open ? '' : 'hidden'} aria-label=\"${this.t('panelTitle')}\">\n <div class=\"header\">\n <div>\n <h2 class=\"title\">${this.t('panelTitle')}</h2>\n <p class=\"subtitle\">${this.t('panelSubtitle')}</p>\n </div>\n <button class=\"close\" type=\"button\" aria-label=\"${this.t('closeLabel')}\">\u00D7</button>\n </div>\n\n <div class=\"group\">\n <span class=\"label\">${this.t('fontSizeLabel')}</span>\n <div class=\"controls\">\n <button class=\"control font-a ${s.fontSize === 'normal' ? 'active' : ''}\" data-font=\"normal\" type=\"button\">A</button>\n <button class=\"control font-aa ${s.fontSize === 'large' ? 'active' : ''}\" data-font=\"large\" type=\"button\">A</button>\n <button class=\"control font-aaa ${s.fontSize === 'xlarge' ? 'active' : ''}\" data-font=\"xlarge\" type=\"button\">A</button>\n </div>\n </div>\n\n <div class=\"group\">\n <span class=\"label\">${this.t('themeLabel')}</span>\n <div class=\"controls\">\n <button class=\"control theme-default ${s.theme === 'default' ? 'active' : ''}\" data-theme=\"default\" type=\"button\">A</button>\n <button class=\"control theme-contrast ${s.theme === 'contrast' ? 'active' : ''}\" data-theme=\"contrast\" type=\"button\">A</button>\n <button class=\"control theme-light ${s.theme === 'light' ? 'active' : ''}\" data-theme=\"light\" type=\"button\">A</button>\n </div>\n </div>\n\n <div class=\"group\">\n <span class=\"label\">${this.t('extraLabel')}</span>\n <div class=\"controls two\">\n <button class=\"control ${s.readableFont ? 'active' : ''}\" data-toggle=\"readableFont\" type=\"button\">${this.t('readableFont')}</button>\n <button class=\"control ${s.letterSpacing ? 'active' : ''}\" data-toggle=\"letterSpacing\" type=\"button\">${this.t('letterSpacing')}</button>\n </div>\n </div>\n\n <button class=\"reset\" type=\"button\">${this.t('reset')}</button>\n </section>\n\n <button\n class=\"toggle\"\n type=\"button\"\n aria-expanded=\"${open ? 'true' : 'false'}\"\n aria-label=\"${this.t('toggleLabel')}\"\n >\n <span class=\"icon\" aria-hidden=\"true\">\uD83D\uDC41</span>\n <span>${this.t('toggleText')}</span>\n </button>\n </div>\n `\n\n this.shadowRoot.querySelector('.toggle').addEventListener('click', () => {\n this._setState({ open: !this._state.open })\n })\n this.shadowRoot.querySelector('.close').addEventListener('click', () => {\n this._setState({ open: false })\n })\n this.shadowRoot.querySelectorAll('[data-font]').forEach((btn) => {\n btn.addEventListener('click', () => this._setState({ fontSize: btn.dataset.font }))\n })\n this.shadowRoot.querySelectorAll('[data-theme]').forEach((btn) => {\n btn.addEventListener('click', () => this._setState({ theme: btn.dataset.theme }))\n })\n this.shadowRoot.querySelectorAll('[data-toggle]').forEach((btn) => {\n btn.addEventListener('click', () => this._setState({ [btn.dataset.toggle]: !this._state[btn.dataset.toggle] }))\n })\n this.shadowRoot.querySelector('.reset').addEventListener('click', () => this._reset())\n }\n\n _getPositionStyles() {\n const pos = this.getAttribute('position') || 'right-bottom'\n const [h, v] = pos.split('-')\n const styles = {}\n if (h === 'right') styles.right = '20px'\n else styles.left = '20px'\n if (v === 'bottom') styles.bottom = '20px'\n else styles.top = '20px'\n return Object.entries(styles).map(([k, v]) => `${k}: ${v};`).join(' ')\n }\n}\n\nexport { VisionAccessibilityWidget }\nexport default VisionAccessibilityWidget\n\nif (!customElements.get('vision-accessibility-widget')) {\n customElements.define('vision-accessibility-widget', VisionAccessibilityWidget)\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["locales", "detectLang", "htmlLang", "storageKey", "styleId", "defaults", "VisionAccessibilityWidget", "detectLang", "key", "dict", "locales", "map", "overrides", "attr", "val", "saved", "open", "settings", "next", "root", "style", "s", "btn", "pos", "h", "v", "styles", "k", "__publicField", "vision_a11y_default", "VisionAccessibilityWidget"]
|
|
3
|
+
"sources": ["../src/vision-a11y/locales.js", "../src/vision-a11y/index.js", "../src/colorblind-adapt/locales.js", "../src/colorblind-adapt/quiz.js", "../src/colorblind-adapt/styles.js", "../src/colorblind-adapt/index.js"],
|
|
4
|
+
"sourcesContent": ["export const locales = {\n uk: {\n panelTitle: '\u041B\u044E\u0434\u044F\u043C \u0456\u0437 \u043F\u043E\u0440\u0443\u0448\u0435\u043D\u043D\u044F\u043C \u0437\u043E\u0440\u0443',\n panelSubtitle: '\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0439\u0442\u0435 \u0440\u043E\u0437\u043C\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443, \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442 \u0456 \u0447\u0438\u0442\u0430\u0431\u0435\u043B\u044C\u043D\u0456\u0441\u0442\u044C \u0441\u0430\u0439\u0442\u0443.',\n closeLabel: '\u0417\u0430\u043A\u0440\u0438\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C',\n fontSizeLabel: '\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443:',\n themeLabel: '\u041A\u043E\u043B\u0456\u0440 \u0441\u0430\u0439\u0442\u0443:',\n extraLabel: '\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E:',\n readableFont: '\u041F\u0440\u043E\u0441\u0442\u0438\u0439 \u0448\u0440\u0438\u0444\u0442',\n letterSpacing: '\u0411\u0456\u043B\u044C\u0448\u0456 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0438',\n reset: '\u0417\u0432\u0438\u0447\u0430\u0439\u043D\u0430 \u0432\u0435\u0440\u0441\u0456\u044F \u0441\u0430\u0439\u0442\u0443',\n toggleLabel: '\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0434\u043B\u044F \u043B\u044E\u0434\u0435\u0439 \u0456\u0437 \u043F\u043E\u0440\u0443\u0448\u0435\u043D\u043D\u044F\u043C \u0437\u043E\u0440\u0443',\n toggleText: '\u041B\u044E\u0434\u044F\u043C \u0456\u0437 \u043F\u043E\u0440\u0443\u0448\u0435\u043D\u043D\u044F\u043C \u0437\u043E\u0440\u0443',\n },\n en: {\n panelTitle: 'Vision Accessibility',\n panelSubtitle: 'Adjust text size, contrast, and readability of the site.',\n closeLabel: 'Close panel',\n fontSizeLabel: 'Font size:',\n themeLabel: 'Color scheme:',\n extraLabel: 'Additional:',\n readableFont: 'Readable font',\n letterSpacing: 'Letter spacing',\n reset: 'Default view',\n toggleLabel: 'Open vision accessibility settings',\n toggleText: 'Vision accessibility',\n },\n de: {\n panelTitle: 'Barrierefreiheit',\n panelSubtitle: 'Passen Sie Schriftgr\u00F6\u00DFe, Kontrast und Lesbarkeit der Seite an.',\n closeLabel: 'Schlie\u00DFen',\n fontSizeLabel: 'Schriftgr\u00F6\u00DFe:',\n themeLabel: 'Farbschema:',\n extraLabel: 'Zus\u00E4tzlich:',\n readableFont: 'Lesbare Schrift',\n letterSpacing: 'Buchstabenabstand',\n reset: 'Standardansicht',\n toggleLabel: 'Barrierefreiheit-Einstellungen \u00F6ffnen',\n toggleText: 'Barrierefreiheit',\n },\n}\n\nexport function detectLang() {\n const html = document.documentElement\n const htmlLang = (html.lang || navigator.language || 'en').slice(0, 2).toLowerCase()\n return htmlLang in locales ? htmlLang : 'en'\n}\n", "import { locales, detectLang } from './locales.js'\n\nconst storageKey = 'vision-a11y-settings'\nconst styleId = 'vision-a11y-global-styles'\n\nconst defaults = {\n fontSize: 'normal',\n theme: 'default',\n letterSpacing: false,\n readableFont: false,\n}\n\nclass VisionAccessibilityWidget extends HTMLElement {\n static observedAttributes = ['lang', 'position', 'label-title', 'label-subtitle', 'label-reset']\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n this._state = { ...defaults, open: false }\n }\n\n get lang() {\n return this.getAttribute('lang') || detectLang()\n }\n\n t(key) {\n const dict = locales[this.lang] || locales.en\n const overrides = this._getLabelOverrides()\n return overrides[key] || dict[key] || key\n }\n\n _getLabelOverrides() {\n const map = {\n 'label-title': 'panelTitle',\n 'label-subtitle': 'panelSubtitle',\n 'label-reset': 'reset',\n }\n const overrides = {}\n for (const [attr, key] of Object.entries(map)) {\n const val = this.getAttribute(attr)\n if (val) overrides[key] = val\n }\n return overrides\n }\n\n connectedCallback() {\n this._loadState()\n this._render()\n this._applySettings()\n }\n\n attributeChangedCallback() {\n if (this.shadowRoot.innerHTML) {\n this._render()\n }\n }\n\n _loadState() {\n try {\n const saved = JSON.parse(localStorage.getItem(storageKey))\n if (saved) {\n this._state = { ...defaults, ...saved, open: false }\n }\n } catch {}\n }\n\n _saveState() {\n const { open, ...settings } = this._state\n localStorage.setItem(storageKey, JSON.stringify(settings))\n }\n\n _setState(next) {\n this._state = { ...this._state, ...next }\n this._saveState()\n this._render()\n this._applySettings()\n }\n\n _reset() {\n localStorage.removeItem(storageKey)\n this._state = { ...defaults, open: false }\n this._render()\n this._applySettings()\n }\n\n _applySettings() {\n const root = document.documentElement\n\n root.classList.remove(\n 'va-font-normal', 'va-font-large', 'va-font-xlarge',\n 'va-theme-default', 'va-theme-contrast', 'va-theme-light',\n 'va-readable-font', 'va-letter-spacing',\n )\n\n root.classList.add(`va-font-${this._state.fontSize}`)\n root.classList.add(`va-theme-${this._state.theme}`)\n\n if (this._state.readableFont) root.classList.add('va-readable-font')\n if (this._state.letterSpacing) root.classList.add('va-letter-spacing')\n\n this._ensureGlobalStyles()\n }\n\n _ensureGlobalStyles() {\n if (document.getElementById(styleId)) return\n\n const style = document.createElement('style')\n style.id = styleId\n style.textContent = `\n html.va-font-large { font-size: 112.5%; }\n html.va-font-xlarge { font-size: 125%; }\n\n html.va-readable-font body,\n html.va-readable-font button,\n html.va-readable-font input,\n html.va-readable-font textarea,\n html.va-readable-font select {\n font-family: Arial, Helvetica, sans-serif !important;\n }\n\n html.va-letter-spacing body {\n letter-spacing: 0.04em;\n line-height: 1.7;\n }\n\n html.va-theme-contrast body {\n background: #000 !important;\n color: #fff !important;\n }\n html.va-theme-contrast a {\n color: #ffff00 !important;\n text-decoration: underline !important;\n }\n html.va-theme-contrast button,\n html.va-theme-contrast input,\n html.va-theme-contrast textarea,\n html.va-theme-contrast select {\n background: #000 !important;\n color: #fff !important;\n border-color: #fff !important;\n }\n html.va-theme-contrast img,\n html.va-theme-contrast video,\n html.va-theme-contrast canvas {\n filter: grayscale(1) contrast(1.15);\n }\n\n html.va-theme-light body {\n background: #fff !important;\n color: #000 !important;\n }\n html.va-theme-light a {\n color: #003cff !important;\n text-decoration: underline !important;\n }\n html.va-theme-light button,\n html.va-theme-light input,\n html.va-theme-light textarea,\n html.va-theme-light select {\n background: #fff !important;\n color: #000 !important;\n border-color: #000 !important;\n }\n `\n document.head.appendChild(style)\n }\n\n _render() {\n const s = this._state\n const open = s.open\n\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n position: fixed;\n ${this._getPositionStyles()}\n z-index: 99999;\n font-family: Arial, Helvetica, sans-serif;\n }\n * { box-sizing: border-box; }\n .widget {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 10px;\n }\n .toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n border: 2px solid #111;\n border-radius: 999px;\n padding: 12px 16px;\n background: #fff;\n color: #111;\n font-size: 15px;\n font-weight: 700;\n cursor: pointer;\n box-shadow: 0 10px 30px rgba(0,0,0,.18);\n transition: transform 160ms ease, box-shadow 160ms ease;\n }\n .toggle:hover {\n transform: translateY(-1px);\n box-shadow: 0 14px 34px rgba(0,0,0,.22);\n }\n .toggle:focus-visible,\n .control:focus-visible,\n .reset:focus-visible,\n .close:focus-visible {\n outline: 3px solid #ffcc00;\n outline-offset: 3px;\n }\n .icon { font-size: 20px; line-height: 1; }\n .panel {\n width: min(340px, calc(100vw - 32px));\n padding: 18px;\n border: 2px solid #111;\n border-radius: 18px;\n background: #fff;\n color: #111;\n box-shadow: 0 18px 50px rgba(0,0,0,.25);\n }\n .panel[hidden] { display: none; }\n .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 14px;\n }\n .title {\n margin: 0;\n font-size: 18px;\n line-height: 1.25;\n font-weight: 800;\n }\n .subtitle {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 1.4;\n color: #555;\n }\n .close {\n width: 32px; height: 32px;\n border: 1px solid #ddd;\n border-radius: 50%;\n background: #f7f7f7;\n cursor: pointer;\n font-size: 20px;\n line-height: 1;\n }\n .group {\n padding-top: 14px;\n margin-top: 14px;\n border-top: 1px solid #e5e5e5;\n }\n .label {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n font-weight: 700;\n }\n .controls {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n }\n .controls.two { grid-template-columns: repeat(2, 1fr); }\n .control, .reset {\n min-height: 42px;\n border: 2px solid #d6d6d6;\n border-radius: 12px;\n background: #fafafa;\n color: #111;\n cursor: pointer;\n font-weight: 700;\n transition: border-color 140ms ease, background 140ms ease;\n }\n .control:hover, .reset:hover {\n border-color: #111;\n background: #f0f0f0;\n }\n .control.active {\n border-color: #111;\n background: #111;\n color: #fff;\n }\n .font-a { font-size: 16px; }\n .font-aa { font-size: 20px; }\n .font-aaa { font-size: 24px; }\n .theme-default { background: #fff; color: #111; }\n .theme-contrast { background: #000; color: #fff; border-color: #000; }\n .theme-light { background: #fff; color: #000; border-color: #000; }\n .reset {\n width: 100%;\n margin-top: 14px;\n background: #fff4f4;\n border-color: #f0b4b4;\n color: #8a0000;\n }\n @media (max-width: 520px) {\n :host {\n right: 12px !important;\n bottom: 12px !important;\n }\n .toggle {\n padding: 11px 14px;\n font-size: 14px;\n }\n }\n </style>\n\n <div class=\"widget\">\n <section class=\"panel\" ${open ? '' : 'hidden'} aria-label=\"${this.t('panelTitle')}\">\n <div class=\"header\">\n <div>\n <h2 class=\"title\">${this.t('panelTitle')}</h2>\n <p class=\"subtitle\">${this.t('panelSubtitle')}</p>\n </div>\n <button class=\"close\" type=\"button\" aria-label=\"${this.t('closeLabel')}\">\u00D7</button>\n </div>\n\n <div class=\"group\">\n <span class=\"label\">${this.t('fontSizeLabel')}</span>\n <div class=\"controls\">\n <button class=\"control font-a ${s.fontSize === 'normal' ? 'active' : ''}\" data-font=\"normal\" type=\"button\">A</button>\n <button class=\"control font-aa ${s.fontSize === 'large' ? 'active' : ''}\" data-font=\"large\" type=\"button\">A</button>\n <button class=\"control font-aaa ${s.fontSize === 'xlarge' ? 'active' : ''}\" data-font=\"xlarge\" type=\"button\">A</button>\n </div>\n </div>\n\n <div class=\"group\">\n <span class=\"label\">${this.t('themeLabel')}</span>\n <div class=\"controls\">\n <button class=\"control theme-default ${s.theme === 'default' ? 'active' : ''}\" data-theme=\"default\" type=\"button\">A</button>\n <button class=\"control theme-contrast ${s.theme === 'contrast' ? 'active' : ''}\" data-theme=\"contrast\" type=\"button\">A</button>\n <button class=\"control theme-light ${s.theme === 'light' ? 'active' : ''}\" data-theme=\"light\" type=\"button\">A</button>\n </div>\n </div>\n\n <div class=\"group\">\n <span class=\"label\">${this.t('extraLabel')}</span>\n <div class=\"controls two\">\n <button class=\"control ${s.readableFont ? 'active' : ''}\" data-toggle=\"readableFont\" type=\"button\">${this.t('readableFont')}</button>\n <button class=\"control ${s.letterSpacing ? 'active' : ''}\" data-toggle=\"letterSpacing\" type=\"button\">${this.t('letterSpacing')}</button>\n </div>\n </div>\n\n <button class=\"reset\" type=\"button\">${this.t('reset')}</button>\n </section>\n\n <button\n class=\"toggle\"\n type=\"button\"\n aria-expanded=\"${open ? 'true' : 'false'}\"\n aria-label=\"${this.t('toggleLabel')}\"\n >\n <span class=\"icon\" aria-hidden=\"true\">\uD83D\uDC41</span>\n <span>${this.t('toggleText')}</span>\n </button>\n </div>\n `\n\n this.shadowRoot.querySelector('.toggle').addEventListener('click', () => {\n this._setState({ open: !this._state.open })\n })\n this.shadowRoot.querySelector('.close').addEventListener('click', () => {\n this._setState({ open: false })\n })\n this.shadowRoot.querySelectorAll('[data-font]').forEach((btn) => {\n btn.addEventListener('click', () => this._setState({ fontSize: btn.dataset.font }))\n })\n this.shadowRoot.querySelectorAll('[data-theme]').forEach((btn) => {\n btn.addEventListener('click', () => this._setState({ theme: btn.dataset.theme }))\n })\n this.shadowRoot.querySelectorAll('[data-toggle]').forEach((btn) => {\n btn.addEventListener('click', () => this._setState({ [btn.dataset.toggle]: !this._state[btn.dataset.toggle] }))\n })\n this.shadowRoot.querySelector('.reset').addEventListener('click', () => this._reset())\n }\n\n _getPositionStyles() {\n const pos = this.getAttribute('position') || 'right-bottom'\n const [h, v] = pos.split('-')\n const styles = {}\n if (h === 'right') styles.right = '20px'\n else styles.left = '20px'\n if (v === 'bottom') styles.bottom = '20px'\n else styles.top = '20px'\n return Object.entries(styles).map(([k, v]) => `${k}: ${v};`).join(' ')\n }\n}\n\nexport { VisionAccessibilityWidget }\nexport default VisionAccessibilityWidget\n\nif (!customElements.get('vision-accessibility-widget')) {\n customElements.define('vision-accessibility-widget', VisionAccessibilityWidget)\n}\n", "export const locales = {\n uk: {\n toggleText: '\u0414\u0430\u043B\u044C\u0442\u043E\u043D\u0456\u0437\u043C',\n toggleLabel: '\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u0442\u0438 \u0441\u0430\u0439\u0442 \u0434\u043B\u044F \u043B\u044E\u0434\u0435\u0439 \u0456\u0437 \u0434\u0430\u043B\u044C\u0442\u043E\u043D\u0456\u0437\u043C\u043E\u043C',\n closeLabel: '\u0417\u0430\u043A\u0440\u0438\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C',\n panelTitle: '\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0434\u043B\u044F \u0434\u0430\u043B\u044C\u0442\u043E\u043D\u0456\u0437\u043C\u0443',\n panelSubtitle: '\u041F\u0440\u043E\u0439\u0434\u0456\u0442\u044C \u0448\u0432\u0438\u0434\u043A\u0438\u0439 \u0442\u0435\u0441\u0442 \u0430\u0431\u043E \u043E\u0431\u0435\u0440\u0456\u0442\u044C \u0441\u0432\u0456\u0439 \u0442\u0438\u043F \u0437\u043E\u0440\u0443.',\n testTab: '\u0422\u0435\u0441\u0442',\n manualTab: '\u0412\u0440\u0443\u0447\u043D\u0443',\n startTest: '\u0420\u043E\u0437\u043F\u043E\u0447\u0430\u0442\u0438 \u0442\u0435\u0441\u0442',\n nextQuestion: '\u0414\u0430\u043B\u0456',\n question1: '\u042F\u043A\u0438\u0439 \u043A\u043E\u043B\u0456\u0440 \u0432\u0438 \u0431\u0430\u0447\u0438\u0442\u0435 \u0432 \u0446\u0435\u043D\u0442\u0440\u0456?',\n question2: '\u042F\u043A\u0435 \u0447\u0438\u0441\u043B\u043E \u0431\u0430\u0447\u0438\u0442\u0435?',\n question3: '\u042F\u043A\u0438\u0439 \u043A\u0432\u0430\u0434\u0440\u0430\u0442 \u044F\u0441\u043A\u0440\u0430\u0432\u0456\u0448\u0438\u0439?',\n optRedGreen: '\u0427\u0435\u0440\u0432\u043E\u043D\u0438\u0439 / \u0417\u0435\u043B\u0435\u043D\u0438\u0439',\n optBlueYellow: '\u0421\u0438\u043D\u0456\u0439 / \u0416\u043E\u0432\u0442\u0438\u0439',\n optNone: '\u041D\u0435 \u0431\u0430\u0447\u0443 \u0440\u0456\u0437\u043D\u0438\u0446\u0456',\n optNumber74: '74',\n optNumber21: '21',\n optNoNumber: '\u041D\u0435 \u0431\u0430\u0447\u0443 \u0447\u0438\u0441\u043B\u0430',\n optLeft: '\u041B\u0456\u0432\u0438\u0439',\n optRight: '\u041F\u0440\u0430\u0432\u0438\u0439',\n optSame: '\u041E\u0434\u043D\u0430\u043A\u043E\u0432\u0456',\n resultTitle: '\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u0442\u0435\u0441\u0442\u0443',\n resultDesc: '\u0421\u0445\u043E\u0436\u0435, \u0443 \u0432\u0430\u0441 {type}. \u0421\u0430\u0439\u0442 \u043F\u0456\u0434\u043B\u0430\u0448\u0442\u043E\u0432\u0430\u043D\u043E.',\n typeNormal: '\u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0437\u0456\u0440',\n typeDeuteranopia: '\u0434\u0430\u043B\u044C\u0442\u043E\u043D\u0456\u0437\u043C \u043D\u0430 \u0437\u0435\u043B\u0435\u043D\u0438\u0439 (deuteranopia)',\n typeProtanopia: '\u0434\u0430\u043B\u044C\u0442\u043E\u043D\u0456\u0437\u043C \u043D\u0430 \u0447\u0435\u0440\u0432\u043E\u043D\u0438\u0439 (protanopia)',\n typeTritanopia: '\u0434\u0430\u043B\u044C\u0442\u043E\u043D\u0456\u0437\u043C \u043D\u0430 \u0441\u0438\u043D\u0456\u0439 (tritanopia)',\n typeMonochromacy: '\u043F\u043E\u0432\u043D\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0441\u0442\u044C \u043A\u043E\u043B\u044C\u043E\u0440\u043E\u0432\u043E\u0433\u043E \u0437\u043E\u0440\u0443 (monochromacy)',\n selectType: '\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0432\u0430\u0448 \u0442\u0438\u043F \u0437\u043E\u0440\u0443:',\n deuteranopia: '\u041D\u0435 \u0440\u043E\u0437\u0440\u0456\u0437\u043D\u044F\u044E \u0437\u0435\u043B\u0435\u043D\u0438\u0439',\n protanopia: '\u041D\u0435 \u0440\u043E\u0437\u0440\u0456\u0437\u043D\u044F\u044E \u0447\u0435\u0440\u0432\u043E\u043D\u0438\u0439',\n tritanopia: '\u041D\u0435 \u0440\u043E\u0437\u0440\u0456\u0437\u043D\u044F\u044E \u0441\u0438\u043D\u0456\u0439',\n monochromacy: '\u0427\u043E\u0440\u043D\u043E-\u0431\u0456\u043B\u0438\u0439 \u0437\u0456\u0440',\n apply: '\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438',\n reset: '\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F',\n severity: '\u0421\u0442\u0443\u043F\u0456\u043D\u044C:',\n mild: '\u041B\u0435\u0433\u043A\u0430',\n moderate: '\u041F\u043E\u043C\u0456\u0440\u043D\u0430',\n severe: '\u0421\u0438\u043B\u044C\u043D\u0430',\n },\n en: {\n toggleText: 'Colorblind',\n toggleLabel: 'Adapt website for colorblind users',\n closeLabel: 'Close panel',\n panelTitle: 'Colorblind Settings',\n panelSubtitle: 'Take a quick test or select your vision type.',\n testTab: 'Test',\n manualTab: 'Manual',\n startTest: 'Start test',\n nextQuestion: 'Next',\n question1: 'What color do you see in the center?',\n question2: 'What number do you see?',\n question3: 'Which square is brighter?',\n optRedGreen: 'Red / Green',\n optBlueYellow: 'Blue / Yellow',\n optNone: 'No difference',\n optNumber74: '74',\n optNumber21: '21',\n optNoNumber: 'No number',\n optLeft: 'Left',\n optRight: 'Right',\n optSame: 'Same',\n resultTitle: 'Test result',\n resultDesc: 'It appears you have {type}. The site has been adapted.',\n typeNormal: 'normal vision',\n typeDeuteranopia: 'green-blindness (deuteranopia)',\n typeProtanopia: 'red-blindness (protanopia)',\n typeTritanopia: 'blue-blindness (tritanopia)',\n typeMonochromacy: 'complete color blindness (monochromacy)',\n selectType: 'Select your vision type:',\n deuteranopia: 'Cannot distinguish green',\n protanopia: 'Cannot distinguish red',\n tritanopia: 'Cannot distinguish blue',\n monochromacy: 'Black and white vision',\n apply: 'Apply',\n reset: 'Reset settings',\n severity: 'Severity:',\n mild: 'Mild',\n moderate: 'Moderate',\n severe: 'Severe',\n },\n de: {\n toggleText: 'Farbenblindheit',\n toggleLabel: 'Website f\u00FCr Farbenblinde anpassen',\n closeLabel: 'Schlie\u00DFen',\n panelTitle: 'Farbenblind-Einstellungen',\n panelSubtitle: 'Machen Sie einen schnellen Test oder w\u00E4hlen Sie Ihren Sehtyp.',\n testTab: 'Test',\n manualTab: 'Manuell',\n startTest: 'Test starten',\n nextQuestion: 'Weiter',\n question1: 'Welche Farbe sehen Sie in der Mitte?',\n question2: 'Welche Zahl sehen Sie?',\n question3: 'Welches Quadrat ist heller?',\n optRedGreen: 'Rot / Gr\u00FCn',\n optBlueYellow: 'Blau / Gelb',\n optNone: 'Kein Unterschied',\n optNumber74: '74',\n optNumber21: '21',\n optNoNumber: 'Keine Zahl',\n optLeft: 'Links',\n optRight: 'Rechts',\n optSame: 'Gleich',\n resultTitle: 'Testergebnis',\n resultDesc: 'Sie haben wahrscheinlich {type}. Die Website wurde angepasst.',\n typeNormal: 'normales Sehen',\n typeDeuteranopia: 'Gr\u00FCnblindheit (Deuteranopie)',\n typeProtanopia: 'Rotblindheit (Protanopie)',\n typeTritanopia: 'Blaublindheit (Tritanopie)',\n typeMonochromacy: 'vollst\u00E4ndige Farbenblindheit (Monochromasie)',\n selectType: 'W\u00E4hlen Sie Ihren Sehtyp:',\n deuteranopia: 'Kann Gr\u00FCn nicht unterscheiden',\n protanopia: 'Kann Rot nicht unterscheiden',\n tritanopia: 'Kann Blau nicht unterscheiden',\n monochromacy: 'Schwarz-Wei\u00DF-Sehen',\n apply: 'Anwenden',\n reset: 'Zur\u00FCcksetzen',\n severity: 'St\u00E4rke:',\n mild: 'Leicht',\n moderate: 'M\u00E4\u00DFig',\n severe: 'Stark',\n },\n}\n\nexport function detectLang() {\n const html = document.documentElement\n const htmlLang = (html.lang || navigator.language || 'en').slice(0, 2).toLowerCase()\n return htmlLang in locales ? htmlLang : 'en'\n}\n", "export const questions = [\n {\n id: 'q1',\n promptKey: 'question1',\n options: [\n { labelKey: 'optRedGreen', value: 'red-green' },\n { labelKey: 'optBlueYellow', value: 'blue-yellow' },\n { labelKey: 'optNone', value: 'none' },\n ],\n },\n {\n id: 'q2',\n promptKey: 'question2',\n options: [\n { labelKey: 'optNumber74', value: 'number' },\n { labelKey: 'optNumber21', value: 'number' },\n { labelKey: 'optNoNumber', value: 'none' },\n ],\n },\n {\n id: 'q3',\n promptKey: 'question3',\n options: [\n { labelKey: 'optLeft', value: 'left' },\n { labelKey: 'optRight', value: 'right' },\n { labelKey: 'optSame', value: 'same' },\n ],\n },\n]\n\nexport function suggestType(answers) {\n let deutScore = 0\n let protScore = 0\n let tritScore = 0\n let monoScore = 0\n\n if (answers.q1 === 'red-green') {\n protScore += 3\n deutScore += 3\n } else if (answers.q1 === 'none') {\n monoScore += 2\n }\n\n if (answers.q2 === 'none') {\n deutScore += 3\n protScore += 2\n monoScore += 2\n }\n\n if (answers.q3 === 'same') {\n monoScore += 3\n deutScore += 1\n protScore += 1\n }\n\n const scores = [\n { type: 'monochromacy', score: monoScore },\n { type: 'deuteranopia', score: deutScore },\n { type: 'protanopia', score: protScore },\n { type: 'tritanopia', score: tritScore },\n ]\n\n scores.sort((a, b) => b.score - a.score)\n\n if (scores[0].score === 0) {\n return { type: 'normal', severity: 'none' }\n }\n\n const maxScore = scores[0].score\n const secondScore = scores[1].score\n const ratio = secondScore > 0 ? maxScore / secondScore : 99\n\n let severity = 'mild'\n if (maxScore >= 7) severity = 'severe'\n else if (maxScore >= 4) severity = 'moderate'\n\n return { type: scores[0].type, severity }\n}\n", "const styleId = 'colorblind-adapt-styles'\n\nexport function injectStyles(type, severity) {\n removeStyles()\n\n if (type === 'normal' || !type) return\n\n const sheet = document.createElement('style')\n sheet.id = styleId\n sheet.textContent = buildCSS(type, severity || 'moderate')\n document.head.appendChild(sheet)\n}\n\nexport function removeStyles() {\n document.getElementById(styleId)?.remove()\n}\n\nfunction buildCSS(type, severity) {\n const intensity = severity === 'severe' ? 1 : severity === 'moderate' ? 0.6 : 0.3\n\n const blocks = [baseOverrides(type, intensity)]\n return blocks.join('\\n')\n}\n\nfunction baseOverrides(type, intensity) {\n switch (type) {\n case 'deuteranopia':\n return deuteranopiaCSS(intensity)\n case 'protanopia':\n return protanopiaCSS(intensity)\n case 'tritanopia':\n return tritanopiaCSS(intensity)\n case 'monochromacy':\n return monochromacyCSS(intensity)\n default:\n return ''\n }\n}\n\nfunction deuteranopiaCSS(i) {\n return `\n html[data-cba-active] * {\n --cba-green: hsl(140, ${30 * i}%, 50%);\n --cba-red: hsl(0, 100%, 40%);\n --cba-bg: hsl(220, ${5 * i}%, 97%);\n }\n html[data-cba-active] a,\n html[data-cba-active] a:visited {\n text-decoration: underline;\n text-decoration-thickness: 2px;\n }\n html[data-cba-active] .success,\n html[data-cba-active] [class*=\"success\"],\n html[data-cba-active] [class*=\"valid\"],\n html[data-cba-active] [class*=\"positive\"] {\n color: #0055aa !important;\n border-color: #0055aa !important;\n }\n html[data-cba-active] .error,\n html[data-cba-active] [class*=\"error\"],\n html[data-cba-active] [class*=\"invalid\"],\n html[data-cba-active] [class*=\"danger\"],\n html[data-cba-active] [class*=\"negative\"] {\n color: #cc4400 !important;\n border-color: #cc4400 !important;\n }\n html[data-cba-active] button:not([class*=\"active\"]):not([class*=\"selected\"]):not([class*=\"primary\"]) {\n border: 2px solid currentColor;\n }\n `\n}\n\nfunction protanopiaCSS(i) {\n return `\n html[data-cba-active] * {\n --cba-red: hsl(10, ${80 * i}%, 40%);\n --cba-green: hsl(140, ${60 * i}%, 40%);\n --cba-bg: hsl(220, ${5 * i}%, 97%);\n }\n html[data-cba-active] a,\n html[data-cba-active] a:visited {\n text-decoration: underline;\n text-decoration-thickness: 2px;\n }\n html[data-cba-active] .success,\n html[data-cba-active] [class*=\"success\"],\n html[data-cba-active] [class*=\"valid\"],\n html[data-cba-active] [class*=\"positive\"] {\n color: #007744 !important;\n border-color: #007744 !important;\n }\n html[data-cba-active] .error,\n html[data-cba-active] [class*=\"error\"],\n html[data-cba-active] [class*=\"invalid\"],\n html[data-cba-active] [class*=\"danger\"],\n html[data-cba-active] [class*=\"negative\"] {\n color: #cc0033 !important;\n border-color: #cc0033 !important;\n }\n html[data-cba-active] button:not([class*=\"active\"]):not([class*=\"selected\"]):not([class*=\"primary\"]) {\n border: 2px solid currentColor;\n }\n `\n}\n\nfunction tritanopiaCSS(i) {\n return `\n html[data-cba-active] * {\n --cba-blue: hsl(200, ${80 * i}%, 45%);\n --cba-yellow: hsl(40, ${80 * i}%, 50%);\n --cba-bg: hsl(220, ${5 * i}%, 97%);\n }\n html[data-cba-active] a,\n html[data-cba-active] a:visited {\n text-decoration: underline;\n text-decoration-style: dotted;\n text-decoration-thickness: 2px;\n }\n html[data-cba-active] [class*=\"blue\"],\n html[data-cba-active] [class*=\"info\"],\n html[data-cba-active] [class*=\"primary\"] {\n color: #0066aa !important;\n border-color: #0066aa !important;\n }\n html[data-cba-active] [class*=\"yellow\"],\n html[data-cba-active] [class*=\"warning\"] {\n color: #885500 !important;\n border-color: #885500 !important;\n }\n html[data-cba-active] button:not([class*=\"active\"]):not([class*=\"selected\"]):not([class*=\"primary\"]) {\n border: 2px solid currentColor;\n }\n `\n}\n\nfunction monochromacyCSS(i) {\n return `\n html[data-cba-active] {\n filter: grayscale(${i});\n }\n html[data-cba-active] img,\n html[data-cba-active] video,\n html[data-cba-active] canvas {\n filter: grayscale(${i});\n }\n html[data-cba-active] a {\n text-decoration: underline;\n text-decoration-thickness: 2px;\n font-weight: 700;\n }\n html[data-cba-active] [class*=\"error\"],\n html[data-cba-active] [class*=\"danger\"],\n html[data-cba-active] [class*=\"negative\"],\n html[data-cba-active] [class*=\"invalid\"] {\n border-left: 4px solid #666 !important;\n padding-left: 8px !important;\n }\n html[data-cba-active] [class*=\"success\"],\n html[data-cba-active] [class*=\"valid\"],\n html[data-cba-active] [class*=\"positive\"] {\n border-left: 4px solid #999 !important;\n padding-left: 8px !important;\n }\n html[data-cba-active] button,\n html[data-cba-active] .btn,\n html[data-cba-active] [role=\"button\"] {\n border: 2px solid currentColor;\n }\n html[data-cba-active] button:hover,\n html[data-cba-active] .btn:hover {\n outline: 3px solid #ffcc00;\n outline-offset: 2px;\n }\n `\n}\n", "import { locales, detectLang } from './locales.js'\nimport { questions, suggestType } from './quiz.js'\nimport { injectStyles, removeStyles } from './styles.js'\n\nconst storageKey = 'colorblind-adapt-settings'\n\nclass ColorblindAdaptWidget extends HTMLElement {\n static observedAttributes = ['lang']\n\n constructor() {\n super()\n this.attachShadow({ mode: 'open' })\n this._open = false\n this._tab = 'test'\n this._quizAnswers = {}\n this._quizStep = 0\n this._quizDone = false\n this._quizResult = null\n this._activeType = null\n this._activeSeverity = 'moderate'\n }\n\n get lang() {\n return this.getAttribute('lang') || detectLang()\n }\n\n t(key) {\n return (locales[this.lang] || locales.en)[key] || key\n }\n\n connectedCallback() {\n this._loadState()\n this._render()\n this._applyAdaptation()\n }\n\n attributeChangedCallback() {\n if (this.shadowRoot.innerHTML) this._render()\n }\n\n _loadState() {\n try {\n const saved = JSON.parse(localStorage.getItem(storageKey))\n if (saved && saved.type) {\n this._activeType = saved.type\n this._activeSeverity = saved.severity || 'moderate'\n }\n } catch {}\n }\n\n _saveState() {\n if (this._activeType) {\n localStorage.setItem(storageKey, JSON.stringify({\n type: this._activeType,\n severity: this._activeSeverity,\n }))\n } else {\n localStorage.removeItem(storageKey)\n }\n }\n\n _setOpen(val) {\n this._open = val\n this._render()\n }\n\n _switchTab(tab) {\n this._tab = tab\n if (tab === 'test') {\n this._quizAnswers = {}\n this._quizStep = 0\n this._quizDone = false\n this._quizResult = null\n }\n this._render()\n }\n\n _answerQuestion(value) {\n const q = questions[this._quizStep]\n if (!q) return\n this._quizAnswers[q.id] = value\n if (this._quizStep < questions.length - 1) {\n this._quizStep++\n this._render()\n } else {\n this._quizResult = suggestType(this._quizAnswers)\n this._quizDone = true\n this._activeType = this._quizResult.type\n this._activeSeverity = this._quizResult.severity\n this._saveState()\n this._applyAdaptation()\n this._render()\n }\n }\n\n _selectType(type) {\n this._activeType = type\n this._saveState()\n this._applyAdaptation()\n this._render()\n }\n\n _setSeverity(sev) {\n this._activeSeverity = sev\n if (this._activeType) {\n this._saveState()\n this._applyAdaptation()\n }\n this._render()\n }\n\n _reset() {\n this._activeType = null\n this._activeSeverity = 'moderate'\n this._quizAnswers = {}\n this._quizStep = 0\n this._quizDone = false\n this._quizResult = null\n this._tab = 'test'\n localStorage.removeItem(storageKey)\n removeStyles()\n document.documentElement.removeAttribute('data-cba-active')\n this._render()\n }\n\n _applyAdaptation() {\n document.documentElement.removeAttribute('data-cba-active')\n removeStyles()\n if (this._activeType && this._activeType !== 'normal') {\n document.documentElement.setAttribute('data-cba-active', this._activeType)\n injectStyles(this._activeType, this._activeSeverity)\n }\n }\n\n _render() {\n const t = (k) => this.t(k)\n\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n position: fixed;\n right: 20px;\n bottom: 80px;\n z-index: 99999;\n font-family: Arial, Helvetica, sans-serif;\n }\n * { box-sizing: border-box; }\n .widget {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 10px;\n }\n .toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n border: 2px solid #111;\n border-radius: 999px;\n padding: 12px 16px;\n background: #fff;\n color: #111;\n font-size: 15px;\n font-weight: 700;\n cursor: pointer;\n box-shadow: 0 10px 30px rgba(0,0,0,.18);\n transition: transform 160ms ease, box-shadow 160ms ease;\n }\n .toggle:hover {\n transform: translateY(-1px);\n box-shadow: 0 14px 34px rgba(0,0,0,.22);\n }\n .toggle:focus-visible,\n .control:focus-visible,\n .tab:focus-visible {\n outline: 3px solid #ffcc00;\n outline-offset: 3px;\n }\n .panel {\n width: min(360px, calc(100vw - 32px));\n padding: 18px;\n border: 2px solid #111;\n border-radius: 18px;\n background: #fff;\n color: #111;\n box-shadow: 0 18px 50px rgba(0,0,0,.25);\n }\n .panel[hidden] { display: none; }\n .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 14px;\n }\n .title {\n margin: 0;\n font-size: 18px;\n line-height: 1.25;\n font-weight: 800;\n }\n .subtitle {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 1.4;\n color: #555;\n }\n .close {\n width: 32px; height: 32px;\n border: 1px solid #ddd;\n border-radius: 50%;\n background: #f7f7f7;\n cursor: pointer;\n font-size: 20px;\n line-height: 1;\n }\n .tabs {\n display: flex;\n gap: 4px;\n margin-bottom: 14px;\n background: #f0f0f0;\n border-radius: 10px;\n padding: 3px;\n }\n .tab {\n flex: 1;\n padding: 8px;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: #555;\n font-size: 13px;\n font-weight: 700;\n cursor: pointer;\n transition: background 140ms, color 140ms;\n }\n .tab.active {\n background: #fff;\n color: #111;\n box-shadow: 0 1px 3px rgba(0,0,0,.1);\n }\n .option-grid {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .option {\n display: block;\n width: 100%;\n padding: 12px 14px;\n border: 2px solid #d6d6d6;\n border-radius: 12px;\n background: #fafafa;\n color: #111;\n font-size: 14px;\n font-weight: 700;\n cursor: pointer;\n text-align: left;\n transition: border-color 140ms ease, background 140ms ease;\n }\n .option:hover {\n border-color: #111;\n background: #f0f0f0;\n }\n .option.active {\n border-color: #111;\n background: #111;\n color: #fff;\n }\n .step-indicator {\n font-size: 12px;\n color: #888;\n margin-bottom: 12px;\n }\n .result-card {\n padding: 16px;\n border: 2px solid #111;\n border-radius: 12px;\n background: #fafafa;\n margin-bottom: 12px;\n }\n .result-title {\n font-weight: 800;\n font-size: 16px;\n margin-bottom: 6px;\n }\n .result-desc {\n font-size: 13px;\n line-height: 1.5;\n color: #333;\n }\n .result-type {\n display: inline-block;\n padding: 3px 10px;\n border-radius: 999px;\n background: #111;\n color: #fff;\n font-size: 12px;\n font-weight: 700;\n margin-top: 8px;\n }\n .select-group {\n margin-bottom: 12px;\n }\n .select-label {\n display: block;\n font-weight: 700;\n font-size: 13px;\n margin-bottom: 6px;\n color: #333;\n }\n .select-input {\n width: 100%;\n padding: 10px 12px;\n border: 2px solid #d6d6d6;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n background: #fafafa;\n color: #111;\n cursor: pointer;\n }\n .select-input:focus {\n border-color: #111;\n outline: none;\n }\n .severity-group {\n display: flex;\n gap: 6px;\n margin-top: 8px;\n }\n .severity-btn {\n flex: 1;\n padding: 8px;\n border: 2px solid #d6d6d6;\n border-radius: 8px;\n background: #fafafa;\n color: #555;\n font-size: 12px;\n font-weight: 700;\n cursor: pointer;\n text-align: center;\n transition: all 140ms;\n }\n .severity-btn.active {\n border-color: #111;\n background: #111;\n color: #fff;\n }\n .action-row {\n display: flex;\n gap: 8px;\n margin-top: 14px;\n }\n .btn-primary {\n flex: 1;\n padding: 10px;\n border: 2px solid #111;\n border-radius: 10px;\n background: #111;\n color: #fff;\n font-weight: 700;\n font-size: 13px;\n cursor: pointer;\n }\n .btn-reset {\n flex: 1;\n padding: 10px;\n border: 2px solid #f0b4b4;\n border-radius: 10px;\n background: #fff4f4;\n color: #8a0000;\n font-weight: 700;\n font-size: 13px;\n cursor: pointer;\n }\n .btn-reset:hover {\n background: #ffe0e0;\n }\n .tag {\n display: inline-block;\n padding: 2px 8px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 700;\n margin-left: 8px;\n }\n .tag-active {\n background: #111;\n color: #fff;\n }\n @media (max-width: 520px) {\n :host {\n right: 12px !important;\n bottom: 70px !important;\n }\n .toggle { padding: 11px 14px; font-size: 14px; }\n }\n </style>\n\n <div class=\"widget\">\n <section class=\"panel\" ${this._open ? '' : 'hidden'} aria-label=\"${t('panelTitle')}\">\n <div class=\"header\">\n <div>\n <h2 class=\"title\">\n ${t('panelTitle')}\n ${this._activeType && this._activeType !== 'normal' ? `<span class=\"tag tag-active\">${this._activeType}</span>` : ''}\n </h2>\n <p class=\"subtitle\">${t('panelSubtitle')}</p>\n </div>\n <button class=\"close\" type=\"button\" aria-label=\"${t('closeLabel')}\">\u00D7</button>\n </div>\n\n ${this._renderBody()}\n\n ${this._activeType && this._activeType !== 'normal' ? `\n <div class=\"action-row\">\n <button class=\"btn-reset\" type=\"button\">${t('reset')}</button>\n </div>\n ` : ''}\n </section>\n\n <button\n class=\"toggle\"\n type=\"button\"\n aria-expanded=\"${this._open ? 'true' : 'false'}\"\n aria-label=\"${t('toggleLabel')}\"\n >\n <span class=\"icon\" aria-hidden=\"true\">\uD83D\uDD35</span>\n <span>${t('toggleText')}</span>\n ${this._activeType && this._activeType !== 'normal' ? ` \u2713` : ''}\n </button>\n </div>\n `\n\n this.shadowRoot.querySelector('.toggle').addEventListener('click', () => this._setOpen(!this._open))\n this.shadowRoot.querySelector('.close').addEventListener('click', () => this._setOpen(false))\n\n const panel = this.shadowRoot.querySelector('.panel')\n if (panel) {\n panel.querySelectorAll('button[data-answer]').forEach((btn) => {\n btn.addEventListener('click', () => this._answerQuestion(btn.dataset.answer))\n })\n }\n\n if (this._open && this._tab === 'test' && !this._quizDone) {\n this.shadowRoot.querySelectorAll('.tab').forEach((el) => {\n el.addEventListener('click', () => this._switchTab(el.dataset.tab))\n })\n }\n\n if (this._open && this._tab === 'manual') {\n const select = this.shadowRoot.querySelector('#cba-type-select')\n if (select) {\n select.addEventListener('change', () => this._selectType(select.value))\n\n const severityBtns = this.shadowRoot.querySelectorAll('[data-severity]')\n severityBtns.forEach((btn) => {\n btn.addEventListener('click', () => this._setSeverity(btn.dataset.severity))\n })\n }\n\n const resetBtn = this.shadowRoot.querySelector('.btn-reset')\n if (resetBtn) resetBtn.addEventListener('click', () => this._reset())\n }\n\n if (this._open && this._quizDone) {\n const retakeBtn = this.shadowRoot.querySelector('.btn-reset')\n if (retakeBtn) retakeBtn.addEventListener('click', () => this._reset())\n }\n }\n\n _renderBody() {\n const t = (k) => this.t(k)\n\n if (this._activeType && this._activeType !== 'normal') {\n return this._renderActiveState(t)\n }\n\n if (this._quizDone) {\n return this._renderResult(t)\n }\n\n return `\n <div class=\"tabs\">\n <button class=\"tab ${this._tab === 'test' ? 'active' : ''}\" data-tab=\"test\" type=\"button\">${t('testTab')}</button>\n <button class=\"tab ${this._tab === 'manual' ? 'active' : ''}\" data-tab=\"manual\" type=\"button\">${t('manualTab')}</button>\n </div>\n ${this._tab === 'test' ? this._renderQuiz(t) : this._renderManual(t)}\n `\n }\n\n _renderQuiz(t) {\n const q = questions[this._quizStep]\n if (!q) return ''\n\n return `\n <div class=\"step-indicator\">${t('question' + (this._quizStep + 1))} (${this._quizStep + 1}/${questions.length})</div>\n <p style=\"font-weight:700;font-size:15px;margin:0 0 12px\">${t(q.promptKey)}</p>\n <div class=\"option-grid\">\n ${q.options.map((opt, i) => `\n <button class=\"option\" data-answer=\"${opt.value}\" type=\"button\">\n ${t(opt.labelKey)}\n </button>\n `).join('')}\n </div>\n `\n }\n\n _renderManual(t) {\n const types = ['deuteranopia', 'protanopia', 'tritanopia', 'monochromacy']\n const severities = ['mild', 'moderate', 'severe']\n\n return `\n <div class=\"select-group\">\n <label class=\"select-label\" for=\"cba-type-select\">${t('selectType')}</label>\n <select class=\"select-input\" id=\"cba-type-select\">\n <option value=\"\">\u2014 ${t('selectType')} \u2014</option>\n ${types.map((type) => `\n <option value=\"${type}\" ${this._activeType === type ? 'selected' : ''}>\n ${t(type)}\n </option>\n `).join('')}\n </select>\n </div>\n ${this._activeType ? `\n <div class=\"select-group\">\n <label class=\"select-label\">${t('severity')}</label>\n <div class=\"severity-group\">\n ${severities.map((sev) => `\n <button class=\"severity-btn ${this._activeSeverity === sev ? 'active' : ''}\" data-severity=\"${sev}\" type=\"button\">\n ${t(sev)}\n </button>\n `).join('')}\n </div>\n </div>\n ` : ''}\n `\n }\n\n _renderResult(t) {\n const r = this._quizResult\n if (!r) return ''\n\n const typeKey = 'type' + r.type.charAt(0).toUpperCase() + r.type.slice(1)\n\n return `\n <div class=\"result-card\">\n <div class=\"result-title\">${t('resultTitle')}</div>\n <div class=\"result-desc\">\n ${t('resultDesc').replace('{type}', t(typeKey))}\n </div>\n <span class=\"result-type\">${t(r.severity)} \u00B7 ${t(typeKey)}</span>\n </div>\n <button class=\"btn-reset\" type=\"button\">${t('reset')}</button>\n `\n }\n\n _renderActiveState(t) {\n const r = this._quizResult\n return `\n <div class=\"result-card\">\n <div class=\"result-title\">${t('resultTitle')}</div>\n <span class=\"result-type\">${this._activeType} \u00B7 ${t(this._activeSeverity)}</span>\n </div>\n `\n }\n}\n\nexport { ColorblindAdaptWidget }\nexport default ColorblindAdaptWidget\n\nif (!customElements.get('colorblind-adapt-widget')) {\n customElements.define('colorblind-adapt-widget', ColorblindAdaptWidget)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["locales", "detectLang", "htmlLang", "storageKey", "styleId", "defaults", "VisionAccessibilityWidget", "detectLang", "key", "dict", "locales", "map", "overrides", "attr", "val", "saved", "open", "settings", "next", "root", "style", "s", "btn", "pos", "h", "v", "styles", "k", "__publicField", "vision_a11y_default", "VisionAccessibilityWidget", "locales", "detectLang", "htmlLang", "questions", "suggestType", "answers", "deutScore", "protScore", "tritScore", "monoScore", "scores", "a", "b", "maxScore", "secondScore", "ratio", "severity", "styleId", "injectStyles", "type", "severity", "removeStyles", "sheet", "buildCSS", "baseOverrides", "intensity", "deuteranopiaCSS", "protanopiaCSS", "tritanopiaCSS", "monochromacyCSS", "i", "storageKey", "ColorblindAdaptWidget", "detectLang", "key", "locales", "saved", "val", "tab", "value", "q", "questions", "suggestType", "type", "sev", "removeStyles", "injectStyles", "k", "panel", "btn", "el", "select", "resetBtn", "retakeBtn", "opt", "types", "severities", "r", "typeKey", "__publicField", "colorblind_adapt_default", "ColorblindAdaptWidget"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m00rl0ck/a11y-widget",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Collection of lightweight accessibility web components for websites",
|
|
6
6
|
"keywords": [
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"exports": {
|
|
23
23
|
".": "./dist/index.js",
|
|
24
24
|
"./vision-a11y": "./dist/vision-a11y.js",
|
|
25
|
+
"./colorblind-adapt": "./dist/colorblind-adapt.js",
|
|
25
26
|
"./package.json": "./package.json"
|
|
26
27
|
},
|
|
27
28
|
"files": [
|