Angular
npm install @kadal/deck-angular @angular/core @angular/compiler @angular/platform-browserregisterLazyRenderer("angular", () => import("@kadal/deck-angular").then((m) => m.angularRenderer));import "@angular/compiler"; // must be the FIRST importimport { Component, Input } from "@angular/core";import { deckAngular } from "@kadal/deck-angular";
@Component({ selector: "deck-chart", standalone: true, template: `…` })export class Chart { @Input() data: number[] = [];}deckAngular(Chart);<Island load={() => import("./chart.angular.ts").then((m) => m.Chart)} props={{ data }} />The deck’s tsconfig needs experimentalDecorators: true and useDefineForClassFields: false. That
is the whole build configuration — no Angular Vite plugin.
Four things that each cost a run to find
Section titled “Four things that each cost a run to find”- No Analog plugin. Pointed at one file in a deck it emitted an empty module, and the island sat on
its fallback with no error. Importing
@angular/compiler(JIT) needs no plugin at all. import "@angular/compiler"first. It registers the compiler facade, which@angular/platform-browserreads the instant it is evaluated.- Signal inputs need AOT — use
@Input(). Under JIT,input()mounts fine and thensetInputfails with NG0303, freezing the island at its first props. Internal state can still be asignal(). setInput, neverinstance.x = y. OnlysetInputmarks the view dirty.
Angular expects to be an application, so the renderer creates one Angular application, shared by every Angular island on the deck and destroyed when the last one leaves. It is zoneless: zone.js would patch every async API on the page for one island’s sake.