{"valid":true,"inputBytes":371,"kind":"move","changed":true,"outcome":"'Review the PR' moved from 'todo' (index 1) into 'done' at index 0.","lists":[{"id":"todo","group":"board","before":["Write the spec","Review the PR","Ship it"],"after":["Write the spec","Ship it"],"changed":true,"itemsChanged":1},{"id":"done","group":"board","before":["Set up CI"],"after":["Review the PR","Set up CI"],"changed":true,"itemsChanged":1}],"steps":[{"step":1,"event":"dragstart","target":"'Review the PR' in 'todo'","accepted":true,"outcome":"The drag started at index 1 of 'todo'.","rendered":[{"list":"todo","items":[{"item":"Write the spec"},{"item":"Review the PR","classes":"bit-bortable-ghost bit-bortable-chosen"},{"item":"Ship it"}]}]},{"step":2,"event":"dragover","target":"list 'done', pointer to index 0 of 'done'","browser":["wouldNest('done') -> false","dropIndex('done') -> 0"],"accepted":true,"outcome":"'done' shows the drop placeholder at index 0; the item itself stays in 'todo' until the drag ends, hidden there.","rendered":[{"list":"todo","items":[{"item":"Write the spec"},{"item":"Review the PR","classes":"bit-bortable-hidden"},{"item":"Ship it"}]},{"list":"done","items":[{"item":"Review the PR","classes":"bit-bortable-ghost bit-bortable-chosen","placeholder":true},{"item":"Set up CI"}]}]},{"step":3,"event":"drop","target":"list 'done'","accepted":true,"outcome":"Committed the move: 'Review the PR' is in 'done' at index 0. Raised ItemsChanged on 'todo', ItemsChanged on 'done', OnRemove on 'todo', OnAdd on 'done', OnSort on 'todo', OnSort on 'done', OnEnd on 'todo'.","rendered":[{"list":"todo","items":[{"item":"Write the spec"},{"item":"Ship it"}]},{"list":"done","items":[{"item":"Review the PR"},{"item":"Set up CI"}]}]}],"events":[{"step":1,"event":"OnStart","list":"todo","item":"Review the PR","items":["Review the PR"],"oldIndex":1,"newIndex":1,"fromId":"todo","toId":"todo","fromGroup":"board","toGroup":"board","crossedLists":false},{"step":2,"event":"OnChange","list":"done","item":"Review the PR","items":["Review the PR"],"oldIndex":1,"newIndex":0,"fromId":"todo","toId":"done","fromGroup":"board","toGroup":"board","crossedLists":true},{"step":3,"event":"ItemsChanged","list":"todo","items":["Write the spec","Ship it"]},{"step":3,"event":"ItemsChanged","list":"done","items":["Review the PR","Set up CI"]},{"step":3,"event":"OnRemove","list":"todo","item":"Review the PR","items":["Review the PR"],"oldIndex":1,"newIndex":0,"fromId":"todo","toId":"done","fromGroup":"board","toGroup":"board","crossedLists":true},{"step":3,"event":"OnAdd","list":"done","item":"Review the PR","items":["Review the PR"],"oldIndex":1,"newIndex":0,"fromId":"todo","toId":"done","fromGroup":"board","toGroup":"board","crossedLists":true},{"step":3,"event":"OnSort","list":"todo","item":"Review the PR","items":["Review the PR"],"oldIndex":1,"newIndex":0,"fromId":"todo","toId":"done","fromGroup":"board","toGroup":"board","crossedLists":true},{"step":3,"event":"OnSort","list":"done","item":"Review the PR","items":["Review the PR"],"oldIndex":1,"newIndex":0,"fromId":"todo","toId":"done","fromGroup":"board","toGroup":"board","crossedLists":true},{"step":3,"event":"OnEnd","list":"todo","item":"Review the PR","items":["Review the PR"],"oldIndex":1,"newIndex":0,"fromId":"todo","toId":"done","fromGroup":"board","toGroup":"board","crossedLists":true}],"markup":"<Bortable @bind-Items=\"_todo\" TItem=\"string\" Id=\"todo\" Group=\"board\">\n    <ItemTemplate Context=\"item\">@item</ItemTemplate>\n</Bortable>\n\n<Bortable @bind-Items=\"_done\" TItem=\"string\" Id=\"done\" Group=\"board\">\n    <ItemTemplate Context=\"item\">@item</ItemTemplate>\n</Bortable>\n\n@code {\n    private IList<string> _todo = new List<string> { \"Write the spec\", \"Review the PR\", \"Ship it\" };\n    private IList<string> _done = new List<string> { \"Set up CI\" };\n}\n","sample":"{\n  \"lists\": [\n    {\n      \"id\": \"todo\",\n      \"items\": [\n        \"Write the spec\",\n        \"Review the PR\",\n        \"Ship it\"\n      ],\n      \"group\": \"board\"\n    },\n    {\n      \"id\": \"done\",\n      \"items\": [\n        \"Set up CI\"\n      ],\n      \"group\": \"board\"\n    }\n  ],\n  \"drag\": {\n    \"from\": \"todo\",\n    \"item\": \"Review the PR\",\n    \"to\": \"done\",\n    \"index\": 0\n  }\n}","notes":["No json was passed, so the sample in Sample was run: a card dragged from one list of a board into the other. Pass your own lists and drag in the same shape - a list also takes pull, put, sort, disabled, swap, multiDrag, filter, cloneSuffix and readOnly; the drag also takes selected, swapWith and release.","Each list whose contents changed raised ItemsChanged - the @bind-Items update - once, before OnUpdate, OnRemove, OnAdd, OnSort and OnEnd, so those handlers already see the final lists.","The lab answers the browser layer's hit tests (dropIndex, itemIndexAt) with the position asked for, so SwapThreshold, InvertSwap, InvertedSwapThreshold and Direction - which only shape that hit test - play no part, and the pointer reached its target in one dragover. A real pointer crossing several items raises OnChange once per item it passes."]}