@dryui/ui 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/dist/adjust/adjust.svelte +1 -1
  2. package/dist/aurora/aurora.svelte +58 -11
  3. package/dist/aurora/aurora.svelte.d.ts +1 -0
  4. package/dist/aurora/index.d.ts +2 -0
  5. package/dist/diagram/diagram.svelte +769 -0
  6. package/dist/diagram/diagram.svelte.d.ts +10 -0
  7. package/dist/diagram/edge-routing.d.ts +9 -0
  8. package/dist/diagram/edge-routing.js +281 -0
  9. package/dist/diagram/index.d.ts +9 -0
  10. package/dist/diagram/index.js +1 -0
  11. package/dist/diagram/layout.d.ts +2 -0
  12. package/dist/diagram/layout.js +985 -0
  13. package/dist/diagram/types.d.ts +196 -0
  14. package/dist/displacement/displacement.svelte +39 -3
  15. package/dist/drag-and-drop/context.svelte.d.ts +1 -0
  16. package/dist/drag-and-drop/drag-and-drop-group.svelte +37 -0
  17. package/dist/drag-and-drop/drag-and-drop-group.svelte.d.ts +8 -0
  18. package/dist/drag-and-drop/drag-and-drop-handle.svelte +2 -0
  19. package/dist/drag-and-drop/drag-and-drop-item.svelte +25 -6
  20. package/dist/drag-and-drop/drag-and-drop-root.svelte +624 -34
  21. package/dist/drag-and-drop/group-context.svelte.d.ts +13 -0
  22. package/dist/drag-and-drop/group-context.svelte.js +8 -0
  23. package/dist/drag-and-drop/index.d.ts +2 -0
  24. package/dist/drag-and-drop/index.js +3 -1
  25. package/dist/drawer/drawer-content.svelte +2 -1
  26. package/dist/drawer/drawer-footer.svelte +1 -1
  27. package/dist/gradient-mesh/gradient-mesh.svelte +42 -5
  28. package/dist/halftone/halftone.svelte +16 -36
  29. package/dist/index.d.ts +1 -4
  30. package/dist/index.js +1 -2
  31. package/dist/logo-mark/logo-mark.svelte +2 -2
  32. package/dist/noise/noise.svelte +2 -2
  33. package/dist/shader-canvas/presets.js +1 -1
  34. package/dist/shader-canvas/shader-canvas.svelte +4 -1
  35. package/dist/sidebar/sidebar-footer.svelte +5 -4
  36. package/dist/spotlight/spotlight.svelte +42 -4
  37. package/dist/themes/aurora.css +229 -0
  38. package/dist/themes/dark.css +134 -0
  39. package/dist/themes/default.css +76 -0
  40. package/dist/themes/midnight.css +142 -0
  41. package/dist/themes/terminal.css +175 -0
  42. package/package.json +22 -27
  43. package/skills/dryui/SKILL.md +1 -0
  44. package/dist/system-map/index.d.ts +0 -17
  45. package/dist/system-map/index.js +0 -1
  46. package/dist/system-map/system-map.svelte +0 -311
  47. package/dist/system-map/system-map.svelte.d.ts +0 -25
  48. package/dist/system-map/types.d.ts +0 -99
  49. package/dist/thumbnail/_layout-content.svelte +0 -89
  50. package/dist/thumbnail/_layout-content.svelte.d.ts +0 -9
  51. package/dist/thumbnail/_layout-footer.svelte +0 -54
  52. package/dist/thumbnail/_layout-footer.svelte.d.ts +0 -9
  53. package/dist/thumbnail/_layout-header.svelte +0 -76
  54. package/dist/thumbnail/_layout-header.svelte.d.ts +0 -9
  55. package/dist/thumbnail/_layout-sidebar.svelte +0 -75
  56. package/dist/thumbnail/_layout-sidebar.svelte.d.ts +0 -9
  57. package/dist/thumbnail/accordion.svelte +0 -144
  58. package/dist/thumbnail/accordion.svelte.d.ts +0 -7
  59. package/dist/thumbnail/add-on-selector.svelte +0 -213
  60. package/dist/thumbnail/add-on-selector.svelte.d.ts +0 -7
  61. package/dist/thumbnail/affix-group.svelte +0 -55
  62. package/dist/thumbnail/affix-group.svelte.d.ts +0 -7
  63. package/dist/thumbnail/alert-dialog.svelte +0 -100
  64. package/dist/thumbnail/alert-dialog.svelte.d.ts +0 -7
  65. package/dist/thumbnail/alert.svelte +0 -79
  66. package/dist/thumbnail/alert.svelte.d.ts +0 -7
  67. package/dist/thumbnail/alpha-slider.svelte +0 -55
  68. package/dist/thumbnail/alpha-slider.svelte.d.ts +0 -7
  69. package/dist/thumbnail/amenity-grid.svelte +0 -236
  70. package/dist/thumbnail/amenity-grid.svelte.d.ts +0 -7
  71. package/dist/thumbnail/app-frame.svelte.d.ts +0 -7
  72. package/dist/thumbnail/apply-size.d.ts +0 -3
  73. package/dist/thumbnail/apply-size.js +0 -14
  74. package/dist/thumbnail/aspect-ratio.svelte +0 -64
  75. package/dist/thumbnail/aspect-ratio.svelte.d.ts +0 -7
  76. package/dist/thumbnail/aurora.svelte +0 -88
  77. package/dist/thumbnail/aurora.svelte.d.ts +0 -7
  78. package/dist/thumbnail/avatar-group.svelte.d.ts +0 -7
  79. package/dist/thumbnail/avatar.svelte +0 -60
  80. package/dist/thumbnail/avatar.svelte.d.ts +0 -7
  81. package/dist/thumbnail/backdrop.svelte +0 -73
  82. package/dist/thumbnail/backdrop.svelte.d.ts +0 -7
  83. package/dist/thumbnail/badge.svelte +0 -100
  84. package/dist/thumbnail/badge.svelte.d.ts +0 -7
  85. package/dist/thumbnail/booking-confirmation.svelte +0 -109
  86. package/dist/thumbnail/booking-confirmation.svelte.d.ts +0 -7
  87. package/dist/thumbnail/breadcrumb.svelte +0 -80
  88. package/dist/thumbnail/breadcrumb.svelte.d.ts +0 -7
  89. package/dist/thumbnail/button-group.svelte +0 -76
  90. package/dist/thumbnail/button-group.svelte.d.ts +0 -7
  91. package/dist/thumbnail/button.svelte +0 -62
  92. package/dist/thumbnail/button.svelte.d.ts +0 -7
  93. package/dist/thumbnail/calendar.svelte +0 -86
  94. package/dist/thumbnail/calendar.svelte.d.ts +0 -7
  95. package/dist/thumbnail/card.svelte +0 -113
  96. package/dist/thumbnail/card.svelte.d.ts +0 -7
  97. package/dist/thumbnail/carousel.svelte +0 -111
  98. package/dist/thumbnail/carousel.svelte.d.ts +0 -7
  99. package/dist/thumbnail/chart.svelte +0 -93
  100. package/dist/thumbnail/chart.svelte.d.ts +0 -7
  101. package/dist/thumbnail/chat-message.svelte.d.ts +0 -7
  102. package/dist/thumbnail/chat-thread.svelte +0 -140
  103. package/dist/thumbnail/chat-thread.svelte.d.ts +0 -7
  104. package/dist/thumbnail/checkbox.svelte +0 -71
  105. package/dist/thumbnail/checkbox.svelte.d.ts +0 -7
  106. package/dist/thumbnail/chip-group.svelte +0 -79
  107. package/dist/thumbnail/chip-group.svelte.d.ts +0 -7
  108. package/dist/thumbnail/chip.svelte +0 -76
  109. package/dist/thumbnail/chip.svelte.d.ts +0 -7
  110. package/dist/thumbnail/chromatic-shift.svelte +0 -55
  111. package/dist/thumbnail/chromatic-shift.svelte.d.ts +0 -7
  112. package/dist/thumbnail/clipboard.svelte +0 -68
  113. package/dist/thumbnail/clipboard.svelte.d.ts +0 -7
  114. package/dist/thumbnail/code-block.svelte +0 -125
  115. package/dist/thumbnail/code-block.svelte.d.ts +0 -7
  116. package/dist/thumbnail/collapsible.svelte +0 -101
  117. package/dist/thumbnail/collapsible.svelte.d.ts +0 -7
  118. package/dist/thumbnail/color-picker.svelte +0 -108
  119. package/dist/thumbnail/color-picker.svelte.d.ts +0 -7
  120. package/dist/thumbnail/combobox.svelte +0 -122
  121. package/dist/thumbnail/combobox.svelte.d.ts +0 -7
  122. package/dist/thumbnail/command-palette.svelte +0 -134
  123. package/dist/thumbnail/command-palette.svelte.d.ts +0 -7
  124. package/dist/thumbnail/commerce-header.svelte +0 -55
  125. package/dist/thumbnail/commerce-header.svelte.d.ts +0 -7
  126. package/dist/thumbnail/comparison-table.svelte +0 -193
  127. package/dist/thumbnail/comparison-table.svelte.d.ts +0 -7
  128. package/dist/thumbnail/container.svelte +0 -119
  129. package/dist/thumbnail/container.svelte.d.ts +0 -7
  130. package/dist/thumbnail/context-menu.svelte +0 -108
  131. package/dist/thumbnail/context-menu.svelte.d.ts +0 -7
  132. package/dist/thumbnail/country-select.svelte +0 -111
  133. package/dist/thumbnail/country-select.svelte.d.ts +0 -7
  134. package/dist/thumbnail/currency-selector.svelte +0 -111
  135. package/dist/thumbnail/currency-selector.svelte.d.ts +0 -7
  136. package/dist/thumbnail/data-grid.svelte +0 -230
  137. package/dist/thumbnail/data-grid.svelte.d.ts +0 -7
  138. package/dist/thumbnail/date-field.svelte +0 -132
  139. package/dist/thumbnail/date-field.svelte.d.ts +0 -7
  140. package/dist/thumbnail/date-picker.svelte +0 -126
  141. package/dist/thumbnail/date-picker.svelte.d.ts +0 -7
  142. package/dist/thumbnail/date-range-picker.svelte +0 -100
  143. package/dist/thumbnail/date-range-picker.svelte.d.ts +0 -7
  144. package/dist/thumbnail/date-time-input.svelte +0 -182
  145. package/dist/thumbnail/date-time-input.svelte.d.ts +0 -7
  146. package/dist/thumbnail/description-list.svelte +0 -142
  147. package/dist/thumbnail/description-list.svelte.d.ts +0 -7
  148. package/dist/thumbnail/dialog.svelte +0 -136
  149. package/dist/thumbnail/dialog.svelte.d.ts +0 -7
  150. package/dist/thumbnail/displacement.svelte +0 -55
  151. package/dist/thumbnail/displacement.svelte.d.ts +0 -7
  152. package/dist/thumbnail/drag-and-drop.svelte +0 -139
  153. package/dist/thumbnail/drag-and-drop.svelte.d.ts +0 -7
  154. package/dist/thumbnail/drawer.svelte +0 -112
  155. package/dist/thumbnail/drawer.svelte.d.ts +0 -7
  156. package/dist/thumbnail/drop-zone.svelte +0 -55
  157. package/dist/thumbnail/drop-zone.svelte.d.ts +0 -7
  158. package/dist/thumbnail/dropdown-menu.svelte +0 -128
  159. package/dist/thumbnail/dropdown-menu.svelte.d.ts +0 -7
  160. package/dist/thumbnail/empty-state.svelte.d.ts +0 -7
  161. package/dist/thumbnail/fare-class-picker.svelte +0 -225
  162. package/dist/thumbnail/fare-class-picker.svelte.d.ts +0 -7
  163. package/dist/thumbnail/feature-split-section.svelte.d.ts +0 -7
  164. package/dist/thumbnail/field.svelte +0 -82
  165. package/dist/thumbnail/field.svelte.d.ts +0 -7
  166. package/dist/thumbnail/fieldset.svelte +0 -123
  167. package/dist/thumbnail/fieldset.svelte.d.ts +0 -7
  168. package/dist/thumbnail/file-select.svelte +0 -90
  169. package/dist/thumbnail/file-select.svelte.d.ts +0 -7
  170. package/dist/thumbnail/file-upload.svelte +0 -84
  171. package/dist/thumbnail/file-upload.svelte.d.ts +0 -7
  172. package/dist/thumbnail/filter-sidebar.svelte +0 -201
  173. package/dist/thumbnail/filter-sidebar.svelte.d.ts +0 -7
  174. package/dist/thumbnail/flexible-dates-grid.svelte +0 -210
  175. package/dist/thumbnail/flexible-dates-grid.svelte.d.ts +0 -7
  176. package/dist/thumbnail/flight-timeline.svelte +0 -155
  177. package/dist/thumbnail/flight-timeline.svelte.d.ts +0 -7
  178. package/dist/thumbnail/flip-card.svelte +0 -128
  179. package/dist/thumbnail/flip-card.svelte.d.ts +0 -7
  180. package/dist/thumbnail/float-button.svelte +0 -63
  181. package/dist/thumbnail/float-button.svelte.d.ts +0 -7
  182. package/dist/thumbnail/focus-trap.svelte +0 -110
  183. package/dist/thumbnail/focus-trap.svelte.d.ts +0 -7
  184. package/dist/thumbnail/format-bytes.svelte +0 -51
  185. package/dist/thumbnail/format-bytes.svelte.d.ts +0 -7
  186. package/dist/thumbnail/format-date.svelte +0 -51
  187. package/dist/thumbnail/format-date.svelte.d.ts +0 -7
  188. package/dist/thumbnail/format-number.svelte +0 -51
  189. package/dist/thumbnail/format-number.svelte.d.ts +0 -7
  190. package/dist/thumbnail/gauge.svelte +0 -90
  191. package/dist/thumbnail/gauge.svelte.d.ts +0 -7
  192. package/dist/thumbnail/glass-surface.svelte.d.ts +0 -7
  193. package/dist/thumbnail/glow.svelte +0 -55
  194. package/dist/thumbnail/glow.svelte.d.ts +0 -7
  195. package/dist/thumbnail/gradient-mesh.svelte +0 -55
  196. package/dist/thumbnail/gradient-mesh.svelte.d.ts +0 -7
  197. package/dist/thumbnail/guest-room-selector.svelte +0 -214
  198. package/dist/thumbnail/guest-room-selector.svelte.d.ts +0 -7
  199. package/dist/thumbnail/halftone.svelte +0 -55
  200. package/dist/thumbnail/halftone.svelte.d.ts +0 -7
  201. package/dist/thumbnail/heading.svelte +0 -91
  202. package/dist/thumbnail/heading.svelte.d.ts +0 -7
  203. package/dist/thumbnail/hotel-gallery.svelte +0 -117
  204. package/dist/thumbnail/hotel-gallery.svelte.d.ts +0 -7
  205. package/dist/thumbnail/hotkey.svelte +0 -108
  206. package/dist/thumbnail/hotkey.svelte.d.ts +0 -7
  207. package/dist/thumbnail/hover-card.svelte +0 -117
  208. package/dist/thumbnail/hover-card.svelte.d.ts +0 -7
  209. package/dist/thumbnail/icon.svelte +0 -55
  210. package/dist/thumbnail/icon.svelte.d.ts +0 -7
  211. package/dist/thumbnail/image-comparison.svelte +0 -96
  212. package/dist/thumbnail/image-comparison.svelte.d.ts +0 -7
  213. package/dist/thumbnail/image.svelte +0 -74
  214. package/dist/thumbnail/image.svelte.d.ts +0 -7
  215. package/dist/thumbnail/index.d.ts +0 -12
  216. package/dist/thumbnail/index.js +0 -359
  217. package/dist/thumbnail/infinite-scroll.svelte +0 -129
  218. package/dist/thumbnail/infinite-scroll.svelte.d.ts +0 -7
  219. package/dist/thumbnail/input-group.svelte +0 -55
  220. package/dist/thumbnail/input-group.svelte.d.ts +0 -7
  221. package/dist/thumbnail/input.svelte +0 -74
  222. package/dist/thumbnail/input.svelte.d.ts +0 -7
  223. package/dist/thumbnail/itinerary-timeline.svelte +0 -143
  224. package/dist/thumbnail/itinerary-timeline.svelte.d.ts +0 -7
  225. package/dist/thumbnail/kbd.svelte +0 -112
  226. package/dist/thumbnail/kbd.svelte.d.ts +0 -7
  227. package/dist/thumbnail/label.svelte +0 -54
  228. package/dist/thumbnail/label.svelte.d.ts +0 -7
  229. package/dist/thumbnail/layout-header-content-footer.svelte +0 -64
  230. package/dist/thumbnail/layout-header-content-footer.svelte.d.ts +0 -7
  231. package/dist/thumbnail/layout-header-sidebar-main.svelte +0 -64
  232. package/dist/thumbnail/layout-header-sidebar-main.svelte.d.ts +0 -7
  233. package/dist/thumbnail/layout-sidebar-main.svelte +0 -57
  234. package/dist/thumbnail/layout-sidebar-main.svelte.d.ts +0 -7
  235. package/dist/thumbnail/link-preview.svelte +0 -141
  236. package/dist/thumbnail/link-preview.svelte.d.ts +0 -7
  237. package/dist/thumbnail/link.svelte +0 -70
  238. package/dist/thumbnail/link.svelte.d.ts +0 -7
  239. package/dist/thumbnail/list.svelte +0 -86
  240. package/dist/thumbnail/list.svelte.d.ts +0 -7
  241. package/dist/thumbnail/listbox.svelte +0 -102
  242. package/dist/thumbnail/listbox.svelte.d.ts +0 -7
  243. package/dist/thumbnail/location-autocomplete.svelte +0 -219
  244. package/dist/thumbnail/location-autocomplete.svelte.d.ts +0 -7
  245. package/dist/thumbnail/logo-cloud.svelte.d.ts +0 -7
  246. package/dist/thumbnail/loyalty-points-display.svelte +0 -147
  247. package/dist/thumbnail/loyalty-points-display.svelte.d.ts +0 -7
  248. package/dist/thumbnail/map-list-toggle.svelte +0 -140
  249. package/dist/thumbnail/map-list-toggle.svelte.d.ts +0 -7
  250. package/dist/thumbnail/map.svelte +0 -112
  251. package/dist/thumbnail/map.svelte.d.ts +0 -7
  252. package/dist/thumbnail/markdown-renderer.svelte +0 -113
  253. package/dist/thumbnail/markdown-renderer.svelte.d.ts +0 -7
  254. package/dist/thumbnail/marquee.svelte +0 -114
  255. package/dist/thumbnail/marquee.svelte.d.ts +0 -7
  256. package/dist/thumbnail/mask-reveal.svelte +0 -55
  257. package/dist/thumbnail/mask-reveal.svelte.d.ts +0 -7
  258. package/dist/thumbnail/mega-menu.svelte +0 -176
  259. package/dist/thumbnail/mega-menu.svelte.d.ts +0 -7
  260. package/dist/thumbnail/menubar.svelte +0 -99
  261. package/dist/thumbnail/menubar.svelte.d.ts +0 -7
  262. package/dist/thumbnail/multi-city-search-form.svelte +0 -241
  263. package/dist/thumbnail/multi-city-search-form.svelte.d.ts +0 -7
  264. package/dist/thumbnail/multi-select-combobox.svelte +0 -142
  265. package/dist/thumbnail/multi-select-combobox.svelte.d.ts +0 -7
  266. package/dist/thumbnail/navigation-menu.svelte +0 -102
  267. package/dist/thumbnail/navigation-menu.svelte.d.ts +0 -7
  268. package/dist/thumbnail/noise.svelte +0 -72
  269. package/dist/thumbnail/noise.svelte.d.ts +0 -7
  270. package/dist/thumbnail/notification-center.svelte +0 -152
  271. package/dist/thumbnail/notification-center.svelte.d.ts +0 -7
  272. package/dist/thumbnail/number-input.svelte +0 -113
  273. package/dist/thumbnail/number-input.svelte.d.ts +0 -7
  274. package/dist/thumbnail/option-swatch-group.svelte +0 -55
  275. package/dist/thumbnail/option-swatch-group.svelte.d.ts +0 -7
  276. package/dist/thumbnail/page-header.svelte.d.ts +0 -7
  277. package/dist/thumbnail/pagination.svelte +0 -121
  278. package/dist/thumbnail/pagination.svelte.d.ts +0 -7
  279. package/dist/thumbnail/passenger-class-selector.svelte +0 -142
  280. package/dist/thumbnail/passenger-class-selector.svelte.d.ts +0 -7
  281. package/dist/thumbnail/payment-card-input.svelte +0 -172
  282. package/dist/thumbnail/payment-card-input.svelte.d.ts +0 -7
  283. package/dist/thumbnail/phone-input.svelte +0 -103
  284. package/dist/thumbnail/phone-input.svelte.d.ts +0 -7
  285. package/dist/thumbnail/pin-input.svelte +0 -72
  286. package/dist/thumbnail/pin-input.svelte.d.ts +0 -7
  287. package/dist/thumbnail/popover.svelte +0 -122
  288. package/dist/thumbnail/popover.svelte.d.ts +0 -7
  289. package/dist/thumbnail/portal.svelte +0 -115
  290. package/dist/thumbnail/portal.svelte.d.ts +0 -7
  291. package/dist/thumbnail/price-calendar.svelte +0 -366
  292. package/dist/thumbnail/price-calendar.svelte.d.ts +0 -7
  293. package/dist/thumbnail/price-summary-panel.svelte +0 -165
  294. package/dist/thumbnail/price-summary-panel.svelte.d.ts +0 -7
  295. package/dist/thumbnail/progress-ring.svelte +0 -63
  296. package/dist/thumbnail/progress-ring.svelte.d.ts +0 -7
  297. package/dist/thumbnail/progress.svelte +0 -66
  298. package/dist/thumbnail/progress.svelte.d.ts +0 -7
  299. package/dist/thumbnail/promo-code-input.svelte +0 -111
  300. package/dist/thumbnail/promo-code-input.svelte.d.ts +0 -7
  301. package/dist/thumbnail/promo-mosaic.svelte +0 -55
  302. package/dist/thumbnail/promo-mosaic.svelte.d.ts +0 -7
  303. package/dist/thumbnail/prompt-input.svelte +0 -91
  304. package/dist/thumbnail/prompt-input.svelte.d.ts +0 -7
  305. package/dist/thumbnail/qr-code.svelte +0 -217
  306. package/dist/thumbnail/qr-code.svelte.d.ts +0 -7
  307. package/dist/thumbnail/radio-group.svelte +0 -97
  308. package/dist/thumbnail/radio-group.svelte.d.ts +0 -7
  309. package/dist/thumbnail/range-calendar.svelte +0 -92
  310. package/dist/thumbnail/range-calendar.svelte.d.ts +0 -7
  311. package/dist/thumbnail/rating.svelte +0 -61
  312. package/dist/thumbnail/rating.svelte.d.ts +0 -7
  313. package/dist/thumbnail/recent-searches.svelte +0 -197
  314. package/dist/thumbnail/recent-searches.svelte.d.ts +0 -7
  315. package/dist/thumbnail/relative-time.svelte +0 -51
  316. package/dist/thumbnail/relative-time.svelte.d.ts +0 -7
  317. package/dist/thumbnail/result-card-car.svelte +0 -149
  318. package/dist/thumbnail/result-card-car.svelte.d.ts +0 -7
  319. package/dist/thumbnail/result-card-flight.svelte +0 -170
  320. package/dist/thumbnail/result-card-flight.svelte.d.ts +0 -7
  321. package/dist/thumbnail/result-card-hotel.svelte +0 -174
  322. package/dist/thumbnail/result-card-hotel.svelte.d.ts +0 -7
  323. package/dist/thumbnail/reveal.svelte +0 -109
  324. package/dist/thumbnail/reveal.svelte.d.ts +0 -7
  325. package/dist/thumbnail/review-card.svelte +0 -153
  326. package/dist/thumbnail/review-card.svelte.d.ts +0 -7
  327. package/dist/thumbnail/rich-text-editor.svelte +0 -134
  328. package/dist/thumbnail/rich-text-editor.svelte.d.ts +0 -7
  329. package/dist/thumbnail/room-type-picker.svelte +0 -212
  330. package/dist/thumbnail/room-type-picker.svelte.d.ts +0 -7
  331. package/dist/thumbnail/root.svelte +0 -52
  332. package/dist/thumbnail/root.svelte.d.ts +0 -10
  333. package/dist/thumbnail/route-map.svelte +0 -132
  334. package/dist/thumbnail/route-map.svelte.d.ts +0 -7
  335. package/dist/thumbnail/scroll-area.svelte +0 -124
  336. package/dist/thumbnail/scroll-area.svelte.d.ts +0 -7
  337. package/dist/thumbnail/scroll-to-top.svelte +0 -60
  338. package/dist/thumbnail/scroll-to-top.svelte.d.ts +0 -7
  339. package/dist/thumbnail/search-form-tabs.svelte +0 -192
  340. package/dist/thumbnail/search-form-tabs.svelte.d.ts +0 -7
  341. package/dist/thumbnail/seat-map.svelte +0 -358
  342. package/dist/thumbnail/seat-map.svelte.d.ts +0 -7
  343. package/dist/thumbnail/segmented-control.svelte +0 -93
  344. package/dist/thumbnail/segmented-control.svelte.d.ts +0 -7
  345. package/dist/thumbnail/select.svelte +0 -82
  346. package/dist/thumbnail/select.svelte.d.ts +0 -7
  347. package/dist/thumbnail/selectable-tile-group.svelte +0 -55
  348. package/dist/thumbnail/selectable-tile-group.svelte.d.ts +0 -7
  349. package/dist/thumbnail/separator.svelte +0 -94
  350. package/dist/thumbnail/separator.svelte.d.ts +0 -7
  351. package/dist/thumbnail/shader-canvas.svelte +0 -55
  352. package/dist/thumbnail/shader-canvas.svelte.d.ts +0 -7
  353. package/dist/thumbnail/sidebar.svelte +0 -109
  354. package/dist/thumbnail/sidebar.svelte.d.ts +0 -7
  355. package/dist/thumbnail/skeleton.svelte +0 -94
  356. package/dist/thumbnail/skeleton.svelte.d.ts +0 -7
  357. package/dist/thumbnail/slider.svelte +0 -71
  358. package/dist/thumbnail/slider.svelte.d.ts +0 -7
  359. package/dist/thumbnail/sort-bar.svelte +0 -156
  360. package/dist/thumbnail/sort-bar.svelte.d.ts +0 -7
  361. package/dist/thumbnail/spacer.svelte +0 -95
  362. package/dist/thumbnail/spacer.svelte.d.ts +0 -7
  363. package/dist/thumbnail/sparkline.svelte +0 -59
  364. package/dist/thumbnail/sparkline.svelte.d.ts +0 -7
  365. package/dist/thumbnail/spinner.svelte +0 -63
  366. package/dist/thumbnail/spinner.svelte.d.ts +0 -7
  367. package/dist/thumbnail/splitter.svelte +0 -79
  368. package/dist/thumbnail/splitter.svelte.d.ts +0 -7
  369. package/dist/thumbnail/spotlight.svelte +0 -90
  370. package/dist/thumbnail/spotlight.svelte.d.ts +0 -7
  371. package/dist/thumbnail/star-rating.svelte +0 -106
  372. package/dist/thumbnail/star-rating.svelte.d.ts +0 -7
  373. package/dist/thumbnail/stat-card.svelte.d.ts +0 -7
  374. package/dist/thumbnail/stepper.svelte +0 -94
  375. package/dist/thumbnail/stepper.svelte.d.ts +0 -7
  376. package/dist/thumbnail/svg.svelte +0 -55
  377. package/dist/thumbnail/svg.svelte.d.ts +0 -8
  378. package/dist/thumbnail/swatch-strip.svelte.d.ts +0 -7
  379. package/dist/thumbnail/switch.svelte.d.ts +0 -7
  380. package/dist/thumbnail/system-map.svelte +0 -154
  381. package/dist/thumbnail/system-map.svelte.d.ts +0 -7
  382. package/dist/thumbnail/table-of-contents.svelte +0 -101
  383. package/dist/thumbnail/table-of-contents.svelte.d.ts +0 -7
  384. package/dist/thumbnail/table.svelte +0 -214
  385. package/dist/thumbnail/table.svelte.d.ts +0 -7
  386. package/dist/thumbnail/tabs.svelte +0 -133
  387. package/dist/thumbnail/tabs.svelte.d.ts +0 -7
  388. package/dist/thumbnail/tag.svelte +0 -95
  389. package/dist/thumbnail/tag.svelte.d.ts +0 -7
  390. package/dist/thumbnail/tags-input.svelte +0 -142
  391. package/dist/thumbnail/tags-input.svelte.d.ts +0 -7
  392. package/dist/thumbnail/text.svelte +0 -72
  393. package/dist/thumbnail/text.svelte.d.ts +0 -7
  394. package/dist/thumbnail/textarea.svelte +0 -111
  395. package/dist/thumbnail/textarea.svelte.d.ts +0 -7
  396. package/dist/thumbnail/time-input.svelte +0 -94
  397. package/dist/thumbnail/time-input.svelte.d.ts +0 -7
  398. package/dist/thumbnail/timeline.svelte +0 -123
  399. package/dist/thumbnail/timeline.svelte.d.ts +0 -7
  400. package/dist/thumbnail/toast.svelte +0 -105
  401. package/dist/thumbnail/toast.svelte.d.ts +0 -7
  402. package/dist/thumbnail/toggle-group.svelte +0 -76
  403. package/dist/thumbnail/toggle-group.svelte.d.ts +0 -7
  404. package/dist/thumbnail/toggle.svelte +0 -46
  405. package/dist/thumbnail/toggle.svelte.d.ts +0 -7
  406. package/dist/thumbnail/token-preview.svelte.d.ts +0 -7
  407. package/dist/thumbnail/toolbar.svelte +0 -109
  408. package/dist/thumbnail/toolbar.svelte.d.ts +0 -7
  409. package/dist/thumbnail/tooltip.svelte +0 -85
  410. package/dist/thumbnail/tooltip.svelte.d.ts +0 -7
  411. package/dist/thumbnail/tour.svelte +0 -149
  412. package/dist/thumbnail/tour.svelte.d.ts +0 -7
  413. package/dist/thumbnail/transfer.svelte +0 -168
  414. package/dist/thumbnail/transfer.svelte.d.ts +0 -7
  415. package/dist/thumbnail/tree.svelte +0 -215
  416. package/dist/thumbnail/tree.svelte.d.ts +0 -7
  417. package/dist/thumbnail/trip-card.svelte +0 -137
  418. package/dist/thumbnail/trip-card.svelte.d.ts +0 -7
  419. package/dist/thumbnail/trust-badges.svelte +0 -207
  420. package/dist/thumbnail/trust-badges.svelte.d.ts +0 -7
  421. package/dist/thumbnail/typing-indicator.svelte +0 -65
  422. package/dist/thumbnail/typing-indicator.svelte.d.ts +0 -7
  423. package/dist/thumbnail/typography.svelte +0 -80
  424. package/dist/thumbnail/typography.svelte.d.ts +0 -7
  425. package/dist/thumbnail/user.svelte.d.ts +0 -7
  426. package/dist/thumbnail/video-embed.svelte +0 -87
  427. package/dist/thumbnail/video-embed.svelte.d.ts +0 -7
  428. package/dist/thumbnail/virtual-list.svelte +0 -178
  429. package/dist/thumbnail/virtual-list.svelte.d.ts +0 -7
  430. package/dist/thumbnail/visually-hidden.svelte +0 -106
  431. package/dist/thumbnail/visually-hidden.svelte.d.ts +0 -7
  432. package/dist/thumbnail/wave-divider.svelte.d.ts +0 -7
  433. /package/dist/{system-map → diagram}/types.js +0 -0
@@ -1,12 +1,15 @@
1
1
  <script lang="ts" generics="T">
2
+ import { flushSync } from 'svelte';
2
3
  import type { Snippet } from 'svelte';
3
4
  import type { HTMLAttributes } from 'svelte/elements';
4
5
  import { setDragAndDropCtx } from './context.svelte.js';
6
+ import { getGroupCtx } from './group-context.svelte.js';
5
7
 
6
8
  interface Props extends HTMLAttributes<HTMLDivElement> {
7
9
  items: T[];
8
10
  onReorder: (items: T[]) => void;
9
11
  orientation?: 'vertical' | 'horizontal';
12
+ listId?: string;
10
13
  children: Snippet;
11
14
  }
12
15
 
@@ -14,6 +17,7 @@
14
17
  items,
15
18
  onReorder,
16
19
  orientation = 'vertical',
20
+ listId,
17
21
  children,
18
22
  class: className,
19
23
  ...rest
@@ -27,57 +31,622 @@
27
31
 
28
32
  let rootElement: HTMLDivElement | undefined = $state();
29
33
 
34
+ let isPending = $state(false);
35
+ let startX = 0;
36
+ let startY = 0;
37
+ let pointerX = 0;
38
+ let pointerY = 0;
39
+
40
+ let previewEl: HTMLElement | null = null;
41
+ let rafId: number | null = null;
42
+ let isAnimating = false;
43
+
44
+ // Cross-list state
45
+ let crossListTarget: string | null = null;
46
+ let crossListIndex: number | null = null;
47
+
48
+ const groupCtx = getGroupCtx();
49
+
50
+ // Register with group when inside one
51
+ $effect(() => {
52
+ if (groupCtx && listId && rootElement) {
53
+ groupCtx.register(listId, rootElement);
54
+ return () => {
55
+ if (listId) groupCtx.unregister(listId);
56
+ };
57
+ }
58
+ });
59
+
60
+ // Derive foreign over index from group active target
61
+ let foreignOverIndex = $derived.by(() => {
62
+ if (!groupCtx || !listId) return null;
63
+ const target = groupCtx.activeTarget;
64
+ if (target && target.listId === listId) return target.index;
65
+ return null;
66
+ });
67
+
68
+ const DRAG_THRESHOLD = 8;
69
+ const SCROLL_THRESHOLD = 40;
70
+ const SCROLL_SPEED = 8;
71
+ const FLIP_DURATION = 200;
72
+ const FLIP_EASING = 'cubic-bezier(0.2, 0, 0, 1)';
73
+
74
+ function captureRects(): Map<number, DOMRect> {
75
+ const rects = new Map<number, DOMRect>();
76
+ if (!rootElement) return rects;
77
+ rootElement.querySelectorAll<HTMLElement>('[data-dnd-item]').forEach((el) => {
78
+ const idx = parseInt(el.getAttribute('data-index') || '', 10);
79
+ if (!isNaN(idx)) rects.set(idx, el.getBoundingClientRect());
80
+ });
81
+ return rects;
82
+ }
83
+
30
84
  function reorder(from: number, to: number) {
31
- if (from === to) return;
85
+ if (to === from || to === from + 1) return;
86
+
87
+ const firstRects = captureRects();
88
+ const insertAt = to > from ? to - 1 : to;
89
+
32
90
  const newItems = [...items];
33
91
  const removed = newItems.splice(from, 1);
34
92
  if (removed.length === 0) return;
35
- newItems.splice(to, 0, removed[0]!);
36
- onReorder(newItems);
93
+ newItems.splice(insertAt, 0, removed[0]!);
94
+ flushSync(() => onReorder(newItems));
95
+
96
+ if (!rootElement || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
97
+
98
+ rootElement.querySelectorAll<HTMLElement>('[data-dnd-item]').forEach((el) => {
99
+ const newIdx = parseInt(el.getAttribute('data-index') || '', 10);
100
+ if (isNaN(newIdx)) return;
101
+
102
+ let oldIdx: number;
103
+ if (newIdx === insertAt) {
104
+ oldIdx = from;
105
+ } else if (from < insertAt && newIdx >= from && newIdx < insertAt) {
106
+ oldIdx = newIdx + 1;
107
+ } else if (from > insertAt && newIdx > insertAt && newIdx <= from) {
108
+ oldIdx = newIdx - 1;
109
+ } else {
110
+ return;
111
+ }
112
+
113
+ const first = firstRects.get(oldIdx);
114
+ if (!first) return;
115
+ const last = el.getBoundingClientRect();
116
+ const dx = first.left - last.left;
117
+ const dy = first.top - last.top;
118
+ if (Math.abs(dx) < 1 && Math.abs(dy) < 1) return;
119
+
120
+ el.animate([{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0, 0)' }], {
121
+ duration: FLIP_DURATION,
122
+ easing: FLIP_EASING
123
+ });
124
+ });
37
125
  }
38
126
 
39
- function handlePointerMove(e: PointerEvent) {
40
- if (!isDragging || draggedIndex === null || !rootElement) return;
127
+ function createPreview() {
128
+ if (!rootElement || draggedIndex === null) return;
129
+
130
+ const draggedEl = rootElement.querySelector<HTMLElement>(
131
+ `[data-dnd-item][data-index="${draggedIndex}"]`
132
+ );
133
+ if (!draggedEl) return;
134
+
135
+ const rect = draggedEl.getBoundingClientRect();
136
+
137
+ const clone = draggedEl.cloneNode(true) as HTMLElement;
138
+ clone.setAttribute('data-dnd-preview', '');
139
+ clone.removeAttribute('data-index');
140
+ clone.removeAttribute('data-dragging');
141
+ clone.removeAttribute('data-drag-active');
142
+ clone.removeAttribute('data-over');
143
+ clone.removeAttribute('role');
144
+ clone.removeAttribute('tabindex');
145
+ clone.removeAttribute('aria-roledescription');
146
+ clone.removeAttribute('aria-label');
147
+
148
+ const computed = getComputedStyle(draggedEl);
149
+ Object.assign(clone.style, {
150
+ gridTemplateColumns: computed.gridTemplateColumns,
151
+ padding: computed.padding,
152
+ gap: computed.gap,
153
+ position: 'fixed',
154
+ left: `${rect.left}px`,
155
+ top: `${rect.top}px`,
156
+ width: `${rect.width}px`,
157
+ height: `${rect.height}px`,
158
+ margin: '0',
159
+ pointerEvents: 'none',
160
+ willChange: 'transform',
161
+ zIndex: '9999',
162
+ boxShadow: '0 24px 48px -12px rgba(0,0,0,0.18), 0 12px 24px -8px rgba(0,0,0,0.1)',
163
+ transition: 'none'
164
+ });
41
165
 
42
- const itemElements = Array.from(rootElement.querySelectorAll<HTMLElement>('[data-dnd-item]'));
166
+ document.body.appendChild(clone);
167
+ previewEl = clone;
168
+ updatePreviewPosition();
169
+ }
43
170
 
44
- const pointerPos = orientation === 'vertical' ? e.clientY : e.clientX;
171
+ function updatePreviewPosition() {
172
+ if (!previewEl) return;
173
+ const dx = pointerX - startX;
174
+ const dy = pointerY - startY;
175
+ previewEl.style.transform = `translate3d(${dx}px, ${dy}px, 0) rotate(3deg) scale(1.04)`;
176
+ }
45
177
 
46
- let closestIndex = draggedIndex;
47
- let closestDist = Infinity;
178
+ function findItemAt(x: number, y: number): { rootEl: HTMLElement; index: number } | null {
179
+ const els = document.elementsFromPoint(x, y);
180
+ for (const el of els) {
181
+ const item = (el as HTMLElement).closest?.('[data-dnd-item]') as HTMLElement | null;
182
+ if (!item || item.hasAttribute('data-dnd-preview')) continue;
183
+ const idx = parseInt(item.getAttribute('data-index') || '', 10);
184
+ if (isNaN(idx)) continue;
185
+ const root = item.closest('[data-dnd-root]') as HTMLElement | null;
186
+ if (root) return { rootEl: root, index: idx };
187
+ }
188
+ return null;
189
+ }
48
190
 
49
- for (let i = 0; i < itemElements.length; i++) {
50
- const el = itemElements[i];
51
- if (!el) continue;
52
- const rect = el.getBoundingClientRect();
191
+ function gapIndexFromItems(container: HTMLElement, pos: number): number {
192
+ const itemEls = container.querySelectorAll<HTMLElement>('[data-dnd-item]');
193
+ if (itemEls.length === 0) return 0;
194
+ for (let i = 0; i < itemEls.length; i++) {
195
+ const rect = itemEls[i]!.getBoundingClientRect();
53
196
  const center =
54
197
  orientation === 'vertical' ? rect.top + rect.height / 2 : rect.left + rect.width / 2;
55
- const dist = Math.abs(pointerPos - center);
56
- if (dist < closestDist) {
57
- closestDist = dist;
58
- closestIndex = i;
198
+ if (pos < center) return i;
199
+ }
200
+ return itemEls.length;
201
+ }
202
+
203
+ function updateOverIndex() {
204
+ if (draggedIndex === null || !rootElement) return;
205
+ const pointerPos = orientation === 'vertical' ? pointerY : pointerX;
206
+
207
+ const hit = findItemAt(pointerX, pointerY);
208
+
209
+ // Direct hit on an item in THIS root — use above/below center
210
+ if (hit && hit.rootEl === rootElement) {
211
+ const el = rootElement.querySelector<HTMLElement>(
212
+ `[data-dnd-item][data-index="${hit.index}"]`
213
+ );
214
+ if (el) {
215
+ const rect = el.getBoundingClientRect();
216
+ const center =
217
+ orientation === 'vertical' ? rect.top + rect.height / 2 : rect.left + rect.width / 2;
218
+ const idx = pointerPos < center ? hit.index : hit.index + 1;
219
+ if (overIndex !== idx) overIndex = idx;
59
220
  }
221
+ clearCrossListTarget();
222
+ return;
223
+ }
224
+
225
+ // Direct hit on an item in a SIBLING root
226
+ if (hit && groupCtx && listId) {
227
+ const roots = groupCtx.getRoots();
228
+ for (const [siblingId, siblingEl] of roots) {
229
+ if (siblingId === listId) continue;
230
+ if (siblingEl === hit.rootEl || siblingEl.contains(hit.rootEl)) {
231
+ const idx = gapIndexFromItems(siblingEl, pointerPos);
232
+ setCrossListTarget(siblingId, idx);
233
+ overIndex = null;
234
+ return;
235
+ }
236
+ }
237
+ }
238
+
239
+ // No direct hit — check if pointer is over a sibling root's bounds
240
+ if (groupCtx && listId) {
241
+ const roots = groupCtx.getRoots();
242
+ for (const [siblingId, siblingEl] of roots) {
243
+ if (siblingId === listId) continue;
244
+ const rect = siblingEl.getBoundingClientRect();
245
+ if (
246
+ pointerX >= rect.left &&
247
+ pointerX <= rect.right &&
248
+ pointerY >= rect.top &&
249
+ pointerY <= rect.bottom
250
+ ) {
251
+ const idx = gapIndexFromItems(siblingEl, pointerPos);
252
+ setCrossListTarget(siblingId, idx);
253
+ overIndex = null;
254
+ return;
255
+ }
256
+ }
257
+ }
258
+
259
+ // Fallback: find gap in THIS root
260
+ const idx = gapIndexFromItems(rootElement, pointerPos);
261
+ if (overIndex !== idx) overIndex = idx;
262
+ clearCrossListTarget();
263
+ }
264
+
265
+ function setCrossListTarget(targetListId: string, targetIndex: number) {
266
+ crossListTarget = targetListId;
267
+ crossListIndex = targetIndex;
268
+ if (groupCtx) groupCtx.setActiveTarget(targetListId, targetIndex);
269
+ }
270
+
271
+ function clearCrossListTarget() {
272
+ if (crossListTarget !== null) {
273
+ crossListTarget = null;
274
+ crossListIndex = null;
275
+ if (groupCtx) groupCtx.setActiveTarget(null, null);
60
276
  }
277
+ }
61
278
 
62
- overIndex = closestIndex;
279
+ function autoScroll() {
280
+ if (!rootElement || !isDragging) return;
281
+ const rect = rootElement.getBoundingClientRect();
282
+
283
+ if (orientation === 'vertical') {
284
+ if (pointerY - rect.top < SCROLL_THRESHOLD && rootElement.scrollTop > 0) {
285
+ rootElement.scrollTop -= SCROLL_SPEED;
286
+ } else if (
287
+ rect.bottom - pointerY < SCROLL_THRESHOLD &&
288
+ rootElement.scrollTop < rootElement.scrollHeight - rootElement.clientHeight
289
+ ) {
290
+ rootElement.scrollTop += SCROLL_SPEED;
291
+ }
292
+ } else {
293
+ if (pointerX - rect.left < SCROLL_THRESHOLD && rootElement.scrollLeft > 0) {
294
+ rootElement.scrollLeft -= SCROLL_SPEED;
295
+ } else if (
296
+ rect.right - pointerX < SCROLL_THRESHOLD &&
297
+ rootElement.scrollLeft < rootElement.scrollWidth - rootElement.clientWidth
298
+ ) {
299
+ rootElement.scrollLeft += SCROLL_SPEED;
300
+ }
301
+ }
302
+ }
303
+
304
+ function scheduleUpdate() {
305
+ if (rafId !== null) return;
306
+ rafId = requestAnimationFrame(() => {
307
+ rafId = null;
308
+ updatePreviewPosition();
309
+ updateOverIndex();
310
+ autoScroll();
311
+ });
312
+ }
313
+
314
+ function removePreview() {
315
+ if (previewEl) {
316
+ previewEl.remove();
317
+ previewEl = null;
318
+ }
319
+ if (rafId !== null) {
320
+ cancelAnimationFrame(rafId);
321
+ rafId = null;
322
+ }
323
+ }
324
+
325
+ function handlePointerMove(e: PointerEvent) {
326
+ if (isAnimating) return;
327
+ if (!isPending && !isDragging) return;
328
+
329
+ pointerX = e.clientX;
330
+ pointerY = e.clientY;
331
+
332
+ if (isPending && !isDragging) {
333
+ const dx = e.clientX - startX;
334
+ const dy = e.clientY - startY;
335
+ if (dx * dx + dy * dy < DRAG_THRESHOLD * DRAG_THRESHOLD) return;
336
+
337
+ isPending = false;
338
+ isDragging = true;
339
+ createPreview();
340
+ announce(`Grabbed item at position ${(draggedIndex ?? 0) + 1}. Use arrow keys to move.`);
341
+ }
342
+
343
+ if (isDragging) {
344
+ scheduleUpdate();
345
+ }
346
+ }
347
+
348
+ function performDrop() {
349
+ if (draggedIndex === null) return;
350
+ const from = draggedIndex;
351
+
352
+ // Cross-list drop
353
+ if (crossListTarget !== null && crossListIndex !== null && groupCtx && listId) {
354
+ const toListId = crossListTarget;
355
+ const toIdx = crossListIndex;
356
+ if (
357
+ !previewEl ||
358
+ !rootElement ||
359
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches
360
+ ) {
361
+ resetState();
362
+ groupCtx.move(listId, from, toListId, toIdx);
363
+ announce('Item moved to another list');
364
+ return;
365
+ }
366
+ animateCrossListDrop(from, toListId, toIdx);
367
+ return;
368
+ }
369
+
370
+ // Same-list reorder
371
+ if (overIndex !== null) {
372
+ const to = overIndex;
373
+ if (
374
+ to === from ||
375
+ to === from + 1 ||
376
+ !previewEl ||
377
+ !rootElement ||
378
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches
379
+ ) {
380
+ resetState();
381
+ applyReorder(from, to);
382
+ return;
383
+ }
384
+ animateDrop(from, to);
385
+ return;
386
+ }
387
+
388
+ resetState();
389
+ }
390
+
391
+ function applyReorder(from: number, to: number) {
392
+ if (to === from || to === from + 1) return;
393
+ const newItems = [...items];
394
+ const removed = newItems.splice(from, 1);
395
+ if (removed.length === 0) return;
396
+ const insertAt = to > from ? to - 1 : to;
397
+ newItems.splice(insertAt, 0, removed[0]!);
398
+ flushSync(() => onReorder(newItems));
399
+ }
400
+
401
+ function animateDrop(from: number, to: number) {
402
+ if (!previewEl || !rootElement) return;
403
+
404
+ const isEnd = to >= items.length;
405
+ const anchorIdx = isEnd ? items.length - 1 : to;
406
+ const placeholderEl = rootElement.querySelector<HTMLElement>(
407
+ `[data-dnd-item][data-index="${from}"]`
408
+ );
409
+ const anchorEl = rootElement.querySelector<HTMLElement>(
410
+ `[data-dnd-item][data-index="${anchorIdx}"]`
411
+ );
412
+ if (!anchorEl) {
413
+ resetState();
414
+ applyReorder(from, to);
415
+ return;
416
+ }
417
+
418
+ isAnimating = true;
419
+ overIndex = null;
420
+ const itemHeight = previewEl.offsetHeight;
421
+
422
+ // Capture positions before layout change
423
+ const firstRects = new Map<HTMLElement, DOMRect>();
424
+ rootElement.querySelectorAll<HTMLElement>('[data-dnd-item]').forEach((el) => {
425
+ firstRects.set(el, el.getBoundingClientRect());
426
+ });
427
+
428
+ // Remove placeholder from grid entirely (display:none removes its
429
+ // track AND gaps — collapsing to height:0 leaves orphan grid gaps).
430
+ if (placeholderEl) placeholderEl.style.display = 'none';
431
+
432
+ // Insert full-height spacer at target so the opening is immediate
433
+ const spacer = document.createElement('div');
434
+ spacer.style.cssText = `overflow: hidden; height: ${itemHeight}px;`;
435
+ if (isEnd) {
436
+ anchorEl.after(spacer);
437
+ } else {
438
+ anchorEl.before(spacer);
439
+ }
440
+
441
+ // FLIP items from old to new positions + fly preview — all in one pass
442
+ const animations: Animation[] = [];
443
+
444
+ rootElement.querySelectorAll<HTMLElement>('[data-dnd-item]').forEach((el) => {
445
+ if (el === placeholderEl) return;
446
+ const first = firstRects.get(el);
447
+ if (!first) return;
448
+ const last = el.getBoundingClientRect();
449
+ const dx = first.left - last.left;
450
+ const dy = first.top - last.top;
451
+ if (Math.abs(dx) < 1 && Math.abs(dy) < 1) return;
452
+
453
+ animations.push(
454
+ el.animate(
455
+ [{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0, 0)' }],
456
+ { duration: FLIP_DURATION, easing: FLIP_EASING }
457
+ )
458
+ );
459
+ });
460
+
461
+ // Fly preview into the opening
462
+ const spacerRect = spacer.getBoundingClientRect();
463
+ const baseLeft = parseFloat(previewEl.style.left);
464
+ const baseTop = parseFloat(previewEl.style.top);
465
+ const currentDx = pointerX - startX;
466
+ const currentDy = pointerY - startY;
467
+ const finalDx = spacerRect.left - baseLeft;
468
+ const finalDy = spacerRect.top - baseTop;
469
+
470
+ animations.push(
471
+ previewEl.animate(
472
+ [
473
+ {
474
+ transform: `translate3d(${currentDx}px, ${currentDy}px, 0) rotate(3deg) scale(1.04)`,
475
+ boxShadow: '0 24px 48px -12px rgba(0,0,0,0.18), 0 12px 24px -8px rgba(0,0,0,0.1)'
476
+ },
477
+ {
478
+ transform: `translate3d(${finalDx}px, ${finalDy}px, 0) rotate(0deg) scale(1)`,
479
+ boxShadow: '0 1px 3px rgba(0,0,0,0.1)'
480
+ }
481
+ ],
482
+ { duration: FLIP_DURATION, easing: FLIP_EASING, fill: 'forwards' }
483
+ )
484
+ );
485
+
486
+ Promise.all(animations.map((a) => a.finished))
487
+ .then(() => {
488
+ if (placeholderEl) placeholderEl.style.removeProperty('display');
489
+ spacer.remove();
490
+ isAnimating = false;
491
+ resetState();
492
+ applyReorder(from, to);
493
+ })
494
+ .catch(() => {
495
+ if (placeholderEl) placeholderEl.style.removeProperty('display');
496
+ spacer.remove();
497
+ isAnimating = false;
498
+ resetState();
499
+ });
500
+ }
501
+
502
+ function animateCrossListDrop(from: number, toListId: string, toIdx: number) {
503
+ if (!previewEl || !rootElement || !groupCtx || !listId) return;
504
+
505
+ const siblingRoot = groupCtx.getRoots().get(toListId);
506
+ if (!siblingRoot) {
507
+ resetState();
508
+ groupCtx.move(listId, from, toListId, toIdx);
509
+ return;
510
+ }
511
+
512
+ isAnimating = true;
513
+ overIndex = null;
514
+ clearCrossListTarget();
515
+ const itemHeight = previewEl.offsetHeight;
516
+
517
+ // Capture positions in both source and target lists
518
+ const firstRects = new Map<HTMLElement, DOMRect>();
519
+ for (const el of rootElement.querySelectorAll<HTMLElement>('[data-dnd-item]')) {
520
+ firstRects.set(el, el.getBoundingClientRect());
521
+ }
522
+ for (const el of siblingRoot.querySelectorAll<HTMLElement>('[data-dnd-item]')) {
523
+ firstRects.set(el, el.getBoundingClientRect());
524
+ }
525
+
526
+ // Remove placeholder from source grid
527
+ const placeholderEl = rootElement.querySelector<HTMLElement>(
528
+ `[data-dnd-item][data-index="${from}"]`
529
+ );
530
+ if (placeholderEl) placeholderEl.style.display = 'none';
531
+
532
+ // Insert spacer at full track height but visually collapsed via scaleY.
533
+ // Full height keeps the grid track correct (no double-gap from a 0-height
534
+ // track); scaleY gives the "grow into position" effect.
535
+ const spacer = document.createElement('div');
536
+ spacer.style.cssText = `overflow: hidden; height: ${itemHeight}px; transform: scaleY(0); transform-origin: top;`;
537
+ const siblingItems = siblingRoot.querySelectorAll<HTMLElement>('[data-dnd-item]');
538
+ if (toIdx >= siblingItems.length) {
539
+ if (siblingItems.length > 0) {
540
+ siblingItems[siblingItems.length - 1]!.after(spacer);
541
+ } else {
542
+ siblingRoot.prepend(spacer);
543
+ }
544
+ } else {
545
+ siblingItems[toIdx]!.before(spacer);
546
+ }
547
+
548
+ // FLIP items in both lists + grow spacer + fly preview
549
+ const animations: Animation[] = [];
550
+
551
+ for (const root of [rootElement, siblingRoot]) {
552
+ for (const el of root.querySelectorAll<HTMLElement>('[data-dnd-item]')) {
553
+ if (el === placeholderEl) continue;
554
+ const first = firstRects.get(el);
555
+ if (!first) continue;
556
+ const last = el.getBoundingClientRect();
557
+ const dx = first.left - last.left;
558
+ const dy = first.top - last.top;
559
+ if (Math.abs(dx) < 1 && Math.abs(dy) < 1) continue;
560
+
561
+ animations.push(
562
+ el.animate(
563
+ [{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0, 0)' }],
564
+ { duration: FLIP_DURATION, easing: FLIP_EASING }
565
+ )
566
+ );
567
+ }
568
+ }
569
+
570
+ // Grow spacer visually
571
+ animations.push(
572
+ spacer.animate([{ transform: 'scaleY(0)' }, { transform: 'scaleY(1)' }], {
573
+ duration: FLIP_DURATION,
574
+ easing: FLIP_EASING,
575
+ fill: 'forwards'
576
+ })
577
+ );
578
+
579
+ const spacerRect = spacer.getBoundingClientRect();
580
+ const baseLeft = parseFloat(previewEl.style.left);
581
+ const baseTop = parseFloat(previewEl.style.top);
582
+ const currentDx = pointerX - startX;
583
+ const currentDy = pointerY - startY;
584
+ const finalDx = spacerRect.left - baseLeft;
585
+ const finalDy = spacerRect.top - baseTop;
586
+
587
+ animations.push(
588
+ previewEl.animate(
589
+ [
590
+ {
591
+ transform: `translate3d(${currentDx}px, ${currentDy}px, 0) rotate(3deg) scale(1.04)`,
592
+ boxShadow: '0 24px 48px -12px rgba(0,0,0,0.18), 0 12px 24px -8px rgba(0,0,0,0.1)'
593
+ },
594
+ {
595
+ transform: `translate3d(${finalDx}px, ${finalDy}px, 0) rotate(0deg) scale(1)`,
596
+ boxShadow: '0 1px 3px rgba(0,0,0,0.1)'
597
+ }
598
+ ],
599
+ { duration: FLIP_DURATION, easing: FLIP_EASING, fill: 'forwards' }
600
+ )
601
+ );
602
+
603
+ Promise.all(animations.map((a) => a.finished))
604
+ .then(() => {
605
+ if (placeholderEl) placeholderEl.style.removeProperty('display');
606
+ spacer.remove();
607
+ isAnimating = false;
608
+ resetState();
609
+ flushSync(() => groupCtx!.move(listId!, from, toListId, toIdx));
610
+ announce('Item moved to another list');
611
+ })
612
+ .catch(() => {
613
+ if (placeholderEl) placeholderEl.style.removeProperty('display');
614
+ spacer.remove();
615
+ isAnimating = false;
616
+ resetState();
617
+ });
63
618
  }
64
619
 
65
620
  function handlePointerUp() {
66
- if (isDragging && draggedIndex !== null && overIndex !== null) {
67
- reorder(draggedIndex, overIndex);
68
- announce(`Item moved to position ${overIndex + 1}`);
621
+ if (isPending) {
622
+ resetState();
623
+ return;
624
+ }
625
+ if (isDragging) {
626
+ performDrop();
627
+ } else {
628
+ resetState();
629
+ }
630
+ }
631
+
632
+ function handlePointerCancel() {
633
+ if (isDragging || isPending) {
634
+ announce('Reorder cancelled');
69
635
  }
70
636
  resetState();
71
637
  }
72
638
 
73
639
  function resetState() {
640
+ removePreview();
641
+ clearCrossListTarget();
74
642
  draggedIndex = null;
75
643
  overIndex = null;
76
644
  isDragging = false;
645
+ isPending = false;
77
646
  }
78
647
 
79
648
  function handleKeydown(e: KeyboardEvent) {
80
- if (e.key === 'Escape' && isDragging) {
649
+ if (e.key === 'Escape' && isDragging && !isAnimating) {
81
650
  e.preventDefault();
82
651
  announce('Reorder cancelled');
83
652
  resetState();
@@ -100,17 +669,24 @@
100
669
  get hasHandle() {
101
670
  return hasHandle;
102
671
  },
672
+ get foreignOverIndex() {
673
+ return foreignOverIndex;
674
+ },
103
675
  registerHandle() {
104
676
  hasHandle = true;
105
677
  },
106
678
  startDrag(index: number, event: PointerEvent) {
679
+ if (event.button !== 0) return;
107
680
  draggedIndex = index;
108
681
  overIndex = index;
109
- isDragging = true;
682
+ isPending = true;
683
+ startX = event.clientX;
684
+ startY = event.clientY;
685
+ pointerX = event.clientX;
686
+ pointerY = event.clientY;
110
687
 
111
688
  const target = event.currentTarget as HTMLElement;
112
689
  target.setPointerCapture(event.pointerId);
113
- announce(`Grabbed item at position ${index + 1}. Use arrow keys to move.`);
114
690
  },
115
691
  handleDragOver(index: number) {
116
692
  if (isDragging) {
@@ -118,22 +694,24 @@
118
694
  }
119
695
  },
120
696
  endDrag() {
121
- if (isDragging && draggedIndex !== null && overIndex !== null) {
122
- reorder(draggedIndex, overIndex);
123
- announce(`Item moved to position ${overIndex + 1}`);
697
+ if (isDragging) {
698
+ performDrop();
699
+ } else {
700
+ resetState();
124
701
  }
125
- resetState();
126
702
  },
127
703
  cancelDrag() {
128
704
  announce('Reorder cancelled');
129
705
  resetState();
130
706
  },
131
707
  moveItem(fromIndex: number, direction: 'up' | 'down') {
132
- const toIndex =
133
- direction === 'up' ? Math.max(0, fromIndex - 1) : Math.min(items.length - 1, fromIndex + 1);
134
- if (fromIndex !== toIndex) {
135
- reorder(fromIndex, toIndex);
136
- announce(`Item moved to position ${toIndex + 1} of ${items.length}`);
708
+ // Gap-based: up = gap before previous item, down = gap after next item
709
+ const toGap =
710
+ direction === 'up' ? Math.max(0, fromIndex - 1) : Math.min(items.length, fromIndex + 2);
711
+ if (toGap !== fromIndex && toGap !== fromIndex + 1) {
712
+ reorder(fromIndex, toGap);
713
+ const insertAt = toGap > fromIndex ? toGap - 1 : toGap;
714
+ announce(`Item moved to position ${insertAt + 1} of ${items.length}`);
137
715
  }
138
716
  },
139
717
  announce(message: string) {
@@ -143,7 +721,6 @@
143
721
 
144
722
  function announce(message: string) {
145
723
  liveRegionMessage = '';
146
- // Force re-announcement by clearing then setting
147
724
  requestAnimationFrame(() => {
148
725
  liveRegionMessage = message;
149
726
  });
@@ -156,8 +733,13 @@
156
733
  data-dnd-root
157
734
  data-orientation={orientation}
158
735
  data-dragging={isDragging ? '' : undefined}
736
+ data-over-end={(isDragging && overIndex !== null && overIndex >= items.length) ||
737
+ (foreignOverIndex !== null && foreignOverIndex >= items.length)
738
+ ? ''
739
+ : undefined}
159
740
  onpointermove={handlePointerMove}
160
741
  onpointerup={handlePointerUp}
742
+ onpointercancel={handlePointerCancel}
161
743
  onkeydown={handleKeydown}
162
744
  {...rest}
163
745
  class={className}
@@ -181,6 +763,7 @@
181
763
  [data-dnd-root] {
182
764
  position: relative;
183
765
  display: grid;
766
+ align-content: start;
184
767
  gap: var(--dry-dnd-gap, var(--dry-space-2));
185
768
  }
186
769
 
@@ -196,4 +779,11 @@
196
779
  [data-dnd-root][data-dragging] {
197
780
  cursor: grabbing;
198
781
  }
782
+
783
+ [data-dnd-root][data-over-end]::after {
784
+ content: '';
785
+ height: var(--dry-dnd-indicator-size, 2px);
786
+ background: var(--dry-dnd-indicator-color, var(--dry-color-fill-brand));
787
+ border-radius: var(--dry-dnd-indicator-size, 2px);
788
+ }
199
789
  </style>