/**
* @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/suggestionview
* @publicApi
*/
import { FocusTracker, KeystrokeHandler, type Locale } from "@ckeditor/ckeditor5-utils";
import { View, type TemplateDefinition, type FocusableView, ViewCollection, FocusCycler } from "@ckeditor/ckeditor5-ui";
import { LateFocusButtonView, UserView } from "@ckeditor/ckeditor5-collaboration-core";
import { type Suggestion } from "../../suggestion.js";
/**
* A view displaying a detailed information about the suggestion as well as controls to accept or discard it.
*
* This view can be replaced by other view by overwriting the
* {@link module:track-changes/trackchangesconfig~TrackChangesConfig#SuggestionView} configuration.
*/
export declare class SuggestionView extends View implements FocusableView {
	/**
	* A suggestion description explaining what has been changed. To be presented to the user.
	*
	* @observable
	*/
	description: string;
	/**
	* A user view for the suggestion author.
	*/
	userView: UserView;
	/**
	* A button view for the button that accepts the suggestion.
	*/
	acceptButton: LateFocusButtonView;
	/**
	* A button view for the button that discards the suggestion.
	*/
	discardButton: LateFocusButtonView;
	/**
	* A collection of focusable child views.
	*/
	readonly focusables: ViewCollection<FocusableView>;
	/**
	* Tracks information about DOM focus in the suggestion.
	*/
	readonly focusTracker: FocusTracker;
	/**
	* Instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.
	*/
	readonly keystrokes: KeystrokeHandler;
	/**
	* Helps cycling over focusable views in the suggestion.
	*/
	readonly focusCycler: FocusCycler;
	/**
	* Suggestion creation date.
	*
	* @observable
	*/
	authoredAt: Date | null;
	constructor(locale: Locale, model: Suggestion, config: SuggestionConfig);
	/**
	* @inheritDoc
	*/
	override render(): void;
	/**
	* Returns a template definition that will be passed to {@link module:ui/view~View#setTemplate}.
	*
	* Overwrite this method if you want to set a custom template for the suggestion view.
	*
	* The template looks as follows:
	*
	* ```ts
	* const bind = this.bindTemplate;
	* const suggestionContentElements = [
	* 	{
	* 		tag: 'div',
	*
	* 		attributes: {
	* 			class: [ 'ck-suggestion__info', 'ck-annotation__info' ]
	* 		},
	*
	* 		children: [
	* 			{
	* 				tag: 'span',
	*
	* 				children: [
	* 					{
	* 						text: this.userView.name
	* 					}
	* 				],
	*
	* 				attributes: {
	* 					class: [ 'ck-suggestion__info-name', 'ck-annotation__info-name' ]
	* 				}
	* 			},
	* 			{
	* 				tag: 'time',
	*
	* 				attributes: {
	* 					datetime: bind.to( 'authoredAt' ),
	* 					class: [ 'ck-comment__info-time', 'ck-annotation__info-time' ]
	* 				},
	*
	* 				children: [
	* 					{
	* 						text: bind.to( 'authoredAt', value => this._config.formatDateTime( value ) )
	* 					}
	* 				]
	* 			}
	* 		]
	* 	},
	* 	{
	* 		tag: 'div',
	*
	* 		attributes: {
	* 			class: [ 'ck-suggestion__actions', 'ck-annotation__actions' ]
	* 		},
	*
	* 		children: [
	* 			this.acceptButton,
	* 			this.discardButton
	* 		]
	* 	},
	* 	{
	* 		tag: 'div',
	*
	* 		attributes: {
	* 			class: [ 'ck-annotation__content-wrapper' ]
	* 		}
	* 	}
	* ];
	*
	* if ( this._model.isExternal ) {
	* 	suggestionContentElements.push( {
	* 		tag: 'div',
	*
	* 		attributes: {
	* 			class: [ 'ck-comment__external' ]
	* 		},
	*
	* 		children: [ {
	* 			text: this.getExternalSuggestionNote()
	* 		} ]
	* 	} );
	* }
	*
	* if ( this._model.aiSource && this._config.showAISource ) {
	* 	const pillView = new PillView( this.locale );
	*
	* 	pillView.set( {
	* 		icon: IconSparkle,
	* 		label: getTranslation( this.locale, 'AI_SOURCE_PILL_LABEL' ),
	* 		tooltip: getTranslation( this.locale, 'AI_SOURCE_PILL_TOOLTIP' ),
	* 		class: 'ck-pill_ai'
	* 	} );
	*
	* 	suggestionContentElements.push( {
	* 		tag: 'div',
	*
	* 		attributes: {
	* 			class: [ 'ck-suggestion__ai-source-pill' ]
	* 		},
	*
	* 		children: [ pillView ]
	* 	} );
	* }
	*
	* return {
	* 	tag: 'div',
	*
	* 	attributes: {
	* 		class: [
	* 			'ck-suggestion',
	* 			'ck-annotation'
	* 		],
	* 		tabindex: -1
	* 	},
	*
	* 	children: [
	* 		this.userView,
	* 		{
	* 			tag: 'div',
	*
	* 			attributes: {
	* 				class: [ 'ck-suggestion__main', 'ck-annotation__main' ],
	* 				role: 'presentation'
	* 			},
	*
	* 			children: suggestionContentElements
	* 		}
	* 	]
	* };
	* ```
	*/
	getTemplate(): TemplateDefinition;
	/**
	* @inheritDoc
	*/
	focus(): void;
	/**
	* Gets the translated notification text which indicates that the author name comes from an external source.
	*/
	getUserViewNotificationText(): string | null;
	/**
	* Gets the translated note which indicates that the suggestion comes from an external source.
	*/
	getExternalSuggestionNote(): string;
}
export interface SuggestionConfig {
	formatDateTime: (date: Date | string) => string;
	/**
	* How the AI source of an AI-authored suggestion should be surfaced in the view.
	*
	* See {@link module:track-changes/trackchangesconfig~TrackChangesConfig#showAISource}.
	*/
	showAISource: "pill" | "author" | null;
	/**
	* The view-only identity used to render AI-sourced suggestions when {@link #showAISource} is `'author'`.
	*
	* See {@link module:track-changes/trackchangesconfig~TrackChangesConfig#aiAuthor}.
	*/
	aiAuthor: {
		name: string;
		avatar?: string;
	};
}
