@a2ui/angular 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Inject, Injectable, signal, inject, DestroyRef, NgZone, input, ChangeDetectorRef, HostBinding, ChangeDetectionStrategy, Component, computed as computed$1, effect as effect$1 } from '@angular/core';
2
+ import { InjectionToken, Inject, Injectable, signal, inject, DestroyRef, NgZone, input, ChangeDetectorRef, effect as effect$1, ChangeDetectionStrategy, Component, Directive, computed as computed$1, HostBinding } from '@angular/core';
3
3
  import { MessageProcessor, effect, computed, ComponentContext, Catalog, DataContext } from '@a2ui/web_core/v0_9';
4
4
  export { signal as preactSignal } from '@a2ui/web_core/v0_9';
5
5
  import { NgComponentOutlet } from '@angular/common';
@@ -164,6 +164,7 @@ class ComponentBinder {
164
164
  bind(context) {
165
165
  const props = context.componentModel.properties;
166
166
  const bound = {};
167
+ let template = undefined;
167
168
  for (const key of Object.keys(props)) {
168
169
  const value = props[key];
169
170
  let preactSig;
@@ -198,6 +199,11 @@ class ComponentBinder {
198
199
  }
199
200
  else if (key === 'children') {
200
201
  const originalSig = preactSig;
202
+ const id = value.componentId;
203
+ const path = value.path;
204
+ if (id && path) {
205
+ template = { id, path };
206
+ }
201
207
  preactSig = computed(() => {
202
208
  const val = originalSig.value;
203
209
  const arr = Array.isArray(val) ? val : [];
@@ -213,6 +219,7 @@ class ComponentBinder {
213
219
  bound[key] = {
214
220
  value: angSig,
215
221
  raw: value,
222
+ template,
216
223
  onUpdate: isBoundPath
217
224
  ? (newValue) => context.dataContext.set(value.path, newValue)
218
225
  : () => { }, // No-op for non-bound values
@@ -229,9 +236,7 @@ class ComponentBinder {
229
236
  return ruleResults.every((r) => !!r.conditionSig.value);
230
237
  });
231
238
  const validationErrorsPreactSig = computed(() => {
232
- return ruleResults
233
- .filter((r) => !r.conditionSig.value)
234
- .map((r) => r.message);
239
+ return ruleResults.filter((r) => !r.conditionSig.value).map((r) => r.message);
235
240
  });
236
241
  bound['isValid'] = {
237
242
  value: toAngularSignal(isValidPreactSig, this.destroyRef, this.ngZone),
@@ -294,21 +299,28 @@ class ComponentHostComponent {
294
299
  componentType = null;
295
300
  props = {};
296
301
  context;
297
- weight = signal(null, ...(ngDevMode ? [{ debugName: "weight" }] : /* istanbul ignore next */ []));
298
- // TODO(#1199): Move weight handling to the catalog specification.
299
- get flexStyle() {
300
- const w = this.weight();
301
- return w ? `${w}` : '';
302
- }
303
302
  resolvedComponentId = '';
304
303
  resolvedDataContextPath = '/';
305
- ngOnInit() {
306
- const surface = this.rendererService.surfaceGroup?.getSurface(this.surfaceId());
304
+ propsSub;
305
+ createSub;
306
+ constructor() {
307
+ effect$1(() => {
308
+ const key = this.componentKey();
309
+ const surfaceId = this.surfaceId();
310
+ this.setupComponent(key, surfaceId);
311
+ });
312
+ this.destroyRef.onDestroy(() => {
313
+ this.propsSub?.unsubscribe();
314
+ this.createSub?.unsubscribe();
315
+ });
316
+ }
317
+ setupComponent(key, surfaceId) {
318
+ this.resetState();
319
+ const surface = this.rendererService.surfaceGroup?.getSurface(surfaceId);
307
320
  if (!surface) {
308
- console.warn(`Surface ${this.surfaceId()} not found`);
321
+ console.warn(`Surface ${surfaceId} not found`);
309
322
  return;
310
323
  }
311
- const key = this.componentKey();
312
324
  let id;
313
325
  let basePath;
314
326
  if (typeof key === 'object' && key !== null && 'id' in key) {
@@ -322,15 +334,14 @@ class ComponentHostComponent {
322
334
  this.resolvedComponentId = id;
323
335
  const componentModel = surface.componentsModel.get(id);
324
336
  if (!componentModel) {
325
- console.warn(`Component ${id} not found in surface ${this.surfaceId()}. Waiting for it...`);
326
- const sub = surface.componentsModel.onCreated.subscribe((comp) => {
337
+ console.warn(`Component ${id} not found in surface ${surfaceId}. Waiting for it...`);
338
+ const sub = surface.componentsModel.onCreated.subscribe(comp => {
327
339
  if (comp.id === id) {
328
340
  this.initializeComponent(surface, comp, id, basePath);
329
- this.cdr.markForCheck();
330
341
  sub.unsubscribe();
331
342
  }
332
343
  });
333
- this.destroyRef.onDestroy(() => sub.unsubscribe());
344
+ this.createSub = sub;
334
345
  return;
335
346
  }
336
347
  this.initializeComponent(surface, componentModel, id, basePath);
@@ -350,22 +361,27 @@ class ComponentHostComponent {
350
361
  this.resolvedDataContextPath = this.context.dataContext.path;
351
362
  // Subscribes to updates to the component model properties, to get the
352
363
  // component to react when a new prop is added after creation.
353
- const onPropsUpdateSub = componentModel.onUpdated.subscribe(() => {
364
+ this.propsSub = componentModel.onUpdated.subscribe(() => {
354
365
  this.props = this.binder.bind(this.context);
355
- // TODO(#1199): Move weight handling to the catalog specification.
356
- this.weight.set(componentModel.properties['weight'] || null);
357
366
  this.cdr.markForCheck();
358
367
  });
359
- this.weight.set(componentModel.properties['weight'] || null);
360
- this.destroyRef.onDestroy(() => {
361
- // ComponentContext itself doesn't have a dispose, but its inner components might.
362
- // However, SurfaceModel takes care of component disposal.
363
- onPropsUpdateSub.unsubscribe();
364
- });
368
+ this.cdr.markForCheck();
369
+ }
370
+ /**
371
+ * Resets the component host state, unsubscribing from active subscriptions
372
+ * and clearing component properties to avoid rendering stale data while
373
+ * a new component is being loaded.
374
+ */
375
+ resetState() {
376
+ this.propsSub?.unsubscribe();
377
+ this.createSub?.unsubscribe();
378
+ this.componentType = null;
379
+ this.props = {};
380
+ this.resolvedDataContextPath = '/';
365
381
  this.cdr.markForCheck();
366
382
  }
367
383
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ComponentHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
368
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ComponentHostComponent, isStandalone: true, selector: "a2ui-v09-component-host", inputs: { componentKey: { classPropertyName: "componentKey", publicName: "componentKey", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "style.flex": "this.flexStyle" }, styleAttribute: "display: contents;" }, ngImport: i0, template: `
384
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ComponentHostComponent, isStandalone: true, selector: "a2ui-v09-component-host", inputs: { componentKey: { classPropertyName: "componentKey", publicName: "componentKey", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null } }, host: { styleAttribute: "display: contents;" }, ngImport: i0, template: `
369
385
  @if (componentType) {
370
386
  <ng-container
371
387
  *ngComponentOutlet="
@@ -387,7 +403,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
387
403
  selector: 'a2ui-v09-component-host',
388
404
  imports: [NgComponentOutlet],
389
405
  host: {
390
- 'style': 'display: contents;'
406
+ style: 'display: contents;',
391
407
  },
392
408
  template: `
393
409
  @if (componentType) {
@@ -406,10 +422,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
406
422
  `,
407
423
  changeDetection: ChangeDetectionStrategy.OnPush,
408
424
  }]
409
- }], propDecorators: { componentKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentKey", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], flexStyle: [{
410
- type: HostBinding,
411
- args: ['style.flex']
412
- }] } });
425
+ }], ctorParameters: () => [], propDecorators: { componentKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentKey", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }] } });
413
426
 
414
427
  /**
415
428
  * Copyright 2026 Google LLC
@@ -444,7 +457,7 @@ class SurfaceComponent {
444
457
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SurfaceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
445
458
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: SurfaceComponent, isStandalone: true, selector: "a2ui-v09-surface", inputs: { surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, host: { styleAttribute: "display: contents;" }, ngImport: i0, template: `
446
459
  <a2ui-v09-component-host
447
- [componentKey]="{ id: 'root', basePath: dataContextPath() }"
460
+ [componentKey]="{id: 'root', basePath: dataContextPath()}"
448
461
  [surfaceId]="surfaceId()"
449
462
  >
450
463
  </a2ui-v09-component-host>
@@ -457,11 +470,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
457
470
  standalone: true,
458
471
  imports: [ComponentHostComponent],
459
472
  host: {
460
- 'style': 'display: contents;'
473
+ style: 'display: contents;',
461
474
  },
462
475
  template: `
463
476
  <a2ui-v09-component-host
464
- [componentKey]="{ id: 'root', basePath: dataContextPath() }"
477
+ [componentKey]="{id: 'root', basePath: dataContextPath()}"
465
478
  [surfaceId]="surfaceId()"
466
479
  >
467
480
  </a2ui-v09-component-host>
@@ -470,6 +483,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
470
483
  }]
471
484
  }], propDecorators: { surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
472
485
 
486
+ /**
487
+ * Base class for A2UI catalog component in Angular.
488
+ *
489
+ * All Angular catalog components should extend this base class,
490
+ * which provides type safe access to props() and other common
491
+ * fields.
492
+ */
493
+ class CatalogComponent {
494
+ /**
495
+ * Reactive properties resolved from the A2UI ComponentModel.
496
+ */
497
+ props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
498
+ surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
499
+ componentId = input.required(...(ngDevMode ? [{ debugName: "componentId" }] : /* istanbul ignore next */ []));
500
+ dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
501
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
502
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.5", type: CatalogComponent, isStandalone: true, inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: true, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
503
+ }
504
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CatalogComponent, decorators: [{
505
+ type: Directive
506
+ }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: true }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
507
+
473
508
  /**
474
509
  * Copyright 2026 Google LLC
475
510
  *
@@ -513,7 +548,7 @@ class DefaultMarkdownRenderer extends MarkdownRenderer {
513
548
  }
514
549
  catch (e) {
515
550
  if (!DefaultMarkdownRenderer.warningLogged) {
516
- console.warn("[DefaultMarkdownRenderer] Failed to load optional `@a2ui/markdown-it` renderer. Using fallback.");
551
+ console.warn('[DefaultMarkdownRenderer] Failed to load optional `@a2ui/markdown-it` renderer. Using fallback.');
517
552
  DefaultMarkdownRenderer.warningLogged = true;
518
553
  }
519
554
  return markdown;
@@ -585,12 +620,46 @@ class AngularCatalog extends Catalog {
585
620
  * Base class for A2UI basic catalog components in Angular.
586
621
  *
587
622
  * Automatically injects the basic catalog styles when the component is instantiated.
623
+ * Also binds the primary brand color to the host element.
588
624
  */
589
- class BasicCatalogComponent {
625
+ class BasicCatalogComponent extends CatalogComponent {
626
+ rendererService = inject(A2uiRendererService);
627
+ surface = computed$1(() => {
628
+ return this.rendererService.surfaceGroup.getSurface(this.surfaceId());
629
+ }, ...(ngDevMode ? [{ debugName: "surface" }] : /* istanbul ignore next */ []));
630
+ theme = computed$1(() => {
631
+ return this.surface()?.theme;
632
+ }, ...(ngDevMode ? [{ debugName: "theme" }] : /* istanbul ignore next */ []));
633
+ primaryColor = computed$1(() => {
634
+ return this.theme()?.primaryColor;
635
+ }, ...(ngDevMode ? [{ debugName: "primaryColor" }] : /* istanbul ignore next */ []));
636
+ /** Weight is applied as flex css property on the component host HTML element. */
637
+ weight = computed$1(() => this.props()['weight']?.value() ?? null, ...(ngDevMode ? [{ debugName: "weight" }] : /* istanbul ignore next */ []));
590
638
  constructor() {
639
+ super();
591
640
  injectBasicCatalogStyles();
592
641
  }
642
+ /**
643
+ * Binds the flex style to the host element based on the weight.
644
+ */
645
+ get flexStyle() {
646
+ return this.weight() !== null ? `${this.weight()}` : null;
647
+ }
648
+ get primaryColorStyle() {
649
+ return this.primaryColor() || null;
650
+ }
651
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: BasicCatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
652
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.5", type: BasicCatalogComponent, isStandalone: true, host: { properties: { "style.flex": "this.flexStyle", "style.--a2ui-color-primary": "this.primaryColorStyle" } }, usesInheritance: true, ngImport: i0 });
593
653
  }
654
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: BasicCatalogComponent, decorators: [{
655
+ type: Directive
656
+ }], ctorParameters: () => [], propDecorators: { flexStyle: [{
657
+ type: HostBinding,
658
+ args: ['style.flex']
659
+ }], primaryColorStyle: [{
660
+ type: HostBinding,
661
+ args: ['style.--a2ui-color-primary']
662
+ }] } });
594
663
 
595
664
  /**
596
665
  * Copyright 2026 Google LLC
@@ -624,17 +693,6 @@ class BasicCatalogComponent {
624
693
  * - Font sizes: `--a2ui-font-size-2xl`, `--a2ui-font-size-xl`, `--a2ui-font-size-l`, `--a2ui-font-size-m`, `--a2ui-font-size-s`, `--a2ui-font-size-xs`.
625
694
  */
626
695
  class TextComponent extends BasicCatalogComponent {
627
- /**
628
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
629
- *
630
- * Expected properties:
631
- * - `text`: The string content to display.
632
- * - `variant`: A hint for the base text style ('h1', 'h2', 'h3', 'h4', 'h5', 'caption', 'body').
633
- */
634
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
635
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
636
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
637
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
638
696
  markdownRenderer = inject(MarkdownRenderer);
639
697
  variant = computed$1(() => this.props()['variant']?.value() || 'body', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
640
698
  text = computed$1(() => this.props()['text']?.value() || '', ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
@@ -675,18 +733,12 @@ class TextComponent extends BasicCatalogComponent {
675
733
  });
676
734
  }
677
735
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
678
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: TextComponent, isStandalone: true, selector: "a2ui-v09-text", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
679
- <span [class]="'a2ui-text ' + variant()" [innerHTML]="resolvedText()">
680
- </span>
681
- `, isInline: true, styles: [":host ::ng-deep .a2ui-text p,:host ::ng-deep .a2ui-text h1,:host ::ng-deep .a2ui-text h2,:host ::ng-deep .a2ui-text h3,:host ::ng-deep .a2ui-text h4,:host ::ng-deep .a2ui-text h5,:host ::ng-deep .a2ui-text h6,:host ::ng-deep .a2ui-text ol,:host ::ng-deep .a2ui-text ul,:host ::ng-deep .a2ui-text li,:host ::ng-deep .a2ui-text blockquote,:host ::ng-deep .a2ui-text pre{margin:var(--_a2ui-text-margin, 0)}:host ::ng-deep .a2ui-text{color:var(--_a2ui-text-color, var(--a2ui-text-color-text, var(--a2ui-color-on-background)))}:host ::ng-deep .a2ui-text h1,:host ::ng-deep .a2ui-text h2,:host ::ng-deep .a2ui-text h3,:host ::ng-deep .a2ui-text h4,:host ::ng-deep .a2ui-text h5,:host ::ng-deep .a2ui-text h6{font-family:var(--a2ui-font-family-title, inherit);line-height:var(--a2ui-line-height-headings, 1.2)}:host ::ng-deep .a2ui-text h1{font-size:var(--a2ui-font-size-2xl)}:host ::ng-deep .a2ui-text h2{font-size:var(--a2ui-font-size-xl)}:host ::ng-deep .a2ui-text h3{font-size:var(--a2ui-font-size-l)}:host ::ng-deep .a2ui-text p,:host ::ng-deep .a2ui-text h4{font-size:var(--a2ui-font-size-m)}:host ::ng-deep .a2ui-text h5{font-size:var(--a2ui-font-size-s)}:host ::ng-deep .a2ui-text p{line-height:var(--a2ui-line-height-body, 1.5)}:host ::ng-deep .a2ui-text.caption{font-size:var(--a2ui-font-size-xs);color:var(--a2ui-text-caption-color, light-dark(#666, #aaa))}:host ::ng-deep .a2ui-text a{color:var(--a2ui-text-a-color, inherit);font-weight:var(--a2ui-text-a-font-weight, inherit)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
736
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: TextComponent, isStandalone: true, selector: "a2ui-v09-text", usesInheritance: true, ngImport: i0, template: ` <span [class]="'a2ui-text ' + variant()" [innerHTML]="resolvedText()"> </span> `, isInline: true, styles: [":host ::ng-deep .a2ui-text p,:host ::ng-deep .a2ui-text h1,:host ::ng-deep .a2ui-text h2,:host ::ng-deep .a2ui-text h3,:host ::ng-deep .a2ui-text h4,:host ::ng-deep .a2ui-text h5,:host ::ng-deep .a2ui-text h6,:host ::ng-deep .a2ui-text ol,:host ::ng-deep .a2ui-text ul,:host ::ng-deep .a2ui-text li,:host ::ng-deep .a2ui-text blockquote,:host ::ng-deep .a2ui-text pre{margin:var(--_a2ui-text-margin, 0)}:host ::ng-deep .a2ui-text{color:var( --_a2ui-text-color, var(--a2ui-text-color-text, var(--a2ui-color-on-background)) )}:host ::ng-deep .a2ui-text h1,:host ::ng-deep .a2ui-text h2,:host ::ng-deep .a2ui-text h3,:host ::ng-deep .a2ui-text h4,:host ::ng-deep .a2ui-text h5,:host ::ng-deep .a2ui-text h6{font-family:var(--a2ui-font-family-title, inherit);line-height:var(--a2ui-line-height-headings, 1.2)}:host ::ng-deep .a2ui-text h1{font-size:var(--a2ui-font-size-2xl)}:host ::ng-deep .a2ui-text h2{font-size:var(--a2ui-font-size-xl)}:host ::ng-deep .a2ui-text h3{font-size:var(--a2ui-font-size-l)}:host ::ng-deep .a2ui-text p,:host ::ng-deep .a2ui-text h4{font-size:var(--a2ui-font-size-m)}:host ::ng-deep .a2ui-text h5{font-size:var(--a2ui-font-size-s)}:host ::ng-deep .a2ui-text p{line-height:var(--a2ui-line-height-body, 1.5)}:host ::ng-deep .a2ui-text.caption{font-size:var(--a2ui-font-size-xs);color:var(--a2ui-text-caption-color, light-dark(#666, #aaa))}:host ::ng-deep .a2ui-text a{color:var(--a2ui-text-a-color, inherit);font-weight:var(--a2ui-text-a-font-weight, inherit)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
682
737
  }
683
738
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextComponent, decorators: [{
684
739
  type: Component,
685
- args: [{ selector: 'a2ui-v09-text', standalone: true, template: `
686
- <span [class]="'a2ui-text ' + variant()" [innerHTML]="resolvedText()">
687
- </span>
688
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host ::ng-deep .a2ui-text p,:host ::ng-deep .a2ui-text h1,:host ::ng-deep .a2ui-text h2,:host ::ng-deep .a2ui-text h3,:host ::ng-deep .a2ui-text h4,:host ::ng-deep .a2ui-text h5,:host ::ng-deep .a2ui-text h6,:host ::ng-deep .a2ui-text ol,:host ::ng-deep .a2ui-text ul,:host ::ng-deep .a2ui-text li,:host ::ng-deep .a2ui-text blockquote,:host ::ng-deep .a2ui-text pre{margin:var(--_a2ui-text-margin, 0)}:host ::ng-deep .a2ui-text{color:var(--_a2ui-text-color, var(--a2ui-text-color-text, var(--a2ui-color-on-background)))}:host ::ng-deep .a2ui-text h1,:host ::ng-deep .a2ui-text h2,:host ::ng-deep .a2ui-text h3,:host ::ng-deep .a2ui-text h4,:host ::ng-deep .a2ui-text h5,:host ::ng-deep .a2ui-text h6{font-family:var(--a2ui-font-family-title, inherit);line-height:var(--a2ui-line-height-headings, 1.2)}:host ::ng-deep .a2ui-text h1{font-size:var(--a2ui-font-size-2xl)}:host ::ng-deep .a2ui-text h2{font-size:var(--a2ui-font-size-xl)}:host ::ng-deep .a2ui-text h3{font-size:var(--a2ui-font-size-l)}:host ::ng-deep .a2ui-text p,:host ::ng-deep .a2ui-text h4{font-size:var(--a2ui-font-size-m)}:host ::ng-deep .a2ui-text h5{font-size:var(--a2ui-font-size-s)}:host ::ng-deep .a2ui-text p{line-height:var(--a2ui-line-height-body, 1.5)}:host ::ng-deep .a2ui-text.caption{font-size:var(--a2ui-font-size-xs);color:var(--a2ui-text-caption-color, light-dark(#666, #aaa))}:host ::ng-deep .a2ui-text a{color:var(--a2ui-text-a-color, inherit);font-weight:var(--a2ui-text-a-font-weight, inherit)}\n"] }]
689
- }], ctorParameters: () => [], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
740
+ args: [{ selector: 'a2ui-v09-text', standalone: true, template: ` <span [class]="'a2ui-text ' + variant()" [innerHTML]="resolvedText()"> </span> `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host ::ng-deep .a2ui-text p,:host ::ng-deep .a2ui-text h1,:host ::ng-deep .a2ui-text h2,:host ::ng-deep .a2ui-text h3,:host ::ng-deep .a2ui-text h4,:host ::ng-deep .a2ui-text h5,:host ::ng-deep .a2ui-text h6,:host ::ng-deep .a2ui-text ol,:host ::ng-deep .a2ui-text ul,:host ::ng-deep .a2ui-text li,:host ::ng-deep .a2ui-text blockquote,:host ::ng-deep .a2ui-text pre{margin:var(--_a2ui-text-margin, 0)}:host ::ng-deep .a2ui-text{color:var( --_a2ui-text-color, var(--a2ui-text-color-text, var(--a2ui-color-on-background)) )}:host ::ng-deep .a2ui-text h1,:host ::ng-deep .a2ui-text h2,:host ::ng-deep .a2ui-text h3,:host ::ng-deep .a2ui-text h4,:host ::ng-deep .a2ui-text h5,:host ::ng-deep .a2ui-text h6{font-family:var(--a2ui-font-family-title, inherit);line-height:var(--a2ui-line-height-headings, 1.2)}:host ::ng-deep .a2ui-text h1{font-size:var(--a2ui-font-size-2xl)}:host ::ng-deep .a2ui-text h2{font-size:var(--a2ui-font-size-xl)}:host ::ng-deep .a2ui-text h3{font-size:var(--a2ui-font-size-l)}:host ::ng-deep .a2ui-text p,:host ::ng-deep .a2ui-text h4{font-size:var(--a2ui-font-size-m)}:host ::ng-deep .a2ui-text h5{font-size:var(--a2ui-font-size-s)}:host ::ng-deep .a2ui-text p{line-height:var(--a2ui-line-height-body, 1.5)}:host ::ng-deep .a2ui-text.caption{font-size:var(--a2ui-font-size-xs);color:var(--a2ui-text-caption-color, light-dark(#666, #aaa))}:host ::ng-deep .a2ui-text a{color:var(--a2ui-text-a-color, inherit);font-weight:var(--a2ui-text-a-font-weight, inherit)}\n"] }]
741
+ }], ctorParameters: () => [] });
690
742
 
691
743
  /**
692
744
  * Copyright 2026 Google LLC
@@ -751,35 +803,20 @@ const ALIGN_MAP = {
751
803
  * - `--a2ui-row-gap`: Controls the gap between items in the row. Defaults to `--a2ui-spacing-m` (16px).
752
804
  */
753
805
  class RowComponent extends BasicCatalogComponent {
754
- /**
755
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
756
- *
757
- * Expected properties:
758
- * - `children`: A list of component IDs OR a repeating collection definition.
759
- * - `justify`: Flexbox justify-content value (e.g., 'flex-start', 'center').
760
- * - `align`: Flexbox align-items value (e.g., 'flex-start', 'center').
761
- */
762
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
763
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
764
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
765
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
766
806
  justify = computed$1(() => {
767
807
  const val = this.props()['justify']?.value();
768
- return val ? (JUSTIFY_MAP[val] || val) : undefined;
808
+ return val ? JUSTIFY_MAP[val] || val : undefined;
769
809
  }, ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
770
810
  align = computed$1(() => {
771
811
  const val = this.props()['align']?.value();
772
- return val ? (ALIGN_MAP[val] || val) : undefined;
812
+ return val ? ALIGN_MAP[val] || val : undefined;
773
813
  }, ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
774
- children = computed$1(() => {
775
- const raw = this.props()['children']?.value() || [];
776
- return Array.isArray(raw) ? raw : [];
777
- }, ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
814
+ children = computed$1(() => this.props()['children'].value() || [], ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
778
815
  isRepeating = computed$1(() => {
779
- return !!this.props()['children']?.raw?.componentId;
816
+ return !!this.props()['children'].template;
780
817
  }, ...(ngDevMode ? [{ debugName: "isRepeating" }] : /* istanbul ignore next */ []));
781
818
  templateId = computed$1(() => {
782
- return this.props()['children']?.raw?.componentId;
819
+ return this.props()['children'].template?.id;
783
820
  }, ...(ngDevMode ? [{ debugName: "templateId" }] : /* istanbul ignore next */ []));
784
821
  normalizedChildren = computed$1(() => {
785
822
  if (this.isRepeating())
@@ -792,29 +829,26 @@ class RowComponent extends BasicCatalogComponent {
792
829
  });
793
830
  }, ...(ngDevMode ? [{ debugName: "normalizedChildren" }] : /* istanbul ignore next */ []));
794
831
  getNormalizedPath(index) {
795
- return getNormalizedPath(this.props()['children']?.raw?.path, this.dataContextPath(), index);
832
+ return getNormalizedPath(this.props()['children'].template?.path, this.dataContextPath(), index);
796
833
  }
797
834
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RowComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
798
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: RowComponent, isStandalone: true, selector: "a2ui-v09-row", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "\"flex\"", "style.flex-direction": "\"row\"", "style.gap": "\"var(--a2ui-row-gap, var(--a2ui-spacing-m, 16px))\"", "style.justify-content": "justify()", "style.align-items": "align()" } }, usesInheritance: true, ngImport: i0, template: `
799
- @if (!isRepeating()) {
800
- @for (child of normalizedChildren(); track child.id) {
801
- <a2ui-v09-component-host
802
- [componentKey]="child"
803
- [surfaceId]="surfaceId()"
804
- >
805
- </a2ui-v09-component-host>
806
- }
835
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: RowComponent, isStandalone: true, selector: "a2ui-v09-row", host: { properties: { "style.display": "\"flex\"", "style.flex-direction": "\"row\"", "style.gap": "\"var(--a2ui-row-gap, var(--a2ui-spacing-m, 16px))\"", "style.justify-content": "justify()", "style.align-items": "align()" } }, usesInheritance: true, ngImport: i0, template: `
836
+ @if (!isRepeating()) {
837
+ @for (child of normalizedChildren(); track child.id) {
838
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
839
+ </a2ui-v09-component-host>
807
840
  }
841
+ }
808
842
 
809
- @if (isRepeating()) {
810
- @for (item of children(); track item; let i = $index) {
811
- <a2ui-v09-component-host
812
- [componentKey]="{ id: templateId()!, basePath: getNormalizedPath(i) }"
813
- [surfaceId]="surfaceId()"
814
- >
815
- </a2ui-v09-component-host>
816
- }
843
+ @if (isRepeating()) {
844
+ @for (item of children(); track item; let i = $index) {
845
+ <a2ui-v09-component-host
846
+ [componentKey]="{id: templateId()!, basePath: getNormalizedPath(i)}"
847
+ [surfaceId]="surfaceId()"
848
+ >
849
+ </a2ui-v09-component-host>
817
850
  }
851
+ }
818
852
  `, isInline: true, dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
819
853
  }
820
854
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RowComponent, decorators: [{
@@ -828,32 +862,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
828
862
  '[style.flex-direction]': '"row"',
829
863
  '[style.gap]': '"var(--a2ui-row-gap, var(--a2ui-spacing-m, 16px))"',
830
864
  '[style.justify-content]': 'justify()',
831
- '[style.align-items]': 'align()'
865
+ '[style.align-items]': 'align()',
832
866
  },
833
867
  template: `
834
- @if (!isRepeating()) {
835
- @for (child of normalizedChildren(); track child.id) {
836
- <a2ui-v09-component-host
837
- [componentKey]="child"
838
- [surfaceId]="surfaceId()"
839
- >
840
- </a2ui-v09-component-host>
841
- }
868
+ @if (!isRepeating()) {
869
+ @for (child of normalizedChildren(); track child.id) {
870
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
871
+ </a2ui-v09-component-host>
842
872
  }
873
+ }
843
874
 
844
- @if (isRepeating()) {
845
- @for (item of children(); track item; let i = $index) {
846
- <a2ui-v09-component-host
847
- [componentKey]="{ id: templateId()!, basePath: getNormalizedPath(i) }"
848
- [surfaceId]="surfaceId()"
849
- >
850
- </a2ui-v09-component-host>
851
- }
875
+ @if (isRepeating()) {
876
+ @for (item of children(); track item; let i = $index) {
877
+ <a2ui-v09-component-host
878
+ [componentKey]="{id: templateId()!, basePath: getNormalizedPath(i)}"
879
+ [surfaceId]="surfaceId()"
880
+ >
881
+ </a2ui-v09-component-host>
852
882
  }
883
+ }
853
884
  `,
854
885
  changeDetection: ChangeDetectionStrategy.OnPush,
855
886
  }]
856
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
887
+ }] });
857
888
 
858
889
  /**
859
890
  * Copyright 2026 Google LLC
@@ -880,35 +911,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
880
911
  * - `--a2ui-column-gap`: Controls the gap between items in the column. Defaults to `--a2ui-spacing-m` (16px).
881
912
  */
882
913
  class ColumnComponent extends BasicCatalogComponent {
883
- /**
884
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
885
- *
886
- * Expected properties:
887
- * - `children`: A list of component IDs OR a repeating collection definition.
888
- * - `justify`: Flexbox justify-content value (e.g., 'flex-start', 'center').
889
- * - `align`: Flexbox align-items value (e.g., 'flex-start', 'center').
890
- */
891
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
892
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
893
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
894
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
895
914
  justify = computed$1(() => {
896
915
  const val = this.props()['justify']?.value();
897
- return val ? (JUSTIFY_MAP[val] || val) : undefined;
916
+ return val ? JUSTIFY_MAP[val] || val : undefined;
898
917
  }, ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
899
918
  align = computed$1(() => {
900
919
  const val = this.props()['align']?.value();
901
- return val ? (ALIGN_MAP[val] || val) : undefined;
920
+ return val ? ALIGN_MAP[val] || val : undefined;
902
921
  }, ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
903
- children = computed$1(() => {
904
- const raw = this.props()['children']?.value() || [];
905
- return Array.isArray(raw) ? raw : [];
906
- }, ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
922
+ children = computed$1(() => this.props()['children'].value() || [], ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
907
923
  isRepeating = computed$1(() => {
908
- return !!this.props()['children']?.raw?.componentId;
924
+ return !!this.props()['children'].template;
909
925
  }, ...(ngDevMode ? [{ debugName: "isRepeating" }] : /* istanbul ignore next */ []));
910
926
  templateId = computed$1(() => {
911
- return this.props()['children']?.raw?.componentId;
927
+ return this.props()['children'].template?.id;
912
928
  }, ...(ngDevMode ? [{ debugName: "templateId" }] : /* istanbul ignore next */ []));
913
929
  normalizedChildren = computed$1(() => {
914
930
  if (this.isRepeating())
@@ -921,29 +937,26 @@ class ColumnComponent extends BasicCatalogComponent {
921
937
  });
922
938
  }, ...(ngDevMode ? [{ debugName: "normalizedChildren" }] : /* istanbul ignore next */ []));
923
939
  getNormalizedPath(index) {
924
- return getNormalizedPath(this.props()['children']?.raw?.path, this.dataContextPath(), index);
940
+ return getNormalizedPath(this.props()['children'].template?.path, this.dataContextPath(), index);
925
941
  }
926
942
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
927
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ColumnComponent, isStandalone: true, selector: "a2ui-v09-column", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "\"flex\"", "style.flex-direction": "\"column\"", "style.width": "\"100%\"", "style.gap": "\"var(--a2ui-column-gap, var(--a2ui-spacing-m, 16px))\"", "style.justify-content": "justify()", "style.align-items": "align()" } }, usesInheritance: true, ngImport: i0, template: `
928
- @if (!isRepeating()) {
929
- @for (child of normalizedChildren(); track child.id) {
930
- <a2ui-v09-component-host
931
- [componentKey]="child"
932
- [surfaceId]="surfaceId()"
933
- >
934
- </a2ui-v09-component-host>
935
- }
943
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ColumnComponent, isStandalone: true, selector: "a2ui-v09-column", host: { properties: { "style.display": "\"flex\"", "style.flex-direction": "\"column\"", "style.width": "\"100%\"", "style.gap": "\"var(--a2ui-column-gap, var(--a2ui-spacing-m, 16px))\"", "style.justify-content": "justify()", "style.align-items": "align()" } }, usesInheritance: true, ngImport: i0, template: `
944
+ @if (!isRepeating()) {
945
+ @for (child of normalizedChildren(); track child.id) {
946
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
947
+ </a2ui-v09-component-host>
936
948
  }
949
+ }
937
950
 
938
- @if (isRepeating()) {
939
- @for (item of children(); track item; let i = $index) {
940
- <a2ui-v09-component-host
941
- [componentKey]="{ id: templateId()!, basePath: getNormalizedPath(i) }"
942
- [surfaceId]="surfaceId()"
943
- >
944
- </a2ui-v09-component-host>
945
- }
951
+ @if (isRepeating()) {
952
+ @for (item of children(); track item; let i = $index) {
953
+ <a2ui-v09-component-host
954
+ [componentKey]="{id: templateId()!, basePath: getNormalizedPath(i)}"
955
+ [surfaceId]="surfaceId()"
956
+ >
957
+ </a2ui-v09-component-host>
946
958
  }
959
+ }
947
960
  `, isInline: true, dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
948
961
  }
949
962
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ColumnComponent, decorators: [{
@@ -958,32 +971,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
958
971
  '[style.width]': '"100%"',
959
972
  '[style.gap]': '"var(--a2ui-column-gap, var(--a2ui-spacing-m, 16px))"',
960
973
  '[style.justify-content]': 'justify()',
961
- '[style.align-items]': 'align()'
974
+ '[style.align-items]': 'align()',
962
975
  },
963
976
  template: `
964
- @if (!isRepeating()) {
965
- @for (child of normalizedChildren(); track child.id) {
966
- <a2ui-v09-component-host
967
- [componentKey]="child"
968
- [surfaceId]="surfaceId()"
969
- >
970
- </a2ui-v09-component-host>
971
- }
977
+ @if (!isRepeating()) {
978
+ @for (child of normalizedChildren(); track child.id) {
979
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
980
+ </a2ui-v09-component-host>
972
981
  }
982
+ }
973
983
 
974
- @if (isRepeating()) {
975
- @for (item of children(); track item; let i = $index) {
976
- <a2ui-v09-component-host
977
- [componentKey]="{ id: templateId()!, basePath: getNormalizedPath(i) }"
978
- [surfaceId]="surfaceId()"
979
- >
980
- </a2ui-v09-component-host>
981
- }
984
+ @if (isRepeating()) {
985
+ @for (item of children(); track item; let i = $index) {
986
+ <a2ui-v09-component-host
987
+ [componentKey]="{id: templateId()!, basePath: getNormalizedPath(i)}"
988
+ [surfaceId]="surfaceId()"
989
+ >
990
+ </a2ui-v09-component-host>
982
991
  }
992
+ }
983
993
  `,
984
994
  changeDetection: ChangeDetectionStrategy.OnPush,
985
995
  }]
986
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
996
+ }] });
987
997
 
988
998
  /**
989
999
  * Copyright 2026 Google LLC
@@ -1016,27 +1026,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1016
1026
  * - `--a2ui-button-font-weight`: Controls the font weight.
1017
1027
  */
1018
1028
  class ButtonComponent extends BasicCatalogComponent {
1019
- /**
1020
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1021
- *
1022
- * Expected properties:
1023
- * - `child`: The ID of the component to render inside the button.
1024
- * - `variant`: Button style variant ('default', 'primary', 'borderless').
1025
- * - `action`: The A2UI action to dispatch on click.
1026
- * - `checks`: Optional validation rules.
1027
- */
1028
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1029
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1030
- componentId = input.required(...(ngDevMode ? [{ debugName: "componentId" }] : /* istanbul ignore next */ []));
1031
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1032
- rendererService = inject(A2uiRendererService);
1033
1029
  variant = computed$1(() => this.props()['variant']?.value() ?? 'default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
1034
1030
  child = computed$1(() => this.props()['child']?.value(), ...(ngDevMode ? [{ debugName: "child" }] : /* istanbul ignore next */ []));
1035
1031
  action = computed$1(() => this.props()['action']?.value(), ...(ngDevMode ? [{ debugName: "action" }] : /* istanbul ignore next */ []));
1036
1032
  handleClick() {
1037
1033
  const action = this.action();
1038
1034
  if (action) {
1039
- const surface = this.rendererService.surfaceGroup?.getSurface(this.surfaceId());
1035
+ const surface = this.surface();
1040
1036
  if (surface) {
1041
1037
  const dataContext = new DataContext(surface, this.dataContextPath());
1042
1038
  const resolvedAction = dataContext.resolveAction(action);
@@ -1045,7 +1041,7 @@ class ButtonComponent extends BasicCatalogComponent {
1045
1041
  }
1046
1042
  }
1047
1043
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1048
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ButtonComponent, isStandalone: true, selector: "a2ui-v09-button", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: true, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1044
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ButtonComponent, isStandalone: true, selector: "a2ui-v09-button", usesInheritance: true, ngImport: i0, template: `
1049
1045
  <button
1050
1046
  [type]="variant() === 'primary' ? 'submit' : 'button'"
1051
1047
  [class]="'a2ui-button ' + variant()"
@@ -1053,14 +1049,11 @@ class ButtonComponent extends BasicCatalogComponent {
1053
1049
  [disabled]="props()['isValid']?.value() === false"
1054
1050
  >
1055
1051
  @if (child()) {
1056
- <a2ui-v09-component-host
1057
- [componentKey]="child()!"
1058
- [surfaceId]="surfaceId()"
1059
- >
1052
+ <a2ui-v09-component-host [componentKey]="child()!" [surfaceId]="surfaceId()">
1060
1053
  </a2ui-v09-component-host>
1061
1054
  }
1062
1055
  </button>
1063
- `, isInline: true, styles: [".a2ui-button{padding:var(--a2ui-button-padding, var(--a2ui-spacing-m, .5rem) var(--a2ui-spacing-l, 1rem));border-radius:var(--a2ui-button-border-radius, var(--a2ui-spacing-s, .25rem));border:var(--a2ui-button-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc));cursor:pointer;margin:var(--a2ui-button-margin, var(--a2ui-spacing-m, .5rem));background:var(--a2ui-button-background, var(--a2ui-color-surface, #fff));box-shadow:var(--a2ui-button-box-shadow, none);font-weight:var(--a2ui-button-font-weight, normal);--_a2ui-text-margin: 0;--_a2ui-text-color: var(--a2ui-color-on-secondary, #333);color:var(--_a2ui-text-color)}.a2ui-button.primary{background-color:var(--a2ui-color-primary, #17e);--_a2ui-text-color: var(--a2ui-color-on-primary, #fff);color:var(--_a2ui-text-color);border-color:var(--a2ui-color-primary-hover, #0069d9)}.a2ui-button.borderless{background:none;border:none;padding:0;color:var(--a2ui-color-primary, #17e)}.a2ui-button:disabled{background-color:#e9ecef;color:#6c757d;border-color:#ced4da;cursor:not-allowed}\n"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1056
+ `, isInline: true, styles: [".a2ui-button{padding:var( --a2ui-button-padding, var(--a2ui-spacing-m, .5rem) var(--a2ui-spacing-l, 1rem) );border-radius:var(--a2ui-button-border-radius, var(--a2ui-spacing-s, .25rem));border:var( --a2ui-button-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc) );cursor:pointer;margin:var(--a2ui-button-margin, var(--a2ui-spacing-m, .5rem));background:var(--a2ui-button-background, var(--a2ui-color-surface, #fff));box-shadow:var(--a2ui-button-box-shadow, none);font-weight:var(--a2ui-button-font-weight, normal);--_a2ui-text-margin: 0;--_a2ui-text-color: var(--a2ui-color-on-secondary, #333);color:var(--_a2ui-text-color)}.a2ui-button.primary{background:var(--a2ui-color-primary, #17e);--_a2ui-text-color: var(--a2ui-color-on-primary, #fff);color:var(--_a2ui-text-color);border:none}.a2ui-button.borderless{background:none;border:none;padding:0;color:var(--a2ui-color-primary, #17e)}.a2ui-button:disabled{background-color:#e9ecef;color:#6c757d;border-color:#ced4da;cursor:not-allowed}\n"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1064
1057
  }
1065
1058
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ButtonComponent, decorators: [{
1066
1059
  type: Component,
@@ -1072,15 +1065,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1072
1065
  [disabled]="props()['isValid']?.value() === false"
1073
1066
  >
1074
1067
  @if (child()) {
1075
- <a2ui-v09-component-host
1076
- [componentKey]="child()!"
1077
- [surfaceId]="surfaceId()"
1078
- >
1068
+ <a2ui-v09-component-host [componentKey]="child()!" [surfaceId]="surfaceId()">
1079
1069
  </a2ui-v09-component-host>
1080
1070
  }
1081
1071
  </button>
1082
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-button{padding:var(--a2ui-button-padding, var(--a2ui-spacing-m, .5rem) var(--a2ui-spacing-l, 1rem));border-radius:var(--a2ui-button-border-radius, var(--a2ui-spacing-s, .25rem));border:var(--a2ui-button-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc));cursor:pointer;margin:var(--a2ui-button-margin, var(--a2ui-spacing-m, .5rem));background:var(--a2ui-button-background, var(--a2ui-color-surface, #fff));box-shadow:var(--a2ui-button-box-shadow, none);font-weight:var(--a2ui-button-font-weight, normal);--_a2ui-text-margin: 0;--_a2ui-text-color: var(--a2ui-color-on-secondary, #333);color:var(--_a2ui-text-color)}.a2ui-button.primary{background-color:var(--a2ui-color-primary, #17e);--_a2ui-text-color: var(--a2ui-color-on-primary, #fff);color:var(--_a2ui-text-color);border-color:var(--a2ui-color-primary-hover, #0069d9)}.a2ui-button.borderless{background:none;border:none;padding:0;color:var(--a2ui-color-primary, #17e)}.a2ui-button:disabled{background-color:#e9ecef;color:#6c757d;border-color:#ced4da;cursor:not-allowed}\n"] }]
1083
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: true }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1072
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-button{padding:var( --a2ui-button-padding, var(--a2ui-spacing-m, .5rem) var(--a2ui-spacing-l, 1rem) );border-radius:var(--a2ui-button-border-radius, var(--a2ui-spacing-s, .25rem));border:var( --a2ui-button-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc) );cursor:pointer;margin:var(--a2ui-button-margin, var(--a2ui-spacing-m, .5rem));background:var(--a2ui-button-background, var(--a2ui-color-surface, #fff));box-shadow:var(--a2ui-button-box-shadow, none);font-weight:var(--a2ui-button-font-weight, normal);--_a2ui-text-margin: 0;--_a2ui-text-color: var(--a2ui-color-on-secondary, #333);color:var(--_a2ui-text-color)}.a2ui-button.primary{background:var(--a2ui-color-primary, #17e);--_a2ui-text-color: var(--a2ui-color-on-primary, #fff);color:var(--_a2ui-text-color);border:none}.a2ui-button.borderless{background:none;border:none;padding:0;color:var(--a2ui-color-primary, #17e)}.a2ui-button:disabled{background-color:#e9ecef;color:#6c757d;border-color:#ced4da;cursor:not-allowed}\n"] }]
1073
+ }] });
1084
1074
 
1085
1075
  /**
1086
1076
  * Copyright 2026 Google LLC
@@ -1115,20 +1105,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1115
1105
  * - `--a2ui-textfield-label-font-weight`: Controls the font weight of the label.
1116
1106
  */
1117
1107
  class TextFieldComponent extends BasicCatalogComponent {
1118
- /**
1119
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1120
- *
1121
- * Expected properties:
1122
- * - `value`: The current string value of the input.
1123
- * - `label`: Optional label text to display above the input.
1124
- * - `placeholder`: Hint text shown when the input is empty.
1125
- * - `variant`: Input type variant ('default', 'obscured' (password), 'number').
1126
- * - `checks`: Optional validation rules.
1127
- */
1128
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1129
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1130
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1131
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1132
1108
  label = computed$1(() => this.props()['label']?.value(), ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1133
1109
  value = computed$1(() => this.props()['value']?.value() || '', ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1134
1110
  placeholder = computed$1(() => this.props()['placeholder']?.value() || '', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
@@ -1150,7 +1126,7 @@ class TextFieldComponent extends BasicCatalogComponent {
1150
1126
  this.props()['value']?.onUpdate(value);
1151
1127
  }
1152
1128
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1153
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: TextFieldComponent, isStandalone: true, selector: "a2ui-v09-text-field", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1129
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: TextFieldComponent, isStandalone: true, selector: "a2ui-v09-text-field", usesInheritance: true, ngImport: i0, template: `
1154
1130
  <div class="a2ui-text-field-container">
1155
1131
  @if (label()) {
1156
1132
  <label>{{ label() }}</label>
@@ -1166,7 +1142,7 @@ class TextFieldComponent extends BasicCatalogComponent {
1166
1142
  <div class="a2ui-error-message">{{ message }}</div>
1167
1143
  }
1168
1144
  </div>
1169
- `, isInline: true, styles: [".a2ui-text-field-container{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);margin:var(--a2ui-spacing-xs, 4px)}label{font-size:var(--a2ui-textfield-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)));font-weight:var(--a2ui-textfield-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}input{padding:var(--a2ui-textfield-padding, 8px);border:var(--a2ui-textfield-border, 1px solid var(--a2ui-color-border, #ccc));border-radius:var(--a2ui-textfield-border-radius, 4px);background-color:var(--a2ui-color-input, #fff);color:var(--a2ui-color-on-input, #333)}input:focus{border-color:var(--a2ui-textfield-color-border-focus, var(--a2ui-color-primary, #17e));outline:none}input.invalid{border-color:var(--a2ui-textfield-color-error, var(--a2ui-color-error, red))}.a2ui-error-message{color:var(--a2ui-textfield-color-error, var(--a2ui-color-error, red));font-size:var(--a2ui-font-size-xs, 12px)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1145
+ `, isInline: true, styles: [".a2ui-text-field-container{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);margin:var(--a2ui-spacing-xs, 4px)}label{font-size:var( --a2ui-textfield-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)) );font-weight:var(--a2ui-textfield-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}input{padding:var(--a2ui-textfield-padding, 8px);border:var(--a2ui-textfield-border, 1px solid var(--a2ui-color-border, #ccc));border-radius:var(--a2ui-textfield-border-radius, 4px);background-color:var(--a2ui-color-input, #fff);color:var(--a2ui-color-on-input, #333)}input:focus{border-color:var(--a2ui-textfield-color-border-focus, var(--a2ui-color-primary, #17e));outline:none}input.invalid{border-color:var(--a2ui-textfield-color-error, var(--a2ui-color-error, red))}.a2ui-error-message{color:var(--a2ui-textfield-color-error, var(--a2ui-color-error, red));font-size:var(--a2ui-font-size-xs, 12px)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1170
1146
  }
1171
1147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextFieldComponent, decorators: [{
1172
1148
  type: Component,
@@ -1186,8 +1162,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1186
1162
  <div class="a2ui-error-message">{{ message }}</div>
1187
1163
  }
1188
1164
  </div>
1189
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-text-field-container{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);margin:var(--a2ui-spacing-xs, 4px)}label{font-size:var(--a2ui-textfield-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)));font-weight:var(--a2ui-textfield-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}input{padding:var(--a2ui-textfield-padding, 8px);border:var(--a2ui-textfield-border, 1px solid var(--a2ui-color-border, #ccc));border-radius:var(--a2ui-textfield-border-radius, 4px);background-color:var(--a2ui-color-input, #fff);color:var(--a2ui-color-on-input, #333)}input:focus{border-color:var(--a2ui-textfield-color-border-focus, var(--a2ui-color-primary, #17e));outline:none}input.invalid{border-color:var(--a2ui-textfield-color-error, var(--a2ui-color-error, red))}.a2ui-error-message{color:var(--a2ui-textfield-color-error, var(--a2ui-color-error, red));font-size:var(--a2ui-font-size-xs, 12px)}\n"] }]
1190
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1165
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-text-field-container{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);margin:var(--a2ui-spacing-xs, 4px)}label{font-size:var( --a2ui-textfield-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)) );font-weight:var(--a2ui-textfield-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}input{padding:var(--a2ui-textfield-padding, 8px);border:var(--a2ui-textfield-border, 1px solid var(--a2ui-color-border, #ccc));border-radius:var(--a2ui-textfield-border-radius, 4px);background-color:var(--a2ui-color-input, #fff);color:var(--a2ui-color-on-input, #333)}input:focus{border-color:var(--a2ui-textfield-color-border-focus, var(--a2ui-color-primary, #17e));outline:none}input.invalid{border-color:var(--a2ui-textfield-color-error, var(--a2ui-color-error, red))}.a2ui-error-message{color:var(--a2ui-textfield-color-error, var(--a2ui-color-error, red));font-size:var(--a2ui-font-size-xs, 12px)}\n"] }]
1166
+ }] });
1191
1167
 
1192
1168
  /**
1193
1169
  * Copyright 2026 Google LLC
@@ -1218,32 +1194,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1218
1194
  * - `--a2ui-image-header-size`: Height of header variant.
1219
1195
  */
1220
1196
  class ImageComponent extends BasicCatalogComponent {
1221
- /**
1222
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1223
- *
1224
- * Expected properties:
1225
- * - `url`: The absolute URL of the image.
1226
- * - `description`: Accessibility text for the image.
1227
- * - `fit`: Object-fit mode ('cover', 'contain', 'fill', 'none', 'scale-down').
1228
- * - `variant`: Style variant ('default', 'circle', 'rounded', 'icon', 'avatar', 'smallFeature', 'mediumFeature', 'largeFeature', 'header').
1229
- */
1230
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1231
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1232
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1233
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1234
1197
  url = computed$1(() => this.props()['url']?.value(), ...(ngDevMode ? [{ debugName: "url" }] : /* istanbul ignore next */ []));
1235
1198
  description = computed$1(() => this.props()['description']?.value() || '', ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
1236
1199
  fit = computed$1(() => this.props()['fit']?.value() || 'cover', ...(ngDevMode ? [{ debugName: "fit" }] : /* istanbul ignore next */ []));
1237
1200
  variant = computed$1(() => this.props()['variant']?.value() || 'default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
1238
1201
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ImageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1239
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: ImageComponent, isStandalone: true, selector: "a2ui-v09-image", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1202
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: ImageComponent, isStandalone: true, selector: "a2ui-v09-image", usesInheritance: true, ngImport: i0, template: `
1240
1203
  <img
1241
1204
  [src]="url()"
1242
1205
  [alt]="description()"
1243
1206
  [style.object-fit]="fit()"
1244
1207
  [class]="'a2ui-image ' + variant()"
1245
1208
  />
1246
- `, isInline: true, styles: [".a2ui-image{display:block;max-width:100%;height:auto}.a2ui-image.circle{border-radius:50%;aspect-ratio:1 / 1}.a2ui-image.rounded{border-radius:var(--a2ui-image-border-radius, var(--a2ui-border-radius, 8px))}.a2ui-image.icon{width:var(--a2ui-image-icon-size, 24px);height:var(--a2ui-image-icon-size, 24px)}.a2ui-image.avatar{width:var(--a2ui-image-avatar-size, 40px);height:var(--a2ui-image-avatar-size, 40px);border-radius:50%}.a2ui-image.smallFeature{max-width:var(--a2ui-image-small-feature-size, 100px)}.a2ui-image.mediumFeature{max-width:300px;height:auto}.a2ui-image.largeFeature{width:100%;max-height:var(--a2ui-image-large-feature-size, 400px)}.a2ui-image.header{width:100%;height:var(--a2ui-image-header-size, 200px)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1209
+ `, isInline: true, styles: [".a2ui-image{display:block;max-width:100%;height:auto;border-radius:var(--a2ui-image-border-radius, var(--a2ui-border-radius, 8px))}.a2ui-image.icon{width:var(--a2ui-image-icon-size, 24px);height:var(--a2ui-image-icon-size, 24px)}.a2ui-image.avatar{width:var(--a2ui-image-avatar-size, 40px);height:var(--a2ui-image-avatar-size, 40px);border-radius:50%}.a2ui-image.smallFeature{max-width:var(--a2ui-image-small-feature-size, 100px)}.a2ui-image.largeFeature{max-height:var(--a2ui-image-large-feature-size, 400px)}.a2ui-image.header{height:var(--a2ui-image-header-size, 200px)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1247
1210
  }
1248
1211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ImageComponent, decorators: [{
1249
1212
  type: Component,
@@ -1254,8 +1217,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1254
1217
  [style.object-fit]="fit()"
1255
1218
  [class]="'a2ui-image ' + variant()"
1256
1219
  />
1257
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-image{display:block;max-width:100%;height:auto}.a2ui-image.circle{border-radius:50%;aspect-ratio:1 / 1}.a2ui-image.rounded{border-radius:var(--a2ui-image-border-radius, var(--a2ui-border-radius, 8px))}.a2ui-image.icon{width:var(--a2ui-image-icon-size, 24px);height:var(--a2ui-image-icon-size, 24px)}.a2ui-image.avatar{width:var(--a2ui-image-avatar-size, 40px);height:var(--a2ui-image-avatar-size, 40px);border-radius:50%}.a2ui-image.smallFeature{max-width:var(--a2ui-image-small-feature-size, 100px)}.a2ui-image.mediumFeature{max-width:300px;height:auto}.a2ui-image.largeFeature{width:100%;max-height:var(--a2ui-image-large-feature-size, 400px)}.a2ui-image.header{width:100%;height:var(--a2ui-image-header-size, 200px)}\n"] }]
1258
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1220
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-image{display:block;max-width:100%;height:auto;border-radius:var(--a2ui-image-border-radius, var(--a2ui-border-radius, 8px))}.a2ui-image.icon{width:var(--a2ui-image-icon-size, 24px);height:var(--a2ui-image-icon-size, 24px)}.a2ui-image.avatar{width:var(--a2ui-image-avatar-size, 40px);height:var(--a2ui-image-avatar-size, 40px);border-radius:50%}.a2ui-image.smallFeature{max-width:var(--a2ui-image-small-feature-size, 100px)}.a2ui-image.largeFeature{max-height:var(--a2ui-image-large-feature-size, 400px)}.a2ui-image.header{height:var(--a2ui-image-header-size, 200px)}\n"] }]
1221
+ }] });
1259
1222
 
1260
1223
  /**
1261
1224
  * Copyright 2026 Google LLC
@@ -1272,6 +1235,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1272
1235
  * See the License for the specific language governing permissions and
1273
1236
  * limitations under the License.
1274
1237
  */
1238
+ const ICON_NAME_OVERRIDES = {
1239
+ play: 'play_arrow',
1240
+ rewind: 'fast_rewind',
1241
+ favoriteOff: 'favorite_border',
1242
+ starOff: 'star_border',
1243
+ };
1275
1244
  /**
1276
1245
  * Angular implementation of the A2UI Icon component (v0.9).
1277
1246
  *
@@ -1284,62 +1253,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1284
1253
  * - `--a2ui-icon-font-variation-settings`: Controls font variation settings (e.g. FILL).
1285
1254
  */
1286
1255
  class IconComponent extends BasicCatalogComponent {
1287
- /**
1288
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1289
- *
1290
- * Expected properties:
1291
- * - `name`: The name of the icon (e.g., 'home', 'settings') OR an object
1292
- * with a `path` property for SVG icons.
1293
- * - `color`: The CSS color to apply to the icon.
1294
- */
1295
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1296
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1297
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1298
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1299
1256
  color = computed$1(() => this.props()['color']?.value(), ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
1300
1257
  iconNameRaw = computed$1(() => this.props()['name']?.value(), ...(ngDevMode ? [{ debugName: "iconNameRaw" }] : /* istanbul ignore next */ []));
1301
- isPath = computed$1(() => {
1258
+ isSvgPath = computed$1(() => {
1302
1259
  const name = this.iconNameRaw();
1303
- return typeof name === 'object' && name !== null && 'path' in name;
1304
- }, ...(ngDevMode ? [{ debugName: "isPath" }] : /* istanbul ignore next */ []));
1305
- path = computed$1(() => {
1260
+ return typeof name === 'object' && name !== null && 'svgPath' in name;
1261
+ }, ...(ngDevMode ? [{ debugName: "isSvgPath" }] : /* istanbul ignore next */ []));
1262
+ svgPath = computed$1(() => {
1306
1263
  const name = this.iconNameRaw();
1307
- return name?.path || '';
1308
- }, ...(ngDevMode ? [{ debugName: "path" }] : /* istanbul ignore next */ []));
1264
+ if (typeof name === 'object' && name !== null && 'svgPath' in name) {
1265
+ return name.svgPath;
1266
+ }
1267
+ return '';
1268
+ }, ...(ngDevMode ? [{ debugName: "svgPath" }] : /* istanbul ignore next */ []));
1309
1269
  iconName = computed$1(() => {
1310
1270
  const name = this.iconNameRaw();
1311
1271
  if (typeof name !== 'string')
1312
1272
  return '';
1273
+ if (ICON_NAME_OVERRIDES[name])
1274
+ return ICON_NAME_OVERRIDES[name];
1313
1275
  // Convert camelCase to snake_case for Material Icons
1314
- return name.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
1276
+ return name.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
1315
1277
  }, ...(ngDevMode ? [{ debugName: "iconName" }] : /* istanbul ignore next */ []));
1316
1278
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: IconComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1317
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: IconComponent, isStandalone: true, selector: "a2ui-v09-icon", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1318
- @if (isPath()) {
1279
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: IconComponent, isStandalone: true, selector: "a2ui-v09-icon", usesInheritance: true, ngImport: i0, template: `
1280
+ @if (isSvgPath()) {
1319
1281
  <svg class="a2ui-icon svg" viewBox="0 0 24 24" [style.fill]="color() || 'currentColor'">
1320
- <path [attr.d]="path()"></path>
1282
+ <path [attr.d]="svgPath()"></path>
1321
1283
  </svg>
1322
1284
  } @else {
1323
1285
  <i class="material-icons a2ui-icon" [style.color]="color()">
1324
1286
  {{ iconName() }}
1325
1287
  </i>
1326
1288
  }
1327
- `, isInline: true, styles: [".a2ui-icon{display:inline-block;width:var(--a2ui-icon-size, 24px);height:var(--a2ui-icon-size, 24px);font-size:var(--a2ui-icon-size, 24px);font-family:var(--a2ui-icon-font-family, \"Material Icons\");color:var(--a2ui-icon-color, var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333)));font-variation-settings:var(--a2ui-icon-font-variation-settings, \"FILL\" 1);line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\";vertical-align:middle}.a2ui-icon.svg{fill:currentColor}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1289
+ `, isInline: true, styles: [".a2ui-icon{display:inline-block;width:var(--a2ui-icon-size, 24px);height:var(--a2ui-icon-size, 24px);font-size:var(--a2ui-icon-size, 24px);font-family:var(--a2ui-icon-font-family, \"Material Icons\");color:var( --a2ui-icon-color, var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333)) );font-variation-settings:var(--a2ui-icon-font-variation-settings, \"FILL\" 1);line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\";vertical-align:middle}.a2ui-icon.svg{fill:currentColor}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1328
1290
  }
1329
1291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: IconComponent, decorators: [{
1330
1292
  type: Component,
1331
1293
  args: [{ selector: 'a2ui-v09-icon', standalone: true, imports: [], template: `
1332
- @if (isPath()) {
1294
+ @if (isSvgPath()) {
1333
1295
  <svg class="a2ui-icon svg" viewBox="0 0 24 24" [style.fill]="color() || 'currentColor'">
1334
- <path [attr.d]="path()"></path>
1296
+ <path [attr.d]="svgPath()"></path>
1335
1297
  </svg>
1336
1298
  } @else {
1337
1299
  <i class="material-icons a2ui-icon" [style.color]="color()">
1338
1300
  {{ iconName() }}
1339
1301
  </i>
1340
1302
  }
1341
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-icon{display:inline-block;width:var(--a2ui-icon-size, 24px);height:var(--a2ui-icon-size, 24px);font-size:var(--a2ui-icon-size, 24px);font-family:var(--a2ui-icon-font-family, \"Material Icons\");color:var(--a2ui-icon-color, var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333)));font-variation-settings:var(--a2ui-icon-font-variation-settings, \"FILL\" 1);line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\";vertical-align:middle}.a2ui-icon.svg{fill:currentColor}\n"] }]
1342
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1303
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-icon{display:inline-block;width:var(--a2ui-icon-size, 24px);height:var(--a2ui-icon-size, 24px);font-size:var(--a2ui-icon-size, 24px);font-family:var(--a2ui-icon-font-family, \"Material Icons\");color:var( --a2ui-icon-color, var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333)) );font-variation-settings:var(--a2ui-icon-font-variation-settings, \"FILL\" 1);line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\";vertical-align:middle}.a2ui-icon.svg{fill:currentColor}\n"] }]
1304
+ }] });
1343
1305
 
1344
1306
  /**
1345
1307
  * Copyright 2026 Google LLC
@@ -1365,21 +1327,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1365
1327
  * - `--a2ui-video-border-radius`: Controls the border radius of the video element.
1366
1328
  */
1367
1329
  class VideoComponent extends BasicCatalogComponent {
1368
- /**
1369
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1370
- *
1371
- * Expected properties:
1372
- * - `url`: The absolute URL of the video file.
1373
- * - `posterUrl`: The URL of an image to show before the video starts.
1374
- */
1375
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1376
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1377
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1378
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1379
1330
  url = computed$1(() => this.props()['url']?.value(), ...(ngDevMode ? [{ debugName: "url" }] : /* istanbul ignore next */ []));
1380
1331
  posterUrl = computed$1(() => this.props()['posterUrl']?.value(), ...(ngDevMode ? [{ debugName: "posterUrl" }] : /* istanbul ignore next */ []));
1381
1332
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: VideoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1382
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: VideoComponent, isStandalone: true, selector: "a2ui-v09-video", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1333
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: VideoComponent, isStandalone: true, selector: "a2ui-v09-video", usesInheritance: true, ngImport: i0, template: `
1383
1334
  <div class="a2ui-video-container">
1384
1335
  <video
1385
1336
  [attr.src]="url() || null"
@@ -1406,7 +1357,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1406
1357
  </video>
1407
1358
  </div>
1408
1359
  `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-video-container{width:100%;max-width:100%}.a2ui-video{width:100%;height:auto;display:block;border-radius:var(--a2ui-video-border-radius, 0)}\n"] }]
1409
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1360
+ }] });
1410
1361
 
1411
1362
  /**
1412
1363
  * Copyright 2026 Google LLC
@@ -1434,21 +1385,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1434
1385
  * - `--a2ui-audioplayer-padding`: Controls the padding. Defaults to `0`.
1435
1386
  */
1436
1387
  class AudioPlayerComponent extends BasicCatalogComponent {
1437
- /**
1438
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1439
- *
1440
- * Expected properties:
1441
- * - `url`: The absolute URL of the audio file.
1442
- * - `description`: Optional text to display above the player.
1443
- */
1444
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1445
- surfaceId = input(...(ngDevMode ? [undefined, { debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1446
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1447
- dataContextPath = input(...(ngDevMode ? [undefined, { debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1448
1388
  description = computed$1(() => this.props()['description']?.value(), ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
1449
1389
  url = computed$1(() => this.props()['url']?.value(), ...(ngDevMode ? [{ debugName: "url" }] : /* istanbul ignore next */ []));
1450
1390
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AudioPlayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1451
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: AudioPlayerComponent, isStandalone: true, selector: "a2ui-v09-audio-player", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: false, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1391
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: AudioPlayerComponent, isStandalone: true, selector: "a2ui-v09-audio-player", usesInheritance: true, ngImport: i0, template: `
1452
1392
  <div class="a2ui-audio-player">
1453
1393
  @if (description()) {
1454
1394
  <div class="a2ui-audio-description">
@@ -1475,7 +1415,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1475
1415
  </audio>
1476
1416
  </div>
1477
1417
  `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-audio-player{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, .25rem);background:var(--a2ui-audioplayer-background, transparent);border-radius:var(--a2ui-audioplayer-border-radius, 0);padding:var(--a2ui-audioplayer-padding, 0);width:100%}.a2ui-audio-description{font-size:var(--a2ui-font-size-s, .875rem);color:var(--a2ui-text-caption-color, light-dark(#666, #aaa))}.a2ui-audio{width:100%}\n"] }]
1478
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: false }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1418
+ }] });
1479
1419
 
1480
1420
  /**
1481
1421
  * Copyright 2026 Google LLC
@@ -1496,31 +1436,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1496
1436
  * Angular implementation of the A2UI List component (v0.9).
1497
1437
  *
1498
1438
  * Renders a list of child components with support for ordered, unordered,
1499
- * and unstyled layouts in both vertical and horizontal orientations.
1439
+ * and unstyled layouts in both vertical and horizontal directions.
1500
1440
  *
1501
1441
  * Supported CSS variables:
1502
1442
  * - `--a2ui-list-gap`: Controls the gap between items.
1503
1443
  * - `--a2ui-list-padding`: Controls the padding (applied to padding-inline-start).
1504
1444
  */
1505
1445
  class ListComponent extends BasicCatalogComponent {
1506
- /**
1507
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1508
- *
1509
- * Expected properties:
1510
- * - `children`: A list of component IDs to render as list items.
1511
- * - `listStyle`: The type of list ('ordered', 'unordered', 'none').
1512
- * - `orientation`: The layout direction ('vertical', 'horizontal').
1513
- */
1514
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1515
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1516
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1517
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1518
1446
  listStyle = computed$1(() => this.props()['listStyle']?.value(), ...(ngDevMode ? [{ debugName: "listStyle" }] : /* istanbul ignore next */ []));
1519
- orientation = computed$1(() => this.props()['orientation']?.value() || 'vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
1520
- children = computed$1(() => {
1521
- const raw = this.props()['children']?.value();
1522
- return Array.isArray(raw) ? raw : [];
1523
- }, ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
1447
+ direction = computed$1(() => this.props()['direction']?.value() || 'vertical', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
1448
+ children = computed$1(() => this.props()['children'].value(), ...(ngDevMode ? [{ debugName: "children" }] : /* istanbul ignore next */ []));
1524
1449
  listTag = computed$1(() => {
1525
1450
  const style = this.listStyle();
1526
1451
  if (style === 'ordered')
@@ -1541,42 +1466,33 @@ class ListComponent extends BasicCatalogComponent {
1541
1466
  */
1542
1467
  trackBy = (index, item) => `${item.basePath}/${item.id}`;
1543
1468
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1544
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ListComponent, isStandalone: true, selector: "a2ui-v09-list", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1469
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ListComponent, isStandalone: true, selector: "a2ui-v09-list", usesInheritance: true, ngImport: i0, template: `
1545
1470
  @switch (listTag()) {
1546
1471
  @case ('ol') {
1547
- <ol [class]="'a2ui-list ' + orientation()" [style.list-style-type]="styleType()">
1472
+ <ol [class]="'a2ui-list ' + direction()" [style.list-style-type]="styleType()">
1548
1473
  @for (child of children(); track trackBy($index, child)) {
1549
1474
  <li>
1550
- <a2ui-v09-component-host
1551
- [componentKey]="child"
1552
- [surfaceId]="surfaceId()"
1553
- >
1475
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
1554
1476
  </a2ui-v09-component-host>
1555
1477
  </li>
1556
1478
  }
1557
1479
  </ol>
1558
1480
  }
1559
1481
  @case ('ul') {
1560
- <ul [class]="'a2ui-list ' + orientation()" [style.list-style-type]="styleType()">
1482
+ <ul [class]="'a2ui-list ' + direction()" [style.list-style-type]="styleType()">
1561
1483
  @for (child of children(); track trackBy($index, child)) {
1562
1484
  <li>
1563
- <a2ui-v09-component-host
1564
- [componentKey]="child"
1565
- [surfaceId]="surfaceId()"
1566
- >
1485
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
1567
1486
  </a2ui-v09-component-host>
1568
1487
  </li>
1569
1488
  }
1570
1489
  </ul>
1571
1490
  }
1572
1491
  @default {
1573
- <div [class]="'a2ui-list ' + orientation()" style="list-style-type: none;">
1492
+ <div [class]="'a2ui-list ' + direction()" style="list-style-type: none;">
1574
1493
  @for (child of children(); track trackBy($index, child)) {
1575
1494
  <div class="a2ui-list-item-none">
1576
- <a2ui-v09-component-host
1577
- [componentKey]="child"
1578
- [surfaceId]="surfaceId()"
1579
- >
1495
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
1580
1496
  </a2ui-v09-component-host>
1581
1497
  </div>
1582
1498
  }
@@ -1590,39 +1506,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1590
1506
  args: [{ selector: 'a2ui-v09-list', standalone: true, imports: [ComponentHostComponent], template: `
1591
1507
  @switch (listTag()) {
1592
1508
  @case ('ol') {
1593
- <ol [class]="'a2ui-list ' + orientation()" [style.list-style-type]="styleType()">
1509
+ <ol [class]="'a2ui-list ' + direction()" [style.list-style-type]="styleType()">
1594
1510
  @for (child of children(); track trackBy($index, child)) {
1595
1511
  <li>
1596
- <a2ui-v09-component-host
1597
- [componentKey]="child"
1598
- [surfaceId]="surfaceId()"
1599
- >
1512
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
1600
1513
  </a2ui-v09-component-host>
1601
1514
  </li>
1602
1515
  }
1603
1516
  </ol>
1604
1517
  }
1605
1518
  @case ('ul') {
1606
- <ul [class]="'a2ui-list ' + orientation()" [style.list-style-type]="styleType()">
1519
+ <ul [class]="'a2ui-list ' + direction()" [style.list-style-type]="styleType()">
1607
1520
  @for (child of children(); track trackBy($index, child)) {
1608
1521
  <li>
1609
- <a2ui-v09-component-host
1610
- [componentKey]="child"
1611
- [surfaceId]="surfaceId()"
1612
- >
1522
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
1613
1523
  </a2ui-v09-component-host>
1614
1524
  </li>
1615
1525
  }
1616
1526
  </ul>
1617
1527
  }
1618
1528
  @default {
1619
- <div [class]="'a2ui-list ' + orientation()" style="list-style-type: none;">
1529
+ <div [class]="'a2ui-list ' + direction()" style="list-style-type: none;">
1620
1530
  @for (child of children(); track trackBy($index, child)) {
1621
1531
  <div class="a2ui-list-item-none">
1622
- <a2ui-v09-component-host
1623
- [componentKey]="child"
1624
- [surfaceId]="surfaceId()"
1625
- >
1532
+ <a2ui-v09-component-host [componentKey]="child" [surfaceId]="surfaceId()">
1626
1533
  </a2ui-v09-component-host>
1627
1534
  </div>
1628
1535
  }
@@ -1630,7 +1537,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1630
1537
  }
1631
1538
  }
1632
1539
  `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-list{display:flex;padding-inline-start:var(--a2ui-list-padding, var(--a2ui-spacing-l, 24px));margin:0}.a2ui-list.vertical{flex-direction:column;gap:var(--a2ui-list-gap, var(--a2ui-spacing-s, 8px))}.a2ui-list.horizontal{flex-direction:row;gap:var(--a2ui-list-gap, var(--a2ui-spacing-m, 16px));list-style-position:inside}.a2ui-list-item-none{display:block}.horizontal .a2ui-list-item-none{display:inline-block}\n"] }]
1633
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1540
+ }] });
1634
1541
 
1635
1542
  /**
1636
1543
  * Copyright 2026 Google LLC
@@ -1661,44 +1568,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1661
1568
  * - `--a2ui-card-margin`: Controls the margin.
1662
1569
  */
1663
1570
  class CardComponent extends BasicCatalogComponent {
1664
- /**
1665
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1666
- *
1667
- * Expected properties:
1668
- * - `child`: The component ID to render inside the card.
1669
- */
1670
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1671
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1672
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1673
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1674
1571
  child = computed$1(() => this.props()['child']?.value(), ...(ngDevMode ? [{ debugName: "child" }] : /* istanbul ignore next */ []));
1675
1572
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CardComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1676
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: CardComponent, isStandalone: true, selector: "a2ui-v09-card", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1573
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: CardComponent, isStandalone: true, selector: "a2ui-v09-card", usesInheritance: true, ngImport: i0, template: `
1677
1574
  <div class="a2ui-card">
1678
1575
  @if (child()) {
1679
- <a2ui-v09-component-host
1680
- [componentKey]="child()!"
1681
- [surfaceId]="surfaceId()"
1682
- >
1576
+ <a2ui-v09-component-host [componentKey]="child()!" [surfaceId]="surfaceId()">
1683
1577
  </a2ui-v09-component-host>
1684
1578
  }
1685
1579
  </div>
1686
- `, isInline: true, styles: [".a2ui-card{padding:var(--a2ui-card-padding, var(--a2ui-spacing-m, 16px));border-radius:var(--a2ui-card-border-radius, var(--a2ui-border-radius, 8px));box-shadow:var(--a2ui-card-box-shadow, 0 2px 4px rgba(0,0,0,.1));background-color:var(--a2ui-card-background, var(--a2ui-color-surface, #fff));border:var(--a2ui-card-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc));margin:var(--a2ui-card-margin, var(--a2ui-spacing-m, 16px))}\n"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1580
+ `, isInline: true, styles: [".a2ui-card{padding:var(--a2ui-card-padding, var(--a2ui-spacing-m, 16px));border-radius:var(--a2ui-card-border-radius, var(--a2ui-border-radius, 8px));box-shadow:var(--a2ui-card-box-shadow, 0 2px 4px rgba(0, 0, 0, .1));background:var(--a2ui-card-background, var(--a2ui-color-surface, #fff));border:var( --a2ui-card-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc) );margin:var(--a2ui-card-margin, var(--a2ui-spacing-m, 16px))}\n"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1687
1581
  }
1688
1582
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CardComponent, decorators: [{
1689
1583
  type: Component,
1690
1584
  args: [{ selector: 'a2ui-v09-card', standalone: true, imports: [ComponentHostComponent], template: `
1691
1585
  <div class="a2ui-card">
1692
1586
  @if (child()) {
1693
- <a2ui-v09-component-host
1694
- [componentKey]="child()!"
1695
- [surfaceId]="surfaceId()"
1696
- >
1587
+ <a2ui-v09-component-host [componentKey]="child()!" [surfaceId]="surfaceId()">
1697
1588
  </a2ui-v09-component-host>
1698
1589
  }
1699
1590
  </div>
1700
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-card{padding:var(--a2ui-card-padding, var(--a2ui-spacing-m, 16px));border-radius:var(--a2ui-card-border-radius, var(--a2ui-border-radius, 8px));box-shadow:var(--a2ui-card-box-shadow, 0 2px 4px rgba(0,0,0,.1));background-color:var(--a2ui-card-background, var(--a2ui-color-surface, #fff));border:var(--a2ui-card-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc));margin:var(--a2ui-card-margin, var(--a2ui-spacing-m, 16px))}\n"] }]
1701
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1591
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-card{padding:var(--a2ui-card-padding, var(--a2ui-spacing-m, 16px));border-radius:var(--a2ui-card-border-radius, var(--a2ui-border-radius, 8px));box-shadow:var(--a2ui-card-box-shadow, 0 2px 4px rgba(0, 0, 0, .1));background:var(--a2ui-card-background, var(--a2ui-color-surface, #fff));border:var( --a2ui-card-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc) );margin:var(--a2ui-card-margin, var(--a2ui-spacing-m, 16px))}\n"] }]
1592
+ }] });
1702
1593
 
1703
1594
  /**
1704
1595
  * Copyright 2026 Google LLC
@@ -1730,33 +1621,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1730
1621
  * - `--a2ui-tabs-content-padding`: Controls the padding of the tab content.
1731
1622
  */
1732
1623
  class TabsComponent extends BasicCatalogComponent {
1733
- /**
1734
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1735
- *
1736
- * Expected properties:
1737
- * - `tabs`: A list of tab objects, each containing a `label` and `content` ID.
1738
- */
1739
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1740
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1741
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1742
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1743
1624
  activeTabIndex = signal(0, ...(ngDevMode ? [{ debugName: "activeTabIndex" }] : /* istanbul ignore next */ []));
1744
1625
  tabs = computed$1(() => this.props()['tabs']?.value() || [], ...(ngDevMode ? [{ debugName: "tabs" }] : /* istanbul ignore next */ []));
1745
1626
  activeTab = computed$1(() => this.tabs()[this.activeTabIndex()], ...(ngDevMode ? [{ debugName: "activeTab" }] : /* istanbul ignore next */ []));
1746
- normalizedActiveTabContent = computed$1(() => {
1747
- const content = this.activeTab()?.content;
1748
- if (!content)
1627
+ normalizedActiveTabChild = computed$1(() => {
1628
+ const child = this.activeTab()?.child;
1629
+ if (!child)
1749
1630
  return null;
1750
- if (typeof content === 'object' && content !== null && 'id' in content) {
1751
- return content;
1631
+ if (typeof child === 'object' && child !== null && 'id' in child) {
1632
+ return child;
1752
1633
  }
1753
- return { id: content, basePath: this.dataContextPath() };
1754
- }, ...(ngDevMode ? [{ debugName: "normalizedActiveTabContent" }] : /* istanbul ignore next */ []));
1634
+ return { id: child, basePath: this.dataContextPath() };
1635
+ }, ...(ngDevMode ? [{ debugName: "normalizedActiveTabChild" }] : /* istanbul ignore next */ []));
1755
1636
  setActiveTab(index) {
1756
1637
  this.activeTabIndex.set(index);
1757
1638
  }
1758
1639
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TabsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1759
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: TabsComponent, isStandalone: true, selector: "a2ui-v09-tabs", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1640
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: TabsComponent, isStandalone: true, selector: "a2ui-v09-tabs", usesInheritance: true, ngImport: i0, template: `
1760
1641
  <div class="a2ui-tabs">
1761
1642
  <div class="a2ui-tab-bar">
1762
1643
  @for (tab of tabs(); track tab; let i = $index) {
@@ -1765,14 +1646,14 @@ class TabsComponent extends BasicCatalogComponent {
1765
1646
  [class.active]="activeTabIndex() === i"
1766
1647
  (click)="setActiveTab(i)"
1767
1648
  >
1768
- {{ tab.label }}
1649
+ {{ tab.title }}
1769
1650
  </button>
1770
1651
  }
1771
1652
  </div>
1772
- @if (normalizedActiveTabContent()) {
1653
+ @if (normalizedActiveTabChild()) {
1773
1654
  <div class="a2ui-tab-content">
1774
1655
  <a2ui-v09-component-host
1775
- [componentKey]="normalizedActiveTabContent()!"
1656
+ [componentKey]="normalizedActiveTabChild()!"
1776
1657
  [surfaceId]="surfaceId()"
1777
1658
  >
1778
1659
  </a2ui-v09-component-host>
@@ -1792,14 +1673,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1792
1673
  [class.active]="activeTabIndex() === i"
1793
1674
  (click)="setActiveTab(i)"
1794
1675
  >
1795
- {{ tab.label }}
1676
+ {{ tab.title }}
1796
1677
  </button>
1797
1678
  }
1798
1679
  </div>
1799
- @if (normalizedActiveTabContent()) {
1680
+ @if (normalizedActiveTabChild()) {
1800
1681
  <div class="a2ui-tab-content">
1801
1682
  <a2ui-v09-component-host
1802
- [componentKey]="normalizedActiveTabContent()!"
1683
+ [componentKey]="normalizedActiveTabChild()!"
1803
1684
  [surfaceId]="surfaceId()"
1804
1685
  >
1805
1686
  </a2ui-v09-component-host>
@@ -1807,7 +1688,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1807
1688
  }
1808
1689
  </div>
1809
1690
  `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-tabs{display:flex;flex-direction:column;width:100%}.a2ui-tab-bar{display:flex;border-bottom:var(--a2ui-tabs-border, 2px solid var(--a2ui-color-border, #eee));gap:var(--a2ui-spacing-m, 16px)}.a2ui-tab-button{padding:var(--a2ui-spacing-s, 8px) var(--a2ui-spacing-m, 16px);border:none;background:var(--a2ui-tabs-header-background, transparent);cursor:pointer;font-weight:500;color:var(--a2ui-tabs-header-color, var(--a2ui-text-caption-color, #666));border-bottom:2px solid transparent;margin-bottom:-2px}.a2ui-tab-button.active{background:var(--a2ui-tabs-header-background-active, transparent);color:var(--a2ui-tabs-header-color-active, var(--a2ui-color-primary, #007bff));border-bottom:2px solid var(--a2ui-color-primary, #007bff)}.a2ui-tab-content{padding:var(--a2ui-tabs-content-padding, var(--a2ui-spacing-m, 16px) 0)}\n"] }]
1810
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1691
+ }] });
1811
1692
 
1812
1693
  /**
1813
1694
  * Copyright 2026 Google LLC
@@ -1837,17 +1718,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1837
1718
  * - `--a2ui-modal-backdrop-bg`: Controls the background of the backdrop.
1838
1719
  */
1839
1720
  class ModalComponent extends BasicCatalogComponent {
1840
- /**
1841
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1842
- *
1843
- * Expected properties:
1844
- * - `trigger`: The ID of the component that opens the modal.
1845
- * - `content`: The ID of the component to display inside the modal.
1846
- */
1847
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1848
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1849
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1850
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1851
1721
  isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
1852
1722
  trigger = computed$1(() => this.props()['trigger']?.value(), ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
1853
1723
  content = computed$1(() => this.props()['content']?.value(), ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
@@ -1858,14 +1728,11 @@ class ModalComponent extends BasicCatalogComponent {
1858
1728
  this.isOpen.set(false);
1859
1729
  }
1860
1730
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ModalComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1861
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ModalComponent, isStandalone: true, selector: "a2ui-v09-modal", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1731
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ModalComponent, isStandalone: true, selector: "a2ui-v09-modal", usesInheritance: true, ngImport: i0, template: `
1862
1732
  <div class="a2ui-modal-wrapper">
1863
1733
  <div (click)="openModal()" class="a2ui-modal-trigger">
1864
1734
  @if (trigger()) {
1865
- <a2ui-v09-component-host
1866
- [componentKey]="trigger()!"
1867
- [surfaceId]="surfaceId()"
1868
- >
1735
+ <a2ui-v09-component-host [componentKey]="trigger()!" [surfaceId]="surfaceId()">
1869
1736
  </a2ui-v09-component-host>
1870
1737
  }
1871
1738
  </div>
@@ -1875,10 +1742,7 @@ class ModalComponent extends BasicCatalogComponent {
1875
1742
  <div class="a2ui-modal-content" (click)="$event.stopPropagation()">
1876
1743
  <button class="a2ui-modal-close" (click)="closeModal()">&times;</button>
1877
1744
  @if (content()) {
1878
- <a2ui-v09-component-host
1879
- [componentKey]="content()!"
1880
- [surfaceId]="surfaceId()"
1881
- >
1745
+ <a2ui-v09-component-host [componentKey]="content()!" [surfaceId]="surfaceId()">
1882
1746
  </a2ui-v09-component-host>
1883
1747
  }
1884
1748
  </div>
@@ -1893,10 +1757,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1893
1757
  <div class="a2ui-modal-wrapper">
1894
1758
  <div (click)="openModal()" class="a2ui-modal-trigger">
1895
1759
  @if (trigger()) {
1896
- <a2ui-v09-component-host
1897
- [componentKey]="trigger()!"
1898
- [surfaceId]="surfaceId()"
1899
- >
1760
+ <a2ui-v09-component-host [componentKey]="trigger()!" [surfaceId]="surfaceId()">
1900
1761
  </a2ui-v09-component-host>
1901
1762
  }
1902
1763
  </div>
@@ -1906,10 +1767,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1906
1767
  <div class="a2ui-modal-content" (click)="$event.stopPropagation()">
1907
1768
  <button class="a2ui-modal-close" (click)="closeModal()">&times;</button>
1908
1769
  @if (content()) {
1909
- <a2ui-v09-component-host
1910
- [componentKey]="content()!"
1911
- [surfaceId]="surfaceId()"
1912
- >
1770
+ <a2ui-v09-component-host [componentKey]="content()!" [surfaceId]="surfaceId()">
1913
1771
  </a2ui-v09-component-host>
1914
1772
  }
1915
1773
  </div>
@@ -1917,7 +1775,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1917
1775
  }
1918
1776
  </div>
1919
1777
  `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-modal-wrapper{display:inline-block}.a2ui-modal-trigger{cursor:pointer}.a2ui-modal-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background:var(--a2ui-modal-backdrop-bg, rgba(0, 0, 0, .5));display:flex;justify-content:center;align-items:center;z-index:1000}.a2ui-modal-content{background:var(--a2ui-modal-background, var(--a2ui-color-surface, white));padding:var(--a2ui-modal-padding, var(--a2ui-spacing-xl, 32px));border-radius:var(--a2ui-modal-border-radius, var(--a2ui-border-radius, 8px));position:relative;min-width:300px;max-width:80%;max-height:80%;overflow-y:auto;box-shadow:var(--a2ui-modal-box-shadow, 0 10px 25px rgba(0, 0, 0, .2))}.a2ui-modal-close{position:absolute;top:10px;right:15px;border:none;background:none;font-size:24px;cursor:pointer;color:var(--a2ui-text-caption-color, #999)}.a2ui-modal-close:hover{color:var(--a2ui-text-color, #333)}\n"] }]
1920
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1778
+ }] });
1921
1779
 
1922
1780
  /**
1923
1781
  * Copyright 2026 Google LLC
@@ -1944,25 +1802,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1944
1802
  * - `--a2ui-divider-spacing`: Controls the margin around the divider.
1945
1803
  */
1946
1804
  class DividerComponent extends BasicCatalogComponent {
1947
- /**
1948
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
1949
- *
1950
- * Expected properties:
1951
- * - `axis`: The orientation of the divider ('horizontal' (default) or 'vertical').
1952
- */
1953
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
1954
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
1955
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1956
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1957
1805
  axis = computed$1(() => this.props()['axis']?.value() ?? 'horizontal', ...(ngDevMode ? [{ debugName: "axis" }] : /* istanbul ignore next */ []));
1958
1806
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DividerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1959
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: DividerComponent, isStandalone: true, selector: "a2ui-v09-divider", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "\"block\"", "style.width": "axis() === \"horizontal\" ? \"100%\" : \"auto\"" } }, usesInheritance: true, ngImport: i0, template: `
1807
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: DividerComponent, isStandalone: true, selector: "a2ui-v09-divider", host: { properties: { "style.display": "\"block\"", "style.width": "axis() === \"horizontal\" ? \"100%\" : \"auto\"" } }, usesInheritance: true, ngImport: i0, template: `
1960
1808
  <hr
1961
1809
  class="a2ui-divider"
1962
1810
  [class.horizontal]="axis() === 'horizontal'"
1963
1811
  [class.vertical]="axis() === 'vertical'"
1964
1812
  />
1965
- `, isInline: true, styles: [".a2ui-divider{border:0;border-top:var(--a2ui-divider-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc));margin:var(--a2ui-divider-spacing, var(--a2ui-spacing-m, 16px)) 0;width:100%}.a2ui-divider.vertical{width:var(--a2ui-border-width, 1px);height:100%;margin:0 var(--a2ui-divider-spacing, var(--a2ui-spacing-m, 16px));border-top:0;border-left:var(--a2ui-divider-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1813
+ `, isInline: true, styles: [".a2ui-divider{border:0;border-top:var( --a2ui-divider-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc) );margin:var(--a2ui-divider-spacing, var(--a2ui-spacing-m, 16px)) 0;width:100%}.a2ui-divider.vertical{width:var(--a2ui-border-width, 1px);height:100%;margin:0 var(--a2ui-divider-spacing, var(--a2ui-spacing-m, 16px));border-top:0;border-left:var( --a2ui-divider-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc) )}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1966
1814
  }
1967
1815
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DividerComponent, decorators: [{
1968
1816
  type: Component,
@@ -1975,8 +1823,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1975
1823
  [class.horizontal]="axis() === 'horizontal'"
1976
1824
  [class.vertical]="axis() === 'vertical'"
1977
1825
  />
1978
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-divider{border:0;border-top:var(--a2ui-divider-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc));margin:var(--a2ui-divider-spacing, var(--a2ui-spacing-m, 16px)) 0;width:100%}.a2ui-divider.vertical{width:var(--a2ui-border-width, 1px);height:100%;margin:0 var(--a2ui-divider-spacing, var(--a2ui-spacing-m, 16px));border-top:0;border-left:var(--a2ui-divider-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc))}\n"] }]
1979
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1826
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-divider{border:0;border-top:var( --a2ui-divider-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc) );margin:var(--a2ui-divider-spacing, var(--a2ui-spacing-m, 16px)) 0;width:100%}.a2ui-divider.vertical{width:var(--a2ui-border-width, 1px);height:100%;margin:0 var(--a2ui-divider-spacing, var(--a2ui-spacing-m, 16px));border-top:0;border-left:var( --a2ui-divider-border, var(--a2ui-border-width, 1px) solid var(--a2ui-color-border, #ccc) )}\n"] }]
1827
+ }] });
1980
1828
 
1981
1829
  /**
1982
1830
  * Copyright 2026 Google LLC
@@ -2011,17 +1859,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2011
1859
  * - `--a2ui-checkbox-color-error`: Controls the color for error states.
2012
1860
  */
2013
1861
  class CheckBoxComponent extends BasicCatalogComponent {
2014
- /**
2015
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
2016
- *
2017
- * Expected properties:
2018
- * - `label`: The text to display next to the checkbox.
2019
- * - `value`: Boolean indicating whether the checkbox is checked.
2020
- */
2021
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
2022
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
2023
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
2024
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
2025
1862
  value = computed$1(() => this.props()['value']?.value() === true, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2026
1863
  label = computed$1(() => this.props()['label']?.value(), ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2027
1864
  handleChange(event) {
@@ -2029,7 +1866,7 @@ class CheckBoxComponent extends BasicCatalogComponent {
2029
1866
  this.props()['value']?.onUpdate(checked);
2030
1867
  }
2031
1868
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CheckBoxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2032
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: CheckBoxComponent, isStandalone: true, selector: "a2ui-v09-check-box", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1869
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: CheckBoxComponent, isStandalone: true, selector: "a2ui-v09-check-box", usesInheritance: true, ngImport: i0, template: `
2033
1870
  <label class="a2ui-check-box-label">
2034
1871
  <input
2035
1872
  type="checkbox"
@@ -2039,7 +1876,7 @@ class CheckBoxComponent extends BasicCatalogComponent {
2039
1876
  />
2040
1877
  <span class="a2ui-check-box-text">{{ label() }}</span>
2041
1878
  </label>
2042
- `, isInline: true, styles: [".a2ui-check-box-label{display:flex;align-items:center;gap:var(--a2ui-checkbox-gap, var(--a2ui-spacing-s, .5rem));cursor:pointer;padding:4px 0;margin:var(--a2ui-checkbox-margin, var(--a2ui-spacing-m, 16px));color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-check-box-input{width:var(--a2ui-checkbox-size, 1rem);height:var(--a2ui-checkbox-size, 1rem);cursor:pointer;background:var(--a2ui-checkbox-background, inherit);border:var(--a2ui-checkbox-border, var(--a2ui-border-width, 1px) solid #ccc);border-radius:var(--a2ui-checkbox-border-radius, 4px)}.a2ui-check-box-text{font-size:var(--a2ui-checkbox-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 16px)));font-weight:var(--a2ui-checkbox-label-font-weight, bold)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1879
+ `, isInline: true, styles: [".a2ui-check-box-label{display:flex;align-items:center;gap:var(--a2ui-checkbox-gap, var(--a2ui-spacing-s, .5rem));cursor:pointer;padding:4px 0;margin:var(--a2ui-checkbox-margin, var(--a2ui-spacing-m, 16px));color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-check-box-input{width:var(--a2ui-checkbox-size, 1rem);height:var(--a2ui-checkbox-size, 1rem);cursor:pointer;background:var(--a2ui-checkbox-background, inherit);border:var(--a2ui-checkbox-border, var(--a2ui-border-width, 1px) solid #ccc);border-radius:var(--a2ui-checkbox-border-radius, 4px);accent-color:var(--a2ui-color-primary)}.a2ui-check-box-text{font-size:var( --a2ui-checkbox-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 16px)) );font-weight:var(--a2ui-checkbox-label-font-weight, bold)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2043
1880
  }
2044
1881
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CheckBoxComponent, decorators: [{
2045
1882
  type: Component,
@@ -2053,8 +1890,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2053
1890
  />
2054
1891
  <span class="a2ui-check-box-text">{{ label() }}</span>
2055
1892
  </label>
2056
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-check-box-label{display:flex;align-items:center;gap:var(--a2ui-checkbox-gap, var(--a2ui-spacing-s, .5rem));cursor:pointer;padding:4px 0;margin:var(--a2ui-checkbox-margin, var(--a2ui-spacing-m, 16px));color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-check-box-input{width:var(--a2ui-checkbox-size, 1rem);height:var(--a2ui-checkbox-size, 1rem);cursor:pointer;background:var(--a2ui-checkbox-background, inherit);border:var(--a2ui-checkbox-border, var(--a2ui-border-width, 1px) solid #ccc);border-radius:var(--a2ui-checkbox-border-radius, 4px)}.a2ui-check-box-text{font-size:var(--a2ui-checkbox-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 16px)));font-weight:var(--a2ui-checkbox-label-font-weight, bold)}\n"] }]
2057
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
1893
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-check-box-label{display:flex;align-items:center;gap:var(--a2ui-checkbox-gap, var(--a2ui-spacing-s, .5rem));cursor:pointer;padding:4px 0;margin:var(--a2ui-checkbox-margin, var(--a2ui-spacing-m, 16px));color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-check-box-input{width:var(--a2ui-checkbox-size, 1rem);height:var(--a2ui-checkbox-size, 1rem);cursor:pointer;background:var(--a2ui-checkbox-background, inherit);border:var(--a2ui-checkbox-border, var(--a2ui-border-width, 1px) solid #ccc);border-radius:var(--a2ui-checkbox-border-radius, 4px);accent-color:var(--a2ui-color-primary)}.a2ui-check-box-text{font-size:var( --a2ui-checkbox-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 16px)) );font-weight:var(--a2ui-checkbox-label-font-weight, bold)}\n"] }]
1894
+ }] });
2058
1895
 
2059
1896
  /**
2060
1897
  * Copyright 2026 Google LLC
@@ -2088,21 +1925,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2088
1925
  * - `--a2ui-choicepicker-chip-background-selected`: Controls background of selected chips.
2089
1926
  */
2090
1927
  class ChoicePickerComponent extends BasicCatalogComponent {
2091
- /**
2092
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
2093
- *
2094
- * Expected properties:
2095
- * - `value`: The currently selected value(s).
2096
- * - `choices` or `options`: List of choice objects (label and value).
2097
- * - `displayStyle`: How to render the choices ('default' or 'chips').
2098
- * - `variant`: Selection mode ('singleSelection' or 'multipleSelection').
2099
- */
2100
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
2101
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
2102
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
2103
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
2104
1928
  displayStyle = computed$1(() => this.props()['displayStyle']?.value(), ...(ngDevMode ? [{ debugName: "displayStyle" }] : /* istanbul ignore next */ []));
2105
- choices = computed$1(() => this.props()['choices']?.value() || this.props()['options']?.value() || [], ...(ngDevMode ? [{ debugName: "choices" }] : /* istanbul ignore next */ []));
1929
+ options = computed$1(() => this.props()['options']?.value() || [], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
2106
1930
  variant = computed$1(() => this.props()['variant']?.value(), ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2107
1931
  selectedValue = computed$1(() => this.props()['value']?.value(), ...(ngDevMode ? [{ debugName: "selectedValue" }] : /* istanbul ignore next */ []));
2108
1932
  isMultiple() {
@@ -2138,46 +1962,46 @@ class ChoicePickerComponent extends BasicCatalogComponent {
2138
1962
  }
2139
1963
  else {
2140
1964
  if (active) {
2141
- this.props()['value']?.onUpdate(value);
1965
+ this.props()['value']?.onUpdate([value]);
2142
1966
  }
2143
1967
  }
2144
1968
  }
2145
1969
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ChoicePickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2146
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ChoicePickerComponent, isStandalone: true, selector: "a2ui-v09-choice-picker", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
1970
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: ChoicePickerComponent, isStandalone: true, selector: "a2ui-v09-choice-picker", usesInheritance: true, ngImport: i0, template: `
2147
1971
  <div class="a2ui-choice-picker">
2148
1972
  <!-- Chips Variant -->
2149
1973
  @if (displayStyle() === 'chips') {
2150
1974
  <div class="a2ui-chips-group">
2151
- @for (choice of choices(); track choice.value) {
1975
+ @for (option of options(); track option.value) {
2152
1976
  <button
2153
1977
  class="a2ui-chip"
2154
- [class.active]="isSelected(choice.value)"
2155
- (click)="toggleActive(choice.value)"
1978
+ [class.active]="isSelected(option.value)"
1979
+ (click)="toggleActive(option.value)"
2156
1980
  >
2157
- {{ choice.label }}
1981
+ {{ option.label }}
2158
1982
  </button>
2159
1983
  }
2160
1984
  </div>
2161
1985
  } @else {
2162
1986
  <!-- Checkbox/Radio Variant -->
2163
1987
  <div class="a2ui-options-group">
2164
- @for (choice of choices(); track choice.value) {
1988
+ @for (option of options(); track option.value) {
2165
1989
  <label class="a2ui-option-label">
2166
1990
  <input
2167
1991
  [type]="isMultiple() ? 'checkbox' : 'radio'"
2168
1992
  [name]="componentId()"
2169
- [value]="choice.value"
2170
- [checked]="isSelected(choice.value)"
2171
- (change)="onCheckChange(choice.value, $event)"
1993
+ [value]="option.value"
1994
+ [checked]="isSelected(option.value)"
1995
+ (change)="onCheckChange(option.value, $event)"
2172
1996
  class="a2ui-option-input"
2173
1997
  />
2174
- <span class="a2ui-option-text">{{ choice.label }}</span>
1998
+ <span class="a2ui-option-text">{{ option.label }}</span>
2175
1999
  </label>
2176
2000
  }
2177
2001
  </div>
2178
2002
  }
2179
2003
  </div>
2180
- `, isInline: true, styles: [".a2ui-choice-picker{width:100%;padding:var(--a2ui-choicepicker-padding, 0)}.a2ui-options-group{display:flex;flex-direction:column;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem))}.a2ui-option-label{display:flex;align-items:center;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem));cursor:pointer;color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-option-input{width:var(--a2ui-choicepicker-checkbox-size, 1rem);height:var(--a2ui-choicepicker-checkbox-size, 1rem)}.a2ui-chips-group{display:flex;flex-wrap:wrap;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem))}.a2ui-chip{padding:var(--a2ui-choicepicker-chip-padding, var(--a2ui-spacing-s, .5rem) var(--a2ui-spacing-m, 1rem));border-radius:var(--a2ui-choicepicker-chip-border-radius, 100px);border:var(--a2ui-choicepicker-chip-border, 1px solid var(--a2ui-color-border, #ccc));background:var(--a2ui-choicepicker-chip-background, var(--a2ui-color-surface, #fff));cursor:pointer;transition:all .2s}.a2ui-chip.active{background-color:var(--a2ui-choicepicker-chip-background-selected, var(--a2ui-color-primary, #17e));color:var(--a2ui-color-on-primary, #fff);border-color:var(--a2ui-choicepicker-chip-background-selected, var(--a2ui-color-primary, #17e))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2004
+ `, isInline: true, styles: [".a2ui-choice-picker{width:100%;padding:var(--a2ui-choicepicker-padding, 0)}.a2ui-options-group{display:flex;flex-direction:column;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem))}.a2ui-option-label{display:flex;align-items:center;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem));cursor:pointer;color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-option-input{width:var(--a2ui-choicepicker-checkbox-size, 1rem);height:var(--a2ui-choicepicker-checkbox-size, 1rem)}.a2ui-chips-group{display:flex;flex-wrap:wrap;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem))}.a2ui-chip{padding:var( --a2ui-choicepicker-chip-padding, var(--a2ui-spacing-s, .5rem) var(--a2ui-spacing-m, 1rem) );border-radius:var(--a2ui-choicepicker-chip-border-radius, 100px);border:var(--a2ui-choicepicker-chip-border, 1px solid var(--a2ui-color-border, #ccc));background:var(--a2ui-choicepicker-chip-background, var(--a2ui-color-surface, #fff));cursor:pointer;transition:all .2s}.a2ui-chip.active{background-color:var( --a2ui-choicepicker-chip-background-selected, var(--a2ui-color-primary, #17e) );color:var(--a2ui-color-on-primary, #fff);border-color:var( --a2ui-choicepicker-chip-background-selected, var(--a2ui-color-primary, #17e) )}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2181
2005
  }
2182
2006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ChoicePickerComponent, decorators: [{
2183
2007
  type: Component,
@@ -2186,37 +2010,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2186
2010
  <!-- Chips Variant -->
2187
2011
  @if (displayStyle() === 'chips') {
2188
2012
  <div class="a2ui-chips-group">
2189
- @for (choice of choices(); track choice.value) {
2013
+ @for (option of options(); track option.value) {
2190
2014
  <button
2191
2015
  class="a2ui-chip"
2192
- [class.active]="isSelected(choice.value)"
2193
- (click)="toggleActive(choice.value)"
2016
+ [class.active]="isSelected(option.value)"
2017
+ (click)="toggleActive(option.value)"
2194
2018
  >
2195
- {{ choice.label }}
2019
+ {{ option.label }}
2196
2020
  </button>
2197
2021
  }
2198
2022
  </div>
2199
2023
  } @else {
2200
2024
  <!-- Checkbox/Radio Variant -->
2201
2025
  <div class="a2ui-options-group">
2202
- @for (choice of choices(); track choice.value) {
2026
+ @for (option of options(); track option.value) {
2203
2027
  <label class="a2ui-option-label">
2204
2028
  <input
2205
2029
  [type]="isMultiple() ? 'checkbox' : 'radio'"
2206
2030
  [name]="componentId()"
2207
- [value]="choice.value"
2208
- [checked]="isSelected(choice.value)"
2209
- (change)="onCheckChange(choice.value, $event)"
2031
+ [value]="option.value"
2032
+ [checked]="isSelected(option.value)"
2033
+ (change)="onCheckChange(option.value, $event)"
2210
2034
  class="a2ui-option-input"
2211
2035
  />
2212
- <span class="a2ui-option-text">{{ choice.label }}</span>
2036
+ <span class="a2ui-option-text">{{ option.label }}</span>
2213
2037
  </label>
2214
2038
  }
2215
2039
  </div>
2216
2040
  }
2217
2041
  </div>
2218
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-choice-picker{width:100%;padding:var(--a2ui-choicepicker-padding, 0)}.a2ui-options-group{display:flex;flex-direction:column;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem))}.a2ui-option-label{display:flex;align-items:center;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem));cursor:pointer;color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-option-input{width:var(--a2ui-choicepicker-checkbox-size, 1rem);height:var(--a2ui-choicepicker-checkbox-size, 1rem)}.a2ui-chips-group{display:flex;flex-wrap:wrap;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem))}.a2ui-chip{padding:var(--a2ui-choicepicker-chip-padding, var(--a2ui-spacing-s, .5rem) var(--a2ui-spacing-m, 1rem));border-radius:var(--a2ui-choicepicker-chip-border-radius, 100px);border:var(--a2ui-choicepicker-chip-border, 1px solid var(--a2ui-color-border, #ccc));background:var(--a2ui-choicepicker-chip-background, var(--a2ui-color-surface, #fff));cursor:pointer;transition:all .2s}.a2ui-chip.active{background-color:var(--a2ui-choicepicker-chip-background-selected, var(--a2ui-color-primary, #17e));color:var(--a2ui-color-on-primary, #fff);border-color:var(--a2ui-choicepicker-chip-background-selected, var(--a2ui-color-primary, #17e))}\n"] }]
2219
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
2042
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-choice-picker{width:100%;padding:var(--a2ui-choicepicker-padding, 0)}.a2ui-options-group{display:flex;flex-direction:column;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem))}.a2ui-option-label{display:flex;align-items:center;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem));cursor:pointer;color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-option-input{width:var(--a2ui-choicepicker-checkbox-size, 1rem);height:var(--a2ui-choicepicker-checkbox-size, 1rem)}.a2ui-chips-group{display:flex;flex-wrap:wrap;gap:var(--a2ui-choicepicker-gap, var(--a2ui-spacing-xs, .25rem))}.a2ui-chip{padding:var( --a2ui-choicepicker-chip-padding, var(--a2ui-spacing-s, .5rem) var(--a2ui-spacing-m, 1rem) );border-radius:var(--a2ui-choicepicker-chip-border-radius, 100px);border:var(--a2ui-choicepicker-chip-border, 1px solid var(--a2ui-color-border, #ccc));background:var(--a2ui-choicepicker-chip-background, var(--a2ui-color-surface, #fff));cursor:pointer;transition:all .2s}.a2ui-chip.active{background-color:var( --a2ui-choicepicker-chip-background-selected, var(--a2ui-color-primary, #17e) );color:var(--a2ui-color-on-primary, #fff);border-color:var( --a2ui-choicepicker-chip-background-selected, var(--a2ui-color-primary, #17e) )}\n"] }]
2043
+ }] });
2220
2044
 
2221
2045
  /**
2222
2046
  * Copyright 2026 Google LLC
@@ -2246,20 +2070,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2246
2070
  * - `--a2ui-slider-track-color`: Controls the background of the track.
2247
2071
  */
2248
2072
  class SliderComponent extends BasicCatalogComponent {
2249
- /**
2250
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
2251
- *
2252
- * Expected properties:
2253
- * - `value`: The current numeric value.
2254
- * - `label`: Label text to display.
2255
- * - `min`: Minimum value (default: 0).
2256
- * - `max`: Maximum value (default: 100).
2257
- * - `step`: Increment step (default: 1).
2258
- */
2259
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
2260
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
2261
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
2262
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
2263
2073
  label = computed$1(() => this.props()['label']?.value(), ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2264
2074
  value = computed$1(() => this.props()['value']?.value(), ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2265
2075
  min = computed$1(() => this.props()['min']?.value() ?? 0, ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
@@ -2270,7 +2080,7 @@ class SliderComponent extends BasicCatalogComponent {
2270
2080
  this.props()['value']?.onUpdate(val);
2271
2081
  }
2272
2082
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SliderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2273
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: SliderComponent, isStandalone: true, selector: "a2ui-v09-slider", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
2083
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: SliderComponent, isStandalone: true, selector: "a2ui-v09-slider", usesInheritance: true, ngImport: i0, template: `
2274
2084
  <div class="a2ui-slider-container">
2275
2085
  <div class="a2ui-slider-header">
2276
2086
  <span class="a2ui-slider-label">{{ label() }}</span>
@@ -2281,12 +2091,12 @@ class SliderComponent extends BasicCatalogComponent {
2281
2091
  [min]="min()"
2282
2092
  [max]="max()"
2283
2093
  [step]="step()"
2284
- [value]="value() ?? min()"
2094
+ [value]="value()"
2285
2095
  (input)="handleInput($event)"
2286
2096
  class="a2ui-slider"
2287
2097
  />
2288
2098
  </div>
2289
- `, isInline: true, styles: [".a2ui-slider-container{width:100%;display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);margin:var(--a2ui-slider-margin, var(--a2ui-spacing-m, 16px))}.a2ui-slider-header{display:flex;justify-content:space-between;font-size:var(--a2ui-slider-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)));font-weight:var(--a2ui-slider-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-slider{width:100%;cursor:pointer;accent-color:var(--a2ui-slider-thumb-color, var(--a2ui-color-primary, #007bff));background:var(--a2ui-slider-track-color, var(--a2ui-color-secondary, #e9ecef))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2099
+ `, isInline: true, styles: [".a2ui-slider-container{width:100%;display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);margin:var(--a2ui-slider-margin, var(--a2ui-spacing-m, 16px))}.a2ui-slider-header{display:flex;justify-content:space-between;font-size:var( --a2ui-slider-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)) );font-weight:var(--a2ui-slider-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-slider{width:100%;cursor:pointer;accent-color:var(--a2ui-slider-thumb-color, var(--a2ui-color-primary, #007bff));background:var(--a2ui-slider-track-color, var(--a2ui-color-secondary, #e9ecef))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2290
2100
  }
2291
2101
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SliderComponent, decorators: [{
2292
2102
  type: Component,
@@ -2301,13 +2111,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2301
2111
  [min]="min()"
2302
2112
  [max]="max()"
2303
2113
  [step]="step()"
2304
- [value]="value() ?? min()"
2114
+ [value]="value()"
2305
2115
  (input)="handleInput($event)"
2306
2116
  class="a2ui-slider"
2307
2117
  />
2308
2118
  </div>
2309
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-slider-container{width:100%;display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);margin:var(--a2ui-slider-margin, var(--a2ui-spacing-m, 16px))}.a2ui-slider-header{display:flex;justify-content:space-between;font-size:var(--a2ui-slider-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)));font-weight:var(--a2ui-slider-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-slider{width:100%;cursor:pointer;accent-color:var(--a2ui-slider-thumb-color, var(--a2ui-color-primary, #007bff));background:var(--a2ui-slider-track-color, var(--a2ui-color-secondary, #e9ecef))}\n"] }]
2310
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
2119
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-slider-container{width:100%;display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);margin:var(--a2ui-slider-margin, var(--a2ui-spacing-m, 16px))}.a2ui-slider-header{display:flex;justify-content:space-between;font-size:var( --a2ui-slider-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)) );font-weight:var(--a2ui-slider-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-slider{width:100%;cursor:pointer;accent-color:var(--a2ui-slider-thumb-color, var(--a2ui-color-primary, #007bff));background:var(--a2ui-slider-track-color, var(--a2ui-color-secondary, #e9ecef))}\n"] }]
2120
+ }] });
2311
2121
 
2312
2122
  /**
2313
2123
  * Copyright 2026 Google LLC
@@ -2340,19 +2150,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2340
2150
  * - `--a2ui-datetimeinput-label-font-weight`: Controls the font weight of the label.
2341
2151
  */
2342
2152
  class DateTimeInputComponent extends BasicCatalogComponent {
2343
- /**
2344
- * Reactive properties resolved from the A2UI {@link ComponentModel}.
2345
- *
2346
- * Expected properties:
2347
- * - `value`: The current ISO date/time string.
2348
- * - `label`: Optional label text.
2349
- * - `enableDate`: Whether to show the date picker (default: true).
2350
- * - `enableTime`: Whether to show the time picker (default: false).
2351
- */
2352
- props = input({}, ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
2353
- surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
2354
- componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
2355
- dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
2356
2153
  label = computed$1(() => this.props()['label']?.value(), ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2357
2154
  enableDate = computed$1(() => this.props()['enableDate']?.value() ?? true, ...(ngDevMode ? [{ debugName: "enableDate" }] : /* istanbul ignore next */ []));
2358
2155
  enableTime = computed$1(() => this.props()['enableTime']?.value() ?? false, ...(ngDevMode ? [{ debugName: "enableTime" }] : /* istanbul ignore next */ []));
@@ -2389,7 +2186,7 @@ class DateTimeInputComponent extends BasicCatalogComponent {
2389
2186
  this.props()['value']?.onUpdate(`${date}T${time}:00`);
2390
2187
  }
2391
2188
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DateTimeInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2392
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: DateTimeInputComponent, isStandalone: true, selector: "a2ui-v09-date-time-input", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: true, transformFunction: null }, componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, dataContextPath: { classPropertyName: "dataContextPath", publicName: "dataContextPath", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
2189
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: DateTimeInputComponent, isStandalone: true, selector: "a2ui-v09-date-time-input", usesInheritance: true, ngImport: i0, template: `
2393
2190
  <div class="a2ui-date-time-container">
2394
2191
  @if (label()) {
2395
2192
  <label class="a2ui-date-time-label">
@@ -2415,7 +2212,7 @@ class DateTimeInputComponent extends BasicCatalogComponent {
2415
2212
  }
2416
2213
  </div>
2417
2214
  </div>
2418
- `, isInline: true, styles: [".a2ui-date-time-container{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);width:100%}.a2ui-date-time-label{font-size:var(--a2ui-datetimeinput-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)));font-weight:var(--a2ui-datetimeinput-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-date-time-inputs{display:flex;gap:var(--a2ui-spacing-s, 8px);width:100%}.a2ui-date-time-input{padding:var(--a2ui-datetimeinput-padding, 8px);border-radius:var(--a2ui-datetimeinput-border-radius, 4px);border:var(--a2ui-datetimeinput-border, 1px solid var(--a2ui-color-border, #ccc));background-color:var(--a2ui-datetimeinput-background, var(--a2ui-color-input, #fff));color:var(--a2ui-datetimeinput-color, var(--a2ui-color-on-input, #333));font-family:inherit;flex:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2215
+ `, isInline: true, styles: [".a2ui-date-time-container{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);width:100%}.a2ui-date-time-label{font-size:var( --a2ui-datetimeinput-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)) );font-weight:var(--a2ui-datetimeinput-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-date-time-inputs{display:flex;gap:var(--a2ui-spacing-s, 8px);width:100%}.a2ui-date-time-input{padding:var(--a2ui-datetimeinput-padding, 8px);border-radius:var(--a2ui-datetimeinput-border-radius, 4px);border:var(--a2ui-datetimeinput-border, 1px solid var(--a2ui-color-border, #ccc));background-color:var(--a2ui-datetimeinput-background, var(--a2ui-color-input, #fff));color:var(--a2ui-datetimeinput-color, var(--a2ui-color-on-input, #333));font-family:inherit;flex:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2419
2216
  }
2420
2217
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DateTimeInputComponent, decorators: [{
2421
2218
  type: Component,
@@ -2445,8 +2242,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2445
2242
  }
2446
2243
  </div>
2447
2244
  </div>
2448
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-date-time-container{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);width:100%}.a2ui-date-time-label{font-size:var(--a2ui-datetimeinput-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)));font-weight:var(--a2ui-datetimeinput-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-date-time-inputs{display:flex;gap:var(--a2ui-spacing-s, 8px);width:100%}.a2ui-date-time-input{padding:var(--a2ui-datetimeinput-padding, 8px);border-radius:var(--a2ui-datetimeinput-border-radius, 4px);border:var(--a2ui-datetimeinput-border, 1px solid var(--a2ui-color-border, #ccc));background-color:var(--a2ui-datetimeinput-background, var(--a2ui-color-input, #fff));color:var(--a2ui-datetimeinput-color, var(--a2ui-color-on-input, #333));font-family:inherit;flex:1}\n"] }]
2449
- }], propDecorators: { props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: true }] }], componentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "componentId", required: false }] }], dataContextPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataContextPath", required: false }] }] } });
2245
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-date-time-container{display:flex;flex-direction:column;gap:var(--a2ui-spacing-xs, 4px);width:100%}.a2ui-date-time-label{font-size:var( --a2ui-datetimeinput-label-font-size, var(--a2ui-label-font-size, var(--a2ui-font-size-s, 14px)) );font-weight:var(--a2ui-datetimeinput-label-font-weight, bold);color:var(--a2ui-text-color-text, var(--a2ui-color-on-background, #333))}.a2ui-date-time-inputs{display:flex;gap:var(--a2ui-spacing-s, 8px);width:100%}.a2ui-date-time-input{padding:var(--a2ui-datetimeinput-padding, 8px);border-radius:var(--a2ui-datetimeinput-border-radius, 4px);border:var(--a2ui-datetimeinput-border, 1px solid var(--a2ui-color-border, #ccc));background-color:var(--a2ui-datetimeinput-background, var(--a2ui-color-input, #fff));color:var(--a2ui-datetimeinput-color, var(--a2ui-color-on-input, #333));font-family:inherit;flex:1}\n"] }]
2246
+ }] });
2450
2247
 
2451
2248
  /**
2452
2249
  * Copyright 2026 Google LLC
@@ -2465,26 +2262,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2465
2262
  */
2466
2263
  /**
2467
2264
  * The set of default Angular implementations for each component in the basic catalog.
2265
+ * Using string literals as keys, to survive property renaming, as these names need to match the JSON payload.
2468
2266
  */
2267
+ // Ignore Prettier to preserve quoted keys, needed to survive property renaming.
2268
+ // prettier-ignore
2469
2269
  const DEFAULT_COMPONENT_IMPLEMENTATIONS = {
2470
- text: { ...TextApi, component: TextComponent },
2471
- row: { ...RowApi, component: RowComponent },
2472
- column: { ...ColumnApi, component: ColumnComponent },
2473
- button: { ...ButtonApi, component: ButtonComponent },
2474
- textField: { ...TextFieldApi, component: TextFieldComponent },
2475
- image: { ...ImageApi, component: ImageComponent },
2476
- icon: { ...IconApi, component: IconComponent },
2477
- video: { ...VideoApi, component: VideoComponent },
2478
- audioPlayer: { ...AudioPlayerApi, component: AudioPlayerComponent },
2479
- list: { ...ListApi, component: ListComponent },
2480
- card: { ...CardApi, component: CardComponent },
2481
- tabs: { ...TabsApi, component: TabsComponent },
2482
- modal: { ...ModalApi, component: ModalComponent },
2483
- divider: { ...DividerApi, component: DividerComponent },
2484
- checkBox: { ...CheckBoxApi, component: CheckBoxComponent },
2485
- choicePicker: { ...ChoicePickerApi, component: ChoicePickerComponent },
2486
- slider: { ...SliderApi, component: SliderComponent },
2487
- dateTimeInput: { ...DateTimeInputApi, component: DateTimeInputComponent },
2270
+ 'text': { ...TextApi, component: TextComponent },
2271
+ 'row': { ...RowApi, component: RowComponent },
2272
+ 'column': { ...ColumnApi, component: ColumnComponent },
2273
+ 'button': { ...ButtonApi, component: ButtonComponent },
2274
+ 'textField': { ...TextFieldApi, component: TextFieldComponent },
2275
+ 'image': { ...ImageApi, component: ImageComponent },
2276
+ 'icon': { ...IconApi, component: IconComponent },
2277
+ 'video': { ...VideoApi, component: VideoComponent },
2278
+ 'audioPlayer': { ...AudioPlayerApi, component: AudioPlayerComponent },
2279
+ 'list': { ...ListApi, component: ListComponent },
2280
+ 'card': { ...CardApi, component: CardComponent },
2281
+ 'tabs': { ...TabsApi, component: TabsComponent },
2282
+ 'modal': { ...ModalApi, component: ModalComponent },
2283
+ 'divider': { ...DividerApi, component: DividerComponent },
2284
+ 'checkBox': { ...CheckBoxApi, component: CheckBoxComponent },
2285
+ 'choicePicker': { ...ChoicePickerApi, component: ChoicePickerComponent },
2286
+ 'slider': { ...SliderApi, component: SliderComponent },
2287
+ 'dateTimeInput': { ...DateTimeInputApi, component: DateTimeInputComponent },
2488
2288
  };
2489
2289
  /**
2490
2290
  * The set of Angular UI components provided by the basic catalog.
@@ -2558,5 +2358,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2558
2358
  * Generated bundle index. Do not edit.
2559
2359
  */
2560
2360
 
2561
- export { A2UI_RENDERER_CONFIG, A2uiRendererService, AngularCatalog, AudioPlayerComponent, BASIC_COMPONENTS, BasicCatalog, BasicCatalogBase, ButtonComponent, CardComponent, CheckBoxComponent, ChoicePickerComponent, ColumnComponent, ComponentBinder, ComponentHostComponent, DateTimeInputComponent, DefaultMarkdownRenderer, DividerComponent, IconComponent, ImageComponent, ListComponent, MarkdownRenderer, ModalComponent, RowComponent, SliderComponent, SurfaceComponent, TabsComponent, TextComponent, TextFieldComponent, VideoComponent, getNormalizedPath, provideMarkdownRenderer, toAngularSignal };
2361
+ export { A2UI_RENDERER_CONFIG, A2uiRendererService, AngularCatalog, AudioPlayerComponent, BASIC_COMPONENTS, BasicCatalog, BasicCatalogBase, ButtonComponent, CardComponent, CatalogComponent, CheckBoxComponent, ChoicePickerComponent, ColumnComponent, ComponentBinder, ComponentHostComponent, DateTimeInputComponent, DefaultMarkdownRenderer, DividerComponent, IconComponent, ImageComponent, ListComponent, MarkdownRenderer, ModalComponent, RowComponent, SliderComponent, SurfaceComponent, TabsComponent, TextComponent, TextFieldComponent, VideoComponent, getNormalizedPath, provideMarkdownRenderer, toAngularSignal };
2562
2362
  //# sourceMappingURL=a2ui-angular-src-v0_9.mjs.map