Тема
NovaApp
Главный runtime-контейнер: canvas, scheduler, input, surfaces и lifecycle.
Практическая схема
- Документация: NovaCore.
- Раздел: Основные понятия.
- Тема страницы: NovaApp.
- Переключатель TypeScript / DSL находится в панели навигации; вкладка
Кодв примере показывает файлы выбранного подхода.
Исполняемый примерАдаптивная панельРазмеры, DPR и scheduler на telemetry panel.
import { Nova, NovaNode, type NovaSchema } from '@endge/nova'
// Документационный сценарий: nova-app-cockpit
class ExampleNode extends NovaNode<Record<string, Event>> {
render(): void {
const schema: NovaSchema = [
{
type: 'rect',
x: 24,
y: 24,
width: this.width - 48,
height: this.height - 48,
styles: { background: '#0d2745' },
},
{
type: 'text',
x: 44,
y: 44,
width: this.width - 88,
height: 32,
text: 'Адаптивная панель',
styles: { color: '#e8f5ff' },
},
]
this.renderer.schema(schema)
this.setRenderBoundsFromSchema(schema)
}
}
export function mountExample(canvas: HTMLCanvasElement) {
const app = Nova.createApp({
target: canvas,
size: { width: canvas.clientWidth, height: canvas.clientHeight, maxDpr: 2 },
scheduler: { loop: false },
})
const surface = app.surface({ id: 'cockpit-panel' })
surface.createNode(ExampleNode)
return () => app.destroy()
}app · @endge/nova
NovaAppCreateOptions
Контракт создания NovaApp: canvas target, размер, input, renderer, scheduler и debug-настройки.
interface NovaAppCreateOptions<E extends EventList = Record<string, any>>Target и size Минимальный набор, без которого runtime не создается.
| Поле | Тип | Описание |
|---|---|---|
targetrequired | HTMLCanvasElement | Видимый canvas, к которому NovaApp привязывает основной renderer и input listeners. |
size.widthrequired | number | Логическая ширина runtime. Canvas pixel size рассчитывается через DPR. |
size.heightrequired | number | Логическая высота runtime. Surfaces наследуют этот размер при создании и resize. |
size.dpr | numberwindow.devicePixelRatio | Явный DPR, если приложение хочет управлять плотностью canvas самостоятельно. |
size.maxDpr | number | Верхняя граница DPR для контроля памяти и backbuffer size. |
Input Pointer и keyboard можно отключать или ограничивать scope.
| Поле | Тип | Описание |
|---|---|---|
input.pointer.enabled | booleantrue | Подключает pointer events к canvas. |
input.pointer.capture | booleantrue | Автоматически ставит pointer capture на target node после mousedown. |
input.keyboard.scope | 'focused' | 'active' | 'hovered' | 'global' | 'manual''focused' | Определяет, где Nova слушает keyboard events и когда их обрабатывает. |
input.keyboard.preventDefault | 'never' | 'handled' | 'always''handled' | Контролирует preventDefault для keyboard events. |
Renderer, scheduler и debug
| Поле | Тип | Описание |
|---|---|---|
renderer.main | RendererType.Web2DWeb2D | App-level backend для единственного visible canvas. |
renderer.webgl | WebGLContextAttributes | Атрибуты WebGL-context для app-level WebGL backend. |
scheduler.type | RaphSchedulerTypeAnimationFrame | Scheduler reactive runtime. |
scheduler.loop | booleanfalse | Запускает постоянный loop сразу после init. |
sound | NovaSoundOptions | Настройки app-level Sound Engine: mute, volume, maxVoices, unlock и format preference. |
debug.telemetry | boolean | Включает сбор telemetry snapshots для renderer diagnostics. |
- Создавайте NovaApp только после mount canvas в DOM.
- Для Vue-страниц destroy должен вызываться в cleanup lifecycle.
Как применять
Используйте страницу как короткую рабочую заметку: сначала определите границу ответственности, затем откройте пример и сравните TypeScript-реализацию с DSL-описанием. Runtime-код остается в Nova-слое, а Vue отвечает только за mount, layout shell и cleanup.