diff --git a/Knowledges/Библиотека/Книги/Git для профессионалов.md b/Knowledges/Библиотека/Книги/Git для профессионалов.md
index ef496bb..23b9f75 100644
--- a/Knowledges/Библиотека/Книги/Git для профессионалов.md
+++ b/Knowledges/Библиотека/Книги/Git для профессионалов.md
@@ -1,6 +1,6 @@
---
Тип: Книга
-Статус: Запланировано
+Статус: Прочитано
Название: Git для профессионалов
Автор:
- Чакон Скотт
diff --git a/Knowledges/Библиотека/Книги/covers/mobi-dik.jpg b/Knowledges/Библиотека/Книги/covers/mobi-dik.jpg
new file mode 100644
index 0000000..9c75263
Binary files /dev/null and b/Knowledges/Библиотека/Книги/covers/mobi-dik.jpg differ
diff --git a/Knowledges/Библиотека/Книги/Война миров.md b/Knowledges/Библиотека/Книги/Война миров.md
index f75dd4f..9937473 100644
--- a/Knowledges/Библиотека/Книги/Война миров.md
+++ b/Knowledges/Библиотека/Книги/Война миров.md
@@ -1,6 +1,6 @@
---
Тип: Книга
-Статус: Запланировано
+Статус: Прочитано
Название: Война миров
Автор:
- Герберт Уэллс
diff --git a/Knowledges/Библиотека/Книги/Моби Дик.md b/Knowledges/Библиотека/Книги/Моби Дик.md
new file mode 100644
index 0000000..d9c8249
--- /dev/null
+++ b/Knowledges/Библиотека/Книги/Моби Дик.md
@@ -0,0 +1,41 @@
+---
+Тип: Книга
+Статус: В процессе
+Название: Моби Дик
+Автор:
+ - Герман Мелвилл
+Количество страниц: 635
+Прогресс: 73
+Формат: Бумажная
+Обложка: Библиотека/Книги/covers/mobi-dik.jpg
+Начата: 09.03.2026
+Закончена:
+Оценка:
+Категории:
+ - Классика
+ - Художественная литература
+Ссылка:
+---
+
+# Моби Дик
+
+![[covers/mobi-dik.jpg]]
+
+## 📖 О книге
+
+Роман Германа Мелвилла (1851) — одна из вершин американской литературы, изначально отвергнутая современниками и признанная шедевром лишь посмертно. Рассказчик Измаил присоединяется к экипажу китобойца «Пекод» под командованием одержимого капитана Ахава, который жаждет мести гигантскому белому киту, оторвавшему ему ногу. Охота превращается в метафизическое противостояние человека с мировым злом — и самим собой.
+
+## 🧠 Ключевые темы
+
+- **Одержимость и саморазрушение** — Ахав жертвует кораблём, экипажем и собственной жизнью ради мести; его одержимость — архетип человека, уничтожаемого своей целью
+- **Зло и его природа** — Моби Дик как символ непостижимой враждебной силы вселенной; вопрос: является ли кит воплощением зла или человек сам проецирует на него свои страхи
+- **Судьба и свобода воли** — экипаж «Пекода» — срез человечества, влекомого чужой волей навстречу гибели
+- **Познание и тайна** — бесчисленные отступления о китах, море, китобойном деле как попытка объять необъятное; мир неисчерпаем и непознаваем
+- **Библейская образность** — имена (Измаил, Ахав, Рахиль), мотивы грехопадения, пророчества и искупления пронизывают весь текст
+
+## 💬 Важные цитаты
+
+> «Зовите меня Измаил.»
+
+> «Так сквозь густой туман моих смутных сомнений то здесь, то там проглядывает в моём сознании божественное наитие, воспламеняя мглу небесным лучом.»
+
diff --git a/Knowledges/Библиотека/Книги/Список книг.md b/Knowledges/Библиотека/Книги/Список книг.md
deleted file mode 100644
index 0dceb3e..0000000
--- a/Knowledges/Библиотека/Книги/Список книг.md
+++ /dev/null
@@ -1,38 +0,0 @@
-
-## Читаю сейчас
-
-
-```dataviewjs
-dv.table(["Название", "Автор", "Кол-во страниц", "Файл", "Обложка"],
- dv.pages('"Библиотека/Книги"')
- .where(p => p.Тип == "Книга" && p.Статус == "В процессе")
- .map(p => [
- p.Название,
- p.Автор,
- p["Количество страниц"],
- p.file.link,
- p.Обложка ? dv.span(``) : "—",
- ])
-)
-```
-
-
-## Запланировано
-
-
-## Прочитано
-
-
-```dataviewjs
-dv.table(["Название", "Автор", "Кол-во страниц", "Файл", "Обложка"],
- dv.pages('"Библиотека/Книги"')
- .where(p => p.Тип == "Книга" && p.Статус == "Прочитано")
- .map(p => [
- p.Название,
- p.Автор,
- p["Количество страниц"],
- p.file.link,
- p.Обложка ? dv.span(``) : "—",
- ])
-)
-```
\ No newline at end of file
diff --git a/Knowledges/Статистика/Список книг.md b/Knowledges/Статистика/Список книг.md
new file mode 100644
index 0000000..41e6195
--- /dev/null
+++ b/Knowledges/Статистика/Список книг.md
@@ -0,0 +1,144 @@
+
+## 📊 Статистика
+
+```dataviewjs
+const books = dv.pages('"Библиотека/Книги"').where(p => p.Тип == "Книга");
+const read = books.where(p => p.Статус == "Прочитано");
+const inProgress = books.where(p => p.Статус == "В процессе");
+const planned = books.where(p => p.Статус == "Хочу прочитать" || p.Статус == "Запланировано");
+const abandoned = books.where(p => p.Статус == "Заброшена");
+
+const totalPages = read.array().reduce((sum, p) => sum + (Number(p["Количество страниц"]) || 0), 0);
+const rated = read.where(p => p.Оценка);
+const avgRating = rated.length
+ ? (rated.array().reduce((s, p) => s + Number(p.Оценка), 0) / rated.length).toFixed(1)
+ : "—";
+
+dv.table(["", ""], [
+ ["📚 Всего книг", books.length],
+ ["✅ Прочитано", read.length],
+ ["📖 Читаю сейчас", inProgress.length],
+ ["🔖 Хочу прочитать", planned.length],
+ ["⛔ Заброшено", abandoned.length],
+ ["📄 Страниц прочитано", totalPages.toLocaleString("ru-RU")],
+ ["⭐ Средняя оценка", avgRating],
+]);
+```
+
+---
+
+```dataviewjs
+const books = dv.pages('"Библиотека/Книги"')
+ .where(p => p.Тип == "Книга" && p.Статус == "В процессе");
+
+if (!books.length) {
+ dv.paragraph("*Сейчас ничего не читаю*");
+} else {
+ dv.table(["Обложка", "Название", "Автор", "Прогресс", "Страниц"],
+ books.map(p => {
+ const total = Number(p["Количество страниц"]) || 0;
+ const done = Number(p.Прогресс) || 0;
+ const pct = total ? Math.round(done / total * 100) : 0;
+ const filled = Math.round(pct / 10);
+ const bar = "█".repeat(filled) + "░".repeat(10 - filled);
+ return [
+ p.Обложка ? dv.span(``) : "—",
+ p.file.link,
+ p.Автор ? [].concat(p.Автор).join(", ") : "—",
+ `\`${bar}\` ${pct}%`,
+ `${done} / ${total}`
+ ];
+ })
+ );
+}
+
+const details = document.createElement("details");
+details.setAttribute("open", "");
+const summary = document.createElement("summary");
+summary.innerHTML = `📖 Читаю сейчас (${books.length})`;
+details.appendChild(summary);
+Array.from(this.container.childNodes).forEach(n => details.appendChild(n));
+this.container.appendChild(details);
+```
+
+---
+
+```dataviewjs
+const fmt = f => ({ "Электронная": "📱", "Бумажная": "📗", "Аудио": "🎧" }[f] ?? "");
+const books = dv.pages('"Библиотека/Книги"')
+ .where(p => p.Тип == "Книга" && (p.Статус == "Хочу прочитать" || p.Статус == "Запланировано"))
+ .sort(p => p.Название, "asc");
+
+dv.table(["Обложка", "Название", "Автор", "Страниц", "Формат", "Категория"],
+ books.map(p => [
+ p.Обложка ? dv.span(``) : "—",
+ p.file.link,
+ p.Автор ? [].concat(p.Автор).join(", ") : "—",
+ p["Количество страниц"] || "—",
+ fmt(p.Формат),
+ p.Категории ? [].concat(p.Категории).join(", ") : "—"
+ ])
+);
+
+const details = document.createElement("details");
+const summary = document.createElement("summary");
+summary.innerHTML = `🔖 Хочу прочитать (${books.length})`;
+details.appendChild(summary);
+Array.from(this.container.childNodes).forEach(n => details.appendChild(n));
+this.container.appendChild(details);
+```
+
+---
+
+```dataviewjs
+const star = n => n ? `⭐ ${Number(n)}` : "—";
+const fmt = f => ({ "Электронная": "📱", "Бумажная": "📗", "Аудио": "🎧" }[f] ?? f ?? "—");
+const books = dv.pages('"Библиотека/Книги"')
+ .where(p => p.Тип == "Книга" && p.Статус == "Прочитано")
+ .sort(p => Number(p.Закончена) || 0, "desc");
+
+dv.table(["Обложка", "Название", "Автор", "Год", "Оценка", "Формат", "Категория"],
+ books.map(p => [
+ p.Обложка ? dv.span(``) : "—",
+ p.file.link,
+ p.Автор ? [].concat(p.Автор).join(", ") : "—",
+ p.Закончена || "—",
+ star(p.Оценка),
+ fmt(p.Формат),
+ p.Категории ? [].concat(p.Категории).join(", ") : "—"
+ ])
+);
+
+const details = document.createElement("details");
+const summary = document.createElement("summary");
+summary.innerHTML = `✅ Прочитано (${books.length})`;
+details.appendChild(summary);
+Array.from(this.container.childNodes).forEach(n => details.appendChild(n));
+this.container.appendChild(details);
+```
+
+---
+
+```dataviewjs
+const books = dv.pages('"Библиотека/Книги"')
+ .where(p => p.Тип == "Книга" && p.Статус == "Заброшена");
+
+if (!books.length) {
+ dv.paragraph("*Нет заброшенных книг*");
+} else {
+ dv.table(["Название", "Автор", "Прочитано страниц"],
+ books.map(p => [
+ p.file.link,
+ p.Автор ? [].concat(p.Автор).join(", ") : "—",
+ p.Прогресс || "—"
+ ])
+ );
+}
+
+const details = document.createElement("details");
+const summary = document.createElement("summary");
+summary.innerHTML = `⛔ Заброшено (${books.length})`;
+details.appendChild(summary);
+Array.from(this.container.childNodes).forEach(n => details.appendChild(n));
+this.container.appendChild(details);
+```