WidgetKit
AppDashboard widget kit (next-boilerplate dashboard phase 21). WidgetCard frames every widget (title row with icon, subtitle and help, card buttons for full screen, CSV and refresh, loading/empty/unconfigured/error/stale/unavailable states, "Updated" footer; `unavailable` keeps the title and shows an UnavailableContribution). Versioned settings templates (core:card, core:format, core:board and one per widget type) give ThingsBoard-depth editing with free colours (any CSS colour or a theme token); stored settings carry $v and migrate with append-only steps. WidgetSettingsEditor edits a placement in tabs with Basic/Advanced, layout variants picked from thumbnail cards (renderWidgetPreview, or a host renderPreview); WidgetBoard lays out a whole board with edit mode and JSON export/import that carries every card.
Raised (default)
Hall A
Body
Free colours
Hall A
Any CSS colour or a theme token
Old data
Old dataHall A
Badge on stale data
<WidgetCard title="Load" card={card} stale={stale}>{body}</WidgetCard>Open calls
Disabled
The module that provides this is turned off.
Revenue forecast
Not in plan
Your current plan does not include this.
Device map
Quarantined
Paused automatically after repeated errors.
<WidgetCard title="Open calls" card={card} state="unavailable"
unavailable={{ reason: 'disabled', action: { label: 'Enable telephony', onClick: enable } }} />Occupancy
<WidgetSettingsEditor templates={[kind.template, CORE_CARD, CORE_FORMAT]} settings={settings} onChange={setSettings} caps={caps} />Demo board
Temperature
Load
Target
<WidgetBoard doc={doc} onChange={setDoc} data={data} kinds={BUILTIN_KINDS} views={BUILTIN_VIEWS} />