Skip to content

Виджеты ​

Виджет это часть плагина Pano (полоса цели, лучшие поддержавшие, статистика магазина), которую можно вставить на любую веб-страницу как собственный HTML-тег. Он приносит свои данные и свой стиль.

Встраивание ​

html
<script type="module" src="https://pano.example.com/api/v1/widgets/loader.js"></script>
<pano-market-goal></pano-market-goal>

Загрузчик небольшой. Он спрашивает Pano, какие виджеты существуют, и загружает виджет, когда его тег впервые появляется на странице, в том числе добавленный позже. Неизвестные теги pano-* игнорируются.

Посмотрите, что предлагает ваш Pano:

sh
curl http://localhost:8088/api/v1/widgets/index.json

Теги выглядят как pano-<короткое имя плагина>-<виджет>. У неактивного плагина виджетов нет, и его теги остаются пустыми.

Стиль ​

Виджеты находятся в shadow root и берут вид по умолчанию из дизайн-токенов Pano. Стилизуйте их со своей страницы через CSS-переменные, на странице или на одном элементе:

css
:root { --pano-color-primary: #e33; }
pano-market-goal { --pano-color-primary: #28a; }

Палитру задайте на скрипте через data-palette="dark" (по умолчанию light) или на отдельном элементе через data-bs-theme="dark". Язык текста берётся из data-locale скрипта, иначе из сайта.

Для более глубоких изменений каждая часть виджета открыта через part:

css
pano-market-goal::part(market-goal__bar) { border-radius: 0; }

Добавьте атрибут no-shadow, чтобы рисовать виджет в обычной странице: CSS вашей страницы тогда достаёт внутрь.

Атрибуты ​

Простые настройки виджета (текст, числа, переключатели) это атрибуты в kebab-case; список виджетов в /api/v1/widgets/index.json называет их в attrs. Всё более сложное задаётся как свойство элемента после его создания:

js
document.querySelector('pano-market-goal').someSetting = 'value';

Изменение атрибута обновляет виджет без перезагрузки.

События ​

События всплывают и пересекают границу shadow:

СобытиеКогдаДетали
pano:readyДанные загружены, виджет показан{ tag }
pano:errorЗагрузка не удалась{ code }
pano:toastВиджет хочет показать сообщение{ key, message, variant, values }
pano:navigateВиджет хочет перейти на страницу{ url }

pano:toast и pano:navigate можно отменить через preventDefault(), чтобы ими занялась ваша страница:

js
document.addEventListener('pano:navigate', (e) => { e.preventDefault(); router.go(e.detail.url); });

Направьте ссылки виджетов на свои страницы через карту URL:

js
window.PanoWidgets.configure({ urls: { 'market.store': '/shop', 'market.order': '/shop/o/{id}', 'auth.login': '/login' } });

Какой адрес использовать ​

Ваша страницаАдрес загрузчикаВход посетителя
На собственном адресе Panohttps://pano.example.com/api/v1/widgets/loader.jsКуки, работает
На разрешённом источникеТот жеКуки, работает
На любом другом доменеПуть на вашем сайте, пересылающий на Pano, например /pano/api/v1/widgets/loader.jsЧерез ваш сервер (шаблон так и делает)

Pano даёт CORS только разрешённым источникам, поэтому страница на чужом домене загружает виджеты через собственный прокси-путь. За префиксом пути загрузчику настройка не нужна: он выводит /api/v1 из своего адреса.

Для публичных (анонимных) виджетов хватит простого правила обратного прокси. Маршрут /pano в стартовом шаблоне пересылает ещё и сессию посетителя.

Для авторов плагинов ​

Пометьте блочный view как виджет в его метаданных, остальное сделает сборка:

svelte
<script module>export const view = { widget: true };</script>