diff --git a/CHANGELOG.md b/CHANGELOG.md index bb7437a85..7d62719c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.0.22 — 2026-05-04 + +### Added + +- **`@ngaf/chat`** — markdown view components for GFM tables (`chat-md-table`, `chat-md-table-row`, `chat-md-table-cell`) and task-list checkbox prefix on `MarkdownListItemComponent`. The view registry now exposes all 22 node types emitted by `@cacheplane/partial-markdown@0.2.0`. + +### Changed + +- All 16 @ngaf libraries synchronized to `0.0.22`. + +--- + ## 0.0.21 — 2026-05-04 ### Added diff --git a/libs/a2ui/package.json b/libs/a2ui/package.json index aeccdaf61..f06350e23 100644 --- a/libs/a2ui/package.json +++ b/libs/a2ui/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/a2ui", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/ag-ui/package.json b/libs/ag-ui/package.json index 62d345df2..cdc872150 100644 --- a/libs/ag-ui/package.json +++ b/libs/ag-ui/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/ag-ui", - "version": "0.0.21", + "version": "0.0.22", "peerDependencies": { "@ngaf/chat": "*", "@ngaf/licensing": "*", diff --git a/libs/chat/package.json b/libs/chat/package.json index 383a8991c..d054b8c03 100644 --- a/libs/chat/package.json +++ b/libs/chat/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/chat", - "version": "0.0.21", + "version": "0.0.22", "exports": { ".": { "types": "./index.d.ts", diff --git a/libs/chat/src/lib/markdown/cacheplane-markdown-views.spec.ts b/libs/chat/src/lib/markdown/cacheplane-markdown-views.spec.ts index a17883971..62b1ecb24 100644 --- a/libs/chat/src/lib/markdown/cacheplane-markdown-views.spec.ts +++ b/libs/chat/src/lib/markdown/cacheplane-markdown-views.spec.ts @@ -4,7 +4,7 @@ import { describe, it, expect } from 'vitest'; import { cacheplaneMarkdownViews } from './cacheplane-markdown-views'; describe('cacheplaneMarkdownViews', () => { - it('registers all 19 markdown node types (v0.2 adds citation-reference)', () => { + it('registers all 22 markdown node types (v0.2 adds table, table-row, table-cell)', () => { expect(Object.keys(cacheplaneMarkdownViews).sort()).toEqual([ 'autolink', 'blockquote', @@ -23,6 +23,9 @@ describe('cacheplaneMarkdownViews', () => { 'soft-break', 'strikethrough', 'strong', + 'table', + 'table-cell', + 'table-row', 'text', 'thematic-break', ]); diff --git a/libs/chat/src/lib/markdown/cacheplane-markdown-views.ts b/libs/chat/src/lib/markdown/cacheplane-markdown-views.ts index b0d468797..49c305478 100644 --- a/libs/chat/src/lib/markdown/cacheplane-markdown-views.ts +++ b/libs/chat/src/lib/markdown/cacheplane-markdown-views.ts @@ -20,10 +20,13 @@ import { MarkdownImageComponent } from './views/markdown-image.component'; import { MarkdownSoftBreakComponent } from './views/markdown-soft-break.component'; import { MarkdownHardBreakComponent } from './views/markdown-hard-break.component'; import { MarkdownCitationReferenceComponent } from './views/markdown-citation-reference.component'; +import { MarkdownTableComponent } from './views/markdown-table.component'; +import { MarkdownTableRowComponent } from './views/markdown-table-row.component'; +import { MarkdownTableCellComponent } from './views/markdown-table-cell.component'; /** * Default view registry consumed by . Maps every - * MarkdownNode.type emitted by @cacheplane/partial-markdown@0.1 to its + * MarkdownNode.type emitted by @cacheplane/partial-markdown@0.2 to its * corresponding Angular component. * * Override per-node-type via `withViews(cacheplaneMarkdownViews, { … })`. @@ -48,4 +51,7 @@ export const cacheplaneMarkdownViews: ViewRegistry = views({ 'soft-break': MarkdownSoftBreakComponent, 'hard-break': MarkdownHardBreakComponent, 'citation-reference': MarkdownCitationReferenceComponent, + 'table': MarkdownTableComponent, + 'table-row': MarkdownTableRowComponent, + 'table-cell': MarkdownTableCellComponent, }); diff --git a/libs/chat/src/lib/markdown/markdown-table-row.token.ts b/libs/chat/src/lib/markdown/markdown-table-row.token.ts new file mode 100644 index 000000000..79daf1c1d --- /dev/null +++ b/libs/chat/src/lib/markdown/markdown-table-row.token.ts @@ -0,0 +1,13 @@ +// libs/chat/src/lib/markdown/markdown-table-row.token.ts +// SPDX-License-Identifier: MIT +import { InjectionToken, Signal, signal } from '@angular/core'; + +/** + * Provided by MarkdownTableRowComponent for header rows so that + * MarkdownTableCellComponent can render instead of . + * The value is a Signal so that it tracks the row's isHeader reactively. + */ +export const IS_HEADER_ROW = new InjectionToken>('IS_HEADER_ROW', { + providedIn: null, + factory: () => signal(false), +}); diff --git a/libs/chat/src/lib/markdown/views/markdown-list-item.component.spec.ts b/libs/chat/src/lib/markdown/views/markdown-list-item.component.spec.ts new file mode 100644 index 000000000..bd877e704 --- /dev/null +++ b/libs/chat/src/lib/markdown/views/markdown-list-item.component.spec.ts @@ -0,0 +1,87 @@ +// libs/chat/src/lib/markdown/views/markdown-list-item.component.spec.ts +// SPDX-License-Identifier: MIT +import { describe, it, expect, beforeEach } from 'vitest'; +import { TestBed } from '@angular/core/testing'; +import { Component, signal } from '@angular/core'; +import { views } from '@ngaf/render'; +import type { MarkdownListItemNode } from '@cacheplane/partial-markdown'; +import { MarkdownListItemComponent } from './markdown-list-item.component'; +import { MarkdownTextComponent } from './markdown-text.component'; +import { MARKDOWN_VIEW_REGISTRY } from '../markdown-view-registry'; + +function makeItemNode(task?: { checked: boolean }): MarkdownListItemNode { + return { + id: 10, type: 'list-item', status: 'complete', + parent: null, index: null, + task, + children: [], + } as MarkdownListItemNode; +} + +@Component({ + standalone: true, + imports: [MarkdownListItemComponent], + template: ``, +}) +class HostComponent { + node = signal(makeItemNode()); +} + +describe('MarkdownListItemComponent', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HostComponent], + providers: [{ + provide: MARKDOWN_VIEW_REGISTRY, + useValue: views({ 'text': MarkdownTextComponent }), + }], + }); + }); + + it('renders a
  • element', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('li')).toBeTruthy(); + }); + + it('does not render a checkbox for plain items', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('input[type="checkbox"]')).toBeFalsy(); + }); + + it('does not apply task class for plain items', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + const li = fixture.nativeElement.querySelector('li'); + expect(li.classList.contains('chat-md-list-item--task')).toBe(false); + }); + + it('renders a disabled unchecked checkbox for task items (unchecked)', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.componentInstance.node.set(makeItemNode({ checked: false })); + fixture.detectChanges(); + const checkbox = fixture.nativeElement.querySelector('input[type="checkbox"]'); + expect(checkbox).toBeTruthy(); + expect(checkbox.disabled).toBe(true); + expect(checkbox.checked).toBe(false); + }); + + it('renders a disabled checked checkbox for task items (checked)', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.componentInstance.node.set(makeItemNode({ checked: true })); + fixture.detectChanges(); + const checkbox = fixture.nativeElement.querySelector('input[type="checkbox"]'); + expect(checkbox).toBeTruthy(); + expect(checkbox.disabled).toBe(true); + expect(checkbox.checked).toBe(true); + }); + + it('applies task class when task is defined', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.componentInstance.node.set(makeItemNode({ checked: false })); + fixture.detectChanges(); + const li = fixture.nativeElement.querySelector('li'); + expect(li.classList.contains('chat-md-list-item--task')).toBe(true); + }); +}); diff --git a/libs/chat/src/lib/markdown/views/markdown-list-item.component.ts b/libs/chat/src/lib/markdown/views/markdown-list-item.component.ts index 20cc64f33..6700ecfbd 100644 --- a/libs/chat/src/lib/markdown/views/markdown-list-item.component.ts +++ b/libs/chat/src/lib/markdown/views/markdown-list-item.component.ts @@ -9,7 +9,14 @@ import { MarkdownChildrenComponent } from '../markdown-children.component'; standalone: true, imports: [MarkdownChildrenComponent], changeDetection: ChangeDetectionStrategy.OnPush, - template: `
  • `, + template: ` +
  • + @if (node().task !== undefined) { + + } + +
  • + `, }) export class MarkdownListItemComponent { readonly node = input.required(); diff --git a/libs/chat/src/lib/markdown/views/markdown-table-cell.component.spec.ts b/libs/chat/src/lib/markdown/views/markdown-table-cell.component.spec.ts new file mode 100644 index 000000000..319af6b70 --- /dev/null +++ b/libs/chat/src/lib/markdown/views/markdown-table-cell.component.spec.ts @@ -0,0 +1,78 @@ +// libs/chat/src/lib/markdown/views/markdown-table-cell.component.spec.ts +// SPDX-License-Identifier: MIT +import { describe, it, expect, beforeEach } from 'vitest'; +import { TestBed } from '@angular/core/testing'; +import { Component, signal, Signal } from '@angular/core'; +import { views } from '@ngaf/render'; +import type { MarkdownTableCellNode } from '@cacheplane/partial-markdown'; +import { MarkdownTableCellComponent } from './markdown-table-cell.component'; +import { MarkdownTextComponent } from './markdown-text.component'; +import { IS_HEADER_ROW } from '../markdown-table-row.token'; +import { MARKDOWN_VIEW_REGISTRY } from '../markdown-view-registry'; + +function makeCellNode(alignment: MarkdownTableCellNode['alignment'] = null): MarkdownTableCellNode { + return { + id: 3, type: 'table-cell', status: 'complete', + parent: null, index: null, + alignment, + children: [], + } as MarkdownTableCellNode; +} + +@Component({ + standalone: true, + imports: [MarkdownTableCellComponent], + template: ``, +}) +class HostComponent { + node = signal(makeCellNode()); +} + +describe('MarkdownTableCellComponent', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HostComponent], + providers: [{ + provide: MARKDOWN_VIEW_REGISTRY, + useValue: views({ 'text': MarkdownTextComponent }), + }], + }); + }); + + it('renders by default (no IS_HEADER_ROW token)', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('td')).toBeTruthy(); + expect(fixture.nativeElement.querySelector('th')).toBeFalsy(); + }); + + it('renders when IS_HEADER_ROW token is true', () => { + TestBed.overrideProvider(IS_HEADER_ROW, { useValue: signal(true) as Signal }); + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('th')).toBeTruthy(); + expect(fixture.nativeElement.querySelector('td')).toBeFalsy(); + }); + + it('does not set text-align style when alignment is null', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + const td = fixture.nativeElement.querySelector('td'); + expect(td.style.textAlign).toBe(''); + }); + + it('sets text-align style from alignment value', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.componentInstance.node.set(makeCellNode('center')); + fixture.detectChanges(); + const td = fixture.nativeElement.querySelector('td'); + expect(td.style.textAlign).toBe('center'); + }); + + it('applies chat-md-table-cell class', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + const el = fixture.nativeElement.querySelector('td') ?? fixture.nativeElement.querySelector('th'); + expect(el.classList.contains('chat-md-table-cell')).toBe(true); + }); +}); diff --git a/libs/chat/src/lib/markdown/views/markdown-table-cell.component.ts b/libs/chat/src/lib/markdown/views/markdown-table-cell.component.ts new file mode 100644 index 000000000..d136320fa --- /dev/null +++ b/libs/chat/src/lib/markdown/views/markdown-table-cell.component.ts @@ -0,0 +1,31 @@ +// libs/chat/src/lib/markdown/views/markdown-table-cell.component.ts +// SPDX-License-Identifier: MIT +import { Component, ChangeDetectionStrategy, input, inject, computed } from '@angular/core'; +import type { MarkdownTableCellNode } from '@cacheplane/partial-markdown'; +import { MarkdownChildrenComponent } from '../markdown-children.component'; +import { IS_HEADER_ROW } from '../markdown-table-row.token'; + +@Component({ + selector: 'chat-md-table-cell', + standalone: true, + imports: [MarkdownChildrenComponent], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + @if (isHeader()) { + + + + } @else { + + + + } + `, +}) +export class MarkdownTableCellComponent { + readonly node = input.required(); + + private readonly isHeaderRowToken = inject(IS_HEADER_ROW, { optional: true }); + protected readonly isHeader = computed(() => this.isHeaderRowToken ? this.isHeaderRowToken() : false); + protected readonly alignment = computed(() => this.node().alignment); +} diff --git a/libs/chat/src/lib/markdown/views/markdown-table-row.component.spec.ts b/libs/chat/src/lib/markdown/views/markdown-table-row.component.spec.ts new file mode 100644 index 000000000..d8998044d --- /dev/null +++ b/libs/chat/src/lib/markdown/views/markdown-table-row.component.spec.ts @@ -0,0 +1,67 @@ +// libs/chat/src/lib/markdown/views/markdown-table-row.component.spec.ts +// SPDX-License-Identifier: MIT +import { describe, it, expect, beforeEach } from 'vitest'; +import { TestBed } from '@angular/core/testing'; +import { Component, signal } from '@angular/core'; +import { views } from '@ngaf/render'; +import type { MarkdownTableRowNode } from '@cacheplane/partial-markdown'; +import { MarkdownTableRowComponent } from './markdown-table-row.component'; +import { MarkdownTableCellComponent } from './markdown-table-cell.component'; +import { MARKDOWN_VIEW_REGISTRY } from '../markdown-view-registry'; + +function makeRowNode(isHeader: boolean, children: MarkdownTableRowNode['children'] = []): MarkdownTableRowNode { + return { + id: 2, type: 'table-row', status: 'complete', + parent: null, index: null, + isHeader, + children, + } as MarkdownTableRowNode; +} + +@Component({ + standalone: true, + imports: [MarkdownTableRowComponent], + template: ``, +}) +class HostComponent { + node = signal(makeRowNode(false)); +} + +describe('MarkdownTableRowComponent', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HostComponent], + providers: [{ + provide: MARKDOWN_VIEW_REGISTRY, + useValue: views({ 'table-cell': MarkdownTableCellComponent }), + }], + }); + }); + + it('renders a element', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('tr')).toBeTruthy(); + }); + + it('applies chat-md-table-row class', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('tr.chat-md-table-row')).toBeTruthy(); + }); + + it('does NOT apply header class for body rows', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + const tr = fixture.nativeElement.querySelector('tr'); + expect(tr.classList.contains('chat-md-table-row--header')).toBe(false); + }); + + it('applies header class for header rows', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.componentInstance.node.set(makeRowNode(true)); + fixture.detectChanges(); + const tr = fixture.nativeElement.querySelector('tr'); + expect(tr.classList.contains('chat-md-table-row--header')).toBe(true); + }); +}); diff --git a/libs/chat/src/lib/markdown/views/markdown-table-row.component.ts b/libs/chat/src/lib/markdown/views/markdown-table-row.component.ts new file mode 100644 index 000000000..96432e107 --- /dev/null +++ b/libs/chat/src/lib/markdown/views/markdown-table-row.component.ts @@ -0,0 +1,30 @@ +// libs/chat/src/lib/markdown/views/markdown-table-row.component.ts +// SPDX-License-Identifier: MIT +import { Component, ChangeDetectionStrategy, input, computed, inject } from '@angular/core'; +import type { MarkdownTableRowNode } from '@cacheplane/partial-markdown'; +import { MarkdownChildrenComponent } from '../markdown-children.component'; +import { IS_HEADER_ROW } from '../markdown-table-row.token'; + +@Component({ + selector: 'chat-md-table-row', + standalone: true, + imports: [MarkdownChildrenComponent], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + + + + `, + providers: [ + { + provide: IS_HEADER_ROW, + useFactory: () => { + const comp = inject(MarkdownTableRowComponent); + return computed(() => comp.node().isHeader); + }, + }, + ], +}) +export class MarkdownTableRowComponent { + readonly node = input.required(); +} diff --git a/libs/chat/src/lib/markdown/views/markdown-table.component.spec.ts b/libs/chat/src/lib/markdown/views/markdown-table.component.spec.ts new file mode 100644 index 000000000..edcfb3ff8 --- /dev/null +++ b/libs/chat/src/lib/markdown/views/markdown-table.component.spec.ts @@ -0,0 +1,64 @@ +// libs/chat/src/lib/markdown/views/markdown-table.component.spec.ts +// SPDX-License-Identifier: MIT +import { describe, it, expect, beforeEach } from 'vitest'; +import { TestBed } from '@angular/core/testing'; +import { Component, signal } from '@angular/core'; +import { views } from '@ngaf/render'; +import type { MarkdownTableNode } from '@cacheplane/partial-markdown'; +import { MarkdownTableComponent } from './markdown-table.component'; +import { MarkdownTableRowComponent } from './markdown-table-row.component'; +import { MarkdownTableCellComponent } from './markdown-table-cell.component'; +import { MARKDOWN_VIEW_REGISTRY } from '../markdown-view-registry'; + +function makeTableNode(overrides: Partial = {}): MarkdownTableNode { + return { + id: 1, type: 'table', status: 'complete', + parent: null, index: null, + alignments: [], + children: [], + ...overrides, + } as MarkdownTableNode; +} + +@Component({ + standalone: true, + imports: [MarkdownTableComponent], + template: ``, +}) +class HostComponent { + node = signal(makeTableNode()); +} + +describe('MarkdownTableComponent', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HostComponent], + providers: [{ + provide: MARKDOWN_VIEW_REGISTRY, + useValue: views({ + 'table-row': MarkdownTableRowComponent, + 'table-cell': MarkdownTableCellComponent, + }), + }], + }); + }); + + it('renders a element', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('table')).toBeTruthy(); + }); + + it('applies chat-md-table class', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('table.chat-md-table')).toBeTruthy(); + }); + + it('renders and sections', () => { + const fixture = TestBed.createComponent(HostComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('thead')).toBeTruthy(); + expect(fixture.nativeElement.querySelector('tbody')).toBeTruthy(); + }); +}); diff --git a/libs/chat/src/lib/markdown/views/markdown-table.component.ts b/libs/chat/src/lib/markdown/views/markdown-table.component.ts new file mode 100644 index 000000000..71b661cf7 --- /dev/null +++ b/libs/chat/src/lib/markdown/views/markdown-table.component.ts @@ -0,0 +1,39 @@ +// libs/chat/src/lib/markdown/views/markdown-table.component.ts +// SPDX-License-Identifier: MIT +import { Component, ChangeDetectionStrategy, input, computed } from '@angular/core'; +import type { MarkdownTableNode, MarkdownTableRowNode } from '@cacheplane/partial-markdown'; +import { MarkdownChildrenComponent } from '../markdown-children.component'; + +@Component({ + selector: 'chat-md-table', + standalone: true, + imports: [MarkdownChildrenComponent], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` +
    + + @if (headerRow(); as row) { + + } + + + @for (row of bodyRows(); track $any(row)) { + + } + +
    + `, +}) +export class MarkdownTableComponent { + readonly node = input.required(); + + protected readonly headerRow = computed(() => { + const rows = this.node().children; + return rows.length > 0 && rows[0].isHeader ? rows[0] : null; + }); + + protected readonly bodyRows = computed(() => { + const rows = this.node().children; + return rows[0]?.isHeader ? rows.slice(1) : rows; + }); +} diff --git a/libs/chat/src/lib/styles/chat-markdown.styles.ts b/libs/chat/src/lib/styles/chat-markdown.styles.ts index d8f9495ab..efd16183c 100644 --- a/libs/chat/src/lib/styles/chat-markdown.styles.ts +++ b/libs/chat/src/lib/styles/chat-markdown.styles.ts @@ -110,6 +110,13 @@ export const CHAT_MARKDOWN_STYLES = ` vertical-align: top; } chat-streaming-md th { font-weight: 600; } + /* Component-rendered table: make wrapper elements layout-transparent */ + chat-streaming-md chat-md-table { display: contents; } + chat-streaming-md chat-md-table-row { display: contents; } + chat-streaming-md chat-md-table-cell { display: contents; } + /* Task-list items */ + chat-streaming-md li.chat-md-list-item--task { list-style: none; margin-left: -1.25rem; } + chat-streaming-md li.chat-md-list-item--task > input[type="checkbox"] { margin-right: 0.5rem; vertical-align: middle; } /* Media */ chat-streaming-md img { max-width: 100%; height: auto; border-radius: 6px; } diff --git a/libs/chat/src/public-api.ts b/libs/chat/src/public-api.ts index da8584c2b..5fe33a155 100644 --- a/libs/chat/src/public-api.ts +++ b/libs/chat/src/public-api.ts @@ -112,6 +112,10 @@ export { MarkdownImageComponent } from './lib/markdown/views/markdown-i export { MarkdownSoftBreakComponent } from './lib/markdown/views/markdown-soft-break.component'; export { MarkdownHardBreakComponent } from './lib/markdown/views/markdown-hard-break.component'; export { MarkdownCitationReferenceComponent } from './lib/markdown/views/markdown-citation-reference.component'; +export { MarkdownTableComponent } from './lib/markdown/views/markdown-table.component'; +export { MarkdownTableRowComponent } from './lib/markdown/views/markdown-table-row.component'; +export { MarkdownTableCellComponent } from './lib/markdown/views/markdown-table-cell.component'; +export { IS_HEADER_ROW } from './lib/markdown/markdown-table-row.token'; // Shared styles & utilities export { CHAT_MARKDOWN_STYLES } from './lib/styles/chat-markdown.styles'; diff --git a/libs/cockpit-docs/package.json b/libs/cockpit-docs/package.json index 4d4886bad..e3b9418b6 100644 --- a/libs/cockpit-docs/package.json +++ b/libs/cockpit-docs/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/cockpit-docs", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/cockpit-registry/package.json b/libs/cockpit-registry/package.json index bde74b544..5cc35a366 100644 --- a/libs/cockpit-registry/package.json +++ b/libs/cockpit-registry/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/cockpit-registry", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/cockpit-shell/package.json b/libs/cockpit-shell/package.json index ac39a3531..8dc6ddca0 100644 --- a/libs/cockpit-shell/package.json +++ b/libs/cockpit-shell/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/cockpit-shell", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/cockpit-testing/package.json b/libs/cockpit-testing/package.json index 898e6c261..4bdf2912e 100644 --- a/libs/cockpit-testing/package.json +++ b/libs/cockpit-testing/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/cockpit-testing", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/cockpit-ui/package.json b/libs/cockpit-ui/package.json index 163461ea8..d62009481 100644 --- a/libs/cockpit-ui/package.json +++ b/libs/cockpit-ui/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/cockpit-ui", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/db/package.json b/libs/db/package.json index 946f87d05..58960426c 100644 --- a/libs/db/package.json +++ b/libs/db/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/db", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/design-tokens/package.json b/libs/design-tokens/package.json index 5a1fe550a..0f675eb04 100644 --- a/libs/design-tokens/package.json +++ b/libs/design-tokens/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/design-tokens", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/example-layouts/package.json b/libs/example-layouts/package.json index 3dcd55f5f..6d79819b2 100644 --- a/libs/example-layouts/package.json +++ b/libs/example-layouts/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/example-layouts", - "version": "0.0.21", + "version": "0.0.22", "peerDependencies": { "@angular/core": "^20.0.0 || ^21.0.0", "@angular/common": "^20.0.0 || ^21.0.0" diff --git a/libs/langgraph/package.json b/libs/langgraph/package.json index f75e357c3..16cedaba7 100644 --- a/libs/langgraph/package.json +++ b/libs/langgraph/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/langgraph", - "version": "0.0.21", + "version": "0.0.22", "peerDependencies": { "@ngaf/chat": "*", "@ngaf/licensing": "*", diff --git a/libs/licensing/package.json b/libs/licensing/package.json index ad96c85b5..20e2183ac 100644 --- a/libs/licensing/package.json +++ b/libs/licensing/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/licensing", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git", diff --git a/libs/partial-json/package.json b/libs/partial-json/package.json index ff6f4d202..e18f3bde1 100644 --- a/libs/partial-json/package.json +++ b/libs/partial-json/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/partial-json", - "version": "0.0.21", + "version": "0.0.22", "deprecated": "Replaced by @cacheplane/partial-json. No further versions will be published from this package.", "license": "MIT", "repository": { diff --git a/libs/render/package.json b/libs/render/package.json index 85291c860..29fc9dbcd 100644 --- a/libs/render/package.json +++ b/libs/render/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/render", - "version": "0.0.21", + "version": "0.0.22", "peerDependencies": { "@angular/core": "^20.0.0 || ^21.0.0", "@angular/common": "^20.0.0 || ^21.0.0", diff --git a/libs/ui-react/package.json b/libs/ui-react/package.json index bfc1182c6..ad8111788 100644 --- a/libs/ui-react/package.json +++ b/libs/ui-react/package.json @@ -1,6 +1,6 @@ { "name": "@ngaf/ui-react", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "repository": { "type": "git",