├── .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,U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","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
\n
').concat(this._i18n.t("speech"),'
\n
\n \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 |
534 |
543 |
555 |
556 |
557 |
558 |
559 |
563 |
564 |
565 |
571 |
577 |
582 |
587 |
588 |
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 |
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 |
--------------------------------------------------------------------------------