Загрузка при каждом открытии
Настоящий GET /api/sidebar/demo возвращает JSON с полем response, содержащим HTML. loader показывает встроенный индикатор; timeout: 350 делает загрузку заметной.
<button type="button" class="btn btn-surface btn-sm" data-vg-toggle="sidebar" data-vg-target="#sidebar-remote" aria-controls="sidebar-remote" aria-expanded="false">Загрузить карточку</button>
<p id="sidebar-remote-status" class="mt-3" role="status">Завершено запросов: 0</p>
<!-- Panels: разместите в конце body -->
<aside id="sidebar-remote" class="vg-sidebar right sidebar-demo-panel" aria-labelledby="sidebar-remote-title" data-ajax='{"route":"/api/sidebar/demo","target":"#sidebar-remote-content","loader":true,"once":false,"timeout":350}'>
<div class="vg-sidebar-header">
<h2 id="sidebar-remote-title">HTML с сервера</h2>
<button type="button" class="vg-btn-close" data-vg-dismiss="sidebar" data-vg-target="#sidebar-remote" aria-label="Закрыть"></button>
</div>
<div class="vg-sidebar-body"><div id="sidebar-remote-content">Контент появится после открытия.</div></div>
<div class="vg-sidebar-footer">
<button type="button" class="btn btn-primary btn-sm" data-vg-dismiss="sidebar" data-vg-target="#sidebar-remote">Закрыть панель</button>
</div>
</aside>
/**
* Описание: наблюдение за AJAX-загрузкой VGSidebar.
* Возможности: счётчик завершённых запросов и статус загрузки через DOM-событие.
*/
function initSidebarDemo() {
const panel = document.querySelector('#sidebar-remote');
if (!panel) return;
const status = document.querySelector('#sidebar-remote-status');
let count = 0;
panel.addEventListener('vg.sidebar.loaded', (event) => {
status.textContent = 'Завершено запросов: ' + (++count) + ' · ' + event.stats;
});
}
initSidebarDemo();
/* Композиция демо; OKAUX на сайте использует префикс токенов vg. */
.sidebar-demo-panel {
--vg-sidebar-horizontal-width: min(26rem, 100vw);
--vg-sidebar-horizontal-height: 100dvh;
--vg-sidebar-vertical-height: min(24rem, 80dvh);
--vg-sidebar-header-height: 72px;
--vg-sidebar-footer-height: 64px;
--vg-sidebar-padding: 1rem;
--vg-sidebar-bg-color: var(--vg-bg-primary);
--vg-sidebar-color: var(--vg-text-primary);
--vg-sidebar-border: 1px solid var(--vg-border-default);
}
.sidebar-demo-panel .vg-sidebar-header {
justify-content: space-between;
gap: 1rem;
}
.sidebar-demo-panel .vg-sidebar-header h2 {
margin: 0;
font-size: 1.125rem;
}
.sidebar-demo-panel .vg-btn-close { flex-shrink: 0; }
.sidebar-demo-panel .vg-sidebar-footer {
display: flex;
align-items: center;
gap: .5rem;
}
.sidebar-demo-actions { display: flex; flex-wrap: wrap; gap: .75rem; }
.sidebar-demo-card, .sidebar-demo-log {
padding: 1rem;
border: 1px solid var(--vg-border-default);
border-radius: var(--vg-radius-lg);
background: var(--vg-bg-secondary);
color: var(--vg-text-primary);
overflow-wrap: anywhere;
}
.sidebar-demo-log {
margin-top: 1rem;
max-height: 14rem;
overflow-y: auto;
white-space: pre-wrap;
}
.sidebar-demo-panel .vg-sidebar-body { overflow-wrap: anywhere; }
.sidebar-demo-check { display: flex; align-items: center; gap: .5rem; margin: 1rem 0; }
/* Не меняем состояние темы: оно остаётся в data-theme / okaux.theme. */