import{i as e}from"./preload-helper-B45gAKPr.js";import{E as t,a as n,d as r,f as i,l as a,m as o,n as s,p as c,r as l,u}from"./blocks-DsN3hykK.js";import{t as d}from"./jsx-runtime-BBQGix-2.js";import{t as f}from"./mdx-react-shim-CdXPOrRW.js";import{Basic as p,DisabledItems as m,GridCards as h,HandleOnly as g,HorizontalList as _,NestedContainers as v,n as y,t as b}from"./Sortable.stories-nttQ0wQV.js";function x(e){let o={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...t(),...e.components};return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(a,{of:b,parameters:{docs:{toc:!0}}}),`
`,(0,C.jsx)(c,{children:`Sortable`}),`
`,(0,C.jsxs)(i,{children:[`Headless-набор для сортируемых коллекций на базе `,(0,C.jsx)(o.code,{children:`dnd-kit`}),` с поддержкой list, horizontal и grid-layout`]}),`
`,(0,C.jsxs)(o.p,{children:[(0,C.jsx)(o.code,{children:`Sortable`}),` не навязывает визуальный вид элементов и используется как композиционный слой поверх `,(0,C.jsx)(o.code,{children:`dnd-kit`}),`.
Он дает единый API для `,(0,C.jsx)(o.code,{children:`DndContext`}),`, `,(0,C.jsx)(o.code,{children:`SortableContext`}),`, sortable-item и drag-handle, а бизнес-логика reorder остается у потребителя.
Для типовой визуальной ручки есть `,(0,C.jsx)(o.code,{children:`Sortable.DragHandle`}),`; низкоуровневый `,(0,C.jsx)(o.code,{children:`Sortable.Handle`}),` нужен, когда внешний вид полностью задает потребитель.`]}),`
`,(0,C.jsx)(o.h2,{id:`основной-сценарий`,children:`Основной сценарий`}),`
`,(0,C.jsx)(u,{}),`
`,(0,C.jsx)(n,{of:p}),`
`,(0,C.jsx)(o.pre,{children:(0,C.jsx)(o.code,{className:`language-tsx`,children:`import { Sortable, getSortableReorderResult } from "@/shared/ui";

function Example({ items, setItems }: { items: string[]; setItems: (next: string[]) => void }) {
	return (
		<Sortable.Root
			onDragEnd={(event) => {
				const reorder = getSortableReorderResult({
					event,
					items: {
						list: items
					}
				});
				if (!reorder) return;

				const next = [...items];
				const [moved] = next.splice(reorder.fromIndex, 1);
				next.splice(reorder.toIndex, 0, moved!);
				setItems(next);
			}}>
			<Sortable.Container containerId="list" items={items} layout="vertical">
				{items.map((item) => (
					<Sortable.Item key={item} id={item}>
						<Sortable.DragHandle title={\`Перетащить \${item}\`} />
						<span>{item}</span>
					</Sortable.Item>
				))}
			</Sortable.Container>
		</Sortable.Root>
	);
}
`})}),`
`,(0,C.jsx)(o.h2,{id:`практические-рекомендации`,children:`Практические рекомендации`}),`
`,(0,C.jsxs)(o.ul,{children:[`
`,(0,C.jsxs)(o.li,{children:[`Используйте `,(0,C.jsx)(o.code,{children:`Sortable.Root`}),` как общий контекст drag-and-drop для одного сценария взаимодействия.`]}),`
`,(0,C.jsxs)(o.li,{children:[`Для нескольких независимых списков внутри одного экрана задавайте отдельные `,(0,C.jsx)(o.code,{children:`containerId`}),` через `,(0,C.jsx)(o.code,{children:`Sortable.Container`}),`.`]}),`
`,(0,C.jsxs)(o.li,{children:[`Логику reorder удобнее выносить в helper `,(0,C.jsx)(o.code,{children:`getSortableReorderResult`}),`, если перенос между контейнерами не нужен.`]}),`
`,(0,C.jsxs)(o.li,{children:[`Для вложенных сценариев размещайте несколько `,(0,C.jsx)(o.code,{children:`Sortable.Container`}),` внутри одного `,(0,C.jsx)(o.code,{children:`Sortable.Root`}),`.`]}),`
`,(0,C.jsxs)(o.li,{children:[(0,C.jsx)(o.code,{children:`Sortable.Item`}),` отвечает только за DnD-bindings и inline-style трансформации; визуальный каркас строки или карточки должен оставаться у потребителя.`]}),`
`,(0,C.jsxs)(o.li,{children:[`Используйте `,(0,C.jsx)(o.code,{children:`Sortable.DragHandle`}),` для стандартной ручки с `,(0,C.jsx)(o.code,{children:`GripIcon`}),`, локальными стилями и состояниями disabled/dragging.`]}),`
`]}),`
`,(0,C.jsx)(o.h2,{id:`сценарии-использования`,children:`Сценарии использования`}),`
`,(0,C.jsx)(o.h3,{id:`базовый-вертикальный-список`,children:`Базовый вертикальный список`}),`
`,(0,C.jsx)(o.p,{children:`Базовый headless-сценарий сортировки элементов по вертикали.`}),`
`,(0,C.jsx)(l,{of:p}),`
`,(0,C.jsx)(o.h3,{id:`горизонтальный-список`,children:`Горизонтальный список`}),`
`,(0,C.jsxs)(o.p,{children:[`Использование `,(0,C.jsx)(o.code,{children:`layout="horizontal"`}),` для toolbar, чипов и полос вкладок.`]}),`
`,(0,C.jsx)(l,{of:_}),`
`,(0,C.jsx)(o.h3,{id:`grid-карточки`,children:`Grid-карточки`}),`
`,(0,C.jsxs)(o.p,{children:[`Использование `,(0,C.jsx)(o.code,{children:`layout="grid"`}),` для карточек и flow-раскладок.`]}),`
`,(0,C.jsx)(l,{of:h}),`
`,(0,C.jsx)(o.h3,{id:`отключенные-элементы`,children:`Отключенные элементы`}),`
`,(0,C.jsx)(o.p,{children:`Проверка поведения для элементов, которые видны в списке, но не должны перетаскиваться.`}),`
`,(0,C.jsx)(l,{of:m}),`
`,(0,C.jsx)(o.h3,{id:`handle-only-drag`,children:`Handle-only drag`}),`
`,(0,C.jsx)(o.p,{children:`Перетаскивание доступно только через handle, а не через весь элемент.`}),`
`,(0,C.jsx)(l,{of:g}),`
`,(0,C.jsx)(o.h3,{id:`вложенные-контейнеры`,children:`Вложенные контейнеры`}),`
`,(0,C.jsxs)(o.p,{children:[`Два уровня `,(0,C.jsx)(o.code,{children:`Sortable.Container`}),` внутри одного `,(0,C.jsx)(o.code,{children:`Sortable.Root`}),` без переноса между контейнерами.`]}),`
`,(0,C.jsx)(l,{of:v}),`
`,(0,C.jsx)(o.h2,{id:`api`,children:`API`}),`
`,(0,C.jsx)(s,{of:b}),`
`,(0,C.jsx)(o.h2,{id:`все-сторисы`,children:`Все сторисы`}),`
`,(0,C.jsx)(r,{includePrimary:!1})]})}function S(e={}){let{wrapper:n}={...t(),...e.components};return n?(0,C.jsx)(n,{...e,children:(0,C.jsx)(x,{...e})}):x(e)}var C;e((()=>{C=d(),f(),o(),y()}))();export{S as default};