@llui/components 0.0.30 → 0.0.33

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 (216) hide show
  1. package/dist/components/accordion.d.ts +27 -9
  2. package/dist/components/accordion.d.ts.map +1 -1
  3. package/dist/components/accordion.js +4 -3
  4. package/dist/components/accordion.js.map +1 -1
  5. package/dist/components/angle-slider.d.ts +15 -5
  6. package/dist/components/angle-slider.d.ts.map +1 -1
  7. package/dist/components/angle-slider.js +3 -2
  8. package/dist/components/angle-slider.js.map +1 -1
  9. package/dist/components/async-list.d.ts +18 -6
  10. package/dist/components/async-list.d.ts.map +1 -1
  11. package/dist/components/async-list.js +3 -2
  12. package/dist/components/async-list.js.map +1 -1
  13. package/dist/components/avatar.d.ts +12 -4
  14. package/dist/components/avatar.d.ts.map +1 -1
  15. package/dist/components/avatar.js +4 -3
  16. package/dist/components/avatar.js.map +1 -1
  17. package/dist/components/carousel.d.ts +21 -7
  18. package/dist/components/carousel.d.ts.map +1 -1
  19. package/dist/components/carousel.js +8 -8
  20. package/dist/components/carousel.js.map +1 -1
  21. package/dist/components/cascade-select.d.ts +9 -3
  22. package/dist/components/cascade-select.d.ts.map +1 -1
  23. package/dist/components/cascade-select.js +4 -4
  24. package/dist/components/cascade-select.js.map +1 -1
  25. package/dist/components/checkbox.d.ts +9 -3
  26. package/dist/components/checkbox.d.ts.map +1 -1
  27. package/dist/components/checkbox.js +4 -3
  28. package/dist/components/checkbox.js.map +1 -1
  29. package/dist/components/clipboard.d.ts +12 -4
  30. package/dist/components/clipboard.d.ts.map +1 -1
  31. package/dist/components/clipboard.js +3 -3
  32. package/dist/components/clipboard.js.map +1 -1
  33. package/dist/components/collapsible.d.ts +12 -4
  34. package/dist/components/collapsible.d.ts.map +1 -1
  35. package/dist/components/collapsible.js +2 -1
  36. package/dist/components/collapsible.js.map +1 -1
  37. package/dist/components/color-picker.d.ts +18 -6
  38. package/dist/components/color-picker.d.ts.map +1 -1
  39. package/dist/components/color-picker.js +5 -5
  40. package/dist/components/color-picker.js.map +1 -1
  41. package/dist/components/combobox.d.ts +39 -13
  42. package/dist/components/combobox.d.ts.map +1 -1
  43. package/dist/components/combobox.js +17 -9
  44. package/dist/components/combobox.js.map +1 -1
  45. package/dist/components/context-menu.d.ts +24 -8
  46. package/dist/components/context-menu.d.ts.map +1 -1
  47. package/dist/components/context-menu.js +8 -8
  48. package/dist/components/context-menu.js.map +1 -1
  49. package/dist/components/date-input.d.ts +21 -6
  50. package/dist/components/date-input.d.ts.map +1 -1
  51. package/dist/components/date-input.js +4 -4
  52. package/dist/components/date-input.js.map +1 -1
  53. package/dist/components/date-picker.d.ts +36 -12
  54. package/dist/components/date-picker.d.ts.map +1 -1
  55. package/dist/components/date-picker.js +15 -8
  56. package/dist/components/date-picker.js.map +1 -1
  57. package/dist/components/dialog.d.ts +12 -4
  58. package/dist/components/dialog.d.ts.map +1 -1
  59. package/dist/components/dialog.js +3 -3
  60. package/dist/components/dialog.js.map +1 -1
  61. package/dist/components/drawer.d.ts +12 -4
  62. package/dist/components/drawer.d.ts.map +1 -1
  63. package/dist/components/drawer.js +3 -3
  64. package/dist/components/drawer.js.map +1 -1
  65. package/dist/components/editable.d.ts +15 -5
  66. package/dist/components/editable.d.ts.map +1 -1
  67. package/dist/components/editable.js +14 -13
  68. package/dist/components/editable.js.map +1 -1
  69. package/dist/components/file-upload.d.ts +30 -10
  70. package/dist/components/file-upload.d.ts.map +1 -1
  71. package/dist/components/file-upload.js +10 -10
  72. package/dist/components/file-upload.js.map +1 -1
  73. package/dist/components/floating-panel.d.ts +48 -16
  74. package/dist/components/floating-panel.d.ts.map +1 -1
  75. package/dist/components/floating-panel.js +6 -6
  76. package/dist/components/floating-panel.js.map +1 -1
  77. package/dist/components/form.d.ts +18 -6
  78. package/dist/components/form.d.ts.map +1 -1
  79. package/dist/components/form.js +2 -1
  80. package/dist/components/form.js.map +1 -1
  81. package/dist/components/image-cropper.d.ts +33 -11
  82. package/dist/components/image-cropper.d.ts.map +1 -1
  83. package/dist/components/image-cropper.js +6 -6
  84. package/dist/components/image-cropper.js.map +1 -1
  85. package/dist/components/listbox.d.ts +33 -11
  86. package/dist/components/listbox.d.ts.map +1 -1
  87. package/dist/components/listbox.js +12 -4
  88. package/dist/components/listbox.js.map +1 -1
  89. package/dist/components/marquee.d.ts +21 -7
  90. package/dist/components/marquee.d.ts.map +1 -1
  91. package/dist/components/marquee.js +3 -2
  92. package/dist/components/marquee.js.map +1 -1
  93. package/dist/components/menu.d.ts +36 -12
  94. package/dist/components/menu.d.ts.map +1 -1
  95. package/dist/components/menu.js +23 -9
  96. package/dist/components/menu.js.map +1 -1
  97. package/dist/components/navigation-menu.d.ts +15 -5
  98. package/dist/components/navigation-menu.d.ts.map +1 -1
  99. package/dist/components/navigation-menu.js +8 -8
  100. package/dist/components/navigation-menu.js.map +1 -1
  101. package/dist/components/number-input.d.ts +24 -8
  102. package/dist/components/number-input.d.ts.map +1 -1
  103. package/dist/components/number-input.js +8 -8
  104. package/dist/components/number-input.js.map +1 -1
  105. package/dist/components/pagination.d.ts +21 -7
  106. package/dist/components/pagination.d.ts.map +1 -1
  107. package/dist/components/pagination.js +4 -4
  108. package/dist/components/pagination.js.map +1 -1
  109. package/dist/components/password-input.d.ts +9 -3
  110. package/dist/components/password-input.d.ts.map +1 -1
  111. package/dist/components/password-input.js +3 -3
  112. package/dist/components/password-input.js.map +1 -1
  113. package/dist/components/pin-input.d.ts +15 -5
  114. package/dist/components/pin-input.d.ts.map +1 -1
  115. package/dist/components/pin-input.js +8 -7
  116. package/dist/components/pin-input.js.map +1 -1
  117. package/dist/components/popover.d.ts +12 -4
  118. package/dist/components/popover.d.ts.map +1 -1
  119. package/dist/components/popover.js +3 -3
  120. package/dist/components/popover.js.map +1 -1
  121. package/dist/components/presence.d.ts +15 -5
  122. package/dist/components/presence.d.ts.map +1 -1
  123. package/dist/components/presence.js.map +1 -1
  124. package/dist/components/progress.d.ts +6 -2
  125. package/dist/components/progress.d.ts.map +1 -1
  126. package/dist/components/progress.js.map +1 -1
  127. package/dist/components/qr-code.d.ts +9 -3
  128. package/dist/components/qr-code.d.ts.map +1 -1
  129. package/dist/components/qr-code.js.map +1 -1
  130. package/dist/components/radio-group.d.ts +18 -6
  131. package/dist/components/radio-group.d.ts.map +1 -1
  132. package/dist/components/radio-group.js +4 -3
  133. package/dist/components/radio-group.js.map +1 -1
  134. package/dist/components/rating-group.d.ts +21 -7
  135. package/dist/components/rating-group.d.ts.map +1 -1
  136. package/dist/components/rating-group.js +8 -7
  137. package/dist/components/rating-group.js.map +1 -1
  138. package/dist/components/scroll-area.d.ts +9 -3
  139. package/dist/components/scroll-area.d.ts.map +1 -1
  140. package/dist/components/scroll-area.js +5 -4
  141. package/dist/components/scroll-area.js.map +1 -1
  142. package/dist/components/select.d.ts +42 -14
  143. package/dist/components/select.d.ts.map +1 -1
  144. package/dist/components/select.js +4 -4
  145. package/dist/components/select.js.map +1 -1
  146. package/dist/components/signature-pad.d.ts +24 -8
  147. package/dist/components/signature-pad.d.ts.map +1 -1
  148. package/dist/components/signature-pad.js +3 -3
  149. package/dist/components/signature-pad.js.map +1 -1
  150. package/dist/components/slider.d.ts +21 -7
  151. package/dist/components/slider.d.ts.map +1 -1
  152. package/dist/components/slider.js.map +1 -1
  153. package/dist/components/sortable.d.ts +18 -6
  154. package/dist/components/sortable.d.ts.map +1 -1
  155. package/dist/components/sortable.js +11 -10
  156. package/dist/components/sortable.js.map +1 -1
  157. package/dist/components/splitter.d.ts +21 -7
  158. package/dist/components/splitter.d.ts.map +1 -1
  159. package/dist/components/splitter.js +5 -4
  160. package/dist/components/splitter.js.map +1 -1
  161. package/dist/components/steps.d.ts +21 -7
  162. package/dist/components/steps.d.ts.map +1 -1
  163. package/dist/components/steps.js +4 -4
  164. package/dist/components/steps.js.map +1 -1
  165. package/dist/components/switch.d.ts +9 -3
  166. package/dist/components/switch.d.ts.map +1 -1
  167. package/dist/components/switch.js +4 -3
  168. package/dist/components/switch.js.map +1 -1
  169. package/dist/components/tabs.d.ts +24 -8
  170. package/dist/components/tabs.d.ts.map +1 -1
  171. package/dist/components/tabs.js +7 -6
  172. package/dist/components/tabs.js.map +1 -1
  173. package/dist/components/tags-input.d.ts +27 -9
  174. package/dist/components/tags-input.d.ts.map +1 -1
  175. package/dist/components/tags-input.js +10 -10
  176. package/dist/components/tags-input.js.map +1 -1
  177. package/dist/components/theme-switch.d.ts.map +1 -1
  178. package/dist/components/theme-switch.js +3 -2
  179. package/dist/components/theme-switch.js.map +1 -1
  180. package/dist/components/time-picker.d.ts +27 -9
  181. package/dist/components/time-picker.d.ts.map +1 -1
  182. package/dist/components/time-picker.js +10 -10
  183. package/dist/components/time-picker.js.map +1 -1
  184. package/dist/components/timer.d.ts +15 -5
  185. package/dist/components/timer.d.ts.map +1 -1
  186. package/dist/components/timer.js +4 -4
  187. package/dist/components/timer.js.map +1 -1
  188. package/dist/components/toast.d.ts +24 -8
  189. package/dist/components/toast.d.ts.map +1 -1
  190. package/dist/components/toast.js +6 -6
  191. package/dist/components/toast.js.map +1 -1
  192. package/dist/components/toc.d.ts +15 -5
  193. package/dist/components/toc.d.ts.map +1 -1
  194. package/dist/components/toc.js +2 -2
  195. package/dist/components/toc.js.map +1 -1
  196. package/dist/components/toggle-group.d.ts +15 -5
  197. package/dist/components/toggle-group.d.ts.map +1 -1
  198. package/dist/components/toggle-group.js +4 -3
  199. package/dist/components/toggle-group.js.map +1 -1
  200. package/dist/components/toggle.d.ts +9 -3
  201. package/dist/components/toggle.d.ts.map +1 -1
  202. package/dist/components/toggle.js +4 -3
  203. package/dist/components/toggle.js.map +1 -1
  204. package/dist/components/tooltip.d.ts +12 -4
  205. package/dist/components/tooltip.d.ts.map +1 -1
  206. package/dist/components/tooltip.js +3 -3
  207. package/dist/components/tooltip.js.map +1 -1
  208. package/dist/components/tour.d.ts +18 -6
  209. package/dist/components/tour.d.ts.map +1 -1
  210. package/dist/components/tour.js +6 -6
  211. package/dist/components/tour.js.map +1 -1
  212. package/dist/components/tree-view.d.ts +75 -25
  213. package/dist/components/tree-view.d.ts.map +1 -1
  214. package/dist/components/tree-view.js +18 -7
  215. package/dist/components/tree-view.js.map +1 -1
  216. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../src/components/slider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../src/components/slider.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"slider.js","sourceRoot":"","sources":["../../src/components/slider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\n\n/**\n * Slider — numeric input controlled by drag or keyboard. Supports multiple\n * thumbs (range slider) and horizontal/vertical orientations. The machine is\n * pure; pointer drag handling (pointermove listeners during a drag) is done\n * by the consumer via `startThumbDrag()` helper which returns a cleanup.\n */\n\nexport type Orientation = 'horizontal' | 'vertical'\n\nexport interface SliderState {\n /** One value per thumb. For a single-value slider, a one-element array. */\n value: number[]\n min: number\n max: number\n step: number\n disabled: boolean\n orientation: Orientation\n /** Minimum gap enforced between adjacent thumbs (range slider). */\n minStepsBetweenThumbs: number\n}\n\nexport type SliderMsg =\n | { type: 'setValue'; value: number[] }\n | { type: 'setThumb'; index: number; value: number }\n | { type: 'increment'; index: number; multiplier?: number }\n | { type: 'decrement'; index: number; multiplier?: number }\n | { type: 'toMin'; index: number }\n | { type: 'toMax'; index: number }\n | { type: 'setDisabled'; disabled: boolean }\n\nexport interface SliderInit {\n value?: number[]\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n orientation?: Orientation\n minStepsBetweenThumbs?: number\n}\n\nexport function init(opts: SliderInit = {}): SliderState {\n return {\n value: opts.value ?? [0],\n min: opts.min ?? 0,\n max: opts.max ?? 100,\n step: opts.step ?? 1,\n disabled: opts.disabled ?? false,\n orientation: opts.orientation ?? 'horizontal',\n minStepsBetweenThumbs: opts.minStepsBetweenThumbs ?? 0,\n }\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (n < min) return min\n if (n > max) return max\n return n\n}\n\nfunction snapToStep(n: number, min: number, step: number): number {\n const steps = Math.round((n - min) / step)\n const snapped = min + steps * step\n // Avoid floating-point drift — round to precision of step\n const decimals = decimalPlaces(step)\n return Number(snapped.toFixed(decimals))\n}\n\nfunction decimalPlaces(n: number): number {\n if (Math.floor(n) === n) return 0\n const str = n.toString()\n const dot = str.indexOf('.')\n return dot === -1 ? 0 : str.length - dot - 1\n}\n\nfunction setThumbValue(state: SliderState, index: number, rawValue: number): number[] {\n const { min, max, step, minStepsBetweenThumbs } = state\n const snapped = snapToStep(clamp(rawValue, min, max), min, step)\n const value = [...state.value]\n // Enforce gap with neighbors\n const gap = minStepsBetweenThumbs * step\n const lowerBound = index > 0 ? (value[index - 1] ?? min) + gap : min\n const upperBound = index < value.length - 1 ? (value[index + 1] ?? max) - gap : max\n value[index] = clamp(snapped, lowerBound, upperBound)\n return value\n}\n\nexport function update(state: SliderState, msg: SliderMsg): [SliderState, never[]] {\n if (state.disabled && msg.type !== 'setDisabled') return [state, []]\n switch (msg.type) {\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'setThumb':\n return [{ ...state, value: setThumbValue(state, msg.index, msg.value) }, []]\n case 'increment': {\n const m = msg.multiplier ?? 1\n const current = state.value[msg.index] ?? state.min\n return [{ ...state, value: setThumbValue(state, msg.index, current + state.step * m) }, []]\n }\n case 'decrement': {\n const m = msg.multiplier ?? 1\n const current = state.value[msg.index] ?? state.min\n return [{ ...state, value: setThumbValue(state, msg.index, current - state.step * m) }, []]\n }\n case 'toMin':\n return [{ ...state, value: setThumbValue(state, msg.index, state.min) }, []]\n case 'toMax':\n return [{ ...state, value: setThumbValue(state, msg.index, state.max) }, []]\n case 'setDisabled':\n return [{ ...state, disabled: msg.disabled }, []]\n }\n}\n\nfunction thumbPercent(state: SliderState, index: number): number {\n const v = state.value[index] ?? state.min\n const range = state.max - state.min\n if (range === 0) return 0\n return ((v - state.min) / range) * 100\n}\n\nexport interface SliderThumbParts<S> {\n thumb: {\n role: 'slider'\n 'aria-valuemin': (s: S) => number\n 'aria-valuemax': (s: S) => number\n 'aria-valuenow': (s: S) => number\n 'aria-orientation': (s: S) => Orientation\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-orientation': (s: S) => Orientation\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'slider'\n 'data-part': 'thumb'\n 'data-index': string\n tabIndex: (s: S) => number\n onKeyDown: (e: KeyboardEvent) => void\n style: (s: S) => string\n }\n}\n\nexport interface SliderParts<S> {\n root: {\n 'data-scope': 'slider'\n 'data-part': 'root'\n 'data-orientation': (s: S) => Orientation\n 'data-disabled': (s: S) => '' | undefined\n }\n control: {\n 'data-scope': 'slider'\n 'data-part': 'control'\n 'data-orientation': (s: S) => Orientation\n onPointerDown: (e: PointerEvent) => void\n }\n track: {\n 'data-scope': 'slider'\n 'data-part': 'track'\n 'data-orientation': (s: S) => Orientation\n }\n range: {\n 'data-scope': 'slider'\n 'data-part': 'range'\n 'data-orientation': (s: S) => Orientation\n style: (s: S) => string\n }\n thumb: (index: number) => SliderThumbParts<S>\n /** Current raw values — accessor convenience. */\n value: (s: S) => number[]\n}\n\nexport function connect<S>(get: (s: S) => SliderState, send: Send<SliderMsg>): SliderParts<S> {\n return {\n root: {\n 'data-scope': 'slider',\n 'data-part': 'root',\n 'data-orientation': (s) => get(s).orientation,\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n control: {\n 'data-scope': 'slider',\n 'data-part': 'control',\n 'data-orientation': (s) => get(s).orientation,\n // Consumers attach their own pointer drag logic via onMount, using\n // `valueFromPoint` + `closestThumbIndex` helpers. The connect layer\n // preventDefault's to suppress text selection while dragging.\n onPointerDown: (e: PointerEvent) => e.preventDefault(),\n },\n track: {\n 'data-scope': 'slider',\n 'data-part': 'track',\n 'data-orientation': (s) => get(s).orientation,\n },\n range: {\n 'data-scope': 'slider',\n 'data-part': 'range',\n 'data-orientation': (s) => get(s).orientation,\n style: (s) => rangeStyle(get(s)),\n },\n thumb: (index: number): SliderThumbParts<S> => ({\n thumb: {\n role: 'slider',\n 'aria-valuemin': (s) => get(s).min,\n 'aria-valuemax': (s) => get(s).max,\n 'aria-valuenow': (s) => get(s).value[index] ?? get(s).min,\n 'aria-orientation': (s) => get(s).orientation,\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'data-orientation': (s) => get(s).orientation,\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-scope': 'slider',\n 'data-part': 'thumb',\n 'data-index': String(index),\n tabIndex: (s) => (get(s).disabled ? -1 : 0),\n style: (s) => thumbStyle(get(s), index),\n onKeyDown: (e: KeyboardEvent) => handleThumbKey(e, index, send),\n },\n }),\n value: (s) => get(s).value,\n }\n}\n\nfunction handleThumbKey(e: KeyboardEvent, index: number, send: Send<SliderMsg>): void {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'increment', index })\n return\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'decrement', index })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'increment', index, multiplier: 10 })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'decrement', index, multiplier: 10 })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'toMin', index })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'toMax', index })\n return\n }\n}\n\nfunction thumbStyle(state: SliderState, index: number): string {\n const pct = thumbPercent(state, index)\n if (state.orientation === 'horizontal') {\n return `position:absolute;left:${pct}%;transform:translateX(-50%);`\n }\n return `position:absolute;bottom:${pct}%;transform:translateY(50%);`\n}\n\nfunction rangeStyle(state: SliderState): string {\n if (state.value.length === 0) return ''\n const sorted = [...state.value].sort((a, b) => a - b)\n const low = sorted[0]!\n const high = sorted[sorted.length - 1]!\n const range = state.max - state.min\n if (range === 0) return ''\n const startPct = ((low - state.min) / range) * 100\n const endPct = ((high - state.min) / range) * 100\n if (state.orientation === 'horizontal') {\n return `position:absolute;left:${startPct}%;right:${100 - endPct}%;`\n }\n return `position:absolute;bottom:${startPct}%;top:${100 - endPct}%;`\n}\n\n/**\n * Compute the slider value at a given pointer position within the control's\n * bounding rect. Returns null if the pointer is outside the track.\n */\nexport function valueFromPoint(\n state: SliderState,\n rect: DOMRect,\n clientX: number,\n clientY: number,\n): number {\n const { min, max, step, orientation } = state\n let pct: number\n if (orientation === 'horizontal') {\n pct = (clientX - rect.left) / rect.width\n } else {\n pct = 1 - (clientY - rect.top) / rect.height\n }\n const raw = min + pct * (max - min)\n return snapToStep(clamp(raw, min, max), min, step)\n}\n\n/** Determine which thumb index is closest to a given raw value. */\nexport function closestThumbIndex(state: SliderState, raw: number): number {\n if (state.value.length === 0) return 0\n let best = 0\n let bestDist = Infinity\n for (let i = 0; i < state.value.length; i++) {\n const d = Math.abs((state.value[i] ?? 0) - raw)\n if (d < bestDist) {\n bestDist = d\n best = i\n }\n }\n return best\n}\n\nexport const slider = { init, update, connect, valueFromPoint, closestThumbIndex }\n"]}
1
+ {"version":3,"file":"slider.js","sourceRoot":"","sources":["../../src/components/slider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\n\n/**\n * Slider — numeric input controlled by drag or keyboard. Supports multiple\n * thumbs (range slider) and horizontal/vertical orientations. The machine is\n * pure; pointer drag handling (pointermove listeners during a drag) is done\n * by the consumer via `startThumbDrag()` helper which returns a cleanup.\n */\n\nexport type Orientation = 'horizontal' | 'vertical'\n\nexport interface SliderState {\n /** One value per thumb. For a single-value slider, a one-element array. */\n value: number[]\n min: number\n max: number\n step: number\n disabled: boolean\n orientation: Orientation\n /** Minimum gap enforced between adjacent thumbs (range slider). */\n minStepsBetweenThumbs: number\n}\n\nexport type SliderMsg =\n /** @intent(\"Replace all thumb values at once\") */\n | { type: 'setValue'; value: number[] }\n /** @intent(\"Set the value of the thumb at the given index\") */\n | { type: 'setThumb'; index: number; value: number }\n /** @intent(\"Move the thumb at the given index up by one step (or step × multiplier)\") */\n | { type: 'increment'; index: number; multiplier?: number }\n /** @intent(\"Move the thumb at the given index down by one step (or step × multiplier)\") */\n | { type: 'decrement'; index: number; multiplier?: number }\n /** @intent(\"Snap the thumb at the given index to the slider's minimum\") */\n | { type: 'toMin'; index: number }\n /** @intent(\"Snap the thumb at the given index to the slider's maximum\") */\n | { type: 'toMax'; index: number }\n /** @humanOnly */\n | { type: 'setDisabled'; disabled: boolean }\n\nexport interface SliderInit {\n value?: number[]\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n orientation?: Orientation\n minStepsBetweenThumbs?: number\n}\n\nexport function init(opts: SliderInit = {}): SliderState {\n return {\n value: opts.value ?? [0],\n min: opts.min ?? 0,\n max: opts.max ?? 100,\n step: opts.step ?? 1,\n disabled: opts.disabled ?? false,\n orientation: opts.orientation ?? 'horizontal',\n minStepsBetweenThumbs: opts.minStepsBetweenThumbs ?? 0,\n }\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (n < min) return min\n if (n > max) return max\n return n\n}\n\nfunction snapToStep(n: number, min: number, step: number): number {\n const steps = Math.round((n - min) / step)\n const snapped = min + steps * step\n // Avoid floating-point drift — round to precision of step\n const decimals = decimalPlaces(step)\n return Number(snapped.toFixed(decimals))\n}\n\nfunction decimalPlaces(n: number): number {\n if (Math.floor(n) === n) return 0\n const str = n.toString()\n const dot = str.indexOf('.')\n return dot === -1 ? 0 : str.length - dot - 1\n}\n\nfunction setThumbValue(state: SliderState, index: number, rawValue: number): number[] {\n const { min, max, step, minStepsBetweenThumbs } = state\n const snapped = snapToStep(clamp(rawValue, min, max), min, step)\n const value = [...state.value]\n // Enforce gap with neighbors\n const gap = minStepsBetweenThumbs * step\n const lowerBound = index > 0 ? (value[index - 1] ?? min) + gap : min\n const upperBound = index < value.length - 1 ? (value[index + 1] ?? max) - gap : max\n value[index] = clamp(snapped, lowerBound, upperBound)\n return value\n}\n\nexport function update(state: SliderState, msg: SliderMsg): [SliderState, never[]] {\n if (state.disabled && msg.type !== 'setDisabled') return [state, []]\n switch (msg.type) {\n case 'setValue':\n return [{ ...state, value: msg.value }, []]\n case 'setThumb':\n return [{ ...state, value: setThumbValue(state, msg.index, msg.value) }, []]\n case 'increment': {\n const m = msg.multiplier ?? 1\n const current = state.value[msg.index] ?? state.min\n return [{ ...state, value: setThumbValue(state, msg.index, current + state.step * m) }, []]\n }\n case 'decrement': {\n const m = msg.multiplier ?? 1\n const current = state.value[msg.index] ?? state.min\n return [{ ...state, value: setThumbValue(state, msg.index, current - state.step * m) }, []]\n }\n case 'toMin':\n return [{ ...state, value: setThumbValue(state, msg.index, state.min) }, []]\n case 'toMax':\n return [{ ...state, value: setThumbValue(state, msg.index, state.max) }, []]\n case 'setDisabled':\n return [{ ...state, disabled: msg.disabled }, []]\n }\n}\n\nfunction thumbPercent(state: SliderState, index: number): number {\n const v = state.value[index] ?? state.min\n const range = state.max - state.min\n if (range === 0) return 0\n return ((v - state.min) / range) * 100\n}\n\nexport interface SliderThumbParts<S> {\n thumb: {\n role: 'slider'\n 'aria-valuemin': (s: S) => number\n 'aria-valuemax': (s: S) => number\n 'aria-valuenow': (s: S) => number\n 'aria-orientation': (s: S) => Orientation\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-orientation': (s: S) => Orientation\n 'data-disabled': (s: S) => '' | undefined\n 'data-scope': 'slider'\n 'data-part': 'thumb'\n 'data-index': string\n tabIndex: (s: S) => number\n onKeyDown: (e: KeyboardEvent) => void\n style: (s: S) => string\n }\n}\n\nexport interface SliderParts<S> {\n root: {\n 'data-scope': 'slider'\n 'data-part': 'root'\n 'data-orientation': (s: S) => Orientation\n 'data-disabled': (s: S) => '' | undefined\n }\n control: {\n 'data-scope': 'slider'\n 'data-part': 'control'\n 'data-orientation': (s: S) => Orientation\n onPointerDown: (e: PointerEvent) => void\n }\n track: {\n 'data-scope': 'slider'\n 'data-part': 'track'\n 'data-orientation': (s: S) => Orientation\n }\n range: {\n 'data-scope': 'slider'\n 'data-part': 'range'\n 'data-orientation': (s: S) => Orientation\n style: (s: S) => string\n }\n thumb: (index: number) => SliderThumbParts<S>\n /** Current raw values — accessor convenience. */\n value: (s: S) => number[]\n}\n\nexport function connect<S>(get: (s: S) => SliderState, send: Send<SliderMsg>): SliderParts<S> {\n return {\n root: {\n 'data-scope': 'slider',\n 'data-part': 'root',\n 'data-orientation': (s) => get(s).orientation,\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n },\n control: {\n 'data-scope': 'slider',\n 'data-part': 'control',\n 'data-orientation': (s) => get(s).orientation,\n // Consumers attach their own pointer drag logic via onMount, using\n // `valueFromPoint` + `closestThumbIndex` helpers. The connect layer\n // preventDefault's to suppress text selection while dragging.\n onPointerDown: (e: PointerEvent) => e.preventDefault(),\n },\n track: {\n 'data-scope': 'slider',\n 'data-part': 'track',\n 'data-orientation': (s) => get(s).orientation,\n },\n range: {\n 'data-scope': 'slider',\n 'data-part': 'range',\n 'data-orientation': (s) => get(s).orientation,\n style: (s) => rangeStyle(get(s)),\n },\n thumb: (index: number): SliderThumbParts<S> => ({\n thumb: {\n role: 'slider',\n 'aria-valuemin': (s) => get(s).min,\n 'aria-valuemax': (s) => get(s).max,\n 'aria-valuenow': (s) => get(s).value[index] ?? get(s).min,\n 'aria-orientation': (s) => get(s).orientation,\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'data-orientation': (s) => get(s).orientation,\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-scope': 'slider',\n 'data-part': 'thumb',\n 'data-index': String(index),\n tabIndex: (s) => (get(s).disabled ? -1 : 0),\n style: (s) => thumbStyle(get(s), index),\n onKeyDown: (e: KeyboardEvent) => handleThumbKey(e, index, send),\n },\n }),\n value: (s) => get(s).value,\n }\n}\n\nfunction handleThumbKey(e: KeyboardEvent, index: number, send: Send<SliderMsg>): void {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'increment', index })\n return\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'decrement', index })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'increment', index, multiplier: 10 })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'decrement', index, multiplier: 10 })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'toMin', index })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'toMax', index })\n return\n }\n}\n\nfunction thumbStyle(state: SliderState, index: number): string {\n const pct = thumbPercent(state, index)\n if (state.orientation === 'horizontal') {\n return `position:absolute;left:${pct}%;transform:translateX(-50%);`\n }\n return `position:absolute;bottom:${pct}%;transform:translateY(50%);`\n}\n\nfunction rangeStyle(state: SliderState): string {\n if (state.value.length === 0) return ''\n const sorted = [...state.value].sort((a, b) => a - b)\n const low = sorted[0]!\n const high = sorted[sorted.length - 1]!\n const range = state.max - state.min\n if (range === 0) return ''\n const startPct = ((low - state.min) / range) * 100\n const endPct = ((high - state.min) / range) * 100\n if (state.orientation === 'horizontal') {\n return `position:absolute;left:${startPct}%;right:${100 - endPct}%;`\n }\n return `position:absolute;bottom:${startPct}%;top:${100 - endPct}%;`\n}\n\n/**\n * Compute the slider value at a given pointer position within the control's\n * bounding rect. Returns null if the pointer is outside the track.\n */\nexport function valueFromPoint(\n state: SliderState,\n rect: DOMRect,\n clientX: number,\n clientY: number,\n): number {\n const { min, max, step, orientation } = state\n let pct: number\n if (orientation === 'horizontal') {\n pct = (clientX - rect.left) / rect.width\n } else {\n pct = 1 - (clientY - rect.top) / rect.height\n }\n const raw = min + pct * (max - min)\n return snapToStep(clamp(raw, min, max), min, step)\n}\n\n/** Determine which thumb index is closest to a given raw value. */\nexport function closestThumbIndex(state: SliderState, raw: number): number {\n if (state.value.length === 0) return 0\n let best = 0\n let bestDist = Infinity\n for (let i = 0; i < state.value.length; i++) {\n const d = Math.abs((state.value[i] ?? 0) - raw)\n if (d < bestDist) {\n bestDist = d\n best = i\n }\n }\n return best\n}\n\nexport const slider = { init, update, connect, valueFromPoint, closestThumbIndex }\n"]}
@@ -81,29 +81,41 @@ export interface DragState {
81
81
  export interface SortableState {
82
82
  dragging: DragState | null;
83
83
  }
84
- export type SortableMsg = {
84
+ export type SortableMsg =
85
+ /** @humanOnly */
86
+ {
85
87
  type: 'start';
86
88
  id: string;
87
89
  index: number;
88
90
  container: string;
89
91
  x: number;
90
92
  y: number;
91
- } | {
93
+ }
94
+ /** @humanOnly */
95
+ | {
92
96
  type: 'move';
93
97
  index: number;
94
98
  container: string;
95
99
  x: number;
96
100
  y: number;
97
- } | {
101
+ }
102
+ /** @humanOnly */
103
+ | {
98
104
  type: 'drop';
99
- } | {
105
+ }
106
+ /** @humanOnly */
107
+ | {
100
108
  type: 'cancel';
101
- } | {
109
+ }
110
+ /** @humanOnly */
111
+ | {
102
112
  type: 'toggleGrab';
103
113
  id: string;
104
114
  index: number;
105
115
  container: string;
106
- } | {
116
+ }
117
+ /** @humanOnly */
118
+ | {
107
119
  type: 'moveBy';
108
120
  delta: number;
109
121
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sortable.d.ts","sourceRoot":"","sources":["../../src/components/sortable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sortable.d.ts","sourceRoot":"","sources":["../../src/components/sortable.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { tagSend } from '@llui/dom';
1
2
  export function init() {
2
3
  return { dragging: null };
3
4
  }
@@ -165,7 +166,7 @@ export function connect(get, send, opts) {
165
166
  'data-part': 'root',
166
167
  'data-container-id': containerId,
167
168
  'data-dragging': (s) => (get(s).dragging ? '' : undefined),
168
- onPointerMove: (e) => {
169
+ onPointerMove: tagSend(send, ['move'], (e) => {
169
170
  if (!e.buttons)
170
171
  return;
171
172
  const hit = findTargetAt(e);
@@ -177,15 +178,15 @@ export function connect(get, send, opts) {
177
178
  x: e.clientX,
178
179
  y: e.clientY,
179
180
  });
180
- },
181
- onPointerUp: () => {
181
+ }),
182
+ onPointerUp: tagSend(send, ['drop'], () => {
182
183
  snapshots.clear();
183
184
  send({ type: 'drop' });
184
- },
185
- onPointerCancel: () => {
185
+ }),
186
+ onPointerCancel: tagSend(send, ['cancel'], () => {
186
187
  snapshots.clear();
187
188
  send({ type: 'cancel' });
188
- },
189
+ }),
189
190
  },
190
191
  item: (id, index) => ({
191
192
  'data-scope': 'sortable',
@@ -318,7 +319,7 @@ export function connect(get, send, opts) {
318
319
  return d?.id === id && d?.fromContainer === containerId;
319
320
  },
320
321
  'aria-label': 'Drag handle. Press space to pick up, arrow keys to move, space again to drop, escape to cancel.',
321
- onPointerDown: (e) => {
322
+ onPointerDown: tagSend(send, ['start'], (e) => {
322
323
  e.preventDefault();
323
324
  const target = e.currentTarget;
324
325
  if (target && 'setPointerCapture' in target) {
@@ -362,8 +363,8 @@ export function connect(get, send, opts) {
362
363
  x: e.clientX,
363
364
  y: e.clientY,
364
365
  });
365
- },
366
- onKeyDown: (e) => {
366
+ }),
367
+ onKeyDown: tagSend(send, ['toggleGrab', 'cancel', 'moveBy'], (e) => {
367
368
  switch (e.key) {
368
369
  case ' ':
369
370
  case 'Enter':
@@ -385,7 +386,7 @@ export function connect(get, send, opts) {
385
386
  send({ type: 'moveBy', delta: -1 });
386
387
  return;
387
388
  }
388
- },
389
+ }),
389
390
  }),
390
391
  };
391
392
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sortable.js","sourceRoot":"","sources":["../../src/components/sortable.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\n\n/**\n * Sortable — pointer-based reorderable list.\n *\n * State machine tracks the currently-dragged item and where it's hovering.\n * The app owns the actual array; listen for `drop` and use `reorder(arr, from, to)`\n * to compute the new order, or watch `currentIndex` during drag for live preview.\n *\n * ```ts\n * type State = { items: string[]; sort: SortableState }\n *\n * update: (state, msg) => {\n * switch (msg.type) {\n * case 'sort':\n * return [{ ...state, sort: sortable.update(state.sort, msg.msg)[0] }, []]\n * case 'drop': {\n * const d = state.sort.dragging\n * if (!d) return [state, []]\n * return [{ ...state, items: reorder(state.items, d.startIndex, d.currentIndex) }, []]\n * }\n * }\n * }\n *\n * view: ({ send, each, text }) => {\n * const s = sortable.connect<State>(s => s.sort, m => send({ type: 'sort', msg: m }), { id: 'list' })\n * return [\n * ul({ ...s.root, class: 'list' }, [\n * ...each({\n * items: (st) => st.items,\n * key: (x) => x,\n * render: ({ item, index }) => [\n * li({ ...s.item(item(), index()), class: 'item' }, [\n * div({ ...s.handle(item(), index()), class: 'handle' }, [text('⋮⋮')]),\n * text(item),\n * ]),\n * ],\n * }),\n * ]),\n * ]\n * }\n * ```\n *\n * Hook up pointermove/pointerup at the root (attachPointerHandlers) — or\n * wire them directly via `onPointerMove` / `onPointerUp` on the root part.\n */\n\nexport interface DragState {\n id: string\n startIndex: number\n currentIndex: number\n /**\n * Container the drag originated from. Defaults to the connect's `id` for\n * single-container sortables. Set when multiple sortables share state.\n */\n fromContainer: string\n /**\n * Container the pointer is currently over. Same as `fromContainer` for\n * single-container sortables. Differs when dragging across containers.\n */\n toContainer: string\n /**\n * Pointer X at drag start (viewport coordinates). Used by 2D layouts\n * to compute `deltaX = currentX - startX` alongside the Y axis. In 1D\n * layouts X is tracked but ignored by the renderer.\n */\n startX: number\n /**\n * Pointer Y at drag start (viewport coordinates). Used by CSS / the\n * library's `style.transform` binding to make the dragged item follow\n * the pointer.\n */\n startY: number\n /**\n * Current pointer X (viewport coordinates). `deltaX = currentX - startX`.\n */\n currentX: number\n /**\n * Current pointer Y (viewport coordinates). `deltaY = currentY - startY`.\n */\n currentY: number\n}\n\nexport interface SortableState {\n dragging: DragState | null\n}\n\nexport type SortableMsg =\n | { type: 'start'; id: string; index: number; container: string; x: number; y: number }\n | { type: 'move'; index: number; container: string; x: number; y: number }\n | { type: 'drop' }\n | { type: 'cancel' }\n // Keyboard: toggle between picking up and dropping at current position\n | { type: 'toggleGrab'; id: string; index: number; container: string }\n // Keyboard: shift currentIndex by delta (clamped ≥ 0)\n | { type: 'moveBy'; delta: number }\n\nexport function init(): SortableState {\n return { dragging: null }\n}\n\nexport function update(state: SortableState, msg: SortableMsg): [SortableState, never[]] {\n switch (msg.type) {\n case 'start':\n return [\n {\n dragging: {\n id: msg.id,\n startIndex: msg.index,\n currentIndex: msg.index,\n fromContainer: msg.container,\n toContainer: msg.container,\n startX: msg.x,\n startY: msg.y,\n currentX: msg.x,\n currentY: msg.y,\n },\n },\n [],\n ]\n case 'move': {\n if (!state.dragging) return [state, []]\n if (\n state.dragging.currentIndex === msg.index &&\n state.dragging.toContainer === msg.container &&\n state.dragging.currentX === msg.x &&\n state.dragging.currentY === msg.y\n ) {\n return [state, []]\n }\n return [\n {\n dragging: {\n ...state.dragging,\n currentIndex: msg.index,\n toContainer: msg.container,\n currentX: msg.x,\n currentY: msg.y,\n },\n },\n [],\n ]\n }\n case 'drop':\n return state.dragging ? [{ dragging: null }, []] : [state, []]\n case 'cancel':\n return state.dragging ? [{ dragging: null }, []] : [state, []]\n case 'toggleGrab':\n if (state.dragging) {\n // Already dragging — drop at current position\n return [{ dragging: null }, []]\n }\n // Pick up (keyboard — no pointer position)\n return [\n {\n dragging: {\n id: msg.id,\n startIndex: msg.index,\n currentIndex: msg.index,\n fromContainer: msg.container,\n toContainer: msg.container,\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n },\n },\n [],\n ]\n case 'moveBy': {\n if (!state.dragging) return [state, []]\n const next = Math.max(0, state.dragging.currentIndex + msg.delta)\n if (next === state.dragging.currentIndex) return [state, []]\n return [{ dragging: { ...state.dragging, currentIndex: next } }, []]\n }\n }\n}\n\nexport interface SortableParts<S> {\n root: {\n 'data-scope': 'sortable'\n 'data-part': 'root'\n 'data-container-id': string\n 'data-dragging': (s: S) => '' | undefined\n onPointerMove: (e: PointerEvent) => void\n onPointerUp: (e: PointerEvent) => void\n onPointerCancel: (e: PointerEvent) => void\n }\n item: (\n id: string,\n index: number,\n ) => {\n 'data-scope': 'sortable'\n 'data-part': 'item'\n 'data-index': string\n 'data-id': string\n 'data-dragging': (s: S) => '' | undefined\n 'data-over': (s: S) => '' | undefined\n 'data-shift': (s: S) => 'up' | 'down' | undefined\n 'style.transform': (s: S) => string | undefined\n 'style.zIndex': (s: S) => string | undefined\n }\n handle: (\n id: string,\n index: number,\n ) => {\n 'data-scope': 'sortable'\n 'data-part': 'handle'\n role: 'button'\n tabIndex: 0\n 'aria-grabbed': (s: S) => boolean\n 'aria-label': string\n onPointerDown: (e: PointerEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n /**\n * Drag-target selection + render strategy.\n *\n * - `'1d'` (default) — single-axis, Y-only. `findTargetAt` picks\n * by vertical distance; `style.transform` on the dragged item\n * is `translateY(deltaY)`; non-dragged items between source\n * and target emit `data-shift: 'up' | 'down'` so CSS can\n * animate them via `translateY(±var(--sortable-shift))`.\n * Correct for vertical lists; fails for 2D layouts (flex-wrap,\n * grid) because same-row items collapse to the same midpoint\n * distance.\n *\n * - `'2d'` — Euclidean target selection against 2D midpoints;\n * dragged item follows both X and Y (`translate(dx, dy)`);\n * non-dragged items between source and target get a per-item\n * `style.transform = translate(deltaFromSnapshot)` that opens\n * the correct gap regardless of row boundaries. `data-shift`\n * is always `undefined` in 2D so CSS `translateY(var(--...))`\n * rules don't conflict with the per-item transform.\n *\n * Keyboard navigation (`moveBy`) stays linear-array in both modes —\n * arrow keys step through the array indices regardless of visual\n * row, because that's what screen readers announce and what the\n * underlying data order actually is.\n */\n layout?: '1d' | '2d'\n}\n\nexport function connect<S>(\n get: (s: S) => SortableState,\n send: Send<SortableMsg>,\n opts: ConnectOptions,\n): SortableParts<S> {\n // The connect's `id` doubles as the cross-container identifier\n const containerId = opts.id\n const layout = opts.layout ?? '1d'\n\n // Snapshots taken at drag start — stable throughout the drag so computing\n // the target index is not affected by items visually shifting via CSS.\n // Map: container-id → array of midpoint {x, y} pairs for each item's\n // original bounding rect (sorted by index). The handler records this on\n // pointerdown. Always 2D internally; 1D layout's findTargetAt ignores X.\n interface Snapshot {\n mids: Array<{ x: number; y: number }>\n // id → current DOM index at drag start. Used by data-shift / per-item\n // transform to look up an item's live position, since the `index`\n // captured at render time is frozen and goes stale after each()\n // reconciles a reorder.\n idToIndex: Map<string, number>\n }\n const snapshots = new Map<string, Snapshot>()\n\n function snapshotContainer(rootEl: HTMLElement, cid: string): void {\n const items = rootEl.querySelectorAll<HTMLElement>('[data-scope=\"sortable\"][data-part=\"item\"]')\n // Read rects once — they're pre-transform (no drag shifts yet)\n const mids: Array<{ x: number; y: number }> = []\n const idToIndex = new Map<string, number>()\n items.forEach((item, i) => {\n const r = item.getBoundingClientRect()\n mids.push({ x: r.left + r.width / 2, y: r.top + r.height / 2 })\n const itemId = item.dataset.id\n if (itemId !== undefined) idToIndex.set(itemId, i)\n })\n snapshots.set(cid, { mids, idToIndex })\n }\n\n function snapshotAll(): void {\n const roots = document.querySelectorAll<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"root\"]',\n )\n for (const root of roots) {\n const cid = root.dataset.containerId\n if (cid) snapshotContainer(root, cid)\n }\n }\n\n // Find the target index under the pointer using the drag-start snapshot.\n // 1D mode: picks by Y-only distance (original behavior). 2D mode: picks\n // by Euclidean distance over {x, y} midpoints — required for flex-wrap\n // / grid layouts where multiple items share a row and collapse to the\n // same Y value. Both modes are stable against items being visually\n // transformed during the drag because midpoints are taken pre-transform.\n function findTargetAt(e: PointerEvent): { container: string; index: number } | null {\n const roots = document.querySelectorAll<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"root\"]',\n )\n for (const root of roots) {\n const r = root.getBoundingClientRect()\n if (e.clientX < r.left || e.clientX > r.right) continue\n if (e.clientY < r.top || e.clientY > r.bottom) continue\n const cid = root.dataset.containerId\n if (!cid) continue\n const snap = snapshots.get(cid)\n if (!snap || snap.mids.length === 0) return { container: cid, index: 0 }\n const mids = snap.mids\n let bestIdx = 0\n if (layout === '2d') {\n // Euclidean (squared — monotonic with distance, saves a sqrt).\n const dx0 = e.clientX - mids[0]!.x\n const dy0 = e.clientY - mids[0]!.y\n let bestDist = dx0 * dx0 + dy0 * dy0\n for (let i = 1; i < mids.length; i++) {\n const dx = e.clientX - mids[i]!.x\n const dy = e.clientY - mids[i]!.y\n const d = dx * dx + dy * dy\n if (d < bestDist) {\n bestDist = d\n bestIdx = i\n }\n }\n } else {\n // 1D — Y-only distance. Preserves the original behavior for\n // vertical lists; same-row items in a flex-wrap would tie and\n // the first match wins, which is the bug that motivates 2D.\n let bestDist = Math.abs(e.clientY - mids[0]!.y)\n for (let i = 1; i < mids.length; i++) {\n const d = Math.abs(e.clientY - mids[i]!.y)\n if (d < bestDist) {\n bestDist = d\n bestIdx = i\n }\n }\n }\n return { container: cid, index: bestIdx }\n }\n return null\n }\n\n return {\n root: {\n 'data-scope': 'sortable',\n 'data-part': 'root',\n 'data-container-id': containerId,\n 'data-dragging': (s) => (get(s).dragging ? '' : undefined),\n onPointerMove: (e) => {\n if (!e.buttons) return\n const hit = findTargetAt(e)\n if (hit !== null)\n send({\n type: 'move',\n index: hit.index,\n container: hit.container,\n x: e.clientX,\n y: e.clientY,\n })\n },\n onPointerUp: () => {\n snapshots.clear()\n send({ type: 'drop' })\n },\n onPointerCancel: () => {\n snapshots.clear()\n send({ type: 'cancel' })\n },\n },\n item: (id, index) => ({\n 'data-scope': 'sortable',\n 'data-part': 'item',\n 'data-index': String(index),\n 'data-id': id,\n 'data-dragging': (s) => {\n const d = get(s).dragging\n return d?.id === id && d?.fromContainer === containerId ? '' : undefined\n },\n 'data-over': (s) => {\n const d = get(s).dragging\n if (!d || d.toContainer !== containerId) return undefined\n // Look up this item's CURRENT DOM index via the drag-start snapshot.\n // The `index` closed over here is frozen at initial render and goes\n // stale after each() reconciles a reorder.\n const snap = snapshots.get(containerId)\n const liveIndex = snap?.idToIndex.get(id) ?? index\n return d.currentIndex === liveIndex ? '' : undefined\n },\n // Shift direction for items BETWEEN the source and target (excluding the\n // dragged item itself). 'down' = item should translate down to make room;\n // 'up' = item should translate up. CSS controls the actual displacement.\n //\n // In 2D layout, `data-shift` is always undefined — the per-item\n // `style.transform` below opens the correct gap directly. Keeping\n // `data-shift` out of the 2D path prevents any author-provided\n // CSS rule like `[data-shift] { translate: 0 var(--sortable-shift) }`\n // from fighting with the computed transform.\n 'data-shift': (s) => {\n if (layout === '2d') return undefined\n const d = get(s).dragging\n if (!d || d.fromContainer !== containerId || d.toContainer !== containerId) return undefined\n if (d.id === id) return undefined\n if (d.startIndex === d.currentIndex) return undefined\n // Look up this item's live DOM index — see note on data-over.\n const snap = snapshots.get(containerId)\n const liveIndex = snap?.idToIndex.get(id) ?? index\n if (d.startIndex < d.currentIndex) {\n // Dragging down: items between start+1 and current shift up\n if (liveIndex > d.startIndex && liveIndex <= d.currentIndex) return 'up'\n } else {\n // Dragging up: items between current and start-1 shift down\n if (liveIndex >= d.currentIndex && liveIndex < d.startIndex) return 'down'\n }\n return undefined\n },\n // The dragged item follows the pointer. In 1D, translateY only; in\n // 2D, both axes. Non-dragged items in 2D between source and target\n // get a per-item translate computed from the snapshot — each item's\n // vector is `snapshot[newSlot] - snapshot[ownSlot]` so the gap\n // opens correctly regardless of row wrap. In 1D, non-dragged items\n // emit `undefined` here and rely on the consumer's CSS `data-shift`\n // rule.\n 'style.transform': (s) => {\n const d = get(s).dragging\n if (!d) return undefined\n const isDragged = d.id === id && d.fromContainer === containerId\n if (isDragged) {\n const deltaY = d.currentY - d.startY\n if (layout === '2d') {\n const deltaX = d.currentX - d.startX\n return `translate(${deltaX}px, ${deltaY}px)`\n }\n return `translateY(${deltaY}px)`\n }\n // Non-dragged items: per-item displacement in 2D only.\n if (layout !== '2d') return undefined\n if (d.fromContainer !== containerId || d.toContainer !== containerId) return undefined\n if (d.startIndex === d.currentIndex) return undefined\n const snap = snapshots.get(containerId)\n if (!snap) return undefined\n const liveIndex = snap.idToIndex.get(id)\n if (liveIndex === undefined) return undefined\n // Which slot this item should visually occupy while the drag\n // previews the reorder:\n // drag-down (start < current): items at liveIndex in\n // (start .. current] shift left-by-one in array order, so\n // they take the slot at liveIndex - 1.\n // drag-up (current < start): items at liveIndex in\n // [current .. start) shift right-by-one, take slot\n // liveIndex + 1.\n let targetSlot: number\n if (d.startIndex < d.currentIndex) {\n if (liveIndex <= d.startIndex || liveIndex > d.currentIndex) return undefined\n targetSlot = liveIndex - 1\n } else {\n if (liveIndex < d.currentIndex || liveIndex >= d.startIndex) return undefined\n targetSlot = liveIndex + 1\n }\n const own = snap.mids[liveIndex]\n const target = snap.mids[targetSlot]\n if (!own || !target) return undefined\n const dx = target.x - own.x\n const dy = target.y - own.y\n return `translate(${dx}px, ${dy}px)`\n },\n 'style.zIndex': (s) => {\n const d = get(s).dragging\n if (!d || d.id !== id || d.fromContainer !== containerId) return undefined\n return '10'\n },\n }),\n handle: (id, index) => ({\n 'data-scope': 'sortable',\n 'data-part': 'handle',\n role: 'button',\n tabIndex: 0,\n 'aria-grabbed': (s) => {\n const d = get(s).dragging\n return d?.id === id && d?.fromContainer === containerId\n },\n 'aria-label':\n 'Drag handle. Press space to pick up, arrow keys to move, space again to drop, escape to cancel.',\n onPointerDown: (e) => {\n e.preventDefault()\n const target = e.currentTarget as Element | null\n if (target && 'setPointerCapture' in target) {\n try {\n ;(target as Element & { setPointerCapture: (id: number) => void }).setPointerCapture(\n e.pointerId,\n )\n } catch {\n // Ignore — not all elements support pointer capture\n }\n }\n // Compute the CURRENT DOM index of this handle's item — the captured\n // `index` param is stale after a reorder (each() moves keyed nodes\n // without re-running render, so the closure's index is frozen at\n // initial mount). Walk up to find the containing item, then count its\n // position among sibling items.\n let currentIndex = index\n if (target) {\n const itemEl = (target as Element).closest<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"item\"]',\n )\n const rootEl = (target as Element).closest<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"root\"]',\n )\n if (itemEl && rootEl) {\n const items = rootEl.querySelectorAll<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"item\"]',\n )\n for (let i = 0; i < items.length; i++) {\n if (items[i] === itemEl) {\n currentIndex = i\n break\n }\n }\n }\n }\n // Snapshot positions BEFORE the drag starts, so subsequent pointermove\n // events can resolve the target index against stable (pre-transform)\n // positions. Otherwise items shifting via CSS would cause the target\n // to oscillate as elementFromPoint hits different items.\n snapshotAll()\n send({\n type: 'start',\n id,\n index: currentIndex,\n container: containerId,\n x: e.clientX,\n y: e.clientY,\n })\n },\n onKeyDown: (e) => {\n switch (e.key) {\n case ' ':\n case 'Enter':\n e.preventDefault()\n send({ type: 'toggleGrab', id, index, container: containerId })\n return\n case 'Escape':\n e.preventDefault()\n send({ type: 'cancel' })\n return\n case 'ArrowDown':\n case 'ArrowRight':\n e.preventDefault()\n send({ type: 'moveBy', delta: 1 })\n return\n case 'ArrowUp':\n case 'ArrowLeft':\n e.preventDefault()\n send({ type: 'moveBy', delta: -1 })\n return\n }\n },\n }),\n }\n}\n\n// ── Reorder utility ────────────────────────────────────────────\n\n/**\n * Move an item in an array from one index to another, returning a new array.\n * Out-of-range indices are clamped to array bounds.\n */\nexport function reorder<T>(arr: readonly T[], from: number, to: number): T[] {\n const len = arr.length\n if (len === 0) return []\n const f = Math.max(0, Math.min(len - 1, from))\n const t = Math.max(0, Math.min(len - 1, to))\n if (f === t) return arr.slice()\n const result = arr.slice()\n const [item] = result.splice(f, 1)\n result.splice(t, 0, item)\n return result\n}\n\nexport const sortable = { init, update, connect, reorder }\n"]}
1
+ {"version":3,"file":"sortable.js","sourceRoot":"","sources":["../../src/components/sortable.ts"],"names":[],"mappings":"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","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send } from '@llui/dom'\n\n/**\n * Sortable — pointer-based reorderable list.\n *\n * State machine tracks the currently-dragged item and where it's hovering.\n * The app owns the actual array; listen for `drop` and use `reorder(arr, from, to)`\n * to compute the new order, or watch `currentIndex` during drag for live preview.\n *\n * ```ts\n * type State = { items: string[]; sort: SortableState }\n *\n * update: (state, msg) => {\n * switch (msg.type) {\n * case 'sort':\n * return [{ ...state, sort: sortable.update(state.sort, msg.msg)[0] }, []]\n * case 'drop': {\n * const d = state.sort.dragging\n * if (!d) return [state, []]\n * return [{ ...state, items: reorder(state.items, d.startIndex, d.currentIndex) }, []]\n * }\n * }\n * }\n *\n * view: ({ send, each, text }) => {\n * const s = sortable.connect<State>(s => s.sort, m => send({ type: 'sort', msg: m }), { id: 'list' })\n * return [\n * ul({ ...s.root, class: 'list' }, [\n * ...each({\n * items: (st) => st.items,\n * key: (x) => x,\n * render: ({ item, index }) => [\n * li({ ...s.item(item(), index()), class: 'item' }, [\n * div({ ...s.handle(item(), index()), class: 'handle' }, [text('⋮⋮')]),\n * text(item),\n * ]),\n * ],\n * }),\n * ]),\n * ]\n * }\n * ```\n *\n * Hook up pointermove/pointerup at the root (attachPointerHandlers) — or\n * wire them directly via `onPointerMove` / `onPointerUp` on the root part.\n */\n\nexport interface DragState {\n id: string\n startIndex: number\n currentIndex: number\n /**\n * Container the drag originated from. Defaults to the connect's `id` for\n * single-container sortables. Set when multiple sortables share state.\n */\n fromContainer: string\n /**\n * Container the pointer is currently over. Same as `fromContainer` for\n * single-container sortables. Differs when dragging across containers.\n */\n toContainer: string\n /**\n * Pointer X at drag start (viewport coordinates). Used by 2D layouts\n * to compute `deltaX = currentX - startX` alongside the Y axis. In 1D\n * layouts X is tracked but ignored by the renderer.\n */\n startX: number\n /**\n * Pointer Y at drag start (viewport coordinates). Used by CSS / the\n * library's `style.transform` binding to make the dragged item follow\n * the pointer.\n */\n startY: number\n /**\n * Current pointer X (viewport coordinates). `deltaX = currentX - startX`.\n */\n currentX: number\n /**\n * Current pointer Y (viewport coordinates). `deltaY = currentY - startY`.\n */\n currentY: number\n}\n\nexport interface SortableState {\n dragging: DragState | null\n}\n\nexport type SortableMsg =\n /** @humanOnly */\n | { type: 'start'; id: string; index: number; container: string; x: number; y: number }\n /** @humanOnly */\n | { type: 'move'; index: number; container: string; x: number; y: number }\n /** @humanOnly */\n | { type: 'drop' }\n /** @humanOnly */\n | { type: 'cancel' }\n /** @humanOnly */\n | { type: 'toggleGrab'; id: string; index: number; container: string }\n /** @humanOnly */\n | { type: 'moveBy'; delta: number }\n\nexport function init(): SortableState {\n return { dragging: null }\n}\n\nexport function update(state: SortableState, msg: SortableMsg): [SortableState, never[]] {\n switch (msg.type) {\n case 'start':\n return [\n {\n dragging: {\n id: msg.id,\n startIndex: msg.index,\n currentIndex: msg.index,\n fromContainer: msg.container,\n toContainer: msg.container,\n startX: msg.x,\n startY: msg.y,\n currentX: msg.x,\n currentY: msg.y,\n },\n },\n [],\n ]\n case 'move': {\n if (!state.dragging) return [state, []]\n if (\n state.dragging.currentIndex === msg.index &&\n state.dragging.toContainer === msg.container &&\n state.dragging.currentX === msg.x &&\n state.dragging.currentY === msg.y\n ) {\n return [state, []]\n }\n return [\n {\n dragging: {\n ...state.dragging,\n currentIndex: msg.index,\n toContainer: msg.container,\n currentX: msg.x,\n currentY: msg.y,\n },\n },\n [],\n ]\n }\n case 'drop':\n return state.dragging ? [{ dragging: null }, []] : [state, []]\n case 'cancel':\n return state.dragging ? [{ dragging: null }, []] : [state, []]\n case 'toggleGrab':\n if (state.dragging) {\n // Already dragging — drop at current position\n return [{ dragging: null }, []]\n }\n // Pick up (keyboard — no pointer position)\n return [\n {\n dragging: {\n id: msg.id,\n startIndex: msg.index,\n currentIndex: msg.index,\n fromContainer: msg.container,\n toContainer: msg.container,\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n },\n },\n [],\n ]\n case 'moveBy': {\n if (!state.dragging) return [state, []]\n const next = Math.max(0, state.dragging.currentIndex + msg.delta)\n if (next === state.dragging.currentIndex) return [state, []]\n return [{ dragging: { ...state.dragging, currentIndex: next } }, []]\n }\n }\n}\n\nexport interface SortableParts<S> {\n root: {\n 'data-scope': 'sortable'\n 'data-part': 'root'\n 'data-container-id': string\n 'data-dragging': (s: S) => '' | undefined\n onPointerMove: (e: PointerEvent) => void\n onPointerUp: (e: PointerEvent) => void\n onPointerCancel: (e: PointerEvent) => void\n }\n item: (\n id: string,\n index: number,\n ) => {\n 'data-scope': 'sortable'\n 'data-part': 'item'\n 'data-index': string\n 'data-id': string\n 'data-dragging': (s: S) => '' | undefined\n 'data-over': (s: S) => '' | undefined\n 'data-shift': (s: S) => 'up' | 'down' | undefined\n 'style.transform': (s: S) => string | undefined\n 'style.zIndex': (s: S) => string | undefined\n }\n handle: (\n id: string,\n index: number,\n ) => {\n 'data-scope': 'sortable'\n 'data-part': 'handle'\n role: 'button'\n tabIndex: 0\n 'aria-grabbed': (s: S) => boolean\n 'aria-label': string\n onPointerDown: (e: PointerEvent) => void\n onKeyDown: (e: KeyboardEvent) => void\n }\n}\n\nexport interface ConnectOptions {\n id: string\n /**\n * Drag-target selection + render strategy.\n *\n * - `'1d'` (default) — single-axis, Y-only. `findTargetAt` picks\n * by vertical distance; `style.transform` on the dragged item\n * is `translateY(deltaY)`; non-dragged items between source\n * and target emit `data-shift: 'up' | 'down'` so CSS can\n * animate them via `translateY(±var(--sortable-shift))`.\n * Correct for vertical lists; fails for 2D layouts (flex-wrap,\n * grid) because same-row items collapse to the same midpoint\n * distance.\n *\n * - `'2d'` — Euclidean target selection against 2D midpoints;\n * dragged item follows both X and Y (`translate(dx, dy)`);\n * non-dragged items between source and target get a per-item\n * `style.transform = translate(deltaFromSnapshot)` that opens\n * the correct gap regardless of row boundaries. `data-shift`\n * is always `undefined` in 2D so CSS `translateY(var(--...))`\n * rules don't conflict with the per-item transform.\n *\n * Keyboard navigation (`moveBy`) stays linear-array in both modes —\n * arrow keys step through the array indices regardless of visual\n * row, because that's what screen readers announce and what the\n * underlying data order actually is.\n */\n layout?: '1d' | '2d'\n}\n\nexport function connect<S>(\n get: (s: S) => SortableState,\n send: Send<SortableMsg>,\n opts: ConnectOptions,\n): SortableParts<S> {\n // The connect's `id` doubles as the cross-container identifier\n const containerId = opts.id\n const layout = opts.layout ?? '1d'\n\n // Snapshots taken at drag start — stable throughout the drag so computing\n // the target index is not affected by items visually shifting via CSS.\n // Map: container-id → array of midpoint {x, y} pairs for each item's\n // original bounding rect (sorted by index). The handler records this on\n // pointerdown. Always 2D internally; 1D layout's findTargetAt ignores X.\n interface Snapshot {\n mids: Array<{ x: number; y: number }>\n // id → current DOM index at drag start. Used by data-shift / per-item\n // transform to look up an item's live position, since the `index`\n // captured at render time is frozen and goes stale after each()\n // reconciles a reorder.\n idToIndex: Map<string, number>\n }\n const snapshots = new Map<string, Snapshot>()\n\n function snapshotContainer(rootEl: HTMLElement, cid: string): void {\n const items = rootEl.querySelectorAll<HTMLElement>('[data-scope=\"sortable\"][data-part=\"item\"]')\n // Read rects once — they're pre-transform (no drag shifts yet)\n const mids: Array<{ x: number; y: number }> = []\n const idToIndex = new Map<string, number>()\n items.forEach((item, i) => {\n const r = item.getBoundingClientRect()\n mids.push({ x: r.left + r.width / 2, y: r.top + r.height / 2 })\n const itemId = item.dataset.id\n if (itemId !== undefined) idToIndex.set(itemId, i)\n })\n snapshots.set(cid, { mids, idToIndex })\n }\n\n function snapshotAll(): void {\n const roots = document.querySelectorAll<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"root\"]',\n )\n for (const root of roots) {\n const cid = root.dataset.containerId\n if (cid) snapshotContainer(root, cid)\n }\n }\n\n // Find the target index under the pointer using the drag-start snapshot.\n // 1D mode: picks by Y-only distance (original behavior). 2D mode: picks\n // by Euclidean distance over {x, y} midpoints — required for flex-wrap\n // / grid layouts where multiple items share a row and collapse to the\n // same Y value. Both modes are stable against items being visually\n // transformed during the drag because midpoints are taken pre-transform.\n function findTargetAt(e: PointerEvent): { container: string; index: number } | null {\n const roots = document.querySelectorAll<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"root\"]',\n )\n for (const root of roots) {\n const r = root.getBoundingClientRect()\n if (e.clientX < r.left || e.clientX > r.right) continue\n if (e.clientY < r.top || e.clientY > r.bottom) continue\n const cid = root.dataset.containerId\n if (!cid) continue\n const snap = snapshots.get(cid)\n if (!snap || snap.mids.length === 0) return { container: cid, index: 0 }\n const mids = snap.mids\n let bestIdx = 0\n if (layout === '2d') {\n // Euclidean (squared — monotonic with distance, saves a sqrt).\n const dx0 = e.clientX - mids[0]!.x\n const dy0 = e.clientY - mids[0]!.y\n let bestDist = dx0 * dx0 + dy0 * dy0\n for (let i = 1; i < mids.length; i++) {\n const dx = e.clientX - mids[i]!.x\n const dy = e.clientY - mids[i]!.y\n const d = dx * dx + dy * dy\n if (d < bestDist) {\n bestDist = d\n bestIdx = i\n }\n }\n } else {\n // 1D — Y-only distance. Preserves the original behavior for\n // vertical lists; same-row items in a flex-wrap would tie and\n // the first match wins, which is the bug that motivates 2D.\n let bestDist = Math.abs(e.clientY - mids[0]!.y)\n for (let i = 1; i < mids.length; i++) {\n const d = Math.abs(e.clientY - mids[i]!.y)\n if (d < bestDist) {\n bestDist = d\n bestIdx = i\n }\n }\n }\n return { container: cid, index: bestIdx }\n }\n return null\n }\n\n return {\n root: {\n 'data-scope': 'sortable',\n 'data-part': 'root',\n 'data-container-id': containerId,\n 'data-dragging': (s) => (get(s).dragging ? '' : undefined),\n onPointerMove: tagSend(send, ['move'], (e) => {\n if (!e.buttons) return\n const hit = findTargetAt(e)\n if (hit !== null)\n send({\n type: 'move',\n index: hit.index,\n container: hit.container,\n x: e.clientX,\n y: e.clientY,\n })\n }),\n onPointerUp: tagSend(send, ['drop'], () => {\n snapshots.clear()\n send({ type: 'drop' })\n }),\n onPointerCancel: tagSend(send, ['cancel'], () => {\n snapshots.clear()\n send({ type: 'cancel' })\n }),\n },\n item: (id, index) => ({\n 'data-scope': 'sortable',\n 'data-part': 'item',\n 'data-index': String(index),\n 'data-id': id,\n 'data-dragging': (s) => {\n const d = get(s).dragging\n return d?.id === id && d?.fromContainer === containerId ? '' : undefined\n },\n 'data-over': (s) => {\n const d = get(s).dragging\n if (!d || d.toContainer !== containerId) return undefined\n // Look up this item's CURRENT DOM index via the drag-start snapshot.\n // The `index` closed over here is frozen at initial render and goes\n // stale after each() reconciles a reorder.\n const snap = snapshots.get(containerId)\n const liveIndex = snap?.idToIndex.get(id) ?? index\n return d.currentIndex === liveIndex ? '' : undefined\n },\n // Shift direction for items BETWEEN the source and target (excluding the\n // dragged item itself). 'down' = item should translate down to make room;\n // 'up' = item should translate up. CSS controls the actual displacement.\n //\n // In 2D layout, `data-shift` is always undefined — the per-item\n // `style.transform` below opens the correct gap directly. Keeping\n // `data-shift` out of the 2D path prevents any author-provided\n // CSS rule like `[data-shift] { translate: 0 var(--sortable-shift) }`\n // from fighting with the computed transform.\n 'data-shift': (s) => {\n if (layout === '2d') return undefined\n const d = get(s).dragging\n if (!d || d.fromContainer !== containerId || d.toContainer !== containerId) return undefined\n if (d.id === id) return undefined\n if (d.startIndex === d.currentIndex) return undefined\n // Look up this item's live DOM index — see note on data-over.\n const snap = snapshots.get(containerId)\n const liveIndex = snap?.idToIndex.get(id) ?? index\n if (d.startIndex < d.currentIndex) {\n // Dragging down: items between start+1 and current shift up\n if (liveIndex > d.startIndex && liveIndex <= d.currentIndex) return 'up'\n } else {\n // Dragging up: items between current and start-1 shift down\n if (liveIndex >= d.currentIndex && liveIndex < d.startIndex) return 'down'\n }\n return undefined\n },\n // The dragged item follows the pointer. In 1D, translateY only; in\n // 2D, both axes. Non-dragged items in 2D between source and target\n // get a per-item translate computed from the snapshot — each item's\n // vector is `snapshot[newSlot] - snapshot[ownSlot]` so the gap\n // opens correctly regardless of row wrap. In 1D, non-dragged items\n // emit `undefined` here and rely on the consumer's CSS `data-shift`\n // rule.\n 'style.transform': (s) => {\n const d = get(s).dragging\n if (!d) return undefined\n const isDragged = d.id === id && d.fromContainer === containerId\n if (isDragged) {\n const deltaY = d.currentY - d.startY\n if (layout === '2d') {\n const deltaX = d.currentX - d.startX\n return `translate(${deltaX}px, ${deltaY}px)`\n }\n return `translateY(${deltaY}px)`\n }\n // Non-dragged items: per-item displacement in 2D only.\n if (layout !== '2d') return undefined\n if (d.fromContainer !== containerId || d.toContainer !== containerId) return undefined\n if (d.startIndex === d.currentIndex) return undefined\n const snap = snapshots.get(containerId)\n if (!snap) return undefined\n const liveIndex = snap.idToIndex.get(id)\n if (liveIndex === undefined) return undefined\n // Which slot this item should visually occupy while the drag\n // previews the reorder:\n // drag-down (start < current): items at liveIndex in\n // (start .. current] shift left-by-one in array order, so\n // they take the slot at liveIndex - 1.\n // drag-up (current < start): items at liveIndex in\n // [current .. start) shift right-by-one, take slot\n // liveIndex + 1.\n let targetSlot: number\n if (d.startIndex < d.currentIndex) {\n if (liveIndex <= d.startIndex || liveIndex > d.currentIndex) return undefined\n targetSlot = liveIndex - 1\n } else {\n if (liveIndex < d.currentIndex || liveIndex >= d.startIndex) return undefined\n targetSlot = liveIndex + 1\n }\n const own = snap.mids[liveIndex]\n const target = snap.mids[targetSlot]\n if (!own || !target) return undefined\n const dx = target.x - own.x\n const dy = target.y - own.y\n return `translate(${dx}px, ${dy}px)`\n },\n 'style.zIndex': (s) => {\n const d = get(s).dragging\n if (!d || d.id !== id || d.fromContainer !== containerId) return undefined\n return '10'\n },\n }),\n handle: (id, index) => ({\n 'data-scope': 'sortable',\n 'data-part': 'handle',\n role: 'button',\n tabIndex: 0,\n 'aria-grabbed': (s) => {\n const d = get(s).dragging\n return d?.id === id && d?.fromContainer === containerId\n },\n 'aria-label':\n 'Drag handle. Press space to pick up, arrow keys to move, space again to drop, escape to cancel.',\n onPointerDown: tagSend(send, ['start'], (e) => {\n e.preventDefault()\n const target = e.currentTarget as Element | null\n if (target && 'setPointerCapture' in target) {\n try {\n ;(target as Element & { setPointerCapture: (id: number) => void }).setPointerCapture(\n e.pointerId,\n )\n } catch {\n // Ignore — not all elements support pointer capture\n }\n }\n // Compute the CURRENT DOM index of this handle's item — the captured\n // `index` param is stale after a reorder (each() moves keyed nodes\n // without re-running render, so the closure's index is frozen at\n // initial mount). Walk up to find the containing item, then count its\n // position among sibling items.\n let currentIndex = index\n if (target) {\n const itemEl = (target as Element).closest<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"item\"]',\n )\n const rootEl = (target as Element).closest<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"root\"]',\n )\n if (itemEl && rootEl) {\n const items = rootEl.querySelectorAll<HTMLElement>(\n '[data-scope=\"sortable\"][data-part=\"item\"]',\n )\n for (let i = 0; i < items.length; i++) {\n if (items[i] === itemEl) {\n currentIndex = i\n break\n }\n }\n }\n }\n // Snapshot positions BEFORE the drag starts, so subsequent pointermove\n // events can resolve the target index against stable (pre-transform)\n // positions. Otherwise items shifting via CSS would cause the target\n // to oscillate as elementFromPoint hits different items.\n snapshotAll()\n send({\n type: 'start',\n id,\n index: currentIndex,\n container: containerId,\n x: e.clientX,\n y: e.clientY,\n })\n }),\n onKeyDown: tagSend(send, ['toggleGrab', 'cancel', 'moveBy'], (e) => {\n switch (e.key) {\n case ' ':\n case 'Enter':\n e.preventDefault()\n send({ type: 'toggleGrab', id, index, container: containerId })\n return\n case 'Escape':\n e.preventDefault()\n send({ type: 'cancel' })\n return\n case 'ArrowDown':\n case 'ArrowRight':\n e.preventDefault()\n send({ type: 'moveBy', delta: 1 })\n return\n case 'ArrowUp':\n case 'ArrowLeft':\n e.preventDefault()\n send({ type: 'moveBy', delta: -1 })\n return\n }\n }),\n }),\n }\n}\n\n// ── Reorder utility ────────────────────────────────────────────\n\n/**\n * Move an item in an array from one index to another, returning a new array.\n * Out-of-range indices are clamped to array bounds.\n */\nexport function reorder<T>(arr: readonly T[], from: number, to: number): T[] {\n const len = arr.length\n if (len === 0) return []\n const f = Math.max(0, Math.min(len - 1, from))\n const t = Math.max(0, Math.min(len - 1, to))\n if (f === t) return arr.slice()\n const result = arr.slice()\n const [item] = result.splice(f, 1)\n result.splice(t, 0, item)\n return result\n}\n\nexport const sortable = { init, update, connect, reorder }\n"]}
@@ -14,22 +14,36 @@ export interface SplitterState {
14
14
  disabled: boolean;
15
15
  dragging: boolean;
16
16
  }
17
- export type SplitterMsg = {
17
+ export type SplitterMsg =
18
+ /** @intent("Set the splitter handle position (0–100, clamped to min/max)") */
19
+ {
18
20
  type: 'setPosition';
19
21
  position: number;
20
- } | {
22
+ }
23
+ /** @intent("Move the handle by step (or step × multiplier) toward max") */
24
+ | {
21
25
  type: 'increment';
22
26
  multiplier?: number;
23
- } | {
27
+ }
28
+ /** @intent("Move the handle by step (or step × multiplier) toward min") */
29
+ | {
24
30
  type: 'decrement';
25
31
  multiplier?: number;
26
- } | {
32
+ }
33
+ /** @intent("Snap the handle to its minimum position") */
34
+ | {
27
35
  type: 'toMin';
28
- } | {
36
+ }
37
+ /** @intent("Snap the handle to its maximum position") */
38
+ | {
29
39
  type: 'toMax';
30
- } | {
40
+ }
41
+ /** @humanOnly */
42
+ | {
31
43
  type: 'startDrag';
32
- } | {
44
+ }
45
+ /** @humanOnly */
46
+ | {
33
47
  type: 'endDrag';
34
48
  };
35
49
  export interface SplitterInit {
@@ -1 +1 @@
1
- {"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../src/components/splitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../src/components/splitter.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { tagSend } from '@llui/dom';
1
2
  import { flipArrow } from '../utils/direction.js';
2
3
  export function init(opts = {}) {
3
4
  return {
@@ -80,7 +81,7 @@ export function connect(get, send) {
80
81
  'data-part': 'resize-trigger',
81
82
  'data-orientation': (s) => get(s).orientation,
82
83
  tabIndex: (s) => (get(s).disabled ? -1 : 0),
83
- onKeyDown: (e) => {
84
+ onKeyDown: tagSend(send, ['increment', 'decrement', 'toMin', 'toMax'], (e) => {
84
85
  const key = flipArrow(e.key, e.currentTarget);
85
86
  switch (key) {
86
87
  case 'ArrowRight':
@@ -110,11 +111,11 @@ export function connect(get, send) {
110
111
  send({ type: 'toMax' });
111
112
  return;
112
113
  }
113
- },
114
- onPointerDown: (e) => {
114
+ }),
115
+ onPointerDown: tagSend(send, ['startDrag'], (e) => {
115
116
  e.preventDefault();
116
117
  send({ type: 'startDrag' });
117
- },
118
+ }),
118
119
  },
119
120
  };
120
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"splitter.js","sourceRoot":"","sources":["../../src/components/splitter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\n\n/**\n * Splitter — resizable panes with a draggable handle. The handle's position\n * is expressed as a percentage of the container, stored as a number 0..100.\n * Supports keyboard arrow resize with a configurable step.\n */\n\nexport type Orientation = 'horizontal' | 'vertical'\n\nexport interface SplitterState {\n position: number\n min: number\n max: number\n step: number\n orientation: Orientation\n disabled: boolean\n dragging: boolean\n}\n\nexport type SplitterMsg =\n | { type: 'setPosition'; position: number }\n | { type: 'increment'; multiplier?: number }\n | { type: 'decrement'; multiplier?: number }\n | { type: 'toMin' }\n | { type: 'toMax' }\n | { type: 'startDrag' }\n | { type: 'endDrag' }\n\nexport interface SplitterInit {\n position?: number\n min?: number\n max?: number\n step?: number\n orientation?: Orientation\n disabled?: boolean\n}\n\nexport function init(opts: SplitterInit = {}): SplitterState {\n return {\n position: opts.position ?? 50,\n min: opts.min ?? 0,\n max: opts.max ?? 100,\n step: opts.step ?? 1,\n orientation: opts.orientation ?? 'horizontal',\n disabled: opts.disabled ?? false,\n dragging: false,\n }\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n))\n}\n\nexport function update(state: SplitterState, msg: SplitterMsg): [SplitterState, never[]] {\n if (state.disabled && msg.type !== 'endDrag') return [state, []]\n switch (msg.type) {\n case 'setPosition':\n return [{ ...state, position: clamp(msg.position, state.min, state.max) }, []]\n case 'increment': {\n const delta = state.step * (msg.multiplier ?? 1)\n return [{ ...state, position: clamp(state.position + delta, state.min, state.max) }, []]\n }\n case 'decrement': {\n const delta = state.step * (msg.multiplier ?? 1)\n return [{ ...state, position: clamp(state.position - delta, state.min, state.max) }, []]\n }\n case 'toMin':\n return [{ ...state, position: state.min }, []]\n case 'toMax':\n return [{ ...state, position: state.max }, []]\n case 'startDrag':\n return [{ ...state, dragging: true }, []]\n case 'endDrag':\n return [{ ...state, dragging: false }, []]\n }\n}\n\n/** Compute position percentage from a pointer event within a container rect. */\nexport function positionFromPoint(\n state: SplitterState,\n rect: DOMRect,\n clientX: number,\n clientY: number,\n): number {\n const pct =\n state.orientation === 'horizontal'\n ? ((clientX - rect.left) / rect.width) * 100\n : ((clientY - rect.top) / rect.height) * 100\n return clamp(pct, state.min, state.max)\n}\n\nexport interface SplitterParts<S> {\n root: {\n 'data-scope': 'splitter'\n 'data-part': 'root'\n 'data-orientation': (s: S) => Orientation\n 'data-disabled': (s: S) => '' | undefined\n 'data-dragging': (s: S) => '' | undefined\n }\n primaryPanel: {\n 'data-scope': 'splitter'\n 'data-part': 'primary-panel'\n style: (s: S) => string\n }\n secondaryPanel: {\n 'data-scope': 'splitter'\n 'data-part': 'secondary-panel'\n style: (s: S) => string\n }\n resizeTrigger: {\n role: 'separator'\n 'aria-orientation': (s: S) => Orientation\n 'aria-valuemin': (s: S) => number\n 'aria-valuemax': (s: S) => number\n 'aria-valuenow': (s: S) => number\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-scope': 'splitter'\n 'data-part': 'resize-trigger'\n 'data-orientation': (s: S) => Orientation\n tabIndex: (s: S) => number\n onKeyDown: (e: KeyboardEvent) => void\n onPointerDown: (e: PointerEvent) => void\n }\n}\n\nexport function connect<S>(\n get: (s: S) => SplitterState,\n send: Send<SplitterMsg>,\n): SplitterParts<S> {\n const sizeProp = (s: S, inverted: boolean): string => {\n const pos = get(s).position\n const axis = get(s).orientation === 'horizontal' ? 'width' : 'height'\n const pct = inverted ? 100 - pos : pos\n return `${axis}:${pct}%;`\n }\n\n return {\n root: {\n 'data-scope': 'splitter',\n 'data-part': 'root',\n 'data-orientation': (s) => get(s).orientation,\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-dragging': (s) => (get(s).dragging ? '' : undefined),\n },\n primaryPanel: {\n 'data-scope': 'splitter',\n 'data-part': 'primary-panel',\n style: (s) => sizeProp(s, false),\n },\n secondaryPanel: {\n 'data-scope': 'splitter',\n 'data-part': 'secondary-panel',\n style: (s) => sizeProp(s, true),\n },\n resizeTrigger: {\n role: 'separator',\n 'aria-orientation': (s) => get(s).orientation,\n 'aria-valuemin': (s) => get(s).min,\n 'aria-valuemax': (s) => get(s).max,\n 'aria-valuenow': (s) => get(s).position,\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'data-scope': 'splitter',\n 'data-part': 'resize-trigger',\n 'data-orientation': (s) => get(s).orientation,\n tabIndex: (s) => (get(s).disabled ? -1 : 0),\n onKeyDown: (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowRight':\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'increment' })\n return\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'decrement' })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'increment', multiplier: 10 })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'decrement', multiplier: 10 })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'toMin' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'toMax' })\n return\n }\n },\n onPointerDown: (e) => {\n e.preventDefault()\n send({ type: 'startDrag' })\n },\n },\n }\n}\n\nexport const splitter = { init, update, connect, positionFromPoint }\n"]}
1
+ {"version":3,"file":"splitter.js","sourceRoot":"","sources":["../../src/components/splitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { tagSend } from '@llui/dom'\nimport type { Send } from '@llui/dom'\nimport { flipArrow } from '../utils/direction.js'\n\n/**\n * Splitter — resizable panes with a draggable handle. The handle's position\n * is expressed as a percentage of the container, stored as a number 0..100.\n * Supports keyboard arrow resize with a configurable step.\n */\n\nexport type Orientation = 'horizontal' | 'vertical'\n\nexport interface SplitterState {\n position: number\n min: number\n max: number\n step: number\n orientation: Orientation\n disabled: boolean\n dragging: boolean\n}\n\nexport type SplitterMsg =\n /** @intent(\"Set the splitter handle position (0–100, clamped to min/max)\") */\n | { type: 'setPosition'; position: number }\n /** @intent(\"Move the handle by step (or step × multiplier) toward max\") */\n | { type: 'increment'; multiplier?: number }\n /** @intent(\"Move the handle by step (or step × multiplier) toward min\") */\n | { type: 'decrement'; multiplier?: number }\n /** @intent(\"Snap the handle to its minimum position\") */\n | { type: 'toMin' }\n /** @intent(\"Snap the handle to its maximum position\") */\n | { type: 'toMax' }\n /** @humanOnly */\n | { type: 'startDrag' }\n /** @humanOnly */\n | { type: 'endDrag' }\n\nexport interface SplitterInit {\n position?: number\n min?: number\n max?: number\n step?: number\n orientation?: Orientation\n disabled?: boolean\n}\n\nexport function init(opts: SplitterInit = {}): SplitterState {\n return {\n position: opts.position ?? 50,\n min: opts.min ?? 0,\n max: opts.max ?? 100,\n step: opts.step ?? 1,\n orientation: opts.orientation ?? 'horizontal',\n disabled: opts.disabled ?? false,\n dragging: false,\n }\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n))\n}\n\nexport function update(state: SplitterState, msg: SplitterMsg): [SplitterState, never[]] {\n if (state.disabled && msg.type !== 'endDrag') return [state, []]\n switch (msg.type) {\n case 'setPosition':\n return [{ ...state, position: clamp(msg.position, state.min, state.max) }, []]\n case 'increment': {\n const delta = state.step * (msg.multiplier ?? 1)\n return [{ ...state, position: clamp(state.position + delta, state.min, state.max) }, []]\n }\n case 'decrement': {\n const delta = state.step * (msg.multiplier ?? 1)\n return [{ ...state, position: clamp(state.position - delta, state.min, state.max) }, []]\n }\n case 'toMin':\n return [{ ...state, position: state.min }, []]\n case 'toMax':\n return [{ ...state, position: state.max }, []]\n case 'startDrag':\n return [{ ...state, dragging: true }, []]\n case 'endDrag':\n return [{ ...state, dragging: false }, []]\n }\n}\n\n/** Compute position percentage from a pointer event within a container rect. */\nexport function positionFromPoint(\n state: SplitterState,\n rect: DOMRect,\n clientX: number,\n clientY: number,\n): number {\n const pct =\n state.orientation === 'horizontal'\n ? ((clientX - rect.left) / rect.width) * 100\n : ((clientY - rect.top) / rect.height) * 100\n return clamp(pct, state.min, state.max)\n}\n\nexport interface SplitterParts<S> {\n root: {\n 'data-scope': 'splitter'\n 'data-part': 'root'\n 'data-orientation': (s: S) => Orientation\n 'data-disabled': (s: S) => '' | undefined\n 'data-dragging': (s: S) => '' | undefined\n }\n primaryPanel: {\n 'data-scope': 'splitter'\n 'data-part': 'primary-panel'\n style: (s: S) => string\n }\n secondaryPanel: {\n 'data-scope': 'splitter'\n 'data-part': 'secondary-panel'\n style: (s: S) => string\n }\n resizeTrigger: {\n role: 'separator'\n 'aria-orientation': (s: S) => Orientation\n 'aria-valuemin': (s: S) => number\n 'aria-valuemax': (s: S) => number\n 'aria-valuenow': (s: S) => number\n 'aria-disabled': (s: S) => 'true' | undefined\n 'data-scope': 'splitter'\n 'data-part': 'resize-trigger'\n 'data-orientation': (s: S) => Orientation\n tabIndex: (s: S) => number\n onKeyDown: (e: KeyboardEvent) => void\n onPointerDown: (e: PointerEvent) => void\n }\n}\n\nexport function connect<S>(\n get: (s: S) => SplitterState,\n send: Send<SplitterMsg>,\n): SplitterParts<S> {\n const sizeProp = (s: S, inverted: boolean): string => {\n const pos = get(s).position\n const axis = get(s).orientation === 'horizontal' ? 'width' : 'height'\n const pct = inverted ? 100 - pos : pos\n return `${axis}:${pct}%;`\n }\n\n return {\n root: {\n 'data-scope': 'splitter',\n 'data-part': 'root',\n 'data-orientation': (s) => get(s).orientation,\n 'data-disabled': (s) => (get(s).disabled ? '' : undefined),\n 'data-dragging': (s) => (get(s).dragging ? '' : undefined),\n },\n primaryPanel: {\n 'data-scope': 'splitter',\n 'data-part': 'primary-panel',\n style: (s) => sizeProp(s, false),\n },\n secondaryPanel: {\n 'data-scope': 'splitter',\n 'data-part': 'secondary-panel',\n style: (s) => sizeProp(s, true),\n },\n resizeTrigger: {\n role: 'separator',\n 'aria-orientation': (s) => get(s).orientation,\n 'aria-valuemin': (s) => get(s).min,\n 'aria-valuemax': (s) => get(s).max,\n 'aria-valuenow': (s) => get(s).position,\n 'aria-disabled': (s) => (get(s).disabled ? 'true' : undefined),\n 'data-scope': 'splitter',\n 'data-part': 'resize-trigger',\n 'data-orientation': (s) => get(s).orientation,\n tabIndex: (s) => (get(s).disabled ? -1 : 0),\n onKeyDown: tagSend(send, ['increment', 'decrement', 'toMin', 'toMax'], (e) => {\n const key = flipArrow(e.key, e.currentTarget as Element)\n switch (key) {\n case 'ArrowRight':\n case 'ArrowDown':\n e.preventDefault()\n send({ type: 'increment' })\n return\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault()\n send({ type: 'decrement' })\n return\n case 'PageUp':\n e.preventDefault()\n send({ type: 'increment', multiplier: 10 })\n return\n case 'PageDown':\n e.preventDefault()\n send({ type: 'decrement', multiplier: 10 })\n return\n case 'Home':\n e.preventDefault()\n send({ type: 'toMin' })\n return\n case 'End':\n e.preventDefault()\n send({ type: 'toMax' })\n return\n }\n }),\n onPointerDown: tagSend(send, ['startDrag'], (e) => {\n e.preventDefault()\n send({ type: 'startDrag' })\n }),\n },\n }\n}\n\nexport const splitter = { init, update, connect, positionFromPoint }\n"]}