> For the complete documentation index, see [llms.txt](https://v2-0-0.pipui.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://v2-0-0.pipui.ru/components/popup.md).

# Всплывающие блоки

## Общая информация

Если есть необходимость использовать HTML во всплывающих подсказках([tooltip](/components/tooltip.md)), то вам могут помочь всплывающие блоки.

### Разметка <a href="#markup" id="markup"></a>

```html
<div id="popup" class="popup">
    <div class="popup-title">Header</div>
    <div class="popup-content">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi, sit?</div>
</div>
<button type="button" class="btn" data-popup="#popup">Example</button>
```

{% embed url="<https://codepen.io/pipui/pen/GRYJmVd>" %}
Пример работы кода выше
{% endembed %}

## Поддерживаемые атрибуты

Атрибут <mark style="color:orange;">`data-popup`</mark> является инициатором события вызова всплывающего блока. Данный атрибут может принимать в качестве значения селектор на объект всплывающего блока.

### title & content

Вы так же можете обойтись без дополнительного блока и указать название и описание через атрибуты <mark style="color:orange;">`data-popup-title`</mark> и <mark style="color:orange;">`data-popup-content`</mark>, однако в таком случае HTML поддерживаться не будет, но и потребность в указании атрибута data-popup отпадёт.

```html
<button type="button" class="btn" data-popup data-popup-content="Простейший всплывающий блок созданный через атрибуты" data-popup-title="Заголовок">Example #1</button>
```

{% embed url="<https://codepen.io/pipui/pen/LYgVqyp>" %}
Пример работы кода выше
{% endembed %}

Значения атрибутов <mark style="color:orange;">`data-popup-title`</mark> и <mark style="color:orange;">`data-popup-content`</mark> не являются обязательными, так же как и их аналог через отдельную HTML разметку <mark style="color:orange;">`.popup-title`</mark> и <mark style="color:orange;">`.popup-content`</mark>.

### target

С помощью атрибута <mark style="color:orange;">`data-popup-target`</mark> можно указать селектор элемента к которому будет привязан всплывающий блок.

```html
<span id="target1">Target #1</span>
  
<button type="button" class="btn mt-100" data-popup data-popup-target="#target1" data-popup-content="Всплывающий блок с привязкой к другому объекту" data-popup-title="Заголовок">Example #4</button>
```

{% embed url="<https://codepen.io/pipui/pen/gOBpqzG>" %}
Пример работы кода выше
{% endembed %}

### overlay

Атрибут <mark style="color:orange;">`data-popup-overlay="true"`</mark> включает затемнение фона при появлении всплывающего блока. По умолчанию данная функция отключена.

```html
<button type="button" class="btn" data-popup data-popup-overlay="true" data-popup-content="Всплывающий блок с затемнением" data-popup-title="Заголовок">Example #5</button>
```

{% embed url="<https://codepen.io/pipui/pen/PoyqLOX>" %}
Пример работы кода выше
{% endembed %}

### autoclose

В качестве значение атрибута <mark style="color:orange;">`data-popup-autoclose`</mark> принимается целое число - кол-во миллисекунд, по истечению которых всплывающий блок будет автоматически закрыт.

По умолчанию автозакрытие имеет значение 0, что будет означать отсутствие автоматического закрытия.

```html
<button type="button" class="btn" data-popup data-popup-autoclose="3000" data-popup-content="Всплывающий блок с затемнением" data-popup-title="Заголовок">Example</button>
```

{% embed url="<https://codepen.io/pipui/pen/poxJYYb>" %}
Пример работы кода выше
{% endembed %}

### overclose

Атрибут <mark style="color:orange;">`data-popup-overclose`</mark> включает или отключает закрытие всплывающего блока при нажатии на область, которая не является самим блоком.

По умолчанию данный атрибут имеет значение true.

```html
<button type="button" class="btn" data-popup data-popup-overclose="true" data-popup-content="Всплывающий блок с закрытием" data-popup-title="Заголовок">[data-popup-overclose="true"]</button>
  
  <button type="button" class="btn" data-popup data-popup-overclose="false" data-popup-content="Всплывающий блок без закрытия" data-popup-title="Заголовок">[data-popup-overclose="false"]</button>
```

{% embed url="<https://codepen.io/pipui/pen/mdzJogv>" %}
Пример работы кода выше
{% endembed %}

### direction

По умолчанию направление вывода всплывающего блока установлено как вверх (up) и меняется в зависимости от доступности области, однако вы можете поменять значение по умолчанию на своё с помощью атрибута <mark style="color:orange;">`data-popup-direction`</mark>, однако блок по прежнему будет проверять доступность выбранного направления или искать другое.

На данный момент доступны следующие направления

* **up** - вверх (по умолчанию)
* **down** - вниз
* **left** - влево
* **right** - вправо

```html
<button type="button" class="btn" data-popup data-popup-content="Блок будет выведен сверху" data-popup-title="Вверх">[data-popup-direction="up"]</button>
    <button type="button" class="btn" data-popup data-popup-direction="down" data-popup-content="Блок будет выведен снизу" data-popup-title="Вверх">[data-popup-direction="down"]</button>
    <button type="button" class="btn" data-popup data-popup-direction="left" data-popup-content="Блок будет выведен слева" data-popup-title="Вверх">[data-popup-direction="left"]</button>
    <button type="button" class="btn" data-popup data-popup-direction="right" data-popup-content="Блок будет выведен справа" data-popup-title="Вверх">[data-popup-direction="right"]</button>
```

{% embed url="<https://codepen.io/pipui/pen/NWOqmNx>" %}
Пример работы кода выше
{% endembed %}

## Javascript

Для работы с всплывающими блоками необходимо создать экземпляр класса PipUI.Popup.\
По умолчанию инициализация происходит автоматически при клике на элемент\
с атрибутом \[data-popup].

### Инициализация

Конструктор класса PipUI.Popup принимает 2 параметра: HTMLElement и Object

Первый параметр - селектор объекта самого блока всплывающего окна. Может быть пустым.

Второй параметр - объект опций

```javascript
let popup = new PipUI.Popup('#popup-box');
```

### Опции

<pre><code>// Выводить в консоль отладку
debug: false

// Селектор или HTMLElement к которому будет привязан всплывающий блок
target: undefined

// Список триггеров, при нажатии на которые будет появляться/исчезать блок
triggers: []

<strong>// Название, выводимое в всплывающем блоке. Если не указано, то появится без названия.
</strong>title: ''

// Содержимое, выводимое в всплывающем блоке. Если не указано, то появится без содержимого.
content: ''

// Направление вывода. Поддерживаются: up, down, left, right
direction: 'up'

// Выводить ли оверлей
overlay: false

// Кол-во миллисекунд, через которое блок автоматически закроется
autoclose: 0

// Закрывать всплывающий блок при клике на область вне самого блока
overclose: true

// Класс присваиваемый всплывающему блоку при открытии
openedClass: 'popup-active'

// Класс присваиваемый оверлею при открытии
openedOverlayClass: 'overlay-active'

// Класс присваиваемый триггеру при открытии
openedTriggerClass: 'active'

// Класс элемента к которому привязан всплывающий блок
targetClass: 'popup-target'

// Класс, присваиваемый элементу к которому привязан всплывающий блок, при открытии
targetActiveClass: 'popup-target-active'

// Функция обратного вызова срабатываемая при появлении всплывающего блока
openCallback: undefined

// Функция обратного вызова срабатываемая при исчезании всплывающего блока
closeCallback: undefined

// Функция обратного вызова срабатываемая при обновлении всплывающего блока
updateCallback: undefined

// Функция обратного вызова срабатываемая при изменении позиции всплывающего блока
repositionCallback: undefined

// Шаблоны
templates: {
     // Разметка основного блока всплывающего окна
     box: '...'
     
     // Разметка блока оверлея
     overlay: '...'
}
</code></pre>

### Методы

```javascript
let popup = new PipUI.Navbar('#popup');

popup.getID() // Вернет уникальный идентификатор всплывающего блока

popup.setOptions(object) // Изменить опции блока

popup.getOptions() // Получить опции блока

popup.getPosition(name) // Получить актуальную позицию блока(служит для обновления)
// Параметр name является направлением позиции

popup.updatePosition() // Обновить позицию всплывающего блока

popup.update() // Обновить всплывающее окно

popup.hide(callback) // Скрыть панель
// Параметр callback является приоритетной функцией обратного
// вызова при завершении скрытия, если она задана и через опции

popup.show(callback) // Показать блок
// Параметр callback является приоритетной функцией обратного
// вызова при завершении отображения, если она задана и через опции

popup.isOpen() // Текущее состояние блока (открыт или закрыт)

popup.open(callback) // Отобразить блок
// Параметр callback является приоритетной функцией обратного
// вызова при завершении отображения, если она задана и через опции

popup.close(callback) // Скрыть блок
// Параметр callback является приоритетной функцией обратного
// вызова при завершении скрытия, если она задана и через опции
```

### События

<table><thead><tr><th width="281.3333333333333">Триггер</th><th>Описание</th><th>Инициатор</th></tr></thead><tbody><tr><td>open-popup-pipui</td><td>Срабатывает при открытии всплывающего блока</td><td>.popup</td></tr><tr><td>close-popup-pipui</td><td>Срабатывает при закрытии всплывающего блока</td><td>.popup</td></tr><tr><td>update-popup-pipui</td><td>Срабатывает при обновлении содержимого всплывающего блока</td><td>.popup</td></tr><tr><td>update-position-popup-pipup</td><td>Срабатывает при обновлении позиции всплывающего блока</td><td>.popup</td></tr></tbody></table>
