/** * @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 ui/dropdown/dropdownview */ import { View } from '../view.js'; import type { DropdownButton } from './button/dropdownbutton.js'; import type { DropdownPanelView, PanelPosition } from './dropdownpanelview.js'; import type { FocusableView } from '../focuscycler.js'; import { type ListView } from '../list/listview.js'; import { type ToolbarView } from '../toolbar/toolbarview.js'; import { type DropdownMenuRootListView } from './menu/dropdownmenurootlistview.js'; import { KeystrokeHandler, FocusTracker, type Locale, type PositioningFunction } from '@ckeditor/ckeditor5-utils'; import '../../theme/components/dropdown/dropdown.css'; /** * The dropdown view class. It manages the dropdown button and dropdown panel. * * In most cases, the easiest way to create a dropdown is by using the {@link module:ui/dropdown/utils~createDropdown} * util: * * ```ts * const dropdown = createDropdown( locale ); * * // Configure dropdown's button properties: * dropdown.buttonView.set( { * label: 'A dropdown', * withText: true * } ); * * dropdown.render(); * * dropdown.panelView.element.textContent = 'Content of the panel'; * * // Will render a dropdown with a panel containing a "Content of the panel" text. * document.body.appendChild( dropdown.element ); * ``` * * If you want to add a richer content to the dropdown panel, you can use the {@link module:ui/dropdown/utils~addListToDropdown} * and {@link module:ui/dropdown/utils~addToolbarToDropdown} helpers. See more examples in * {@link module:ui/dropdown/utils~createDropdown} documentation. * * If you want to create a completely custom dropdown, then you can compose it manually: * * ```ts * const button = new DropdownButtonView( locale ); * const panel = new DropdownPanelView( locale ); * const dropdown = new DropdownView( locale, button, panel ); * * button.set( { * label: 'A dropdown', * withText: true * } ); * * dropdown.render(); * * panel.element.textContent = 'Content of the panel'; * * // Will render a dropdown with a panel containing a "Content of the panel" text. * document.body.appendChild( dropdown.element ); * ``` * * However, dropdown created this way will contain little behavior. You will need to implement handlers for actions * such as {@link module:ui/bindings/clickoutsidehandler~clickOutsideHandler clicking outside an open dropdown} * (which should close it) and support for arrow keys inside the panel. Therefore, unless you really know what * you do and you really need to do it, it is recommended to use the {@link module:ui/dropdown/utils~createDropdown} helper. */ export declare class DropdownView extends View { /** * Button of the dropdown view. Clicking the button opens the {@link #panelView}. */ readonly buttonView: DropdownButton & FocusableView; /** * Panel of the dropdown. It opens when the {@link #buttonView} is * {@link module:ui/button/button~Button#event:execute executed} (i.e. clicked). * * Child views can be added to the panel's `children` collection: * * ```ts * dropdown.panelView.children.add( childView ); * ``` * * See {@link module:ui/dropdown/dropdownpanelview~DropdownPanelView#children} and * {@link module:ui/viewcollection~ViewCollection#add}. */ readonly panelView: DropdownPanelView; /** * Tracks information about the DOM focus in the dropdown. */ readonly focusTracker: FocusTracker; /** * Instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. It manages * keystrokes of the dropdown: * * * opens the dropdown, * * and Esc closes the dropdown. */ readonly keystrokes: KeystrokeHandler; /** * A child {@link module:ui/list/listview~ListView list view} of the dropdown located * in its {@link module:ui/dropdown/dropdownview~DropdownView#panelView panel}. * * **Note**: Only supported when dropdown has list view added using {@link module:ui/dropdown/utils~addListToDropdown}. */ listView?: ListView; /** * A child toolbar of the dropdown located in the * {@link module:ui/dropdown/dropdownview~DropdownView#panelView panel}. * * **Note**: Only supported when dropdown has a toolbar added using {@link module:ui/dropdown/utils~addToolbarToDropdown}. */ toolbarView?: ToolbarView; /** * A child menu component of the dropdown located * in its {@link module:ui/dropdown/dropdownview~DropdownView#panelView panel}. * * **Note**: Only supported when dropdown has a menu added using {@link module:ui/dropdown/utils~addMenuToDropdown}. */ menuView?: DropdownMenuRootListView; /** * Controls whether the dropdown view is open, i.e. shows or hides the {@link #panelView panel}. * * **Note**: When the dropdown gets open, it will attempt to call `focus()` on the first child of its {@link #panelView}. * See {@link module:ui/dropdown/utils~addToolbarToDropdown}, {@link module:ui/dropdown/utils~addListToDropdown}, and * {@link module:ui/dropdown/utils~focusChildOnDropdownOpen} to learn more about focus management in dropdowns. * * @observable */ isOpen: boolean; /** * Controls whether the dropdown is enabled, i.e. it can be clicked and execute an action. * * See {@link module:ui/button/buttonview~ButtonView#isEnabled}. * * @observable */ isEnabled: boolean; /** * (Optional) The additional CSS class set on the dropdown {@link #element}. * * @observable */ class: string | undefined; /** * (Optional) The `id` attribute of the dropdown (i.e. to pair with a `