import{n as e}from"./rolldown-runtime-C0FnF6B9.js";import{n as t}from"./iframe-GrlyTB2d.js";import{i as n,r}from"./react-qN2cStNd.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-DkLPipTQ.js";import{a as p,c as m,i as h,n as g,o as _,r as v,s as y,t as b}from"./Sortable.stories-BnGNB2NX.js";function x(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(s,{of:y,parameters:{docs:{toc:!0}}}),`
`,(0,C.jsx)(u,{children:`Sortable`}),`
`,(0,C.jsxs)(o,{children:[`Headless-набор для сортируемых коллекций на базе `,(0,C.jsx)(t.code,{children:`dnd-kit`}),` с поддержкой list, horizontal и grid-layout`]}),`
`,(0,C.jsxs)(t.p,{children:[(0,C.jsx)(t.code,{children:`Sortable`}),` не навязывает визуальный вид элементов и используется как композиционный слой поверх `,(0,C.jsx)(t.code,{children:`dnd-kit`}),`.
Он дает единый API для `,(0,C.jsx)(t.code,{children:`DndContext`}),`, `,(0,C.jsx)(t.code,{children:`SortableContext`}),`, sortable-item и drag-handle, а бизнес-логика reorder остается у потребителя.
Для типовой визуальной ручки есть `,(0,C.jsx)(t.code,{children:`Sortable.DragHandle`}),`; низкоуровневый `,(0,C.jsx)(t.code,{children:`Sortable.Handle`}),` нужен, когда внешний вид полностью задает потребитель.`]}),`
`,(0,C.jsx)(t.h2,{id:`основной-сценарий`,children:`Основной сценарий`}),`
`,(0,C.jsx)(f,{}),`
`,(0,C.jsx)(i,{of:b}),`
`,(0,C.jsx)(t.pre,{children:(0,C.jsx)(t.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)(t.h2,{id:`практические-рекомендации`,children:`Практические рекомендации`}),`
`,(0,C.jsxs)(t.ul,{children:[`
`,(0,C.jsxs)(t.li,{children:[`Используйте `,(0,C.jsx)(t.code,{children:`Sortable.Root`}),` как общий контекст drag-and-drop для одного сценария взаимодействия.`]}),`
`,(0,C.jsxs)(t.li,{children:[`Для нескольких независимых списков внутри одного экрана задавайте отдельные `,(0,C.jsx)(t.code,{children:`containerId`}),` через `,(0,C.jsx)(t.code,{children:`Sortable.Container`}),`.`]}),`
`,(0,C.jsxs)(t.li,{children:[`Логику reorder удобнее выносить в helper `,(0,C.jsx)(t.code,{children:`getSortableReorderResult`}),`, если перенос между контейнерами не нужен.`]}),`
`,(0,C.jsxs)(t.li,{children:[`Для вложенных сценариев размещайте несколько `,(0,C.jsx)(t.code,{children:`Sortable.Container`}),` внутри одного `,(0,C.jsx)(t.code,{children:`Sortable.Root`}),`.`]}),`
`,(0,C.jsxs)(t.li,{children:[(0,C.jsx)(t.code,{children:`Sortable.Item`}),` отвечает только за DnD-bindings и inline-style трансформации; визуальный каркас строки или карточки должен оставаться у потребителя.`]}),`
`,(0,C.jsxs)(t.li,{children:[`Используйте `,(0,C.jsx)(t.code,{children:`Sortable.DragHandle`}),` для стандартной ручки с `,(0,C.jsx)(t.code,{children:`GripIcon`}),`, локальными стилями и состояниями disabled/dragging.`]}),`
`]}),`
`,(0,C.jsx)(t.h2,{id:`сценарии-использования`,children:`Сценарии использования`}),`
`,(0,C.jsx)(t.h3,{id:`базовый-вертикальный-список`,children:`Базовый вертикальный список`}),`
`,(0,C.jsx)(t.p,{children:`Базовый headless-сценарий сортировки элементов по вертикали.`}),`
`,(0,C.jsx)(d,{of:b}),`
`,(0,C.jsx)(t.h3,{id:`горизонтальный-список`,children:`Горизонтальный список`}),`
`,(0,C.jsxs)(t.p,{children:[`Использование `,(0,C.jsx)(t.code,{children:`layout="horizontal"`}),` для toolbar, чипов и полос вкладок.`]}),`
`,(0,C.jsx)(d,{of:p}),`
`,(0,C.jsx)(t.h3,{id:`grid-карточки`,children:`Grid-карточки`}),`
`,(0,C.jsxs)(t.p,{children:[`Использование `,(0,C.jsx)(t.code,{children:`layout="grid"`}),` для карточек и flow-раскладок.`]}),`
`,(0,C.jsx)(d,{of:v}),`
`,(0,C.jsx)(t.h3,{id:`отключенные-элементы`,children:`Отключенные элементы`}),`
`,(0,C.jsx)(t.p,{children:`Проверка поведения для элементов, которые видны в списке, но не должны перетаскиваться.`}),`
`,(0,C.jsx)(d,{of:g}),`
`,(0,C.jsx)(t.h3,{id:`handle-only-drag`,children:`Handle-only drag`}),`
`,(0,C.jsx)(t.p,{children:`Перетаскивание доступно только через handle, а не через весь элемент.`}),`
`,(0,C.jsx)(d,{of:h}),`
`,(0,C.jsx)(t.h3,{id:`вложенные-контейнеры`,children:`Вложенные контейнеры`}),`
`,(0,C.jsxs)(t.p,{children:[`Два уровня `,(0,C.jsx)(t.code,{children:`Sortable.Container`}),` внутри одного `,(0,C.jsx)(t.code,{children:`Sortable.Root`}),` без переноса между контейнерами.`]}),`
`,(0,C.jsx)(d,{of:_}),`
`,(0,C.jsx)(t.h2,{id:`api`,children:`API`}),`
`,(0,C.jsx)(l,{of:y}),`
`,(0,C.jsx)(t.h2,{id:`все-сторисы`,children:`Все сторисы`}),`
`,(0,C.jsx)(a,{includePrimary:!1})]})}function S(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,C.jsx)(t,{...e,children:(0,C.jsx)(x,{...e})}):x(e)}var C;function w(){return(w=e((()=>{C=t(),r(),c(),m()})))()}w();export{S as default};