@ckeditor/ckeditor5-ui
Version:
The UI framework and standard UI library of CKEditor 5.
288 lines (287 loc) • 12.2 kB
TypeScript
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
/**
* @module ui/toolbar/toolbarview
*/
import View from '../view.js';
import { type FocusableView } from '../focuscycler.js';
import type ComponentFactory from '../componentfactory.js';
import type ViewCollection from '../viewcollection.js';
import type DropdownPanelFocusable from '../dropdown/dropdownpanelfocusable.js';
import { FocusTracker, KeystrokeHandler, type Locale } from '@ckeditor/ckeditor5-utils';
import type { ToolbarConfig } from '@ckeditor/ckeditor5-core';
import '../../theme/components/toolbar/toolbar.css';
export declare const NESTED_TOOLBAR_ICONS: Record<string, string | undefined>;
/**
* The toolbar view class.
*/
export default class ToolbarView extends View implements DropdownPanelFocusable {
/**
* A reference to the options object passed to the constructor.
*/
readonly options: ToolbarOptions;
/**
* A collection of toolbar items (buttons, dropdowns, etc.).
*/
readonly items: ViewCollection;
/**
* Tracks information about the DOM focus in the toolbar.
*/
readonly focusTracker: FocusTracker;
/**
* An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}
* to handle keyboard navigation in the toolbar.
*/
readonly keystrokes: KeystrokeHandler;
/**
* A (child) view containing {@link #items toolbar items}.
*/
readonly itemsView: ItemsView;
/**
* A top–level collection aggregating building blocks of the toolbar.
*
* ┌───────────────── ToolbarView ─────────────────┐
* | ┌──────────────── #children ────────────────┐ |
* | | ┌──────────── #itemsView ───────────┐ | |
* | | | [ item1 ] [ item2 ] ... [ itemN ] | | |
* | | └──────────────────────────────────-┘ | |
* | └───────────────────────────────────────────┘ |
* └───────────────────────────────────────────────┘
*
* By default, it contains the {@link #itemsView} but it can be extended with additional
* UI elements when necessary.
*/
readonly children: ViewCollection;
/**
* A collection of {@link #items} that take part in the focus cycling
* (i.e. navigation using the keyboard). Usually, it contains a subset of {@link #items} with
* some optional UI elements that also belong to the toolbar and should be focusable
* by the user.
*/
readonly focusables: ViewCollection<FocusableView>;
locale: Locale;
/**
* The property reflected by the `role` DOM attribute to be used by assistive technologies.
*
* @observable
* @default 'toolbar'
*/
role: string | undefined;
/**
* Label used by assistive technologies to describe this toolbar element.
*
* @observable
* @default 'Editor toolbar'
*/
ariaLabel: string;
/**
* The maximum width of the toolbar element.
*
* **Note**: When set to a specific value (e.g. `'200px'`), the value will affect the behavior of the
* {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull}
* option by changing the number of {@link #items} that will be displayed in the toolbar at a time.
*
* @observable
* @default 'auto'
*/
maxWidth: string;
/**
* An additional CSS class added to the {@link #element}.
*
* @observable
* @type {String}
*/
class: string | undefined;
/**
* When set true, makes the toolbar look compact with {@link #element}.
*
* @observable
* @default false
*/
isCompact: boolean;
/**
* Controls the orientation of toolbar items. Only available when
* {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull dynamic items grouping}
* is **disabled**.
*
* @observable
*/
isVertical: boolean;
/**
* Indicates whether the toolbar responds to changes in the geometry (e.g. window resize) by grouping excessive items or not.
*/
isGrouping: boolean;
/**
* Helps cycling over {@link #focusables focusable items} in the toolbar.
*/
private readonly _focusCycler;
/**
* An instance of the active toolbar behavior that shapes its look and functionality.
*
* See {@link module:ui/toolbar/toolbarview~ToolbarBehavior} to learn more.
*/
private _behavior;
/**
* Creates an instance of the {@link module:ui/toolbar/toolbarview~ToolbarView} class.
*
* Also see {@link #render}.
*
* @param locale The localization services instance.
* @param options Configuration options of the toolbar.
*/
constructor(locale: Locale, options?: ToolbarOptions);
/**
* @inheritDoc
*/
render(): void;
/**
* @inheritDoc
*/
destroy(): void;
/**
* Focuses the first focusable in {@link #focusables}.
*/
focus(): void;
/**
* Focuses the last focusable in {@link #focusables}.
*/
focusLast(): void;
/**
* A utility that expands the plain toolbar configuration into
* {@link module:ui/toolbar/toolbarview~ToolbarView#items} using a given component factory.
*
* @param itemsOrConfig The toolbar items or the entire toolbar configuration object.
* @param factory A factory producing toolbar items.
* @param removeItems An array of items names to be removed from the configuration. When present, applies
* to this toolbar and all nested ones as well.
*/
fillFromConfig(itemsOrConfig: ToolbarConfig | undefined, factory: ComponentFactory, removeItems?: Array<string>): void;
/**
* Changes the behavior of toolbar if it does not fit into the available space.
*/
switchBehavior(newBehaviorType: 'dynamic' | 'static'): void;
/**
* A utility that expands the plain toolbar configuration into a list of view items using a given component factory.
*
* @param itemsOrConfig The toolbar items or the entire toolbar configuration object.
* @param factory A factory producing toolbar items.
* @param removeItems An array of items names to be removed from the configuration. When present, applies
* to this toolbar and all nested ones as well.
*/
private _buildItemsFromConfig;
/**
* Cleans up the {@link module:ui/toolbar/toolbarview~ToolbarView#items} of the toolbar by removing unwanted items and
* duplicated (obsolete) separators or line breaks.
*
* @param items The toolbar items configuration.
* @param factory A factory producing toolbar items.
* @param removeItems An array of items names to be removed from the configuration.
* @returns Items after the clean-up.
*/
private _cleanItemsConfiguration;
/**
* Remove leading, trailing, and duplicated separators (`-` and `|`).
*
* @returns Toolbar items after the separator and line break clean-up.
*/
private _cleanSeparatorsAndLineBreaks;
/**
* Creates a user-defined dropdown containing a toolbar with items.
*
* @param definition A definition of the nested toolbar dropdown.
* @param definition.label A label of the dropdown.
* @param definition.icon An icon of the drop-down. One of 'bold', 'plus', 'text', 'importExport', 'alignLeft',
* 'paragraph' or an SVG string. When `false` is passed, no icon will be used.
* @param definition.withText When set `true`, the label of the dropdown will be visible. See
* {@link module:ui/button/buttonview~ButtonView#withText} to learn more.
* @param definition.tooltip A tooltip of the dropdown button. See
* {@link module:ui/button/buttonview~ButtonView#tooltip} to learn more. Defaults to `true`.
* @param componentFactory Component factory used to create items
* of the nested toolbar.
*/
private _createNestedToolbarDropdown;
}
/**
* Fired when some toolbar {@link ~ToolbarView#items} were grouped or ungrouped as a result of some change
* in the toolbar geometry.
*
* **Note**: This event is always fired **once** regardless of the number of items that were be
* grouped or ungrouped at a time.
*
* **Note**: This event is fired only if the items grouping functionality was enabled in
* the first place (see {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull}).
*
* @eventName ~ToolbarView#groupedItemsUpdate
*/
export type ToolbarViewGroupedItemsUpdateEvent = {
name: 'groupedItemsUpdate';
args: [];
};
/**
* An inner block of the {@link module:ui/toolbar/toolbarview~ToolbarView} hosting its
* {@link module:ui/toolbar/toolbarview~ToolbarView#items}.
*/
declare class ItemsView extends View {
/**
* A collection of items (buttons, dropdowns, etc.).
*/
readonly children: ViewCollection;
/**
* @inheritDoc
*/
constructor(locale?: Locale);
}
/**
* Options passed to the {@link module:ui/toolbar/toolbarview~ToolbarView#constructor} of the toolbar.
*/
export interface ToolbarOptions {
/**
* When set to `true`, the toolbar will automatically group {@link module:ui/toolbar/toolbarview~ToolbarView#items} that
* would normally wrap to the next line when there is not enough space to display them in a single row, for
* instance, if the parent container of the toolbar is narrow. For toolbars in absolutely positioned containers
* without width restrictions also the {@link module:ui/toolbar/toolbarview~ToolbarOptions#isFloating} option is required to be `true`.
*
* See also: {@link module:ui/toolbar/toolbarview~ToolbarView#maxWidth}.
*/
shouldGroupWhenFull?: boolean;
/**
* This option should be enabled for toolbars in absolutely positioned containers without width restrictions
* to enable automatic {@link module:ui/toolbar/toolbarview~ToolbarView#items} grouping.
* When this option is set to `true`, the items will stop wrapping to the next line
* and together with {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull},
* this will allow grouping them when there is not enough space in a single row.
*/
isFloating?: boolean;
}
/**
* A class interface defining the behavior of the {@link module:ui/toolbar/toolbarview~ToolbarView}.
*
* Toolbar behaviors extend its look and functionality and have an impact on the
* {@link module:ui/toolbar/toolbarview~ToolbarView#element} template or
* {@link module:ui/toolbar/toolbarview~ToolbarView#render rendering}. They can be enabled
* conditionally, e.g. depending on the configuration of the toolbar.
*/
export interface ToolbarBehavior {
/**
* A method called after the toolbar has been {@link module:ui/toolbar/toolbarview~ToolbarView#render rendered}.
* It can be used to, for example, customize the behavior of the toolbar when its
* {@link module:ui/toolbar/toolbarview~ToolbarView#element} is available.
*
* @param view An instance of the toolbar being rendered.
*/
render(view: ToolbarView): void;
/**
* A method called after the toolbar has been {@link module:ui/toolbar/toolbarview~ToolbarView#destroy destroyed}.
* It allows cleaning up after the toolbar behavior, for instance, this is the right place to detach
* event listeners, free up references, etc.
*/
destroy(): void;
/**
* Indicates the type of the toolbar behavior. Dynamic toolbar can hide items that do not fit into the available space.
* Static toolbar does not hide items and does not respond to the changes of the viewport.
*/
type: 'dynamic' | 'static';
}
export {};