Widget System
Radarboard’s widget layer is built around a single shared system instead of bespoke per-widget UIs. That system has four layers:- Layout nodes
- Section primitives
- Recipes
- Data adapters
Layout nodes
Layout nodes define structure only. Current layout nodes include:stacksplitgridtabs
Section primitives
Section primitives are the reusable rendering building blocks that both the runtime and the visual editor understand. Current primitives include:headline-statoverview-panelkpi-rowsummary-quadlistrow-liststream-listdense-ranked-tabletablechartactivity-chartfilter-baralerttabs
Recipes
Recipes are just presets that compose layout nodes and section primitives. Examples:summary_onlycontent_onlysummary_listsummary_chart_listrail_contentrail_listfeed_list
Data adapters
Widgets still keep integration-specific data normalization, but that logic lives in template data sources rather than custom rendering components. Examples of normalized template data sources:analyticsseorevenuesponsorshipshippingideassentryvercelaso
Visual editor
The visual editor works on the same template config that the widget runtime consumes. That means the editor and runtime share:- the same layout model
- the same section types
- the same bindings
- the same preview path
Runtime flow
The runtime path is:- widget descriptor resolves its template config
TemplateWidgetorTemplateWidgetExpandedmountsDataResolverProviderloads the configured data sourcesTemplateFilterStateProvidermanages shared filter state between sectionsSectionRendererrenders the configured section treeTemplateDetailHosthandles selection-driven detail dialogs
Examples
Revenue
revenue now renders through:
summary-quadkpi-rowchart
Sponsorship
sponsorship now renders through:
summary-quadtabsrow-list
Logs
logs now renders through:
stream-list
ASO Keywords
aso-keywords is built on:
filter-bardense-ranked-tablekpi-row- template detail rendering
Why this matters
This system is designed for speed and maintainability:- new widgets can be assembled faster
- visual consistency improves automatically
- editor support comes “for free” when a widget stays inside the system
- redundancy becomes visible at the primitive/recipe level instead of being hidden in widget-local JSX
- their data adapters
- their default recipes
- their default section config