` будут пропущены. Сработает только событие `mouseout` на `#FROM` и `mouseover` на `#TO`.
@@ -53,7 +53,7 @@
В частности, возможна ситуация, когда курсор прыгает в середину страницы, и при этом `relatedTarget=null`, то есть он пришёл "ниоткуда" (на самом деле извне окна):
-

+

Обратим внимание ещё на такую деталь. При быстром движении курсор окажется над `#TO` сразу, даже если этот элемент глубоко в DOM. Его родители при движении сквозь них события не поймают.
@@ -77,7 +77,7 @@
**При переходе на потомка срабатывает `mouseout` на родителе.**
-

+

Это кажется странным, но легко объяснимо.
diff --git a/4-ajax/5-xhr-crossdomain/article.md b/4-ajax/5-xhr-crossdomain/article.md
index 70bb83c2..559c0f83 100644
--- a/4-ajax/5-xhr-crossdomain/article.md
+++ b/4-ajax/5-xhr-crossdomain/article.md
@@ -111,7 +111,7 @@ Origin:http://javascript.ru
**Только при наличии такого заголовка в ответе -- браузер сочтёт запрос успешным, а иначе JavaScript получит ошибку.**
-

+

То есть, ответ сервера может быть примерно таким:
@@ -275,7 +275,7 @@ Access-Control-Allow-Credentials: true
Дополнительно он может указать `Access-Control-Max-Age: sec`, где `sec` -- количество секунд, на которые нужно закэшировать разрешение. Тогда при последующих вызовах метода браузер уже не будет делать предзапрос.
-

+

Давайте рассмотрим предзапрос на конкретном примере.
diff --git a/5-animation/1-bezier/article.md b/5-animation/1-bezier/article.md
index 97834146..0b5a8140 100644
--- a/5-animation/1-bezier/article.md
+++ b/5-animation/1-bezier/article.md
@@ -16,15 +16,15 @@
По двум точкам:
-

+

По трём точкам:
-

+

По четырём точкам:
-

+

Если вы посмотрите внимательно на эти кривые, то "на глазок" заметите:
@@ -34,7 +34,7 @@
Для двух точек -- это линейная кривая (т.е. прямая), для трёх точек -- квадратическая кривая (парабола), для четырёх -- кубическая.
**Кривая всегда находится внутри [выпуклой оболочки](http://ru.wikipedia.org/wiki/%D0%92%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D0%B0%D1%8F_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B0), образованной опорными точками:**
-
+
Благодаря последнему свойству в компьютерной графике можно оптимизировать проверку пересечений двух кривых. Если их выпуклые оболочки не пересекаются, то и кривые тоже не пересекутся.
@@ -52,7 +52,7 @@
Вот некоторые примеры:
-

+

## Математика
@@ -124,8 +124,8 @@
- |
- |
+ |
+ |
diff --git a/5-animation/1-bezier/demo.png b/5-animation/1-bezier/demo.svg
similarity index 100%
rename from 5-animation/1-bezier/demo.png
rename to 5-animation/1-bezier/demo.svg
diff --git a/5-animation/2-css-transitions/2-animate-logo-bezier-css/solution.md b/5-animation/2-css-transitions/2-animate-logo-bezier-css/solution.md
index 00c487de..7965bd15 100644
--- a/5-animation/2-css-transitions/2-animate-logo-bezier-css/solution.md
+++ b/5-animation/2-css-transitions/2-animate-logo-bezier-css/solution.md
@@ -4,4 +4,4 @@
Её график:
-

\ No newline at end of file
+

\ No newline at end of file
diff --git a/5-animation/2-css-transitions/article.md b/5-animation/2-css-transitions/article.md
index 11786c03..7a1c614b 100644
--- a/5-animation/2-css-transitions/article.md
+++ b/5-animation/2-css-transitions/article.md
@@ -158,7 +158,7 @@ stripe.onclick = function() {
График этой "кривой" таков:
-

+

...Как видно, это просто прямая. По мере того, как проходит время `x`, завершённость анимации `y` равномерно приближается от `0` к `1`.
@@ -182,7 +182,7 @@ CSS для анимации:
График этой кривой:
-

+

Как видно, процесс вначале развивается быстро -- кривая резко идёт вверх, а затем всё медленнее, медленнее.
@@ -222,10 +222,10 @@ CSS для анимации:
`(0.42, 0, 0.58, 1.0)` |
- |
- |
- |
- |
+ |
+ |
+ |
+ |
@@ -260,7 +260,7 @@ CSS для анимации:
Почему так происходит -- отлично видно, если взглянуть на кривую Безье с указанными опорными точками:
-

+

Мы вынесли координату `y` для второй опорной точки на 1 ниже нуля, а для третьей опорной точки -- на 1 выше единицы, поэтому и кривая вышла за границы "обычного" квадрата. Её значения по `y` вышли из стандартного диапазона `0..1`.
diff --git a/5-animation/2-css-transitions/bezier-linear.png b/5-animation/2-css-transitions/bezier-linear.png
index 5b7250d9..908e13dd 100644
Binary files a/5-animation/2-css-transitions/bezier-linear.png and b/5-animation/2-css-transitions/bezier-linear.png differ
diff --git a/5-animation/2-css-transitions/bezier-linear@2x.png b/5-animation/2-css-transitions/bezier-linear@2x.png
new file mode 100644
index 00000000..31e7ae8e
Binary files /dev/null and b/5-animation/2-css-transitions/bezier-linear@2x.png differ
diff --git a/5-animation/3-js-animation/article.md b/5-animation/3-js-animation/article.md
index cffc3bc7..32b265f8 100644
--- a/5-animation/3-js-animation/article.md
+++ b/5-animation/3-js-animation/article.md
@@ -181,7 +181,7 @@ function linear(timeFraction) {
}
```
Её график:
-

+

Как видно, её график полностью совпадает с `transition-timing-function: linear`, и эффект абсолютно такой же.
@@ -244,14 +244,14 @@ function quad(progress) {
**График квадратичной функции:**
-

+

Пример для квадратичной функции (клик для просмотра):
[iframe height=40 src="quad" link]
Увеличение степени влияет на ускорение. Например, график для 5-й степени:
-

+

В действии:
[iframe height=40 src="quint" link]
@@ -268,7 +268,7 @@ function circ(timeFraction) {
**График:**
-

+

[iframe height=40 src="circ" link]
@@ -289,7 +289,7 @@ function back(x, timeFraction) {
**График для `x = 1.5`:**
-

+

Пример для `x = 1.5`:
@@ -331,7 +331,7 @@ function elastic(x, timeFraction) {
```
**График для `x=1.5`:**
-

+

Пример для `x=1.5`:
@@ -380,7 +380,7 @@ var bounceEaseOut = makeEaseOut(bounce);
На этом графике видно, как преобразование `easeOut` изменяет поведение функции:
-

+

Если есть анимационный эффект, такой как подпрыгивание -- он будет показан в конце, а не в начале (или наоборот, в начале, а не в конце).
@@ -429,7 +429,7 @@ bounceEaseInOut = makeEaseInOut(bounce);
Это отлично видно, если посмотреть графики `easeIn`, `easeOut` и `easeInOut` на примере функции `circ`:
-

+
- Красным цветом обозначен обычный вариант функции `circ`.
diff --git a/5-animation/3-js-animation/bezier-linear.png b/5-animation/3-js-animation/bezier-linear.png
index 5b7250d9..908e13dd 100644
Binary files a/5-animation/3-js-animation/bezier-linear.png and b/5-animation/3-js-animation/bezier-linear.png differ
diff --git a/5-animation/3-js-animation/bezier-linear@2x.png b/5-animation/3-js-animation/bezier-linear@2x.png
new file mode 100644
index 00000000..31e7ae8e
Binary files /dev/null and b/5-animation/3-js-animation/bezier-linear@2x.png differ
diff --git a/6-optimize/2-minification/article.md b/6-optimize/2-minification/article.md
index 22cb1700..2ca21e36 100644
--- a/6-optimize/2-minification/article.md
+++ b/6-optimize/2-minification/article.md
@@ -97,7 +97,7 @@ function User(name) {
Результат, получившееся из `my.js` дерево:
-
+
В узлах-эллипсах на иллюстрации выше стоит тип, например `FUNCTION` (функция) или `NAME` (имя переменной). Комментарии к ним на русском языке добавлены мной вручную.
diff --git a/6-optimize/4-memory-leaks/article.md b/6-optimize/4-memory-leaks/article.md
index 08ed1610..b3a5a5b1 100644
--- a/6-optimize/4-memory-leaks/article.md
+++ b/6-optimize/4-memory-leaks/article.md
@@ -164,7 +164,7 @@ function leak() {
Посмотрим, какая структура памяти создается при каждом запуске:
-
+
Когда запускается асинхронный запрос `xhr`, браузер создаёт специальную внутреннюю ссылку (internal reference) на этот объект. находится в процессе коммуникации. Именно поэтому объект `xhr` будет жив после окончания работы функции.
diff --git a/8-css-for-js/10-box-sizing/article.md b/8-css-for-js/10-box-sizing/article.md
index 9fac4383..41b94b51 100644
--- a/8-css-for-js/10-box-sizing/article.md
+++ b/8-css-for-js/10-box-sizing/article.md
@@ -29,7 +29,7 @@ div {
}
```
-
+
В верхнем случае браузер нарисовал весь элемент размером в `width x height`, в нижнем -- интерпретировал `width/height` как размеры внутренней области.
diff --git a/figures.sketch b/figures.sketch
index 2dcd1fe9..0722a46f 100644
Binary files a/figures.sketch and b/figures.sketch differ