@theseam/ui-common 1.0.2-beta.83 → 1.0.2-beta.85
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/ai/index.d.ts +170 -17
- package/carousel/index.d.ts +21 -1
- package/datatable/index.d.ts +299 -3
- package/datatable-alterations-display/index.d.ts +61 -1
- package/fesm2022/theseam-ui-common-ai.mjs +433 -103
- package/fesm2022/theseam-ui-common-ai.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-carousel.mjs +48 -1
- package/fesm2022/theseam-ui-common-carousel.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs +197 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable.mjs +668 -4
- package/fesm2022/theseam-ui-common-datatable.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-file-input.mjs +156 -1
- package/fesm2022/theseam-ui-common-file-input.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-icon.mjs +72 -1
- package/fesm2022/theseam-ui-common-icon.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs +110 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-widget.mjs +23 -1
- package/fesm2022/theseam-ui-common-widget.mjs.map +1 -1
- package/file-input/index.d.ts +78 -1
- package/icon/index.d.ts +33 -3
- package/package.json +1 -1
- package/tooltip/index.d.ts +40 -2
- package/widget/index.d.ts +17 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theseam-ui-common-ai.mjs","sources":["../../../projects/ui-common/ai/providers/lm-studio.ai-provider.ts","../../../projects/ui-common/ai/providers/openrouter.ai-provider.ts","../../../projects/ui-common/ai/providers/mock.ai-provider.ts","../../../projects/ui-common/ai/chat-context-registry.service.ts","../../../projects/ui-common/ai/contexts/datatable-chat-context.ts","../../../projects/ui-common/ai/chat/chat-provider.ts","../../../projects/ui-common/ai/chat/chat-response-parser.ts","../../../projects/ui-common/ai/chat/chat-block-registry.ts","../../../projects/ui-common/ai/chat/chat-message.component.ts","../../../projects/ui-common/ai/chat/chat-input.component.ts","../../../projects/ui-common/ai/chat/chat.component.ts","../../../projects/ui-common/ai/chat/chat.component.html","../../../projects/ui-common/ai/chat/testing/chat.harness.ts","../../../projects/ui-common/ai/datatable-prompter/datatable-prompter-prompt-provider.ts","../../../projects/ui-common/ai/datatable-prompter/datatable-prompter.component.ts","../../../projects/ui-common/ai/datatable-prompter/datatable-prompter.component.html","../../../projects/ui-common/ai/theseam-ui-common-ai.ts"],"sourcesContent":["import {\n ChatResponse,\n TheSeamAiChatRequest,\n TheSeamAiProvider,\n} from './ai-provider'\n\nexport class LmStudioAiProvider implements TheSeamAiProvider {\n async chat(request: TheSeamAiChatRequest): Promise<ChatResponse> {\n const url = 'http://localhost:1234/v1/chat/completions'\n const headers = {\n 'Content-Type': 'application/json',\n }\n const model = 'model-identifier'\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n messages: request.messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n })\n\n const data = await response.json()\n const content = data.choices[0].message.content\n return { content }\n }\n}\n","import {\n ChatResponse,\n TheSeamAiChatRequest,\n TheSeamAiProvider,\n} from './ai-provider'\n\nexport class OpenRouterAiProvider implements TheSeamAiProvider {\n async chat(request: TheSeamAiChatRequest): Promise<ChatResponse> {\n const defaultApiKey =\n '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'\n\n const url = 'https://openrouter.ai/api/v1/chat/completions'\n const apiKey = localStorage.getItem('openrouter-api-key') || defaultApiKey\n const headers = {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n }\n const model = 'google/gemini-2.5-flash'\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n messages: request.messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n response_format: { type: 'json_object' },\n }),\n })\n\n const data = await response.json()\n const content = data.choices[0].message.content\n return { content }\n }\n}\n","import {\n ChatMessage,\n ChatResponse,\n TheSeamAiChatRequest,\n TheSeamAiProvider,\n} from './ai-provider'\n\ntype MockResponse = string | ((messages: ChatMessage[]) => string)\n\nexport class MockAiProvider implements TheSeamAiProvider {\n constructor(private readonly _response: MockResponse = 'Mock response') {}\n\n async chat(request: TheSeamAiChatRequest): Promise<ChatResponse> {\n const content =\n typeof this._response === 'function'\n ? this._response(request.messages)\n : this._response\n return { content }\n }\n}\n","import { Injectable } from '@angular/core'\n\nimport { TheSeamChatContext, TheSeamChatContextPayload } from './chat-context'\n\n@Injectable({ providedIn: 'root' })\nexport class TheSeamChatContextRegistry {\n private readonly _contexts = new Set<TheSeamChatContext>()\n\n /**\n * Register a context. Returns an unregister function — pair it with DestroyRef:\n * inject(DestroyRef).onDestroy(registry.register(ctx))\n */\n register(ctx: TheSeamChatContext): () => void {\n this._contexts.add(ctx)\n return () => this._contexts.delete(ctx)\n }\n\n unregister(ctx: TheSeamChatContext): void {\n this._contexts.delete(ctx)\n }\n\n /**\n * Resolve registered contexts to a wire-ready payload list. Applies the modal-mask\n * rule (a `modal`-typed context hides others unless they set `alwaysVisible`) and\n * drops entries whose `getContext()` returns null/undefined.\n */\n async snapshot(): Promise<TheSeamChatContextPayload[]> {\n const all = [...this._contexts]\n const masked = all.some((c) => c.type === 'modal')\n const visible = masked\n ? all.filter((c) => c.type === 'modal' || c.alwaysVisible)\n : all\n const resolved = await Promise.all(\n visible.map(async (c) => ({ type: c.type, data: await c.getContext() })),\n )\n return resolved.filter((p) => p.data != null)\n }\n}\n","import { OperationDefinitionNode, print } from 'graphql'\n\nimport { TheSeamDatatableColumn } from '@theseam/ui-common/datatable'\nimport {\n DatatableGraphQLQueryRef,\n processGql,\n} from '@theseam/ui-common/graphql'\n\nimport { TheSeamChatContext } from '../chat-context'\n\nexport interface TheSeamDatatableChatContextOptions {\n /** Optional human label, e.g. 'Bales'. Helps the LLM disambiguate when multiple datatables are registered. */\n label?: string\n}\n\nexport interface TheSeamDatatableChatContextData {\n label?: string\n operationName: string\n query: string\n variables: Record<string, unknown>\n columns: { prop: string | number | undefined; name: string | undefined }[]\n}\n\nexport class TheSeamDatatableChatContext implements TheSeamChatContext {\n readonly type = 'datatable'\n\n constructor(\n private readonly _queryRef: DatatableGraphQLQueryRef<any, any, any>,\n private readonly _columns: readonly TheSeamDatatableColumn[],\n private readonly _options: TheSeamDatatableChatContextOptions = {},\n ) {}\n\n getContext(): TheSeamDatatableChatContextData | null {\n const opts = this._queryRef.getOptions()\n if (!opts) return null\n\n const { query, variables } = processGql(\n opts.query,\n this._queryRef.getVariables() as Record<string, any>,\n this._queryRef.getQueryProcessingConfig() ?? { variables: {} },\n )\n\n const operationName =\n query.definitions.find(\n (d): d is OperationDefinitionNode => d.kind === 'OperationDefinition',\n )?.name?.value ?? ''\n\n return {\n label: this._options.label,\n operationName,\n query: print(query),\n variables,\n columns: this._columns.map((c) => ({ prop: c.prop, name: c.name })),\n }\n }\n}\n","import { InjectionToken } from '@angular/core'\n\nimport { TheSeamAiProvider } from '../providers/ai-provider'\n\nexport const THESEAM_CHAT_PROVIDER = new InjectionToken<TheSeamAiProvider>(\n 'TheSeamChatProvider',\n)\n","export type ChatContentSegment =\n | { type: 'markdown'; content: string }\n | { type: 'custom-block'; tag: string; content: string }\n\n/**\n * Splits a raw AI response string into an ordered array of segments.\n * Fenced code blocks with `seam-` prefixed language tags become custom-block\n * segments; everything else stays as markdown.\n */\nexport function parseChatResponse(input: string): ChatContentSegment[] {\n if (!input) {\n return []\n }\n\n const segments: ChatContentSegment[] = []\n const pattern = /^```(seam-[\\w-]+)\\n([\\s\\S]*?)^```/gm\n\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = pattern.exec(input)) !== null) {\n if (match.index > lastIndex) {\n segments.push({\n type: 'markdown',\n content: input.slice(lastIndex, match.index),\n })\n }\n\n segments.push({\n type: 'custom-block',\n tag: match[1],\n content: match[2].replace(/\\n$/, ''),\n })\n\n lastIndex = match.index + match[0].length\n }\n\n if (lastIndex < input.length) {\n segments.push({ type: 'markdown', content: input.slice(lastIndex) })\n }\n\n return segments\n}\n","import { InjectionToken, Type } from '@angular/core'\n\nexport type ChatBlockRegistry = Map<string, Type<unknown>>\n\nexport const THESEAM_CHAT_BLOCK_REGISTRY =\n new InjectionToken<ChatBlockRegistry>('TheSeamChatBlockRegistry')\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n Input,\n Injector,\n} from '@angular/core'\nimport { NgComponentOutlet, NgForOf, NgIf } from '@angular/common'\nimport { MarkdownComponent } from 'ngx-markdown'\n\nimport { ChatContentSegment } from './chat-response-parser'\nimport {\n ChatBlockRegistry,\n THESEAM_CHAT_BLOCK_REGISTRY,\n} from './chat-block-registry'\n\nexport interface ChatMessageDisplayModel {\n role: 'user' | 'assistant'\n segments: ChatContentSegment[]\n timestamp: Date\n}\n\n@Component({\n selector: 'seam-chat-message',\n imports: [NgForOf, NgIf, MarkdownComponent, NgComponentOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"seam-chat-message\"\n [class.seam-chat-message--user]=\"message.role === 'user'\"\n [class.seam-chat-message--assistant]=\"message.role === 'assistant'\"\n >\n <div class=\"seam-chat-message__role\">\n {{ message.role === 'user' ? 'You' : 'Assistant' }}\n </div>\n <div class=\"seam-chat-message__content\">\n <ng-container *ngFor=\"let segment of message.segments\">\n <markdown\n *ngIf=\"segment.type === 'markdown'\"\n [data]=\"segment.content\"\n ></markdown>\n <ng-container *ngIf=\"segment.type === 'custom-block'\">\n <ng-container\n *ngIf=\"\n _getBlockComponent(segment.tag) as blockComponent;\n else fallbackBlock\n \"\n >\n <ng-container\n *ngComponentOutlet=\"\n blockComponent;\n injector: _createBlockInjector(segment.content)\n \"\n ></ng-container>\n </ng-container>\n <ng-template #fallbackBlock>\n <markdown\n [data]=\"_buildFallbackMarkdown(segment.tag, segment.content)\"\n ></markdown>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n `,\n styles: [\n `\n .seam-chat-message {\n display: flex;\n flex-direction: column;\n padding: 8px 12px;\n margin-bottom: 8px;\n }\n\n .seam-chat-message--user {\n align-items: flex-end;\n }\n\n .seam-chat-message--user .seam-chat-message__content {\n background-color: #e8f5e9;\n border-radius: 8px;\n padding: 8px 12px;\n max-width: 80%;\n }\n\n .seam-chat-message--assistant .seam-chat-message__content {\n background-color: #f1f3f5;\n border-radius: 8px;\n padding: 8px 12px;\n max-width: 80%;\n }\n\n .seam-chat-message__role {\n font-size: 0.75rem;\n color: #6c757d;\n margin-bottom: 4px;\n }\n `,\n ],\n})\nexport class SeamChatMessageComponent {\n @Input({ required: true }) message!: ChatMessageDisplayModel\n\n private readonly _blockRegistry = inject(THESEAM_CHAT_BLOCK_REGISTRY, {\n optional: true,\n })\n private readonly _injector = inject(Injector)\n\n _getBlockComponent(tag: string) {\n return this._blockRegistry?.get(tag) ?? null\n }\n\n _createBlockInjector(content: string): Injector {\n return Injector.create({\n providers: [{ provide: 'CHAT_BLOCK_CONTENT', useValue: content }],\n parent: this._injector,\n })\n }\n\n _buildFallbackMarkdown(tag: string, content: string): string {\n return '```' + tag + '\\n' + content + '\\n```'\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core'\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms'\n\nimport { TheSeamRichTextModule } from '@theseam/ui-common/rich-text'\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\n@Component({\n selector: 'seam-chat-input',\n imports: [\n ReactiveFormsModule,\n TheSeamRichTextModule,\n TheSeamFormFieldModule,\n TheSeamButtonsModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"seam-chat-input\">\n <seam-form-field>\n <seam-rich-text\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n [disableRichText]=\"true\"\n [rows]=\"2.7\"\n [resizable]=\"false\"\n (keydown.enter)=\"_onEnterKey($event)\"\n ></seam-rich-text>\n </seam-form-field>\n <button\n seamButton\n theme=\"primary\"\n class=\"seam-chat-send-btn\"\n [disabled]=\"disabled || _control.invalid\"\n (click)=\"_onSend()\"\n >\n Send\n </button>\n </div>\n `,\n styles: [\n `\n .seam-chat-input {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 8px;\n border-top: 1px solid #dee2e6;\n }\n\n seam-form-field {\n flex: 1;\n }\n\n .seam-chat-send-btn {\n flex-shrink: 0;\n }\n `,\n ],\n})\nexport class SeamChatInputComponent {\n @Input() placeholder = 'Type a message...'\n @Input() disabled = false\n\n @Output() messageSent = new EventEmitter<string>()\n\n readonly _control = new FormControl<string>('', [Validators.required])\n\n _onEnterKey(event: Event) {\n const keyEvent = event as KeyboardEvent\n if (keyEvent.shiftKey) {\n return\n }\n keyEvent.preventDefault()\n this._onSend()\n }\n\n _onSend() {\n const value = this._control.value?.trim()\n if (!value || this.disabled) {\n return\n }\n this.messageSent.emit(value)\n this._control.reset()\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n Input,\n NgZone,\n ViewChild,\n} from '@angular/core'\nimport { AsyncPipe, NgForOf, NgIf } from '@angular/common'\nimport { BehaviorSubject } from 'rxjs'\n\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nimport { ChatMessage } from '../providers/ai-provider'\nimport { THESEAM_CHAT_PROVIDER } from './chat-provider'\nimport { TheSeamChatContextRegistry } from '../chat-context-registry.service'\nimport { parseChatResponse } from './chat-response-parser'\nimport {\n ChatMessageDisplayModel,\n SeamChatMessageComponent,\n} from './chat-message.component'\nimport { SeamChatInputComponent } from './chat-input.component'\n\n@Component({\n selector: 'seam-chat',\n imports: [\n AsyncPipe,\n NgForOf,\n NgIf,\n SeamChatMessageComponent,\n SeamChatInputComponent,\n TheSeamOverlayScrollbarDirective,\n ],\n templateUrl: './chat.component.html',\n styleUrls: ['./chat.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamChatComponent implements AfterViewInit {\n private readonly _provider = inject(THESEAM_CHAT_PROVIDER, { optional: true })\n private readonly _chatContextRegistry = inject(TheSeamChatContextRegistry, {\n optional: true,\n })\n private readonly _cdr = inject(ChangeDetectorRef)\n private readonly _ngZone = inject(NgZone)\n\n @Input() placeholder = 'Type a message...'\n\n @ViewChild('messageList') private _messageList?: ElementRef<HTMLElement>\n @ViewChild(TheSeamOverlayScrollbarDirective)\n private _messageListScrollbar?: TheSeamOverlayScrollbarDirective\n\n readonly _loadingSubject = new BehaviorSubject<boolean>(false)\n\n private _messages: ChatMessage[] = []\n _displayMessages: ChatMessageDisplayModel[] = []\n\n // Pixels of slack allowed when deciding if the viewport is \"at the bottom\".\n private readonly _pinnedThreshold = 32\n private _isPinnedToBottom = true\n private _forceScrollOnNextResize = false\n\n ngAfterViewInit() {\n const scrollInstance = this._messageListScrollbar?.instance\n if (!scrollInstance) {\n return\n }\n this._ngZone.runOutsideAngular(() => {\n scrollInstance.options({\n callbacks: {\n onScroll: () => this._updatePinnedState(),\n onContentSizeChanged: () => this._maybeScrollToBottom(),\n },\n })\n })\n }\n\n async _onMessageSent(text: string) {\n if (this._loadingSubject.value || !this._provider) {\n if (!this._provider) {\n console.error('No chat provider configured.')\n }\n return\n }\n\n const userMessage: ChatMessage = { role: 'user', content: text }\n this._messages.push(userMessage)\n this._displayMessages = [\n ...this._displayMessages,\n {\n role: 'user',\n segments: [{ type: 'markdown', content: text }],\n timestamp: new Date(),\n },\n ]\n this._forceScrollOnNextResize = true\n this._cdr.markForCheck()\n\n this._loadingSubject.next(true)\n try {\n const contexts = (await this._chatContextRegistry?.snapshot()) ?? []\n const response = await this._provider.chat({\n messages: this._messages,\n contexts: contexts.length === 0 ? undefined : contexts,\n })\n\n const assistantMessage: ChatMessage = {\n role: 'assistant',\n content: response.content,\n }\n this._messages.push(assistantMessage)\n this._displayMessages = [\n ...this._displayMessages,\n {\n role: 'assistant',\n segments: parseChatResponse(response.content),\n timestamp: new Date(),\n },\n ]\n } catch (err) {\n console.error('Chat provider error:', err)\n } finally {\n this._loadingSubject.next(false)\n this._cdr.markForCheck()\n }\n }\n\n private _updatePinnedState() {\n const scrollInstance = this._messageListScrollbar?.instance\n if (!scrollInstance) {\n return\n }\n const info = scrollInstance.scroll()\n this._isPinnedToBottom =\n info.position.y >= info.max.y - this._pinnedThreshold\n }\n\n private _maybeScrollToBottom() {\n if (this._forceScrollOnNextResize || this._isPinnedToBottom) {\n this._scrollToBottom()\n this._forceScrollOnNextResize = false\n }\n }\n\n private _scrollToBottom() {\n const scrollInstance = this._messageListScrollbar?.instance\n if (scrollInstance) {\n const state = scrollInstance.getState()\n scrollInstance.scroll({ y: state.contentScrollSize.height })\n }\n }\n}\n","<div class=\"seam-chat\">\n <div class=\"seam-chat__messages\" #messageList seamOverlayScrollbar>\n <seam-chat-message\n *ngFor=\"let msg of _displayMessages\"\n [message]=\"msg\"\n ></seam-chat-message>\n\n <div *ngIf=\"_loadingSubject | async\" class=\"seam-chat__loading\">\n <span>Thinking...</span>\n </div>\n </div>\n\n <seam-chat-input\n [placeholder]=\"placeholder\"\n [disabled]=\"!!(_loadingSubject | async)\"\n (messageSent)=\"_onMessageSent($event)\"\n ></seam-chat-input>\n</div>\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamChatMessageHarness extends ComponentHarness {\n static hostSelector = 'seam-chat-message'\n\n private readonly _role = this.locatorForOptional('.seam-chat-message__role')\n private readonly _content = this.locatorForOptional(\n '.seam-chat-message__content',\n )\n\n async getRole(): Promise<string> {\n const roleEl = await this._role()\n const text = await roleEl?.text()\n return text?.trim().toLowerCase() ?? ''\n }\n\n async getText(): Promise<string> {\n const contentEl = await this._content()\n return (await contentEl?.text())?.trim() ?? ''\n }\n}\n\nexport class TheSeamChatInputHarness extends ComponentHarness {\n static hostSelector = 'seam-chat-input'\n\n async getSendButton() {\n return this.locatorFor('button')()\n }\n\n async isSendDisabled(): Promise<boolean> {\n const btn = await this.getSendButton()\n return (await btn.getAttribute('disabled')) !== null\n }\n}\n\nexport class TheSeamChatHarness extends ComponentHarness {\n static hostSelector = 'seam-chat'\n\n private readonly _messages = this.locatorForAll(TheSeamChatMessageHarness)\n private readonly _input = this.locatorFor(TheSeamChatInputHarness)\n private readonly _loading = this.locatorForOptional('.seam-chat__loading')\n\n async getMessages(): Promise<TheSeamChatMessageHarness[]> {\n return this._messages()\n }\n\n async getInput(): Promise<TheSeamChatInputHarness> {\n return this._input()\n }\n\n async isLoading(): Promise<boolean> {\n return (await this._loading()) !== null\n }\n}\n","import { InjectionToken } from '@angular/core'\n\nimport { TheSeamAiProvider } from '../providers/ai-provider'\n\nexport const assistantPrompt = `You are a helpful assistant that provides formatting json code for a datatable.\nA datatable is a table that displays data in rows and columns, similar to a spreadsheet, with column sorting and data filtering.\n\nYour job is not to provide a descriptive analysis of the request or any additional information. The user will ignore anything that is not a JSON object.\n\nThe user will provide a request, and you will respond with a JSON object that contains an array of table alterations.\nThe following is the typescript interface for a datatable column and the alterations you can make to it:\n\n\\`\\`\\`typescript\ninterface TableColumn {\n /** Column property */\n prop: string,\n /** Column name */\n name: string,\n /** Column cell type - determines filter type */\n cellType?: 'string' | 'integer' | 'decimal' | 'currency' | 'date' | 'phone',\n /** Whether the column is sortable */\n sortable?: boolean,\n /** Whether the column is filterable */\n filterable?: boolean,\n /** Whether the column is visible */\n visible?: boolean,\n /** Whether the column is resizable */\n resizable?: boolean,\n /** Whether the column is draggable */\n draggable?: boolean,\n /** Column width */\n width?: number,\n /** Column index */\n index?: number,\n}\n\ninterface SortItem {\n /** Column property */\n prop: string,\n /** Sort direction */\n dir: 'asc' | 'desc'\n}\n\ninterface SortState {\n /** The list of sorts */\n sorts: SortItem[]\n}\n\ninterface OrderRecord {\n /** Column property */\n columnProp: string,\n /** Column order, which is the index that it will be placed in the columns array. */\n index: number\n}\n\ninterface OrderState {\n /** The list of column order records */\n columns: OrderRecord[]\n}\n\ninterface WidthState {\n /** The column property that this width alteration applies to */\n columnProp: string\n /** The width of the column. Number is in pixels. */\n width?: number\n /** Whether the column can auto resize. Needs to be false to guarantee a specific width. */\n canAutoResize: boolean\n}\n\ninterface HideColumnState {\n /** The column property that this alteration applies to */\n columnProp: string\n /** Whether the column is hidden */\n hidden: boolean\n}\n\ninterface FilterState {\n /** The column property that this filter applies to */\n columnProp: string,\n /** The filter type based on column cellType */\n filterType: 'text' | 'numeric' | 'date',\n /** The filter operation */\n operation: string,\n /** The filter value (for single value operations) */\n value?: any,\n /** The from value (for range operations like 'between') */\n fromValue?: any,\n /** The to value (for range operations like 'between') */\n toValue?: any\n}\n\ninterface TableAlteration<TType extends string, TState> {\n /**\n * Unique identifier for the alteration.\n */\n id: string\n /**\n * The type of alteration.\n */\n type: TType\n /** The alteration state */\n state: TState\n}\n\n/**\n * Sort alteration for a datatable.\n * \"id\" should always be \"sort\" for this alteration.\n */\ntype SortAlteration = TableAlteration<'sort', SortState>\n\n/**\n * Order alteration for a datatable column.\n *\n * \"id\" should always be \"order\" for this alteration.\n */\ntype OrderAlteration = TableAlteration<'order', OrderState>\n\n/**\n * Width alteration for a datatable column.\n *\n * \"id\" should always be \"width-<prop>\" for this alteration. So, for example, if the column property is \"name\", the id would be \"width-name\".\n */\ntype WidthAlteration = TableAlteration<'width', WidthState>\n\n/**\n * Hide column alteration for a datatable column.\n *\n * \"id\" should always be \"hide-column-<prop>\" for this alteration. So, for example, if the column property is \"name\", the id would be \"hide-column-name\".\n */\ntype HideColumnAlteration = TableAlteration<'hide-column', HideColumnState>\n\n/**\n * Filter alteration for a datatable column.\n * \"id\" should be \"filter--<columnProp>\" for this alteration.\n * For example, if filtering the \"age\" column, the id would be \"filter--age\".\n */\ntype FilterAlteration = TableAlteration<'filter', FilterState>\n\\`\\`\\`\n\n## Filter Operations by Type\n\n### Text Filters (cellType: 'string', 'phone')\n- 'contains': Text contains the value (case-insensitive)\n- 'eq': Text equals the value exactly\n- 'neq': Text does not equal the value\n- 'ncontains': Text does not contain the value\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n### Numeric Filters (cellType: 'integer', 'decimal', 'currency')\n- 'eq': Equals the value\n- 'gt': Greater than the value\n- 'gte': Greater than or equal to the value\n- 'lt': Less than the value\n- 'lte': Less than or equal to the value\n- 'between': Between fromValue and toValue (inclusive)\n- 'not-between': Not between fromValue and toValue\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n### Date Filters (cellType: 'date')\n- 'eq': Date equals the value\n- 'gt': Date is after the value\n- 'gte': Date is on or after the value\n- 'lt': Date is before the value\n- 'lte': Date is on or before the value\n- 'between': Date is between fromValue and toValue (inclusive)\n- 'not-between': Date is not between fromValue and toValue\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n## Examples\n\nFilter age greater than 30:\n\\`\\`\\`json\n{\n \"id\": \"filter--age\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"age\",\n \"filterType\": \"numeric\",\n \"operation\": \"gt\",\n \"value\": 30\n }\n}\n\\`\\`\\`\n\nFilter color contains \"red\":\n\\`\\`\\`json\n{\n \"id\": \"filter--color\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"color\",\n \"filterType\": \"text\",\n \"operation\": \"contains\",\n \"value\": \"red\"\n }\n}\n\\`\\`\\`\n\nFilter age between 25 and 65:\n\\`\\`\\`json\n{\n \"id\": \"filter--age\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"age\",\n \"filterType\": \"numeric\",\n \"operation\": \"between\",\n \"fromValue\": 25,\n \"toValue\": 65\n }\n}\n\\`\\`\\`\n\nSort by name ascending:\n\\`\\`\\`json\n{\n \"id\": \"sort\",\n \"type\": \"sort\",\n \"state\": {\n \"sorts\": [\n {\n \"prop\": \"name\",\n \"dir\": \"asc\"\n }\n ]\n }\n}\n\\`\\`\\`\n\nHide the age column:\n\\`\\`\\`json\n{\n \"id\": \"hide-column-age\",\n \"type\": \"hide-column\",\n \"state\": {\n \"columnProp\": \"age\",\n \"hidden\": true\n }\n}\n\\`\\`\\`\n\nSet name column width to 300 pixels:\n\\`\\`\\`json\n{\n \"id\": \"width-name\",\n \"type\": \"width\",\n \"state\": {\n \"columnProp\": \"name\",\n \"width\": 300,\n \"canAutoResize\": false\n }\n}\n\\`\\`\\`\n\nReorder columns (name first, age second, color third):\n\\`\\`\\`json\n{\n \"id\": \"order\",\n \"type\": \"order\",\n \"state\": {\n \"columns\": [\n { \"columnProp\": \"name\", \"index\": 0 },\n { \"columnProp\": \"age\", \"index\": 1 },\n { \"columnProp\": \"color\", \"index\": 2 }\n ]\n }\n}\n\\`\\`\\`\n`\n\nexport const getUserPrompt = (columns: any[], request: string): string => `\nColumns:\n\\`\\`\\`json\n${JSON.stringify(columns, null, 2)}\n\\`\\`\\`\nRequest: \"${request}\"\n`\n\nexport function parseResponse(\n responseContent: string,\n responseFormat: { type: string } | undefined,\n) {\n if (responseFormat?.type === 'json_object') {\n return JSON.parse(responseContent)\n }\n\n // Parse the JSON string to an object, which is in the string between the code blocks.\n // So, need to find the first and last code block markers.\n const startIndex = responseContent.indexOf('```json') + '```json'.length\n const endIndex = responseContent.lastIndexOf('```')\n const alterations = responseContent.substring(startIndex, endIndex).trim()\n // console.log('Alterations:', alterations)\n\n return JSON.parse(alterations)\n}\n\nexport const THESEAM_DATATABLE_PROMPTER_PROVIDER =\n new InjectionToken<TheSeamAiProvider>('TheSeamDatatablePrompterProvider')\n","import { ChangeDetectorRef, Component, inject, Input } from '@angular/core'\nimport { AsyncPipe, JsonPipe, NgForOf, NgIf } from '@angular/common'\nimport {\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms'\n\nimport {\n BehaviorSubject,\n combineLatest,\n map,\n Observable,\n of,\n shareReplay,\n startWith,\n switchMap,\n tap,\n} from 'rxjs'\nimport {\n ColumnsAlterationState,\n DatatableComponent,\n DatatablePreferencesService,\n EMPTY_DATATABLE_PREFERENCES,\n mapColumnsAlterationsStates,\n THESEAM_DATATABLE_PREFERENCES_ACCESSOR,\n} from '@theseam/ui-common/datatable'\nimport { TheSeamLoadingModule } from '@theseam/ui-common/loading'\nimport { TheSeamRichTextModule } from '@theseam/ui-common/rich-text'\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\nimport {\n AlterationDisplayItem,\n AlterationsDiffComponent,\n} from '@theseam/ui-common/datatable-alterations-display'\n\nimport {\n assistantPrompt,\n getUserPrompt,\n parseResponse,\n THESEAM_DATATABLE_PROMPTER_PROVIDER,\n} from './datatable-prompter-prompt-provider'\n\n@Component({\n selector: 'seam-datatable-prompter',\n templateUrl: './datatable-prompter.component.html',\n styleUrls: ['./datatable-prompter.component.scss'],\n imports: [\n ReactiveFormsModule,\n AsyncPipe,\n JsonPipe,\n NgForOf,\n NgIf,\n TheSeamLoadingModule,\n TheSeamRichTextModule,\n TheSeamFormFieldModule,\n TheSeamButtonsModule,\n AlterationsDiffComponent,\n ],\n})\nexport class TheSeamDatatablePrompterComponent {\n // cdr = inject(ChangeDetectorRef)\n\n private readonly _prefsAccessor = inject(\n THESEAM_DATATABLE_PREFERENCES_ACCESSOR,\n { optional: true },\n )\n private readonly _dtPrefsService = inject(DatatablePreferencesService)\n private readonly _aiProvider = inject(THESEAM_DATATABLE_PROMPTER_PROVIDER, {\n optional: true,\n })\n\n readonly _loadingSubject = new BehaviorSubject<boolean>(false)\n readonly _altsDataSubject = new BehaviorSubject<\n | {\n currentItems: AlterationDisplayItem[]\n pendingItems: AlterationDisplayItem[]\n }\n | undefined\n >(undefined)\n\n public readonly loading$ = this._loadingSubject.asObservable()\n\n @Input() diffMode: 'auto' | 'manual' = 'auto'\n @Input() compact = true\n\n @Input()\n set prompt(value: string | undefined | null) {\n if (value) {\n this._form.controls.prompt.setValue(value)\n } else {\n this._form.controls.prompt.setValue('Sort color descending order')\n }\n }\n\n @Input()\n set datatable(value: DatatableComponent | undefined | null) {\n this._datatableSubject.next(value)\n }\n get datatable(): DatatableComponent | undefined | null {\n return this._datatableSubject.value\n }\n private _datatableSubject = new BehaviorSubject<\n DatatableComponent | undefined | null\n >(null)\n\n @Input() showAlts = true\n\n readonly _form = new FormGroup({\n prompt: new FormControl<string | null>('Sort color descending order', [\n Validators.required,\n ]),\n })\n\n _alterations$: Observable<ColumnsAlterationState[]> = this._datatableSubject\n .asObservable()\n .pipe(\n switchMap((dt): Observable<DatatableComponent | null | undefined> => {\n if (!dt) {\n return of(dt)\n }\n return (dt as any)._columnsAlterationsManager.changes.pipe(\n startWith(undefined),\n map(() => dt),\n )\n }),\n switchMap((datatable) => {\n if (!datatable) {\n return of([] as ColumnsAlterationState[])\n }\n const key = datatable.preferencesKey\n if (!key) {\n // eslint-disable-next-line no-console\n console.warn(\n 'No preferences key set on datatable, returning empty alterations.',\n )\n return of([] as ColumnsAlterationState[])\n }\n\n return (\n this._dtPrefsService.preferences(key).pipe(\n switchMap((prefs) => {\n // console.log('~~~~Current preferences:', prefs)\n if (!prefs) {\n return of(\n JSON.parse(JSON.stringify(EMPTY_DATATABLE_PREFERENCES))\n .alterations as ColumnsAlterationState[],\n )\n }\n // return of(JSON.parse(prefs).alterations as ColumnsAlterationState[])\n return of(prefs.alterations as ColumnsAlterationState[])\n }),\n ) ?? of([] as ColumnsAlterationState[])\n )\n }),\n // tap(v => console.log('%cAlterations:', 'color: limegreen;', v)),\n )\n\n _alterationsDisplayItems$: Observable<AlterationDisplayItem[]> =\n this._alterations$.pipe(\n switchMap((alterations) => {\n console.log('~~~~~Current alterations:', alterations)\n if (!alterations || alterations.length === 0) {\n return of([] as AlterationDisplayItem[])\n }\n const alts = mapColumnsAlterationsStates(alterations)\n console.log('~~~~~Mapped alterations:', alts)\n return of(alts.map((a) => a.toDisplayItem()))\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n _pendingAlterationsSubject = new BehaviorSubject<ColumnsAlterationState[]>([])\n _pendingAlterationsDisplayItems$: Observable<AlterationDisplayItem[]> =\n this._pendingAlterationsSubject.asObservable().pipe(\n switchMap((pending) => {\n if (!pending || pending.length === 0) {\n return of([] as AlterationDisplayItem[])\n }\n const alts = mapColumnsAlterationsStates(pending)\n console.log('~~~~~Mapped alterations2:', alts)\n return of(alts.map((a) => a.toDisplayItem()))\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n _onSubmit() {\n console.log('Submitting prompt:', this._form.value)\n if (this._form.invalid) {\n return\n }\n if (this._loadingSubject.value) {\n console.warn('Already loading, ignoring submit.')\n return\n }\n\n const prompt = this._form.value.prompt\n if (!prompt) {\n return\n }\n console.log('datatable', this._datatableSubject.value)\n const columns = (\n this._datatableSubject.value?.ngxDatatable?.columns || []\n ).map((col) => ({\n prop: col.prop,\n name: col.name,\n cellType: (col as any).cellType || 'string',\n sortable: col.sortable,\n filterable: true,\n visible: true,\n resizable: col.resizeable,\n draggable: col.draggable,\n }))\n\n console.log('columns', columns)\n const userPrompt = getUserPrompt(columns, prompt)\n console.log('userPrompt', userPrompt)\n\n this._loadingSubject.next(true)\n if (!this._aiProvider) {\n console.error('No AI provider configured, cannot submit prompt.')\n this._loadingSubject.next(false)\n return\n }\n this._aiProvider\n .chat({\n messages: [\n {\n role: 'user',\n content: `${assistantPrompt}\\n\\n---\\n\\n${userPrompt}`,\n },\n ],\n })\n .then(async (response) => {\n const alterations = parseResponse(response.content, undefined)\n // this._form.reset()\n console.log('Received alterations:', alterations)\n const datatable = this._datatableSubject.value\n if (!datatable) {\n console.error('No datatable found to apply alterations to.')\n return\n }\n\n const key = this.datatable!.preferencesKey as string\n\n const before = await this._prefsAccessor?.get(key).toPromise()\n console.log('Current preferences before update:', before)\n\n const _apply = async () => {\n console.log('Preferences updated successfully.')\n const _cols = this.datatable!.ngxDatatable!.columns\n const cols = [..._cols]\n console.log('this.datatable!.columns', cols)\n\n const after = await this._prefsAccessor?.get(key).toPromise()\n let _after = (JSON.parse(after || '{}').alterations ||\n []) as ColumnsAlterationState[]\n if (!Array.isArray(_after)) {\n _after = [_after]\n }\n\n const mgr = (this.datatable as any)._columnsAlterationsManager\n console.log('_columnsAlterationsManager', mgr, mgr.get())\n const alts = mapColumnsAlterationsStates(_after)\n console.log('Mapped alterations:', alts)\n const columnsBefore = JSON.parse(\n JSON.stringify(\n this.datatable!.ngxDatatable!.columns.map((x) => x.prop),\n ),\n )\n console.log('Columns before applying alterations:', columnsBefore)\n for (const a of alts) {\n console.log('Applying alteration:', a)\n a.apply(cols, this.datatable!)\n }\n console.log('Current preferences after update:', after)\n console.log(_after)\n\n this.datatable!.columns = [...cols]\n const columnsAfter = JSON.parse(\n JSON.stringify(\n this.datatable!.ngxDatatable!.columns.map((x) => x.prop),\n ),\n )\n console.log('Columns after applying alterations:', columnsAfter)\n mgr.add(alts)\n datatable._cdr.detectChanges()\n\n this._pendingAlterationsSubject.next(_after)\n }\n\n this._prefsAccessor\n ?.update(\n key,\n JSON.stringify({\n version: 2,\n alterations,\n }),\n )\n .subscribe(async () => {\n // TODO: Cleanup. This is a hack to ensure the datatable updates after the preferences are set.\n await _apply()\n datatable.rows = [...datatable.rows]\n datatable._cdr.detectChanges()\n await _apply()\n\n this._loadingSubject.next(false)\n })\n })\n .catch((err) => {\n console.error('Error submitting prompt:', err)\n this._loadingSubject.next(false)\n })\n }\n}\n","<div class=\"d-block border rounded border-lightgray\">\n <div\n [formGroup]=\"_form\"\n (ngSubmit)=\"_onSubmit()\"\n class=\"d-block position-relative\"\n >\n <div>\n <div class=\"p-1\">\n <!-- <textarea formControlName=\"prompt\" style=\"width: 800px; height: 100px;\"></textarea> -->\n <seam-form-field [numPaddingErrors]=\"0\">\n <seam-rich-text\n seamInput\n formControlName=\"prompt\"\n placeholder=\"Describe what you want to apply to the datatable.\"\n [rows]=\"3\"\n [resizable]=\"false\"\n [disableRichText]=\"true\"\n ></seam-rich-text>\n </seam-form-field>\n </div>\n <div class=\"p-1\">\n <button\n class=\"mr-1\"\n type=\"submit\"\n seamButton\n theme=\"primary\"\n size=\"sm\"\n (click)=\"_onSubmit()\"\n >\n Submit\n </button>\n <button seamButton theme=\"lightgray\" size=\"sm\" (click)=\"_form.reset()\">\n Reset\n </button>\n </div>\n </div>\n <div\n *ngIf=\"loading$ | async\"\n class=\"d-block position-absolute\"\n style=\"top: 0; left: 0; right: 0; bottom: 0\"\n >\n <seam-loading></seam-loading>\n </div>\n </div>\n\n <div class=\"p-2\" *ngIf=\"showAlts\">\n <div>Active Alterations</div>\n <div class=\"p-2 border rounded bg-lightgray\">\n <!-- {{ _alterations$ | async | json }} -->\n <div *ngFor=\"let alteration of _alterations$ | async; let last = last\">\n <div\n class=\"d-flex align-items-center border border-dark rounded p-1\"\n [class.mb-1]=\"!last\"\n >\n <span class=\"badge bg-secondary\">{{ alteration.type }}</span>\n <!-- <span class=\"badge bg-primary\">{{ alteration.label }}</span> -->\n <!-- <div>\n {{ alteration.value | json }}\n </div> -->\n <div *ngIf=\"alteration.type === 'sort'\">\n <div class=\"d-flex flex-column\">\n <div\n *ngFor=\"let sort of alteration.state.sorts; let last = last\"\n [class.mb-1]=\"!last\"\n >\n <span class=\"badge bg-lightgray\"\n >{{ sort.prop }} ({{ sort.dir }})</span\n >\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <seam-alterations-diff\n [currentItems]=\"(_alterationsDisplayItems$ | async) ?? []\"\n [pendingItems]=\"(_pendingAlterationsDisplayItems$ | async) ?? []\"\n [compact]=\"compact\"\n [diffMode]=\"diffMode\"\n ></seam-alterations-diff>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i2","i5"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theseam-ui-common-ai.mjs","sources":["../../../projects/ui-common/ai/providers/ai-provider.ts","../../../projects/ui-common/ai/providers/lm-studio.ai-provider.ts","../../../projects/ui-common/ai/providers/openrouter.ai-provider.ts","../../../projects/ui-common/ai/providers/mock.ai-provider.ts","../../../projects/ui-common/ai/chat-context-registry.service.ts","../../../projects/ui-common/ai/contexts/datatable-chat-context.ts","../../../projects/ui-common/ai/chat/chat-provider.ts","../../../projects/ui-common/ai/chat/chat-response-parser.ts","../../../projects/ui-common/ai/chat/chat-block-registry.ts","../../../projects/ui-common/ai/chat/chat-message.component.ts","../../../projects/ui-common/ai/chat/chat-input.component.ts","../../../projects/ui-common/ai/chat/chat.component.ts","../../../projects/ui-common/ai/chat/chat.component.html","../../../projects/ui-common/ai/chat/testing/chat.harness.ts","../../../projects/ui-common/ai/datatable-prompter/datatable-prompter-prompt-provider.ts","../../../projects/ui-common/ai/datatable-prompter/datatable-prompter.component.ts","../../../projects/ui-common/ai/datatable-prompter/datatable-prompter.component.html","../../../projects/ui-common/ai/public-api.ts","../../../projects/ui-common/ai/theseam-ui-common-ai.ts"],"sourcesContent":["import { Observable } from 'rxjs'\n\nimport { TheSeamChatContextPayload } from '../chat-context'\n\n/**\n * A single conversation turn. Sent to the LLM via `chat()` and produced by\n * `chat()` as the assistant response. Persisted history (with uid + created)\n * is exposed separately via `ChatSessionMessage`.\n */\nexport interface ChatMessage {\n /** 'user' | 'assistant' in practice; widened to string for forward-compat. */\n role: string\n content: string\n}\n\nexport interface ChatSessionMessage {\n uid: string\n role: string\n content: string\n /** ISO-8601 datetime of when the message was persisted. */\n created: string\n}\n\nexport interface ChatSession {\n uid: string\n label: string\n created: string\n lastActivity: string\n leafMessageId: string | null\n messages: ChatSessionMessage[]\n}\n\nexport interface ChatSessionListItem {\n uid: string\n label: string\n created: string\n lastActivity: string\n}\n\nexport interface TheSeamAiChatRequest {\n messages: ChatMessage[]\n contexts?: TheSeamChatContextPayload[]\n /** When null, the backend creates a new session and returns its uid. */\n sessionId?: string | null\n /**\n * Required when `sessionId` is set. The uid of the message the client\n * believes is the current leaf. Backend returns 409 if it doesn't match.\n */\n expectedLeafMessageId?: string | null\n}\n\nexport interface ChatResponse {\n content: string\n sessionId: string\n label: string\n leafMessageId: string\n}\n\n/**\n * Errored by `TheSeamAiProvider.chat()` when the server reports the\n * session's leaf has advanced since the client last observed it (HTTP 409).\n * The chat component catches this, reloads the session, and emits\n * `(staleSession)`.\n */\nexport class ChatSessionStaleError extends Error {\n constructor(\n public readonly sessionId: string,\n public readonly currentLeafMessageId: string | null,\n ) {\n super('Chat session leaf is stale')\n this.name = 'ChatSessionStaleError'\n }\n}\n\nexport interface TheSeamAiProvider {\n /**\n * Send a chat turn. Errors with `ChatSessionStaleError` when the session's\n * leaf has advanced since the last observed state.\n *\n * Implementations should emit exactly once and complete.\n */\n chat(request: TheSeamAiChatRequest): Observable<ChatResponse>\n\n /**\n * Hook the chat component calls on mount to ask the provider what session\n * to load. Default app implementation prefers a query-param session uid\n * and falls back to the user's most recent session, but apps can override.\n */\n getInitialSession(): Observable<ChatSession | null>\n\n /** Returns the user's most-recently-active session, or null if none exists. */\n getRecentSession(): Observable<ChatSession | null>\n\n /** Loads a specific session with its active-path messages. */\n getSession(uid: string): Observable<ChatSession>\n\n /** Returns session metadata for the user (no messages). */\n listSessions(): Observable<ChatSessionListItem[]>\n\n /** Updates a session's user-visible label. */\n renameSession(uid: string, label: string): Observable<void>\n\n /** Soft-deletes the session. */\n deleteSession(uid: string): Observable<void>\n}\n","import { defer, Observable, of, throwError } from 'rxjs'\n\nimport {\n ChatResponse,\n ChatSession,\n ChatSessionListItem,\n TheSeamAiChatRequest,\n TheSeamAiProvider,\n} from './ai-provider'\n\nexport class LmStudioAiProvider implements TheSeamAiProvider {\n chat(request: TheSeamAiChatRequest): Observable<ChatResponse> {\n return defer(() => {\n const controller = new AbortController()\n const promise = (async () => {\n const url = 'http://localhost:1234/v1/chat/completions'\n const headers = { 'Content-Type': 'application/json' }\n const model = 'model-identifier'\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n messages: request.messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n signal: controller.signal,\n })\n\n const data = await response.json()\n const content = data.choices[0].message.content\n return {\n content,\n // LM Studio is provider-only; no real session backend.\n sessionId: request.sessionId ?? 'lm-studio-local',\n label: 'LM Studio',\n leafMessageId: crypto.randomUUID(),\n } satisfies ChatResponse\n })()\n promise.finally(() => {\n /* avoid unhandled-rejection on unsubscribe */\n })\n return new Observable<ChatResponse>((subscriber) => {\n promise.then(\n (value) => {\n subscriber.next(value)\n subscriber.complete()\n },\n (err) => subscriber.error(err),\n )\n return () => controller.abort()\n })\n })\n }\n\n getInitialSession(): Observable<ChatSession | null> {\n return of(null)\n }\n\n getRecentSession(): Observable<ChatSession | null> {\n return of(null)\n }\n\n getSession(_uid: string): Observable<ChatSession> {\n return throwError(\n () =>\n new Error('LmStudioAiProvider does not support session persistence.'),\n )\n }\n\n listSessions(): Observable<ChatSessionListItem[]> {\n return of([])\n }\n\n renameSession(_uid: string, _label: string): Observable<void> {\n return throwError(\n () =>\n new Error('LmStudioAiProvider does not support session persistence.'),\n )\n }\n\n deleteSession(_uid: string): Observable<void> {\n return throwError(\n () =>\n new Error('LmStudioAiProvider does not support session persistence.'),\n )\n }\n}\n","import { defer, Observable, of, throwError } from 'rxjs'\n\nimport {\n ChatResponse,\n ChatSession,\n ChatSessionListItem,\n TheSeamAiChatRequest,\n TheSeamAiProvider,\n} from './ai-provider'\n\nexport class OpenRouterAiProvider implements TheSeamAiProvider {\n chat(request: TheSeamAiChatRequest): Observable<ChatResponse> {\n return defer(() => {\n const controller = new AbortController()\n const promise = (async () => {\n const defaultApiKey =\n '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'\n const url = 'https://openrouter.ai/api/v1/chat/completions'\n const apiKey =\n localStorage.getItem('openrouter-api-key') || defaultApiKey\n const headers = {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n }\n const model = 'google/gemini-2.5-flash'\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n messages: request.messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n response_format: { type: 'json_object' },\n }),\n signal: controller.signal,\n })\n\n const data = await response.json()\n const content = data.choices[0].message.content\n return {\n content,\n sessionId: request.sessionId ?? 'openrouter-remote',\n label: 'OpenRouter',\n leafMessageId: crypto.randomUUID(),\n } satisfies ChatResponse\n })()\n promise.finally(() => {\n /* avoid unhandled-rejection on unsubscribe */\n })\n return new Observable<ChatResponse>((subscriber) => {\n promise.then(\n (value) => {\n subscriber.next(value)\n subscriber.complete()\n },\n (err) => subscriber.error(err),\n )\n return () => controller.abort()\n })\n })\n }\n\n getInitialSession(): Observable<ChatSession | null> {\n return of(null)\n }\n\n getRecentSession(): Observable<ChatSession | null> {\n return of(null)\n }\n\n getSession(_uid: string): Observable<ChatSession> {\n return throwError(\n () =>\n new Error('OpenRouterAiProvider does not support session persistence.'),\n )\n }\n\n listSessions(): Observable<ChatSessionListItem[]> {\n return of([])\n }\n\n renameSession(_uid: string, _label: string): Observable<void> {\n return throwError(\n () =>\n new Error('OpenRouterAiProvider does not support session persistence.'),\n )\n }\n\n deleteSession(_uid: string): Observable<void> {\n return throwError(\n () =>\n new Error('OpenRouterAiProvider does not support session persistence.'),\n )\n }\n}\n","import { defer, Observable, of, throwError } from 'rxjs'\nimport { delay as rxDelay } from 'rxjs/operators'\n\nimport {\n ChatMessage,\n ChatResponse,\n ChatSession,\n ChatSessionListItem,\n ChatSessionStaleError,\n TheSeamAiChatRequest,\n TheSeamAiProvider,\n} from './ai-provider'\n\ntype MockResponse = string | ((messages: ChatMessage[]) => string)\n\nexport interface MockAiProviderConfig {\n response?: MockResponse\n initialSession?: ChatSession | null\n sessionsByUid?: ReadonlyMap<string, ChatSession>\n sessionsList?: ChatSessionListItem[]\n\n /** First chat() call errors with this; subsequent calls succeed normally. */\n throwOnFirstChat?: Error\n\n /** Artificial delay (ms) applied uniformly. Overridable per method. */\n delayMs?: number\n delayMsByMethod?: Partial<Record<keyof TheSeamAiProvider, number>>\n}\n\ntype LegacyArg = MockAiProviderConfig | MockResponse | undefined\n\nexport class MockAiProvider implements TheSeamAiProvider {\n private readonly _config: MockAiProviderConfig\n private _throwOnNextChat?: Error\n\n constructor(configOrLegacy?: LegacyArg) {\n if (\n typeof configOrLegacy === 'string' ||\n typeof configOrLegacy === 'function'\n ) {\n this._config = { response: configOrLegacy }\n } else {\n this._config = configOrLegacy ?? {}\n }\n this._throwOnNextChat = this._config.throwOnFirstChat\n }\n\n chat(request: TheSeamAiChatRequest): Observable<ChatResponse> {\n return defer(() => {\n if (this._throwOnNextChat) {\n const err = this._throwOnNextChat\n this._throwOnNextChat = undefined\n return throwError(() => err) as Observable<ChatResponse>\n }\n const content =\n typeof this._config.response === 'function'\n ? this._config.response(request.messages)\n : (this._config.response ?? 'Mock response')\n const response: ChatResponse = {\n content,\n sessionId: request.sessionId ?? `mock-session-${cryptoRandomId()}`,\n label: 'Mock',\n leafMessageId: cryptoRandomId(),\n }\n return this._withDelay('chat', of(response))\n })\n }\n\n getInitialSession(): Observable<ChatSession | null> {\n return defer(() =>\n this._withDelay(\n 'getInitialSession',\n of(this._config.initialSession ?? null),\n ),\n )\n }\n\n getRecentSession(): Observable<ChatSession | null> {\n return defer(() =>\n this._withDelay(\n 'getRecentSession',\n of(this._config.initialSession ?? null),\n ),\n )\n }\n\n getSession(uid: string): Observable<ChatSession> {\n return defer(() => {\n const found = this._config.sessionsByUid?.get(uid)\n if (!found) {\n return throwError(\n () => new Error(`MockAiProvider: session not found for uid \"${uid}\"`),\n )\n }\n return this._withDelay('getSession', of(found))\n })\n }\n\n listSessions(): Observable<ChatSessionListItem[]> {\n return defer(() =>\n this._withDelay('listSessions', of(this._config.sessionsList ?? [])),\n )\n }\n\n renameSession(_uid: string, _label: string): Observable<void> {\n return defer(() => this._withDelay('renameSession', of(undefined as void)))\n }\n\n deleteSession(_uid: string): Observable<void> {\n return defer(() => this._withDelay('deleteSession', of(undefined as void)))\n }\n\n private _withDelay<T>(\n method: keyof TheSeamAiProvider,\n source$: Observable<T>,\n ): Observable<T> {\n const ms =\n this._config.delayMsByMethod?.[method] ?? this._config.delayMs ?? 0\n return ms > 0 ? source$.pipe(rxDelay(ms)) : source$\n }\n}\n\nfunction cryptoRandomId(): string {\n return typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`\n}\n","import { Injectable } from '@angular/core'\n\nimport { TheSeamChatContext, TheSeamChatContextPayload } from './chat-context'\n\n@Injectable({ providedIn: 'root' })\nexport class TheSeamChatContextRegistry {\n private readonly _contexts = new Set<TheSeamChatContext>()\n\n /**\n * Register a context. Returns an unregister function — pair it with DestroyRef:\n * inject(DestroyRef).onDestroy(registry.register(ctx))\n */\n register(ctx: TheSeamChatContext): () => void {\n this._contexts.add(ctx)\n return () => this._contexts.delete(ctx)\n }\n\n unregister(ctx: TheSeamChatContext): void {\n this._contexts.delete(ctx)\n }\n\n /**\n * Resolve registered contexts to a wire-ready payload list. Applies the modal-mask\n * rule (a `modal`-typed context hides others unless they set `alwaysVisible`) and\n * drops entries whose `getContext()` returns null/undefined.\n */\n async snapshot(): Promise<TheSeamChatContextPayload[]> {\n const all = [...this._contexts]\n const masked = all.some((c) => c.type === 'modal')\n const visible = masked\n ? all.filter((c) => c.type === 'modal' || c.alwaysVisible)\n : all\n const resolved = await Promise.all(\n visible.map(async (c) => ({ type: c.type, data: await c.getContext() })),\n )\n return resolved.filter((p) => p.data != null)\n }\n}\n","import { OperationDefinitionNode, print } from 'graphql'\n\nimport { TheSeamDatatableColumn } from '@theseam/ui-common/datatable'\nimport {\n DatatableGraphQLQueryRef,\n processGql,\n} from '@theseam/ui-common/graphql'\n\nimport { TheSeamChatContext } from '../chat-context'\n\nexport interface TheSeamDatatableChatContextOptions {\n /** Optional human label, e.g. 'Bales'. Helps the LLM disambiguate when multiple datatables are registered. */\n label?: string\n}\n\nexport interface TheSeamDatatableChatContextData {\n label?: string\n operationName: string\n query: string\n variables: Record<string, unknown>\n columns: { prop: string | number | undefined; name: string | undefined }[]\n}\n\nexport class TheSeamDatatableChatContext implements TheSeamChatContext {\n readonly type = 'datatable'\n\n constructor(\n private readonly _queryRef: DatatableGraphQLQueryRef<any, any, any>,\n private readonly _columns: readonly TheSeamDatatableColumn[],\n private readonly _options: TheSeamDatatableChatContextOptions = {},\n ) {}\n\n getContext(): TheSeamDatatableChatContextData | null {\n const opts = this._queryRef.getOptions()\n if (!opts) return null\n\n const { query, variables } = processGql(\n opts.query,\n this._queryRef.getVariables() as Record<string, any>,\n this._queryRef.getQueryProcessingConfig() ?? { variables: {} },\n )\n\n const operationName =\n query.definitions.find(\n (d): d is OperationDefinitionNode => d.kind === 'OperationDefinition',\n )?.name?.value ?? ''\n\n return {\n label: this._options.label,\n operationName,\n query: print(query),\n variables,\n columns: this._columns.map((c) => ({ prop: c.prop, name: c.name })),\n }\n }\n}\n","import { InjectionToken } from '@angular/core'\n\nimport { TheSeamAiProvider } from '../providers/ai-provider'\n\nexport const THESEAM_CHAT_PROVIDER = new InjectionToken<TheSeamAiProvider>(\n 'TheSeamChatProvider',\n)\n","export type ChatContentSegment =\n | { type: 'markdown'; content: string }\n | { type: 'custom-block'; tag: string; content: string }\n\n/**\n * Splits a raw AI response string into an ordered array of segments.\n * Fenced code blocks with `seam-` prefixed language tags become custom-block\n * segments; everything else stays as markdown.\n */\nexport function parseChatResponse(input: string): ChatContentSegment[] {\n if (!input) {\n return []\n }\n\n const segments: ChatContentSegment[] = []\n const pattern = /^```(seam-[\\w-]+)\\n([\\s\\S]*?)^```/gm\n\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = pattern.exec(input)) !== null) {\n if (match.index > lastIndex) {\n segments.push({\n type: 'markdown',\n content: input.slice(lastIndex, match.index),\n })\n }\n\n segments.push({\n type: 'custom-block',\n tag: match[1],\n content: match[2].replace(/\\n$/, ''),\n })\n\n lastIndex = match.index + match[0].length\n }\n\n if (lastIndex < input.length) {\n segments.push({ type: 'markdown', content: input.slice(lastIndex) })\n }\n\n return segments\n}\n","import { InjectionToken, Type } from '@angular/core'\n\nexport type ChatBlockRegistry = Map<string, Type<unknown>>\n\nexport const THESEAM_CHAT_BLOCK_REGISTRY =\n new InjectionToken<ChatBlockRegistry>('TheSeamChatBlockRegistry')\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n Input,\n Injector,\n} from '@angular/core'\nimport { NgComponentOutlet, NgForOf, NgIf } from '@angular/common'\nimport { MarkdownComponent } from 'ngx-markdown'\n\nimport { ChatContentSegment } from './chat-response-parser'\nimport {\n ChatBlockRegistry,\n THESEAM_CHAT_BLOCK_REGISTRY,\n} from './chat-block-registry'\n\nexport interface ChatMessageDisplayModel {\n /** Present for messages loaded from a persisted session. */\n uid?: string\n /** 'user' | 'assistant' rendered specially; other roles fall through to a neutral style. */\n role: string\n segments: ChatContentSegment[]\n timestamp: Date\n}\n\n@Component({\n selector: 'seam-chat-message',\n imports: [NgForOf, NgIf, MarkdownComponent, NgComponentOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"seam-chat-message\"\n [class.seam-chat-message--user]=\"message.role === 'user'\"\n [class.seam-chat-message--assistant]=\"message.role === 'assistant'\"\n >\n <div class=\"seam-chat-message__role\">\n {{ message.role === 'user' ? 'You' : 'Assistant' }}\n </div>\n <div class=\"seam-chat-message__content\">\n <ng-container *ngFor=\"let segment of message.segments\">\n <markdown\n *ngIf=\"segment.type === 'markdown'\"\n [data]=\"segment.content\"\n ></markdown>\n <ng-container *ngIf=\"segment.type === 'custom-block'\">\n <ng-container\n *ngIf=\"\n _getBlockComponent(segment.tag) as blockComponent;\n else fallbackBlock\n \"\n >\n <ng-container\n *ngComponentOutlet=\"\n blockComponent;\n injector: _createBlockInjector(segment.content)\n \"\n ></ng-container>\n </ng-container>\n <ng-template #fallbackBlock>\n <markdown\n [data]=\"_buildFallbackMarkdown(segment.tag, segment.content)\"\n ></markdown>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n `,\n styles: [\n `\n .seam-chat-message {\n display: flex;\n flex-direction: column;\n padding: 8px 12px;\n margin-bottom: 8px;\n }\n\n .seam-chat-message--user {\n align-items: flex-end;\n }\n\n .seam-chat-message--user .seam-chat-message__content {\n background-color: #e8f5e9;\n border-radius: 8px;\n padding: 8px 12px;\n max-width: 80%;\n }\n\n .seam-chat-message--assistant .seam-chat-message__content {\n background-color: #f1f3f5;\n border-radius: 8px;\n padding: 8px 12px;\n max-width: 80%;\n }\n\n .seam-chat-message__role {\n font-size: 0.75rem;\n color: #6c757d;\n margin-bottom: 4px;\n }\n `,\n ],\n})\nexport class SeamChatMessageComponent {\n @Input({ required: true }) message!: ChatMessageDisplayModel\n\n private readonly _blockRegistry = inject(THESEAM_CHAT_BLOCK_REGISTRY, {\n optional: true,\n })\n private readonly _injector = inject(Injector)\n\n _getBlockComponent(tag: string) {\n return this._blockRegistry?.get(tag) ?? null\n }\n\n _createBlockInjector(content: string): Injector {\n return Injector.create({\n providers: [{ provide: 'CHAT_BLOCK_CONTENT', useValue: content }],\n parent: this._injector,\n })\n }\n\n _buildFallbackMarkdown(tag: string, content: string): string {\n return '```' + tag + '\\n' + content + '\\n```'\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core'\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms'\n\nimport { TheSeamRichTextModule } from '@theseam/ui-common/rich-text'\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\n@Component({\n selector: 'seam-chat-input',\n imports: [\n ReactiveFormsModule,\n TheSeamRichTextModule,\n TheSeamFormFieldModule,\n TheSeamButtonsModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"seam-chat-input\">\n <seam-form-field>\n <seam-rich-text\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n [disableRichText]=\"true\"\n [rows]=\"2.7\"\n [resizable]=\"false\"\n (keydown.enter)=\"_onEnterKey($event)\"\n ></seam-rich-text>\n </seam-form-field>\n <button\n seamButton\n theme=\"primary\"\n class=\"seam-chat-send-btn\"\n [disabled]=\"disabled || _control.invalid\"\n (click)=\"_onSend()\"\n >\n Send\n </button>\n </div>\n `,\n styles: [\n `\n .seam-chat-input {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 8px;\n border-top: 1px solid #dee2e6;\n }\n\n seam-form-field {\n flex: 1;\n }\n\n .seam-chat-send-btn {\n flex-shrink: 0;\n }\n `,\n ],\n})\nexport class SeamChatInputComponent {\n @Input() placeholder = 'Type a message...'\n @Input() disabled = false\n\n @Output() messageSent = new EventEmitter<string>()\n\n readonly _control = new FormControl<string>('', [Validators.required])\n\n _onEnterKey(event: Event) {\n const keyEvent = event as KeyboardEvent\n if (keyEvent.shiftKey) {\n return\n }\n keyEvent.preventDefault()\n this._onSend()\n }\n\n _onSend() {\n const value = this._control.value?.trim()\n if (!value || this.disabled) {\n return\n }\n this.messageSent.emit(value)\n this._control.reset()\n }\n\n /**\n * Restores the given text into the input control. Called by the parent\n * chat component during stale-leaf recovery so the user can edit and\n * resend their message after the conversation is refreshed.\n */\n restoreText(text: string): void {\n this._control.setValue(text)\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n output,\n ViewChild,\n} from '@angular/core'\nimport { AsyncPipe } from '@angular/common'\nimport { BehaviorSubject, EMPTY, Observable, of, Subject } from 'rxjs'\nimport { catchError, switchMap, takeUntil, tap } from 'rxjs/operators'\n\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nimport {\n ChatMessage,\n ChatSession,\n ChatSessionStaleError,\n} from '../providers/ai-provider'\nimport { THESEAM_CHAT_PROVIDER } from './chat-provider'\nimport { TheSeamChatContextRegistry } from '../chat-context-registry.service'\nimport { parseChatResponse } from './chat-response-parser'\nimport {\n ChatMessageDisplayModel,\n SeamChatMessageComponent,\n} from './chat-message.component'\nimport { SeamChatInputComponent } from './chat-input.component'\n\n@Component({\n selector: 'seam-chat',\n imports: [\n AsyncPipe,\n SeamChatMessageComponent,\n SeamChatInputComponent,\n TheSeamOverlayScrollbarDirective,\n ],\n templateUrl: './chat.component.html',\n styleUrls: ['./chat.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheSeamChatComponent implements AfterViewInit, OnDestroy {\n private readonly _provider = inject(THESEAM_CHAT_PROVIDER, { optional: true })\n private readonly _chatContextRegistry = inject(TheSeamChatContextRegistry, {\n optional: true,\n })\n private readonly _cdr = inject(ChangeDetectorRef)\n private readonly _ngZone = inject(NgZone)\n\n @ViewChild('messageList') private _messageList?: ElementRef<HTMLElement>\n @ViewChild(TheSeamOverlayScrollbarDirective)\n private _messageListScrollbar?: TheSeamOverlayScrollbarDirective\n @ViewChild(SeamChatInputComponent) private _chatInput?: SeamChatInputComponent\n\n /**\n * The session this chat should display.\n *\n * - `null` on first init: the component asks the provider for an initial\n * session via `getInitialSession()` (default app behavior: prefers\n * `?chatSession=<uid>`, falls back to the user's most recent session).\n * - `null` after init: resets to a new empty chat. Equivalent to calling\n * `newSession()`.\n * - A session uid: loads and displays that session.\n *\n * Pair with `(sessionIdChange)` for two-way binding.\n */\n readonly sessionId = input<string | null>(null)\n\n readonly placeholder = input<string>('Type a message...')\n\n /**\n * Emits whenever the chat's active session changes — after the initial\n * load resolves, after a send creates a new session, after the input is\n * reassigned, or after `newSession()` clears the chat.\n */\n readonly sessionIdChange = output<string | null>()\n\n /**\n * Emits after the chat has recovered from a server-reported stale-leaf\n * 409. The component has already reloaded the session and restored the\n * user's typed text; consuming apps typically respond by surfacing a toast.\n */\n readonly staleSession = output<void>()\n\n // Internal conversation state — same as before, just relocated for clarity.\n private _messages: ChatMessage[] = []\n _displayMessages: ChatMessageDisplayModel[] = []\n\n // Pixels of slack allowed when deciding if the viewport is \"at the bottom\".\n private readonly _pinnedThreshold = 32\n private _isPinnedToBottom = true\n private _forceScrollOnNextResize = false\n\n private readonly _loadingSubject = new BehaviorSubject<boolean>(false)\n readonly loading$ = this._loadingSubject.asObservable()\n\n private _currentSessionId: string | null = null\n private _currentLeafMessageId: string | null = null\n private _initialized = false\n\n private readonly _sessionLoadRequest$ = new Subject<\n Observable<ChatSession | null>\n >()\n private readonly _destroy$ = new Subject<void>()\n\n private readonly _initialLoadingSubject = new BehaviorSubject<boolean>(false)\n readonly initialLoading$ = this._initialLoadingSubject.asObservable()\n\n constructor() {\n this._sessionLoadRequest$\n .pipe(\n tap(() =>\n this._initialLoadingSubject.next(this._messages.length === 0),\n ),\n switchMap((load$) =>\n load$.pipe(\n catchError((err) => {\n console.error('Chat session load failed:', err)\n return of(null)\n }),\n ),\n ),\n takeUntil(this._destroy$),\n )\n .subscribe((session) => {\n this._initialLoadingSubject.next(false)\n if (session) {\n const wasNoSession = this._currentSessionId === null\n this._applySession(session)\n if (wasNoSession) {\n this.sessionIdChange.emit(session.uid)\n }\n }\n this._cdr.markForCheck()\n })\n\n effect(() => {\n const incoming = this.sessionId()\n if (!this._initialized) {\n this._initialize(incoming)\n } else {\n this._reactToSessionInputChange(incoming)\n }\n })\n }\n\n ngAfterViewInit() {\n const scrollInstance = this._messageListScrollbar?.instance\n if (!scrollInstance) {\n return\n }\n this._ngZone.runOutsideAngular(() => {\n scrollInstance.options({\n callbacks: {\n onScroll: () => this._updatePinnedState(),\n onContentSizeChanged: () => this._maybeScrollToBottom(),\n },\n })\n })\n }\n\n ngOnDestroy() {\n this._destroy$.next()\n this._destroy$.complete()\n }\n\n /**\n * Resets the chat to a new empty session. Idempotent — safe to call when\n * the chat has no session loaded. Emits `(sessionIdChange)` with `null`.\n */\n newSession(): void {\n // Push EMPTY through the load pipeline so switchMap cancels any\n // in-flight session load before we clear state.\n this._sessionLoadRequest$.next(EMPTY)\n this._currentSessionId = null\n this._currentLeafMessageId = null\n this._messages = []\n this._displayMessages = []\n this._loadingSubject.next(false)\n this._initialLoadingSubject.next(false)\n this.sessionIdChange.emit(null)\n this._cdr.markForCheck()\n }\n\n async _onMessageSent(text: string): Promise<void> {\n if (this._loadingSubject.value) return\n if (!this._provider) {\n console.error('No chat provider configured.')\n return\n }\n\n const userMessage: ChatMessage = { role: 'user', content: text }\n this._messages.push(userMessage)\n this._displayMessages = [\n ...this._displayMessages,\n {\n role: 'user',\n segments: [{ type: 'markdown', content: text }],\n timestamp: new Date(),\n },\n ]\n this._forceScrollOnNextResize = true\n this._loadingSubject.next(true)\n this._cdr.markForCheck()\n\n const contexts = (await this._chatContextRegistry?.snapshot()) ?? []\n this._provider\n .chat({\n messages: this._messages,\n contexts: contexts.length === 0 ? undefined : contexts,\n sessionId: this._currentSessionId,\n expectedLeafMessageId: this._currentLeafMessageId,\n })\n .pipe(takeUntil(this._destroy$))\n .subscribe({\n next: (response) => {\n this._messages.push({ role: 'assistant', content: response.content })\n this._displayMessages = [\n ...this._displayMessages,\n {\n role: 'assistant',\n segments: parseChatResponse(response.content),\n timestamp: new Date(),\n },\n ]\n const wasNoSession = this._currentSessionId === null\n this._currentSessionId = response.sessionId\n this._currentLeafMessageId = response.leafMessageId\n if (wasNoSession) {\n this.sessionIdChange.emit(response.sessionId)\n }\n this._loadingSubject.next(false)\n this._cdr.markForCheck()\n },\n error: (err) => {\n if (err instanceof ChatSessionStaleError) {\n this._handleStaleSession(text)\n } else {\n console.error('Chat provider error:', err)\n this._loadingSubject.next(false)\n this._cdr.markForCheck()\n }\n },\n })\n }\n\n private _updatePinnedState() {\n const scrollInstance = this._messageListScrollbar?.instance\n if (!scrollInstance) {\n return\n }\n const info = scrollInstance.scroll()\n this._isPinnedToBottom =\n info.position.y >= info.max.y - this._pinnedThreshold\n }\n\n private _maybeScrollToBottom() {\n if (this._forceScrollOnNextResize || this._isPinnedToBottom) {\n this._scrollToBottom()\n this._forceScrollOnNextResize = false\n }\n }\n\n private _scrollToBottom() {\n const scrollInstance = this._messageListScrollbar?.instance\n if (scrollInstance) {\n const state = scrollInstance.getState()\n scrollInstance.scroll({ y: state.contentScrollSize.height })\n }\n }\n\n private _initialize(incoming: string | null): void {\n this._initialized = true\n if (!this._provider) {\n console.error('No chat provider configured.')\n return\n }\n if (incoming) {\n this._sessionLoadRequest$.next(this._provider.getSession(incoming))\n } else {\n this._sessionLoadRequest$.next(this._provider.getInitialSession())\n }\n }\n\n private _reactToSessionInputChange(incoming: string | null): void {\n if (incoming === this._currentSessionId) return\n if (!this._provider) {\n console.error('No chat provider configured.')\n return\n }\n if (incoming === null) {\n this.newSession()\n return\n }\n this._sessionLoadRequest$.next(this._provider.getSession(incoming))\n }\n\n private _applySession(session: ChatSession): void {\n this._currentSessionId = session.uid\n this._currentLeafMessageId = session.leafMessageId\n this._messages = session.messages.map((m) => ({\n role: m.role,\n content: m.content,\n }))\n this._displayMessages = session.messages.map((m) => ({\n uid: m.uid,\n role: m.role,\n segments:\n m.role === 'assistant'\n ? parseChatResponse(m.content)\n : [{ type: 'markdown', content: m.content }],\n timestamp: new Date(m.created),\n }))\n this._forceScrollOnNextResize = true\n }\n\n private _handleStaleSession(originalText: string): void {\n const sessionId = this._currentSessionId\n if (!sessionId || !this._provider) {\n this._loadingSubject.next(false)\n this._cdr.markForCheck()\n return\n }\n this._provider\n .getSession(sessionId)\n .pipe(takeUntil(this._destroy$))\n .subscribe({\n next: (reloaded) => {\n this._applySession(reloaded)\n this._chatInput?.restoreText(originalText)\n this._loadingSubject.next(false)\n this.staleSession.emit()\n this._cdr.markForCheck()\n },\n error: (reloadErr) => {\n console.error(\n 'Chat session reload failed during stale-leaf recovery:',\n reloadErr,\n )\n this._chatInput?.restoreText(originalText)\n this._loadingSubject.next(false)\n this.staleSession.emit()\n this._cdr.markForCheck()\n },\n })\n }\n}\n","<div class=\"seam-chat\">\n <div class=\"seam-chat__messages\" #messageList seamOverlayScrollbar>\n @if (initialLoading$ | async) {\n <div class=\"seam-chat__initial-loading\">\n <span>Loading…</span>\n </div>\n } @else {\n @for (msg of _displayMessages; track $index) {\n <seam-chat-message [message]=\"msg\"></seam-chat-message>\n }\n\n @if (loading$ | async) {\n <div class=\"seam-chat__loading\">\n <span>Thinking...</span>\n </div>\n }\n }\n </div>\n\n <seam-chat-input\n [placeholder]=\"placeholder()\"\n [disabled]=\"!!(loading$ | async) || !!(initialLoading$ | async)\"\n (messageSent)=\"_onMessageSent($event)\"\n ></seam-chat-input>\n</div>\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamChatMessageHarness extends ComponentHarness {\n static hostSelector = 'seam-chat-message'\n\n private readonly _role = this.locatorForOptional('.seam-chat-message__role')\n private readonly _content = this.locatorForOptional(\n '.seam-chat-message__content',\n )\n\n async getRole(): Promise<string> {\n const roleEl = await this._role()\n const text = await roleEl?.text()\n return text?.trim().toLowerCase() ?? ''\n }\n\n async getText(): Promise<string> {\n const contentEl = await this._content()\n return (await contentEl?.text())?.trim() ?? ''\n }\n}\n\nexport class TheSeamChatInputHarness extends ComponentHarness {\n static hostSelector = 'seam-chat-input'\n\n async getSendButton() {\n return this.locatorFor('button')()\n }\n\n async isSendDisabled(): Promise<boolean> {\n const btn = await this.getSendButton()\n return (await btn.getAttribute('disabled')) !== null\n }\n}\n\nexport class TheSeamChatHarness extends ComponentHarness {\n static hostSelector = 'seam-chat'\n\n private readonly _messages = this.locatorForAll(TheSeamChatMessageHarness)\n private readonly _input = this.locatorFor(TheSeamChatInputHarness)\n private readonly _loading = this.locatorForOptional('.seam-chat__loading')\n private readonly _initialLoading = this.locatorForOptional(\n '.seam-chat__initial-loading',\n )\n\n async getMessages(): Promise<TheSeamChatMessageHarness[]> {\n return this._messages()\n }\n\n async getMessageCount(): Promise<number> {\n return (await this._messages()).length\n }\n\n async getInput(): Promise<TheSeamChatInputHarness> {\n return this._input()\n }\n\n async isLoading(): Promise<boolean> {\n return (await this._loading()) !== null\n }\n\n async isInitialLoading(): Promise<boolean> {\n return (await this._initialLoading()) !== null\n }\n}\n","import { InjectionToken } from '@angular/core'\n\nimport { TheSeamAiProvider } from '../providers/ai-provider'\n\nexport const assistantPrompt = `You are a helpful assistant that provides formatting json code for a datatable.\nA datatable is a table that displays data in rows and columns, similar to a spreadsheet, with column sorting and data filtering.\n\nYour job is not to provide a descriptive analysis of the request or any additional information. The user will ignore anything that is not a JSON object.\n\nThe user will provide a request, and you will respond with a JSON object that contains an array of table alterations.\nThe following is the typescript interface for a datatable column and the alterations you can make to it:\n\n\\`\\`\\`typescript\ninterface TableColumn {\n /** Column property */\n prop: string,\n /** Column name */\n name: string,\n /** Column cell type - determines filter type */\n cellType?: 'string' | 'integer' | 'decimal' | 'currency' | 'date' | 'phone',\n /** Whether the column is sortable */\n sortable?: boolean,\n /** Whether the column is filterable */\n filterable?: boolean,\n /** Whether the column is visible */\n visible?: boolean,\n /** Whether the column is resizable */\n resizable?: boolean,\n /** Whether the column is draggable */\n draggable?: boolean,\n /** Column width */\n width?: number,\n /** Column index */\n index?: number,\n}\n\ninterface SortItem {\n /** Column property */\n prop: string,\n /** Sort direction */\n dir: 'asc' | 'desc'\n}\n\ninterface SortState {\n /** The list of sorts */\n sorts: SortItem[]\n}\n\ninterface OrderRecord {\n /** Column property */\n columnProp: string,\n /** Column order, which is the index that it will be placed in the columns array. */\n index: number\n}\n\ninterface OrderState {\n /** The list of column order records */\n columns: OrderRecord[]\n}\n\ninterface WidthState {\n /** The column property that this width alteration applies to */\n columnProp: string\n /** The width of the column. Number is in pixels. */\n width?: number\n /** Whether the column can auto resize. Needs to be false to guarantee a specific width. */\n canAutoResize: boolean\n}\n\ninterface HideColumnState {\n /** The column property that this alteration applies to */\n columnProp: string\n /** Whether the column is hidden */\n hidden: boolean\n}\n\ninterface FilterState {\n /** The column property that this filter applies to */\n columnProp: string,\n /** The filter type based on column cellType */\n filterType: 'text' | 'numeric' | 'date',\n /** The filter operation */\n operation: string,\n /** The filter value (for single value operations) */\n value?: any,\n /** The from value (for range operations like 'between') */\n fromValue?: any,\n /** The to value (for range operations like 'between') */\n toValue?: any\n}\n\ninterface TableAlteration<TType extends string, TState> {\n /**\n * Unique identifier for the alteration.\n */\n id: string\n /**\n * The type of alteration.\n */\n type: TType\n /** The alteration state */\n state: TState\n}\n\n/**\n * Sort alteration for a datatable.\n * \"id\" should always be \"sort\" for this alteration.\n */\ntype SortAlteration = TableAlteration<'sort', SortState>\n\n/**\n * Order alteration for a datatable column.\n *\n * \"id\" should always be \"order\" for this alteration.\n */\ntype OrderAlteration = TableAlteration<'order', OrderState>\n\n/**\n * Width alteration for a datatable column.\n *\n * \"id\" should always be \"width-<prop>\" for this alteration. So, for example, if the column property is \"name\", the id would be \"width-name\".\n */\ntype WidthAlteration = TableAlteration<'width', WidthState>\n\n/**\n * Hide column alteration for a datatable column.\n *\n * \"id\" should always be \"hide-column-<prop>\" for this alteration. So, for example, if the column property is \"name\", the id would be \"hide-column-name\".\n */\ntype HideColumnAlteration = TableAlteration<'hide-column', HideColumnState>\n\n/**\n * Filter alteration for a datatable column.\n * \"id\" should be \"filter--<columnProp>\" for this alteration.\n * For example, if filtering the \"age\" column, the id would be \"filter--age\".\n */\ntype FilterAlteration = TableAlteration<'filter', FilterState>\n\\`\\`\\`\n\n## Filter Operations by Type\n\n### Text Filters (cellType: 'string', 'phone')\n- 'contains': Text contains the value (case-insensitive)\n- 'eq': Text equals the value exactly\n- 'neq': Text does not equal the value\n- 'ncontains': Text does not contain the value\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n### Numeric Filters (cellType: 'integer', 'decimal', 'currency')\n- 'eq': Equals the value\n- 'gt': Greater than the value\n- 'gte': Greater than or equal to the value\n- 'lt': Less than the value\n- 'lte': Less than or equal to the value\n- 'between': Between fromValue and toValue (inclusive)\n- 'not-between': Not between fromValue and toValue\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n### Date Filters (cellType: 'date')\n- 'eq': Date equals the value\n- 'gt': Date is after the value\n- 'gte': Date is on or after the value\n- 'lt': Date is before the value\n- 'lte': Date is on or before the value\n- 'between': Date is between fromValue and toValue (inclusive)\n- 'not-between': Date is not between fromValue and toValue\n- 'blank': Field is empty/null\n- 'not-blank': Field is not empty/null\n\n## Examples\n\nFilter age greater than 30:\n\\`\\`\\`json\n{\n \"id\": \"filter--age\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"age\",\n \"filterType\": \"numeric\",\n \"operation\": \"gt\",\n \"value\": 30\n }\n}\n\\`\\`\\`\n\nFilter color contains \"red\":\n\\`\\`\\`json\n{\n \"id\": \"filter--color\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"color\",\n \"filterType\": \"text\",\n \"operation\": \"contains\",\n \"value\": \"red\"\n }\n}\n\\`\\`\\`\n\nFilter age between 25 and 65:\n\\`\\`\\`json\n{\n \"id\": \"filter--age\",\n \"type\": \"filter\",\n \"state\": {\n \"columnProp\": \"age\",\n \"filterType\": \"numeric\",\n \"operation\": \"between\",\n \"fromValue\": 25,\n \"toValue\": 65\n }\n}\n\\`\\`\\`\n\nSort by name ascending:\n\\`\\`\\`json\n{\n \"id\": \"sort\",\n \"type\": \"sort\",\n \"state\": {\n \"sorts\": [\n {\n \"prop\": \"name\",\n \"dir\": \"asc\"\n }\n ]\n }\n}\n\\`\\`\\`\n\nHide the age column:\n\\`\\`\\`json\n{\n \"id\": \"hide-column-age\",\n \"type\": \"hide-column\",\n \"state\": {\n \"columnProp\": \"age\",\n \"hidden\": true\n }\n}\n\\`\\`\\`\n\nSet name column width to 300 pixels:\n\\`\\`\\`json\n{\n \"id\": \"width-name\",\n \"type\": \"width\",\n \"state\": {\n \"columnProp\": \"name\",\n \"width\": 300,\n \"canAutoResize\": false\n }\n}\n\\`\\`\\`\n\nReorder columns (name first, age second, color third):\n\\`\\`\\`json\n{\n \"id\": \"order\",\n \"type\": \"order\",\n \"state\": {\n \"columns\": [\n { \"columnProp\": \"name\", \"index\": 0 },\n { \"columnProp\": \"age\", \"index\": 1 },\n { \"columnProp\": \"color\", \"index\": 2 }\n ]\n }\n}\n\\`\\`\\`\n`\n\nexport const getUserPrompt = (columns: any[], request: string): string => `\nColumns:\n\\`\\`\\`json\n${JSON.stringify(columns, null, 2)}\n\\`\\`\\`\nRequest: \"${request}\"\n`\n\nexport function parseResponse(\n responseContent: string,\n responseFormat: { type: string } | undefined,\n) {\n if (responseFormat?.type === 'json_object') {\n return JSON.parse(responseContent)\n }\n\n // Parse the JSON string to an object, which is in the string between the code blocks.\n // So, need to find the first and last code block markers.\n const startIndex = responseContent.indexOf('```json') + '```json'.length\n const endIndex = responseContent.lastIndexOf('```')\n const alterations = responseContent.substring(startIndex, endIndex).trim()\n // console.log('Alterations:', alterations)\n\n return JSON.parse(alterations)\n}\n\nexport const THESEAM_DATATABLE_PROMPTER_PROVIDER =\n new InjectionToken<TheSeamAiProvider>('TheSeamDatatablePrompterProvider')\n","import { ChangeDetectorRef, Component, inject, Input } from '@angular/core'\nimport { AsyncPipe, JsonPipe, NgForOf, NgIf } from '@angular/common'\nimport {\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms'\n\nimport {\n BehaviorSubject,\n combineLatest,\n firstValueFrom,\n map,\n Observable,\n of,\n shareReplay,\n startWith,\n switchMap,\n tap,\n} from 'rxjs'\nimport {\n ColumnsAlterationState,\n DatatableComponent,\n DatatablePreferencesService,\n EMPTY_DATATABLE_PREFERENCES,\n mapColumnsAlterationsStates,\n THESEAM_DATATABLE_PREFERENCES_ACCESSOR,\n} from '@theseam/ui-common/datatable'\nimport { TheSeamLoadingModule } from '@theseam/ui-common/loading'\nimport { TheSeamRichTextModule } from '@theseam/ui-common/rich-text'\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\nimport {\n AlterationDisplayItem,\n AlterationsDiffComponent,\n} from '@theseam/ui-common/datatable-alterations-display'\n\nimport {\n assistantPrompt,\n getUserPrompt,\n parseResponse,\n THESEAM_DATATABLE_PROMPTER_PROVIDER,\n} from './datatable-prompter-prompt-provider'\n\n@Component({\n selector: 'seam-datatable-prompter',\n templateUrl: './datatable-prompter.component.html',\n styleUrls: ['./datatable-prompter.component.scss'],\n imports: [\n ReactiveFormsModule,\n AsyncPipe,\n JsonPipe,\n NgForOf,\n NgIf,\n TheSeamLoadingModule,\n TheSeamRichTextModule,\n TheSeamFormFieldModule,\n TheSeamButtonsModule,\n AlterationsDiffComponent,\n ],\n})\nexport class TheSeamDatatablePrompterComponent {\n // cdr = inject(ChangeDetectorRef)\n\n private readonly _prefsAccessor = inject(\n THESEAM_DATATABLE_PREFERENCES_ACCESSOR,\n { optional: true },\n )\n private readonly _dtPrefsService = inject(DatatablePreferencesService)\n private readonly _aiProvider = inject(THESEAM_DATATABLE_PROMPTER_PROVIDER, {\n optional: true,\n })\n\n readonly _loadingSubject = new BehaviorSubject<boolean>(false)\n readonly _altsDataSubject = new BehaviorSubject<\n | {\n currentItems: AlterationDisplayItem[]\n pendingItems: AlterationDisplayItem[]\n }\n | undefined\n >(undefined)\n\n public readonly loading$ = this._loadingSubject.asObservable()\n\n @Input() diffMode: 'auto' | 'manual' = 'auto'\n @Input() compact = true\n\n @Input()\n set prompt(value: string | undefined | null) {\n if (value) {\n this._form.controls.prompt.setValue(value)\n } else {\n this._form.controls.prompt.setValue('Sort color descending order')\n }\n }\n\n @Input()\n set datatable(value: DatatableComponent | undefined | null) {\n this._datatableSubject.next(value)\n }\n get datatable(): DatatableComponent | undefined | null {\n return this._datatableSubject.value\n }\n private _datatableSubject = new BehaviorSubject<\n DatatableComponent | undefined | null\n >(null)\n\n @Input() showAlts = true\n\n readonly _form = new FormGroup({\n prompt: new FormControl<string | null>('Sort color descending order', [\n Validators.required,\n ]),\n })\n\n _alterations$: Observable<ColumnsAlterationState[]> = this._datatableSubject\n .asObservable()\n .pipe(\n switchMap((dt): Observable<DatatableComponent | null | undefined> => {\n if (!dt) {\n return of(dt)\n }\n return (dt as any)._columnsAlterationsManager.changes.pipe(\n startWith(undefined),\n map(() => dt),\n )\n }),\n switchMap((datatable) => {\n if (!datatable) {\n return of([] as ColumnsAlterationState[])\n }\n const key = datatable.preferencesKey\n if (!key) {\n // eslint-disable-next-line no-console\n console.warn(\n 'No preferences key set on datatable, returning empty alterations.',\n )\n return of([] as ColumnsAlterationState[])\n }\n\n return (\n this._dtPrefsService.preferences(key).pipe(\n switchMap((prefs) => {\n // console.log('~~~~Current preferences:', prefs)\n if (!prefs) {\n return of(\n JSON.parse(JSON.stringify(EMPTY_DATATABLE_PREFERENCES))\n .alterations as ColumnsAlterationState[],\n )\n }\n // return of(JSON.parse(prefs).alterations as ColumnsAlterationState[])\n return of(prefs.alterations as ColumnsAlterationState[])\n }),\n ) ?? of([] as ColumnsAlterationState[])\n )\n }),\n // tap(v => console.log('%cAlterations:', 'color: limegreen;', v)),\n )\n\n _alterationsDisplayItems$: Observable<AlterationDisplayItem[]> =\n this._alterations$.pipe(\n switchMap((alterations) => {\n console.log('~~~~~Current alterations:', alterations)\n if (!alterations || alterations.length === 0) {\n return of([] as AlterationDisplayItem[])\n }\n const alts = mapColumnsAlterationsStates(alterations)\n console.log('~~~~~Mapped alterations:', alts)\n return of(alts.map((a) => a.toDisplayItem()))\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n _pendingAlterationsSubject = new BehaviorSubject<ColumnsAlterationState[]>([])\n _pendingAlterationsDisplayItems$: Observable<AlterationDisplayItem[]> =\n this._pendingAlterationsSubject.asObservable().pipe(\n switchMap((pending) => {\n if (!pending || pending.length === 0) {\n return of([] as AlterationDisplayItem[])\n }\n const alts = mapColumnsAlterationsStates(pending)\n console.log('~~~~~Mapped alterations2:', alts)\n return of(alts.map((a) => a.toDisplayItem()))\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n _onSubmit() {\n console.log('Submitting prompt:', this._form.value)\n if (this._form.invalid) {\n return\n }\n if (this._loadingSubject.value) {\n console.warn('Already loading, ignoring submit.')\n return\n }\n\n const prompt = this._form.value.prompt\n if (!prompt) {\n return\n }\n console.log('datatable', this._datatableSubject.value)\n const columns = (\n this._datatableSubject.value?.ngxDatatable?.columns || []\n ).map((col) => ({\n prop: col.prop,\n name: col.name,\n cellType: (col as any).cellType || 'string',\n sortable: col.sortable,\n filterable: true,\n visible: true,\n resizable: col.resizeable,\n draggable: col.draggable,\n }))\n\n console.log('columns', columns)\n const userPrompt = getUserPrompt(columns, prompt)\n console.log('userPrompt', userPrompt)\n\n this._loadingSubject.next(true)\n if (!this._aiProvider) {\n console.error('No AI provider configured, cannot submit prompt.')\n this._loadingSubject.next(false)\n return\n }\n firstValueFrom(\n this._aiProvider.chat({\n messages: [\n {\n role: 'user',\n content: `${assistantPrompt}\\n\\n---\\n\\n${userPrompt}`,\n },\n ],\n }),\n )\n .then(async (response) => {\n const alterations = parseResponse(response.content, undefined)\n // this._form.reset()\n console.log('Received alterations:', alterations)\n const datatable = this._datatableSubject.value\n if (!datatable) {\n console.error('No datatable found to apply alterations to.')\n return\n }\n\n const key = this.datatable!.preferencesKey as string\n\n const before = await this._prefsAccessor?.get(key).toPromise()\n console.log('Current preferences before update:', before)\n\n const _apply = async () => {\n console.log('Preferences updated successfully.')\n const _cols = this.datatable!.ngxDatatable!.columns\n const cols = [..._cols]\n console.log('this.datatable!.columns', cols)\n\n const after = await this._prefsAccessor?.get(key).toPromise()\n let _after = (JSON.parse(after || '{}').alterations ||\n []) as ColumnsAlterationState[]\n if (!Array.isArray(_after)) {\n _after = [_after]\n }\n\n const mgr = (this.datatable as any)._columnsAlterationsManager\n console.log('_columnsAlterationsManager', mgr, mgr.get())\n const alts = mapColumnsAlterationsStates(_after)\n console.log('Mapped alterations:', alts)\n const columnsBefore = JSON.parse(\n JSON.stringify(\n this.datatable!.ngxDatatable!.columns.map((x) => x.prop),\n ),\n )\n console.log('Columns before applying alterations:', columnsBefore)\n for (const a of alts) {\n console.log('Applying alteration:', a)\n a.apply(cols, this.datatable!)\n }\n console.log('Current preferences after update:', after)\n console.log(_after)\n\n this.datatable!.columns = [...cols]\n const columnsAfter = JSON.parse(\n JSON.stringify(\n this.datatable!.ngxDatatable!.columns.map((x) => x.prop),\n ),\n )\n console.log('Columns after applying alterations:', columnsAfter)\n mgr.add(alts)\n datatable._cdr.detectChanges()\n\n this._pendingAlterationsSubject.next(_after)\n }\n\n this._prefsAccessor\n ?.update(\n key,\n JSON.stringify({\n version: 2,\n alterations,\n }),\n )\n .subscribe(async () => {\n // TODO: Cleanup. This is a hack to ensure the datatable updates after the preferences are set.\n await _apply()\n datatable.rows = [...datatable.rows]\n datatable._cdr.detectChanges()\n await _apply()\n\n this._loadingSubject.next(false)\n })\n })\n .catch((err) => {\n console.error('Error submitting prompt:', err)\n this._loadingSubject.next(false)\n })\n }\n}\n","<div class=\"d-block border rounded border-lightgray\">\n <div\n [formGroup]=\"_form\"\n (ngSubmit)=\"_onSubmit()\"\n class=\"d-block position-relative\"\n >\n <div>\n <div class=\"p-1\">\n <!-- <textarea formControlName=\"prompt\" style=\"width: 800px; height: 100px;\"></textarea> -->\n <seam-form-field [numPaddingErrors]=\"0\">\n <seam-rich-text\n seamInput\n formControlName=\"prompt\"\n placeholder=\"Describe what you want to apply to the datatable.\"\n [rows]=\"3\"\n [resizable]=\"false\"\n [disableRichText]=\"true\"\n ></seam-rich-text>\n </seam-form-field>\n </div>\n <div class=\"p-1\">\n <button\n class=\"mr-1\"\n type=\"submit\"\n seamButton\n theme=\"primary\"\n size=\"sm\"\n (click)=\"_onSubmit()\"\n >\n Submit\n </button>\n <button seamButton theme=\"lightgray\" size=\"sm\" (click)=\"_form.reset()\">\n Reset\n </button>\n </div>\n </div>\n <div\n *ngIf=\"loading$ | async\"\n class=\"d-block position-absolute\"\n style=\"top: 0; left: 0; right: 0; bottom: 0\"\n >\n <seam-loading></seam-loading>\n </div>\n </div>\n\n <div class=\"p-2\" *ngIf=\"showAlts\">\n <div>Active Alterations</div>\n <div class=\"p-2 border rounded bg-lightgray\">\n <!-- {{ _alterations$ | async | json }} -->\n <div *ngFor=\"let alteration of _alterations$ | async; let last = last\">\n <div\n class=\"d-flex align-items-center border border-dark rounded p-1\"\n [class.mb-1]=\"!last\"\n >\n <span class=\"badge bg-secondary\">{{ alteration.type }}</span>\n <!-- <span class=\"badge bg-primary\">{{ alteration.label }}</span> -->\n <!-- <div>\n {{ alteration.value | json }}\n </div> -->\n <div *ngIf=\"alteration.type === 'sort'\">\n <div class=\"d-flex flex-column\">\n <div\n *ngFor=\"let sort of alteration.state.sorts; let last = last\"\n [class.mb-1]=\"!last\"\n >\n <span class=\"badge bg-lightgray\"\n >{{ sort.prop }} ({{ sort.dir }})</span\n >\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <seam-alterations-diff\n [currentItems]=\"(_alterationsDisplayItems$ | async) ?? []\"\n [pendingItems]=\"(_pendingAlterationsDisplayItems$ | async) ?? []\"\n [compact]=\"compact\"\n [diffMode]=\"diffMode\"\n ></seam-alterations-diff>\n </div>\n</div>\n","// Shared providers\nexport {\n ChatMessage,\n ChatResponse,\n ChatSession,\n ChatSessionListItem,\n ChatSessionMessage,\n ChatSessionStaleError,\n TheSeamAiChatRequest,\n TheSeamAiProvider,\n} from './providers/ai-provider'\nexport { LmStudioAiProvider } from './providers/lm-studio.ai-provider'\nexport { OpenRouterAiProvider } from './providers/openrouter.ai-provider'\nexport {\n MockAiProvider,\n MockAiProviderConfig,\n} from './providers/mock.ai-provider'\n\n// Context registry\nexport { TheSeamChatContext, TheSeamChatContextPayload } from './chat-context'\nexport { TheSeamChatContextRegistry } from './chat-context-registry.service'\nexport {\n TheSeamDatatableChatContext,\n TheSeamDatatableChatContextOptions,\n TheSeamDatatableChatContextData,\n} from './contexts/datatable-chat-context'\n\n// Chat\nexport { TheSeamChatComponent } from './chat/chat.component'\nexport { THESEAM_CHAT_PROVIDER } from './chat/chat-provider'\nexport {\n ChatBlockRegistry,\n THESEAM_CHAT_BLOCK_REGISTRY,\n} from './chat/chat-block-registry'\nexport {\n ChatContentSegment,\n parseChatResponse,\n} from './chat/chat-response-parser'\nexport { TheSeamChatHarness } from './chat/testing/chat.harness'\n\n// Datatable prompter\nexport {\n THESEAM_DATATABLE_PROMPTER_PROVIDER,\n assistantPrompt,\n getUserPrompt,\n parseResponse,\n} from './datatable-prompter/datatable-prompter-prompt-provider'\nexport { TheSeamDatatablePrompterComponent } from './datatable-prompter/datatable-prompter.component'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["rxDelay","i4","switchMap","i2","i5"],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import * as i1 from '@theseam/ui-common/icon';
|
|
|
12
12
|
import { TheSeamIconModule } from '@theseam/ui-common/icon';
|
|
13
13
|
import * as i2 from '@theseam/ui-common/buttons';
|
|
14
14
|
import { TheSeamButtonsModule } from '@theseam/ui-common/buttons';
|
|
15
|
+
import { ComponentHarness } from '@angular/cdk/testing';
|
|
15
16
|
|
|
16
17
|
class TheSeamCarouselSlideDirective {
|
|
17
18
|
template = inject((TemplateRef));
|
|
@@ -259,9 +260,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
259
260
|
}]
|
|
260
261
|
}] });
|
|
261
262
|
|
|
263
|
+
class TheSeamCarouselHarness extends ComponentHarness {
|
|
264
|
+
static hostSelector = 'seam-carousel';
|
|
265
|
+
_content = this.locatorFor('.carousel-content');
|
|
266
|
+
_prevSlideButton = this.locatorForOptional('[title="Go to previous slide"]');
|
|
267
|
+
_nextSlideButton = this.locatorForOptional('[title="Go to next slide"]');
|
|
268
|
+
_playButton = this.locatorForOptional('[title="Play"]');
|
|
269
|
+
_pauseButton = this.locatorForOptional('[title="Pause"]');
|
|
270
|
+
async activeTileIndex() {
|
|
271
|
+
return (await this._content()).getAttribute('data-slide-index');
|
|
272
|
+
}
|
|
273
|
+
async goToPreviousSlide() {
|
|
274
|
+
const prevSlideButton = await this._prevSlideButton();
|
|
275
|
+
if (prevSlideButton === null) {
|
|
276
|
+
throw Error('Previous slide button not found.');
|
|
277
|
+
}
|
|
278
|
+
return prevSlideButton.click();
|
|
279
|
+
}
|
|
280
|
+
async goToNextSlide() {
|
|
281
|
+
const nextSlideButton = await this._nextSlideButton();
|
|
282
|
+
if (nextSlideButton === null) {
|
|
283
|
+
throw Error('Next slide button not found.');
|
|
284
|
+
}
|
|
285
|
+
return nextSlideButton.click();
|
|
286
|
+
}
|
|
287
|
+
async goToSlide(index) {
|
|
288
|
+
return (await this.locatorFor(`[title="Go to slide ${index + 1}"]`)()).click();
|
|
289
|
+
}
|
|
290
|
+
async hasPreviousSlideButton() {
|
|
291
|
+
return (await this._prevSlideButton()) !== null;
|
|
292
|
+
}
|
|
293
|
+
async hasNextSlideButton() {
|
|
294
|
+
return (await this._nextSlideButton()) !== null;
|
|
295
|
+
}
|
|
296
|
+
async hasSlideButton(index) {
|
|
297
|
+
return ((await this.locatorForAll(`[title="Go to slide ${index + 1}"]`)()) !==
|
|
298
|
+
null);
|
|
299
|
+
}
|
|
300
|
+
async hasSlideButtons() {
|
|
301
|
+
return (await this.locatorForAll('[title^="Go to slide"]')()).length > 0;
|
|
302
|
+
}
|
|
303
|
+
async hasAutoPlayToggleButton() {
|
|
304
|
+
return ((await this._playButton()) !== null ||
|
|
305
|
+
(await this._pauseButton()) !== null);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
262
309
|
/**
|
|
263
310
|
* Generated bundle index. Do not edit.
|
|
264
311
|
*/
|
|
265
312
|
|
|
266
|
-
export { TheSeamCarouselComponent, TheSeamCarouselModule, TheSeamCarouselSlideDirective };
|
|
313
|
+
export { TheSeamCarouselComponent, TheSeamCarouselHarness, TheSeamCarouselModule, TheSeamCarouselSlideDirective };
|
|
267
314
|
//# sourceMappingURL=theseam-ui-common-carousel.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theseam-ui-common-carousel.mjs","sources":["../../../projects/ui-common/carousel/carousel-slide.directive.ts","../../../projects/ui-common/carousel/carousel.component.ts","../../../projects/ui-common/carousel/carousel.component.html","../../../projects/ui-common/carousel/carousel.module.ts","../../../projects/ui-common/carousel/theseam-ui-common-carousel.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core'\n\n@Directive({\n selector: '[seamCarouselSlide]',\n exportAs: 'seamCarouselSlide',\n})\nexport class TheSeamCarouselSlideDirective {\n private readonly template = inject(TemplateRef<any>)\n}\n","import { animate, style, transition, trigger } from '@angular/animations'\nimport { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common'\nimport {\n Component,\n ContentChildren,\n Input,\n OnDestroy,\n OnInit,\n QueryList,\n} from '@angular/core'\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion'\nimport {\n BehaviorSubject,\n combineLatest,\n interval,\n Observable,\n Subject,\n} from 'rxjs'\nimport {\n filter,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators'\n\nimport {\n faAngleLeft,\n faAngleRight,\n faPause,\n faPlay,\n} from '@fortawesome/free-solid-svg-icons'\nimport { InputBoolean, InputNumber } from '@theseam/ui-common/core'\nimport { notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\nimport { TheSeamCarouselSlideDirective } from './carousel-slide.directive'\n\n@Component({\n selector: 'seam-carousel',\n templateUrl: './carousel.component.html',\n styleUrls: ['./carousel.component.scss'],\n animations: [\n trigger('fadeInOut', [\n transition('* => *', [\n style({ opacity: '0', height: '*' }),\n animate(250, style({ opacity: '1', height: '*' })),\n ]),\n ]),\n ],\n exportAs: 'seamCarousel',\n imports: [\n NgIf,\n NgFor,\n NgTemplateOutlet,\n AsyncPipe,\n TheSeamIconModule,\n TheSeamButtonsModule,\n ],\n})\nexport class TheSeamCarouselComponent implements OnInit, OnDestroy {\n static ngAcceptInputType_slideInterval: NumberInput\n static ngAcceptInputType_autoPlay: BooleanInput\n static ngAcceptInputType_pauseOnHover: BooleanInput\n static ngAcceptInputType_pauseOnFocus: BooleanInput\n static ngAcceptInputType_showPager: BooleanInput\n static ngAcceptInputType_showNavButtons: BooleanInput\n static ngAcceptInputType_showPauseButton: BooleanInput\n\n readonly faAngleRight = faAngleRight\n readonly faAngleLeft = faAngleLeft\n readonly faPause = faPause\n readonly faPlay = faPlay\n\n /**\n * Duration in ms that slide is displayed before paging.\n * Only applicable when `autoPlay === true`.\n * Defaults to 10000ms.\n */\n @Input() @InputNumber(10000) slideInterval = 10000\n\n /**\n * When `true`, carousel will page automatically.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() autoPlay = true\n\n /**\n * When `true`, will pause automatic paging when user mouses over carousel.\n * Timer will restart when user mouses out.\n * Only applicable when `autoPlay === true`.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() pauseOnHover = true\n\n /**\n * When `true`, will pause automatic paging when user focuses in on item in carousel.\n * Timer will restart when user focuses out.\n * Only applicable when `autoPlay === true`.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() pauseOnFocus = true\n\n /**\n * When `true`, will show pager row at the bottom of the carousel with clickable buttons to navigate directly to a page.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showPager = true\n\n /**\n * When `true`, will show left and right nav button on either side of the carousel to navigate through pages.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showNavButtons = true\n\n /**\n * When `true`, will show pause/play button to stop/restart automatic paging.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showPauseButton = true\n\n @ContentChildren(TheSeamCarouselSlideDirective)\n get slides(): QueryList<TheSeamCarouselSlideDirective> | undefined {\n return this._slides.value\n }\n set slides(value: QueryList<TheSeamCarouselSlideDirective> | undefined) {\n // Check if slides were added or removed that would make the active index not exist.\n const count = value?.length || 0\n const maxIdx = count >= 0 ? count - 1 : 0\n const activeIdx = this._pollActiveIndex.value\n if (activeIdx > maxIdx) {\n this._pollActiveIndex.next(maxIdx)\n } else if (count > 0 && activeIdx < 0) {\n this._pollActiveIndex.next(0)\n }\n\n this._slides.next(value)\n }\n private readonly _slides = new BehaviorSubject<\n QueryList<TheSeamCarouselSlideDirective> | undefined\n >(undefined)\n public readonly slides$ = this._slides.asObservable()\n\n public readonly activeSlide$: Observable<any | undefined>\n\n private readonly _pollActiveIndex = new BehaviorSubject<number>(0)\n public readonly activeIndex$ = this._pollActiveIndex.asObservable()\n\n private readonly _carouselPaused = new BehaviorSubject<boolean>(false)\n public readonly carouselPaused$ = this._carouselPaused.asObservable()\n\n private readonly _carouselStopped = new BehaviorSubject<boolean>(false)\n public readonly carouselStopped$ = this._carouselStopped.asObservable()\n\n private readonly _resetInterval = new Subject<void>()\n\n constructor() {\n this.activeSlide$ = this._pollActiveIndex.pipe(\n startWith(0),\n switchMap((i) => this.slides$.pipe(map((slides) => slides?.get(i)))),\n )\n }\n\n ngOnInit(): void {\n combineLatest([this.carouselPaused$, this.carouselStopped$])\n .pipe(\n tap(([paused, stopped]) => {\n if (paused || stopped) {\n this._resetInterval.next(undefined)\n } else {\n this._startInterval()\n }\n }),\n )\n .subscribe()\n }\n\n ngOnDestroy(): void {\n this._resetInterval.next(undefined)\n this._resetInterval.complete()\n }\n\n private _startInterval() {\n this._resetInterval.next(undefined)\n if (this.autoPlay) {\n interval(this.slideInterval)\n .pipe(\n takeUntil(this._resetInterval),\n tap(() => {\n this.pageCarousel(1)\n }),\n )\n .subscribe()\n }\n }\n\n focusIn() {\n if (this.pauseOnFocus) {\n this.pauseTimer()\n }\n }\n\n focusOut() {\n if (this.pauseOnFocus) {\n this.startTimer()\n }\n }\n\n mouseEnter() {\n if (this.pauseOnHover) {\n this.pauseTimer()\n }\n }\n\n mouseLeave() {\n if (this.pauseOnHover) {\n this.startTimer()\n }\n }\n\n pauseTimer() {\n this._carouselPaused.next(true)\n }\n\n startTimer() {\n if (!this._carouselStopped.value) {\n this._carouselPaused.next(false)\n }\n }\n\n setCarousel(i: number) {\n this._pollActiveIndex.next(i)\n }\n\n pageCarousel(step: number) {\n this.slides$\n .pipe(\n take(1),\n filter((slides) => notNullOrUndefined(slides)),\n map((slides) => {\n const slidesLen = slides?.length || 1\n let index = this._pollActiveIndex.value\n index = index + step\n index = index < 0 ? slidesLen + index : index % slidesLen\n this._pollActiveIndex.next(index)\n }),\n )\n .subscribe()\n }\n\n toggleCarouselStop() {\n const carouselStopped = this._carouselStopped.value\n this._carouselStopped.next(!carouselStopped)\n }\n}\n","<ng-container *ngIf=\"slides$ | async as slides\">\n <div\n class=\"position-relative\"\n *ngIf=\"slides.length\"\n (focusin)=\"focusIn()\"\n (mouseenter)=\"mouseEnter()\"\n (focusout)=\"focusOut()\"\n (mouseleave)=\"mouseLeave()\"\n >\n <div class=\"d-flex\" style=\"min-height: 150px\">\n <button\n *ngIf=\"showNavButtons && slides.length > 1\"\n seamButton\n class=\"carousel-arrow px-2\"\n (click)=\"pageCarousel(-1)\"\n title=\"Go to previous slide\"\n >\n <seam-icon [icon]=\"faAngleLeft\"></seam-icon>\n </button>\n\n <div\n *ngIf=\"activeSlide$ | async as slide\"\n [@fadeInOut]=\"slide.template\"\n class=\"flex-grow-1 d-flex align-items-center\"\n >\n <div\n class=\"carousel-content w-100 py-1 px-2\"\n [attr.data-slide-index]=\"activeIndex$ | async\"\n >\n <ng-template [ngTemplateOutlet]=\"$any(slide.template)\"></ng-template>\n </div>\n </div>\n\n <button\n *ngIf=\"showNavButtons && slides.length > 1\"\n seamButton\n class=\"carousel-arrow px-2\"\n (click)=\"pageCarousel(1)\"\n title=\"Go to next slide\"\n >\n <seam-icon [icon]=\"faAngleRight\"></seam-icon>\n </button>\n </div>\n\n <div\n class=\"carousel-pages d-flex flex-wrap justify-content-center mt-3 mx-auto\"\n *ngIf=\"showPager && slides.length > 1\"\n >\n <button\n *ngFor=\"let q of slides; let i = index\"\n seamButton\n theme=\"light\"\n class=\"carousel-page\"\n [class.active]=\"(activeIndex$ | async) === i\"\n (click)=\"setCarousel(i)\"\n [title]=\"'Go to slide ' + (i + 1)\"\n ></button>\n </div>\n\n <div class=\"carousel-controls\" *ngIf=\"showPauseButton && autoPlay\">\n <button\n *ngIf=\"slides.length > 1\"\n seamButton\n (click)=\"toggleCarouselStop()\"\n [title]=\"(carouselStopped$ | async) ? 'Play' : 'Pause'\"\n >\n <seam-icon\n [icon]=\"faPlay\"\n *ngIf=\"carouselStopped$ | async; else pauseButton\"\n ></seam-icon>\n <ng-template #pauseButton>\n <seam-icon [icon]=\"faPause\"></seam-icon>\n </ng-template>\n </button>\n </div>\n </div>\n</ng-container>\n","import { NgModule } from '@angular/core'\n\nimport { TheSeamCarouselSlideDirective } from './carousel-slide.directive'\nimport { TheSeamCarouselComponent } from './carousel.component'\n\n@NgModule({\n imports: [TheSeamCarouselComponent, TheSeamCarouselSlideDirective],\n exports: [TheSeamCarouselComponent, TheSeamCarouselSlideDirective],\n})\nexport class TheSeamCarouselModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;MAMa,6BAA6B,CAAA;AACvB,IAAA,QAAQ,GAAG,MAAM,EAAC,WAAgB,EAAC;wGADzC,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAJzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,QAAQ,EAAE,mBAAmB;AAC9B,iBAAA;;;MC0DY,wBAAwB,CAAA;IACnC,OAAO,+BAA+B;IACtC,OAAO,0BAA0B;IACjC,OAAO,8BAA8B;IACrC,OAAO,8BAA8B;IACrC,OAAO,2BAA2B;IAClC,OAAO,gCAAgC;IACvC,OAAO,iCAAiC;IAE/B,YAAY,GAAG,YAAY;IAC3B,WAAW,GAAG,WAAW;IACzB,OAAO,GAAG,OAAO;IACjB,MAAM,GAAG,MAAM;AAExB;;;;AAIG;IAC0B,aAAa,GAAG,KAAK;AAElD;;;AAGG;IACsB,QAAQ,GAAG,IAAI;AAExC;;;;;AAKG;IACsB,YAAY,GAAG,IAAI;AAE5C;;;;;AAKG;IACsB,YAAY,GAAG,IAAI;AAE5C;;;AAGG;IACsB,SAAS,GAAG,IAAI;AAEzC;;;AAGG;IACsB,cAAc,GAAG,IAAI;AAE9C;;;AAGG;IACsB,eAAe,GAAG,IAAI;AAE/C,IAAA,IACI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;IAC3B;IACA,IAAI,MAAM,CAAC,KAA2D,EAAA;;AAEpE,QAAA,MAAM,KAAK,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC;AAChC,QAAA,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC;AACzC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK;AAC7C,QAAA,IAAI,SAAS,GAAG,MAAM,EAAE;AACtB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC;aAAO,IAAI,KAAK,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1B;AACiB,IAAA,OAAO,GAAG,IAAI,eAAe,CAE5C,SAAS,CAAC;AACI,IAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AAErC,IAAA,YAAY;AAEX,IAAA,gBAAgB,GAAG,IAAI,eAAe,CAAS,CAAC,CAAC;AAClD,IAAA,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE;AAElD,IAAA,eAAe,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACtD,IAAA,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AAEpD,IAAA,gBAAgB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACvD,IAAA,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE;AAEtD,IAAA,cAAc,GAAG,IAAI,OAAO,EAAQ;AAErD,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAC5C,SAAS,CAAC,CAAC,CAAC,EACZ,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrE;IACH;IAEA,QAAQ,GAAA;QACN,aAAa,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC;aACxD,IAAI,CACH,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,KAAI;AACxB,YAAA,IAAI,MAAM,IAAI,OAAO,EAAE;AACrB,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;YACrC;iBAAO;gBACL,IAAI,CAAC,cAAc,EAAE;YACvB;AACF,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,EAAE;IAChB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;AACnC,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;IAChC;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;AACnC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,QAAQ,CAAC,IAAI,CAAC,aAAa;iBACxB,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,EAC9B,GAAG,CAAC,MAAK;AACP,gBAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AACtB,YAAA,CAAC,CAAC;AAEH,iBAAA,SAAS,EAAE;QAChB;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;AAChC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC;IACF;AAEA,IAAA,WAAW,CAAC,CAAS,EAAA;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B;AAEA,IAAA,YAAY,CAAC,IAAY,EAAA;AACvB,QAAA,IAAI,CAAC;aACF,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,MAAM,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAC9C,GAAG,CAAC,CAAC,MAAM,KAAI;AACb,YAAA,MAAM,SAAS,GAAG,MAAM,EAAE,MAAM,IAAI,CAAC;AACrC,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK;AACvC,YAAA,KAAK,GAAG,KAAK,GAAG,IAAI;AACpB,YAAA,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS;AACzD,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AACnC,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,EAAE;IAChB;IAEA,kBAAkB,GAAA;AAChB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK;QACnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;IAC9C;wGAjMW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,4TA6DlB,6BAA6B,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5HhD,6zEA6EA,EAAA,MAAA,EAAA,CAAA,kbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtBI,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,gBAAgB,mJAEhB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAFpB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,UAAA,EAbC;YACV,OAAO,CAAC,WAAW,EAAE;gBACnB,UAAU,CAAC,QAAQ,EAAE;oBACnB,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACpC,oBAAA,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;iBACnD,CAAC;aACH,CAAC;AACH,SAAA,EAAA,CAAA;;AA8B4B,UAAA,CAAA;IAAnB,WAAW,CAAC,KAAK;AAAuB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,eAAA,EAAA,KAAA,CAAA,CAAA;AAMzB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAkB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,UAAA,EAAA,KAAA,CAAA,CAAA;AAQf,UAAA,CAAA;AAAf,IAAA,YAAY;AAAsB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,cAAA,EAAA,KAAA,CAAA,CAAA;AAQnB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAsB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,cAAA,EAAA,KAAA,CAAA,CAAA;AAMnB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAmB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA;AAMhB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAwB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,gBAAA,EAAA,KAAA,CAAA,CAAA;AAMrB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAyB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,iBAAA,EAAA,KAAA,CAAA,CAAA;4FA3DpC,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAtBpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,UAAA,EAGb;wBACV,OAAO,CAAC,WAAW,EAAE;4BACnB,UAAU,CAAC,QAAQ,EAAE;gCACnB,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACpC,gCAAA,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;6BACnD,CAAC;yBACH,CAAC;AACH,qBAAA,EAAA,QAAA,EACS,cAAc,EAAA,OAAA,EACf;wBACP,IAAI;wBACJ,KAAK;wBACL,gBAAgB;wBAChB,SAAS;wBACT,iBAAiB;wBACjB,oBAAoB;AACrB,qBAAA,EAAA,QAAA,EAAA,6zEAAA,EAAA,MAAA,EAAA,CAAA,kbAAA,CAAA,EAAA;;sBAqBA;;sBAMA;;sBAQA;;sBAQA;;sBAMA;;sBAMA;;sBAMA;;sBAEA,eAAe;uBAAC,6BAA6B;;;MEnHnC,qBAAqB,CAAA;wGAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAHtB,wBAAwB,EAAE,6BAA6B,CAAA,EAAA,OAAA,EAAA,CACvD,wBAAwB,EAAE,6BAA6B,CAAA,EAAA,CAAA;AAEtD,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAHtB,wBAAwB,CAAA,EAAA,CAAA;;4FAGvB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;AAClE,oBAAA,OAAO,EAAE,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;AACnE,iBAAA;;;ACRD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"theseam-ui-common-carousel.mjs","sources":["../../../projects/ui-common/carousel/carousel-slide.directive.ts","../../../projects/ui-common/carousel/carousel.component.ts","../../../projects/ui-common/carousel/carousel.component.html","../../../projects/ui-common/carousel/carousel.module.ts","../../../projects/ui-common/carousel/testing/carousel-harness.ts","../../../projects/ui-common/carousel/theseam-ui-common-carousel.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core'\n\n@Directive({\n selector: '[seamCarouselSlide]',\n exportAs: 'seamCarouselSlide',\n})\nexport class TheSeamCarouselSlideDirective {\n private readonly template = inject(TemplateRef<any>)\n}\n","import { animate, style, transition, trigger } from '@angular/animations'\nimport { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common'\nimport {\n Component,\n ContentChildren,\n Input,\n OnDestroy,\n OnInit,\n QueryList,\n} from '@angular/core'\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion'\nimport {\n BehaviorSubject,\n combineLatest,\n interval,\n Observable,\n Subject,\n} from 'rxjs'\nimport {\n filter,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators'\n\nimport {\n faAngleLeft,\n faAngleRight,\n faPause,\n faPlay,\n} from '@fortawesome/free-solid-svg-icons'\nimport { InputBoolean, InputNumber } from '@theseam/ui-common/core'\nimport { notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\nimport { TheSeamCarouselSlideDirective } from './carousel-slide.directive'\n\n@Component({\n selector: 'seam-carousel',\n templateUrl: './carousel.component.html',\n styleUrls: ['./carousel.component.scss'],\n animations: [\n trigger('fadeInOut', [\n transition('* => *', [\n style({ opacity: '0', height: '*' }),\n animate(250, style({ opacity: '1', height: '*' })),\n ]),\n ]),\n ],\n exportAs: 'seamCarousel',\n imports: [\n NgIf,\n NgFor,\n NgTemplateOutlet,\n AsyncPipe,\n TheSeamIconModule,\n TheSeamButtonsModule,\n ],\n})\nexport class TheSeamCarouselComponent implements OnInit, OnDestroy {\n static ngAcceptInputType_slideInterval: NumberInput\n static ngAcceptInputType_autoPlay: BooleanInput\n static ngAcceptInputType_pauseOnHover: BooleanInput\n static ngAcceptInputType_pauseOnFocus: BooleanInput\n static ngAcceptInputType_showPager: BooleanInput\n static ngAcceptInputType_showNavButtons: BooleanInput\n static ngAcceptInputType_showPauseButton: BooleanInput\n\n readonly faAngleRight = faAngleRight\n readonly faAngleLeft = faAngleLeft\n readonly faPause = faPause\n readonly faPlay = faPlay\n\n /**\n * Duration in ms that slide is displayed before paging.\n * Only applicable when `autoPlay === true`.\n * Defaults to 10000ms.\n */\n @Input() @InputNumber(10000) slideInterval = 10000\n\n /**\n * When `true`, carousel will page automatically.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() autoPlay = true\n\n /**\n * When `true`, will pause automatic paging when user mouses over carousel.\n * Timer will restart when user mouses out.\n * Only applicable when `autoPlay === true`.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() pauseOnHover = true\n\n /**\n * When `true`, will pause automatic paging when user focuses in on item in carousel.\n * Timer will restart when user focuses out.\n * Only applicable when `autoPlay === true`.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() pauseOnFocus = true\n\n /**\n * When `true`, will show pager row at the bottom of the carousel with clickable buttons to navigate directly to a page.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showPager = true\n\n /**\n * When `true`, will show left and right nav button on either side of the carousel to navigate through pages.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showNavButtons = true\n\n /**\n * When `true`, will show pause/play button to stop/restart automatic paging.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showPauseButton = true\n\n @ContentChildren(TheSeamCarouselSlideDirective)\n get slides(): QueryList<TheSeamCarouselSlideDirective> | undefined {\n return this._slides.value\n }\n set slides(value: QueryList<TheSeamCarouselSlideDirective> | undefined) {\n // Check if slides were added or removed that would make the active index not exist.\n const count = value?.length || 0\n const maxIdx = count >= 0 ? count - 1 : 0\n const activeIdx = this._pollActiveIndex.value\n if (activeIdx > maxIdx) {\n this._pollActiveIndex.next(maxIdx)\n } else if (count > 0 && activeIdx < 0) {\n this._pollActiveIndex.next(0)\n }\n\n this._slides.next(value)\n }\n private readonly _slides = new BehaviorSubject<\n QueryList<TheSeamCarouselSlideDirective> | undefined\n >(undefined)\n public readonly slides$ = this._slides.asObservable()\n\n public readonly activeSlide$: Observable<any | undefined>\n\n private readonly _pollActiveIndex = new BehaviorSubject<number>(0)\n public readonly activeIndex$ = this._pollActiveIndex.asObservable()\n\n private readonly _carouselPaused = new BehaviorSubject<boolean>(false)\n public readonly carouselPaused$ = this._carouselPaused.asObservable()\n\n private readonly _carouselStopped = new BehaviorSubject<boolean>(false)\n public readonly carouselStopped$ = this._carouselStopped.asObservable()\n\n private readonly _resetInterval = new Subject<void>()\n\n constructor() {\n this.activeSlide$ = this._pollActiveIndex.pipe(\n startWith(0),\n switchMap((i) => this.slides$.pipe(map((slides) => slides?.get(i)))),\n )\n }\n\n ngOnInit(): void {\n combineLatest([this.carouselPaused$, this.carouselStopped$])\n .pipe(\n tap(([paused, stopped]) => {\n if (paused || stopped) {\n this._resetInterval.next(undefined)\n } else {\n this._startInterval()\n }\n }),\n )\n .subscribe()\n }\n\n ngOnDestroy(): void {\n this._resetInterval.next(undefined)\n this._resetInterval.complete()\n }\n\n private _startInterval() {\n this._resetInterval.next(undefined)\n if (this.autoPlay) {\n interval(this.slideInterval)\n .pipe(\n takeUntil(this._resetInterval),\n tap(() => {\n this.pageCarousel(1)\n }),\n )\n .subscribe()\n }\n }\n\n focusIn() {\n if (this.pauseOnFocus) {\n this.pauseTimer()\n }\n }\n\n focusOut() {\n if (this.pauseOnFocus) {\n this.startTimer()\n }\n }\n\n mouseEnter() {\n if (this.pauseOnHover) {\n this.pauseTimer()\n }\n }\n\n mouseLeave() {\n if (this.pauseOnHover) {\n this.startTimer()\n }\n }\n\n pauseTimer() {\n this._carouselPaused.next(true)\n }\n\n startTimer() {\n if (!this._carouselStopped.value) {\n this._carouselPaused.next(false)\n }\n }\n\n setCarousel(i: number) {\n this._pollActiveIndex.next(i)\n }\n\n pageCarousel(step: number) {\n this.slides$\n .pipe(\n take(1),\n filter((slides) => notNullOrUndefined(slides)),\n map((slides) => {\n const slidesLen = slides?.length || 1\n let index = this._pollActiveIndex.value\n index = index + step\n index = index < 0 ? slidesLen + index : index % slidesLen\n this._pollActiveIndex.next(index)\n }),\n )\n .subscribe()\n }\n\n toggleCarouselStop() {\n const carouselStopped = this._carouselStopped.value\n this._carouselStopped.next(!carouselStopped)\n }\n}\n","<ng-container *ngIf=\"slides$ | async as slides\">\n <div\n class=\"position-relative\"\n *ngIf=\"slides.length\"\n (focusin)=\"focusIn()\"\n (mouseenter)=\"mouseEnter()\"\n (focusout)=\"focusOut()\"\n (mouseleave)=\"mouseLeave()\"\n >\n <div class=\"d-flex\" style=\"min-height: 150px\">\n <button\n *ngIf=\"showNavButtons && slides.length > 1\"\n seamButton\n class=\"carousel-arrow px-2\"\n (click)=\"pageCarousel(-1)\"\n title=\"Go to previous slide\"\n >\n <seam-icon [icon]=\"faAngleLeft\"></seam-icon>\n </button>\n\n <div\n *ngIf=\"activeSlide$ | async as slide\"\n [@fadeInOut]=\"slide.template\"\n class=\"flex-grow-1 d-flex align-items-center\"\n >\n <div\n class=\"carousel-content w-100 py-1 px-2\"\n [attr.data-slide-index]=\"activeIndex$ | async\"\n >\n <ng-template [ngTemplateOutlet]=\"$any(slide.template)\"></ng-template>\n </div>\n </div>\n\n <button\n *ngIf=\"showNavButtons && slides.length > 1\"\n seamButton\n class=\"carousel-arrow px-2\"\n (click)=\"pageCarousel(1)\"\n title=\"Go to next slide\"\n >\n <seam-icon [icon]=\"faAngleRight\"></seam-icon>\n </button>\n </div>\n\n <div\n class=\"carousel-pages d-flex flex-wrap justify-content-center mt-3 mx-auto\"\n *ngIf=\"showPager && slides.length > 1\"\n >\n <button\n *ngFor=\"let q of slides; let i = index\"\n seamButton\n theme=\"light\"\n class=\"carousel-page\"\n [class.active]=\"(activeIndex$ | async) === i\"\n (click)=\"setCarousel(i)\"\n [title]=\"'Go to slide ' + (i + 1)\"\n ></button>\n </div>\n\n <div class=\"carousel-controls\" *ngIf=\"showPauseButton && autoPlay\">\n <button\n *ngIf=\"slides.length > 1\"\n seamButton\n (click)=\"toggleCarouselStop()\"\n [title]=\"(carouselStopped$ | async) ? 'Play' : 'Pause'\"\n >\n <seam-icon\n [icon]=\"faPlay\"\n *ngIf=\"carouselStopped$ | async; else pauseButton\"\n ></seam-icon>\n <ng-template #pauseButton>\n <seam-icon [icon]=\"faPause\"></seam-icon>\n </ng-template>\n </button>\n </div>\n </div>\n</ng-container>\n","import { NgModule } from '@angular/core'\n\nimport { TheSeamCarouselSlideDirective } from './carousel-slide.directive'\nimport { TheSeamCarouselComponent } from './carousel.component'\n\n@NgModule({\n imports: [TheSeamCarouselComponent, TheSeamCarouselSlideDirective],\n exports: [TheSeamCarouselComponent, TheSeamCarouselSlideDirective],\n})\nexport class TheSeamCarouselModule {}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamCarouselHarness extends ComponentHarness {\n static hostSelector = 'seam-carousel'\n\n _content = this.locatorFor('.carousel-content')\n _prevSlideButton = this.locatorForOptional('[title=\"Go to previous slide\"]')\n _nextSlideButton = this.locatorForOptional('[title=\"Go to next slide\"]')\n _playButton = this.locatorForOptional('[title=\"Play\"]')\n _pauseButton = this.locatorForOptional('[title=\"Pause\"]')\n\n public async activeTileIndex() {\n return (await this._content()).getAttribute('data-slide-index')\n }\n\n public async goToPreviousSlide() {\n const prevSlideButton = await this._prevSlideButton()\n if (prevSlideButton === null) {\n throw Error('Previous slide button not found.')\n }\n return prevSlideButton.click()\n }\n\n public async goToNextSlide() {\n const nextSlideButton = await this._nextSlideButton()\n if (nextSlideButton === null) {\n throw Error('Next slide button not found.')\n }\n return nextSlideButton.click()\n }\n\n public async goToSlide(index: number) {\n return (\n await this.locatorFor(`[title=\"Go to slide ${index + 1}\"]`)()\n ).click()\n }\n\n public async hasPreviousSlideButton() {\n return (await this._prevSlideButton()) !== null\n }\n\n public async hasNextSlideButton() {\n return (await this._nextSlideButton()) !== null\n }\n\n public async hasSlideButton(index: number) {\n return (\n (await this.locatorForAll(`[title=\"Go to slide ${index + 1}\"]`)()) !==\n null\n )\n }\n\n public async hasSlideButtons() {\n return (await this.locatorForAll('[title^=\"Go to slide\"]')()).length > 0\n }\n\n public async hasAutoPlayToggleButton() {\n return (\n (await this._playButton()) !== null ||\n (await this._pauseButton()) !== null\n )\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|