Быстрый старт
Запусти платформу и собери первый концепт
Быстрый старт
Требования
- Hugo >= 0.120
- Git
- Node.js >= 18 (нужен только для разработки атомов)
Запуск
git clone <адрес репозитория>
cd lik-learn
hugo server
Открой http://localhost:1313. Платформа работает локально.
Для работы над JS-компонентами дополнительно:
cd site && npm install
npm run dev # watch
npm run build # сборка в site/dist/, затем в static/js/ и assets/css/
Структура проекта
content/
concepts/{id}/index.md урок (page bundle)
tracks/{id}.md страница трека (stub из двух полей)
paths/{id}.md страница пути (stub из двух полей)
docs/ эта документация
data/
atoms.yaml источник истины по атомам
directions/{id}.yaml верхнеуровневые группы
tracks/{id}.yaml данные трека
paths/{id}.yaml данные пути
scenarios/{id}.yaml ветвящиеся сценарии
layouts/
shortcodes/ Markdown в атом
concepts/ шаблоны видов концепта
partials/ герой, мотивы, цели
site/src/
atoms/ классы атомов: _core, universal, math, code, immersive, visual
mechanics/ timer, hp-bar, progress, narrative
core/ EventBus, состояние, сессии, повторение
scripts/
validate-concept.py гейт концептов
validate-shortcodes.sh проверка существования шорткодов
Первый концепт
Концепт это папка с index.md. Фронтматтер обязателен, и гейт проверяет его строго.
---
id: my-first-concept
title: "Название темы"
description: "Одно предложение о том, чему учит урок"
concept_type: material
tags: [биология, егэ]
level: 3
duration: "15 мин"
hero:
motif: lens
theme: science
eyebrow: "Биология"
lead: "Крючок на одно-два предложения, ради которого урок открывают."
stats:
- value: "1887"
label: "год открытия"
- value: "2 пути"
label: "фотосинтез и хемосинтез"
learning_objectives:
- "Отличить хемосинтез от фотосинтеза по источнику энергии в незнакомом описании"
- "Объяснить, откуда берут энергию сообщества без солнечного света"
- "Оценить, какие выводы о таких сообществах обоснованы, а какие нет"
content_graph:
topics:
- id: main
label: "Хемосинтез"
expanded: true
children:
- id: energy
label: "Источник энергии"
children:
- { label: "Окисление сероводорода", note: "вместо света" }
---
## Материал
Здесь идёт настоящий учебный текст.
## Проверь себя
{{< quiz question="Что служит источником энергии при хемосинтезе?" >}}
{{< option >}}Солнечный свет{{< /option >}}
{{< option correct="true" >}}Окисление неорганических веществ{{< /option >}}
{{< option >}}Тепло гидротермального источника{{< /option >}}
{{< /quiz >}}
Открой http://localhost:1313/concepts/my-first-concept/.
Что проверяет гейт
python3 scripts/validate-concept.py
concept_typeиcontent_graphприсутствуют;learning_objectivesот 3 до 5 штук;- все id в
connections.before/after/relatedсуществуют вcontent/concepts/; - не меньше 700 слов прозы и не меньше 60 слов на каждый проверяющий атом;
- минимум три разных проверяющих атома, ни один не больше 40 процентов интерактивов;
- высота атомов по Блуму дотягивает до глагола каждой учебной цели;
- каждый использованный атом описан в
data/atoms.yaml; - верный вариант не стоит первым во всех quiz сразу.
Перед написанием материала прочитай планку строгости: она объясняет, почему эти пороги именно такие.
Атомы
Имя атома и имя шорткода совпадают не всегда. Атом quiz-question вставляется шорткодом quiz с вложенными option. Полный список в каталоге, он генерируется из data/atoms.yaml.
{{< flashcard front="Вопрос" back="Ответ" >}}
{{< true-false statement="Хемосинтез идёт на свету" correct="false" >}}
{{< fill-blank text="Энергию хемосинтетики получают из [окисления] неорганических веществ" >}}
Атом без выделенного шорткода вставляется универсальным:
{{< atom type="appraise" >}}
Визуальный слой
Типографика урока это часть подачи, а не оформление:
{{< dropcap lines="3" variant="accent" >}}
Первый абзац урока, ровно один абзац.
{{< /dropcap >}}
{{< claim type="src" source="Виноградский, 1887" >}}
Утверждение, у которого есть источник.
{{< /claim >}}
{{< marginalia kind="date" label="1977" >}}
Заметка на полях рядом с нужным абзацем.
{{< /marginalia >}}
{{< breather note="Остановись здесь" >}}
Пауза перед важным.
{{< /breather >}}
Метки достоверности (fact, src, debate) обязательны для тем предметного и экзаменационного тира.
Механики
{{< with-timer duration="5m" warning="1m" >}}
{{< quiz question="..." >}}...{{< /quiz >}}
{{< /with-timer >}}
{{< with-hp lives="3" >}}
{{< quiz question="..." >}}...{{< /quiz >}}
{{< /with-hp >}}
Трек
Трек это два файла.
1. Данные, data/tracks/my-track.yaml
id: "my-track"
title: "Мой трек"
description: "Группа связанных концептов"
duration: "1.5 часа"
level: 1
tags: [биология]
icon: "search"
concepts: [my-first-concept, another-concept]
mode: "sequential" # или free
2. Страница, content/tracks/my-track.md
---
title: "Мой трек"
dataFile: "my-track"
---
Путь устроен так же: data/paths/{id}.yaml плюс stub в content/paths/{id}.md с тем же dataFile.
Полезные команды
hugo server # dev-сервер
hugo server -D # вместе с черновиками
hugo --renderToMemory # проверка сборки без записи на диск
hugo --minify # production
./verify-build.sh # smoke-тест
python3 scripts/validate-concept.py # гейт концептов
./scripts/validate-shortcodes.sh # существуют ли использованные шорткоды
Следующие шаги
- Философия зачем платформа устроена так
- Планка строгости обязательна перед написанием материала
- Структура контента концепты, треки, пути
- Каталог атомов что брать и когда НЕ брать