diff --git a/docs/razorconsole/README.md b/docs/razorconsole/README.md new file mode 100644 index 0000000..2de080b --- /dev/null +++ b/docs/razorconsole/README.md @@ -0,0 +1,34 @@ +# RazorConsole — Документация + +Документация по библиотеке [RazorConsole](https://github.com/RazorConsole/RazorConsole) для проекта LazyBearWorks. + +## Файлы + +| Файл | Содержание | +|---|---| +| [overview.md](overview.md) | Обзор, установка, минимальный пример, примеры приложений | +| [components.md](components.md) | Полный справочник по 25+ встроенным компонентам | +| [custom-translators.md](custom-translators.md) | Архитектура VDOM, создание и регистрация кастомных трансляторов | +| [contributing.md](contributing.md) | Настройка окружения, стандарты кода, процесс PR | + +## Быстрый старт + +```bash +dotnet add package RazorConsole.Core +``` + +```xml + + +``` + +```csharp +// Program.cs +IHostBuilder hostBuilder = Host.CreateDefaultBuilder(args) + .UseRazorConsole(); +await hostBuilder.Build().RunAsync(); +``` + +## Версия + +Документация актуальна для **v0.5.0** (март 2026). diff --git a/docs/razorconsole/components.md b/docs/razorconsole/components.md new file mode 100644 index 0000000..cc4b181 --- /dev/null +++ b/docs/razorconsole/components.md @@ -0,0 +1,418 @@ +# RazorConsole — Встроенные компоненты + +Полный справочник по 25+ компонентам, поставляемым с `RazorConsole.Core`. +Каждый компонент транслируется в `IRenderable` Spectre.Console во время рендеринга. + +> Параметры, отмеченные ⚠️, являются обязательными. + +--- + +## Макет (Layout) + +### Align + +Выравнивает дочерний контент горизонтально и вертикально. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment?` | — | Вложенный контент | +| `Horizontal` | `HorizontalAlignment` | `Left` | `Left`, `Center`, `Right` | +| `Vertical` | `VerticalAlignment` | `Top` | `Top`, `Middle`, `Bottom` | +| `Width` | `int?` | `null` | Фиксированная ширина в символах | +| `Height` | `int?` | `null` | Фиксированная высота в строках | + +--- + +### Columns + +Располагает дочерние элементы горизонтально (колонками). + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment?` | — | Элементы колонок | +| `Expand` | `bool` | `false` | Растянуть на всю ширину консоли | + +--- + +### Rows + +Стекует дочерние элементы вертикально. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment?` | — | Элементы строк | +| `Expand` | `bool` | `false` | Растянуть на всю высоту | + +--- + +### FlexBox + +CSS-подобный flexbox-макет с настройкой направления, выравнивания и переноса. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment?` | — | Элементы контейнера | +| `Direction` | `FlexDirection` | `Row` | `Row` (горизонталь) или `Column` (вертикаль) | +| `Justify` | `FlexJustify` | `Start` | `Start`, `End`, `Center`, `SpaceBetween`, `SpaceAround`, `SpaceEvenly` | +| `Align` | `FlexAlign` | `Start` | `Start`, `End`, `Center`, `Stretch` | +| `Wrap` | `FlexWrap` | `NoWrap` | `NoWrap`, `Wrap` | +| `Gap` | `int` | `0` | Отступ между элементами (символы / строки) | +| `Width` | `int?` | `null` | Явное ограничение ширины | +| `Height` | `int?` | `null` | Явное ограничение высоты | + +--- + +### Grid + +Многострочный многоколоночный макет с точным управлением ячейками. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment?` | — | Строки и ячейки сетки | +| `Columns` | `int` | `2` | Количество колонок | +| `Expand` | `bool` | `false` | Растянуть на доступную ширину | +| `Width` | `int?` | `null` | Фиксированная ширина | + +--- + +### Padder + +Добавляет внешние отступы вокруг дочернего контента. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment?` | — | Внутренний контент | +| `Padding` | `Padding` | `new(0,0,0,0)` | Отступы (left, top, right, bottom) | + +--- + +### Scrollable + +Постраничный скроллинг для типизированных коллекций с поддержкой клавиатуры. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Items` | `IReadOnlyList` | `Array.Empty()` | Источник данных | +| `PageSize` | `int` | `1` | Элементов на странице | +| `ChildContent` | `RenderFragment>` | — | Разметка видимой страницы | +| `ScrollOffset` | `int` | `0` | Двусторонний: индекс начала страницы | +| `ScrollOffsetChanged` | `EventCallback` | — | Срабатывает при смене offset | +| `IsScrollbarEmbedded` | `bool` | `true` | Встроить скроллбар внутрь `Table`/`Panel`/`Border` | + +#### ScrollContext\ + +| Член | Тип | Описание | +|---|---|---| +| `this[int i]` | `TItem` | Видимый элемент по индексу | +| `Count` | `int` | Количество видимых элементов | +| `KeyDownEventHandler` | `Func` | Привязать через `@onkeydown` | +| `CurrentOffset` | `int` | Текущий scroll offset | +| `PagesCount` | `int` | Всего страниц | + +--- + +### ViewHeightScrollable + +Постраничный скроллинг произвольного `RenderFragment` по строкам (без типизированных данных). + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment` | — | ⚠️ Контент вьюпорта | +| `LinesToRender` | `int` | `10` | Высота вьюпорта в строках | +| `ScrollOffset` | `int` | `0` | Двусторонний: индекс первой видимой строки | +| `ScrollOffsetChanged` | `EventCallback` | — | Срабатывает при скролле | +| `Scrollbar` | `ScrollbarSettings?` | `null` | Настройки скроллбара | +| `IsScrollbarEmbedded` | `bool` | `true` | Встроить скроллбар внутрь border-компонента | + +**Горячие клавиши:** `↑`/`↓` — одна строка, `PageUp`/`PageDown`/`Space` — страница, `Home`/`End` — границы. + +#### ScrollbarSettings + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `TrackChar` | `char` | `'│'` | Символ дорожки | +| `ThumbChar` | `char` | `'█'` | Символ ползунка | +| `TrackColor` | `Color` | `Color.Grey` | Цвет дорожки | +| `ThumbColor` | `Color` | `Color.White` | Цвет ползунка | +| `TrackFocusedColor` | `Color` | `Color.Grey74` | Цвет дорожки при фокусе | +| `ThumbFocusedColor` | `Color` | `Color.DeepSkyBlue1` | Цвет ползунка при фокусе | +| `MinThumbHeight` | `int` | `1` | Минимальная высота ползунка | + +--- + +## Ввод (Input) + +### TextInput + +Поле ввода текста с placeholder, маскированием и управлением фокусом. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Value` | `string?` | `null` | Двустороннее связывание текста | +| `ValueChanged` | `EventCallback` | — | Срабатывает при изменении | +| `OnInput` | `EventCallback` | — | Срабатывает при каждом нажатии | +| `Placeholder` | `string?` | `null` | Текст-подсказка | +| `MaskInput` | `bool` | `false` | Маскирование символов (пароли) | +| `FocusOrder` | `int?` | `null` | Порядок фокуса | + +--- + +### TextButton + +Кликабельная кнопка с изменением цвета при фокусе. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Content` | `string` | `string.Empty` | Текст кнопки | +| `BackgroundColor` | `Color` | `Color.Default` | Фон в нормальном состоянии | +| `FocusedColor` | `Color` | `Color.DeepSkyBlue1` | Фон при фокусе | +| `OnClick` | `EventCallback` | — | Срабатывает при нажатии | +| `FocusOrder` | `int?` | `null` | Порядок фокуса | + +--- + +### Select + +Интерактивный выпадающий список с клавиатурной навигацией. + +**Основные параметры:** + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Options` | `string[]` | `Array.Empty()` | Доступные варианты | +| `Value` | `string?` | `null` | Текущий выбор | +| `ValueChanged` | `EventCallback` | — | Срабатывает при смене | +| `OnSelected` | `EventCallback` | — | Срабатывает при подтверждении | +| `OnClear` | `EventCallback` | — | Срабатывает при очистке | +| `Placeholder` | `string` | `"Select an option"` | Текст при отсутствии выбора | +| `Expand` | `bool` | `false` | Растянуть горизонтально | +| `FocusOrder` | `int?` | `null` | Порядок фокуса | +| `BorderStyle` | `BoxBorder` | `Rounded` | Стиль рамки | + +**Клавиатура:** стрелки, `Space` для переключения, `Enter` для подтверждения, `Escape` для отмены, буквы для быстрого перехода. + +--- + +## Отображение (Display) + +### Markup + +Стилизованный текст с тегами разметки Spectre. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Content` ⚠️ | `string` | — | Текст (автоматически экранируется) | +| `Foreground` | `Color` | `Style.Plain.Foreground` | Цвет текста | +| `Background` | `Color` | `Style.Plain.Background` | Цвет фона | +| `Decoration` | `Decoration` | `None` | `Bold`, `Italic`, `Underline` и др. | +| `link` | `string?` | `null` | Гиперссылка | + +--- + +### Markdown + +Рендеринг markdown-строки в консоль. + +| Параметр | Тип | Описание | +|---|---|---| +| `Content` ⚠️ | `string` | Markdown-текст для отображения | + +--- + +### Panel + +Обёртка Spectre.Console Panel с заголовком и рамкой. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment?` | — | Содержимое панели | +| `Title` | `string?` | `null` | Заголовок панели | +| `TitleColor` | `Color?` | `null` | Цвет заголовка | +| `BorderColor` | `Color?` | `null` | Цвет рамки | +| `Border` | `BoxBorder?` | `null` | Стиль рамки | +| `Height` | `int?` | `null` | Фиксированная высота | +| `Width` | `int?` | `null` | Фиксированная ширина | +| `Padding` | `Padding?` | `null` | Внутренние отступы | +| `Expand` | `bool` | `false` | Растянуть на ширину | + +--- + +### Border + +Рамка вокруг дочернего контента (без заголовка). + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `ChildContent` | `RenderFragment?` | — | Контент внутри рамки | +| `BorderColor` | `Color?` | `null` | Цвет рамки | +| `BoxBorder` | `BoxBorder` | `Rounded` | Стиль рамки | +| `Padding` | `Padding` | `new(0,0,0,0)` | Внутренние отступы | + +--- + +### Table + +HTML-подобная таблица, транслируемая в Spectre.Console `Table`. + +> Ключевая идея: используйте стандартные ``, ``, ``, ``, ``, `
`, ``. + +| Атрибут | Тип | По умолчанию | Описание | +|---|---|---|---| +| `class="table"` ⚠️ | — | — | Обязательный хук для транслятора | +| `data-expand` | `bool` | `false` | Растянуть на ширину консоли | +| `data-width` | `int?` | `null` | Фиксированная ширина | +| `data-title` | `string?` | `null` | Подпись таблицы | +| `data-border` | `TableBorderStyle` | `None` | Стиль рамки | +| `data-show-headers` | `bool` | `true` | Показывать заголовки | + +Выравнивание колонок: атрибут `data-align="left|center|right"` на ``. + +```razor + + + + + + + + + + + + + +
StageResult
Compile
+``` + +--- + +### Figlet + +Большой ASCII-арт текст с использованием FIGlet-шрифтов. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Content` | `string` | `string.Empty` | Текст для рендеринга | +| `Justify` | `Justify` | `Center` | Выравнивание | +| `Color` | `Color` | `Color.Default` | Цвет глифов | + +--- + +### BarChart + +Горизонтальная барная диаграмма. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `BarChartItems` ⚠️ | `List` | — | Данные (`Label`, `Value`, `Color`) | +| `Width` | `int?` | `null` | Ширина (по умолчанию — вся консоль) | +| `Label` | `string?` | `null` | Заголовок диаграммы | +| `MaxValue` | `double?` | `null` | Максимальное значение шкалы | +| `ShowValues` | `bool` | `false` | Показывать числа рядом с барами | +| `Culture` | `CultureInfo` | текущая | Культура для форматирования чисел | + +--- + +### BreakdownChart + +Диаграмма разбивки (pie-style). + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `BreakdownChartItems` ⚠️ | `List` | — | Данные (`Label`, `Value`, `Color`) | +| `Compact` | `bool` | `false` | Компактный режим | +| `Expand` | `bool` | `false` | Растянуть на всю ширину | +| `Width` | `int?` | `null` | Ширина | +| `ShowTags` | `bool` | `false` | Показывать легенду | +| `ShowTagValues` | `bool` | `false` | Показывать абсолютные значения | +| `ShowTagValuesPercentage` | `bool` | `false` | Показывать проценты | + +--- + +### StepChart + +Ступенчатая диаграмма с использованием Unicode box-drawing символов. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Series` ⚠️ | `List` | — | Набор серий данных | +| `Width` | `int` | `60` | Ширина диаграммы | +| `Height` | `int` | `20` | Высота диаграммы | +| `ShowAxes` | `bool` | `true` | Показывать оси | +| `AxesColor` | `Color` | `Color.Grey` | Цвет осей | +| `LabelsColor` | `Color` | `Color.Grey` | Цвет подписей | +| `Title` | `string?` | `null` | Заголовок | +| `TitleColor` | `Color` | `Color.Grey` | Цвет заголовка | + +**ChartSeries:** + +| Член | Тип | Описание | +|---|---|---| +| `Color` | `Color` | Цвет линии | +| `Points` | `List<(double X, double Y)>` | Точки данных | + +--- + +### SpectreCanvas + +Рендеринг массива пикселей с разными цветами. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Pixels` ⚠️ | `(int x, int y, Color color)[]` | — | Массив пикселей | +| `CanvasWidth` ⚠️ | `int` | — | Ширина холста | +| `CanvasHeight` ⚠️ | `int` | — | Высота холста | +| `MaxWidth` | `int?` | `null` | Максимальная ширина | +| `PixelWidth` | `int` | `2` | Ширина прямоугольника пикселя | +| `Scale` | `bool` | `false` | Масштабировать при рендеринге | + +--- + +### SyntaxHighlighter + +Подсветка синтаксиса кода с темами ColorCode. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `Code` | `string` | `string.Empty` | Исходный код | +| `Language` | `string?` | `null` | Язык: `"csharp"`, `"json"`, `"sql"` и др. | +| `Theme` | `string?` | `null` | Тема оформления | +| `ShowLineNumbers` | `bool` | `false` | Показывать номера строк | + +**Встроенные языки:** `text/plaintext/plain`, `csharp/cs`, `razor`, `html`, `json`, `xml`, `sql`, `js/javascript`, `ts/typescript`, `css`, `powershell/ps`, `python`, `md/markdown`. + +--- + +### ModalWindow + +Модальное окно с автоматическим центрированием через z-index. + +--- + +### ModalWindow + +Модальное окно поверх текущего экрана с автоматическим центрированием. + +> Визуализация построена на z-index, чтобы окно корректно перекрывало другие элементы. + +--- + +## Утилиты + +### Spinner + +Анимированный индикатор прогресса. + +| Параметр | Тип | По умолчанию | Описание | +|---|---|---|---| +| `SpinnerType` | `Spinner` | `Spinner.Known.Dots` | Тип спиннера | +| `SpinnerName` | `string?` | `null` | Имя спиннера (переопределение) | +| `Message` | `string?` | `null` | Сопроводительный текст | +| `Style` | `string?` | `null` | Markup-стиль Spectre | +| `AutoDismiss` | `bool` | `false` | Скрыть по завершении | + +--- + +### Newline + +Вставляет один перенос строки. Параметров нет. diff --git a/docs/razorconsole/contributing.md b/docs/razorconsole/contributing.md new file mode 100644 index 0000000..06db7f4 --- /dev/null +++ b/docs/razorconsole/contributing.md @@ -0,0 +1,69 @@ +# RazorConsole — Контрибьюция + +## Начало работы + +- **Для крупных PR, рефакторингов, новых фич** — сначала создай Issue для обсуждения +- **Discord:** https://discord.gg/DphHAnJxCM — мейнтейнеры активны там + +## Настройка окружения разработки + +### Требования + +- .NET 8.0 или 9.0 SDK +- Git LFS (для крупных медиафайлов) + +### Клонирование + +```bash +git lfs install +git clone https://github.com/RazorConsole/RazorConsole.git +cd RazorConsole +dotnet build RazorConsole.slnx +dotnet test RazorConsole.slnx +``` + +## Стандарты кода + +- Следовать правилам `.editorconfig` (4 пробела, file-scoped namespaces, System usings первые) +- Предпочитать `async/await` с `ConfigureAwait(false)` в библиотечном коде +- Public API: nullable-enabled, документировать исключения и edge cases +- Spectre.Console renderables — immutable вне rendering loops + +## Перед отправкой PR + +```bash +dotnet format RazorConsole.slnx # форматирование +dotnet test RazorConsole.slnx # тесты (должны пройти на Linux и Windows) +``` + +При изменениях в focus/keyboard handling — добавить/обновить тесты в `FocusManagerTests` или `KeyboardEventManagerTests`. + +## Процесс PR + +1. Создать Issue для крупных изменений +2. Форкнуть репозиторий, создать ветку от `main` +3. Сделать изменения, соблюдая стандарты кода +4. Написать/обновить тесты +5. Запустить `dotnet format` и `dotnet test` +6. Отправить PR с описанием изменений + +## Структура тестов + +- Тесты находятся в `src/RazorConsole.Tests` +- CI требует чистого прохождения на Linux и Windows +- Покрытие: Codecov (Cobertura format) + +## Документация + +- `README.md` — обновлять при user-facing изменениях +- XML doc-комментарии для public API +- `examples/` — добавлять примеры для новых фич +- `design-doc/` — архитектурные заметки + +## Git LFS + +Отслеживаемые типы файлов: `*.gif`, `*.png`, `*.jpg`, `*.jpeg`, `*.mp4`, `*.mov`, `*.avi`, `*.zip`, `*.tar.gz`, `*.pdf`. + +## Релизный процесс + +Создание GitHub Release запускает `.github/workflows/release.yml` — сборка, тесты, паковка и публикация. Версии следуют семантическому версионированию. diff --git a/docs/razorconsole/custom-translators.md b/docs/razorconsole/custom-translators.md new file mode 100644 index 0000000..e392e44 --- /dev/null +++ b/docs/razorconsole/custom-translators.md @@ -0,0 +1,276 @@ +# RazorConsole — Кастомные VDOM-трансляторы + +## Архитектура + +RazorConsole использует Virtual DOM (VDOM) для преобразования Razor-компонентов в Spectre.Console `IRenderable`. Система трансляторов (translators) является расширяемой: можно добавить поддержку новых Spectre.Console-конструкций или построить полностью кастомные компоненты. + +### Ключевые компоненты + +#### `IVdomElementTranslator` + +```csharp +public interface IVdomElementTranslator +{ + // Чем меньше значение — тем выше приоритет (обрабатывается раньше). + int Priority { get; } + + bool TryTranslate(VNode node, TranslationContext context, out IRenderable? renderable); +} +``` + +#### `TranslationContext` + +```csharp +public sealed class TranslationContext +{ + // Рекурсивный перевод дочерних узлов + public bool TryTranslate(VNode node, out IRenderable? renderable); +} +``` + +#### `VdomSpectreTranslator` + +Оркестратор, который: +1. Получает список трансляторов через DI (отсортированных по приоритету) +2. Пробует каждый по очереди +3. Возвращает первый успешный результат +4. Предоставляет статические вспомогательные методы + +### Pipeline трансляции + +``` +Razor-компонент → ConsoleRenderer → VNode tree → VdomSpectreTranslator + → [Priority 10] → [Priority 20] → ... → [Priority 1000 (fallback)] + → IRenderable +``` + +--- + +## Встроенные трансляторы + +| Приоритет | Транслятор | Обрабатывает | +|---|---|---| +| 10 | TextElementTranslator | `` | +| 20 | HtmlInlineTextElementTranslator | ``, ``, `` | +| 30 | ParagraphElementTranslator | `

` | +| 40 | SpacerElementTranslator | `

` | +| 50 | NewlineElementTranslator | `
` | +| 60 | SpinnerElementTranslator | `
` | +| 70–80 | Button translators | `