@dryui/ui 0.2.1 → 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 (588) hide show
  1. package/dist/accordion/accordion-trigger.svelte +9 -1
  2. package/dist/accordion/index.d.ts +24 -10
  3. package/dist/adjust/adjust.svelte +1 -1
  4. package/dist/adjust/index.d.ts +10 -10
  5. package/dist/alert/index.d.ts +7 -13
  6. package/dist/alert-dialog/index.d.ts +10 -20
  7. package/dist/alpha-slider/index.d.ts +6 -6
  8. package/dist/aspect-ratio/index.d.ts +2 -2
  9. package/dist/aurora/aurora.svelte +58 -11
  10. package/dist/aurora/aurora.svelte.d.ts +1 -0
  11. package/dist/aurora/index.d.ts +10 -8
  12. package/dist/avatar/index.d.ts +11 -4
  13. package/dist/badge/index.d.ts +3 -3
  14. package/dist/beam/index.d.ts +7 -7
  15. package/dist/breadcrumb/index.d.ts +24 -12
  16. package/dist/button/button.svelte +5 -1
  17. package/dist/button/index.d.ts +3 -3
  18. package/dist/button-group/index.d.ts +1 -1
  19. package/dist/calendar/index.d.ts +7 -14
  20. package/dist/card/index.d.ts +15 -15
  21. package/dist/carousel/index.d.ts +8 -16
  22. package/dist/chart/index.d.ts +49 -44
  23. package/dist/chat-thread/index.d.ts +9 -11
  24. package/dist/checkbox/checkbox.svelte +1 -5
  25. package/dist/checkbox/index.d.ts +1 -1
  26. package/dist/chip/index.d.ts +13 -18
  27. package/dist/chip-group/index.d.ts +3 -3
  28. package/dist/chromatic-aberration/index.d.ts +3 -3
  29. package/dist/chromatic-shift/index.d.ts +2 -1
  30. package/dist/code-block/highlighter/types.d.ts +3 -3
  31. package/dist/code-block/index.d.ts +3 -3
  32. package/dist/collapsible/collapsible-trigger.svelte +9 -1
  33. package/dist/collapsible/index.d.ts +16 -8
  34. package/dist/color-picker/color-picker-eyedropper.svelte +13 -1
  35. package/dist/color-picker/index.d.ts +11 -19
  36. package/dist/combobox/index.d.ts +10 -15
  37. package/dist/command-palette/index.d.ts +8 -16
  38. package/dist/container/index.d.ts +3 -3
  39. package/dist/context-menu/index.d.ts +8 -16
  40. package/dist/data-grid/index.d.ts +22 -29
  41. package/dist/date-field/date-field-separator.svelte +1 -7
  42. package/dist/date-field/index.d.ts +4 -4
  43. package/dist/date-picker/datepicker-trigger.svelte +15 -1
  44. package/dist/date-picker/index.d.ts +6 -10
  45. package/dist/date-range-picker/date-range-picker-trigger.svelte +12 -1
  46. package/dist/date-range-picker/index.d.ts +6 -12
  47. package/dist/date-time-input/index.d.ts +1 -1
  48. package/dist/description-list/index.d.ts +8 -8
  49. package/dist/diagram/diagram.svelte +769 -0
  50. package/dist/diagram/diagram.svelte.d.ts +10 -0
  51. package/dist/diagram/edge-routing.d.ts +9 -0
  52. package/dist/diagram/edge-routing.js +281 -0
  53. package/dist/diagram/index.d.ts +9 -0
  54. package/dist/diagram/index.js +1 -0
  55. package/dist/diagram/layout.d.ts +2 -0
  56. package/dist/diagram/layout.js +985 -0
  57. package/dist/diagram/types.d.ts +196 -0
  58. package/dist/dialog/index.d.ts +9 -18
  59. package/dist/displacement/displacement.svelte +39 -3
  60. package/dist/displacement/index.d.ts +2 -1
  61. package/dist/drag-and-drop/context.svelte.d.ts +1 -0
  62. package/dist/drag-and-drop/drag-and-drop-group.svelte +37 -0
  63. package/dist/drag-and-drop/drag-and-drop-group.svelte.d.ts +8 -0
  64. package/dist/drag-and-drop/drag-and-drop-handle.svelte +2 -0
  65. package/dist/drag-and-drop/drag-and-drop-item.svelte +25 -6
  66. package/dist/drag-and-drop/drag-and-drop-root.svelte +624 -34
  67. package/dist/drag-and-drop/group-context.svelte.d.ts +13 -0
  68. package/dist/drag-and-drop/group-context.svelte.js +8 -0
  69. package/dist/drag-and-drop/index.d.ts +6 -8
  70. package/dist/drag-and-drop/index.js +3 -1
  71. package/dist/drawer/drawer-content.svelte +2 -1
  72. package/dist/drawer/drawer-footer.svelte +1 -1
  73. package/dist/drawer/index.d.ts +10 -18
  74. package/dist/drop-zone/index.d.ts +2 -2
  75. package/dist/dropdown-menu/index.d.ts +8 -16
  76. package/dist/field/index.d.ts +3 -3
  77. package/dist/fieldset/index.d.ts +8 -8
  78. package/dist/file-select/file-select-clear.svelte +8 -1
  79. package/dist/file-select/index.d.ts +8 -10
  80. package/dist/file-upload/file-upload-item-delete.svelte +8 -1
  81. package/dist/file-upload/file-upload-root.svelte +0 -1
  82. package/dist/file-upload/index.d.ts +14 -19
  83. package/dist/flip-card/index.d.ts +3 -3
  84. package/dist/float-button/float-button-root.svelte +7 -1
  85. package/dist/float-button/index.d.ts +6 -10
  86. package/dist/glass/index.d.ts +4 -4
  87. package/dist/glow/index.d.ts +5 -5
  88. package/dist/god-rays/index.d.ts +10 -10
  89. package/dist/gradient-mesh/gradient-mesh.svelte +42 -5
  90. package/dist/gradient-mesh/index.d.ts +2 -1
  91. package/dist/halftone/halftone.svelte +16 -36
  92. package/dist/halftone/index.d.ts +5 -5
  93. package/dist/heading/index.d.ts +3 -3
  94. package/dist/hover-card/index.d.ts +4 -8
  95. package/dist/icon/index.d.ts +5 -5
  96. package/dist/index.d.ts +65 -590
  97. package/dist/index.js +1 -2
  98. package/dist/input/index.d.ts +2 -2
  99. package/dist/input-group/index.d.ts +11 -17
  100. package/dist/input-group/input-group-root.svelte +0 -1
  101. package/dist/internal/color-aliases.d.ts +5 -8
  102. package/dist/kbd/index.d.ts +6 -1
  103. package/dist/label/index.d.ts +1 -1
  104. package/dist/link/index.d.ts +1 -1
  105. package/dist/link-preview/index.d.ts +4 -8
  106. package/dist/list/index.d.ts +6 -12
  107. package/dist/list/list-root.svelte +0 -1
  108. package/dist/listbox/index.d.ts +2 -2
  109. package/dist/logo-mark/logo-mark.svelte +2 -2
  110. package/dist/logo-mark/logo-mark.svelte.d.ts +7 -7
  111. package/dist/map/index.d.ts +31 -43
  112. package/dist/mask-reveal/index.d.ts +2 -1
  113. package/dist/mega-menu/index.d.ts +7 -14
  114. package/dist/menubar/index.d.ts +8 -16
  115. package/dist/multi-select-combobox/index.d.ts +10 -20
  116. package/dist/multi-select-combobox/multi-select-combobox-input.svelte +0 -1
  117. package/dist/navigation-menu/index.d.ts +27 -14
  118. package/dist/navigation-menu/navigation-menu-list.svelte +0 -1
  119. package/dist/noise/index.d.ts +5 -5
  120. package/dist/noise/noise.svelte +2 -2
  121. package/dist/notification-center/index.d.ts +6 -13
  122. package/dist/notification-center/notification-center-panel.svelte +4 -1
  123. package/dist/notification-center/notification-center-trigger.svelte +0 -1
  124. package/dist/number-input/index.d.ts +1 -1
  125. package/dist/number-input/number-input.svelte +3 -1
  126. package/dist/option-swatch-group/index.d.ts +8 -8
  127. package/dist/pagination/index.d.ts +8 -16
  128. package/dist/phone-input/index.d.ts +1 -1
  129. package/dist/pin-input/index.d.ts +7 -13
  130. package/dist/popover/index.d.ts +3 -3
  131. package/dist/progress/index.d.ts +3 -7
  132. package/dist/progress-ring/index.d.ts +2 -2
  133. package/dist/radio-group/index.d.ts +2 -2
  134. package/dist/radio-group/radio-group.svelte +0 -1
  135. package/dist/range-calendar/index.d.ts +2 -2
  136. package/dist/range-calendar/range-calendar-grid.svelte +10 -4
  137. package/dist/range-calendar/range-calendar-root.svelte +1 -5
  138. package/dist/rating/index.d.ts +1 -1
  139. package/dist/reveal/index.d.ts +3 -1
  140. package/dist/rich-text-editor/index.d.ts +5 -4
  141. package/dist/rich-text-editor/rich-text-editor-content.svelte +9 -1
  142. package/dist/rich-text-editor/rich-text-editor-toolbar.svelte +1 -2
  143. package/dist/scroll-to-top/index.d.ts +2 -2
  144. package/dist/segmented-control/index.d.ts +2 -2
  145. package/dist/select/index.d.ts +6 -12
  146. package/dist/select/select-trigger.svelte +9 -1
  147. package/dist/separator/index.d.ts +3 -3
  148. package/dist/shader-canvas/index.d.ts +13 -18
  149. package/dist/shader-canvas/presets.d.ts +5 -10
  150. package/dist/shader-canvas/presets.js +1 -1
  151. package/dist/shader-canvas/shader-canvas.svelte +4 -2
  152. package/dist/sidebar/index.d.ts +37 -18
  153. package/dist/sidebar/sidebar-footer.svelte +5 -4
  154. package/dist/sidebar/sidebar-header.svelte +4 -1
  155. package/dist/sidebar/sidebar-root.svelte +1 -1
  156. package/dist/skeleton/index.d.ts +5 -5
  157. package/dist/slider/index.d.ts +1 -1
  158. package/dist/spacer/index.d.ts +2 -2
  159. package/dist/spinner/index.d.ts +5 -4
  160. package/dist/splitter/index.d.ts +3 -3
  161. package/dist/spotlight/index.d.ts +2 -1
  162. package/dist/spotlight/spotlight.svelte +42 -4
  163. package/dist/star-rating/index.d.ts +5 -5
  164. package/dist/stepper/index.d.ts +5 -10
  165. package/dist/svg/index.d.ts +2 -1
  166. package/dist/table/index.d.ts +9 -18
  167. package/dist/table-of-contents/index.d.ts +4 -9
  168. package/dist/tabs/index.d.ts +25 -8
  169. package/dist/tabs/tabs-trigger.svelte +4 -2
  170. package/dist/tag/index.d.ts +3 -3
  171. package/dist/tags-input/index.d.ts +7 -12
  172. package/dist/text/index.d.ts +7 -7
  173. package/dist/textarea/index.d.ts +1 -1
  174. package/dist/themes/aurora.css +229 -0
  175. package/dist/themes/dark.css +134 -0
  176. package/dist/themes/default.css +80 -1
  177. package/dist/themes/midnight.css +142 -0
  178. package/dist/themes/terminal.css +175 -0
  179. package/dist/themes/use-theme-override.svelte.d.ts +1 -17
  180. package/dist/time-input/index.d.ts +6 -6
  181. package/dist/time-input/time-input.svelte +1 -3
  182. package/dist/timeline/index.d.ts +9 -16
  183. package/dist/timeline/timeline-item.svelte +2 -1
  184. package/dist/toast/index.d.ts +7 -15
  185. package/dist/toggle/index.d.ts +2 -2
  186. package/dist/toggle-group/index.d.ts +3 -3
  187. package/dist/toolbar/index.d.ts +5 -10
  188. package/dist/tooltip/index.d.ts +3 -3
  189. package/dist/tour/index.d.ts +2 -2
  190. package/dist/tour/tour-root.svelte +4 -1
  191. package/dist/transfer/index.d.ts +9 -16
  192. package/dist/tree/index.d.ts +5 -10
  193. package/dist/typing-indicator/index.d.ts +2 -1
  194. package/dist/typography/index.d.ts +9 -12
  195. package/dist/visually-hidden/index.d.ts +5 -1
  196. package/package.json +22 -27
  197. package/skills/dryui/SKILL.md +29 -16
  198. package/skills/dryui/rules/composition.md +262 -225
  199. package/dist/system-map/index.d.ts +0 -45
  200. package/dist/system-map/index.js +0 -1
  201. package/dist/system-map/system-map.svelte +0 -311
  202. package/dist/system-map/system-map.svelte.d.ts +0 -25
  203. package/dist/system-map/types.d.ts +0 -116
  204. package/dist/thumbnail/_layout-content.svelte +0 -89
  205. package/dist/thumbnail/_layout-content.svelte.d.ts +0 -9
  206. package/dist/thumbnail/_layout-footer.svelte +0 -54
  207. package/dist/thumbnail/_layout-footer.svelte.d.ts +0 -9
  208. package/dist/thumbnail/_layout-header.svelte +0 -76
  209. package/dist/thumbnail/_layout-header.svelte.d.ts +0 -9
  210. package/dist/thumbnail/_layout-sidebar.svelte +0 -75
  211. package/dist/thumbnail/_layout-sidebar.svelte.d.ts +0 -9
  212. package/dist/thumbnail/accordion.svelte +0 -144
  213. package/dist/thumbnail/accordion.svelte.d.ts +0 -7
  214. package/dist/thumbnail/add-on-selector.svelte +0 -213
  215. package/dist/thumbnail/add-on-selector.svelte.d.ts +0 -7
  216. package/dist/thumbnail/affix-group.svelte +0 -55
  217. package/dist/thumbnail/affix-group.svelte.d.ts +0 -7
  218. package/dist/thumbnail/alert-dialog.svelte +0 -100
  219. package/dist/thumbnail/alert-dialog.svelte.d.ts +0 -7
  220. package/dist/thumbnail/alert.svelte +0 -79
  221. package/dist/thumbnail/alert.svelte.d.ts +0 -7
  222. package/dist/thumbnail/alpha-slider.svelte +0 -55
  223. package/dist/thumbnail/alpha-slider.svelte.d.ts +0 -7
  224. package/dist/thumbnail/amenity-grid.svelte +0 -236
  225. package/dist/thumbnail/amenity-grid.svelte.d.ts +0 -7
  226. package/dist/thumbnail/app-frame.svelte.d.ts +0 -7
  227. package/dist/thumbnail/apply-size.d.ts +0 -3
  228. package/dist/thumbnail/apply-size.js +0 -14
  229. package/dist/thumbnail/aspect-ratio.svelte +0 -64
  230. package/dist/thumbnail/aspect-ratio.svelte.d.ts +0 -7
  231. package/dist/thumbnail/aurora.svelte +0 -88
  232. package/dist/thumbnail/aurora.svelte.d.ts +0 -7
  233. package/dist/thumbnail/avatar-group.svelte.d.ts +0 -7
  234. package/dist/thumbnail/avatar.svelte +0 -60
  235. package/dist/thumbnail/avatar.svelte.d.ts +0 -7
  236. package/dist/thumbnail/backdrop.svelte +0 -73
  237. package/dist/thumbnail/backdrop.svelte.d.ts +0 -7
  238. package/dist/thumbnail/badge.svelte +0 -100
  239. package/dist/thumbnail/badge.svelte.d.ts +0 -7
  240. package/dist/thumbnail/booking-confirmation.svelte +0 -109
  241. package/dist/thumbnail/booking-confirmation.svelte.d.ts +0 -7
  242. package/dist/thumbnail/breadcrumb.svelte +0 -80
  243. package/dist/thumbnail/breadcrumb.svelte.d.ts +0 -7
  244. package/dist/thumbnail/button-group.svelte +0 -76
  245. package/dist/thumbnail/button-group.svelte.d.ts +0 -7
  246. package/dist/thumbnail/button.svelte +0 -62
  247. package/dist/thumbnail/button.svelte.d.ts +0 -7
  248. package/dist/thumbnail/calendar.svelte +0 -86
  249. package/dist/thumbnail/calendar.svelte.d.ts +0 -7
  250. package/dist/thumbnail/card.svelte +0 -113
  251. package/dist/thumbnail/card.svelte.d.ts +0 -7
  252. package/dist/thumbnail/carousel.svelte +0 -111
  253. package/dist/thumbnail/carousel.svelte.d.ts +0 -7
  254. package/dist/thumbnail/chart.svelte +0 -93
  255. package/dist/thumbnail/chart.svelte.d.ts +0 -7
  256. package/dist/thumbnail/chat-message.svelte.d.ts +0 -7
  257. package/dist/thumbnail/chat-thread.svelte +0 -140
  258. package/dist/thumbnail/chat-thread.svelte.d.ts +0 -7
  259. package/dist/thumbnail/checkbox.svelte +0 -71
  260. package/dist/thumbnail/checkbox.svelte.d.ts +0 -7
  261. package/dist/thumbnail/chip-group.svelte +0 -79
  262. package/dist/thumbnail/chip-group.svelte.d.ts +0 -7
  263. package/dist/thumbnail/chip.svelte +0 -76
  264. package/dist/thumbnail/chip.svelte.d.ts +0 -7
  265. package/dist/thumbnail/chromatic-shift.svelte +0 -55
  266. package/dist/thumbnail/chromatic-shift.svelte.d.ts +0 -7
  267. package/dist/thumbnail/clipboard.svelte +0 -68
  268. package/dist/thumbnail/clipboard.svelte.d.ts +0 -7
  269. package/dist/thumbnail/code-block.svelte +0 -125
  270. package/dist/thumbnail/code-block.svelte.d.ts +0 -7
  271. package/dist/thumbnail/collapsible.svelte +0 -101
  272. package/dist/thumbnail/collapsible.svelte.d.ts +0 -7
  273. package/dist/thumbnail/color-picker.svelte +0 -108
  274. package/dist/thumbnail/color-picker.svelte.d.ts +0 -7
  275. package/dist/thumbnail/combobox.svelte +0 -122
  276. package/dist/thumbnail/combobox.svelte.d.ts +0 -7
  277. package/dist/thumbnail/command-palette.svelte +0 -134
  278. package/dist/thumbnail/command-palette.svelte.d.ts +0 -7
  279. package/dist/thumbnail/commerce-header.svelte +0 -55
  280. package/dist/thumbnail/commerce-header.svelte.d.ts +0 -7
  281. package/dist/thumbnail/comparison-table.svelte +0 -193
  282. package/dist/thumbnail/comparison-table.svelte.d.ts +0 -7
  283. package/dist/thumbnail/container.svelte +0 -119
  284. package/dist/thumbnail/container.svelte.d.ts +0 -7
  285. package/dist/thumbnail/context-menu.svelte +0 -108
  286. package/dist/thumbnail/context-menu.svelte.d.ts +0 -7
  287. package/dist/thumbnail/country-select.svelte +0 -111
  288. package/dist/thumbnail/country-select.svelte.d.ts +0 -7
  289. package/dist/thumbnail/currency-selector.svelte +0 -111
  290. package/dist/thumbnail/currency-selector.svelte.d.ts +0 -7
  291. package/dist/thumbnail/data-grid.svelte +0 -230
  292. package/dist/thumbnail/data-grid.svelte.d.ts +0 -7
  293. package/dist/thumbnail/date-field.svelte +0 -132
  294. package/dist/thumbnail/date-field.svelte.d.ts +0 -7
  295. package/dist/thumbnail/date-picker.svelte +0 -126
  296. package/dist/thumbnail/date-picker.svelte.d.ts +0 -7
  297. package/dist/thumbnail/date-range-picker.svelte +0 -100
  298. package/dist/thumbnail/date-range-picker.svelte.d.ts +0 -7
  299. package/dist/thumbnail/date-time-input.svelte +0 -182
  300. package/dist/thumbnail/date-time-input.svelte.d.ts +0 -7
  301. package/dist/thumbnail/description-list.svelte +0 -142
  302. package/dist/thumbnail/description-list.svelte.d.ts +0 -7
  303. package/dist/thumbnail/dialog.svelte +0 -136
  304. package/dist/thumbnail/dialog.svelte.d.ts +0 -7
  305. package/dist/thumbnail/displacement.svelte +0 -55
  306. package/dist/thumbnail/displacement.svelte.d.ts +0 -7
  307. package/dist/thumbnail/drag-and-drop.svelte +0 -139
  308. package/dist/thumbnail/drag-and-drop.svelte.d.ts +0 -7
  309. package/dist/thumbnail/drawer.svelte +0 -112
  310. package/dist/thumbnail/drawer.svelte.d.ts +0 -7
  311. package/dist/thumbnail/drop-zone.svelte +0 -55
  312. package/dist/thumbnail/drop-zone.svelte.d.ts +0 -7
  313. package/dist/thumbnail/dropdown-menu.svelte +0 -128
  314. package/dist/thumbnail/dropdown-menu.svelte.d.ts +0 -7
  315. package/dist/thumbnail/empty-state.svelte.d.ts +0 -7
  316. package/dist/thumbnail/fare-class-picker.svelte +0 -225
  317. package/dist/thumbnail/fare-class-picker.svelte.d.ts +0 -7
  318. package/dist/thumbnail/feature-split-section.svelte.d.ts +0 -7
  319. package/dist/thumbnail/field.svelte +0 -82
  320. package/dist/thumbnail/field.svelte.d.ts +0 -7
  321. package/dist/thumbnail/fieldset.svelte +0 -123
  322. package/dist/thumbnail/fieldset.svelte.d.ts +0 -7
  323. package/dist/thumbnail/file-select.svelte +0 -90
  324. package/dist/thumbnail/file-select.svelte.d.ts +0 -7
  325. package/dist/thumbnail/file-upload.svelte +0 -84
  326. package/dist/thumbnail/file-upload.svelte.d.ts +0 -7
  327. package/dist/thumbnail/filter-sidebar.svelte +0 -201
  328. package/dist/thumbnail/filter-sidebar.svelte.d.ts +0 -7
  329. package/dist/thumbnail/flexible-dates-grid.svelte +0 -210
  330. package/dist/thumbnail/flexible-dates-grid.svelte.d.ts +0 -7
  331. package/dist/thumbnail/flight-timeline.svelte +0 -155
  332. package/dist/thumbnail/flight-timeline.svelte.d.ts +0 -7
  333. package/dist/thumbnail/flip-card.svelte +0 -128
  334. package/dist/thumbnail/flip-card.svelte.d.ts +0 -7
  335. package/dist/thumbnail/float-button.svelte +0 -63
  336. package/dist/thumbnail/float-button.svelte.d.ts +0 -7
  337. package/dist/thumbnail/focus-trap.svelte +0 -110
  338. package/dist/thumbnail/focus-trap.svelte.d.ts +0 -7
  339. package/dist/thumbnail/format-bytes.svelte +0 -51
  340. package/dist/thumbnail/format-bytes.svelte.d.ts +0 -7
  341. package/dist/thumbnail/format-date.svelte +0 -51
  342. package/dist/thumbnail/format-date.svelte.d.ts +0 -7
  343. package/dist/thumbnail/format-number.svelte +0 -51
  344. package/dist/thumbnail/format-number.svelte.d.ts +0 -7
  345. package/dist/thumbnail/gauge.svelte +0 -90
  346. package/dist/thumbnail/gauge.svelte.d.ts +0 -7
  347. package/dist/thumbnail/glass-surface.svelte.d.ts +0 -7
  348. package/dist/thumbnail/glow.svelte +0 -55
  349. package/dist/thumbnail/glow.svelte.d.ts +0 -7
  350. package/dist/thumbnail/gradient-mesh.svelte +0 -55
  351. package/dist/thumbnail/gradient-mesh.svelte.d.ts +0 -7
  352. package/dist/thumbnail/guest-room-selector.svelte +0 -214
  353. package/dist/thumbnail/guest-room-selector.svelte.d.ts +0 -7
  354. package/dist/thumbnail/halftone.svelte +0 -55
  355. package/dist/thumbnail/halftone.svelte.d.ts +0 -7
  356. package/dist/thumbnail/heading.svelte +0 -91
  357. package/dist/thumbnail/heading.svelte.d.ts +0 -7
  358. package/dist/thumbnail/hotel-gallery.svelte +0 -117
  359. package/dist/thumbnail/hotel-gallery.svelte.d.ts +0 -7
  360. package/dist/thumbnail/hotkey.svelte +0 -108
  361. package/dist/thumbnail/hotkey.svelte.d.ts +0 -7
  362. package/dist/thumbnail/hover-card.svelte +0 -117
  363. package/dist/thumbnail/hover-card.svelte.d.ts +0 -7
  364. package/dist/thumbnail/icon.svelte +0 -55
  365. package/dist/thumbnail/icon.svelte.d.ts +0 -7
  366. package/dist/thumbnail/image-comparison.svelte +0 -96
  367. package/dist/thumbnail/image-comparison.svelte.d.ts +0 -7
  368. package/dist/thumbnail/image.svelte +0 -74
  369. package/dist/thumbnail/image.svelte.d.ts +0 -7
  370. package/dist/thumbnail/index.d.ts +0 -12
  371. package/dist/thumbnail/index.js +0 -359
  372. package/dist/thumbnail/infinite-scroll.svelte +0 -129
  373. package/dist/thumbnail/infinite-scroll.svelte.d.ts +0 -7
  374. package/dist/thumbnail/input-group.svelte +0 -55
  375. package/dist/thumbnail/input-group.svelte.d.ts +0 -7
  376. package/dist/thumbnail/input.svelte +0 -74
  377. package/dist/thumbnail/input.svelte.d.ts +0 -7
  378. package/dist/thumbnail/itinerary-timeline.svelte +0 -143
  379. package/dist/thumbnail/itinerary-timeline.svelte.d.ts +0 -7
  380. package/dist/thumbnail/kbd.svelte +0 -112
  381. package/dist/thumbnail/kbd.svelte.d.ts +0 -7
  382. package/dist/thumbnail/label.svelte +0 -54
  383. package/dist/thumbnail/label.svelte.d.ts +0 -7
  384. package/dist/thumbnail/layout-header-content-footer.svelte +0 -64
  385. package/dist/thumbnail/layout-header-content-footer.svelte.d.ts +0 -7
  386. package/dist/thumbnail/layout-header-sidebar-main.svelte +0 -64
  387. package/dist/thumbnail/layout-header-sidebar-main.svelte.d.ts +0 -7
  388. package/dist/thumbnail/layout-sidebar-main.svelte +0 -57
  389. package/dist/thumbnail/layout-sidebar-main.svelte.d.ts +0 -7
  390. package/dist/thumbnail/link-preview.svelte +0 -141
  391. package/dist/thumbnail/link-preview.svelte.d.ts +0 -7
  392. package/dist/thumbnail/link.svelte +0 -70
  393. package/dist/thumbnail/link.svelte.d.ts +0 -7
  394. package/dist/thumbnail/list.svelte +0 -86
  395. package/dist/thumbnail/list.svelte.d.ts +0 -7
  396. package/dist/thumbnail/listbox.svelte +0 -102
  397. package/dist/thumbnail/listbox.svelte.d.ts +0 -7
  398. package/dist/thumbnail/location-autocomplete.svelte +0 -219
  399. package/dist/thumbnail/location-autocomplete.svelte.d.ts +0 -7
  400. package/dist/thumbnail/logo-cloud.svelte.d.ts +0 -7
  401. package/dist/thumbnail/loyalty-points-display.svelte +0 -147
  402. package/dist/thumbnail/loyalty-points-display.svelte.d.ts +0 -7
  403. package/dist/thumbnail/map-list-toggle.svelte +0 -140
  404. package/dist/thumbnail/map-list-toggle.svelte.d.ts +0 -7
  405. package/dist/thumbnail/map.svelte +0 -112
  406. package/dist/thumbnail/map.svelte.d.ts +0 -7
  407. package/dist/thumbnail/markdown-renderer.svelte +0 -113
  408. package/dist/thumbnail/markdown-renderer.svelte.d.ts +0 -7
  409. package/dist/thumbnail/marquee.svelte +0 -114
  410. package/dist/thumbnail/marquee.svelte.d.ts +0 -7
  411. package/dist/thumbnail/mask-reveal.svelte +0 -55
  412. package/dist/thumbnail/mask-reveal.svelte.d.ts +0 -7
  413. package/dist/thumbnail/mega-menu.svelte +0 -176
  414. package/dist/thumbnail/mega-menu.svelte.d.ts +0 -7
  415. package/dist/thumbnail/menubar.svelte +0 -99
  416. package/dist/thumbnail/menubar.svelte.d.ts +0 -7
  417. package/dist/thumbnail/multi-city-search-form.svelte +0 -241
  418. package/dist/thumbnail/multi-city-search-form.svelte.d.ts +0 -7
  419. package/dist/thumbnail/multi-select-combobox.svelte +0 -142
  420. package/dist/thumbnail/multi-select-combobox.svelte.d.ts +0 -7
  421. package/dist/thumbnail/navigation-menu.svelte +0 -102
  422. package/dist/thumbnail/navigation-menu.svelte.d.ts +0 -7
  423. package/dist/thumbnail/noise.svelte +0 -72
  424. package/dist/thumbnail/noise.svelte.d.ts +0 -7
  425. package/dist/thumbnail/notification-center.svelte +0 -152
  426. package/dist/thumbnail/notification-center.svelte.d.ts +0 -7
  427. package/dist/thumbnail/number-input.svelte +0 -113
  428. package/dist/thumbnail/number-input.svelte.d.ts +0 -7
  429. package/dist/thumbnail/option-swatch-group.svelte +0 -55
  430. package/dist/thumbnail/option-swatch-group.svelte.d.ts +0 -7
  431. package/dist/thumbnail/page-header.svelte.d.ts +0 -7
  432. package/dist/thumbnail/pagination.svelte +0 -121
  433. package/dist/thumbnail/pagination.svelte.d.ts +0 -7
  434. package/dist/thumbnail/passenger-class-selector.svelte +0 -142
  435. package/dist/thumbnail/passenger-class-selector.svelte.d.ts +0 -7
  436. package/dist/thumbnail/payment-card-input.svelte +0 -172
  437. package/dist/thumbnail/payment-card-input.svelte.d.ts +0 -7
  438. package/dist/thumbnail/phone-input.svelte +0 -103
  439. package/dist/thumbnail/phone-input.svelte.d.ts +0 -7
  440. package/dist/thumbnail/pin-input.svelte +0 -72
  441. package/dist/thumbnail/pin-input.svelte.d.ts +0 -7
  442. package/dist/thumbnail/popover.svelte +0 -122
  443. package/dist/thumbnail/popover.svelte.d.ts +0 -7
  444. package/dist/thumbnail/portal.svelte +0 -115
  445. package/dist/thumbnail/portal.svelte.d.ts +0 -7
  446. package/dist/thumbnail/price-calendar.svelte +0 -366
  447. package/dist/thumbnail/price-calendar.svelte.d.ts +0 -7
  448. package/dist/thumbnail/price-summary-panel.svelte +0 -165
  449. package/dist/thumbnail/price-summary-panel.svelte.d.ts +0 -7
  450. package/dist/thumbnail/progress-ring.svelte +0 -63
  451. package/dist/thumbnail/progress-ring.svelte.d.ts +0 -7
  452. package/dist/thumbnail/progress.svelte +0 -66
  453. package/dist/thumbnail/progress.svelte.d.ts +0 -7
  454. package/dist/thumbnail/promo-code-input.svelte +0 -111
  455. package/dist/thumbnail/promo-code-input.svelte.d.ts +0 -7
  456. package/dist/thumbnail/promo-mosaic.svelte +0 -55
  457. package/dist/thumbnail/promo-mosaic.svelte.d.ts +0 -7
  458. package/dist/thumbnail/prompt-input.svelte +0 -91
  459. package/dist/thumbnail/prompt-input.svelte.d.ts +0 -7
  460. package/dist/thumbnail/qr-code.svelte +0 -217
  461. package/dist/thumbnail/qr-code.svelte.d.ts +0 -7
  462. package/dist/thumbnail/radio-group.svelte +0 -97
  463. package/dist/thumbnail/radio-group.svelte.d.ts +0 -7
  464. package/dist/thumbnail/range-calendar.svelte +0 -92
  465. package/dist/thumbnail/range-calendar.svelte.d.ts +0 -7
  466. package/dist/thumbnail/rating.svelte +0 -61
  467. package/dist/thumbnail/rating.svelte.d.ts +0 -7
  468. package/dist/thumbnail/recent-searches.svelte +0 -197
  469. package/dist/thumbnail/recent-searches.svelte.d.ts +0 -7
  470. package/dist/thumbnail/relative-time.svelte +0 -51
  471. package/dist/thumbnail/relative-time.svelte.d.ts +0 -7
  472. package/dist/thumbnail/result-card-car.svelte +0 -149
  473. package/dist/thumbnail/result-card-car.svelte.d.ts +0 -7
  474. package/dist/thumbnail/result-card-flight.svelte +0 -170
  475. package/dist/thumbnail/result-card-flight.svelte.d.ts +0 -7
  476. package/dist/thumbnail/result-card-hotel.svelte +0 -174
  477. package/dist/thumbnail/result-card-hotel.svelte.d.ts +0 -7
  478. package/dist/thumbnail/reveal.svelte +0 -109
  479. package/dist/thumbnail/reveal.svelte.d.ts +0 -7
  480. package/dist/thumbnail/review-card.svelte +0 -153
  481. package/dist/thumbnail/review-card.svelte.d.ts +0 -7
  482. package/dist/thumbnail/rich-text-editor.svelte +0 -134
  483. package/dist/thumbnail/rich-text-editor.svelte.d.ts +0 -7
  484. package/dist/thumbnail/room-type-picker.svelte +0 -212
  485. package/dist/thumbnail/room-type-picker.svelte.d.ts +0 -7
  486. package/dist/thumbnail/root.svelte +0 -52
  487. package/dist/thumbnail/root.svelte.d.ts +0 -10
  488. package/dist/thumbnail/route-map.svelte +0 -132
  489. package/dist/thumbnail/route-map.svelte.d.ts +0 -7
  490. package/dist/thumbnail/scroll-area.svelte +0 -124
  491. package/dist/thumbnail/scroll-area.svelte.d.ts +0 -7
  492. package/dist/thumbnail/scroll-to-top.svelte +0 -60
  493. package/dist/thumbnail/scroll-to-top.svelte.d.ts +0 -7
  494. package/dist/thumbnail/search-form-tabs.svelte +0 -192
  495. package/dist/thumbnail/search-form-tabs.svelte.d.ts +0 -7
  496. package/dist/thumbnail/seat-map.svelte +0 -358
  497. package/dist/thumbnail/seat-map.svelte.d.ts +0 -7
  498. package/dist/thumbnail/segmented-control.svelte +0 -93
  499. package/dist/thumbnail/segmented-control.svelte.d.ts +0 -7
  500. package/dist/thumbnail/select.svelte +0 -82
  501. package/dist/thumbnail/select.svelte.d.ts +0 -7
  502. package/dist/thumbnail/selectable-tile-group.svelte +0 -55
  503. package/dist/thumbnail/selectable-tile-group.svelte.d.ts +0 -7
  504. package/dist/thumbnail/separator.svelte +0 -94
  505. package/dist/thumbnail/separator.svelte.d.ts +0 -7
  506. package/dist/thumbnail/shader-canvas.svelte +0 -55
  507. package/dist/thumbnail/shader-canvas.svelte.d.ts +0 -7
  508. package/dist/thumbnail/sidebar.svelte +0 -109
  509. package/dist/thumbnail/sidebar.svelte.d.ts +0 -7
  510. package/dist/thumbnail/skeleton.svelte +0 -94
  511. package/dist/thumbnail/skeleton.svelte.d.ts +0 -7
  512. package/dist/thumbnail/slider.svelte +0 -71
  513. package/dist/thumbnail/slider.svelte.d.ts +0 -7
  514. package/dist/thumbnail/sort-bar.svelte +0 -156
  515. package/dist/thumbnail/sort-bar.svelte.d.ts +0 -7
  516. package/dist/thumbnail/spacer.svelte +0 -95
  517. package/dist/thumbnail/spacer.svelte.d.ts +0 -7
  518. package/dist/thumbnail/sparkline.svelte +0 -59
  519. package/dist/thumbnail/sparkline.svelte.d.ts +0 -7
  520. package/dist/thumbnail/spinner.svelte +0 -63
  521. package/dist/thumbnail/spinner.svelte.d.ts +0 -7
  522. package/dist/thumbnail/splitter.svelte +0 -79
  523. package/dist/thumbnail/splitter.svelte.d.ts +0 -7
  524. package/dist/thumbnail/spotlight.svelte +0 -90
  525. package/dist/thumbnail/spotlight.svelte.d.ts +0 -7
  526. package/dist/thumbnail/star-rating.svelte +0 -106
  527. package/dist/thumbnail/star-rating.svelte.d.ts +0 -7
  528. package/dist/thumbnail/stat-card.svelte.d.ts +0 -7
  529. package/dist/thumbnail/stepper.svelte +0 -94
  530. package/dist/thumbnail/stepper.svelte.d.ts +0 -7
  531. package/dist/thumbnail/svg.svelte +0 -55
  532. package/dist/thumbnail/svg.svelte.d.ts +0 -8
  533. package/dist/thumbnail/swatch-strip.svelte.d.ts +0 -7
  534. package/dist/thumbnail/switch.svelte.d.ts +0 -7
  535. package/dist/thumbnail/system-map.svelte +0 -154
  536. package/dist/thumbnail/system-map.svelte.d.ts +0 -7
  537. package/dist/thumbnail/table-of-contents.svelte +0 -101
  538. package/dist/thumbnail/table-of-contents.svelte.d.ts +0 -7
  539. package/dist/thumbnail/table.svelte +0 -214
  540. package/dist/thumbnail/table.svelte.d.ts +0 -7
  541. package/dist/thumbnail/tabs.svelte +0 -133
  542. package/dist/thumbnail/tabs.svelte.d.ts +0 -7
  543. package/dist/thumbnail/tag.svelte +0 -95
  544. package/dist/thumbnail/tag.svelte.d.ts +0 -7
  545. package/dist/thumbnail/tags-input.svelte +0 -142
  546. package/dist/thumbnail/tags-input.svelte.d.ts +0 -7
  547. package/dist/thumbnail/text.svelte +0 -72
  548. package/dist/thumbnail/text.svelte.d.ts +0 -7
  549. package/dist/thumbnail/textarea.svelte +0 -111
  550. package/dist/thumbnail/textarea.svelte.d.ts +0 -7
  551. package/dist/thumbnail/time-input.svelte +0 -94
  552. package/dist/thumbnail/time-input.svelte.d.ts +0 -7
  553. package/dist/thumbnail/timeline.svelte +0 -123
  554. package/dist/thumbnail/timeline.svelte.d.ts +0 -7
  555. package/dist/thumbnail/toast.svelte +0 -105
  556. package/dist/thumbnail/toast.svelte.d.ts +0 -7
  557. package/dist/thumbnail/toggle-group.svelte +0 -76
  558. package/dist/thumbnail/toggle-group.svelte.d.ts +0 -7
  559. package/dist/thumbnail/toggle.svelte +0 -46
  560. package/dist/thumbnail/toggle.svelte.d.ts +0 -7
  561. package/dist/thumbnail/token-preview.svelte.d.ts +0 -7
  562. package/dist/thumbnail/toolbar.svelte +0 -109
  563. package/dist/thumbnail/toolbar.svelte.d.ts +0 -7
  564. package/dist/thumbnail/tooltip.svelte +0 -85
  565. package/dist/thumbnail/tooltip.svelte.d.ts +0 -7
  566. package/dist/thumbnail/tour.svelte +0 -149
  567. package/dist/thumbnail/tour.svelte.d.ts +0 -7
  568. package/dist/thumbnail/transfer.svelte +0 -168
  569. package/dist/thumbnail/transfer.svelte.d.ts +0 -7
  570. package/dist/thumbnail/tree.svelte +0 -215
  571. package/dist/thumbnail/tree.svelte.d.ts +0 -7
  572. package/dist/thumbnail/trip-card.svelte +0 -137
  573. package/dist/thumbnail/trip-card.svelte.d.ts +0 -7
  574. package/dist/thumbnail/trust-badges.svelte +0 -207
  575. package/dist/thumbnail/trust-badges.svelte.d.ts +0 -7
  576. package/dist/thumbnail/typing-indicator.svelte +0 -65
  577. package/dist/thumbnail/typing-indicator.svelte.d.ts +0 -7
  578. package/dist/thumbnail/typography.svelte +0 -80
  579. package/dist/thumbnail/typography.svelte.d.ts +0 -7
  580. package/dist/thumbnail/user.svelte.d.ts +0 -7
  581. package/dist/thumbnail/video-embed.svelte +0 -87
  582. package/dist/thumbnail/video-embed.svelte.d.ts +0 -7
  583. package/dist/thumbnail/virtual-list.svelte +0 -178
  584. package/dist/thumbnail/virtual-list.svelte.d.ts +0 -7
  585. package/dist/thumbnail/visually-hidden.svelte +0 -106
  586. package/dist/thumbnail/visually-hidden.svelte.d.ts +0 -7
  587. package/dist/thumbnail/wave-divider.svelte.d.ts +0 -7
  588. /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>