|
⚡ bloc_signals_genui_jaspr"With the rigor of BLoC and the flex and speed of Signals" Jaspr web component bindings, HTML DOM catalog adapters, and 0ms reactive two-way data bindings for bloc_signals_genui and Google's A2UI (Agent-to-User Interface) protocol. |
bloc_signals_genui_jaspr connects the pure-Dart A2uiSurfaceBloc state machine to Jaspr's web component hierarchy via A2uiSurfaceView, A2uiJasprCatalog, A2uiComponentContext, and standard DOM catalog components.
🌐 Ecosystem Packages
The BlocSignal monorepo consists of 14 modular packages:
⚡ Key Features
- 🎨
A2uiSurfaceView: Reactive Jaspr web component handling the completeA2uiSurfaceStatelifecycle (SurfaceInitial,SurfaceStreaming,SurfaceReady,SurfaceSubmitting, andSurfaceError) with customizable builders and per-component error boundaries. - 🧱
A2uiJasprCatalog: Extensible component registry pre-populated with standard DOM components covering core A2UI primitives (Text,Row,Column,Card,Divider,Button, andTextField) alongside immutable composition helpers (copyWith,copyWithout,registerAll). - ✅ Reactive
CheckRuleValidation UI: Automatically surfacesGenericBindervalidation state (isValid,validationErrors,validationResults) across form inputs and disables button submissions when validation rules fail. - ⚡ Granular Signal Bindings & Two-Way Sync: Each rendered component subscribes to its own resolved properties and writes two-way input mutations via
A2uiComponentContext.updateBoundValue, updating leaf DOM elements andA2uiSurfaceBlocform data in 0ms on data changes without tearing down parent containers. - 🧭 Multi-Surface & Split-Pane Support: Pin
A2uiSurfaceView(bloc: bloc, surfaceId: '...')to a specific surface or omitsurfaceIdto followbloc.activeSurfaceIdreactively across tabs and split views. - 🛡️ Defensive LLM Property Coercion: Built-in
safe_prop_parser.dartutilities (unwrapBinding,asString,asInt,asDouble,asBool,extractChildId,extractChildIds) protect the DOM tree from malformed or stringified LLM JSON properties.
📦 Installation
Add bloc_signals_genui_jaspr to your Jaspr project:
dart pub add bloc_signals_genui_jaspr
Or declare it in your pubspec.yaml:
dependencies:
jaspr: ^0.23.1
bloc_signals: ^1.7.0
bloc_signals_jaspr: ^1.3.0
bloc_signals_genui: ^1.0.0
bloc_signals_genui_jaspr: ^1.0.0
a2ui_core: ^0.3.0
🚀 Quick Start
Rendering an Interactive A2UI Surface
import 'package:bloc_signals_genui/bloc_signals_genui.dart';
import 'package:bloc_signals_genui_jaspr/bloc_signals_genui_jaspr.dart';
import 'package:bloc_signals_jaspr/bloc_signals_jaspr.dart';
import 'package:jaspr/dom.dart';
import 'package:jaspr/jaspr.dart';
// Dart 3.5+ (Standard)
class AgentSurfacePage extends StatelessComponent {
const AgentSurfacePage({
required this.surfaceBloc,
super.key,
});
final A2uiSurfaceBloc surfaceBloc;
@override
Component build(BuildContext context) {
return section(classes: 'agent-surface-page', [
const h1([Component.text('Generative UI Surface')]),
A2uiSurfaceView(
bloc: surfaceBloc,
catalog: A2uiJasprCatalog.standard(),
),
]);
}
}
// Dart 3.13+ (Modern Primary Constructor)
class const ModernAgentSurfacePage({
required this.surfaceBloc,
super.key,
}) extends StatelessComponent {
final A2uiSurfaceBloc surfaceBloc;
@override
Component build(BuildContext context) {
return section(classes: 'agent-surface-page', [
const h1([Component.text('Generative UI Surface')]),
A2uiSurfaceView(
bloc: surfaceBloc,
catalog: A2uiJasprCatalog.standard(),
),
]);
}
}
Registering Custom Catalog Components
Extend A2uiJasprCatalog.standard() using copyWith (or register) to bind domain-specific A2UI components to custom Jaspr web components while reading and mutating form signals through A2uiComponentContext:
final customCatalog = A2uiJasprCatalog.standard().copyWith({
'MetricBadge': (context, A2uiComponentContext componentContext) {
final label = componentContext.props['label'] as String? ?? 'Metric';
final value = componentContext.props['value']?.toString() ?? '0';
return button(
classes: 'metric-badge-btn',
onClick: () => componentContext.dispatchAction('inspect_metric'),
[Component.text('$label: $value')],
);
},
});
🛡️ License
MIT License. See LICENSE for details.
Libraries
- bloc_signals_genui_jaspr
- Jaspr web component bindings, declarative surface views, and HTML DOM catalog adapters for Generative UI (A2UI) with BlocSignal.