├── .editorconfig ├── .gitignore ├── LICENSE.md ├── README.md ├── dist ├── css │ ├── bvi.css │ ├── bvi.css.map │ ├── bvi.min.css │ └── bvi.min.css.map ├── img │ ├── adjust.svg │ ├── cog.svg │ ├── eye-slash.svg │ ├── eye.svg │ ├── image.svg │ ├── minus-circle.svg │ ├── minus.svg │ ├── volume-off.svg │ └── volume-up.svg └── js │ ├── bvi.js │ ├── bvi.js.map │ ├── bvi.min.js │ └── bvi.min.js.map ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── js │ ├── bvi.js │ ├── i18n.js │ ├── index.umd.js │ └── util │ │ ├── cookie.js │ │ └── index.js └── scss │ ├── _body.scss │ ├── _images.scss │ ├── _panel.scss │ ├── _variables.scss │ ├── bvi.scss │ └── mixins │ └── _body.scss └── test └── index.html /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_size = 2 9 | indent_style = space 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /node_modules 3 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 The bvi.isvek.ru 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Button visually impaired 2 | 3 | Button visually impaired - is a plugin that automatically changes the visually impaired version of your site. The panel 4 | on the site for the visually impaired allows the color scheme of the site, font sizes, the synthesizer reads aloud 5 | settings changes. Thanks to it, you can use the functions of the site that meet the needs of people with disabilities. 6 | 7 | * Change the font size (up to 200%); 8 | * Change the color scheme of the site; 9 | * Change the font of the site (serif or sans serif); 10 | * Change the image (gray scale, hide the image); 11 | * Change letter spacing (kerning); 12 | * Change line spacing; 13 | * Automatically set Alt tag to all site images; 14 | * Speech synthesizer will read aloud changes to display settings; 15 | * Disable embedded elements (videos, maps, etc.); 16 | * Play text to voice; 17 | * Support for browsers Chrome, Firefox, Safari, Microsoft Edge, Opera; 18 | 19 | ### Demo 20 | 21 | view demo version [here](https://bvi.isvek.ru/demo/). 22 | 23 | ### NPM 24 | 25 | ``` 26 | $ npm install bvi 27 | ``` 28 | 29 | ``` javascript 30 | import * as isvek from "bvi" 31 | 32 | new isvek.Bvi() 33 | ``` 34 | ### Browser Usage 35 | 36 | Download the [latest package](https://github.com/veks/button-visually-impaired-javascript/archive/master.zip). unpack 37 | and inspect the contents. You need to copy the `bvi.min.js` and `bvi.min.css` or their minified variations to your app `dist` 38 | folders as follows. Link the required CSS in your document `` tag 39 | 40 | ```html 41 | 42 | 43 | ``` 44 | 45 | Link the required JS in your document at the end of the pages, right before the closing `` tag 46 | 47 | ```html 48 | 49 | 50 | ``` 51 | 52 | Run function with default settings 53 | 54 | ```html 55 | 56 | 59 | ``` 60 | 61 | Run function with your settings 62 | 63 | ```html 64 | 65 | 73 | ``` 74 | 75 | ### Html class 76 | 77 | Arbitrary links 78 | 79 | ```html 80 | version for visually impaired 81 | ``` 82 | 83 | Speech synthesis 84 | 85 | ```html 86 | 87 |
88 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's 89 | standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a 90 | type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining 91 | essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum 92 | passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. 93 |
94 | ``` 95 | 96 | Hide element 97 | 98 | ```html 99 | 100 |
The text will be hidden when the plugin is enabled.
101 | ``` 102 | 103 | Show element 104 | 105 | ```html 106 | 107 |
The text will be shown when the plugin is enabled.
108 | ``` 109 | 110 | Disable styles div block 111 | 112 | ```html 113 | 114 |
Plugin styles will not be applied in this block.
115 | ``` 116 | 117 | ### Settings 118 | 119 | Option | Type | Default value| Value options | Description 120 | ------ | ---- | ------- | -------------- | ----------- 121 | target | string | '.bvi-open' | '.className' | Plugin initialization class | 122 | fontSize | number | 16 | 1-39 | Font size | 123 | theme | string | 'white' | (`white`|`black`|`blue`|`brown`|`green`) | Color spectrum | 124 | images |(string|boolean) | 'grayscale' | (`true`|`false`|`grayscale`) | Adapting images | 125 | letterSpacing | string | 'normal' | (`normal`|`average`|`big`) | Letter spacing | 126 | lineHeight | string | 'normal' | (`normal`|`average`|`big`) | Line spacing | 127 | speech | boolean | true | (`true`|`false`) | Speech synthesis | 128 | fontFamily | string | 'arial' | (`arial`|`times`) | Fonts | 129 | builtElements | boolean | false | (`true`|`false`) | Inline elements are a component of an HTML element that allows you to embed documents, videos, maps, and interactive media into a page.| 130 | panelFixed | boolean | true | (`true`|`false`) | Fixing the panel for the visually impaired at the top of the page. | 131 | panelHide | boolean | false | (`true`|`false`) | Hides the panel for the visually impaired and shows the panel icon. | 132 | reload | boolean | false | (`true`|`false`) | Enable / Disable page reload when switching to the regular version of the site. | 133 | lang | string | 'ru-RU' | (`'ru-RU'`|`'en-US')`| Language | 134 | 135 | ### Changelog 136 | 137 | #### 1.0.0 138 | 139 | * new version created JavaScript 140 | 141 | ### License 142 | 143 | [MIT License](https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 144 | -------------------------------------------------------------------------------- /dist/css/bvi.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["../../src/scss/bvi.scss","../../src/scss/_panel.scss","../../src/scss/_body.scss","../../src/scss/mixins/_body.scss","../../src/scss/_variables.scss","../../src/scss/_images.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAAA;AAAA;ACCE;EACE;;AAEA;AAAA;AAAA;EAGE;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EAEE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;;;ACzQV;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AC4BF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE,cCrDc;;ADwDhB;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EA2BE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAKN;EAKE;EACA;;AAQA;EACE;EACA;;AAGF;EACE;EACA;;AApKN;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE,cCpDc;;ADuDhB;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EA2BE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAKN;EAKE;EACA;;AAQA;EACE;EACA;;AAGF;EACE;EACA;;AApKN;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE,cCnDa;;ADsDf;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EA2BE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAKN;EAKE;EACA;;AAQA;EACE;EACA;;AAGF;EACE;EACA;;AApKN;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE,cClDc;;ADqDhB;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EA2BE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAKN;EAKE;EACA;;AAQA;EACE;EACA;;AAGF;EACE;EACA;;AApKN;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE,cCjDc;;ADoDhB;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EA2BE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAKN;EAKE;EACA;;AAQA;EACE;EACA;;AAGF;EACE;EACA;;AA3MJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AA9BJ;EACE;;AAEA;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;ADTF;AAAA;AAAA;EAGE;EACA;EACA;;AAKF;AAAA;AAAA;EAGE;EACA;EACA;;AAKF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;AAKF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAIA;EACE;EACA;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAKN;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;;AGlLN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA","file":"bvi.css"} -------------------------------------------------------------------------------- /dist/css/bvi.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["..\\..\\src\\scss\\bvi.scss","..\\..\\src\\scss\\_panel.scss","..\\..\\src\\scss\\_body.scss","..\\..\\src\\scss\\mixins\\_body.scss","..\\..\\src\\scss\\_variables.scss","..\\..\\src\\scss\\_images.scss"],"names":[],"mappings":"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,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,yCACE,UAAA,eAEA,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eAGF,4CAAA,8CAEE,UAAA,eA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,cA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,eAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cA9BJ,wCACE,UAAA,cAEA,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cAGF,2CAAA,6CAEE,UAAA,cDTF,mGAAA,sGAAA,yFAGE,eAAA,aACA,OAAA,aACA,WAAA,QAKF,oGAAA,uGAAA,0FAGE,QAAA,KACA,SAAA,SACA,OAAA,IAAA,OAKF,wGAAA,2GAAA,8FAGE,YAAA,oPACA,UAAA,oPACA,eAAA,aACA,OAAA,0MACA,OAAA,mKACA,OAAA,aACA,WAAA,QAIJ,+DACE,YAAA,cAGF,gEACE,YAAA,YAGF,4DACE,YAAA,cAGF,kEACE,eAAA,YAGF,mEACE,eAAA,cAGF,+DACE,eAAA,cAGF,+EACE,YAAA,KAAA,CAAA,qBAGF,+EACE,YAAA,iBAAA,CAAA,gBAIA,oFAAA,uEAAA,uEAAA,uEAAA,sEAAA,sEAME,QAAA,gBAKF,qFAAA,wEAAA,wEAAA,wEAAA,uEAAA,uEAME,QAAA,eAIJ,2BACE,cAAA,OAEA,4CACE,QAAA,aACA,OAAA,IAAA,OAAA,YACA,cAAA,EACA,QAAA,MAGF,4CACE,OAAA,IAAA,OAAA,YACA,QAAA,MAIA,kDACE,YAAA,IACA,gBAAA,UAMJ,0BACE,QAAA,aACA,YAAA,IACA,YAAA,IACA,UAAA,kBACA,MAAA,kBACA,WAAA,OACA,gBAAA,KACA,eAAA,OACA,OAAA,QACA,oBAAA,KACA,iBAAA,KACA,YAAA,KACA,iBAAA,kBACA,OAAA,IAAA,MAAA,kBACA,QAAA,QAAA,OACA,cAAA,OACA,SAAA,SACA,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAEA,iCACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,GAKN,mCACE,SAAA,gBACA,IAAA,iBACA,MAAA,iBACA,QAAA,iBAGF,yBACE,QAAA,eAGF,yBACE,QAAA,gBGlLN,YACE,MAAA,KACA,OAAA,KACA,eAAA,OACA,QAAA,aACA,eAAA,OACA,QAAA,EACA,gBAAA,KAAA,KACA,mBAAA,KAAA,KACA,wBAAA,KAAA,KAEA,2BACE,iBAAA,sBACA,kBAAA,UAGF,iCACE,iBAAA,4BACA,kBAAA,UAGF,iCACE,iBAAA,4BACA,kBAAA,UAGF,kCACE,iBAAA,6BACA,kBAAA,UAGF,8BACE,iBAAA,yBACA,kBAAA,UAGF,oCACE,iBAAA,+BACA,kBAAA,UAGF,6BACE,iBAAA,wBACA,kBAAA,UAGF,6BACE,iBAAA,wBACA,kBAAA,UAGF,2BACE,iBAAA,sBACA,kBAAA,UACA,KAAA,MAGF,+BACE,MAAA,eACA,OAAA","sourcesContent":["/*!\n * Button visually impaired v1.0.0 (https://bvi.isvek.ru/)\n * Copyright 2014-2021 \n * Licensed under MIT (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md)\n */\n\n// Configuration\n@import \"variables\";\n@import \"mixins/body\";\n\n// Components\n@import \"panel\";\n@import \"body\";\n@import \"images\";\n","html {\n &:not(.bvi-panel) {\n font-size: 100%;\n\n *,\n ::after,\n ::before {\n box-sizing: border-box;\n }\n }\n\n body {\n .bvi-panel {\n font-family: Arial, serif !important;\n font-size: 1rem !important;\n padding: .5rem;\n color: black;\n top: 0;\n left: 0;\n right: 0;\n letter-spacing: 0;\n position: relative;\n text-shadow: none;\n line-height: normal;\n border: 0;\n margin-bottom: .3rem;\n background-color: #f7f7f7;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);\n z-index: 999999 !important;\n\n * {\n font-family: Arial, serif !important;\n font-size: 1rem !important;\n }\n\n &.bvi-fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 999999;\n }\n\n &.bvi-panel-hide {\n display: none;\n }\n\n a {\n color: black !important;\n outline: 0 !important;\n background-color: transparent !important;\n text-decoration: none !important;\n\n &:hover,\n &:focus {\n color: black !important;\n outline: 0 !important;\n background-color: transparent !important;\n text-decoration: none !important;\n }\n\n &.bvi-link {\n display: inline-block;\n line-height: 1.5;\n font-size: 0.875rem !important;\n color: #212529 !important;\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: #e0e0e0 !important;\n border: 1px solid #c6c6c6 !important;\n padding: .375rem .75rem;\n border-radius: .25rem;\n position: relative;\n font-weight: bold;\n transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\";\n }\n\n &:hover,\n &:focus {\n background-color: $link-hover !important;\n }\n\n &.active {\n color: $link-active-color !important;\n background-color: $link-active-bg !important;\n }\n\n &.bvi-theme-white {\n background-color: $theme-bg-white !important;\n color: $theme-color-white !important;\n }\n\n &.bvi-theme-black {\n background-color: $theme-bg-black !important;\n color: $theme-color-black !important;\n }\n\n &.bvi-theme-blue {\n background-color: $theme-bg-blue !important;\n color: $theme-color-blue !important;\n }\n\n &.bvi-theme-brown {\n background-color: $theme-bg-brown !important;\n color: $theme-color-brown !important;\n }\n\n &.bvi-theme-green {\n background-color: $theme-bg-green !important;\n color: $theme-color-green !important;\n }\n }\n }\n\n .bvi-blocks {\n margin: 0 auto;\n text-align: center;\n display: flex;\n flex-flow: row wrap;\n\n &.bvi-block-start {\n justify-content: flex-start;\n }\n\n &.bvi-block-center {\n justify-content: center;\n }\n\n &.bvi-block-end {\n justify-content: flex-end;\n }\n }\n\n .bvi-block {\n padding: .688rem .938rem;\n\n .bvi-block-title {\n text-align: center;\n font-weight: 600 !important;\n font-size: 1rem !important;\n display: block;\n margin-bottom: .8rem;\n }\n }\n\n .bvi-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n visibility: hidden;\n z-index: 1050;\n outline: 0;\n opacity: 0;\n background: rgba(0, 0, 0, 0.5);\n -webkit-transition: opacity 200ms ease-in;\n -moz-transition: opacity 200ms ease-in;\n transition: opacity 200ms ease-in;\n\n &.show {\n visibility: visible;\n opacity: 1;\n }\n\n .bvi-modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n display: flex;\n align-items: center;\n height: calc(100% - 3.5rem);\n pointer-events: none;\n }\n\n .bvi-modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: .3rem;\n outline: 0;\n max-height: 100%;\n overflow: hidden;\n }\n\n .bvi-modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n padding: .8rem .8rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: calc(.3rem - 1px);\n border-top-right-radius: calc(.3rem - 1px);\n }\n\n .bvi-modal-title {\n margin-top: 0;\n margin-bottom: 0;\n line-height: 1.5;\n font-size: 1.25rem;\n font-weight: 600;\n color: black;\n }\n\n .bvi-modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: .5rem;\n background-color: transparent;\n opacity: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: #dee2e6;\n border-radius: .25rem;\n }\n }\n\n .bvi-modal-footer {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center;\n justify-content: flex-end;\n padding: .8rem .8rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: calc(.3rem - 1px);\n border-bottom-left-radius: calc(.3rem - 1px);\n }\n\n .bvi-modal-close {\n float: right;\n font-size: 1.2rem !important;\n font-weight: 700;\n line-height: 1;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n\n &:focus,\n &:hover {\n cursor: pointer;\n opacity: .75;\n }\n }\n }\n }\n }\n}\n","body {\n &.bvi-active {\n margin: 0;\n padding: 0;\n top: 0;\n left: 0;\n\n &.bvi-noscroll {\n overflow: hidden !important;\n }\n }\n\n .bvi-body {\n padding: 0 .5rem;\n\n @include loop-theme('white', $theme-bg-white, $theme-color-white);\n @include loop-theme('black', $theme-bg-black, $theme-color-black);\n @include loop-theme('blue', $theme-bg-blue, $theme-color-blue);\n @include loop-theme('brown', $theme-bg-brown, $theme-color-brown);\n @include loop-theme('green', $theme-bg-green, $theme-color-green);\n @include loop-size(40);\n\n &[data-bvi-images='true']:not(.bvi-no-styles) {\n .bvi-background-image:not(.bvi-no-styles),\n img.bvi-background-image:not(.bvi-no-styles),\n img.bvi-img:not(.bvi-no-styles) {\n -webkit-filter: grayscale(0);\n filter: grayscale(0);\n visibility: visible;\n }\n }\n\n &[data-bvi-images='false']:not(.bvi-no-styles) {\n .bvi-background-image:not(.bvi-no-styles),\n img.bvi-background-image:not(.bvi-no-styles),\n img.bvi-img:not(.bvi-no-styles) {\n display: none;\n position: relative;\n border: 1px dashed;\n }\n }\n\n &[data-bvi-images='grayscale']:not(.bvi-no-styles) {\n .bvi-background-image:not(.bvi-no-styles),\n img.bvi-background-image:not(.bvi-no-styles),\n img.bvi-img:not(.bvi-no-styles) {\n -moz-filter: url(\"data:image/svg+xml;utf8,#grayscale\");\n -o-filter: url(\"data:image/svg+xml;utf8,#grayscale\");\n -webkit-filter: grayscale(1);\n filter: url(\"data:image/svg+xml;utf8,#grayscale\");\n filter: url(\"data:image/svg+xml;utf8,#grayscale\");\n filter: grayscale(1);\n visibility: visible;\n }\n }\n\n &[data-bvi-lineheight='normal']:not(.bvi-no-styles) {\n line-height: 1.5 !important;\n }\n\n &[data-bvi-lineheight='average']:not(.bvi-no-styles) {\n line-height: 2 !important;\n }\n\n &[data-bvi-lineheight='big']:not(.bvi-no-styles) {\n line-height: 2.5 !important;\n }\n\n &[data-bvi-letterspacing='normal']:not(.bvi-no-styles) {\n letter-spacing: 0 !important;\n }\n\n &[data-bvi-letterspacing='average']:not(.bvi-no-styles) {\n letter-spacing: 2px !important;\n }\n\n &[data-bvi-letterspacing='big']:not(.bvi-no-styles) {\n letter-spacing: 4px !important;\n }\n\n &[data-bvi-fontfamily='arial']:not(i):not(span):not(.bvi-no-styles) {\n font-family: Arial, sans-serif !important;\n }\n\n &[data-bvi-fontfamily='times']:not(i):not(span):not(.bvi-no-styles) {\n font-family: \"Times New roman\", serif !important;\n }\n\n &[data-bvi-builtelements='true']:not(.bvi-no-styles) {\n .wp-audio-shortcode,\n iframe,\n object,\n video,\n ymaps,\n figure {\n display: block !important;\n }\n }\n\n &[data-bvi-builtelements='false']:not(.bvi-no-styles) {\n .wp-audio-shortcode,\n iframe,\n object,\n video,\n ymaps,\n figure {\n display: none !important;\n }\n }\n\n .bvi-speech {\n margin-bottom: 1.5rem;\n\n .bvi-speech-link {\n display: inline-block;\n border: 1px dashed transparent;\n border-bottom: 0;\n padding: .7rem;\n }\n\n .bvi-speech-text {\n border: 1px dashed transparent;\n padding: .7rem;\n }\n\n .bvi-highlighting {\n mark {\n font-weight: bold;\n text-decoration: underline;\n }\n }\n }\n\n a {\n &.bvi-link {\n display: inline-block;\n font-weight: 400;\n line-height: 1.5;\n font-size: 0.875rem !important;\n color: #212529 !important;\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: #e0e0e0 !important;\n border: 1px solid #c6c6c6 !important;\n padding: .375rem .75rem;\n border-radius: .25rem;\n position: relative;\n transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;\n\n &::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\";\n }\n }\n }\n\n .bvi-link-fixed-top {\n position: fixed !important;\n top: 2.5rem !important;\n right: 1.5rem !important;\n z-index: 999999 !important;\n }\n\n .bvi-hide {\n display: none !important;\n }\n\n .bvi-show {\n display: block !important;\n }\n }\n}\n","@mixin loop-size($counter) {\n @while $counter > 0 {\n &[data-bvi-fontsize='#{$counter}'] * {\n font-size: (0px + $counter) !important;\n\n h1,\n h1 * {\n font-size: (7px + $counter) !important;\n }\n\n h2,\n h2 * {\n font-size: (6px + $counter) !important;\n }\n\n h3,\n h3 * {\n font-size: (5px + $counter) !important;\n }\n\n h4,\n h4 * {\n font-size: (4px + $counter) !important;\n }\n\n h5,\n h5 * {\n font-size: (3px + $counter) !important;\n }\n\n h6,\n h6 * {\n font-size: (2px + $counter) !important;\n }\n }\n\n $counter: $counter - 1;\n }\n}\n\n@mixin loop-theme($name, $bg, $color) {\n &[data-bvi-theme='#{$name}']:not(.bvi-no-styles) {\n background-color: $bg !important;\n color: $color !important;\n fill: $color !important;\n border-color: $color !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n &[data-bvi-theme='#{$name}'] *:not(.bvi-no-styles) {\n background-color: $bg !important;\n color: $color !important;\n fill: $color !important;\n border-color: $color !important;\n box-shadow: none !important;\n text-shadow: none !important;\n\n .bvi-speech-link,\n .bvi-speech-text {\n border-color: $color;\n }\n\n .bvi-link:not(.bvi-no-styles) {\n color: $color !important;\n background-color: transparent !important;\n text-underline: none !important;\n outline: 0 !important;\n text-decoration: none !important;\n\n &.disabled {\n color: rgba(red($color), green($color), blue($color), 0.5) !important;\n border: 1px solid rgba(red($color), green($color), blue($color), 0.5) !important;\n pointer-events: none;\n cursor: no-drop;\n text-decoration: none !important;\n\n &:focus {\n color: rgba(red($color), green($color), blue($color), 0.5) !important;\n border: 1px solid rgba(red($color), green($color), blue($color), 0.5) !important;\n text-underline: none !important;\n text-decoration: none !important;\n }\n }\n\n &:hover {\n color: $bg !important;\n background-color: $color !important;\n text-underline: none !important;\n text-decoration: none !important;\n }\n\n &:focus {\n color: $color !important;\n background-color: $bg !important;\n text-underline: none !important;\n text-decoration: none !important;\n }\n }\n\n :checked:not(.bvi-no-styles),\n :default:not(.bvi-no-styles),\n :disabled:not(.bvi-no-styles),\n :empty:not(.bvi-no-styles),\n :enabled:not(.bvi-no-styles),\n :first-child:not(.bvi-no-styles),\n :first-of-type:not(.bvi-no-styles),\n :focus:not(.bvi-no-styles),\n :indeterminate:not(.bvi-no-styles),\n :hover:not(.bvi-no-styles),\n :last-child:not(.bvi-no-styles),\n :last-of-type:not(.bvi-no-styles),\n :link:not(.bvi-no-styles),\n :nth-last-child:not(.bvi-no-styles),\n :nth-last-of-type:not(.bvi-no-styles),\n :nth-of-type:not(.bvi-no-styles),\n :only-child:not(.bvi-no-styles),\n :only-of-type:not(.bvi-no-styles),\n :optional:not(.bvi-no-styles),\n :read-write:not(.bvi-no-styles),\n :required:not(.bvi-no-styles),\n :root:not(.bvi-no-styles),\n :target:not(.bvi-no-styles),\n :valid:not(.bvi-no-styles),\n :visited:not(.bvi-no-styles),\n :first-child:first-letter:not(.bvi-no-styles),\n :default:not(.bvi-no-styles) {\n background-color: $bg !important;\n box-shadow: none !important;\n text-shadow: none !important;\n border-color: $color !important;\n color: $color !important;\n fill: $color !important;\n }\n\n &::after:not(.bvi-no-styles) {\n background-color: rgba(255, 255, 255, 0) !important;\n color: $color !important;\n box-shadow: none !important;\n text-shadow: none !important;\n border-color: transparent !important;\n }\n\n &::before:not(.bvi-no-styles) {\n background-color: rgba(255, 255, 255, 0) !important;\n color: $color !important;\n box-shadow: none !important;\n text-shadow: none !important;\n border-color: transparent !important;\n }\n\n &::selection:not(.bvi-no-styles) {\n background-color: $color !important;\n color: $bg !important;\n }\n\n & a:not(.bvi-no-styles) {\n outline: 0 !important;\n color: $color !important;\n background-color: transparent !important;\n\n &.active {\n color: $color !important;\n background-color: $bg !important;\n }\n\n &:hover:not(.bvi-no-styles) {\n color: $bg !important;\n background-color: $color !important;\n\n &:after {\n background-color: rgba(255, 255, 255, 0) !important;\n color: $bg !important;\n border-color: transparent !important;\n }\n\n &:before {\n background-color: rgba(255, 255, 255, 0) !important;\n color: $bg !important;\n border-color: transparent !important;\n }\n }\n }\n\n & button:not(.bvi-no-styles),\n & input[type=\"submit\"]:not(.bvi-no-styles),\n & input[type=\"button\"]:not(.bvi-no-styles),\n & button[type=\"submit\"]:not(.bvi-no-styles),\n & button[type=\"button\"]:not(.bvi-no-styles) {\n color: $bg !important;\n background-color: $color !important;\n }\n\n & button:hover,\n & input[type=\"button\"]:hover:not(.bvi-no-styles),\n & input[type=\"submit\"]:hover:not(.bvi-no-styles),\n & button[type=\"submit\"]:hover:not(.bvi-no-styles),\n & button[type=\"button\"]:hover:not(.bvi-no-styles) {\n &.active {\n color: $bg !important;\n background-color: $color !important;\n }\n\n &:hover {\n color: $bg !important;\n background-color: $color !important;\n }\n }\n }\n}\n","// Variables\n\n// Panel\n$panel-color: #212529 !default;\n$panel-bg: #F5F5F5 !default;\n\n// Theme\n$theme-color-white: #000000;\n$theme-color-black: #ffffff;\n$theme-color-blue: #063462;\n$theme-color-brown: #4D4B43;\n$theme-color-green: #A9E44D;\n$theme-bg-white: #ffffff !default;\n$theme-bg-black: #000000 !default;\n$theme-bg-blue: #9DD1FF !default;\n$theme-bg-brown: #F7F3D6 !default;\n$theme-bg-green: #3B2716 !default;\n\n// Buttons\n$link-color: $panel-color !default;\n$link-bg: #f7f7f7 !default;\n$link-hover: #b6b6b6 !default;\n$link-border-color: #ADADAD !default;\n$link-active-color: $link-color !default;\n$link-active-bg: #b6b6b6 !default;\n",".bvi-images {\n width: 18px;\n height: 18px;\n letter-spacing: normal;\n display: inline-block;\n vertical-align: middle;\n z-index: 1;\n background-size: 100% 100%;\n -o-background-size: 100% 100%;\n -webkit-background-size: 100% 100%;\n\n &.bvi-images-cog {\n background-image: url(\"../img/cog.svg\");\n background-repeat: no-repeat;\n }\n\n &.bvi-images-eye-slash {\n background-image: url(\"../img/eye-slash.svg\");\n background-repeat: no-repeat;\n }\n\n &.bvi-images-volume-up {\n background-image: url(\"../img/volume-up.svg\");\n background-repeat: no-repeat;\n }\n\n &.bvi-images-volume-off {\n background-image: url(\"../img/volume-off.svg\");\n background-repeat: no-repeat;\n }\n\n &.bvi-images-adjust {\n background-image: url(\"../img/adjust.svg\");\n background-repeat: no-repeat;\n }\n\n &.bvi-images-minus-circle {\n background-image: url(\"../img/minus-circle.svg\");\n background-repeat: no-repeat;\n }\n\n &.bvi-images-image {\n background-image: url(\"../img/image.svg\");\n background-repeat: no-repeat;\n }\n\n &.bvi-images-minus {\n background-image: url(\"../img/minus.svg\");\n background-repeat: no-repeat;\n }\n\n &.bvi-images-eye {\n background-image: url(\"../img/eye.svg\");\n background-repeat: no-repeat;\n fill: green;\n }\n\n &.bvi-images-size-32 {\n width: 32px !important;\n height: 32px !important;\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/img/adjust.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/img/cog.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/img/eye-slash.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/img/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/img/image.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/img/minus-circle.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/img/minus.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/img/volume-off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/img/volume-up.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/js/bvi.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Button visually impaired - v1.0.0 https://bvi.isvek.ru 3 | * Copyright 2014-2021 Oleg Korotenko . 4 | * Licensed MIT (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 5 | */ 6 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).isvek=t()}(this,(function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n=0;--o){var a=this.tryEntries[o],c=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),s=r.call(a,"finallyLoc");if(l&&s){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),A(n),b}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var r=i.arg;A(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,n,i){return this.delegate={iterator:x(e),resultName:n,nextLoc:i},"next"===this.method&&(this.arg=t),b}},e}({});try{regeneratorRuntime=t}catch(e){"object"===("undefined"==typeof globalThis?"undefined":n(globalThis))?globalThis.regeneratorRuntime=t:Function("r","regeneratorRuntime = r")(t)}}(),[Element.prototype,Document.prototype,DocumentFragment.prototype].forEach((function(e){e.hasOwnProperty("prepend")||Object.defineProperty(e,"prepend",{configurable:!0,enumerable:!0,writable:!0,value:function(){var e=Array.prototype.slice.call(arguments),t=document.createDocumentFragment();e.forEach((function(e){var n=e instanceof Node;t.appendChild(n?e:document.createTextNode(String(e)))})),this.insertBefore(t,this.firstChild)}})})),window.NodeList&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=Array.prototype.forEach),window.HTMLCollection&&!HTMLCollection.prototype.forEach&&(HTMLCollection.prototype.forEach=Array.prototype.forEach);var l=function(e){switch(e){case"on":case"true":case"1":return!0;default:return!1}},s=function(e,t,n){for("string"==typeof t&&(t=document.createElement(t)),e.appendChild(t).className=n;e.firstChild!==t;)t.appendChild(e.firstChild)},u=function(e){var t=document.createDocumentFragment();if(e){for(;e.firstChild;){var n=e.removeChild(e.firstChild);t.appendChild(n)}e.parentNode.replaceChild(t,e)}},v=function(e,t){Object.keys(e).forEach((function(e){"function"==typeof t&&t(e)}))},f=function(e,t){Array.from(e).forEach((function(e){"function"==typeof t&&t(e)}))},h=function(){return window.speechSynthesis},d=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=new Date,i=n.getTime();i+=864e5,n.setTime(i),document.cookie="bvi_".concat(e,"=").concat(t,";path=/;expires=").concat(n.toUTCString(),";domain=").concat(location.host)},m=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";e="bvi_".concat(e,"=");for(var t=decodeURIComponent(document.cookie),n=t.split(";"),i=0;i0&&void 0!==arguments[0]?arguments[0]:"";document.cookie="bvi_".concat(e,"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;domain=").concat(location.host)},g={"ru-RU":{text:{fontSize:"Размер шрифта",siteColors:"Цвета сайта",images:"Изображения",speech:"Синтез речи",settings:"Настройки",regularVersionOfTheSite:"Обычная версия сайта",letterSpacing:"Межбуквенное расстояние",normal:"Стандартный",average:"Средний",big:"Большой",lineHeight:"Межстрочный интервал",font:"Шрифт",arial:"Без засечек",times:"С засечками",builtElements:"Встроенные элементы (Видео, карты и тд.)",on:"Включить",off:"Выключить",reset:"Сбросить настройки",plural_0:"пиксель",plural_1:"пекселя",plural_2:"пикселей"},voice:{fontSizePlus:"Размер шрифта увели́чен",fontSizeMinus:"Размер шрифта уме́ньшен",siteColorBlackOnWhite:"Цвет сайта черным по белому",siteColorWhiteOnBlack:"Цвет сайта белым по черному",siteColorDarkBlueOnBlue:"Цвет сайта тёмно-синим по голубому",siteColorBeigeBrown:"Цвет сайта кори́чневым по бе́жевому",siteColorGreenOnDarkBrown:"Цвет сайта зеленым по тёмно-коричневому",imagesOn:"Изображения включены",imagesOFF:"Изображения выключены",imagesGrayscale:"Изображения чёрно-белые",speechOn:"Синтез речи включён",speechOff:"Синтез речи вы́ключен",lineHeightNormal:"Межстрочный интервал стандартный",lineHeightAverage:"Межстрочный интервал средний",lineHeightBig:"Межстрочный интервал большой",LetterSpacingNormal:"Интервал между буквами стандартный",LetterSpacingAverage:"Интервал между буквами средний",LetterSpacingBig:"Интервал между буквами большой",fontArial:"Шрифт без засечек",fontTimes:"Шрифт с засечками",builtElementsOn:"Встроенные элементы включены",builtElementsOFF:"Встроенные элементы выключены",resetSettings:"Установлены настройки по умолча́нию",panelShow:"Панель открыта",panelHide:"Панель скрыта",panelOn:"Версия сайта для слабови́дящий",panelOff:"Обычная версия сайта"}},"en-US":{text:{fontSize:"Font size",siteColors:"Site colors",images:"Images",speech:"Speech synthesis",settings:"Settings",regularVersionOfTheSite:"Regular version Of The site",letterSpacing:"Letter spacing",normal:"Single",average:"One and a half",big:"Double",lineHeight:"Line spacing",font:"Font",arial:"Sans Serif - Arial",times:"Serif - Times New Roman",builtElements:"Include inline elements (Videos, maps, etc.)",on:"Enable",off:"Disabled",reset:"Reset settings",plural_0:"pixel",plural_1:"pixels",plural_2:"pixels"},voice:{fontSizePlus:"Font size increased",fontSizeMinus:"Font size reduced",siteColorBlackOnWhite:"Site color black on white",siteColorWhiteOnBlack:"Site color white on black",siteColorDarkBlueOnBlue:"Site color dark blue on cyan",siteColorBeigeBrown:"SiteColorBeigeBrown",siteColorGreenOnDarkBrown:"Site color green on dark brown",imagesOn:"Images enable",imagesOFF:"Images disabled",imagesGrayscale:"Images gray scale",speechOn:"Synthesis speech enable",speechOff:"Synthesis speech disabled",lineHeightNormal:"Line spacing single",lineHeightAverage:"Line spacing one and a half",lineHeightBig:"Line spacing double",LetterSpacingNormal:"Letter spacing single",LetterSpacingAverage:"Letter spacing one and a half",LetterSpacingBig:"Letter spacing letter double",fontArial:"Sans Serif - Arial",fontTimes:"Serif - Times New Roman",builtElementsOn:"Include inline elements are enabled",builtElementsOFF:"Include inline elements are disabled",resetSettings:"Default settings have been set",panelShow:"Panel show",panelHide:"Panel hide",panelOn:"Site version for visually impaired",panelOff:"Regular version of the site"}}},p=function(){function e(t){i(this,e),this._config=t}return o(e,[{key:"t",value:function(e){return g[this._config.lang].text[e]}},{key:"v",value:function(e){return g[this._config.lang].voice[e]}}]),e}(),y={target:".bvi-open",fontSize:16,theme:"white",images:"grayscale",letterSpacing:"normal",lineHeight:"normal",speech:!0,fontFamily:"arial",builtElements:!1,panelFixed:!0,panelHide:!1,reload:!1,lang:"ru-RU"},S={target:"string",fontSize:"number",theme:"string",images:"(string|boolean)",letterSpacing:"string",lineHeight:"string",speech:"boolean",fontFamily:"string",builtElements:"boolean",panelFixed:"boolean",panelHide:"boolean",reload:"boolean",lang:"string"},_={target:"",fontSize:"(^[1-9]$|^[1-3][0-9]?$|^39$)",theme:"(white|black|blue|brown|green)",images:"(true|false|grayscale)",letterSpacing:"(normal|average|big)",lineHeight:"(normal|average|big)",speech:"(true|false)",fontFamily:"(arial|times)",builtElements:"(true|false)",panelFixed:"(true|false)",panelHide:"(true|false)",reload:"(true|false)",lang:"(ru-RU|en-US)"};return{Bvi:function(){function e(t){i(this,e),this._config=this._getConfig(t),this._elements=document.querySelectorAll(this._config.target),this._i18n=new p({lang:this._config.lang}),this._addEventListeners(),this._init(),console.log("Bvi console: ready Button visually impaired v1.0.0")}return o(e,[{key:"_init",value:function(){v(this._config,(function(e){void 0===m(e)&&b("panelActive")})),l(m("panelActive"))?(this._set(),this._getPanel(),this._addEventListenersPanel(),this._images(),this._speechPlayer(),"speechSynthesis"in window&&l(m("speech"))&&setInterval((function(){if(!1===h().pending){var e=document.querySelectorAll(".bvi-speech-play"),t=document.querySelectorAll(".bvi-speech-pause"),n=document.querySelectorAll(".bvi-speech-resume"),i=document.querySelectorAll(".bvi-speech-stop"),r=function(e,t){e.forEach((function(e){return t(e)}))};r(e,(function(e){return e.classList.remove("disabled")})),r(t,(function(e){return e.classList.add("disabled")})),r(n,(function(e){return e.classList.add("disabled")})),r(i,(function(e){return e.classList.add("disabled")}))}}),1e3)):this._remove()}},{key:"_addEventListeners",value:function(){var e=this;if(!this._elements)return!1;this._elements.forEach((function(t){t.addEventListener("click",(function(t){t.preventDefault(),v(e._config,(function(t){return d(t,e._config[t])})),d("panelActive",!0),e._init(),e._speech("".concat(e._i18n.v("panelOn")))}))}))}},{key:"_addEventListenersPanel",value:function(){var e=this,t={fontSizeMinus:document.querySelector(".bvi-fontSize-minus"),fontSizePlus:document.querySelector(".bvi-fontSize-plus"),themeWhite:document.querySelector(".bvi-theme-white"),themeBlack:document.querySelector(".bvi-theme-black"),themeBlue:document.querySelector(".bvi-theme-blue"),themeBrown:document.querySelector(".bvi-theme-brown"),themeGreen:document.querySelector(".bvi-theme-green"),imagesOn:document.querySelector(".bvi-images-on"),imagesOff:document.querySelector(".bvi-images-off"),imagesGrayscale:document.querySelector(".bvi-images-grayscale"),speechOn:document.querySelector(".bvi-speech-on"),speechOff:document.querySelector(".bvi-speech-off"),lineHeightNormal:document.querySelector(".bvi-line-height-normal"),lineHeightAverage:document.querySelector(".bvi-line-height-average"),lineHeightBig:document.querySelector(".bvi-line-height-big"),letterSpacingNormal:document.querySelector(".bvi-letter-spacing-normal"),letterSpacingAverage:document.querySelector(".bvi-letter-spacing-average"),letterSpacingBig:document.querySelector(".bvi-letter-spacing-big"),fontFamilyArial:document.querySelector(".bvi-font-family-arial"),fontFamilyTimes:document.querySelector(".bvi-font-family-times"),builtElementsOn:document.querySelector(".bvi-built-elements-on"),builtElementsOff:document.querySelector(".bvi-built-elements-off"),reset:document.querySelector(".bvi-reset"),links:document.querySelectorAll(".bvi-link"),modal:document.querySelector(".bvi-modal")},n=function(e){var t,n=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw o}}}}(e.parentNode.children);try{for(n.s();!(t=n.n()).done;)t.value.classList.remove("active")}catch(e){n.e(e)}finally{n.f()}e.classList.add("active")},i=function(e,t){e.addEventListener("click",(function(e){e.preventDefault(),"function"==typeof t&&t(e)}))},r=function(){document.querySelectorAll(".bvi-link").forEach((function(e){e.classList.remove("active")})),v(e._config,(function(e){if("theme"===e){var t=m(e);document.querySelector(".bvi-theme-".concat(t)).classList.add("active")}if("images"===e){var n="grayscale"===m(e)?"grayscale":l(m(e))?"on":"off";document.querySelector(".bvi-images-".concat(n)).classList.add("active")}if("speech"===e){var i=l(m(e))?"on":"off";document.querySelector(".bvi-speech-".concat(i)).classList.add("active")}if("lineHeight"===e){var r=m(e);document.querySelector(".bvi-line-height-".concat(r)).classList.add("active")}if("letterSpacing"===e){var o=m(e);document.querySelector(".bvi-letter-spacing-".concat(o)).classList.add("active")}if("fontFamily"===e){var a=m(e);document.querySelector(".bvi-font-family-".concat(a)).classList.add("active")}if("builtElements"===e){var c=l(m(e))?"on":"off";document.querySelector(".bvi-built-elements-".concat(c)).classList.add("active")}}))};r(),i(t.fontSizeMinus,(function(){var i=parseFloat(m("fontSize"))-1;0!==i&&(e._setAttrDataBviBody("fontSize",i),d("fontSize",i),e._speech("".concat(e._i18n.v("fontSizeMinus"))),n(t.fontSizeMinus))})),i(t.fontSizePlus,(function(){var i=parseFloat(m("fontSize"))+1;40!==i&&(e._setAttrDataBviBody("fontSize",i),d("fontSize",i),e._speech("".concat(e._i18n.v("fontSizePlus"))),n(t.fontSizePlus))})),i(t.themeWhite,(function(){e._setAttrDataBviBody("theme","white"),d("theme","white"),e._speech("".concat(e._i18n.v("siteColorBlackOnWhite"))),n(t.themeWhite)})),i(t.themeBlack,(function(){e._setAttrDataBviBody("theme","black"),d("theme","black"),e._speech("".concat(e._i18n.v("siteColorWhiteOnBlack"))),n(t.themeBlack)})),i(t.themeBlue,(function(){e._setAttrDataBviBody("theme","blue"),d("theme","blue"),e._speech("".concat(e._i18n.v("siteColorDarkBlueOnBlue"))),n(t.themeBlue)})),i(t.themeBrown,(function(){e._setAttrDataBviBody("theme","brown"),d("theme","brown"),e._speech("".concat(e._i18n.v("siteColorBeigeBrown"))),n(t.themeBrown)})),i(t.themeGreen,(function(){e._setAttrDataBviBody("theme","green"),d("theme","green"),e._speech("".concat(e._i18n.v("siteColorGreenOnDarkBrown"))),n(t.themeGreen)})),i(t.imagesOn,(function(){e._setAttrDataBviBody("images","true"),d("images","true"),e._speech("".concat(e._i18n.v("imagesOn"))),n(t.imagesOn)})),i(t.imagesOff,(function(){e._setAttrDataBviBody("images","false"),d("images","false"),e._speech("".concat(e._i18n.v("imagesOFF"))),n(t.imagesOff)})),i(t.imagesGrayscale,(function(){e._setAttrDataBviBody("images","grayscale"),d("images","grayscale"),e._speech("".concat(e._i18n.v("imagesGrayscale"))),n(t.imagesGrayscale)})),i(t.speechOn,(function(){e._setAttrDataBviBody("speech","true"),d("speech","true"),e._speech("".concat(e._i18n.v("speechOn"))),n(t.speechOn),e._speechPlayer()})),i(t.speechOff,(function(){e._speech("".concat(e._i18n.v("speechOff"))),e._setAttrDataBviBody("speech","false"),d("speech","false"),n(t.speechOff),e._speechPlayer()})),i(t.lineHeightNormal,(function(){e._setAttrDataBviBody("lineHeight","normal"),d("lineHeight","normal"),e._speech("".concat(e._i18n.v("lineHeightNormal"))),n(t.lineHeightNormal)})),i(t.lineHeightAverage,(function(){e._setAttrDataBviBody("lineHeight","average"),d("lineHeight","average"),e._speech("".concat(e._i18n.v("lineHeightAverage"))),n(t.lineHeightAverage)})),i(t.lineHeightBig,(function(){e._setAttrDataBviBody("lineHeight","big"),d("lineHeight","big"),e._speech("".concat(e._i18n.v("lineHeightBig"))),n(t.lineHeightBig)})),i(t.letterSpacingNormal,(function(){e._setAttrDataBviBody("letterSpacing","normal"),d("letterSpacing","normal"),e._speech("".concat(e._i18n.v("LetterSpacingNormal"))),n(t.letterSpacingNormal)})),i(t.letterSpacingAverage,(function(){e._setAttrDataBviBody("letterSpacing","average"),d("letterSpacing","average"),e._speech("".concat(e._i18n.v("LetterSpacingAverage"))),n(t.letterSpacingAverage)})),i(t.letterSpacingBig,(function(){e._setAttrDataBviBody("letterSpacing","big"),d("letterSpacing","big"),e._speech("".concat(e._i18n.v("LetterSpacingBig"))),n(t.letterSpacingBig)})),i(t.fontFamilyArial,(function(){e._setAttrDataBviBody("fontFamily","arial"),d("fontFamily","arial"),e._speech("".concat(e._i18n.v("fontArial"))),n(t.fontFamilyArial)})),i(t.fontFamilyTimes,(function(){e._setAttrDataBviBody("fontFamily","times"),d("fontFamily","times"),e._speech("".concat(e._i18n.v("fontTimes"))),n(t.fontFamilyTimes)})),i(t.builtElementsOn,(function(){e._setAttrDataBviBody("builtElements","true"),d("builtElements","true"),e._speech("".concat(e._i18n.v("builtElementsOn"))),n(t.builtElementsOn)})),i(t.builtElementsOff,(function(){e._setAttrDataBviBody("builtElements","false"),d("builtElements","false"),e._speech("".concat(e._i18n.v("builtElementsOFF"))),n(t.builtElementsOff)})),i(t.reset,(function(){e._speech("".concat(e._i18n.v("resetSettings"))),v(e._config,(function(t){e._setAttrDataBviBody(t,e._config[t]),d(t,e._config[t]),r()}))})),f(t.links,(function(n){i(n,(function(n){var i=n.target.getAttribute("data-bvi");"close"===i&&(e._setAttrDataBviBody("panelActive","false"),d("panelActive","false"),e._init()),"modal"===i&&(document.body.style.overflow="hidden",document.body.classList.add("bvi-noscroll"),t.modal.classList.toggle("show")),"modal-close"===i&&(document.body.classList.remove("bvi-noscroll"),document.body.style.overflow="",t.modal.classList.remove("show")),"panel-hide"===i&&(document.querySelector(".bvi-panel").classList.add("bvi-panel-hide"),document.querySelector(".bvi-link-fixed-top").classList.remove("bvi-hide"),document.querySelector(".bvi-link-fixed-top").classList.add("bvi-show"),d("panelHide","true"),e._speech("".concat(e._i18n.v("panelHide")))),"panel-show"===i&&(document.querySelector(".bvi-link-fixed-top").classList.remove("bvi-show"),document.querySelector(".bvi-link-fixed-top").classList.add("bvi-hide"),document.querySelector(".bvi-panel").classList.remove("bvi-panel-hide"),d("panelHide","false"),e._speech("".concat(e._i18n.v("panelShow"))))}))})),i(t.modal,(function(e){e.target.contains(t.modal)&&(document.body.classList.remove("bvi-noscroll"),document.body.style.overflow="",t.modal.classList.remove("show"))}))}},{key:"_getPanel",value:function(){var e=function(){var e=void 0!==window.pageYOffset?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop;l(m("panelFixed"))&&(e>200?document.querySelector(".bvi-panel").classList.add("bvi-fixed-top"):document.querySelector(".bvi-panel").classList.remove("bvi-fixed-top"))},t=l(m("panelHide"))?" bvi-panel-hide":"",n=l(m("panelHide"))?"bvi-show":" bvi-hide",i="\n
\n
\n
\n
').concat(this._i18n.t("fontSize"),'
\n А-\n А+\n
\n
\n
').concat(this._i18n.t("siteColors"),'
\n Ц\n Ц\n Ц\n Ц\n Ц\n
\n
\n
').concat(this._i18n.t("images"),'
\n \n \n \n \n \n \n \n \n \n
\n
\n
').concat(this._i18n.t("speech"),'
\n \n \n \n \n \n \n
\n
\n
').concat(this._i18n.t("settings"),'
\n \n \n \n \n ').concat(this._i18n.t("regularVersionOfTheSite"),'\n \n \n \n \n
\n
\n
\n
\n
\n
\n
').concat(this._i18n.t("settings"),'
\n ×\n
\n
\n
\n \n \n
\n
').concat(this._i18n.t("font"),'
\n ').concat(this._i18n.t("arial"),'\n ').concat(this._i18n.t("times"),'\n
\n
\n
').concat(this._i18n.t("builtElements"),'
\n ').concat(this._i18n.t("on"),'\n ').concat(this._i18n.t("off"),'\n
\n
\n \n
\n \n
\n
\n
\n
"),r='')+'';window.addEventListener("scroll",e),document.querySelector(".bvi-body").insertAdjacentHTML("beforebegin",i),document.querySelector(".bvi-body").insertAdjacentHTML("afterbegin",r),e()}},{key:"_set",value:function(){var e=this;document.body.classList.add("bvi-active"),s(document.body,"div","bvi-body"),v(this._config,(function(t){return e._setAttrDataBviBody(t,m(t))})),f(this._elements,(function(e){return e.style.display="none"})),document.querySelectorAll("img").forEach((function(e){e.classList.contains("bvi-img")&&e.classList.remove("bvi-img")})),document.querySelectorAll("body *").forEach((function(e){e.classList.contains("bvi-background-image")&&e.classList.remove("bvi-background-image")}))}},{key:"_remove",value:function(){var e=document.querySelector(".bvi-panel"),t=document.querySelector(".bvi-body"),n=document.querySelector(".bvi-link-fixed-top");e&&e.remove(),t&&u(t),n&&n.remove(),this._speech("".concat(this._i18n.v("panelOff"))),document.body.classList.remove("bvi-active"),f(this._elements,(function(e){return e.style.display=""})),l(m("reload"))&&document.location.reload(),v(this._config,(function(e){b(e)})),this._speechPlayer(),b("panelActive")}},{key:"_images",value:function(){document.querySelectorAll("img").forEach((function(e){e.classList.contains("bvi-no-style")||e.classList.add("bvi-img")})),document.querySelectorAll(".bvi-body *").forEach((function(e){var t=getComputedStyle(e);"none"===t.backgroundImage||"none"===t.background||e.classList.contains("bvi-no-style")||e.classList.add("bvi-background-image")}))}},{key:"_getConfig",value:function(e){e=t(t({},y),e);var i={};for(var r in y)i[r]=e[r];return function(e,t,i){Object.keys(t).forEach((function(i){var r,o=t[i],a=e[i],c=a&&(r=a)&&"object"===n(r)&&void 0!==r.nodeType?"element":function(e){return null==e?"".concat(e):{}.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase()}(a);if(!new RegExp(o).test(c))throw new TypeError('Bvi console: Опция "'.concat(i,'" предоставленный тип "').concat(c,'", ожидаемый тип "').concat(o,'".'))})),Object.keys(i).forEach((function(t){var n=i[t],r=e[t];if(!new RegExp(n).test(r))throw new TypeError('Bvi console: Опция "'.concat(t,'" параметр "').concat(r,'", ожидаемый параметр "').concat(n,'".'))}))}(i,S,_),i}},{key:"_setAttrDataBviBody",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";document.querySelector(".bvi-body").setAttribute("data-bvi-".concat(e),t)}},{key:"_speechPlayer",value:function(){var e=this,t=document.querySelectorAll(".bvi-speech-text"),n=document.querySelectorAll(".bvi-speech-link"),i=document.querySelectorAll(".bvi-speech");if("speechSynthesis"in window&&l(m("speech"))){if(i){t&&t.forEach((function(e){return u(e)})),n&&n.forEach((function(e){return e.remove()})),i.forEach((function(e,t){var n="bvi-speech-text-id-".concat(t+1);s(e,"div","bvi-speech-text ".concat(n)),e.insertAdjacentHTML("afterbegin",'\n ')}));var r=document.querySelectorAll(".bvi-speech-play"),o=document.querySelectorAll(".bvi-speech-pause"),a=document.querySelectorAll(".bvi-speech-resume"),c=document.querySelectorAll(".bvi-speech-stop"),v=function(e,t){e.forEach((function(e){e.addEventListener("click",(function(n){if(n.preventDefault(),"function"==typeof t)return t(e,n)}),!1)}))};v(r,(function(t,n){var i=n.target,r=i.parentNode.nextElementSibling,o=n.target.closest(".bvi-speech-link"),a=document.querySelectorAll(".bvi-speech-play"),c=document.querySelectorAll(".bvi-speech-pause"),l=document.querySelectorAll(".bvi-speech-resume"),s=document.querySelectorAll(".bvi-speech-stop");e._speech(r.textContent,r,!0),a.forEach((function(e){return e.classList.remove("disabled")})),c.forEach((function(e){return e.classList.add("disabled")})),l.forEach((function(e){return e.classList.add("disabled")})),s.forEach((function(e){return e.classList.add("disabled")})),i.classList.add("disabled"),o.querySelector(".bvi-speech-pause").classList.remove("disabled"),o.querySelector(".bvi-speech-stop").classList.remove("disabled")})),v(o,(function(e,t){var n=t.target,i=t.target.closest(".bvi-speech-link");n.classList.add("disabled"),i.querySelector(".bvi-speech-resume").classList.remove("disabled"),h().pause()})),v(a,(function(e,t){var n=t.target,i=t.target.closest(".bvi-speech-link");n.classList.add("disabled"),i.querySelector(".bvi-speech-pause").classList.remove("disabled"),h().resume()})),v(c,(function(e,t){var n=t.target,i=t.target.closest(".bvi-speech-link");n.classList.add("disabled"),i.querySelector(".bvi-speech-pause").classList.add("disabled"),i.querySelector(".bvi-speech-play").classList.remove("disabled"),h().cancel()}))}}else t&&t.forEach((function(e){return u(e)})),n&&n.forEach((function(e){return e.remove()}))}},{key:"_speech",value:function(e,t){var n=this,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("speechSynthesis"in window&&l(m("speech"))){h().cancel();for(var r=function(e,t){e=String(e),t=Number(t)>>>0;var n=e.slice(0,t+1).search(/\S+$/),i=e.slice(t).search(/\s/);return i<0?e.slice(n):e.slice(n,i+t)},o=120,a=new RegExp("^[\\s\\S]{"+Math.floor(o/2)+","+o+"}[.!?,]{1}|^[\\s\\S]{1,"+o+"}$|^[\\s\\S]{1,"+o+"} "),c=[],s=e,u=h().getVoices();s.length>0;)c.push(s.match(a)[0]),s=s.substring(c[c.length-1].length);c.forEach((function(e){var o=new SpeechSynthesisUtterance(e.trim());o.volume=1,o.rate=1,o.pitch=1,o.lang=n._config.lang;for(var a=0;a]+>)*$1(<[^>]+>)*)"),a=new RegExp("("+o+")","gi");i=(i=i.replace(a,"$1")).replace(/([^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/,"$1$2$4"),t.innerHTML=i},o.onend=function(e){t.classList.remove("bvi-highlighting");var n=t.textContent;n=n.replace(/($1<\/mark>)/,"$1"),t.innerHTML=n}),h().speak(o)}))}}}]),e}()}})); 7 | //# sourceMappingURL=bvi.min.js.map -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bvi", 3 | "version": "1.0.0", 4 | "description": "Button visually impaired - is a plugin that automatically changes the visually impaired version of your site. The panel on the site for the visually impaired allows the color scheme of the site, font sizes, the synthesizer reads aloud settings changes. Thanks to it, you can use the functions of the site that meet the needs of people with disabilities.", 5 | "license": "MIT", 6 | "type": "module", 7 | "homepage": "https://bvi.isvek.ru", 8 | "author": "Oleg Korotenko ", 9 | "style": "dist/css/bvi.min.css", 10 | "sass": "src/scss/bvi.scss", 11 | "main": "dist/js/bvi.min.js", 12 | "unpkg": "dist/js/bvi.js", 13 | "scripts": { 14 | "rollup": "rollup -c", 15 | "css": "npm-run-all --parallel css-compile css-minify", 16 | "css-compile": "sass --style expanded src/scss/bvi.scss --source-map dist/css/bvi.css", 17 | "css-minify": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/css/ --batch --batch-suffix \".min\" \"dist/css/*.css\" \"!dist/css/*.min.css\"", 18 | "js": "npm-run-all --parallel js-compile js-minify-umd", 19 | "js-compile": "rollup --config rollup.config.js --sourcemap", 20 | "js-lint": "eslint src/js/**/*.js", 21 | "js-lint:fix": "eslint src/js/**/*.js --fix", 22 | "js-minify-umd": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/bvi.js.map,includeSources,url=bvi.min.js.map\" --output dist/js/bvi.min.js dist/js/bvi.js", 23 | "js-minify-esm": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/bvi.esm.js.map,includeSources,url=bvi.esm.min.js.map\" --output dist/js/bvi.esm.min.js dist/js/bvi.esm.js", 24 | "watch-js": "nodemon --watch src/js/ --ext js --exec \"npm-run-all js-compile js-minify-umd\"", 25 | "watch-css": "nodemon --watch src/scss/ --ext scss --exec \"npm-run-all css-compile\"" 26 | }, 27 | "files": [ 28 | "dist/{css,js}/*.{css,js,map}", 29 | "src/{js,scss}/*.{js,scss,map}" 30 | ], 31 | "keywords": [ 32 | "accessibility", 33 | "accessible", 34 | "bvi", 35 | "Button visually impaired", 36 | "visually impaired" 37 | ], 38 | "repository": { 39 | "type": "git", 40 | "url": "https://github.com/veks/button-visually-impaired-javascript.git" 41 | }, 42 | "bugs": { 43 | "url": "https://github.com/veks/button-visually-impaired-javascript/issues" 44 | }, 45 | "devDependencies": { 46 | "@babel/core": "^7.14.5", 47 | "@babel/plugin-syntax-dynamic-import": "^7.8.3", 48 | "@babel/plugin-transform-object-assign": "^7.14.5", 49 | "@babel/plugin-transform-runtime": "^7.14.5", 50 | "@babel/preset-env": "^7.14.5", 51 | "@rollup/plugin-commonjs": "^19.0.0", 52 | "@rollup/plugin-node-resolve": "^13.0.0", 53 | "babel-plugin-array-includes": "^2.0.3", 54 | "clean-css-cli": "^5.3.0", 55 | "eslint": "^7.28.0", 56 | "nodemon": "^2.0.7", 57 | "npm-run-all": "^4.1.5", 58 | "postcss": "^8.3.3", 59 | "postcss-cli": "^8.3.1", 60 | "rollup": "^2.51.2", 61 | "rollup-plugin-babel": "^4.4.0", 62 | "rollup-plugin-node-polyfills": "^0.2.1", 63 | "rollup-plugin-replace": "^2.2.0", 64 | "rollup-plugin-terser": "^7.0.2", 65 | "sass": "^1.34.1" 66 | }, 67 | "dependencies": { 68 | "core-js": "^3.14.0", 69 | "regenerator-runtime": "^0.13.7" 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | import babel from 'rollup-plugin-babel' 4 | import commonjs from '@rollup/plugin-commonjs' 5 | import replace from 'rollup-plugin-replace' 6 | import {nodeResolve} from '@rollup/plugin-node-resolve' 7 | import nodePolyfills from 'rollup-plugin-node-polyfills' 8 | import {version, homepage, author, license} from './package.json' 9 | 10 | const path = require('path') 11 | const production = !process.env.ROLLUP_WATCH 12 | const name = 'bvi' 13 | const banner = `/*! 14 | * Button visually impaired - v${version} ${homepage} 15 | * Copyright 2014-${new Date().getFullYear()} ${author}. 16 | * Licensed ${license} (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 17 | */` 18 | 19 | export default { 20 | input: path.resolve(__dirname, 'src/js/index.umd.js'), 21 | output: { 22 | banner, 23 | name: 'isvek', 24 | file: path.resolve(__dirname, `dist/js/${name}.js`), 25 | format: 'umd', 26 | }, 27 | plugins: [ 28 | nodePolyfills(), 29 | nodeResolve({ 30 | browser: true, 31 | preferBuiltins: true, 32 | jsnext: true, 33 | main: true, 34 | brower: true, 35 | }), 36 | commonjs({ 37 | include: 'node_modules/**', 38 | }), 39 | babel({ 40 | exclude: 'node_modules/**', 41 | babelrc: false, 42 | presets: [ 43 | [ 44 | '@babel/preset-env', 45 | { 46 | modules: false, 47 | targets: { 48 | browsers: '> 0.5%, ie >= 9', 49 | }, 50 | useBuiltIns: 'entry', 51 | corejs: 3, 52 | debug: true, 53 | }, 54 | ], 55 | ], 56 | }), 57 | replace({ 58 | 'process.env': production ? '"production"' : '"dev"', 59 | }), 60 | ], 61 | } 62 | -------------------------------------------------------------------------------- /src/js/bvi.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Button visually impaired (v1.0.0): bvi.js 4 | * Licensed under MIT (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import { 9 | checkConfig, 10 | stringToBoolean, 11 | wrapInner, 12 | unwrap, 13 | getObject, 14 | getArray, 15 | synth, 16 | } from './util' 17 | 18 | import { 19 | setCookie, 20 | getCookie, 21 | removeCookie, 22 | } from './util/cookie' 23 | import I18n from './i18n' 24 | 25 | /** 26 | * ------------------------------------------------------------------------ 27 | * Constants 28 | * ------------------------------------------------------------------------ 29 | */ 30 | 31 | const Default = { 32 | target: '.bvi-open', 33 | fontSize: 16, 34 | theme: 'white', 35 | images: 'grayscale', 36 | letterSpacing: 'normal', 37 | lineHeight: 'normal', 38 | speech: true, 39 | fontFamily: 'arial', 40 | builtElements: false, 41 | panelFixed: true, 42 | panelHide: false, 43 | reload: false, 44 | lang: 'ru-RU', 45 | } 46 | 47 | const DefaultType = { 48 | target: 'string', 49 | fontSize: 'number', 50 | theme: 'string', 51 | images: '(string|boolean)', 52 | letterSpacing: 'string', 53 | lineHeight: 'string', 54 | speech: 'boolean', 55 | fontFamily: 'string', 56 | builtElements: 'boolean', 57 | panelFixed: 'boolean', 58 | panelHide: 'boolean', 59 | reload: 'boolean', 60 | lang: 'string', 61 | } 62 | 63 | const DefaultOptions = { 64 | target: '', 65 | fontSize: '(^[1-9]$|^[1-3][0-9]?$|^39$)', 66 | theme: '(white|black|blue|brown|green)', 67 | images: '(true|false|grayscale)', 68 | letterSpacing: '(normal|average|big)', 69 | lineHeight: '(normal|average|big)', 70 | speech: '(true|false)', 71 | fontFamily: '(arial|times)', 72 | builtElements: '(true|false)', 73 | panelFixed: '(true|false)', 74 | panelHide: '(true|false)', 75 | reload: '(true|false)', 76 | lang: '(ru-RU|en-US)', 77 | } 78 | 79 | /** 80 | * ------------------------------------------------------------------------ 81 | * Class Definition 82 | * ------------------------------------------------------------------------ 83 | */ 84 | class Bvi { 85 | constructor(options) { 86 | this._config = this._getConfig(options) 87 | this._elements = document.querySelectorAll(this._config.target) 88 | this._i18n = new I18n({ 89 | lang: this._config.lang 90 | }) 91 | 92 | this._addEventListeners() 93 | this._init() 94 | 95 | console.log('Bvi console: ready Button visually impaired v1.0.0') 96 | } 97 | 98 | // Private 99 | 100 | _init() { 101 | getObject(this._config, key => { 102 | if (typeof getCookie(key) === 'undefined') { 103 | removeCookie('panelActive') 104 | } 105 | }) 106 | 107 | if (stringToBoolean(getCookie('panelActive'))) { 108 | this._set() 109 | this._getPanel() 110 | this._addEventListenersPanel() 111 | this._images() 112 | this._speechPlayer() 113 | 114 | if ('speechSynthesis' in window && stringToBoolean(getCookie('speech'))) { 115 | 116 | setInterval(() => { 117 | if (synth().pending === false) { 118 | let play = document.querySelectorAll('.bvi-speech-play') 119 | let pause = document.querySelectorAll('.bvi-speech-pause') 120 | let resume = document.querySelectorAll('.bvi-speech-resume') 121 | let stop = document.querySelectorAll('.bvi-speech-stop') 122 | const el = (elements, callback) => { 123 | elements.forEach(element => { 124 | return callback(element) 125 | }) 126 | } 127 | 128 | el(play, element => element.classList.remove('disabled')) 129 | el(pause, element => element.classList.add('disabled')) 130 | el(resume, element => element.classList.add('disabled')) 131 | el(stop, element => element.classList.add('disabled')) 132 | } 133 | }, 1000) 134 | } 135 | 136 | } else { 137 | this._remove() 138 | } 139 | } 140 | 141 | _addEventListeners() { 142 | if (!this._elements) { 143 | return false 144 | } 145 | 146 | this._elements.forEach(element => { 147 | element.addEventListener('click', event => { 148 | event.preventDefault() 149 | 150 | getObject(this._config, key => setCookie(key, this._config[key])) 151 | setCookie('panelActive', true) 152 | 153 | this._init() 154 | this._speech(`${this._i18n.v('panelOn')}`) 155 | }) 156 | }) 157 | 158 | } 159 | 160 | _addEventListenersPanel() { 161 | const elements = { 162 | fontSizeMinus: document.querySelector('.bvi-fontSize-minus'), 163 | fontSizePlus: document.querySelector('.bvi-fontSize-plus'), 164 | themeWhite: document.querySelector('.bvi-theme-white'), 165 | themeBlack: document.querySelector('.bvi-theme-black'), 166 | themeBlue: document.querySelector('.bvi-theme-blue'), 167 | themeBrown: document.querySelector('.bvi-theme-brown'), 168 | themeGreen: document.querySelector('.bvi-theme-green'), 169 | imagesOn: document.querySelector('.bvi-images-on'), 170 | imagesOff: document.querySelector('.bvi-images-off'), 171 | imagesGrayscale: document.querySelector('.bvi-images-grayscale'), 172 | speechOn: document.querySelector('.bvi-speech-on'), 173 | speechOff: document.querySelector('.bvi-speech-off'), 174 | lineHeightNormal: document.querySelector('.bvi-line-height-normal'), 175 | lineHeightAverage: document.querySelector('.bvi-line-height-average'), 176 | lineHeightBig: document.querySelector('.bvi-line-height-big'), 177 | letterSpacingNormal: document.querySelector('.bvi-letter-spacing-normal'), 178 | letterSpacingAverage: document.querySelector('.bvi-letter-spacing-average'), 179 | letterSpacingBig: document.querySelector('.bvi-letter-spacing-big'), 180 | fontFamilyArial: document.querySelector('.bvi-font-family-arial'), 181 | fontFamilyTimes: document.querySelector('.bvi-font-family-times'), 182 | builtElementsOn: document.querySelector('.bvi-built-elements-on'), 183 | builtElementsOff: document.querySelector('.bvi-built-elements-off'), 184 | reset: document.querySelector('.bvi-reset'), 185 | links: document.querySelectorAll('.bvi-link'), 186 | modal: document.querySelector('.bvi-modal') 187 | } 188 | 189 | const activeLink = element => { 190 | for (let sibling of element.parentNode.children) { 191 | sibling.classList.remove('active') 192 | } 193 | 194 | element.classList.add('active') 195 | } 196 | 197 | const click = (element, callback) => { 198 | element.addEventListener('click', event => { 199 | event.preventDefault() 200 | 201 | if (typeof callback === 'function') { 202 | callback(event) 203 | } 204 | }) 205 | } 206 | 207 | const activeAll = () => { 208 | let links = document.querySelectorAll('.bvi-link') 209 | 210 | links.forEach(link => { 211 | link.classList.remove('active') 212 | }) 213 | 214 | getObject(this._config, key => { 215 | if (key === 'theme') { 216 | let value = getCookie(key) 217 | document.querySelector(`.bvi-theme-${value}`).classList.add('active') 218 | } 219 | 220 | if (key === 'images') { 221 | let value = getCookie(key) === 'grayscale' ? 'grayscale' : stringToBoolean(getCookie(key)) ? 'on' : 'off' 222 | 223 | document.querySelector(`.bvi-images-${value}`).classList.add('active') 224 | } 225 | 226 | if (key === 'speech') { 227 | let value = stringToBoolean(getCookie(key)) ? 'on' : 'off' 228 | 229 | document.querySelector(`.bvi-speech-${value}`).classList.add('active') 230 | } 231 | 232 | if (key === 'lineHeight') { 233 | let value = getCookie(key) 234 | 235 | document.querySelector(`.bvi-line-height-${value}`).classList.add('active') 236 | } 237 | 238 | if (key === 'letterSpacing') { 239 | let value = getCookie(key) 240 | 241 | document.querySelector(`.bvi-letter-spacing-${value}`).classList.add('active') 242 | } 243 | 244 | if (key === 'fontFamily') { 245 | let value = getCookie(key) 246 | 247 | document.querySelector(`.bvi-font-family-${value}`).classList.add('active') 248 | } 249 | 250 | if (key === 'builtElements') { 251 | let value = stringToBoolean(getCookie(key)) ? 'on' : 'off' 252 | 253 | document.querySelector(`.bvi-built-elements-${value}`).classList.add('active') 254 | } 255 | }) 256 | } 257 | 258 | activeAll() 259 | 260 | // Font size 261 | click(elements.fontSizeMinus, () => { 262 | let size = parseFloat(getCookie('fontSize')) - 1 263 | 264 | if (size !== 0) { 265 | this._setAttrDataBviBody('fontSize', size) 266 | setCookie('fontSize', size) 267 | this._speech(`${this._i18n.v('fontSizeMinus')}`) 268 | activeLink(elements.fontSizeMinus) 269 | } 270 | }) 271 | 272 | click(elements.fontSizePlus, () => { 273 | let size = parseFloat(getCookie('fontSize')) + 1 274 | 275 | if (size !== 40) { 276 | this._setAttrDataBviBody('fontSize', size) 277 | setCookie('fontSize', size) 278 | this._speech(`${this._i18n.v('fontSizePlus')}`) 279 | activeLink(elements.fontSizePlus) 280 | } 281 | }) 282 | 283 | // Theme 284 | click(elements.themeWhite, () => { 285 | this._setAttrDataBviBody('theme', 'white') 286 | setCookie('theme', 'white') 287 | this._speech(`${this._i18n.v('siteColorBlackOnWhite')}`) 288 | activeLink(elements.themeWhite) 289 | }) 290 | 291 | click(elements.themeBlack, () => { 292 | this._setAttrDataBviBody('theme', 'black') 293 | setCookie('theme', 'black') 294 | this._speech(`${this._i18n.v('siteColorWhiteOnBlack')}`) 295 | activeLink(elements.themeBlack) 296 | }) 297 | 298 | click(elements.themeBlue, () => { 299 | this._setAttrDataBviBody('theme', 'blue') 300 | setCookie('theme', 'blue') 301 | this._speech(`${this._i18n.v('siteColorDarkBlueOnBlue')}`) 302 | activeLink(elements.themeBlue) 303 | }) 304 | 305 | click(elements.themeBrown, () => { 306 | this._setAttrDataBviBody('theme', 'brown') 307 | setCookie('theme', 'brown') 308 | this._speech(`${this._i18n.v('siteColorBeigeBrown')}`) 309 | activeLink(elements.themeBrown) 310 | }) 311 | 312 | click(elements.themeGreen, () => { 313 | this._setAttrDataBviBody('theme', 'green') 314 | setCookie('theme', 'green') 315 | this._speech(`${this._i18n.v('siteColorGreenOnDarkBrown')}`) 316 | activeLink(elements.themeGreen) 317 | }) 318 | 319 | // Images 320 | click(elements.imagesOn, () => { 321 | this._setAttrDataBviBody('images', 'true') 322 | setCookie('images', 'true') 323 | this._speech(`${this._i18n.v('imagesOn')}`) 324 | activeLink(elements.imagesOn) 325 | }) 326 | 327 | click(elements.imagesOff, () => { 328 | this._setAttrDataBviBody('images', 'false') 329 | setCookie('images', 'false') 330 | this._speech(`${this._i18n.v('imagesOFF')}`) 331 | activeLink(elements.imagesOff) 332 | }) 333 | 334 | click(elements.imagesGrayscale, () => { 335 | this._setAttrDataBviBody('images', 'grayscale') 336 | setCookie('images', 'grayscale') 337 | this._speech(`${this._i18n.v('imagesGrayscale')}`) 338 | activeLink(elements.imagesGrayscale) 339 | }) 340 | 341 | // Speech 342 | click(elements.speechOn, () => { 343 | this._setAttrDataBviBody('speech', 'true') 344 | setCookie('speech', 'true') 345 | this._speech(`${this._i18n.v('speechOn')}`) 346 | activeLink(elements.speechOn) 347 | this._speechPlayer() 348 | }) 349 | 350 | click(elements.speechOff, () => { 351 | this._speech(`${this._i18n.v('speechOff')}`) 352 | this._setAttrDataBviBody('speech', 'false') 353 | setCookie('speech', 'false') 354 | activeLink(elements.speechOff) 355 | this._speechPlayer() 356 | }) 357 | 358 | // Line height 359 | click(elements.lineHeightNormal, () => { 360 | this._setAttrDataBviBody('lineHeight', 'normal') 361 | setCookie('lineHeight', 'normal') 362 | this._speech(`${this._i18n.v('lineHeightNormal')}`) 363 | activeLink(elements.lineHeightNormal) 364 | }) 365 | 366 | click(elements.lineHeightAverage, () => { 367 | this._setAttrDataBviBody('lineHeight', 'average') 368 | setCookie('lineHeight', 'average') 369 | this._speech(`${this._i18n.v('lineHeightAverage')}`) 370 | activeLink(elements.lineHeightAverage) 371 | }) 372 | 373 | click(elements.lineHeightBig, () => { 374 | this._setAttrDataBviBody('lineHeight', 'big') 375 | setCookie('lineHeight', 'big') 376 | this._speech(`${this._i18n.v('lineHeightBig')}`) 377 | activeLink(elements.lineHeightBig) 378 | }) 379 | 380 | // Letter spacing 381 | click(elements.letterSpacingNormal, () => { 382 | this._setAttrDataBviBody('letterSpacing', 'normal') 383 | setCookie('letterSpacing', 'normal') 384 | this._speech(`${this._i18n.v('LetterSpacingNormal')}`) 385 | activeLink(elements.letterSpacingNormal) 386 | }) 387 | 388 | click(elements.letterSpacingAverage, () => { 389 | this._setAttrDataBviBody('letterSpacing', 'average') 390 | setCookie('letterSpacing', 'average') 391 | this._speech(`${this._i18n.v('LetterSpacingAverage')}`) 392 | activeLink(elements.letterSpacingAverage) 393 | }) 394 | 395 | click(elements.letterSpacingBig, () => { 396 | this._setAttrDataBviBody('letterSpacing', 'big') 397 | setCookie('letterSpacing', 'big') 398 | this._speech(`${this._i18n.v('LetterSpacingBig')}`) 399 | activeLink(elements.letterSpacingBig) 400 | }) 401 | 402 | // Font family 403 | click(elements.fontFamilyArial, () => { 404 | this._setAttrDataBviBody('fontFamily', 'arial') 405 | setCookie('fontFamily', 'arial') 406 | this._speech(`${this._i18n.v('fontArial')}`) 407 | activeLink(elements.fontFamilyArial) 408 | }) 409 | 410 | click(elements.fontFamilyTimes, () => { 411 | this._setAttrDataBviBody('fontFamily', 'times') 412 | setCookie('fontFamily', 'times') 413 | this._speech(`${this._i18n.v('fontTimes')}`) 414 | activeLink(elements.fontFamilyTimes) 415 | }) 416 | 417 | // Built elements 418 | click(elements.builtElementsOn, () => { 419 | this._setAttrDataBviBody('builtElements', 'true') 420 | setCookie('builtElements', 'true') 421 | this._speech(`${this._i18n.v('builtElementsOn')}`) 422 | activeLink(elements.builtElementsOn) 423 | }) 424 | 425 | click(elements.builtElementsOff, () => { 426 | this._setAttrDataBviBody('builtElements', 'false') 427 | setCookie('builtElements', 'false') 428 | this._speech(`${this._i18n.v('builtElementsOFF')}`) 429 | activeLink(elements.builtElementsOff) 430 | }) 431 | 432 | // Reset 433 | click(elements.reset, () => { 434 | this._speech(`${this._i18n.v('resetSettings')}`) 435 | getObject(this._config, key => { 436 | this._setAttrDataBviBody(key, this._config[key]) 437 | setCookie(key, this._config[key]) 438 | activeAll() 439 | }) 440 | }) 441 | 442 | getArray(elements.links, element => { 443 | click(element, event => { 444 | let target = event.target.getAttribute('data-bvi') 445 | 446 | if (target === 'close') { 447 | this._setAttrDataBviBody('panelActive', 'false') 448 | setCookie('panelActive', 'false') 449 | this._init() 450 | } 451 | 452 | if (target === 'modal') { 453 | document.body.style.overflow = 'hidden' 454 | document.body.classList.add('bvi-noscroll') 455 | elements.modal.classList.toggle('show') 456 | } 457 | 458 | if (target === 'modal-close') { 459 | document.body.classList.remove('bvi-noscroll') 460 | document.body.style.overflow = '' 461 | elements.modal.classList.remove('show') 462 | } 463 | 464 | if (target === 'panel-hide') { 465 | document.querySelector('.bvi-panel').classList.add('bvi-panel-hide') 466 | document.querySelector('.bvi-link-fixed-top').classList.remove('bvi-hide') 467 | document.querySelector('.bvi-link-fixed-top').classList.add('bvi-show') 468 | setCookie('panelHide', 'true') 469 | this._speech(`${this._i18n.v('panelHide')}`) 470 | } 471 | 472 | if (target === 'panel-show') { 473 | document.querySelector('.bvi-link-fixed-top').classList.remove('bvi-show') 474 | document.querySelector('.bvi-link-fixed-top').classList.add('bvi-hide') 475 | document.querySelector('.bvi-panel').classList.remove('bvi-panel-hide') 476 | setCookie('panelHide', 'false') 477 | this._speech(`${this._i18n.v('panelShow')}`) 478 | } 479 | }) 480 | }) 481 | 482 | click(elements.modal, event => { 483 | if (event.target.contains(elements.modal)) { 484 | document.body.classList.remove('bvi-noscroll') 485 | document.body.style.overflow = '' 486 | elements.modal.classList.remove('show') 487 | } 488 | }) 489 | } 490 | 491 | _getPanel() { 492 | const scroll = () => { 493 | let scroll = (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop 494 | 495 | if (stringToBoolean(getCookie('panelFixed'))) { 496 | if (scroll > 200) { 497 | document.querySelector('.bvi-panel').classList.add('bvi-fixed-top') 498 | } else { 499 | document.querySelector('.bvi-panel').classList.remove('bvi-fixed-top') 500 | } 501 | } 502 | } 503 | 504 | let panelHide = stringToBoolean(getCookie('panelHide')) ? ' bvi-panel-hide' : '' 505 | let linkHide = !stringToBoolean(getCookie('panelHide')) ? ' bvi-hide' : 'bvi-show' 506 | let html = ` 507 |
508 |
509 |
510 |
${this._i18n.t('fontSize')}
511 | А- 512 | А+ 513 |
514 |
515 |
${this._i18n.t('siteColors')}
516 | Ц 517 | Ц 518 | Ц 519 | Ц 520 | Ц 521 |
522 |
523 |
${this._i18n.t('images')}
524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 |
534 |
535 |
${this._i18n.t('speech')}
536 | 537 | 538 | 539 | 540 | 541 | 542 |
543 |
544 |
${this._i18n.t('settings')}
545 | 546 | 547 | 548 | 549 | ${this._i18n.t('regularVersionOfTheSite')} 550 | 551 | 552 | 553 | 554 |
555 |
556 |
557 |
558 |
559 |
560 |
${this._i18n.t('settings')}
561 | × 562 |
563 |
564 |
565 |
566 |
${this._i18n.t('letterSpacing')}
567 | ${this._i18n.t('normal')} 568 | ${this._i18n.t('average')} 569 | ${this._i18n.t('big')} 570 |
571 |
572 |
${this._i18n.t('lineHeight')}
573 | ${this._i18n.t('normal')} 574 | ${this._i18n.t('average')} 575 | ${this._i18n.t('big')} 576 |
577 |
578 |
${this._i18n.t('font')}
579 | ${this._i18n.t('arial')} 580 | ${this._i18n.t('times')} 581 |
582 |
583 |
${this._i18n.t('builtElements')}
584 | ${this._i18n.t('on')} 585 | ${this._i18n.t('off')} 586 |
587 |
588 |
589 | bvi.isvek.ru 590 |
591 |
592 | 595 |
596 |
597 |
598 |
` 599 | 600 | let link = `` + 601 | '' 602 | 603 | window.addEventListener('scroll', scroll) 604 | document.querySelector('.bvi-body').insertAdjacentHTML('beforebegin', html) 605 | document.querySelector('.bvi-body').insertAdjacentHTML('afterbegin', link) 606 | scroll() 607 | } 608 | 609 | _set() { 610 | document.body.classList.add('bvi-active') 611 | wrapInner(document.body, 'div', 'bvi-body') 612 | getObject(this._config, key => this._setAttrDataBviBody(key, getCookie(key))) 613 | getArray(this._elements, element => element.style.display = 'none') 614 | 615 | document.querySelectorAll('img') 616 | .forEach(element => { 617 | if (element.classList.contains('bvi-img')) { 618 | element.classList.remove('bvi-img') 619 | } 620 | }) 621 | 622 | document.querySelectorAll('body *') 623 | .forEach(element => { 624 | if (element.classList.contains('bvi-background-image')) { 625 | element.classList.remove('bvi-background-image') 626 | } 627 | }) 628 | } 629 | 630 | _remove() { 631 | let bviPanel = document.querySelector('.bvi-panel') 632 | let bviBody = document.querySelector('.bvi-body') 633 | let bviLinkFixedTop = document.querySelector('.bvi-link-fixed-top') 634 | 635 | if (bviPanel) { 636 | bviPanel.remove() 637 | } 638 | 639 | if (bviBody) { 640 | unwrap(bviBody) 641 | } 642 | 643 | if (bviLinkFixedTop) { 644 | bviLinkFixedTop.remove() 645 | } 646 | 647 | this._speech(`${this._i18n.v('panelOff')}`) 648 | 649 | document.body.classList.remove('bvi-active') 650 | 651 | getArray(this._elements, element => element.style.display = '') 652 | 653 | if (stringToBoolean(getCookie('reload'))) { 654 | document.location.reload() 655 | } 656 | 657 | getObject(this._config, key => { 658 | removeCookie(key) 659 | }) 660 | 661 | this._speechPlayer() 662 | 663 | removeCookie('panelActive') 664 | } 665 | 666 | _images() { 667 | document.querySelectorAll('img').forEach(element => { 668 | if (!element.classList.contains('bvi-no-style')) { 669 | element.classList.add('bvi-img') 670 | } 671 | }) 672 | 673 | document.querySelectorAll('.bvi-body *').forEach(element => { 674 | let style = getComputedStyle(element) 675 | if (style.backgroundImage !== 'none' && style.background !== 'none' && !element.classList.contains('bvi-no-style')) { 676 | element.classList.add('bvi-background-image') 677 | } 678 | }) 679 | } 680 | 681 | _getConfig(config) { 682 | config = {...Default, ...config} 683 | let extended = {} 684 | 685 | for (let keyDefault in Default) { 686 | extended[keyDefault] = config[keyDefault] 687 | } 688 | 689 | checkConfig(extended, DefaultType, DefaultOptions) 690 | 691 | return extended 692 | } 693 | 694 | _setAttrDataBviBody(name = '', value = '') { 695 | document.querySelector('.bvi-body').setAttribute(`data-bvi-${name}`, value) 696 | } 697 | 698 | _speechPlayer() { 699 | let selectorSpeechText = document.querySelectorAll('.bvi-speech-text') 700 | let selectorSpeechLink = document.querySelectorAll('.bvi-speech-link') 701 | let selectorBviSpeech = document.querySelectorAll('.bvi-speech') 702 | 703 | if ('speechSynthesis' in window && stringToBoolean(getCookie('speech'))) { 704 | 705 | if (selectorBviSpeech) { 706 | if (selectorSpeechText) { 707 | selectorSpeechText.forEach(element => unwrap(element)) 708 | } 709 | 710 | if (selectorSpeechLink) { 711 | selectorSpeechLink.forEach(element => element.remove()) 712 | } 713 | 714 | selectorBviSpeech.forEach((speechDivBlock, index) => { 715 | let id = `bvi-speech-text-id-${index + 1}` 716 | let html = ` 717 | ` 723 | 724 | wrapInner(speechDivBlock, 'div', `bvi-speech-text ${id}`) 725 | speechDivBlock.insertAdjacentHTML('afterbegin', html) 726 | }) 727 | 728 | let selectorPlay = document.querySelectorAll('.bvi-speech-play') 729 | let selectorPause = document.querySelectorAll('.bvi-speech-pause') 730 | let selectorResume = document.querySelectorAll('.bvi-speech-resume') 731 | let selectorStop = document.querySelectorAll('.bvi-speech-stop') 732 | const el = (elements, callback) => { 733 | elements.forEach(element => { 734 | element.addEventListener('click', event => { 735 | event.preventDefault() 736 | if (typeof callback === 'function') { 737 | return callback(element, event) 738 | } 739 | }, false) 740 | }) 741 | } 742 | 743 | el(selectorPlay, (element, event) => { 744 | let target = event.target 745 | let text = target.parentNode.nextElementSibling; 746 | let closest = event.target.closest('.bvi-speech-link') 747 | let play = document.querySelectorAll('.bvi-speech-play') 748 | let pause = document.querySelectorAll('.bvi-speech-pause') 749 | let resume = document.querySelectorAll('.bvi-speech-resume') 750 | let stop = document.querySelectorAll('.bvi-speech-stop') 751 | 752 | this._speech(text.textContent, text, true); 753 | 754 | play.forEach(element => element.classList.remove('disabled')) 755 | pause.forEach(element => element.classList.add('disabled')) 756 | resume.forEach(element => element.classList.add('disabled')) 757 | stop.forEach(element => element.classList.add('disabled')) 758 | 759 | target.classList.add('disabled') 760 | closest.querySelector('.bvi-speech-pause').classList.remove('disabled') 761 | closest.querySelector('.bvi-speech-stop').classList.remove('disabled') 762 | }) 763 | 764 | el(selectorPause, (element, event) => { 765 | let target = event.target 766 | let closest = event.target.closest('.bvi-speech-link') 767 | 768 | target.classList.add('disabled') 769 | closest.querySelector('.bvi-speech-resume').classList.remove('disabled') 770 | synth().pause() 771 | }) 772 | 773 | el(selectorResume, (element, event) => { 774 | let target = event.target 775 | let closest = event.target.closest('.bvi-speech-link') 776 | 777 | target.classList.add('disabled') 778 | closest.querySelector('.bvi-speech-pause').classList.remove('disabled') 779 | synth().resume() 780 | }) 781 | 782 | el(selectorStop, (element, event) => { 783 | let target = event.target 784 | let closest = event.target.closest('.bvi-speech-link') 785 | 786 | target.classList.add('disabled') 787 | closest.querySelector('.bvi-speech-pause').classList.add('disabled') 788 | closest.querySelector('.bvi-speech-play').classList.remove('disabled') 789 | synth().cancel(); 790 | }) 791 | } 792 | } else { 793 | if (selectorSpeechText) { 794 | selectorSpeechText.forEach(element => unwrap(element)) 795 | } 796 | 797 | if (selectorSpeechLink) { 798 | selectorSpeechLink.forEach(element => element.remove()) 799 | } 800 | } 801 | } 802 | 803 | _speech(text, element, echo = false) { 804 | if ('speechSynthesis' in window && stringToBoolean(getCookie('speech'))) { 805 | synth().cancel() 806 | const getWordAt = (str, pos) => { 807 | str = String(str) 808 | pos = Number(pos) >>> 0 809 | 810 | let left = str.slice(0, pos + 1).search(/\S+$/) 811 | let right = str.slice(pos).search(/\s/) 812 | 813 | if (right < 0) { 814 | return str.slice(left) 815 | } 816 | return str.slice(left, right + pos) 817 | } 818 | 819 | let chunkLength = 120 820 | let patternRegex = new RegExp('^[\\s\\S]{' + Math.floor(chunkLength / 2) + ',' + chunkLength + '}[.!?,]{1}|^[\\s\\S]{1,' + chunkLength + '}$|^[\\s\\S]{1,' + chunkLength + '} ') 821 | let array = [] 822 | let $text = text 823 | let voices = synth().getVoices() 824 | 825 | while ($text.length > 0) { 826 | array.push($text.match(patternRegex)[0]) 827 | $text = $text.substring(array[array.length - 1].length) 828 | } 829 | 830 | array.forEach(getText => { 831 | let utter = new SpeechSynthesisUtterance(getText.trim()) 832 | utter.volume = 1 833 | utter.rate = 1 834 | utter.pitch = 1 835 | utter.lang = this._config.lang 836 | 837 | for (let i = 0; i < voices.length; i++) { 838 | if (this._config.lang === 'ru-RU' && voices[i].name === 'Microsoft Pavel - Russian (Russia)') { 839 | utter.voice = voices[i] 840 | } 841 | 842 | if (this._config.lang === 'en-US' && voices[i].name === 'Microsoft Pavel - English (English)') { 843 | utter.voice = voices[i] 844 | } 845 | } 846 | 847 | if (echo) { 848 | utter.onboundary = event => { 849 | 850 | element.classList.add('bvi-highlighting') 851 | let world = getWordAt(event.utterance.text, event.charIndex) 852 | let textContent = element.textContent 853 | let term = world.replace(/(\s+)/, '((<[^>]+>)*$1(<[^>]+>)*)') 854 | let pattern = new RegExp('(' + term + ')', 'gi') 855 | textContent = textContent.replace(pattern, '$1') 856 | textContent = textContent.replace(/([^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/, '$1$2$4') 857 | element.innerHTML = textContent 858 | } 859 | 860 | utter.onend = event => { 861 | element.classList.remove('bvi-highlighting') 862 | let textContent = element.textContent 863 | textContent = textContent.replace(/($1<\/mark>)/, '$1') 864 | element.innerHTML = textContent 865 | } 866 | } 867 | 868 | synth().speak(utter) 869 | }) 870 | } 871 | } 872 | } 873 | 874 | export default Bvi 875 | -------------------------------------------------------------------------------- /src/js/i18n.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Button visually impaired (v1.0.0): i18n.js 4 | * Licensed under MIT (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | const lang = { 9 | 'ru-RU': { 10 | 'text': { 11 | 'fontSize': 'Размер шрифта', 12 | 'siteColors': 'Цвета сайта', 13 | 'images': 'Изображения', 14 | 'speech': 'Синтез речи', 15 | 'settings': 'Настройки', 16 | 'regularVersionOfTheSite': 'Обычная версия сайта', 17 | 'letterSpacing': 'Межбуквенное расстояние', 18 | 'normal': 'Стандартный', 19 | 'average': 'Средний', 20 | 'big': 'Большой', 21 | 'lineHeight': 'Межстрочный интервал', 22 | 'font': 'Шрифт', 23 | 'arial': 'Без засечек', 24 | 'times': 'С засечками', 25 | 'builtElements': 'Встроенные элементы (Видео, карты и тд.)', 26 | 'on': 'Включить', 27 | 'off': 'Выключить', 28 | 'reset': 'Сбросить настройки', 29 | 'plural_0': 'пиксель', 30 | 'plural_1': 'пекселя', 31 | 'plural_2': 'пикселей', 32 | }, 33 | 'voice': { 34 | 'fontSizePlus': 'Размер шрифта увели́чен', 35 | 'fontSizeMinus': 'Размер шрифта уме́ньшен', 36 | 'siteColorBlackOnWhite': 'Цвет сайта черным по белому', 37 | 'siteColorWhiteOnBlack': 'Цвет сайта белым по черному', 38 | 'siteColorDarkBlueOnBlue': 'Цвет сайта тёмно-синим по голубому', 39 | 'siteColorBeigeBrown': 'Цвет сайта кори́чневым по бе́жевому', 40 | 'siteColorGreenOnDarkBrown': 'Цвет сайта зеленым по тёмно-коричневому', 41 | 'imagesOn': 'Изображения включены', 42 | 'imagesOFF': 'Изображения выключены', 43 | 'imagesGrayscale': 'Изображения чёрно-белые', 44 | 'speechOn': 'Синтез речи включён', 45 | 'speechOff': 'Синтез речи вы́ключен', 46 | 'lineHeightNormal': 'Межстрочный интервал стандартный', 47 | 'lineHeightAverage': 'Межстрочный интервал средний', 48 | 'lineHeightBig': 'Межстрочный интервал большой', 49 | 'LetterSpacingNormal': 'Интервал между буквами стандартный', 50 | 'LetterSpacingAverage': 'Интервал между буквами средний', 51 | 'LetterSpacingBig': 'Интервал между буквами большой', 52 | 'fontArial': 'Шрифт без засечек', 53 | 'fontTimes': 'Шрифт с засечками', 54 | 'builtElementsOn': 'Встроенные элементы включены', 55 | 'builtElementsOFF': 'Встроенные элементы выключены', 56 | 'resetSettings': 'Установлены настройки по умолча́нию', 57 | 'panelShow': 'Панель открыта', 58 | 'panelHide': 'Панель скрыта', 59 | 'panelOn': 'Версия сайта для слабови́дящий', 60 | 'panelOff': 'Обычная версия сайта', 61 | } 62 | }, 63 | 'en-US': { 64 | 'text': { 65 | 'fontSize': 'Font size', 66 | 'siteColors': 'Site colors', 67 | 'images': 'Images', 68 | 'speech': 'Speech synthesis', 69 | 'settings': 'Settings', 70 | 'regularVersionOfTheSite': 'Regular version Of The site', 71 | 'letterSpacing': 'Letter spacing', 72 | 'normal': 'Single', 73 | 'average': 'One and a half', 74 | 'big': 'Double', 75 | 'lineHeight': 'Line spacing', 76 | 'font':'Font', 77 | 'arial': 'Sans Serif - Arial', 78 | 'times': 'Serif - Times New Roman', 79 | 'builtElements': 'Include inline elements (Videos, maps, etc.)', 80 | 'on': 'Enable', 81 | 'off': 'Disabled', 82 | 'reset': 'Reset settings', 83 | 'plural_0': 'pixel', 84 | 'plural_1': 'pixels', 85 | 'plural_2': 'pixels', 86 | }, 87 | 'voice': { 88 | 'fontSizePlus': 'Font size increased', 89 | 'fontSizeMinus': 'Font size reduced', 90 | 'siteColorBlackOnWhite': 'Site color black on white', 91 | 'siteColorWhiteOnBlack': 'Site color white on black', 92 | 'siteColorDarkBlueOnBlue': 'Site color dark blue on cyan', 93 | 'siteColorBeigeBrown': 'SiteColorBeigeBrown', 94 | 'siteColorGreenOnDarkBrown': 'Site color green on dark brown', 95 | 'imagesOn': 'Images enable', 96 | 'imagesOFF': 'Images disabled', 97 | 'imagesGrayscale': 'Images gray scale', 98 | 'speechOn': 'Synthesis speech enable', 99 | 'speechOff': 'Synthesis speech disabled', 100 | 'lineHeightNormal': 'Line spacing single', 101 | 'lineHeightAverage': 'Line spacing one and a half', 102 | 'lineHeightBig': 'Line spacing double', 103 | 'LetterSpacingNormal': 'Letter spacing single', 104 | 'LetterSpacingAverage': 'Letter spacing one and a half', 105 | 'LetterSpacingBig': 'Letter spacing letter double', 106 | 'fontArial': 'Sans Serif - Arial', 107 | 'fontTimes': 'Serif - Times New Roman', 108 | 'builtElementsOn': 'Include inline elements are enabled', 109 | 'builtElementsOFF': 'Include inline elements are disabled', 110 | 'resetSettings': 'Default settings have been set', 111 | 'panelShow': 'Panel show', 112 | 'panelHide': 'Panel hide', 113 | 'panelOn': 'Site version for visually impaired', 114 | 'panelOff': 'Regular version of the site', 115 | } 116 | } 117 | } 118 | 119 | class I18n { 120 | constructor(options) { 121 | this._config = options 122 | } 123 | 124 | t(key) { 125 | return lang[this._config.lang]['text'][key] 126 | } 127 | 128 | v(key) { 129 | return lang[this._config.lang]['voice'][key] 130 | } 131 | } 132 | 133 | export default I18n 134 | -------------------------------------------------------------------------------- /src/js/index.umd.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Button visually impaired (v1.0.0): index.umd.js 4 | * Licensed under MIT (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | /*import 'core-js/stable';*/ 9 | import 'regenerator-runtime/runtime' 10 | import Bvi from './bvi' 11 | 12 | export default { Bvi } 13 | -------------------------------------------------------------------------------- /src/js/util/cookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Button visually impaired (v1.0.0): util/cookie.js 4 | * Licensed under MIT (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | const setCookie = function (name = '', value = '') { 9 | let now = new Date(); 10 | let time = now.getTime(); 11 | time += 24 * 60 * 60 * 1000; 12 | now.setTime(time); 13 | document.cookie = `bvi_${name}=${value};path=/;expires=${now.toUTCString()};domain=${location.host}`; 14 | }; 15 | 16 | const getCookie = function (name = '') { 17 | name = `bvi_${name}=`; 18 | let decodedCookie = decodeURIComponent(document.cookie); 19 | let cookies = decodedCookie.split(';'); 20 | 21 | for (let i = 0; i < cookies.length; i++) { 22 | let cookie = cookies[i].trim(); 23 | 24 | if (cookie.indexOf(name) !== -1) { 25 | return cookie.substring(name.length, cookie.length); 26 | } 27 | } 28 | }; 29 | 30 | const removeCookie = function (name = '') { 31 | document.cookie = `bvi_${name}=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;domain=${location.host}`; 32 | }; 33 | 34 | export { 35 | setCookie, 36 | getCookie, 37 | removeCookie, 38 | }; 39 | -------------------------------------------------------------------------------- /src/js/util/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Button visually impaired (v1.0.0): util/index.js 4 | * Licensed under MIT (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | (function (arr) { 9 | arr.forEach(function (item) { 10 | if (item.hasOwnProperty('prepend')) { 11 | return 12 | } 13 | Object.defineProperty(item, 'prepend', { 14 | configurable: true, 15 | enumerable: true, 16 | writable: true, 17 | value: function prepend () { 18 | var argArr = Array.prototype.slice.call(arguments), 19 | docFrag = document.createDocumentFragment() 20 | 21 | argArr.forEach(function (argItem) { 22 | var isNode = argItem instanceof Node 23 | docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem))) 24 | }) 25 | 26 | this.insertBefore(docFrag, this.firstChild) 27 | }, 28 | }) 29 | }) 30 | })([Element.prototype, Document.prototype, DocumentFragment.prototype]) 31 | 32 | if (window.NodeList && !NodeList.prototype.forEach) { 33 | NodeList.prototype.forEach = Array.prototype.forEach 34 | } 35 | 36 | if (window.HTMLCollection && !HTMLCollection.prototype.forEach) { 37 | HTMLCollection.prototype.forEach = Array.prototype.forEach 38 | } 39 | 40 | const toType = obj => { 41 | if (obj === null || obj === undefined) { 42 | return `${obj}` 43 | } 44 | 45 | return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase() 46 | } 47 | 48 | const isElement = obj => { 49 | if (!obj || typeof obj !== 'object') { 50 | return false 51 | } 52 | 53 | return typeof obj.nodeType !== 'undefined' 54 | } 55 | 56 | const checkConfig = (config, configTypes, configOptions) => { 57 | Object.keys(configTypes).forEach(key => { 58 | const expectedTypes = configTypes[key] 59 | const value = config[key] 60 | const valueType = value && isElement(value) ? 'element' : toType(value) 61 | 62 | if (!new RegExp(expectedTypes).test(valueType)) { 63 | throw new TypeError( 64 | `Bvi console: Опция "${key}" предоставленный тип "${valueType}", ожидаемый тип "${expectedTypes}".`, 65 | ) 66 | } 67 | }) 68 | 69 | Object.keys(configOptions).forEach(key => { 70 | const expectedOptions = configOptions[key] 71 | const value = config[key] 72 | 73 | if (!new RegExp(expectedOptions).test(value)) { 74 | throw new TypeError( 75 | `Bvi console: Опция "${key}" параметр "${value}", ожидаемый параметр "${expectedOptions}".`, 76 | ) 77 | } 78 | }) 79 | } 80 | 81 | const plural = (number, text = ['пиксель', 'пекселя', 'пикселей']) => { 82 | if (number % 10 === 1 && number % 100 !== 11) { 83 | return `${number} ${text[0]}` 84 | } else if (number % 10 >= 2 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20)) { 85 | return `${number} ${text[1]}` 86 | } else { 87 | return `${number} ${text[2]}` 88 | } 89 | } 90 | 91 | const stringToBoolean = string => { 92 | switch (string) { 93 | case 'on': 94 | case 'true': 95 | case '1': 96 | return true 97 | default: 98 | return false 99 | } 100 | } 101 | 102 | const wrapInner = (parent, wrapper, className) => { 103 | if (typeof wrapper === 'string') { 104 | wrapper = document.createElement(wrapper) 105 | } 106 | 107 | parent.appendChild(wrapper).className = className 108 | 109 | while (parent.firstChild !== wrapper) { 110 | wrapper.appendChild(parent.firstChild) 111 | } 112 | } 113 | 114 | const unwrap = wrapper => { 115 | let docFrag = document.createDocumentFragment() 116 | 117 | if (!wrapper) return 118 | 119 | while (wrapper.firstChild) { 120 | let child = wrapper.removeChild(wrapper.firstChild) 121 | docFrag.appendChild(child) 122 | } 123 | 124 | wrapper.parentNode.replaceChild(docFrag, wrapper) 125 | } 126 | 127 | const getObject = (object, callback) => { 128 | Object.keys(object).forEach(key => { 129 | if (typeof callback === 'function') { 130 | callback(key) 131 | } 132 | }) 133 | } 134 | 135 | const getArray = (array, callback) => { 136 | Array.from(array).forEach(key => { 137 | if (typeof callback === 'function') { 138 | callback(key) 139 | } 140 | }) 141 | } 142 | 143 | const inArray = (needle, haystack) => { 144 | let length = haystack.length 145 | 146 | for (let i = 0; i < length; i++) { 147 | if (haystack[i] === needle) { 148 | return true 149 | } 150 | } 151 | 152 | return false 153 | } 154 | 155 | const synth = () => window.speechSynthesis 156 | 157 | const synthSupportBrowser = () => { 158 | return 'speechSynthesis' in window 159 | } 160 | 161 | export { 162 | plural, 163 | checkConfig, 164 | stringToBoolean, 165 | wrapInner, 166 | unwrap, 167 | getObject, 168 | getArray, 169 | synth, 170 | synthSupportBrowser, 171 | inArray, 172 | } 173 | -------------------------------------------------------------------------------- /src/scss/_body.scss: -------------------------------------------------------------------------------- 1 | body { 2 | &.bvi-active { 3 | margin: 0; 4 | padding: 0; 5 | top: 0; 6 | left: 0; 7 | 8 | &.bvi-noscroll { 9 | overflow: hidden !important; 10 | } 11 | } 12 | 13 | .bvi-body { 14 | padding: 0 .5rem; 15 | 16 | @include loop-theme('white', $theme-bg-white, $theme-color-white); 17 | @include loop-theme('black', $theme-bg-black, $theme-color-black); 18 | @include loop-theme('blue', $theme-bg-blue, $theme-color-blue); 19 | @include loop-theme('brown', $theme-bg-brown, $theme-color-brown); 20 | @include loop-theme('green', $theme-bg-green, $theme-color-green); 21 | @include loop-size(40); 22 | 23 | &[data-bvi-images='true']:not(.bvi-no-styles) { 24 | .bvi-background-image:not(.bvi-no-styles), 25 | img.bvi-background-image:not(.bvi-no-styles), 26 | img.bvi-img:not(.bvi-no-styles) { 27 | -webkit-filter: grayscale(0); 28 | filter: grayscale(0); 29 | visibility: visible; 30 | } 31 | } 32 | 33 | &[data-bvi-images='false']:not(.bvi-no-styles) { 34 | .bvi-background-image:not(.bvi-no-styles), 35 | img.bvi-background-image:not(.bvi-no-styles), 36 | img.bvi-img:not(.bvi-no-styles) { 37 | display: none; 38 | position: relative; 39 | border: 1px dashed; 40 | } 41 | } 42 | 43 | &[data-bvi-images='grayscale']:not(.bvi-no-styles) { 44 | .bvi-background-image:not(.bvi-no-styles), 45 | img.bvi-background-image:not(.bvi-no-styles), 46 | img.bvi-img:not(.bvi-no-styles) { 47 | -moz-filter: url("data:image/svg+xml;utf8,#grayscale"); 48 | -o-filter: url("data:image/svg+xml;utf8,#grayscale"); 49 | -webkit-filter: grayscale(1); 50 | filter: url("data:image/svg+xml;utf8,#grayscale"); 51 | filter: url("data:image/svg+xml;utf8,#grayscale"); 52 | filter: grayscale(1); 53 | visibility: visible; 54 | } 55 | } 56 | 57 | &[data-bvi-lineheight='normal']:not(.bvi-no-styles) { 58 | line-height: 1.5 !important; 59 | } 60 | 61 | &[data-bvi-lineheight='average']:not(.bvi-no-styles) { 62 | line-height: 2 !important; 63 | } 64 | 65 | &[data-bvi-lineheight='big']:not(.bvi-no-styles) { 66 | line-height: 2.5 !important; 67 | } 68 | 69 | &[data-bvi-letterspacing='normal']:not(.bvi-no-styles) { 70 | letter-spacing: 0 !important; 71 | } 72 | 73 | &[data-bvi-letterspacing='average']:not(.bvi-no-styles) { 74 | letter-spacing: 2px !important; 75 | } 76 | 77 | &[data-bvi-letterspacing='big']:not(.bvi-no-styles) { 78 | letter-spacing: 4px !important; 79 | } 80 | 81 | &[data-bvi-fontfamily='arial']:not(i):not(span):not(.bvi-no-styles) { 82 | font-family: Arial, sans-serif !important; 83 | } 84 | 85 | &[data-bvi-fontfamily='times']:not(i):not(span):not(.bvi-no-styles) { 86 | font-family: "Times New roman", serif !important; 87 | } 88 | 89 | &[data-bvi-builtelements='true']:not(.bvi-no-styles) { 90 | .wp-audio-shortcode, 91 | iframe, 92 | object, 93 | video, 94 | ymaps, 95 | figure { 96 | display: block !important; 97 | } 98 | } 99 | 100 | &[data-bvi-builtelements='false']:not(.bvi-no-styles) { 101 | .wp-audio-shortcode, 102 | iframe, 103 | object, 104 | video, 105 | ymaps, 106 | figure { 107 | display: none !important; 108 | } 109 | } 110 | 111 | .bvi-speech { 112 | margin-bottom: 1.5rem; 113 | 114 | .bvi-speech-link { 115 | display: inline-block; 116 | border: 1px dashed transparent; 117 | border-bottom: 0; 118 | padding: .7rem; 119 | } 120 | 121 | .bvi-speech-text { 122 | border: 1px dashed transparent; 123 | padding: .7rem; 124 | } 125 | 126 | .bvi-highlighting { 127 | mark { 128 | font-weight: bold; 129 | text-decoration: underline; 130 | } 131 | } 132 | } 133 | 134 | a { 135 | &.bvi-link { 136 | display: inline-block; 137 | font-weight: 400; 138 | line-height: 1.5; 139 | font-size: 0.875rem !important; 140 | color: #212529 !important; 141 | text-align: center; 142 | text-decoration: none; 143 | vertical-align: middle; 144 | cursor: pointer; 145 | -webkit-user-select: none; 146 | -moz-user-select: none; 147 | user-select: none; 148 | background-color: #e0e0e0 !important; 149 | border: 1px solid #c6c6c6 !important; 150 | padding: .375rem .75rem; 151 | border-radius: .25rem; 152 | position: relative; 153 | transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; 154 | 155 | &::after { 156 | position: absolute; 157 | top: 0; 158 | right: 0; 159 | bottom: 0; 160 | left: 0; 161 | z-index: 1; 162 | content: ""; 163 | } 164 | } 165 | } 166 | 167 | .bvi-link-fixed-top { 168 | position: fixed !important; 169 | top: 2.5rem !important; 170 | right: 1.5rem !important; 171 | z-index: 999999 !important; 172 | } 173 | 174 | .bvi-hide { 175 | display: none !important; 176 | } 177 | 178 | .bvi-show { 179 | display: block !important; 180 | } 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /src/scss/_images.scss: -------------------------------------------------------------------------------- 1 | .bvi-images { 2 | width: 18px; 3 | height: 18px; 4 | letter-spacing: normal; 5 | display: inline-block; 6 | vertical-align: middle; 7 | z-index: 1; 8 | background-size: 100% 100%; 9 | -o-background-size: 100% 100%; 10 | -webkit-background-size: 100% 100%; 11 | 12 | &.bvi-images-cog { 13 | background-image: url("../img/cog.svg"); 14 | background-repeat: no-repeat; 15 | } 16 | 17 | &.bvi-images-eye-slash { 18 | background-image: url("../img/eye-slash.svg"); 19 | background-repeat: no-repeat; 20 | } 21 | 22 | &.bvi-images-volume-up { 23 | background-image: url("../img/volume-up.svg"); 24 | background-repeat: no-repeat; 25 | } 26 | 27 | &.bvi-images-volume-off { 28 | background-image: url("../img/volume-off.svg"); 29 | background-repeat: no-repeat; 30 | } 31 | 32 | &.bvi-images-adjust { 33 | background-image: url("../img/adjust.svg"); 34 | background-repeat: no-repeat; 35 | } 36 | 37 | &.bvi-images-minus-circle { 38 | background-image: url("../img/minus-circle.svg"); 39 | background-repeat: no-repeat; 40 | } 41 | 42 | &.bvi-images-image { 43 | background-image: url("../img/image.svg"); 44 | background-repeat: no-repeat; 45 | } 46 | 47 | &.bvi-images-minus { 48 | background-image: url("../img/minus.svg"); 49 | background-repeat: no-repeat; 50 | } 51 | 52 | &.bvi-images-eye { 53 | background-image: url("../img/eye.svg"); 54 | background-repeat: no-repeat; 55 | fill: green; 56 | } 57 | 58 | &.bvi-images-size-32 { 59 | width: 32px !important; 60 | height: 32px !important; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/scss/_panel.scss: -------------------------------------------------------------------------------- 1 | html { 2 | &:not(.bvi-panel) { 3 | font-size: 100%; 4 | 5 | *, 6 | ::after, 7 | ::before { 8 | box-sizing: border-box; 9 | } 10 | } 11 | 12 | body { 13 | .bvi-panel { 14 | font-family: Arial, serif !important; 15 | font-size: 1rem !important; 16 | padding: .5rem; 17 | color: black; 18 | top: 0; 19 | left: 0; 20 | right: 0; 21 | letter-spacing: 0; 22 | position: relative; 23 | text-shadow: none; 24 | line-height: normal; 25 | border: 0; 26 | margin-bottom: .3rem; 27 | background-color: #f7f7f7; 28 | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23); 29 | z-index: 999999 !important; 30 | 31 | * { 32 | font-family: Arial, serif !important; 33 | font-size: 1rem !important; 34 | } 35 | 36 | &.bvi-fixed-top { 37 | position: fixed; 38 | top: 0; 39 | right: 0; 40 | left: 0; 41 | z-index: 999999; 42 | } 43 | 44 | &.bvi-panel-hide { 45 | display: none; 46 | } 47 | 48 | a { 49 | color: black !important; 50 | outline: 0 !important; 51 | background-color: transparent !important; 52 | text-decoration: none !important; 53 | 54 | &:hover, 55 | &:focus { 56 | color: black !important; 57 | outline: 0 !important; 58 | background-color: transparent !important; 59 | text-decoration: none !important; 60 | } 61 | 62 | &.bvi-link { 63 | display: inline-block; 64 | line-height: 1.5; 65 | font-size: 0.875rem !important; 66 | color: #212529 !important; 67 | text-align: center; 68 | text-decoration: none; 69 | vertical-align: middle; 70 | cursor: pointer; 71 | -webkit-user-select: none; 72 | -moz-user-select: none; 73 | user-select: none; 74 | background-color: #e0e0e0 !important; 75 | border: 1px solid #c6c6c6 !important; 76 | padding: .375rem .75rem; 77 | border-radius: .25rem; 78 | position: relative; 79 | font-weight: bold; 80 | transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; 81 | 82 | &::after { 83 | position: absolute; 84 | top: 0; 85 | right: 0; 86 | bottom: 0; 87 | left: 0; 88 | z-index: 1; 89 | content: ""; 90 | } 91 | 92 | &:hover, 93 | &:focus { 94 | background-color: $link-hover !important; 95 | } 96 | 97 | &.active { 98 | color: $link-active-color !important; 99 | background-color: $link-active-bg !important; 100 | } 101 | 102 | &.bvi-theme-white { 103 | background-color: $theme-bg-white !important; 104 | color: $theme-color-white !important; 105 | } 106 | 107 | &.bvi-theme-black { 108 | background-color: $theme-bg-black !important; 109 | color: $theme-color-black !important; 110 | } 111 | 112 | &.bvi-theme-blue { 113 | background-color: $theme-bg-blue !important; 114 | color: $theme-color-blue !important; 115 | } 116 | 117 | &.bvi-theme-brown { 118 | background-color: $theme-bg-brown !important; 119 | color: $theme-color-brown !important; 120 | } 121 | 122 | &.bvi-theme-green { 123 | background-color: $theme-bg-green !important; 124 | color: $theme-color-green !important; 125 | } 126 | } 127 | } 128 | 129 | .bvi-blocks { 130 | margin: 0 auto; 131 | text-align: center; 132 | display: flex; 133 | flex-flow: row wrap; 134 | 135 | &.bvi-block-start { 136 | justify-content: flex-start; 137 | } 138 | 139 | &.bvi-block-center { 140 | justify-content: center; 141 | } 142 | 143 | &.bvi-block-end { 144 | justify-content: flex-end; 145 | } 146 | } 147 | 148 | .bvi-block { 149 | padding: .688rem .938rem; 150 | 151 | .bvi-block-title { 152 | text-align: center; 153 | font-weight: 600 !important; 154 | font-size: 1rem !important; 155 | display: block; 156 | margin-bottom: .8rem; 157 | } 158 | } 159 | 160 | .bvi-modal { 161 | position: fixed; 162 | top: 0; 163 | left: 0; 164 | width: 100%; 165 | height: 100%; 166 | overflow-x: hidden; 167 | overflow-y: auto; 168 | visibility: hidden; 169 | z-index: 1050; 170 | outline: 0; 171 | opacity: 0; 172 | background: rgba(0, 0, 0, 0.5); 173 | -webkit-transition: opacity 200ms ease-in; 174 | -moz-transition: opacity 200ms ease-in; 175 | transition: opacity 200ms ease-in; 176 | 177 | &.show { 178 | visibility: visible; 179 | opacity: 1; 180 | } 181 | 182 | .bvi-modal-dialog { 183 | max-width: 500px; 184 | margin: 1.75rem auto; 185 | display: flex; 186 | align-items: center; 187 | height: calc(100% - 3.5rem); 188 | pointer-events: none; 189 | } 190 | 191 | .bvi-modal-content { 192 | position: relative; 193 | display: flex; 194 | flex-direction: column; 195 | width: 100%; 196 | pointer-events: auto; 197 | background-color: #fff; 198 | background-clip: padding-box; 199 | border: 1px solid rgba(0, 0, 0, .2); 200 | border-radius: .3rem; 201 | outline: 0; 202 | max-height: 100%; 203 | overflow: hidden; 204 | } 205 | 206 | .bvi-modal-header { 207 | display: flex; 208 | flex-shrink: 0; 209 | align-items: center; 210 | justify-content: space-between; 211 | padding: .8rem .8rem; 212 | border-bottom: 1px solid #dee2e6; 213 | border-top-left-radius: calc(.3rem - 1px); 214 | border-top-right-radius: calc(.3rem - 1px); 215 | } 216 | 217 | .bvi-modal-title { 218 | margin-top: 0; 219 | margin-bottom: 0; 220 | line-height: 1.5; 221 | font-size: 1.25rem; 222 | font-weight: 600; 223 | color: black; 224 | } 225 | 226 | .bvi-modal-body { 227 | position: relative; 228 | flex: 1 1 auto; 229 | padding: 1rem; 230 | overflow-y: auto; 231 | 232 | &::-webkit-scrollbar { 233 | width: .5rem; 234 | background-color: transparent; 235 | opacity: 0; 236 | } 237 | 238 | &::-webkit-scrollbar-thumb { 239 | background-color: #dee2e6; 240 | border-radius: .25rem; 241 | } 242 | } 243 | 244 | .bvi-modal-footer { 245 | display: flex; 246 | flex-wrap: wrap; 247 | flex-shrink: 0; 248 | align-items: center; 249 | justify-content: flex-end; 250 | padding: .8rem .8rem; 251 | border-top: 1px solid #dee2e6; 252 | border-bottom-right-radius: calc(.3rem - 1px); 253 | border-bottom-left-radius: calc(.3rem - 1px); 254 | } 255 | 256 | .bvi-modal-close { 257 | float: right; 258 | font-size: 1.2rem !important; 259 | font-weight: 700; 260 | line-height: 1; 261 | text-shadow: 0 1px 0 #fff; 262 | opacity: .5; 263 | 264 | &:focus, 265 | &:hover { 266 | cursor: pointer; 267 | opacity: .75; 268 | } 269 | } 270 | } 271 | } 272 | } 273 | } 274 | -------------------------------------------------------------------------------- /src/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | 3 | // Panel 4 | $panel-color: #212529 !default; 5 | $panel-bg: #F5F5F5 !default; 6 | 7 | // Theme 8 | $theme-color-white: #000000; 9 | $theme-color-black: #ffffff; 10 | $theme-color-blue: #063462; 11 | $theme-color-brown: #4D4B43; 12 | $theme-color-green: #A9E44D; 13 | $theme-bg-white: #ffffff !default; 14 | $theme-bg-black: #000000 !default; 15 | $theme-bg-blue: #9DD1FF !default; 16 | $theme-bg-brown: #F7F3D6 !default; 17 | $theme-bg-green: #3B2716 !default; 18 | 19 | // Buttons 20 | $link-color: $panel-color !default; 21 | $link-bg: #f7f7f7 !default; 22 | $link-hover: #b6b6b6 !default; 23 | $link-border-color: #ADADAD !default; 24 | $link-active-color: $link-color !default; 25 | $link-active-bg: #b6b6b6 !default; 26 | -------------------------------------------------------------------------------- /src/scss/bvi.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Button visually impaired v1.0.0 (https://bvi.isvek.ru/) 3 | * Copyright 2014-2021 4 | * Licensed under MIT (https://github.com/veks/button-visually-impaired-javascript/blob/master/LICENSE.md) 5 | */ 6 | 7 | // Configuration 8 | @import "variables"; 9 | @import "mixins/body"; 10 | 11 | // Components 12 | @import "panel"; 13 | @import "body"; 14 | @import "images"; 15 | -------------------------------------------------------------------------------- /src/scss/mixins/_body.scss: -------------------------------------------------------------------------------- 1 | @mixin loop-size($counter) { 2 | @while $counter > 0 { 3 | &[data-bvi-fontsize='#{$counter}'] * { 4 | font-size: (0px + $counter) !important; 5 | 6 | h1, 7 | h1 * { 8 | font-size: (7px + $counter) !important; 9 | } 10 | 11 | h2, 12 | h2 * { 13 | font-size: (6px + $counter) !important; 14 | } 15 | 16 | h3, 17 | h3 * { 18 | font-size: (5px + $counter) !important; 19 | } 20 | 21 | h4, 22 | h4 * { 23 | font-size: (4px + $counter) !important; 24 | } 25 | 26 | h5, 27 | h5 * { 28 | font-size: (3px + $counter) !important; 29 | } 30 | 31 | h6, 32 | h6 * { 33 | font-size: (2px + $counter) !important; 34 | } 35 | } 36 | 37 | $counter: $counter - 1; 38 | } 39 | } 40 | 41 | @mixin loop-theme($name, $bg, $color) { 42 | &[data-bvi-theme='#{$name}']:not(.bvi-no-styles) { 43 | background-color: $bg !important; 44 | color: $color !important; 45 | fill: $color !important; 46 | border-color: $color !important; 47 | box-shadow: none !important; 48 | text-shadow: none !important; 49 | } 50 | 51 | &[data-bvi-theme='#{$name}'] *:not(.bvi-no-styles) { 52 | background-color: $bg !important; 53 | color: $color !important; 54 | fill: $color !important; 55 | border-color: $color !important; 56 | box-shadow: none !important; 57 | text-shadow: none !important; 58 | 59 | .bvi-speech-link, 60 | .bvi-speech-text { 61 | border-color: $color; 62 | } 63 | 64 | .bvi-link:not(.bvi-no-styles) { 65 | color: $color !important; 66 | background-color: transparent !important; 67 | text-underline: none !important; 68 | outline: 0 !important; 69 | text-decoration: none !important; 70 | 71 | &.disabled { 72 | color: rgba(red($color), green($color), blue($color), 0.5) !important; 73 | border: 1px solid rgba(red($color), green($color), blue($color), 0.5) !important; 74 | pointer-events: none; 75 | cursor: no-drop; 76 | text-decoration: none !important; 77 | 78 | &:focus { 79 | color: rgba(red($color), green($color), blue($color), 0.5) !important; 80 | border: 1px solid rgba(red($color), green($color), blue($color), 0.5) !important; 81 | text-underline: none !important; 82 | text-decoration: none !important; 83 | } 84 | } 85 | 86 | &:hover { 87 | color: $bg !important; 88 | background-color: $color !important; 89 | text-underline: none !important; 90 | text-decoration: none !important; 91 | } 92 | 93 | &:focus { 94 | color: $color !important; 95 | background-color: $bg !important; 96 | text-underline: none !important; 97 | text-decoration: none !important; 98 | } 99 | } 100 | 101 | :checked:not(.bvi-no-styles), 102 | :default:not(.bvi-no-styles), 103 | :disabled:not(.bvi-no-styles), 104 | :empty:not(.bvi-no-styles), 105 | :enabled:not(.bvi-no-styles), 106 | :first-child:not(.bvi-no-styles), 107 | :first-of-type:not(.bvi-no-styles), 108 | :focus:not(.bvi-no-styles), 109 | :indeterminate:not(.bvi-no-styles), 110 | :hover:not(.bvi-no-styles), 111 | :last-child:not(.bvi-no-styles), 112 | :last-of-type:not(.bvi-no-styles), 113 | :link:not(.bvi-no-styles), 114 | :nth-last-child:not(.bvi-no-styles), 115 | :nth-last-of-type:not(.bvi-no-styles), 116 | :nth-of-type:not(.bvi-no-styles), 117 | :only-child:not(.bvi-no-styles), 118 | :only-of-type:not(.bvi-no-styles), 119 | :optional:not(.bvi-no-styles), 120 | :read-write:not(.bvi-no-styles), 121 | :required:not(.bvi-no-styles), 122 | :root:not(.bvi-no-styles), 123 | :target:not(.bvi-no-styles), 124 | :valid:not(.bvi-no-styles), 125 | :visited:not(.bvi-no-styles), 126 | :first-child:first-letter:not(.bvi-no-styles), 127 | :default:not(.bvi-no-styles) { 128 | background-color: $bg !important; 129 | box-shadow: none !important; 130 | text-shadow: none !important; 131 | border-color: $color !important; 132 | color: $color !important; 133 | fill: $color !important; 134 | } 135 | 136 | &::after:not(.bvi-no-styles) { 137 | background-color: rgba(255, 255, 255, 0) !important; 138 | color: $color !important; 139 | box-shadow: none !important; 140 | text-shadow: none !important; 141 | border-color: transparent !important; 142 | } 143 | 144 | &::before:not(.bvi-no-styles) { 145 | background-color: rgba(255, 255, 255, 0) !important; 146 | color: $color !important; 147 | box-shadow: none !important; 148 | text-shadow: none !important; 149 | border-color: transparent !important; 150 | } 151 | 152 | &::selection:not(.bvi-no-styles) { 153 | background-color: $color !important; 154 | color: $bg !important; 155 | } 156 | 157 | & a:not(.bvi-no-styles) { 158 | outline: 0 !important; 159 | color: $color !important; 160 | background-color: transparent !important; 161 | 162 | &.active { 163 | color: $color !important; 164 | background-color: $bg !important; 165 | } 166 | 167 | &:hover:not(.bvi-no-styles) { 168 | color: $bg !important; 169 | background-color: $color !important; 170 | 171 | &:after { 172 | background-color: rgba(255, 255, 255, 0) !important; 173 | color: $bg !important; 174 | border-color: transparent !important; 175 | } 176 | 177 | &:before { 178 | background-color: rgba(255, 255, 255, 0) !important; 179 | color: $bg !important; 180 | border-color: transparent !important; 181 | } 182 | } 183 | } 184 | 185 | & button:not(.bvi-no-styles), 186 | & input[type="submit"]:not(.bvi-no-styles), 187 | & input[type="button"]:not(.bvi-no-styles), 188 | & button[type="submit"]:not(.bvi-no-styles), 189 | & button[type="button"]:not(.bvi-no-styles) { 190 | color: $bg !important; 191 | background-color: $color !important; 192 | } 193 | 194 | & button:hover, 195 | & input[type="button"]:hover:not(.bvi-no-styles), 196 | & input[type="submit"]:hover:not(.bvi-no-styles), 197 | & button[type="submit"]:hover:not(.bvi-no-styles), 198 | & button[type="button"]:hover:not(.bvi-no-styles) { 199 | &.active { 200 | color: $bg !important; 201 | background-color: $color !important; 202 | } 203 | 204 | &:hover { 205 | color: $bg !important; 206 | background-color: $color !important; 207 | } 208 | } 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Demo Button visually impaired 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 | 16 |
17 |

Button visually impaired

18 |

19 | Button visually impaired — это плагин, который автоматически изменяет версию вашего сайта для слабовидящих людей. 20 | Панель на сайте для слабовидящих дает возможность изменять цветовую гамму сайта, размеры шрифтов, синтезатор речи озвучит вслух изменения настроек. 21 | С помощью неё можно изменять функции сайта, которые удовлетворят потребностями людей с ограниченными возможностями. 22 |

23 |
24 |
25 |
26 | 27 |
28 |
29 |
30 |
31 |
32 | Александр Сергеевич Пушкин родился 6 июня 1799 года (по старому стилю 26 мая) в Москве в дворянской помещичьей семье (отец его был майор в отставке) в день праздника Вознесения. В тот же день у императора Павла родилась внучка, в честь которой во всех церквах шли молебны и гудели колокола. Так, по случайному совпадению день рождения 33 | русского 34 | гения был ознаменован всеобщим народным ликованием. Символично и место рождения поэта г. Москва — самое сердце русской жизни, России. Будущего поэта крестили 8 июня в церкви Богоявления в Елохове. 35 | 36 | Отец Пушкина Сергей Львович и мать Надежда Осиповна, урожденная Ганнибал, были дальними родственниками. Пылкие страсти, руководившие предками как по отцовской, так и по материнской линии, оказали свое влияние и на Пушкина. Семья (кроме Александра были еще дети Ольга и Лев) принадлежала к самой образованной части московского общества. 37 | 38 | В их доме, точнее, в квартире, которую снимали родители Пушкина, собирались поэты, художники, музыканты. Общая галломания, господствовавшая в обществе, французское воспитание в семье с французами гувернерами (к счастью, их удачно уравновешивали бабушка поэта Мария Алексеевна и знаменитая няня Арина Родионовна), доступ к прекрасным 39 | библиотекам 40 | отца, а также дяди поэта В. Л. Пушкина и дальних родственников Бутурлиных — формировали ум и детскую душу Пушкина. Свои первые в жизни стихи поэт написал по-французски. Его прозвище в Лицее было «француз». 41 | Из этого выпуска трое друзей поэта стали участниками восстания против царя 14 декабря 1825 г. 42 | 43 | В 1815 г. Пушкин с триумфом прочел на экзамене свое стихотворение «Воспоминание в Царском Селе» в присутствии знаменитого поэта Г. Р. Державина: «Старик Державин нас заметил и, в гроб сходя, благословил». На выпускном акте в 1817 г. Пушкин также прочел собственное стихотворение «Безверие». 44 | 45 | Вскоре Пушкин переехал в Петербург и поступил в коллегию иностранных дел в чине коллежского секретаря. Общение его очень широкое: гусары, поэты, литературные общества «Арзамас» и «Зеленая лампа», театры, модные рестораны, дуэли – «слава Богу, не смертоносные», как сообщала Е. А. Карамзина своему брату Вяземскому. Но Пушкин не растворялся в 46 | этой пестроте, он искал себя. 47 | 48 | Сразу после окончания Лицея в 1817 г., а затем в 1819 г. после тяжелой болезни Пушкин приезжал в имение матери с. Михайловское Псковской губернии. В первые годы по окончании Лицея им были написаны стихотворения «Деревня», «Домовому», «Чаадаеву», ода «Вольность», поэма «Руслан и Людмила». 49 |
50 |
51 |

58 |

64 |
65 |
66 |
67 | В 12 лет, получив начатки домашнего воспитания, Александр был отвезен учиться в новое, только что открывшееся 19 октября 1811 г. учебное заведение — Царскосельский Лицей под Петербургом, место, где располагалась летняя резиденция русских царей. 68 | 69 | Программа занятий в Лицее была обширной, но не столь глубоко продуманной. Воспитанники, однако, предназначались к высокой государственной карьере и имели права окончивших высшее учебное заведение. 70 | 71 | Немногочисленность учащихся (29 чел.), молодость ряда профессоров, гуманный характер их педагогических идей, ориентированный, по крайней мере, у лучшей части их, — на внимание и уважение к личности учеников, отсутствие телесных наказаний, дух чести и товарищества — все это создавало особую атмосферу. Пушкин сохранил лицейскую дружбу и 72 | культ 73 | Лицея на всю жизнь. Лицеисты выпускали рукописные журналы и уделяли много внимания собственному литературному творчеству. «Начал я писать с 13-летнего возраста и печатать почти с того же времени», — вспоминал Пушкин впоследствии. 74 |
75 |
76 |
77 |
78 |
79 |
80 |

© 2014–2021 bvi.isvek.ru

81 | 85 |
86 | 87 | 88 | 94 | 95 | 96 | --------------------------------------------------------------------------------