Движок презентаций
Демо-дека: каждый компонент из design/AUTHORING.md на одном экране.
Вывод терминала и снимки браузера — настоящие захваты из captures/demo/,
id начинаются с demo-. Код в примерах — иллюстративный.
10 слайдов офлайн, без CDN тема void-theme
Обычный Markdown
Абзацы, жирный, курсив, код в строке, Ctrl + K,
ссылки и списки работают как обычно. Классы добавляются через
{: .класс} на отдельной строке.
Параграф с классом .lead — вводный текст крупнее основного.
Что есть на слайде
- заголовки
###и####внутри слайда; - списки и вложенные списки;
- таблицы в стиле темы;
- бейджи успех ошибка инфо.
| Компонент | Блок в markdown | Захват |
|---|---|---|
| Терминал | ```term cap=… |
captures/*/manifest.jsonl |
| Снимок | ```shot cap=… |
captures/browser/*.png |
| Код | ```php hl=2 |
подсветка Pygments |
| Дерево | ```tree |
без захвата |
Терминал из реального захвата
Команда «набирается», вывод печатается построчно. Клик по окну показывает всё сразу, кнопки в шапке повторяют вывод и копируют команду.
PHP 8.3.6 (cli) (built: Sep 2 2026 12:56:02) (NTS)Copyright (c) The PHP GroupZend Engine v4.3.6, Copyright (c) Zend Technologies with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies
Разбор команды
Первая команда шага: убеждаемся, что интерпретатор стоит и стенд отвечает той версией, на которой построен урок.
php -v| Токен | Зачем он и что меняет |
|---|---|
php | исполняемый файл интерпретатора; в Ubuntu/Mint ставится пакетом php8.3-cli |
-v | флаг версии: печатает версию PHP и Zend Engine и выходит |
Что произойдёт
Команда ничего не меняет на диске: печатает четыре строки версии и завершается с кодом 0.
На что смотреть
Первая строка: PHP 8.3.6 (cli) — это версия CLI. Стенд урока 8.3; подставьте свою версию, если она другая.
Частые ошибки
- php: command not found — не установлен пакет php8.3-cli или команда выполняется не в той оболочке.
Строки классифицируются эвристикой: служебные — приглушённые, успех — зелёные,
ошибки — красные. Явные номера строк в манифесте (ok_lines, err_lines)
важнее эвристики.
Ошибка, exit code и длинный вывод
Could not open input file: artisanРазбор команды
Показываем типичную ошибку до установки Laravel: artisan ещё нет, и команда падает. Это нормальное состояние шага.
php artisan --version| Токен | Зачем он и что меняет |
|---|---|
php | интерпретатор выполняет файл, указанный следующим аргументом |
artisan | относительный путь к скрипту проекта; в домашнем каталоге такого файла нет |
--version | флаг artisan: напечатать версию Laravel — до неё дело не доходит |
Что произойдёт
PHP не находит файл artisan в текущем каталоге, печатает одну строку ошибки и завершается с кодом 1.
На что смотреть
Строка Could not open input file: artisan и код выхода 1: проблема в текущем каталоге, а не в PHP.
Частые ошибки
- Команда запущена вне корня проекта: artisan лежит в корне Laravel, рядом с composer.json.
- После установки Laravel та же команда в корне проекта печатает версию фреймворка.
Движок рисует бейдж exit code 1 в шапке окна. Это не сбой сборки: команда
действительно так завершилась на коробке захвата.
phpinfo()PHP Version => 8.3.6System => Linux mint 6.18.46 #1-NixOS SMP PREEMPT_DYNAMIC Sun Aug 23 12:27:10 UTC 2026 x86_64Build Date => Sep 2 2026 12:56:02Build System => LinuxServer API => Command Line InterfaceVirtual Directory Support => disabledConfiguration File (php.ini) Path => /etc/php/8.3/cliLoaded Configuration File => /etc/php/8.3/cli/php.iniScan this dir for additional .ini files => /etc/php/8.3/cli/conf.dAdditional .ini files parsed => /etc/php/8.3/cli/conf.d/10-mysqlnd.ini,/etc/php/8.3/cli/conf.d/10-opcache.ini,/etc/php/8.3/cli/conf.d/10-pdo.ini,/etc/php/8.3/cli/conf.d/15-xml.ini,/etc/php/8.3/cli/conf.d/20-bcmath.ini,/etc/php/8.3/cli/conf.d/20-calendar.ini,/etc/php/8.3/cli/conf.d/20-ctype.ini,/etc/php/8.3/cli/conf.d/20-curl.ini,/etc/php/8.3/cli/conf.d/20-dom.ini,/etc/php/8.3/cli/conf.d/20-exif.ini,/etc/php/8.3/cli/conf.d/20-ffi.ini,/etc/php/8.3/cli/conf.d/20-fileinfo.ini,/etc/php/8.3/cli/conf.d/20-ftp.ini,/etc/php/8.3/cli/conf.d/20-gd.ini,/etc/php/8.3/cli/conf.d/20-gettext.ini,/etc/php/8.3/cli/conf.d/20-iconv.ini,/etc/php/8.3/cli/conf.d/20-intl.ini,/etc/php/8.3/cli/conf.d/20-mbstring.ini,/etc/php/8.3/cli/conf.d/20-mysqli.ini,/etc/php/8.3/cli/conf.d/20-pdo_mysql.ini,/etc/php/8.3/cli/conf.d/20-pdo_sqlite.ini,/etc/php/8.3/cli/conf.d/20-phar.ini,/etc/php/8.3/cli/conf.d/20-posix.ini,/etc/php/8.3/cli/conf.d/20-readline.ini,/etc/php/8.3/cli/conf.d/20-shmop.ini,/etc/php/8.3/cli/conf.d/20-simplexml.ini,/etc/php/8.3/cli/conf.d/20-sockets.ini,/etc/php/8.3/cli/conf.d/20-sqlite3.ini,/etc/php/8.3/cli/conf.d/20-sysvmsg.ini,/etc/php/8.3/cli/conf.d/20-sysvsem.ini,/etc/php/8.3/cli/conf.d/20-sysvshm.ini,/etc/php/8.3/cli/conf.d/20-tokenizer.ini,/etc/php/8.3/cli/conf.d/20-xmlreader.ini,/etc/php/8.3/cli/conf.d/20-xmlwriter.ini,/etc/php/8.3/cli/conf.d/20-xsl.ini,/etc/php/8.3/cli/conf.d/20-zip.iniPHP API => 20230831PHP Extension => 20230831Zend Extension => 420230831Zend Extension Build => API420230831,NTSPHP Extension Build => API20230831,NTSDebug Build => noThread Safety => disabledZend Signal Handling => enabledZend Memory Manager => enabledZend Multibyte Support => provided by mbstringZend Max Execution Timers => disabledIPv6 Support => enabledDTrace Support => disabledRegistered PHP Streams => https, ftps, compress.zlib, php, file, glob, data, http, ftp, phar, zipRegistered Stream Socket Transports => tcp, udp, unix, udg, ssl, tls, tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3Registered Stream Filters => zlib.*, string.rot13, string.toupper, string.tolower, convert.*, consumed, dechunk, convert.iconv.*This program makes use of the Zend Scripting Language Engine:Zend Engine v4.3.6, Copyright (c) Zend Technologies with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies _______________________________________________________________________
Разбор команды
Смотрим, какой конфигурационный файл реально читает CLI: от него зависят включённые модули и пределы.
php -i | head -72| Токен | Зачем он и что меняет |
|---|---|
php | интерпретатор |
-i | напечатать phpinfo() в терминал: всю эффективную конфигурацию |
| | pipe: stdout левой команды становится stdin правой |
head | оставляет начало потока |
-72 | аргумент head: ровно 72 строки, чтобы не листать сотни |
Что произойдёт
phpinfo() печатает эффективную конфигурацию CLI, head обрезает вывод до 72 строк; код выхода 0.
На что смотреть
Строка Loaded Configuration File: какой php.ini читает CLI. У fpm свой php.ini — не путайте их.
Частые ошибки
- Правите не тот php.ini: cli и fpm читают разные файлы, изменения для сайта проверяйте через php-fpm.
Больше 60 строк — окно ограничивается по высоте с внутренней прокруткой,
fold=16 прячет хвост за кнопку «показать ещё».
Код: подсветка и hl=
Подсветка — Pygments, но цвета токенов заданы из переменных темы, поэтому палитра меняется вместе с гаммой и светлым/тёмным режимом.
hl=4,6-8 подсвечивает строки полосой и отметкой на полях, номера строк
появляются вместе с hl= или с флагом lines.
Разные языки и diff
Длинный файл из захвата kind:"file": fold=18 прячет хвост за кнопку
«показать ещё», hl=26-27 подсвечивает строки ЗА границей свёртки — они видны
после раскрытия. Кнопка копирования отдаёт файл целиком, в режиме чтения
и в печати блок раскрыт.
Карточка файла и дерево
users/├── app/ # наш код: модели, контроллеры│ ├── Http/│ │ └── Controllers/│ │ └── UserController.php│ └── Models/│ └── User.php├── routes/│ └── web.php # таблица маршрутов└── public/ # единственная папка, которую видит nginx └── index.php
Дерево моноширинное: линии сохраняются, комментарии после # приглушены,
каталоги выделены цветом.
Инфоблоки и шаги
Шесть тонов: note, info, tip, warn, danger, success.
Иконка и тон берутся из темы, фон — color-mix без альфа-модификаторов.
Заголовок блока необязателен: тогда текст идёт сразу под иконкой.
Команда из захвата не переписывается: что напечатала машина, то и на слайде.
Тон danger — для того, что действительно ломает работу.
Тон success — для проверенного результата.
Слайд пишется в src/parts/part-NN.md, блоки — по design/AUTHORING.md.
bin/build.py превращает markdown в html/part-NN.html.
Скриншоты headless-браузером и глаза: числа и кадры, а не прилагательные.
Скриншот браузера
Рамка браузера с адресной строкой из захвата. Клик по снимку открывает лайтбокс:
зум, Esc — закрыть, стрелки листают снимки слайда.

Сравнение «до» и «после»
cap2= ставит два снимка рядом с подписями: слева прежнее состояние,
справа результат правки.


Векторная инфографика: жизненный цикл запроса
:::flow — граф в YAML-подобном теле: rows задают ряды, nodes — карточки
с иконкой tabler, edges — рёбра с подписями и видом (forward, data, back).
По прямому пути бежит пакет, по обратному — свой навстречу.
Флоу с рёбрами kind: data
Тот же компонент, другая форма графа: два ряда и вертикальные рёбра данных соединяют пары «файл до — файл после». Пакет бежит по каждому ребру данных.
Компактный флоу с бейджами кэша
compact — для схем на 6–8 узлов: карточки меньше, без подподписей, подписи рёбер
спрятаны в tooltip линии. align=left не растягивает узкую схему на весь слайд,
бейджи-пилюли висят над узлами.
Управление
← → Space — листать · O — обзор · T — тема · R — чтение
Гамма переключается кнопкой в шапке: blocks, adwaita, monokai.
Позиция и тема запоминаются в localStorage, ссылка #s4 ведёт сразу
на четвёртый слайд.
Демо-дека движка. Контент урока пишется отдельно в src/parts/part-*.md.