@a2ui/angular 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +25 -1
- package/README.md +9 -9
- package/fesm2022/a2ui-angular-src-v0_8.mjs +65 -59
- package/fesm2022/a2ui-angular-src-v0_8.mjs.map +1 -1
- package/fesm2022/a2ui-angular-src-v0_9.mjs +333 -533
- package/fesm2022/a2ui-angular-src-v0_9.mjs.map +1 -1
- package/fesm2022/a2ui-angular-v0_8.mjs +65 -59
- package/fesm2022/a2ui-angular-v0_8.mjs.map +1 -1
- package/fesm2022/a2ui-angular-v0_9.mjs +333 -533
- package/fesm2022/a2ui-angular-v0_9.mjs.map +1 -1
- package/fesm2022/a2ui-angular.mjs +65 -59
- package/fesm2022/a2ui-angular.mjs.map +1 -1
- package/package.json +3 -3
- package/types/a2ui-angular-src-v0_8.d.ts +159 -106
- package/types/a2ui-angular-src-v0_9.d.ts +299 -372
- package/types/a2ui-angular-v0_8.d.ts +159 -106
- package/types/a2ui-angular-v0_9.d.ts +299 -372
- package/types/a2ui-angular.d.ts +159 -106
package/LICENSE
CHANGED
|
@@ -200,4 +200,28 @@
|
|
|
200
200
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
201
|
See the License for the specific language governing permissions and
|
|
202
202
|
limitations under the License.
|
|
203
|
-
|
|
203
|
+
|
|
204
|
+
--------------------------------------------------------------------------------
|
|
205
|
+
The file eval/bin/transcrypt is licensed under the MIT License:
|
|
206
|
+
|
|
207
|
+
Copyright (c) 2019-2025 James Murty <james@murty.co>
|
|
208
|
+
Copyright (c) 2014-2020 Aaron Bull Schaefer <aaron@elasticdog.com>
|
|
209
|
+
|
|
210
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
211
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
212
|
+
in the Software without restriction, including without limitation the rights
|
|
213
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
214
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
215
|
+
furnished to do so, subject to the following conditions:
|
|
216
|
+
|
|
217
|
+
The above copyright notice and this permission notice shall be included in all
|
|
218
|
+
copies or substantial portions of the Software.
|
|
219
|
+
|
|
220
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
221
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
222
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
223
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
224
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
225
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
226
|
+
SOFTWARE.
|
|
227
|
+
--------------------------------------------------------------------------------
|
package/README.md
CHANGED
|
@@ -22,8 +22,8 @@ A2UI supports multiple protocol versions to ensure backward compatibility as the
|
|
|
22
22
|
To use the v0.9 implementation, import from the versioned path:
|
|
23
23
|
|
|
24
24
|
```typescript
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
25
|
+
import {A2uiRendererService, A2UI_RENDERER_CONFIG} from '@a2ui/angular/v0_9';
|
|
26
|
+
import {BasicCatalog} from '@a2ui/angular/v0_9';
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
## Basic Setup
|
|
@@ -31,8 +31,8 @@ import { BasicCatalog } from '@a2ui/angular/v0_9';
|
|
|
31
31
|
Configure the renderer in your `app.config.ts` using the `A2UI_RENDER_CONFIG` injection token:
|
|
32
32
|
|
|
33
33
|
```typescript
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
34
|
+
import {ApplicationConfig} from '@angular/core';
|
|
35
|
+
import {A2UI_RENDERER_CONFIG, A2uiRendererService, BasicCatalog} from '@a2ui/angular/v0_9';
|
|
36
36
|
|
|
37
37
|
export const appConfig: ApplicationConfig = {
|
|
38
38
|
providers: [
|
|
@@ -40,7 +40,7 @@ export const appConfig: ApplicationConfig = {
|
|
|
40
40
|
provide: A2UI_RENDERER_CONFIG,
|
|
41
41
|
useValue: {
|
|
42
42
|
catalogs: [new BasicCatalog()],
|
|
43
|
-
actionHandler:
|
|
43
|
+
actionHandler: action => {
|
|
44
44
|
console.log('Action received:', action);
|
|
45
45
|
},
|
|
46
46
|
},
|
|
@@ -57,8 +57,8 @@ export const appConfig: ApplicationConfig = {
|
|
|
57
57
|
The simplest way to render an A2UI surface is using the `SurfaceComponent`. This component handles setting up the root `ComponentHost` for you.
|
|
58
58
|
|
|
59
59
|
```typescript
|
|
60
|
-
import {
|
|
61
|
-
import {
|
|
60
|
+
import {Component} from '@angular/core';
|
|
61
|
+
import {SurfaceComponent} from '@a2ui/angular/v0_9';
|
|
62
62
|
|
|
63
63
|
@Component({
|
|
64
64
|
selector: 'app-root',
|
|
@@ -74,8 +74,8 @@ export class AppComponent {}
|
|
|
74
74
|
For more fine-grained control, use the `ComponentHostComponent` to render specific components within a surface:
|
|
75
75
|
|
|
76
76
|
```typescript
|
|
77
|
-
import {
|
|
78
|
-
import {
|
|
77
|
+
import {Component} from '@angular/core';
|
|
78
|
+
import {ComponentHostComponent} from '@a2ui/angular/v0_9';
|
|
79
79
|
|
|
80
80
|
@Component({
|
|
81
81
|
selector: 'app-custom-layout',
|
|
@@ -25,8 +25,8 @@ class MessageProcessor {
|
|
|
25
25
|
baseProcessor;
|
|
26
26
|
eventsSubject = new Subject();
|
|
27
27
|
events = this.eventsSubject.asObservable();
|
|
28
|
-
// Signal to track the version of the data in the MessageProcessor. Since the base processor updates
|
|
29
|
-
// surfaces in-place (mutating the Map), we use this to force Angular's change detection to
|
|
28
|
+
// Signal to track the version of the data in the MessageProcessor. Since the base processor updates
|
|
29
|
+
// surfaces in-place (mutating the Map), we use this to force Angular's change detection to
|
|
30
30
|
// re-evaluate any components or effects that depend on getSurfaces().
|
|
31
31
|
versionSignal = signal(0, ...(ngDevMode ? [{ debugName: "versionSignal" }] : /* istanbul ignore next */ []));
|
|
32
32
|
version = this.versionSignal.asReadonly();
|
|
@@ -38,7 +38,7 @@ class MessageProcessor {
|
|
|
38
38
|
* This should be called after any update to the underlying base processor's surfaces.
|
|
39
39
|
*/
|
|
40
40
|
notify() {
|
|
41
|
-
this.versionSignal.update(
|
|
41
|
+
this.versionSignal.update(v => v + 1);
|
|
42
42
|
}
|
|
43
43
|
processMessages(messages) {
|
|
44
44
|
this.baseProcessor.processMessages(messages);
|
|
@@ -48,8 +48,8 @@ class MessageProcessor {
|
|
|
48
48
|
const completion = new Subject();
|
|
49
49
|
const promise = new Promise((resolve, reject) => {
|
|
50
50
|
completion.subscribe({
|
|
51
|
-
next:
|
|
52
|
-
error:
|
|
51
|
+
next: msgs => resolve(msgs),
|
|
52
|
+
error: err => reject(err),
|
|
53
53
|
});
|
|
54
54
|
});
|
|
55
55
|
this.eventsSubject.next({ message, completion });
|
|
@@ -141,7 +141,7 @@ class DefaultMarkdownRenderer extends MarkdownRenderer {
|
|
|
141
141
|
}
|
|
142
142
|
catch (e) {
|
|
143
143
|
if (!DefaultMarkdownRenderer.warningLogged) {
|
|
144
|
-
console.warn(
|
|
144
|
+
console.warn('[DefaultMarkdownRenderer] Failed to load optional `@a2ui/markdown-it` renderer. Using fallback regex.');
|
|
145
145
|
DefaultMarkdownRenderer.warningLogged = true;
|
|
146
146
|
}
|
|
147
147
|
// Basic implementation for v0.8
|
|
@@ -409,8 +409,8 @@ class Renderer {
|
|
|
409
409
|
Renderer.hasInsertedStyles = true;
|
|
410
410
|
}
|
|
411
411
|
effect(() => {
|
|
412
|
-
// Explicitly depend on the MessageProcessor's version signal. This ensures that the effect re-runs
|
|
413
|
-
// whenever data model changes occur, even if the node's object reference remains identical
|
|
412
|
+
// Explicitly depend on the MessageProcessor's version signal. This ensures that the effect re-runs
|
|
413
|
+
// whenever data model changes occur, even if the node's object reference remains identical
|
|
414
414
|
// (as in the case of in-place mutations from local updates).
|
|
415
415
|
this.processor.version();
|
|
416
416
|
let node = this.component();
|
|
@@ -431,7 +431,7 @@ class Renderer {
|
|
|
431
431
|
const type = node.type;
|
|
432
432
|
// Focus Loss Prevention:
|
|
433
433
|
// If we have an existing component and its unique identity (ID and Type) hasn't changed,
|
|
434
|
-
// we update its @Input() values in-place. This preserves the underlying DOM element,
|
|
434
|
+
// we update its @Input() values in-place. This preserves the underlying DOM element,
|
|
435
435
|
// maintaining focus, text selection, and cursor position.
|
|
436
436
|
if (this.currentComponentRef && this.currentId === id && this.currentType === type) {
|
|
437
437
|
this.updateInputs(this.currentComponentRef, node, surfaceId);
|
|
@@ -454,7 +454,7 @@ class Renderer {
|
|
|
454
454
|
render(container, node, surfaceId, config) {
|
|
455
455
|
const componentTypeOrPromise = this.resolveComponentType(config);
|
|
456
456
|
if (componentTypeOrPromise instanceof Promise) {
|
|
457
|
-
componentTypeOrPromise.then(
|
|
457
|
+
componentTypeOrPromise.then(componentType => {
|
|
458
458
|
// Ensure we are still supposed to render this component
|
|
459
459
|
if (this.currentId === node.id && this.currentType === node.type) {
|
|
460
460
|
const componentRef = container.createComponent(componentType);
|
|
@@ -491,13 +491,15 @@ class Renderer {
|
|
|
491
491
|
componentRef.setInput('surfaceId', surfaceId);
|
|
492
492
|
componentRef.setInput('component', node);
|
|
493
493
|
componentRef.setInput('weight', node.weight ?? 0);
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
494
|
+
if (node.properties) {
|
|
495
|
+
const props = node.properties;
|
|
496
|
+
for (const [key, value] of Object.entries(props)) {
|
|
497
|
+
try {
|
|
498
|
+
componentRef.setInput(key, value);
|
|
499
|
+
}
|
|
500
|
+
catch (e) {
|
|
501
|
+
console.warn(`[Renderer] Property "${key}" could not be set on component ${node.type}. If this property is required by the specification, ensure the component declares it as an input.`);
|
|
502
|
+
}
|
|
501
503
|
}
|
|
502
504
|
}
|
|
503
505
|
componentRef.changeDetectorRef.markForCheck();
|
|
@@ -638,22 +640,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
638
640
|
*/
|
|
639
641
|
class Checkbox extends DynamicComponent {
|
|
640
642
|
label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
641
|
-
|
|
642
|
-
inputChecked = computed(() => super.resolvePrimitive(this.
|
|
643
|
+
value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
644
|
+
inputChecked = computed(() => super.resolvePrimitive(this.value()) ?? false, ...(ngDevMode ? [{ debugName: "inputChecked" }] : /* istanbul ignore next */ []));
|
|
643
645
|
resolvedLabel = computed(() => super.resolvePrimitive(this.label()), ...(ngDevMode ? [{ debugName: "resolvedLabel" }] : /* istanbul ignore next */ []));
|
|
644
646
|
inputId = super.getUniqueId('a2ui-checkbox');
|
|
645
647
|
onToggle(event) {
|
|
646
648
|
const checked = event.target.checked;
|
|
647
|
-
const checkedNode = this.
|
|
648
|
-
if (checkedNode &&
|
|
649
|
+
const checkedNode = this.value();
|
|
650
|
+
if (checkedNode &&
|
|
651
|
+
typeof checkedNode === 'object' &&
|
|
652
|
+
'path' in checkedNode &&
|
|
653
|
+
checkedNode.path) {
|
|
649
654
|
// Update the local data model directly to ensure immediate UI feedback and avoid unnecessary network requests.
|
|
650
|
-
this.processor.processMessages([
|
|
655
|
+
this.processor.processMessages([
|
|
656
|
+
{
|
|
651
657
|
dataModelUpdate: {
|
|
652
658
|
surfaceId: this.surfaceId(),
|
|
653
659
|
path: this.processor.resolvePath(checkedNode.path, this.component().dataContextPath),
|
|
654
660
|
contents: [{ key: '.', valueBoolean: checked }],
|
|
655
661
|
},
|
|
656
|
-
}
|
|
662
|
+
},
|
|
663
|
+
]);
|
|
657
664
|
}
|
|
658
665
|
else {
|
|
659
666
|
this.sendAction({
|
|
@@ -663,7 +670,7 @@ class Checkbox extends DynamicComponent {
|
|
|
663
670
|
}
|
|
664
671
|
}
|
|
665
672
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: Checkbox, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
666
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: Checkbox, isStandalone: true, selector: "a2ui-checkbox", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null },
|
|
673
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: Checkbox, isStandalone: true, selector: "a2ui-checkbox", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
667
674
|
<label>
|
|
668
675
|
<input
|
|
669
676
|
type="checkbox"
|
|
@@ -688,7 +695,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
688
695
|
{{ resolvedLabel() }}
|
|
689
696
|
</label>
|
|
690
697
|
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:flex;align-items:center;gap:.5rem}\n"] }]
|
|
691
|
-
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }],
|
|
698
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }] } });
|
|
692
699
|
|
|
693
700
|
/*
|
|
694
701
|
* Copyright 2025 Google LLC
|
|
@@ -773,13 +780,15 @@ class DateTimeInput extends DynamicComponent {
|
|
|
773
780
|
const valueNode = this.value();
|
|
774
781
|
if (valueNode && typeof valueNode === 'object' && 'path' in valueNode && valueNode.path) {
|
|
775
782
|
// Update the local data model directly to ensure immediate UI feedback and avoid unnecessary network requests.
|
|
776
|
-
this.processor.processMessages([
|
|
783
|
+
this.processor.processMessages([
|
|
784
|
+
{
|
|
777
785
|
dataModelUpdate: {
|
|
778
786
|
surfaceId: this.surfaceId(),
|
|
779
787
|
path: this.processor.resolvePath(valueNode.path, this.component().dataContextPath),
|
|
780
788
|
contents: [{ key: '.', valueString: value }],
|
|
781
789
|
},
|
|
782
|
-
}
|
|
790
|
+
},
|
|
791
|
+
]);
|
|
783
792
|
}
|
|
784
793
|
else {
|
|
785
794
|
this.handleAction('change', { value });
|
|
@@ -1033,11 +1042,7 @@ class Modal extends DynamicComponent {
|
|
|
1033
1042
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: Modal, isStandalone: true, selector: "a2ui-modal", inputs: { entryPointChild: { classPropertyName: "entryPointChild", publicName: "entryPointChild", isSignal: true, isRequired: true, transformFunction: null }, contentChild: { classPropertyName: "contentChild", publicName: "contentChild", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
1034
1043
|
<div class="a2ui-modal-entry-point" (click)="openModal()">
|
|
1035
1044
|
@if (entryPointChild()) {
|
|
1036
|
-
<ng-container
|
|
1037
|
-
a2ui-renderer
|
|
1038
|
-
[surfaceId]="surfaceId()!"
|
|
1039
|
-
[component]="entryPointChild()!"
|
|
1040
|
-
/>
|
|
1045
|
+
<ng-container a2ui-renderer [surfaceId]="surfaceId()!" [component]="entryPointChild()!" />
|
|
1041
1046
|
}
|
|
1042
1047
|
</div>
|
|
1043
1048
|
|
|
@@ -1045,11 +1050,7 @@ class Modal extends DynamicComponent {
|
|
|
1045
1050
|
<div [class]="theme.components.Modal.backdrop" (click)="closeModal()">
|
|
1046
1051
|
<div [class]="theme.components.Modal.element" (click)="$event.stopPropagation()">
|
|
1047
1052
|
@if (contentChild()) {
|
|
1048
|
-
<ng-container
|
|
1049
|
-
a2ui-renderer
|
|
1050
|
-
[surfaceId]="surfaceId()!"
|
|
1051
|
-
[component]="contentChild()!"
|
|
1052
|
-
/>
|
|
1053
|
+
<ng-container a2ui-renderer [surfaceId]="surfaceId()!" [component]="contentChild()!" />
|
|
1053
1054
|
}
|
|
1054
1055
|
</div>
|
|
1055
1056
|
</div>
|
|
@@ -1061,11 +1062,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
1061
1062
|
args: [{ selector: 'a2ui-modal', imports: [Renderer], template: `
|
|
1062
1063
|
<div class="a2ui-modal-entry-point" (click)="openModal()">
|
|
1063
1064
|
@if (entryPointChild()) {
|
|
1064
|
-
<ng-container
|
|
1065
|
-
a2ui-renderer
|
|
1066
|
-
[surfaceId]="surfaceId()!"
|
|
1067
|
-
[component]="entryPointChild()!"
|
|
1068
|
-
/>
|
|
1065
|
+
<ng-container a2ui-renderer [surfaceId]="surfaceId()!" [component]="entryPointChild()!" />
|
|
1069
1066
|
}
|
|
1070
1067
|
</div>
|
|
1071
1068
|
|
|
@@ -1073,11 +1070,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
1073
1070
|
<div [class]="theme.components.Modal.backdrop" (click)="closeModal()">
|
|
1074
1071
|
<div [class]="theme.components.Modal.element" (click)="$event.stopPropagation()">
|
|
1075
1072
|
@if (contentChild()) {
|
|
1076
|
-
<ng-container
|
|
1077
|
-
a2ui-renderer
|
|
1078
|
-
[surfaceId]="surfaceId()!"
|
|
1079
|
-
[component]="contentChild()!"
|
|
1080
|
-
/>
|
|
1073
|
+
<ng-container a2ui-renderer [surfaceId]="surfaceId()!" [component]="contentChild()!" />
|
|
1081
1074
|
}
|
|
1082
1075
|
</div>
|
|
1083
1076
|
</div>
|
|
@@ -1106,7 +1099,7 @@ class MultipleChoice extends DynamicComponent {
|
|
|
1106
1099
|
selections = input.required(...(ngDevMode ? [{ debugName: "selections" }] : /* istanbul ignore next */ []));
|
|
1107
1100
|
selectId = super.getUniqueId('a2ui-multiple-choice');
|
|
1108
1101
|
resolvedLabel = computed(() => this.resolvePrimitive(this.label()), ...(ngDevMode ? [{ debugName: "resolvedLabel" }] : /* istanbul ignore next */ []));
|
|
1109
|
-
resolvedOptions = computed(() => this.options().map(
|
|
1102
|
+
resolvedOptions = computed(() => this.options().map(opt => ({
|
|
1110
1103
|
label: this.resolvePrimitive(opt.label),
|
|
1111
1104
|
value: opt.value,
|
|
1112
1105
|
})), ...(ngDevMode ? [{ debugName: "resolvedOptions" }] : /* istanbul ignore next */ []));
|
|
@@ -1120,15 +1113,20 @@ class MultipleChoice extends DynamicComponent {
|
|
|
1120
1113
|
onChange(event) {
|
|
1121
1114
|
const value = event.target.value;
|
|
1122
1115
|
const selectionsNode = this.selections();
|
|
1123
|
-
if (selectionsNode &&
|
|
1116
|
+
if (selectionsNode &&
|
|
1117
|
+
typeof selectionsNode === 'object' &&
|
|
1118
|
+
'path' in selectionsNode &&
|
|
1119
|
+
selectionsNode.path) {
|
|
1124
1120
|
// Update the local data model directly to ensure immediate UI feedback and avoid unnecessary network requests.
|
|
1125
|
-
this.processor.processMessages([
|
|
1121
|
+
this.processor.processMessages([
|
|
1122
|
+
{
|
|
1126
1123
|
dataModelUpdate: {
|
|
1127
1124
|
surfaceId: this.surfaceId(),
|
|
1128
1125
|
path: this.processor.resolvePath(selectionsNode.path, this.component().dataContextPath),
|
|
1129
1126
|
contents: [{ key: '.', valueString: JSON.stringify({ literalArray: [value] }) }],
|
|
1130
1127
|
},
|
|
1131
|
-
}
|
|
1128
|
+
},
|
|
1129
|
+
]);
|
|
1132
1130
|
}
|
|
1133
1131
|
else {
|
|
1134
1132
|
this.handleAction('change', { value });
|
|
@@ -1269,13 +1267,15 @@ class Slider extends DynamicComponent {
|
|
|
1269
1267
|
const valueNode = this.value();
|
|
1270
1268
|
if (valueNode && typeof valueNode === 'object' && 'path' in valueNode && valueNode.path) {
|
|
1271
1269
|
// Update the local data model directly to ensure immediate UI feedback and avoid unnecessary network requests.
|
|
1272
|
-
this.processor.processMessages([
|
|
1270
|
+
this.processor.processMessages([
|
|
1271
|
+
{
|
|
1273
1272
|
dataModelUpdate: {
|
|
1274
1273
|
surfaceId: this.surfaceId(),
|
|
1275
1274
|
path: this.processor.resolvePath(valueNode.path, this.component().dataContextPath),
|
|
1276
1275
|
contents: [{ key: '.', valueNumber: value }],
|
|
1277
1276
|
},
|
|
1278
|
-
}
|
|
1277
|
+
},
|
|
1278
|
+
]);
|
|
1279
1279
|
}
|
|
1280
1280
|
else {
|
|
1281
1281
|
this.handleAction('change', { value });
|
|
@@ -1300,7 +1300,7 @@ class Slider extends DynamicComponent {
|
|
|
1300
1300
|
type="range"
|
|
1301
1301
|
[class]="theme.components.Slider.element"
|
|
1302
1302
|
[id]="inputId"
|
|
1303
|
-
[attr.aria-
|
|
1303
|
+
[attr.aria-label]="resolvedLabel() ? resolvedLabel() : 'Slider'"
|
|
1304
1304
|
[min]="minValue()"
|
|
1305
1305
|
[max]="maxValue()"
|
|
1306
1306
|
[value]="resolvedValue() ?? 0"
|
|
@@ -1320,7 +1320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
1320
1320
|
type="range"
|
|
1321
1321
|
[class]="theme.components.Slider.element"
|
|
1322
1322
|
[id]="inputId"
|
|
1323
|
-
[attr.aria-
|
|
1323
|
+
[attr.aria-label]="resolvedLabel() ? resolvedLabel() : 'Slider'"
|
|
1324
1324
|
[min]="minValue()"
|
|
1325
1325
|
[max]="maxValue()"
|
|
1326
1326
|
[value]="resolvedValue() ?? 0"
|
|
@@ -1471,7 +1471,7 @@ class Text extends DynamicComponent {
|
|
|
1471
1471
|
return false;
|
|
1472
1472
|
}
|
|
1473
1473
|
const expected = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'caption', 'body'];
|
|
1474
|
-
return expected.every(
|
|
1474
|
+
return expected.every(v => v in styles);
|
|
1475
1475
|
}
|
|
1476
1476
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: Text, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
1477
1477
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: Text, isStandalone: true, selector: "a2ui-text", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, usageHint: { classPropertyName: "usageHint", publicName: "usageHint", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: `
|
|
@@ -1530,13 +1530,15 @@ class TextField extends DynamicComponent {
|
|
|
1530
1530
|
const textNode = this.text();
|
|
1531
1531
|
if (textNode && typeof textNode === 'object' && 'path' in textNode && textNode.path) {
|
|
1532
1532
|
// Update the local data model directly to ensure immediate UI feedback and avoid unnecessary network requests.
|
|
1533
|
-
this.processor.processMessages([
|
|
1533
|
+
this.processor.processMessages([
|
|
1534
|
+
{
|
|
1534
1535
|
dataModelUpdate: {
|
|
1535
1536
|
surfaceId: this.surfaceId(),
|
|
1536
1537
|
path: this.processor.resolvePath(textNode.path, this.component().dataContextPath),
|
|
1537
1538
|
contents: [{ key: '.', valueString: value }],
|
|
1538
1539
|
},
|
|
1539
|
-
}
|
|
1540
|
+
},
|
|
1541
|
+
]);
|
|
1540
1542
|
}
|
|
1541
1543
|
else {
|
|
1542
1544
|
this.handleAction('input', { value });
|
|
@@ -1773,6 +1775,10 @@ function provideA2UI(config) {
|
|
|
1773
1775
|
* limitations under the License.
|
|
1774
1776
|
*/
|
|
1775
1777
|
|
|
1778
|
+
var types = /*#__PURE__*/Object.freeze({
|
|
1779
|
+
__proto__: null
|
|
1780
|
+
});
|
|
1781
|
+
|
|
1776
1782
|
/**
|
|
1777
1783
|
* Copyright 2026 Google LLC
|
|
1778
1784
|
*
|
|
@@ -1793,5 +1799,5 @@ function provideA2UI(config) {
|
|
|
1793
1799
|
* Generated bundle index. Do not edit.
|
|
1794
1800
|
*/
|
|
1795
1801
|
|
|
1796
|
-
export { AudioPlayer, Button, Card, Catalog, Checkbox, Column, DEFAULT_CATALOG, DateTimeInput, Divider, DynamicComponent, Icon, Image, List, MessageProcessor, Modal, MultipleChoice, Renderer, Row, Slider, Surface, Tabs, Text, TextField, Theme, Video, provideA2UI, provideMarkdownRenderer, registerStandardComponents };
|
|
1802
|
+
export { AudioPlayer, Button, Card, Catalog, Checkbox, Column, DEFAULT_CATALOG, DateTimeInput, Divider, DynamicComponent, Icon, Image, List, MessageProcessor, Modal, MultipleChoice, Renderer, Row, Slider, Surface, Tabs, Text, TextField, Theme, types as Types, Video, provideA2UI, provideMarkdownRenderer, registerStandardComponents };
|
|
1797
1803
|
//# sourceMappingURL=a2ui-angular-src-v0_8.mjs.map
|