Перейти до вмісту
tatetUI

SwipeActions

Дії під рядком списку, що відкриваються свайпом ліворуч, — як у мобільній пошті й месенджерах.

Рядок їде за пальцем ліворуч, і з-під нього з'являються кнопки дій. Відпустили далі половини їхньої ширини чи кидком — дії лишаються відкритими; інакше рядок повертається. Дотик по рядку, прокрутка, дотик повз чи свайп праворуч закривають дії. У межах group відкритим буває один рядок — як у списку чатів.

Приклад

На дотиковому екрані проведіть рядок ліворуч.

  • Звіт за кварталОновлено сьогодні
  • План запускуУчоразакріплено
  • Нотатки зустрічіПонеділок

Остання дія: Ще нічого

Жест — лише для пальця й пера: миша свайпом не користується, а ті самі дії мають бути доступні інакше — контекстним меню (UiContextMenu) чи кнопкою «Ще». Кнопки дій рендеряться лише поки рядок зсунуто, тож у довгому списку не множаться.

Кольори дій

tone — пара заливки й тексту з токенів: accent (головна дія), danger (видалення), neutral (архів). Власні кольори проєкту — через class дії: він замінює тон цілком, а не дописується поверх, тож на кнопці не буває двох bg-*.

<UiSwipeActions
  :actions="[
    { key: 'mute', label: 'Без звуку', class: 'bg-swipe-mute text-accent-contrast' },
    { key: 'archive', label: 'В архів', tone: 'neutral' },
  ]"
  @action="onAction"
>
  <template #icon="{ action }"><AppIcon :name="action.key" /></template>
  <RouterLink :to="…" class="flex h-16 items-center px-4">…</RouterLink>
</UiSwipeActions>

Жест і прокрутка

Корінь має touch-action: pan-y pinch-zoom: вертикальний рух лишається прокрутці списку, горизонтальний бере рядок. Жест не починається з полів, повзунків і елементів із touch-action: none; решту можна вимкнути атрибутом data-no-swipe або пропом disabled (наприклад, поки відкрите контекстне меню рядка). Ядро жесту — utils/swipe.ts — те саме, що в UiSwipeStack.

API

Props

НазваТипТиповоОпис
actions*{ key: string; label: string; tone?: "danger" | "accent" | "neutral"; class?: string; }[]—Дії під рядком у порядку зліва направо. Свайп ліворуч відкриває їх біля правого краю. `tone` — колір кнопки; `class` замінює його цілком (власні токени проєкту), а не дописується поверх.
actionWidthnumber72Ширина однієї дії, px. Типово — квадрат на висоту рядка списку.
groupstring"default"Група рядків: відкритим одночасно може бути лише один рядок групи — відкриття наступного закриває попередній.
surfaceClassstring"bg-card"Тло рухомого шару. Має бути непрозорим, інакше дії просвічують крізь рядок; задайте те саме тло, що в списку.
disabledbooleanfalseВимкнути жест (наприклад, поки відкрите контекстне меню рядка).

Події

НазваPayloadОпис
action[key: string]Натиснуто дію — у параметрі її `key`. Рядок після цього закривається сам.

Слоти

НазваОпис
defaultРядок, що їде за пальцем.
iconІконка над підписом дії: `action` — сама дія з `actions`.

Коли використовувати

Для частих дій над рядком довгого списку на телефоні: закріпити, архівувати, вимкнути сповіщення, видалити. Свайп швидший за довге натискання й не потребує точного влучання в дрібну кнопку.

Коли НЕ використовувати

Не робіть свайп єдиним шляхом до дії: його не видно, а з мишею й клавіатурою його немає взагалі. Не кладіть під рядок більше трьох дій — на вузькому екрані рядок майже зникає. Для рядка з власною горизонтальною прокруткою (каруселі, таблиці) свайп конфліктуватиме з нею.

Доступність

Кнопки дій — звичайні <button> з підписом і видимим фокусом, але з'являються лише після жесту. Тому ті самі дії обов'язково дублюйте в контекстному меню чи меню «Ще»: скрінрідер і клавіатура доходять до них саме там.