# mp4.krypta.li // FILE INDEX

Киберпанк-тема для `ngx_http_fancyindex_module`: чёрный фон с тёмно-красным
свечением по центру, синие элементы, scanlines, глитчи, CSS-3D и много
декоративного шума. Основана на палитре и типографике `base_theme.html`.

```
header.html   — <head>, фоновые слои, HUD, SVG-спрайт иконок, открытый <h1>
footer.html   — закрытие вёрстки, нижний HUD и весь JS оживления листинга
style.css     — тема целиком (@font-face, слои, таблица, FX-режимы)
fonts/        — Orbitron / Rajdhani / JetBrains Mono в woff2 (локально, ~120 КБ)
favicon.svg   — иконка вкладки
dev/          — пример конфига nginx и генератор превью (в прод не нужны)
preview.html  — собранное превью, можно открыть прямо в браузере
```

## Установка

1. Положить `header.html`, `footer.html`, `style.css`, `fonts/`, `favicon.svg`
   в каталог `fancyindex_nginx/` в корне сайта (именно этот префикс прописан
   в `<link>` внутри `header.html`; другой префикс — правится там же, в трёх
   строках). `@font-face` ссылается на `fonts/` относительно `style.css`,
   так что при переносе темы CSS трогать не надо.
2. Подключить по образцу `dev/nginx.conf.example`.
3. `nginx -t && nginx -s reload`.

## Три вещи, на которых это ломается

**`<h1>` в `header.html` не закрыт — так и надо.** При `fancyindex_show_path on`
модуль сразу после хедера печатает экранированный URI и `</h1>` (шаблон
`t05_body2`). Поэтому последняя строка `header.html` — открытый `<h1>`, который
закроет сам модуль. Если закрыть его руками, в разметке появится второй,
висячий `</h1>`, а путь вывалится наружу заголовка.

**`fancyindex_css_href` не работает с кастомным хедером.** Модуль вставляет
`<link>` только внутрь своего встроенного `<head>` (`make_header_buf()`), а при
заданном `fancyindex_header` этот `<head>` не генерируется вовсе. То есть строка
`fancyindex_css_href "/fancyindex_nginx/style.css";` в конфиге — мёртвая, её
можно удалить: стиль подключён напрямую в `header.html`.

**`footer.html` обязан закрывать `</body></html>`.** Встроенный шаблон
`t08_foot1` при кастомном футере не отправляется.

## Что делает JS в footer.html

Модуль отдаёт таблицу без классов по типам файлов, поэтому всё навешивается
на клиенте (скрипт стоит после `</table>`, DOM уже готов):

- тип файла по расширению → цвет строки и SVG-иконка из спрайта (13 категорий);
- полоска заполнения у размера (лог-шкала от самого большого файла в каталоге);
- относительное время («12 мин назад»), оригинал уезжает в `title`;
  даты в будущем остаются как есть;
- хлебные крошки из `location.pathname`;
- живой фильтр с подсветкой совпадений и счётчиком, хоткеи
  <kbd>/</kbd> <kbd>j</kbd> <kbd>k</kbd> <kbd>Enter</kbd> <kbd>Backspace</kbd>;
- подсветка активной колонки сортировки (читается из `?C=` / `?O=`);
- 3D-тилт строки под курсором, спотлайт, случайные глитчи;
- переключатель FX и статистика внизу.

Парсер размеров понимает и `4.6 MiB`, и сырые байты при `fancyindex_exact_size on`.
Парсер дат заточен под формат по умолчанию `%Y-%b-%d %H:%M`; при другом
`fancyindex_time_format` дата просто останется в исходном виде.

**Без JS страница остаётся полностью читаемой и стилизованной** — пропадают
только иконки, крошки, фильтр и цвета по типам.

## FX-режимы

Кнопка `FX` в правом верхнем углу циклит `FULL → LITE → OFF`, выбор
запоминается в `localStorage` (`nc.fx`). По умолчанию — `FULL`.

- **FULL** — всё: blur, свечения, зерно, развёртка, перспективная сетка, тилт.
- **LITE** — без `backdrop-filter`, зерна, сетки и спотлайта. Для VR-браузера:
  это самые дорогие по fill-rate эффекты.
- **OFF** — только цвета и вёрстка, никакого движения.

Системная настройка «уменьшить движение» включает `LITE` при первом заходе;
кнопкой её можно перебить.

## VR

Тема рассчитана на просмотр во встроенном браузере шлема:

- строки высотой 46–52 px — попадание лучом контроллера без снайпинга;
- крупный кегль (17–19 px) и высокий контраст;
- фон вынесен в `position: fixed` слои вместо `background-attachment: fixed`
  (в мобильном Chromium он тормозит и подтекает);
- если фреймрейт просядет — один клик на `FX: LITE`.

## Превью без nginx

```bash
python3 dev/make_preview.py && open preview.html
```

Генератор собирает `preview.html` из твоих `header.html` + `footer.html` и
середины, которая буквально повторяет шаблоны модуля (`template.h` и
`make_content_buf` из `ngx_http_fancyindex_module.c`) — включая `colspan`,
`class="link|size|date"`, ссылки сортировки `?C=N&O=A` и строку
`Parent directory/`. Если тема разъедется здесь, она разъедется и на бою.

## Правка под себя

Палитра — в `:root` в начале `style.css` (первый блок переменных совпадает с
`base_theme.html`). Цвета по типам файлов — блок «Цветовая кодировка по типу»;
селекторы там начинаются с `#list tbody` не случайно: без этого префикса они
проигрывают по специфичности базовому правилу `#list tbody td.link a`.

Тексты бегущих строк — в `header.html` и `footer.html`, класс `.ticker__track`.
Список расширений и иконок — массив `KINDS` в `footer.html`, иконки — `<symbol>`
в SVG-спрайте в `header.html`.
