/**
* @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
/**
* @module track-changes/ui/view/basesuggestionthreadview
* @publicApi
*/
import { FocusCycler, View, ViewCollection, type FocusableView } from "@ckeditor/ckeditor5-ui";
import { FocusTracker, KeystrokeHandler, type Locale } from "@ckeditor/ckeditor5-utils";
import type { EditorConfig } from "@ckeditor/ckeditor5-core";
import { type Suggestion } from "../../suggestion.js";
import type { CommentsListView, CommentThreadInputView, CommentView } from "@ckeditor/ckeditor5-comments";
import { AriaDescriptionView, type User } from "@ckeditor/ckeditor5-collaboration-core";
import type { SuggestionDescription } from "../../suggestiondescriptionfactory.js";
import { type SuggestionView } from "./suggestionview.js";
/**
* An abstract suggestion thread view class that should be used as a base for suggestion thread view implementations.
* It provides some behaviors, flags and building blocks to use when creating a custom suggestion thread view class.
*
* All events fired by {@link module:comments/comments/ui/view/basecommentview~BaseCommentView}
* are delegated to {@link module:track-changes/ui/view/basesuggestionthreadview~BaseSuggestionThreadView}.
* This means that {@link module:track-changes/ui/view/basesuggestionthreadview~BaseSuggestionThreadView} can also fire these
* events to communicate with CKEditor 5 collaboration features.
*
* For the usage examples check the {@glink features/collaboration/annotations/annotations-custom-view
* Annotations custom view} guide.
*/
export declare abstract class BaseSuggestionThreadView extends View {
	/**
	* The list of comment views. It should be used as a part of the view template when present.
	*/
	commentsListView: CommentsListView | null;
	/**
	* The comment input area view. It should be used as a part of the view template when present.
	*/
	commentThreadInputView: CommentThreadInputView | null;
	/**
	* A helper view that provides an ARIA description for the comment thread used by
	* assistive technologies.
	*/
	readonly ariaDescriptionView: AriaDescriptionView;
	/**
	* A boolean value that informs if the comment thread view is in the active state ("highlighted").
	* A comment thread view is in this state when it is focused or was activated by the user in any different way.
	*
	* @observable
	*/
	isActive: boolean;
	/**
	* Suggestion creation date.
	*
	* @observable
	*/
	authoredAt: Date | null;
	/**
	* Flag that indicates whether suggestion acceptation is possible.
	*
	* @observable
	*/
	canAccept: boolean;
	/**
	* Flag that indicates whether suggestion discarding is possible.
	*
	* @observable
	*/
	canDiscard: boolean;
	/**
	* Stores description entries generated for this suggestion that describe what is the suggested change.
	* They are used to create the final description presented in the suggestion view to the user.
	*
	* Note that one suggestion may include multiple changes.
	*
	* Most cases are simple and include just one description item:
	*
	*  ```ts
	* [
	*		{ type: 'insertion', content: '*Insert:* "Foo"' }
	* ]
	*	```
	*
	* This description item represents a suggestion for inserting the "Foo" text. The `type` property describes the performed action
	* while the `content` property contains additional information about the action and is optional.
	*
	* A more complex example is presented below:
	*
	* ```ts
	* [
	*		{ type: 'insertion', content: '*Insert:* 2 paragraphs' },
	*		{ type: 'insertion', content: '*Insert:* image' },
	*		{ type: 'replace', content: '*Replace:* "Foo" *with* "Bar"' }
	* ]
	* ```
	*
	* In this example, there are three description instances (or lines). Two new (empty) paragraphs were added,
	* an image was added and then "Foo" text was replaced by "Bar". The above structure could be rendered as:
	*
	*  ```html
	*	<p><strong>Insert:</strong> 2 paragraphs</p>
	*	<p><strong>Insert:</strong> image</p>
	*	<p><strong>Replace:</strong> "Foo" <strong>with</strong> "Bar"</p>
	*	```
	*
	* @observable
	*/
	descriptionParts: Array<SuggestionDescription>;
	/**
	* Informs whether the suggestion thread has any changes that have not been saved.
	*
	* @observable
	*/
	isDirty: boolean;
	/**
	* Informs whether the suggestion can be accepted or discarded.
	*
	* @observable
	*/
	isEnabled: boolean;
	/**
	* The number of items in the view, where the suggestion itself counts as one.
	*
	* In other words, it is equal to the number of comments in the suggestion thread view plus one.
	*
	* @observable
	*/
	readonly length: number;
	/**
	* An accessible thread label text exposed to assistive technologies.
	*/
	ariaLabel: string;
	/**
	* A collection of focusable child views.
	*/
	readonly focusables: ViewCollection<FocusableView>;
	/**
	* Tracks information about DOM focus in the thread.
	*/
	readonly focusTracker: FocusTracker;
	/**
	* Instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.
	*/
	readonly keystrokes: KeystrokeHandler;
	/**
	* Helps cycling over focusable views in the thread.
	*/
	readonly focusCycler: FocusCycler;
	constructor(locale: Locale, model: Suggestion, localUser: User, config: SuggestionThreadConfig);
	/**
	* @inheritDoc
	*/
	override render(): void;
	/**
	* Focuses the view.
	*/
	focus(): void;
	/**
	* @inheritDoc
	*/
	override destroy(): void;
}
/**
* Fired when a user performed an action that should lead to accepting the suggestion.
*
* This event is not fired by default by any component created by `BaseSuggestionThreadView`.
* If you create a view class extending `BaseSuggestionCommentView`, you should provide
* a UI element that will fire this event.
*
* @eventName ~BaseSuggestionThreadView#acceptSuggestion
*/
export type AcceptSuggestionEvent = {
	name: "acceptSuggestion";
	args: [id: string];
};
/**
* Fired when a user performed an action that should lead to discarding the suggestion.
*
* This event is not fired by default by any component created by `BaseSuggestionThreadView`.
* If you create a view class extending `BaseSuggestionCommentView`, you should provide
* a UI element that will fire this event.
*
* @eventName ~BaseSuggestionThreadView#discardSuggestion
*/
export type DiscardSuggestionEvent = {
	name: "discardSuggestion";
	args: [id: string];
};
/**
* Config used for suggestion thread views.
*/
export interface SuggestionThreadConfig {
	disableComments: boolean;
	editorConfig: EditorConfig;
	maxCommentsWhenCollapsed: number;
	maxThreadTotalWeight: number;
	maxCommentCharsWhenCollapsed: number;
	formatDateTime: (date: Date | string) => string;
	CommentView: typeof CommentView;
	CommentsListView: typeof CommentsListView;
	CommentThreadInputView: typeof CommentThreadInputView;
	SuggestionView: typeof SuggestionView;
	showAISource: "pill" | "author" | null;
	aiAuthor: {
		name: string;
		avatar?: string;
	};
}
