@a2ui/angular 0.9.0-alpha.0 → 0.9.0-alpha.1

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.
@@ -3,7 +3,7 @@ import { InjectionToken, Inject, Injectable, signal, inject, DestroyRef, NgZone,
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';
6
- import { DateTimeInputApi, SliderApi, ChoicePickerApi, CheckBoxApi, DividerApi, ModalApi, TabsApi, CardApi, ListApi, AudioPlayerApi, VideoApi, IconApi, ImageApi, TextFieldApi, ButtonApi, ColumnApi, RowApi, TextApi, BASIC_FUNCTIONS } from '@a2ui/web_core/v0_9/basic_catalog';
6
+ import { injectBasicCatalogStyles, DateTimeInputApi, SliderApi, ChoicePickerApi, CheckBoxApi, DividerApi, ModalApi, TabsApi, CardApi, ListApi, AudioPlayerApi, VideoApi, IconApi, ImageApi, TextFieldApi, ButtonApi, ColumnApi, RowApi, TextApi, BASIC_FUNCTIONS } from '@a2ui/web_core/v0_9/basic_catalog';
7
7
  export { BASIC_FUNCTIONS } from '@a2ui/web_core/v0_9/basic_catalog';
8
8
 
9
9
  /**
@@ -336,7 +336,7 @@ class ComponentHostComponent {
336
336
  });
337
337
  }
338
338
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ComponentHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
339
- 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 } }, ngImport: i0, template: `
339
+ 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: `
340
340
  @if (componentType) {
341
341
  <ng-container
342
342
  *ngComponentOutlet="
@@ -357,6 +357,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
357
357
  args: [{
358
358
  selector: 'a2ui-v09-component-host',
359
359
  imports: [NgComponentOutlet],
360
+ host: {
361
+ 'style': 'display: contents;'
362
+ },
360
363
  template: `
361
364
  @if (componentType) {
362
365
  <ng-container
@@ -407,7 +410,7 @@ class SurfaceComponent {
407
410
  */
408
411
  dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
409
412
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SurfaceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
410
- 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 } }, ngImport: i0, template: `
413
+ 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: `
411
414
  <a2ui-v09-component-host
412
415
  [componentKey]="{ id: 'root', basePath: dataContextPath() }"
413
416
  [surfaceId]="surfaceId()"
@@ -421,6 +424,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
421
424
  selector: 'a2ui-v09-surface',
422
425
  standalone: true,
423
426
  imports: [ComponentHostComponent],
427
+ host: {
428
+ 'style': 'display: contents;'
429
+ },
424
430
  template: `
425
431
  <a2ui-v09-component-host
426
432
  [componentKey]="{ id: 'root', basePath: dataContextPath() }"
@@ -528,6 +534,32 @@ function provideMarkdownRenderer(renderFn) {
528
534
  return { provide: MarkdownRenderer, useClass: DefaultMarkdownRenderer };
529
535
  }
530
536
 
537
+ /**
538
+ * Copyright 2026 Google LLC
539
+ *
540
+ * Licensed under the Apache License, Version 2.0 (the "License");
541
+ * you may not use this file except in compliance with the License.
542
+ * You may obtain a copy of the License at
543
+ *
544
+ * http://www.apache.org/licenses/LICENSE-2.0
545
+ *
546
+ * Unless required by applicable law or agreed to in writing, software
547
+ * distributed under the License is distributed on an "AS IS" BASIS,
548
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
549
+ * See the License for the specific language governing permissions and
550
+ * limitations under the License.
551
+ */
552
+ /**
553
+ * Base class for A2UI basic catalog components in Angular.
554
+ *
555
+ * Automatically injects the basic catalog styles when the component is instantiated.
556
+ */
557
+ class BasicCatalogComponent {
558
+ constructor() {
559
+ injectBasicCatalogStyles();
560
+ }
561
+ }
562
+
531
563
  /**
532
564
  * Copyright 2026 Google LLC
533
565
  *
@@ -547,8 +579,19 @@ function provideMarkdownRenderer(renderFn) {
547
579
  * Angular implementation of the A2UI Text component (v0.9).
548
580
  *
549
581
  * Renders text with support for simple Markdown.
582
+ *
583
+ * Supported CSS variables:
584
+ * - `--a2ui-text-color-text`: Controls the text color.
585
+ * - `--a2ui-text-margin`: Controls the margin of text elements.
586
+ * - `--a2ui-font-family-title`: Controls the font family for titles.
587
+ * - `--a2ui-line-height-headings`: Controls the line height for headings.
588
+ * - `--a2ui-line-height-body`: Controls the line height for body text.
589
+ * - `--a2ui-text-caption-color`: Controls the color for caption text.
590
+ * - `--a2ui-text-a-color`: Controls the color for links.
591
+ * - `--a2ui-text-a-font-weight`: Controls the font weight for links.
592
+ * - 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`.
550
593
  */
551
- class TextComponent {
594
+ class TextComponent extends BasicCatalogComponent {
552
595
  /**
553
596
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
554
597
  *
@@ -566,6 +609,7 @@ class TextComponent {
566
609
  resolvedText = signal('', ...(ngDevMode ? [{ debugName: "resolvedText" }] : /* istanbul ignore next */ []));
567
610
  renderRequestId = 0;
568
611
  constructor() {
612
+ super();
569
613
  effect$1(() => {
570
614
  const text = this.text();
571
615
  const variant = this.variant();
@@ -599,24 +643,57 @@ class TextComponent {
599
643
  });
600
644
  }
601
645
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
602
- 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 } }, ngImport: i0, template: `
646
+ 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: `
603
647
  <span [class]="'a2ui-text ' + variant()" [innerHTML]="resolvedText()">
604
648
  </span>
605
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
649
+ `, 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 });
606
650
  }
607
651
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextComponent, decorators: [{
608
652
  type: Component,
609
- args: [{
610
- selector: 'a2ui-v09-text',
611
- standalone: true,
612
- template: `
653
+ args: [{ selector: 'a2ui-v09-text', standalone: true, template: `
613
654
  <span [class]="'a2ui-text ' + variant()" [innerHTML]="resolvedText()">
614
655
  </span>
615
- `,
616
- changeDetection: ChangeDetectionStrategy.OnPush,
617
- }]
656
+ `, 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"] }]
618
657
  }], 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 }] }] } });
619
658
 
659
+ /**
660
+ * Copyright 2026 Google LLC
661
+ *
662
+ * Licensed under the Apache License, Version 2.0 (the "License");
663
+ * you may not use this file except in compliance with the License.
664
+ * You may obtain a copy of the License at
665
+ *
666
+ * http://www.apache.org/licenses/LICENSE-2.0
667
+ *
668
+ * Unless required by applicable law or agreed to in writing, software
669
+ * distributed under the License is distributed on an "AS IS" BASIS,
670
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
671
+ * See the License for the specific language governing permissions and
672
+ * limitations under the License.
673
+ */
674
+ /**
675
+ * Maps A2UI justification values to CSS justify-content values.
676
+ */
677
+ const JUSTIFY_MAP = {
678
+ start: 'flex-start',
679
+ center: 'center',
680
+ end: 'flex-end',
681
+ spaceBetween: 'space-between',
682
+ spaceAround: 'space-around',
683
+ spaceEvenly: 'space-evenly',
684
+ stretch: 'stretch',
685
+ };
686
+ /**
687
+ * Maps A2UI alignment values to CSS align-items values.
688
+ */
689
+ const ALIGN_MAP = {
690
+ start: 'flex-start',
691
+ center: 'center',
692
+ end: 'flex-end',
693
+ stretch: 'stretch',
694
+ baseline: 'baseline',
695
+ };
696
+
620
697
  /**
621
698
  * Copyright 2026 Google LLC
622
699
  *
@@ -637,8 +714,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
637
714
  *
638
715
  * Arranges child components in a horizontal flex layout. Supports both static
639
716
  * lists of children and repeating templates bound to a data collection.
717
+ *
718
+ * Supported CSS variables:
719
+ * - `--a2ui-row-gap`: Controls the gap between items in the row. Defaults to `--a2ui-spacing-m` (16px).
640
720
  */
641
- class RowComponent {
721
+ class RowComponent extends BasicCatalogComponent {
642
722
  /**
643
723
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
644
724
  *
@@ -651,8 +731,14 @@ class RowComponent {
651
731
  surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
652
732
  componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
653
733
  dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
654
- justify = computed$1(() => this.props()['justify']?.value(), ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
655
- align = computed$1(() => this.props()['align']?.value(), ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
734
+ justify = computed$1(() => {
735
+ const val = this.props()['justify']?.value();
736
+ return val ? (JUSTIFY_MAP[val] || val) : undefined;
737
+ }, ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
738
+ align = computed$1(() => {
739
+ const val = this.props()['align']?.value();
740
+ return val ? (ALIGN_MAP[val] || val) : undefined;
741
+ }, ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
656
742
  children = computed$1(() => {
657
743
  const raw = this.props()['children']?.value() || [];
658
744
  return Array.isArray(raw) ? raw : [];
@@ -676,14 +762,8 @@ class RowComponent {
676
762
  getNormalizedPath(index) {
677
763
  return getNormalizedPath(this.props()['children']?.raw?.path, this.dataContextPath(), index);
678
764
  }
679
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
680
- 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 } }, ngImport: i0, template: `
681
- <div
682
- class="a2ui-row"
683
- [style.justify-content]="justify()"
684
- [style.align-items]="align()"
685
- style="display: flex; flex-direction: row; width: 100%; gap: 4px;"
686
- >
765
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RowComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
766
+ 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: `
687
767
  @if (!isRepeating()) {
688
768
  @for (child of normalizedChildren(); track child.id) {
689
769
  <a2ui-v09-component-host
@@ -703,7 +783,6 @@ class RowComponent {
703
783
  </a2ui-v09-component-host>
704
784
  }
705
785
  }
706
- </div>
707
786
  `, isInline: true, dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
708
787
  }
709
788
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: RowComponent, decorators: [{
@@ -712,13 +791,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
712
791
  selector: 'a2ui-v09-row',
713
792
  standalone: true,
714
793
  imports: [ComponentHostComponent],
794
+ host: {
795
+ '[style.display]': '"flex"',
796
+ '[style.flex-direction]': '"row"',
797
+ '[style.gap]': '"var(--a2ui-row-gap, var(--a2ui-spacing-m, 16px))"',
798
+ '[style.justify-content]': 'justify()',
799
+ '[style.align-items]': 'align()'
800
+ },
715
801
  template: `
716
- <div
717
- class="a2ui-row"
718
- [style.justify-content]="justify()"
719
- [style.align-items]="align()"
720
- style="display: flex; flex-direction: row; width: 100%; gap: 4px;"
721
- >
722
802
  @if (!isRepeating()) {
723
803
  @for (child of normalizedChildren(); track child.id) {
724
804
  <a2ui-v09-component-host
@@ -738,7 +818,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
738
818
  </a2ui-v09-component-host>
739
819
  }
740
820
  }
741
- </div>
742
821
  `,
743
822
  changeDetection: ChangeDetectionStrategy.OnPush,
744
823
  }]
@@ -764,8 +843,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
764
843
  *
765
844
  * Arranges child components in a vertical flex layout. Supports both static
766
845
  * lists of children and repeating templates bound to a data collection.
846
+ *
847
+ * Supported CSS variables:
848
+ * - `--a2ui-column-gap`: Controls the gap between items in the column. Defaults to `--a2ui-spacing-m` (16px).
767
849
  */
768
- class ColumnComponent {
850
+ class ColumnComponent extends BasicCatalogComponent {
769
851
  /**
770
852
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
771
853
  *
@@ -778,8 +860,14 @@ class ColumnComponent {
778
860
  surfaceId = input.required(...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
779
861
  componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
780
862
  dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
781
- justify = computed$1(() => this.props()['justify']?.value(), ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
782
- align = computed$1(() => this.props()['align']?.value(), ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
863
+ justify = computed$1(() => {
864
+ const val = this.props()['justify']?.value();
865
+ return val ? (JUSTIFY_MAP[val] || val) : undefined;
866
+ }, ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
867
+ align = computed$1(() => {
868
+ const val = this.props()['align']?.value();
869
+ return val ? (ALIGN_MAP[val] || val) : undefined;
870
+ }, ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
783
871
  children = computed$1(() => {
784
872
  const raw = this.props()['children']?.value() || [];
785
873
  return Array.isArray(raw) ? raw : [];
@@ -803,14 +891,8 @@ class ColumnComponent {
803
891
  getNormalizedPath(index) {
804
892
  return getNormalizedPath(this.props()['children']?.raw?.path, this.dataContextPath(), index);
805
893
  }
806
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
807
- 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 } }, ngImport: i0, template: `
808
- <div
809
- class="a2ui-column"
810
- [style.justify-content]="justify()"
811
- [style.align-items]="align()"
812
- style="display: flex; flex-direction: column; width: 100%; gap: 4px;"
813
- >
894
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
895
+ 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: `
814
896
  @if (!isRepeating()) {
815
897
  @for (child of normalizedChildren(); track child.id) {
816
898
  <a2ui-v09-component-host
@@ -830,7 +912,6 @@ class ColumnComponent {
830
912
  </a2ui-v09-component-host>
831
913
  }
832
914
  }
833
- </div>
834
915
  `, isInline: true, dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
835
916
  }
836
917
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ColumnComponent, decorators: [{
@@ -839,13 +920,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
839
920
  selector: 'a2ui-v09-column',
840
921
  standalone: true,
841
922
  imports: [ComponentHostComponent],
923
+ host: {
924
+ '[style.display]': '"flex"',
925
+ '[style.flex-direction]': '"column"',
926
+ '[style.width]': '"100%"',
927
+ '[style.gap]': '"var(--a2ui-column-gap, var(--a2ui-spacing-m, 16px))"',
928
+ '[style.justify-content]': 'justify()',
929
+ '[style.align-items]': 'align()'
930
+ },
842
931
  template: `
843
- <div
844
- class="a2ui-column"
845
- [style.justify-content]="justify()"
846
- [style.align-items]="align()"
847
- style="display: flex; flex-direction: column; width: 100%; gap: 4px;"
848
- >
849
932
  @if (!isRepeating()) {
850
933
  @for (child of normalizedChildren(); track child.id) {
851
934
  <a2ui-v09-component-host
@@ -865,7 +948,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
865
948
  </a2ui-v09-component-host>
866
949
  }
867
950
  }
868
- </div>
869
951
  `,
870
952
  changeDetection: ChangeDetectionStrategy.OnPush,
871
953
  }]
@@ -891,8 +973,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
891
973
  *
892
974
  * Renders a clickable button with a single child component (usually Text).
893
975
  * Dispatches an action when clicked if an `action` property is provided.
976
+ *
977
+ * Supported CSS variables:
978
+ * - `--a2ui-button-padding`: Controls the padding.
979
+ * - `--a2ui-button-border-radius`: Controls the border radius.
980
+ * - `--a2ui-button-border`: Controls the border.
981
+ * - `--a2ui-button-margin`: Controls the margin.
982
+ * - `--a2ui-button-background`: Controls the background color.
983
+ * - `--a2ui-button-box-shadow`: Controls the box shadow.
984
+ * - `--a2ui-button-font-weight`: Controls the font weight.
894
985
  */
895
- class ButtonComponent {
986
+ class ButtonComponent extends BasicCatalogComponent {
896
987
  /**
897
988
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
898
989
  *
@@ -921,8 +1012,8 @@ class ButtonComponent {
921
1012
  }
922
1013
  }
923
1014
  }
924
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
925
- 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 } }, ngImport: i0, template: `
1015
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1016
+ 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: `
926
1017
  <button
927
1018
  [type]="variant() === 'primary' ? 'submit' : 'button'"
928
1019
  [class]="'a2ui-button ' + variant()"
@@ -937,7 +1028,7 @@ class ButtonComponent {
937
1028
  </a2ui-v09-component-host>
938
1029
  }
939
1030
  </button>
940
- `, isInline: true, styles: [".a2ui-button{padding:8px 16px;border-radius:4px;border:1px solid #ccc;cursor:pointer}.a2ui-button.primary{background-color:#007bff;color:#fff;border-color:#0069d9}.a2ui-button.borderless{background:none;border:none;padding:0;color:#007bff}.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 });
1031
+ `, 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 });
941
1032
  }
942
1033
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ButtonComponent, decorators: [{
943
1034
  type: Component,
@@ -956,7 +1047,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
956
1047
  </a2ui-v09-component-host>
957
1048
  }
958
1049
  </button>
959
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-button{padding:8px 16px;border-radius:4px;border:1px solid #ccc;cursor:pointer}.a2ui-button.primary{background-color:#007bff;color:#fff;border-color:#0069d9}.a2ui-button.borderless{background:none;border:none;padding:0;color:#007bff}.a2ui-button:disabled{background-color:#e9ecef;color:#6c757d;border-color:#ced4da;cursor:not-allowed}\n"] }]
1050
+ `, 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"] }]
960
1051
  }], 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 }] }] } });
961
1052
 
962
1053
  /**
@@ -979,8 +1070,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
979
1070
  *
980
1071
  * Renders a text input field with an optional label and placeholder.
981
1072
  * Updates the bound data model property on every input change.
1073
+ *
1074
+ * Supported CSS variables:
1075
+ * - `--a2ui-color-input`: Controls the background color of the input.
1076
+ * - `--a2ui-color-on-input`: Controls the text color of the input.
1077
+ * - `--a2ui-textfield-border`: Controls the border of the input.
1078
+ * - `--a2ui-textfield-border-radius`: Controls the border radius of the input.
1079
+ * - `--a2ui-textfield-padding`: Controls the padding of the input.
1080
+ * - `--a2ui-textfield-color-border-focus`: Controls the border color on focus.
1081
+ * - `--a2ui-textfield-color-error`: Controls the border and text color for error states.
1082
+ * - `--a2ui-textfield-label-font-size`: Controls the font size of the label.
1083
+ * - `--a2ui-textfield-label-font-weight`: Controls the font weight of the label.
982
1084
  */
983
- class TextFieldComponent {
1085
+ class TextFieldComponent extends BasicCatalogComponent {
984
1086
  /**
985
1087
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
986
1088
  *
@@ -1015,8 +1117,8 @@ class TextFieldComponent {
1015
1117
  // notified.
1016
1118
  this.props()['value']?.onUpdate(value);
1017
1119
  }
1018
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1019
- 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 } }, ngImport: i0, template: `
1120
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1121
+ 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: `
1020
1122
  <div class="a2ui-text-field-container">
1021
1123
  @if (label()) {
1022
1124
  <label>{{ label() }}</label>
@@ -1032,7 +1134,7 @@ class TextFieldComponent {
1032
1134
  <div class="a2ui-error-message">{{ message }}</div>
1033
1135
  }
1034
1136
  </div>
1035
- `, isInline: true, styles: [":host{display:block;flex:1;width:100%}.a2ui-text-field-container{display:flex;flex-direction:column;gap:4px;margin:4px}input{padding:8px;border:1px solid #ccc;border-radius:4px}input.invalid{border-color:red}.a2ui-error-message{color:red;font-size:12px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1137
+ `, 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 });
1036
1138
  }
1037
1139
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TextFieldComponent, decorators: [{
1038
1140
  type: Component,
@@ -1052,7 +1154,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1052
1154
  <div class="a2ui-error-message">{{ message }}</div>
1053
1155
  }
1054
1156
  </div>
1055
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;flex:1;width:100%}.a2ui-text-field-container{display:flex;flex-direction:column;gap:4px;margin:4px}input{padding:8px;border:1px solid #ccc;border-radius:4px}input.invalid{border-color:red}.a2ui-error-message{color:red;font-size:12px}\n"] }]
1157
+ `, 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"] }]
1056
1158
  }], 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 }] }] } });
1057
1159
 
1058
1160
  /**
@@ -1074,8 +1176,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1074
1176
  * Angular implementation of the A2UI Image component (v0.9).
1075
1177
  *
1076
1178
  * Renders an image with configurable fit and shape variants.
1179
+ *
1180
+ * Supported CSS variables:
1181
+ * - `--a2ui-image-border-radius`: Controls the rounded corners.
1182
+ * - `--a2ui-image-icon-size`: Size of the icon variant.
1183
+ * - `--a2ui-image-avatar-size`: Size of the avatar variant.
1184
+ * - `--a2ui-image-small-feature-size`: Max-width of smallFeature variant.
1185
+ * - `--a2ui-image-large-feature-size`: Max-height of largeFeature variant.
1186
+ * - `--a2ui-image-header-size`: Height of header variant.
1077
1187
  */
1078
- class ImageComponent {
1188
+ class ImageComponent extends BasicCatalogComponent {
1079
1189
  /**
1080
1190
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1081
1191
  *
@@ -1093,15 +1203,15 @@ class ImageComponent {
1093
1203
  description = computed$1(() => this.props()['description']?.value() || '', ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
1094
1204
  fit = computed$1(() => this.props()['fit']?.value() || 'cover', ...(ngDevMode ? [{ debugName: "fit" }] : /* istanbul ignore next */ []));
1095
1205
  variant = computed$1(() => this.props()['variant']?.value() || 'default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
1096
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1097
- 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 } }, ngImport: i0, template: `
1206
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ImageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1207
+ 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: `
1098
1208
  <img
1099
1209
  [src]="url()"
1100
1210
  [alt]="description()"
1101
1211
  [style.object-fit]="fit()"
1102
1212
  [class]="'a2ui-image ' + variant()"
1103
1213
  />
1104
- `, 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:8px}.a2ui-image.icon{width:24px;height:24px}.a2ui-image.avatar{width:40px;height:40px;border-radius:50%}.a2ui-image.smallFeature{width:100px;height:100px}.a2ui-image.mediumFeature{max-width:300px;height:auto}.a2ui-image.largeFeature{width:100%;max-height:400px}.a2ui-image.header{width:100%;height:200px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1214
+ `, 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 });
1105
1215
  }
1106
1216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ImageComponent, decorators: [{
1107
1217
  type: Component,
@@ -1112,7 +1222,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1112
1222
  [style.object-fit]="fit()"
1113
1223
  [class]="'a2ui-image ' + variant()"
1114
1224
  />
1115
- `, 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:8px}.a2ui-image.icon{width:24px;height:24px}.a2ui-image.avatar{width:40px;height:40px;border-radius:50%}.a2ui-image.smallFeature{width:100px;height:100px}.a2ui-image.mediumFeature{max-width:300px;height:auto}.a2ui-image.largeFeature{width:100%;max-height:400px}.a2ui-image.header{width:100%;height:200px}\n"] }]
1225
+ `, 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"] }]
1116
1226
  }], 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 }] }] } });
1117
1227
 
1118
1228
  /**
@@ -1134,8 +1244,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1134
1244
  * Angular implementation of the A2UI Icon component (v0.9).
1135
1245
  *
1136
1246
  * Supports both Material Icons (by name) and custom SVG icons (by path).
1247
+ *
1248
+ * Supported CSS variables:
1249
+ * - `--a2ui-icon-size`: Controls the width, height, and font size of the icon.
1250
+ * - `--a2ui-icon-font-family`: Controls the font family for icon fonts.
1251
+ * - `--a2ui-icon-color`: Controls the color of the icon.
1252
+ * - `--a2ui-icon-font-variation-settings`: Controls font variation settings (e.g. FILL).
1137
1253
  */
1138
- class IconComponent {
1254
+ class IconComponent extends BasicCatalogComponent {
1139
1255
  /**
1140
1256
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1141
1257
  *
@@ -1165,8 +1281,8 @@ class IconComponent {
1165
1281
  // Convert camelCase to snake_case for Material Icons
1166
1282
  return name.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
1167
1283
  }, ...(ngDevMode ? [{ debugName: "iconName" }] : /* istanbul ignore next */ []));
1168
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1169
- 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 } }, ngImport: i0, template: `
1284
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: IconComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1285
+ 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: `
1170
1286
  @if (isPath()) {
1171
1287
  <svg class="a2ui-icon svg" viewBox="0 0 24 24" [style.fill]="color() || 'currentColor'">
1172
1288
  <path [attr.d]="path()"></path>
@@ -1176,7 +1292,7 @@ class IconComponent {
1176
1292
  {{ iconName() }}
1177
1293
  </i>
1178
1294
  }
1179
- `, isInline: true, styles: [".a2ui-icon{display:inline-block;width:24px;height:24px;font-size:24px;font-family:Material Icons;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 });
1295
+ `, 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 });
1180
1296
  }
1181
1297
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: IconComponent, decorators: [{
1182
1298
  type: Component,
@@ -1190,7 +1306,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1190
1306
  {{ iconName() }}
1191
1307
  </i>
1192
1308
  }
1193
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-icon{display:inline-block;width:24px;height:24px;font-size:24px;font-family:Material Icons;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"] }]
1309
+ `, 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"] }]
1194
1310
  }], 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 }] }] } });
1195
1311
 
1196
1312
  /**
@@ -1212,8 +1328,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1212
1328
  * Angular implementation of the A2UI Video component (v0.9).
1213
1329
  *
1214
1330
  * Renders a video player with standard controls and an optional poster image.
1331
+ *
1332
+ * Supported CSS variables:
1333
+ * - `--a2ui-video-border-radius`: Controls the border radius of the video element.
1215
1334
  */
1216
- class VideoComponent {
1335
+ class VideoComponent extends BasicCatalogComponent {
1217
1336
  /**
1218
1337
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1219
1338
  *
@@ -1227,8 +1346,8 @@ class VideoComponent {
1227
1346
  dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1228
1347
  url = computed$1(() => this.props()['url']?.value(), ...(ngDevMode ? [{ debugName: "url" }] : /* istanbul ignore next */ []));
1229
1348
  posterUrl = computed$1(() => this.props()['posterUrl']?.value(), ...(ngDevMode ? [{ debugName: "posterUrl" }] : /* istanbul ignore next */ []));
1230
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: VideoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1231
- 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 } }, ngImport: i0, template: `
1349
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: VideoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1350
+ 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: `
1232
1351
  <div class="a2ui-video-container">
1233
1352
  <video
1234
1353
  [attr.src]="url() || null"
@@ -1239,7 +1358,7 @@ class VideoComponent {
1239
1358
  Your browser does not support the video tag.
1240
1359
  </video>
1241
1360
  </div>
1242
- `, isInline: true, styles: [".a2ui-video-container{width:100%;max-width:100%}.a2ui-video{width:100%;height:auto;display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1361
+ `, isInline: true, 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"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1243
1362
  }
1244
1363
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: VideoComponent, decorators: [{
1245
1364
  type: Component,
@@ -1254,7 +1373,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1254
1373
  Your browser does not support the video tag.
1255
1374
  </video>
1256
1375
  </div>
1257
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-video-container{width:100%;max-width:100%}.a2ui-video{width:100%;height:auto;display:block}\n"] }]
1376
+ `, 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"] }]
1258
1377
  }], 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 }] }] } });
1259
1378
 
1260
1379
  /**
@@ -1276,8 +1395,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1276
1395
  * Angular implementation of the A2UI AudioPlayer component (v0.9).
1277
1396
  *
1278
1397
  * Renders an audio player with standard controls and an optional description.
1398
+ *
1399
+ * Supported CSS variables:
1400
+ * - `--a2ui-audioplayer-background`: Controls the background of the player. Defaults to `transparent`.
1401
+ * - `--a2ui-audioplayer-border-radius`: Controls the border radius. Defaults to `0`.
1402
+ * - `--a2ui-audioplayer-padding`: Controls the padding. Defaults to `0`.
1279
1403
  */
1280
- class AudioPlayerComponent {
1404
+ class AudioPlayerComponent extends BasicCatalogComponent {
1281
1405
  /**
1282
1406
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1283
1407
  *
@@ -1291,8 +1415,8 @@ class AudioPlayerComponent {
1291
1415
  dataContextPath = input(...(ngDevMode ? [undefined, { debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1292
1416
  description = computed$1(() => this.props()['description']?.value(), ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
1293
1417
  url = computed$1(() => this.props()['url']?.value(), ...(ngDevMode ? [{ debugName: "url" }] : /* istanbul ignore next */ []));
1294
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AudioPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1295
- 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 } }, ngImport: i0, template: `
1418
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AudioPlayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1419
+ 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: `
1296
1420
  <div class="a2ui-audio-player">
1297
1421
  @if (description()) {
1298
1422
  <div class="a2ui-audio-description">
@@ -1303,7 +1427,7 @@ class AudioPlayerComponent {
1303
1427
  Your browser does not support the audio tag.
1304
1428
  </audio>
1305
1429
  </div>
1306
- `, isInline: true, styles: [".a2ui-audio-player{display:flex;flex-direction:column;gap:8px;width:100%}.a2ui-audio-description{font-size:14px;color:#666}.a2ui-audio{width:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1430
+ `, isInline: true, 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"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1307
1431
  }
1308
1432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: AudioPlayerComponent, decorators: [{
1309
1433
  type: Component,
@@ -1318,7 +1442,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1318
1442
  Your browser does not support the audio tag.
1319
1443
  </audio>
1320
1444
  </div>
1321
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-audio-player{display:flex;flex-direction:column;gap:8px;width:100%}.a2ui-audio-description{font-size:14px;color:#666}.a2ui-audio{width:100%}\n"] }]
1445
+ `, 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"] }]
1322
1446
  }], 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 }] }] } });
1323
1447
 
1324
1448
  /**
@@ -1341,8 +1465,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1341
1465
  *
1342
1466
  * Renders a list of child components with support for ordered, unordered,
1343
1467
  * and unstyled layouts in both vertical and horizontal orientations.
1468
+ *
1469
+ * Supported CSS variables:
1470
+ * - `--a2ui-list-gap`: Controls the gap between items.
1471
+ * - `--a2ui-list-padding`: Controls the padding (applied to padding-inline-start).
1344
1472
  */
1345
- class ListComponent {
1473
+ class ListComponent extends BasicCatalogComponent {
1346
1474
  /**
1347
1475
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1348
1476
  *
@@ -1375,8 +1503,8 @@ class ListComponent {
1375
1503
  return 'none';
1376
1504
  return '';
1377
1505
  }, ...(ngDevMode ? [{ debugName: "styleType" }] : /* istanbul ignore next */ []));
1378
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1379
- 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 } }, ngImport: i0, template: `
1506
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1507
+ 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: `
1380
1508
  @switch (listTag()) {
1381
1509
  @case ('ol') {
1382
1510
  <ol [class]="'a2ui-list ' + orientation()" [style.list-style-type]="styleType()">
@@ -1418,7 +1546,7 @@ class ListComponent {
1418
1546
  </div>
1419
1547
  }
1420
1548
  }
1421
- `, isInline: true, styles: [".a2ui-list{display:flex;padding-inline-start:24px;margin:0}.a2ui-list.vertical{flex-direction:column;gap:8px}.a2ui-list.horizontal{flex-direction:row;gap:16px;list-style-position:inside}.a2ui-list-item-none{display:block}.horizontal .a2ui-list-item-none{display:inline-block}\n"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1549
+ `, isInline: true, 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"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1422
1550
  }
1423
1551
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ListComponent, decorators: [{
1424
1552
  type: Component,
@@ -1464,7 +1592,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1464
1592
  </div>
1465
1593
  }
1466
1594
  }
1467
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-list{display:flex;padding-inline-start:24px;margin:0}.a2ui-list.vertical{flex-direction:column;gap:8px}.a2ui-list.horizontal{flex-direction:row;gap:16px;list-style-position:inside}.a2ui-list-item-none{display:block}.horizontal .a2ui-list-item-none{display:inline-block}\n"] }]
1595
+ `, 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"] }]
1468
1596
  }], 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 }] }] } });
1469
1597
 
1470
1598
  /**
@@ -1486,8 +1614,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1486
1614
  * Angular implementation of the A2UI Card component (v0.9).
1487
1615
  *
1488
1616
  * Renders a container with a shadow and rounded corners for grouping related content.
1617
+ *
1618
+ * Supported CSS variables:
1619
+ * - `--a2ui-card-padding`: Controls the padding.
1620
+ * - `--a2ui-card-border-radius`: Controls the border radius.
1621
+ * - `--a2ui-card-box-shadow`: Controls the box shadow.
1622
+ * - `--a2ui-card-background`: Controls the background color.
1623
+ * - `--a2ui-card-border`: Controls the border.
1624
+ * - `--a2ui-card-margin`: Controls the margin.
1489
1625
  */
1490
- class CardComponent {
1626
+ class CardComponent extends BasicCatalogComponent {
1491
1627
  /**
1492
1628
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1493
1629
  *
@@ -1499,8 +1635,8 @@ class CardComponent {
1499
1635
  componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1500
1636
  dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1501
1637
  child = computed$1(() => this.props()['child']?.value(), ...(ngDevMode ? [{ debugName: "child" }] : /* istanbul ignore next */ []));
1502
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1503
- 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 } }, ngImport: i0, template: `
1638
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CardComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1639
+ 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: `
1504
1640
  <div class="a2ui-card">
1505
1641
  @if (child()) {
1506
1642
  <a2ui-v09-component-host
@@ -1510,7 +1646,7 @@ class CardComponent {
1510
1646
  </a2ui-v09-component-host>
1511
1647
  }
1512
1648
  </div>
1513
- `, isInline: true, styles: [".a2ui-card{padding:16px;border-radius:8px;box-shadow:0 4px 6px #0000001a;background-color:#fff;border:1px solid #eee}\n"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1649
+ `, 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 });
1514
1650
  }
1515
1651
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CardComponent, decorators: [{
1516
1652
  type: Component,
@@ -1524,7 +1660,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1524
1660
  </a2ui-v09-component-host>
1525
1661
  }
1526
1662
  </div>
1527
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-card{padding:16px;border-radius:8px;box-shadow:0 4px 6px #0000001a;background-color:#fff;border:1px solid #eee}\n"] }]
1663
+ `, 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"] }]
1528
1664
  }], 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 }] }] } });
1529
1665
 
1530
1666
  /**
@@ -1547,8 +1683,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1547
1683
  *
1548
1684
  * Renders a set of tabs where each tab has a label and associated content.
1549
1685
  * Manages the active tab state internally.
1686
+ *
1687
+ * Supported CSS variables:
1688
+ * - `--a2ui-tabs-border`: Controls the border of the tab bar.
1689
+ * - `--a2ui-tabs-header-background`: Controls the background of tab buttons.
1690
+ * - `--a2ui-tabs-header-color`: Controls the text color of tab buttons.
1691
+ * - `--a2ui-tabs-header-background-active`: Controls the background of the active tab button.
1692
+ * - `--a2ui-tabs-header-color-active`: Controls the text color of the active tab button.
1693
+ * - `--a2ui-tabs-content-padding`: Controls the padding of the tab content.
1550
1694
  */
1551
- class TabsComponent {
1695
+ class TabsComponent extends BasicCatalogComponent {
1552
1696
  /**
1553
1697
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1554
1698
  *
@@ -1574,8 +1718,8 @@ class TabsComponent {
1574
1718
  setActiveTab(index) {
1575
1719
  this.activeTabIndex.set(index);
1576
1720
  }
1577
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1578
- 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 } }, ngImport: i0, template: `
1721
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TabsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1722
+ 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: `
1579
1723
  <div class="a2ui-tabs">
1580
1724
  <div class="a2ui-tab-bar">
1581
1725
  @for (tab of tabs(); track tab; let i = $index) {
@@ -1598,7 +1742,7 @@ class TabsComponent {
1598
1742
  </div>
1599
1743
  }
1600
1744
  </div>
1601
- `, isInline: true, styles: [".a2ui-tabs{display:flex;flex-direction:column;width:100%}.a2ui-tab-bar{display:flex;border-bottom:2px solid #eee;gap:16px}.a2ui-tab-button{padding:8px 16px;border:none;background:none;cursor:pointer;font-weight:500;color:#666;border-bottom:2px solid transparent;margin-bottom:-2px}.a2ui-tab-button.active{color:#007bff;border-bottom:2px solid #007bff}.a2ui-tab-content{padding:16px 0}\n"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1745
+ `, isInline: true, 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"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1602
1746
  }
1603
1747
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: TabsComponent, decorators: [{
1604
1748
  type: Component,
@@ -1625,7 +1769,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1625
1769
  </div>
1626
1770
  }
1627
1771
  </div>
1628
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-tabs{display:flex;flex-direction:column;width:100%}.a2ui-tab-bar{display:flex;border-bottom:2px solid #eee;gap:16px}.a2ui-tab-button{padding:8px 16px;border:none;background:none;cursor:pointer;font-weight:500;color:#666;border-bottom:2px solid transparent;margin-bottom:-2px}.a2ui-tab-button.active{color:#007bff;border-bottom:2px solid #007bff}.a2ui-tab-content{padding:16px 0}\n"] }]
1772
+ `, 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"] }]
1629
1773
  }], 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 }] }] } });
1630
1774
 
1631
1775
  /**
@@ -1647,8 +1791,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1647
1791
  * Angular implementation of the A2UI Modal component (v0.9).
1648
1792
  *
1649
1793
  * Renders a trigger component that opening an overlay containing a content component.
1794
+ *
1795
+ * Supported CSS variables:
1796
+ * - `--a2ui-modal-background`: Controls the background of the modal content.
1797
+ * - `--a2ui-modal-padding`: Controls the padding of the modal content.
1798
+ * - `--a2ui-modal-border-radius`: Controls the border radius of the modal content.
1799
+ * - `--a2ui-modal-box-shadow`: Controls the box shadow of the modal content.
1800
+ * - `--a2ui-modal-backdrop-bg`: Controls the background of the backdrop.
1650
1801
  */
1651
- class ModalComponent {
1802
+ class ModalComponent extends BasicCatalogComponent {
1652
1803
  /**
1653
1804
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1654
1805
  *
@@ -1669,8 +1820,8 @@ class ModalComponent {
1669
1820
  closeModal() {
1670
1821
  this.isOpen.set(false);
1671
1822
  }
1672
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1673
- 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 } }, ngImport: i0, template: `
1823
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ModalComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1824
+ 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: `
1674
1825
  <div class="a2ui-modal-wrapper">
1675
1826
  <div (click)="openModal()" class="a2ui-modal-trigger">
1676
1827
  @if (trigger()) {
@@ -1697,7 +1848,7 @@ class ModalComponent {
1697
1848
  </div>
1698
1849
  }
1699
1850
  </div>
1700
- `, isInline: true, 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:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.a2ui-modal-content{background:#fff;padding:32px;border-radius:8px;position:relative;min-width:300px;max-width:80%;max-height:80%;overflow-y:auto;box-shadow:0 10px 25px #0003}.a2ui-modal-close{position:absolute;top:10px;right:15px;border:none;background:none;font-size:24px;cursor:pointer;color:#999}.a2ui-modal-close:hover{color:#333}\n"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1851
+ `, isInline: true, 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"], dependencies: [{ kind: "component", type: ComponentHostComponent, selector: "a2ui-v09-component-host", inputs: ["componentKey", "surfaceId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1701
1852
  }
1702
1853
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ModalComponent, decorators: [{
1703
1854
  type: Component,
@@ -1728,7 +1879,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1728
1879
  </div>
1729
1880
  }
1730
1881
  </div>
1731
- `, 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:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.a2ui-modal-content{background:#fff;padding:32px;border-radius:8px;position:relative;min-width:300px;max-width:80%;max-height:80%;overflow-y:auto;box-shadow:0 10px 25px #0003}.a2ui-modal-close{position:absolute;top:10px;right:15px;border:none;background:none;font-size:24px;cursor:pointer;color:#999}.a2ui-modal-close:hover{color:#333}\n"] }]
1882
+ `, 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"] }]
1732
1883
  }], 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 }] }] } });
1733
1884
 
1734
1885
  /**
@@ -1750,8 +1901,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1750
1901
  * Angular implementation of the A2UI Divider component (v0.9).
1751
1902
  *
1752
1903
  * Renders a horizontal or vertical line to separate content.
1904
+ *
1905
+ * Supported CSS variables:
1906
+ * - `--a2ui-divider-border`: Controls the border of the divider (horizontal and vertical).
1907
+ * - `--a2ui-divider-spacing`: Controls the margin around the divider.
1753
1908
  */
1754
- class DividerComponent {
1909
+ class DividerComponent extends BasicCatalogComponent {
1755
1910
  /**
1756
1911
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1757
1912
  *
@@ -1763,24 +1918,27 @@ class DividerComponent {
1763
1918
  componentId = input(...(ngDevMode ? [undefined, { debugName: "componentId" }] : /* istanbul ignore next */ []));
1764
1919
  dataContextPath = input('/', ...(ngDevMode ? [{ debugName: "dataContextPath" }] : /* istanbul ignore next */ []));
1765
1920
  axis = computed$1(() => this.props()['axis']?.value() ?? 'horizontal', ...(ngDevMode ? [{ debugName: "axis" }] : /* istanbul ignore next */ []));
1766
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1767
- 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 } }, ngImport: i0, template: `
1921
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DividerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1922
+ 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: `
1768
1923
  <hr
1769
1924
  class="a2ui-divider"
1770
1925
  [class.horizontal]="axis() === 'horizontal'"
1771
1926
  [class.vertical]="axis() === 'vertical'"
1772
1927
  />
1773
- `, isInline: true, styles: [".a2ui-divider{border:0;border-top:1px solid #eee;margin:16px 0;width:100%}.a2ui-divider.vertical{width:1px;height:100%;margin:0 16px;border-top:0;border-left:1px solid #eee}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1928
+ `, 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 });
1774
1929
  }
1775
1930
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DividerComponent, decorators: [{
1776
1931
  type: Component,
1777
- args: [{ selector: 'a2ui-v09-divider', standalone: true, imports: [], template: `
1932
+ args: [{ selector: 'a2ui-v09-divider', standalone: true, imports: [], host: {
1933
+ '[style.display]': '"block"',
1934
+ '[style.width]': 'axis() === "horizontal" ? "100%" : "auto"',
1935
+ }, template: `
1778
1936
  <hr
1779
1937
  class="a2ui-divider"
1780
1938
  [class.horizontal]="axis() === 'horizontal'"
1781
1939
  [class.vertical]="axis() === 'vertical'"
1782
1940
  />
1783
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-divider{border:0;border-top:1px solid #eee;margin:16px 0;width:100%}.a2ui-divider.vertical{width:1px;height:100%;margin:0 16px;border-top:0;border-left:1px solid #eee}\n"] }]
1941
+ `, 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"] }]
1784
1942
  }], 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 }] }] } });
1785
1943
 
1786
1944
  /**
@@ -1803,8 +1961,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1803
1961
  *
1804
1962
  * Renders a checkbox with a label. Updates the bound data model property
1805
1963
  * when the checked state changes.
1964
+ *
1965
+ * Supported CSS variables:
1966
+ * - `--a2ui-checkbox-margin`: Controls the margin.
1967
+ * - `--a2ui-checkbox-gap`: Controls the gap between checkbox and label.
1968
+ * - `--a2ui-checkbox-label-font-size`: Controls the font size of the label.
1969
+ * - `--a2ui-checkbox-label-font-weight`: Controls the font weight of the label.
1970
+ * - `--a2ui-checkbox-size`: Controls the width and height of the checkbox.
1971
+ * - `--a2ui-checkbox-background`: Controls the background of the checkbox.
1972
+ * - `--a2ui-checkbox-border`: Controls the border of the checkbox.
1973
+ * - `--a2ui-checkbox-border-radius`: Controls the border radius of the checkbox.
1974
+ * - `--a2ui-checkbox-color-error`: Controls the color for error states.
1806
1975
  */
1807
- class CheckBoxComponent {
1976
+ class CheckBoxComponent extends BasicCatalogComponent {
1808
1977
  /**
1809
1978
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1810
1979
  *
@@ -1822,8 +1991,8 @@ class CheckBoxComponent {
1822
1991
  const checked = event.target.checked;
1823
1992
  this.props()['value']?.onUpdate(checked);
1824
1993
  }
1825
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CheckBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1826
- 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 } }, ngImport: i0, template: `
1994
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CheckBoxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1995
+ 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: `
1827
1996
  <label class="a2ui-check-box-label">
1828
1997
  <input
1829
1998
  type="checkbox"
@@ -1833,7 +2002,7 @@ class CheckBoxComponent {
1833
2002
  />
1834
2003
  <span class="a2ui-check-box-text">{{ label() }}</span>
1835
2004
  </label>
1836
- `, isInline: true, styles: [".a2ui-check-box-label{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 0}.a2ui-check-box-input{width:18px;height:18px;cursor:pointer}.a2ui-check-box-text{font-size:16px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2005
+ `, 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 });
1837
2006
  }
1838
2007
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CheckBoxComponent, decorators: [{
1839
2008
  type: Component,
@@ -1847,7 +2016,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1847
2016
  />
1848
2017
  <span class="a2ui-check-box-text">{{ label() }}</span>
1849
2018
  </label>
1850
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-check-box-label{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 0}.a2ui-check-box-input{width:18px;height:18px;cursor:pointer}.a2ui-check-box-text{font-size:16px}\n"] }]
2019
+ `, 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"] }]
1851
2020
  }], 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 }] }] } });
1852
2021
 
1853
2022
  /**
@@ -1870,8 +2039,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1870
2039
  *
1871
2040
  * Renders a set of options as either radio buttons/checkboxes or chips.
1872
2041
  * Supports both single and multiple selection.
2042
+ *
2043
+ * Supported CSS variables:
2044
+ * - `--a2ui-choicepicker-gap`: Controls spacing between options/chips.
2045
+ * - `--a2ui-choicepicker-padding`: Controls padding of the container.
2046
+ * - `--a2ui-choicepicker-checkbox-size`: Controls size of checkboxes/radios.
2047
+ * - `--a2ui-choicepicker-chip-padding`: Controls padding of chips.
2048
+ * - `--a2ui-choicepicker-chip-border-radius`: Controls border radius of chips.
2049
+ * - `--a2ui-choicepicker-chip-border`: Controls border of chips.
2050
+ * - `--a2ui-choicepicker-chip-background`: Controls background of chips.
2051
+ * - `--a2ui-choicepicker-chip-background-selected`: Controls background of selected chips.
1873
2052
  */
1874
- class ChoicePickerComponent {
2053
+ class ChoicePickerComponent extends BasicCatalogComponent {
1875
2054
  /**
1876
2055
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
1877
2056
  *
@@ -1926,8 +2105,8 @@ class ChoicePickerComponent {
1926
2105
  }
1927
2106
  }
1928
2107
  }
1929
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ChoicePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1930
- 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 } }, ngImport: i0, template: `
2108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ChoicePickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2109
+ 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: `
1931
2110
  <div class="a2ui-choice-picker">
1932
2111
  <!-- Chips Variant -->
1933
2112
  @if (displayStyle() === 'chips') {
@@ -1961,7 +2140,7 @@ class ChoicePickerComponent {
1961
2140
  </div>
1962
2141
  }
1963
2142
  </div>
1964
- `, isInline: true, styles: [".a2ui-choice-picker{width:100%}.a2ui-options-group{display:flex;flex-direction:column;gap:8px}.a2ui-option-label{display:flex;align-items:center;gap:8px;cursor:pointer}.a2ui-option-input{width:18px;height:18px}.a2ui-chips-group{display:flex;flex-wrap:wrap;gap:8px}.a2ui-chip{padding:4px 12px;border-radius:16px;border:1px solid #ccc;background:#fff;cursor:pointer;transition:all .2s}.a2ui-chip.active{background-color:#007bff;color:#fff;border-color:#007bff}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2143
+ `, 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 });
1965
2144
  }
1966
2145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: ChoicePickerComponent, decorators: [{
1967
2146
  type: Component,
@@ -1999,7 +2178,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1999
2178
  </div>
2000
2179
  }
2001
2180
  </div>
2002
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-choice-picker{width:100%}.a2ui-options-group{display:flex;flex-direction:column;gap:8px}.a2ui-option-label{display:flex;align-items:center;gap:8px;cursor:pointer}.a2ui-option-input{width:18px;height:18px}.a2ui-chips-group{display:flex;flex-wrap:wrap;gap:8px}.a2ui-chip{padding:4px 12px;border-radius:16px;border:1px solid #ccc;background:#fff;cursor:pointer;transition:all .2s}.a2ui-chip.active{background-color:#007bff;color:#fff;border-color:#007bff}\n"] }]
2181
+ `, 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"] }]
2003
2182
  }], 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 }] }] } });
2004
2183
 
2005
2184
  /**
@@ -2021,8 +2200,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2021
2200
  * Angular implementation of the A2UI Slider component (v0.9).
2022
2201
  *
2023
2202
  * Renders a range input slider with a label and its current value.
2203
+ *
2204
+ * Supported CSS variables:
2205
+ * - `--a2ui-slider-margin`: Controls the margin of the container.
2206
+ * - `--a2ui-slider-label-font-size`: Controls the font size of the label.
2207
+ * - `--a2ui-slider-label-font-weight`: Controls the font weight of the label.
2208
+ * - `--a2ui-slider-thumb-color`: Controls the accent color of the thumb.
2209
+ * - `--a2ui-slider-track-color`: Controls the background of the track.
2024
2210
  */
2025
- class SliderComponent {
2211
+ class SliderComponent extends BasicCatalogComponent {
2026
2212
  /**
2027
2213
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
2028
2214
  *
@@ -2046,8 +2232,8 @@ class SliderComponent {
2046
2232
  const val = Number(event.target.value);
2047
2233
  this.props()['value']?.onUpdate(val);
2048
2234
  }
2049
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2050
- 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 } }, ngImport: i0, template: `
2235
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SliderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2236
+ 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: `
2051
2237
  <div class="a2ui-slider-container">
2052
2238
  <div class="a2ui-slider-header">
2053
2239
  <span class="a2ui-slider-label">{{ label() }}</span>
@@ -2063,7 +2249,7 @@ class SliderComponent {
2063
2249
  class="a2ui-slider"
2064
2250
  />
2065
2251
  </div>
2066
- `, isInline: true, styles: [".a2ui-slider-container{width:100%;display:flex;flex-direction:column;gap:4px}.a2ui-slider-header{display:flex;justify-content:space-between;font-size:14px}.a2ui-slider{width:100%;cursor:pointer}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2252
+ `, 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 });
2067
2253
  }
2068
2254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SliderComponent, decorators: [{
2069
2255
  type: Component,
@@ -2083,7 +2269,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2083
2269
  class="a2ui-slider"
2084
2270
  />
2085
2271
  </div>
2086
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-slider-container{width:100%;display:flex;flex-direction:column;gap:4px}.a2ui-slider-header{display:flex;justify-content:space-between;font-size:14px}.a2ui-slider{width:100%;cursor:pointer}\n"] }]
2272
+ `, 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"] }]
2087
2273
  }], 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 }] }] } });
2088
2274
 
2089
2275
  /**
@@ -2106,8 +2292,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2106
2292
  *
2107
2293
  * Renders date and/or time input fields. Combines them into an ISO string
2108
2294
  * for the bound data model property.
2295
+ *
2296
+ * Supported CSS variables:
2297
+ * - `--a2ui-datetimeinput-background`: Controls the background of inputs.
2298
+ * - `--a2ui-datetimeinput-color`: Controls the text color of inputs.
2299
+ * - `--a2ui-datetimeinput-border`: Controls the border of inputs.
2300
+ * - `--a2ui-datetimeinput-border-radius`: Controls the border radius of inputs.
2301
+ * - `--a2ui-datetimeinput-padding`: Controls the padding of inputs.
2302
+ * - `--a2ui-datetimeinput-label-font-size`: Controls the font size of the label.
2303
+ * - `--a2ui-datetimeinput-label-font-weight`: Controls the font weight of the label.
2109
2304
  */
2110
- class DateTimeInputComponent {
2305
+ class DateTimeInputComponent extends BasicCatalogComponent {
2111
2306
  /**
2112
2307
  * Reactive properties resolved from the A2UI {@link ComponentModel}.
2113
2308
  *
@@ -2156,8 +2351,8 @@ class DateTimeInputComponent {
2156
2351
  : current || new Date().toISOString().split('T')[0];
2157
2352
  this.props()['value']?.onUpdate(`${date}T${time}:00`);
2158
2353
  }
2159
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DateTimeInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2160
- 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 } }, ngImport: i0, template: `
2354
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DateTimeInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2355
+ 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: `
2161
2356
  <div class="a2ui-date-time-container">
2162
2357
  @if (label()) {
2163
2358
  <label class="a2ui-date-time-label">
@@ -2183,7 +2378,7 @@ class DateTimeInputComponent {
2183
2378
  }
2184
2379
  </div>
2185
2380
  </div>
2186
- `, isInline: true, styles: [".a2ui-date-time-container{display:flex;flex-direction:column;gap:4px;width:100%}.a2ui-date-time-label{font-size:14px;color:#666}.a2ui-date-time-inputs{display:flex;gap:8px;width:100%}.a2ui-date-time-input{padding:8px;border-radius:4px;border:1px solid #ccc;font-family:inherit;flex:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2381
+ `, 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 });
2187
2382
  }
2188
2383
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DateTimeInputComponent, decorators: [{
2189
2384
  type: Component,
@@ -2213,7 +2408,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
2213
2408
  }
2214
2409
  </div>
2215
2410
  </div>
2216
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".a2ui-date-time-container{display:flex;flex-direction:column;gap:4px;width:100%}.a2ui-date-time-label{font-size:14px;color:#666}.a2ui-date-time-inputs{display:flex;gap:8px;width:100%}.a2ui-date-time-input{padding:8px;border-radius:4px;border:1px solid #ccc;font-family:inherit;flex:1}\n"] }]
2411
+ `, 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"] }]
2217
2412
  }], 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 }] }] } });
2218
2413
 
2219
2414
  /**