Loading...
Loading...
Covers Bitrix UI library — main.popup, main.sidepanel, ui.system.dialog, ui.dialogs.messagebox, ui.system.menu, ui.system.input, ui.alerts, ui.notification (toasts), ui.entity-selector (Dialog, TagSelector, providers), main.ui.grid, main.ui.filter, ui.icon-set, ui.lottie, ui.a11y, typography. Applied when building admin interfaces and public UI with kernel components. Key terms — Extension::load, Popup, SidePanel, system-dialog, MessageBox, ui.alerts, entity-selector, grid, filter, ui.a11y, UI kit.
npx skill4agent add bxmaximum/bitrix-framework-skills bitrix-uiuimainExtension::load()| Scenario | Extension |
|---|---|
| Full modern dialog (title, content, custom layout) | |
| Simple confirm / alert / message box | |
| Context/dropdown menu (modern) | |
| Popup with custom positioning, legacy | |
| Slide-over panel (CRM-style) | |
| Toast notifications | |
| Alerts/banners (inline UI alerts) | |
| Form inputs (modern) | |
| Pick users/departments/custom entities | |
| Data table: columns, sorting, paging, row actions | PHP component |
| Search + filter fields with presets above a list | PHP component |
| Icons | |
| Loading skeleton | |
| Hints/tooltips | |
| Lottie animations | |
| Keyboard focus, focus trap, screen-reader live region | |
ui.system.dialogui.dialogs.messageboxui.system.dialogDialogui.dialogs.messageboxMessageBoxconfirmalertshowui.system.alertui.alerts\Bitrix\Main\UI\Extension::load(['ui.system.dialog', 'ui.alerts', 'ui.notification']);import { Dialog } from 'ui.system.dialog';
import { MessageBox } from 'ui.dialogs.messagebox';
import { Alert, AlertColor } from 'ui.alerts';
// ui.notification is non-modular — use the global BX.UI.Notification.CenterRuntime.loadExtension('ui.entity-selector').then((exports) => { ... })import { Dialog } from 'ui.system.dialog';
new Dialog({ title: 'Settings', content: contentNode /* HTMLElement */, rightButtons: [...] }).show();
// other options: subtitle, hasCloseButton, hasOverlay, closeByEsc, closeByClickOutside, width, background
import { MessageBox } from 'ui.dialogs.messagebox';
MessageBox.confirm('Delete item?', () => { /* on confirm */ });
MessageBox.alert('Done');
import { Alert, AlertColor } from 'ui.alerts';
const alert = new Alert({ text: 'Saved', color: AlertColor.SUCCESS });import { Popup } from 'main.popup';
new Popup({ id: 'my-popup', content: 'Saved', closeIcon: true }).show();
// main.sidepanel:
BX.SidePanel.Instance.open('/local/admin/custom-page.php', { width: 800, cacheable: false });ui.notificationBX.UI.Notification.Center.notify({ content: 'Saved', autoHide: true, autoHideDelay: 8000, position: 'top-right' });ui.notification-managerNotificationNotifierBX.UI.NotificationManagerui.entity-selectorDialogTagSelectorentityIdid{ id, entityId, title }import { Dialog, TagSelector } from 'ui.entity-selector';
const dialog = new Dialog({
targetNode: button, // must be an existing DOM node
context: 'MY_MODULE_RESPONSIBLE', // separate context per form — recent items don't mix
multiple: false,
enableSearch: true,
entities: [{ id: 'user' }, { id: 'department' }], // server-side load via PHP providers
events: { 'Item:onSelect': (e) => { const { item } = e.getData(); } },
});
button.addEventListener('click', () => dialog.show());TagSelectordialogOptionsDialogpreselectedItems: [['user', 1]]selector.renderTo(container).settings.phpui.entity-selectoriblock-elementproductstoreuserdepartmentprojectmeta-userim-chat.settings.phpBitrix\UI\EntitySelector\BaseProviderisAvailable()getItems()fillDialog()doSearch().settings.php'ui.entity-selector' => [
'value' => [
'entities' => [[
'entityId' => 'project',
'provider' => ['moduleId' => 'my.module', 'className' => ProjectProvider::class],
]],
],
'readonly' => true,
],entities[].identityIddynamicLoaddynamicSearchmain.ui.gridmain.ui.filterIncludeComponent()FILTER_IDGRID_IDuse Bitrix\Main\UI\Filter\Options as FilterOptions;
use Bitrix\Main\Grid\Options as GridOptions;
$gridId = 'orders_grid';
$filterFields = [
['id' => 'FIND', 'name' => 'Search'],
['id' => 'STATUS', 'name' => 'Status', 'type' => 'list', 'items' => ['' => 'Any', 'new' => 'New']],
];
$filter = (new FilterOptions($gridId))->getFilter($filterFields); // user values
$sorting = (new GridOptions($gridId))->getSorting(['sort' => ['ID' => 'desc']]);
// build $ormFilter from $filter, run query with $sorting['sort'], build $rows
$APPLICATION->IncludeComponent('bitrix:main.ui.filter', '', [
'FILTER_ID' => $gridId, 'GRID_ID' => $gridId, 'FILTER' => $filterFields, 'ENABLE_LABEL' => true,
]);
$APPLICATION->IncludeComponent('bitrix:main.ui.grid', '', [
'GRID_ID' => $gridId,
'COLUMNS' => [['id' => 'ID', 'name' => 'ID', 'sort' => 'ID', 'default' => true]],
'ROWS' => $rows, // each: ['id' => 42, 'data' => [...], 'actions' => [...]]
'SORT' => $sorting['sort'], 'ALLOW_SORT' => true,
'AJAX_MODE' => 'Y', 'AJAX_OPTION_JUMP' => 'N', 'AJAX_OPTION_HISTORY' => 'N',
]);stringtextarealistparams.multiple = 'Y'numberdatetime => trueexcludeBitrix\Main\UI\Filter\DateType::*custom_dateentity_selectorparams.dialogOptionsparams.addEntityIdToResult = 'Y'entity_selectordest_selectorcustom_entity_from_to_datesel_numselFILTER_PRESETS => ['key' => ['name' => ..., 'fields' => [...], 'default' => true]]FILTER_IDGRID_IDBitrix\Main\UI\PageNavigationNAV_OBJECTTOTAL_ROWS_COUNT$nav->getLimit()/getOffset()PAGE_SIZESSHOW_PAGESIZESHOW_PAGINATIONCOLUMNSHEADERSROW_LAYOUTROWS[]['columns']HtmlFilter::encode()ACTION_PANELSHOW_ROW_CHECKBOXESSHOW_ACTION_PANELSHOW_SELECTED_COUNTERBitrix\Main\Grid\GridComponentParams::get($grid)Bitrix\Main\Grid\Component\ComponentParamsBitrix\Main\Filter\FilterFilterOptions::getFilter()ui.lottieimport { Lottie } from 'ui.lottie'BX.UI.Lottieconst animation = BX.UI.Lottie.loadAnimation({
container: node, // must exist in DOM
path: '/local/assets/loader.json', // or animationData: {...} — pass one source
renderer: 'svg', loop: true, autoplay: true,
});AnimationItemplay()stop()pause()togglePause()setSpeed()setDirection()goToAndStop()goToAndPlay()destroy()nameBX.UI.Lottie.play(name)animation.addEventListener('complete' | 'loopComplete' | 'data_ready' | 'data_failed' | 'DOMLoaded' | 'destroy', ...)ui.a11yui.a11yFocusMonitor.initialize()| Need | Class |
|---|---|
| Restore focus after close / DOM redraw | |
| Move focus to the next/previous focusable node | |
| Trap Tab inside a modal/dialog | |
| Arrow / Home / End keys inside a widget | |
| Keyboard vs mouse vs touch vs stylus | |
| Is the node visible / enabled / focusable | |
| Speak a message without moving focus | |
| Visually hide, keep for AT | |
import { FocusTrap, LiveAnnouncer } from 'ui.a11y';
const trap = new FocusTrap(dialogNode);
trap.activate();
// on close:
trap.deactivate();
LiveAnnouncer.announce('Saved', 'polite'); // or 'assertive'Configuration::getValue('ui')['a11y']config.php'ui' => [
'value' => [
'a11y' => [
'restoreLostFocus' => true,
'useFocusTrapInDialogs' => true,
],
],
'readonly' => false,
],falsetrue\Dev\Main\Migrator\ModuleUpdaterFocusTrapui.icon-setui.icon-set.api.coreIconui.icon-set.api.coreActionsMainOutlineSolidSocialCRMEditorContactCenterAnimatedSpecialDiskDiskCompactcolorSmallOutlineui.icon-set.actionsui.icon-set.mainui.icon-set.outlineimport { Icon, Outline, IconHoverMode } from 'ui.icon-set.api.core';
import 'ui.icon-set.outline';
new Icon({ icon: Outline.CHECK_L, size: 24, color: 'var(--ui-color-base-70)' }).renderTo(container);BIconui.icon-set.api.vuenamesizecolorhoverableresponsive<div class="ui-icon-set --check-l"></div>--ui-icon-set__icon-size--ui-icon-set__icon-colorui.design-tokensui.system.dialogui.system.*main.popupui.dialogs.messageboxui.alertsui.system.alertimportBXentities[].identityIdisAvailable()contextGRID_IDHtmlFilter::encode()ui.icon-set.api.coreui.icon-set.outlinedestroy()ui.a11yFocusTrapLiveAnnouncerui.a11y