@neut/ui 0.0.17 → 0.0.18

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 (707) hide show
  1. package/dist/components/accordion/Accordion/Accordion.js +3 -0
  2. package/dist/components/accordion/Accordion/Accordion.js.map +1 -1
  3. package/dist/components/accordion/AccordionContent/AccordionContent.js +27 -21
  4. package/dist/components/accordion/AccordionContent/AccordionContent.js.map +1 -1
  5. package/dist/components/accordion/AccordionItem/AccordionItem.js +3 -0
  6. package/dist/components/accordion/AccordionItem/AccordionItem.js.map +1 -1
  7. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js +19 -18
  8. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js.map +1 -1
  9. package/dist/components/alert/Alert/Alert.js +8 -3
  10. package/dist/components/alert/Alert/Alert.js.map +1 -1
  11. package/dist/components/alert/AlertAction/AlertAction.js +8 -3
  12. package/dist/components/alert/AlertAction/AlertAction.js.map +1 -1
  13. package/dist/components/alert/AlertDescription/AlertDescription.js +8 -3
  14. package/dist/components/alert/AlertDescription/AlertDescription.js.map +1 -1
  15. package/dist/components/alert/AlertTitle/AlertTitle.js +8 -3
  16. package/dist/components/alert/AlertTitle/AlertTitle.js.map +1 -1
  17. package/dist/components/alert-dialog/AlertDialog/AlertDialog.d.ts +3 -1
  18. package/dist/components/alert-dialog/AlertDialog/AlertDialog.js +6 -1
  19. package/dist/components/alert-dialog/AlertDialog/AlertDialog.js.map +1 -1
  20. package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js +9 -7
  21. package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js.map +1 -1
  22. package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.types.d.ts +9 -3
  23. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js +8 -3
  24. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js.map +1 -1
  25. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js +8 -3
  26. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js.map +1 -1
  27. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js +8 -3
  28. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js.map +1 -1
  29. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js +8 -3
  30. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js.map +1 -1
  31. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js +8 -3
  32. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js.map +1 -1
  33. package/dist/components/aspect-ratio/AspectRatio.js +3 -0
  34. package/dist/components/aspect-ratio/AspectRatio.js.map +1 -1
  35. package/dist/components/attachment/AttachmentTrigger/AttachmentTrigger.js +15 -7
  36. package/dist/components/attachment/AttachmentTrigger/AttachmentTrigger.js.map +1 -1
  37. package/dist/components/avatar/Avatar/Avatar.context.d.ts +7 -0
  38. package/dist/components/avatar/Avatar/Avatar.context.js +1 -1
  39. package/dist/components/avatar/Avatar/Avatar.context.js.map +1 -1
  40. package/dist/components/avatar/Avatar/Avatar.js +7 -2
  41. package/dist/components/avatar/Avatar/Avatar.js.map +1 -1
  42. package/dist/components/avatar/AvatarBadge/AvatarBadge.js +8 -3
  43. package/dist/components/avatar/AvatarBadge/AvatarBadge.js.map +1 -1
  44. package/dist/components/avatar/AvatarFallback/AvatarFallback.js +10 -5
  45. package/dist/components/avatar/AvatarFallback/AvatarFallback.js.map +1 -1
  46. package/dist/components/avatar/AvatarGroup/AvatarGroup.js +8 -3
  47. package/dist/components/avatar/AvatarGroup/AvatarGroup.js.map +1 -1
  48. package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js +8 -3
  49. package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js.map +1 -1
  50. package/dist/components/avatar/AvatarImage/AvatarImage.js +19 -12
  51. package/dist/components/avatar/AvatarImage/AvatarImage.js.map +1 -1
  52. package/dist/components/badge/Badge.js +9 -4
  53. package/dist/components/badge/Badge.js.map +1 -1
  54. package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js +8 -3
  55. package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js.map +1 -1
  56. package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js +8 -3
  57. package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js.map +1 -1
  58. package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js +3 -0
  59. package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js.map +1 -1
  60. package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js +8 -3
  61. package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js.map +1 -1
  62. package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js +8 -3
  63. package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js.map +1 -1
  64. package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js +8 -3
  65. package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js.map +1 -1
  66. package/dist/components/bubble/BubbleContent/BubbleContent.js +21 -10
  67. package/dist/components/bubble/BubbleContent/BubbleContent.js.map +1 -1
  68. package/dist/components/button/Button.js +3 -0
  69. package/dist/components/button/Button.js.map +1 -1
  70. package/dist/components/button-group/ButtonGroup/ButtonGroup.js +3 -0
  71. package/dist/components/button-group/ButtonGroup/ButtonGroup.js.map +1 -1
  72. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js +16 -7
  73. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js.map +1 -1
  74. package/dist/components/calendar/Calendar/Calendar.d.ts +2 -3
  75. package/dist/components/calendar/Calendar/Calendar.js +89 -264
  76. package/dist/components/calendar/Calendar/Calendar.js.map +1 -1
  77. package/dist/components/calendar/Calendar/Calendar.options.d.ts +43 -0
  78. package/dist/components/calendar/Calendar/Calendar.options.js +38 -0
  79. package/dist/components/calendar/Calendar/Calendar.options.js.map +1 -0
  80. package/dist/components/calendar/Calendar/Calendar.selection.d.ts +16 -0
  81. package/dist/components/calendar/Calendar/Calendar.selection.js +50 -0
  82. package/dist/components/calendar/Calendar/Calendar.selection.js.map +1 -0
  83. package/dist/components/calendar/Calendar/Calendar.styles.d.ts +8 -0
  84. package/dist/components/calendar/Calendar/Calendar.styles.js +32 -0
  85. package/dist/components/calendar/Calendar/Calendar.styles.js.map +1 -0
  86. package/dist/components/calendar/Calendar/Calendar.utils.d.ts +3 -1
  87. package/dist/components/calendar/Calendar/Calendar.utils.js +4 -1
  88. package/dist/components/calendar/Calendar/Calendar.utils.js.map +1 -1
  89. package/dist/components/calendar/Calendar/CalendarDay.d.ts +28 -0
  90. package/dist/components/calendar/Calendar/CalendarDay.js +41 -0
  91. package/dist/components/calendar/Calendar/CalendarDay.js.map +1 -0
  92. package/dist/components/calendar/Calendar/CalendarMonth.d.ts +35 -0
  93. package/dist/components/calendar/Calendar/CalendarMonth.js +127 -0
  94. package/dist/components/calendar/Calendar/CalendarMonth.js.map +1 -0
  95. package/dist/components/calendar/Calendar/CalendarMonthCaption.d.ts +22 -0
  96. package/dist/components/calendar/Calendar/CalendarMonthCaption.js +103 -0
  97. package/dist/components/calendar/Calendar/CalendarMonthCaption.js.map +1 -0
  98. package/dist/components/calendar/index.js +3 -2
  99. package/dist/components/card/Card/Card.js +3 -0
  100. package/dist/components/card/Card/Card.js.map +1 -1
  101. package/dist/components/card/CardAction/CardAction.js +8 -3
  102. package/dist/components/card/CardAction/CardAction.js.map +1 -1
  103. package/dist/components/card/CardContent/CardContent.js +8 -3
  104. package/dist/components/card/CardContent/CardContent.js.map +1 -1
  105. package/dist/components/card/CardDescription/CardDescription.js +8 -3
  106. package/dist/components/card/CardDescription/CardDescription.js.map +1 -1
  107. package/dist/components/card/CardFooter/CardFooter.js +8 -3
  108. package/dist/components/card/CardFooter/CardFooter.js.map +1 -1
  109. package/dist/components/card/CardHeader/CardHeader.js +8 -3
  110. package/dist/components/card/CardHeader/CardHeader.js.map +1 -1
  111. package/dist/components/card/CardTitle/CardTitle.js +8 -3
  112. package/dist/components/card/CardTitle/CardTitle.js.map +1 -1
  113. package/dist/components/carousel/Carousel/Carousel.context.js +1 -1
  114. package/dist/components/carousel/Carousel/Carousel.context.js.map +1 -1
  115. package/dist/components/carousel/Carousel/Carousel.js +19 -12
  116. package/dist/components/carousel/Carousel/Carousel.js.map +1 -1
  117. package/dist/components/carousel/Carousel/useKeyboardNavigation.d.ts +11 -1
  118. package/dist/components/carousel/Carousel/useKeyboardNavigation.js +5 -4
  119. package/dist/components/carousel/Carousel/useKeyboardNavigation.js.map +1 -1
  120. package/dist/components/carousel/CarouselContent/CarouselContent.js +8 -3
  121. package/dist/components/carousel/CarouselContent/CarouselContent.js.map +1 -1
  122. package/dist/components/carousel/CarouselNext/CarouselNext.js +29 -16
  123. package/dist/components/carousel/CarouselNext/CarouselNext.js.map +1 -1
  124. package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js +29 -16
  125. package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js.map +1 -1
  126. package/dist/components/checkbox/Checkbox/Checkbox.js +32 -25
  127. package/dist/components/checkbox/Checkbox/Checkbox.js.map +1 -1
  128. package/dist/components/collapsible/Collapsible/Collapsible.context.js +1 -1
  129. package/dist/components/collapsible/Collapsible/Collapsible.context.js.map +1 -1
  130. package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js +13 -12
  131. package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js.map +1 -1
  132. package/dist/components/combobox/Combobox/Combobox.js +52 -52
  133. package/dist/components/combobox/Combobox/Combobox.js.map +1 -1
  134. package/dist/components/combobox/Combobox/Combobox.types.d.ts +15 -6
  135. package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js +7 -3
  136. package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js.map +1 -1
  137. package/dist/components/combobox/ComboboxClear/ComboboxClear.js +1 -1
  138. package/dist/components/combobox/ComboboxClear/ComboboxClear.js.map +1 -1
  139. package/dist/components/combobox/ComboboxInput/ComboboxInput.js +26 -10
  140. package/dist/components/combobox/ComboboxInput/ComboboxInput.js.map +1 -1
  141. package/dist/components/combobox/ComboboxItem/ComboboxItem.js +6 -5
  142. package/dist/components/combobox/ComboboxItem/ComboboxItem.js.map +1 -1
  143. package/dist/components/combobox/ComboboxList/ComboboxList.js +17 -11
  144. package/dist/components/combobox/ComboboxList/ComboboxList.js.map +1 -1
  145. package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js +8 -1
  146. package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js.map +1 -1
  147. package/dist/components/context-menu/ContextMenu/ContextMenu.js +10 -8
  148. package/dist/components/context-menu/ContextMenu/ContextMenu.js.map +1 -1
  149. package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.d.ts +33 -0
  150. package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.js +41 -0
  151. package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.js.map +1 -0
  152. package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.d.ts +25 -0
  153. package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.js +20 -0
  154. package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.js.map +1 -0
  155. package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.d.ts +31 -0
  156. package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.js +39 -0
  157. package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.js.map +1 -0
  158. package/dist/components/context-menu/ContextMenuContent/useContextMenuContent.js +70 -136
  159. package/dist/components/context-menu/ContextMenuContent/useContextMenuContent.js.map +1 -1
  160. package/dist/components/context-menu/ContextMenuSub/ContextMenuSub.js +2 -1
  161. package/dist/components/context-menu/ContextMenuSub/ContextMenuSub.js.map +1 -1
  162. package/dist/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.js +20 -10
  163. package/dist/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.js.map +1 -1
  164. package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.d.ts +24 -0
  165. package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.js +26 -0
  166. package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.js.map +1 -0
  167. package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.d.ts +35 -0
  168. package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.js +17 -0
  169. package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.js.map +1 -0
  170. package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.d.ts +9 -11
  171. package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.js +36 -33
  172. package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.js.map +1 -1
  173. package/dist/components/context-menu/context-menu.keyboard.d.ts +29 -0
  174. package/dist/components/context-menu/context-menu.keyboard.js +52 -0
  175. package/dist/components/context-menu/context-menu.keyboard.js.map +1 -0
  176. package/dist/components/context-menu/context-menu.typeahead.d.ts +27 -0
  177. package/dist/components/context-menu/context-menu.typeahead.js +19 -0
  178. package/dist/components/context-menu/context-menu.typeahead.js.map +1 -0
  179. package/dist/components/context-menu/context-menu.utils.d.ts +5 -2
  180. package/dist/components/context-menu/context-menu.utils.js +17 -39
  181. package/dist/components/context-menu/context-menu.utils.js.map +1 -1
  182. package/dist/components/date-picker/DatePicker/DatePicker.js +6 -0
  183. package/dist/components/date-picker/DatePicker/DatePicker.js.map +1 -1
  184. package/dist/components/dialog/Dialog/Dialog.context.js +1 -1
  185. package/dist/components/dialog/Dialog/Dialog.context.js.map +1 -1
  186. package/dist/components/dialog/Dialog/Dialog.js +24 -15
  187. package/dist/components/dialog/Dialog/Dialog.js.map +1 -1
  188. package/dist/components/dialog/Dialog/Dialog.types.d.ts +5 -0
  189. package/dist/components/dialog/DialogClose/DialogClose.js +20 -19
  190. package/dist/components/dialog/DialogClose/DialogClose.js.map +1 -1
  191. package/dist/components/dialog/DialogContent/DialogContent.context.js +1 -1
  192. package/dist/components/dialog/DialogContent/DialogContent.context.js.map +1 -1
  193. package/dist/components/dialog/DialogDescription/DialogDescription.js +8 -3
  194. package/dist/components/dialog/DialogDescription/DialogDescription.js.map +1 -1
  195. package/dist/components/dialog/DialogFooter/DialogFooter.js +8 -3
  196. package/dist/components/dialog/DialogFooter/DialogFooter.js.map +1 -1
  197. package/dist/components/dialog/DialogHeader/DialogHeader.js +8 -3
  198. package/dist/components/dialog/DialogHeader/DialogHeader.js.map +1 -1
  199. package/dist/components/dialog/DialogOverlay/DialogOverlay.js +3 -0
  200. package/dist/components/dialog/DialogOverlay/DialogOverlay.js.map +1 -1
  201. package/dist/components/dialog/DialogSurface/DialogSurface.js +34 -26
  202. package/dist/components/dialog/DialogSurface/DialogSurface.js.map +1 -1
  203. package/dist/components/dialog/DialogTitle/DialogTitle.js +8 -3
  204. package/dist/components/dialog/DialogTitle/DialogTitle.js.map +1 -1
  205. package/dist/components/drawer/Drawer/Drawer.js +1 -1
  206. package/dist/components/drawer/Drawer/Drawer.js.map +1 -1
  207. package/dist/components/drawer/Drawer/create-change-event-details.js +4 -20
  208. package/dist/components/drawer/Drawer/create-change-event-details.js.map +1 -1
  209. package/dist/components/drawer/DrawerContent/drawer-swipe.utils.d.ts +32 -0
  210. package/dist/components/drawer/DrawerContent/drawer-swipe.utils.js +36 -0
  211. package/dist/components/drawer/DrawerContent/drawer-swipe.utils.js.map +1 -0
  212. package/dist/components/drawer/DrawerContent/useDrawerSwipe.d.ts +3 -0
  213. package/dist/components/drawer/DrawerContent/useDrawerSwipe.js +22 -42
  214. package/dist/components/drawer/DrawerContent/useDrawerSwipe.js.map +1 -1
  215. package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js +1 -1
  216. package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js.map +1 -1
  217. package/dist/components/dropdown-menu/DropdownMenuTrigger/DropdownMenuTrigger.js +7 -7
  218. package/dist/components/dropdown-menu/DropdownMenuTrigger/DropdownMenuTrigger.js.map +1 -1
  219. package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.d.ts +7 -1
  220. package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.js +10 -10
  221. package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.js.map +1 -1
  222. package/dist/components/field/Field/Field.js +3 -0
  223. package/dist/components/field/Field/Field.js.map +1 -1
  224. package/dist/components/field/FieldContent/FieldContent.js +8 -3
  225. package/dist/components/field/FieldContent/FieldContent.js.map +1 -1
  226. package/dist/components/field/FieldDescription/FieldDescription.js +8 -3
  227. package/dist/components/field/FieldDescription/FieldDescription.js.map +1 -1
  228. package/dist/components/field/FieldError/FieldError.js +8 -3
  229. package/dist/components/field/FieldError/FieldError.js.map +1 -1
  230. package/dist/components/field/FieldGroup/FieldGroup.js +8 -3
  231. package/dist/components/field/FieldGroup/FieldGroup.js.map +1 -1
  232. package/dist/components/field/FieldLabel/FieldLabel.js +3 -0
  233. package/dist/components/field/FieldLabel/FieldLabel.js.map +1 -1
  234. package/dist/components/field/FieldLegend/FieldLegend.js +3 -0
  235. package/dist/components/field/FieldLegend/FieldLegend.js.map +1 -1
  236. package/dist/components/field/FieldSeparator/FieldSeparator.js +3 -0
  237. package/dist/components/field/FieldSeparator/FieldSeparator.js.map +1 -1
  238. package/dist/components/field/FieldSet/FieldSet.js +8 -3
  239. package/dist/components/field/FieldSet/FieldSet.js.map +1 -1
  240. package/dist/components/field/FieldTitle/FieldTitle.js +8 -3
  241. package/dist/components/field/FieldTitle/FieldTitle.js.map +1 -1
  242. package/dist/components/image/Image.utils.d.ts +14 -16
  243. package/dist/components/image/Image.utils.js +146 -190
  244. package/dist/components/image/Image.utils.js.map +1 -1
  245. package/dist/components/image/ImageElement.js +31 -27
  246. package/dist/components/image/ImageElement.js.map +1 -1
  247. package/dist/components/image/lib/blur.d.ts +31 -0
  248. package/dist/components/image/lib/blur.js +24 -0
  249. package/dist/components/image/lib/blur.js.map +1 -0
  250. package/dist/components/image/lib/dev-checks.d.ts +52 -0
  251. package/dist/components/image/lib/handle-loading.d.ts +13 -0
  252. package/dist/components/image/lib/handle-loading.js +20 -0
  253. package/dist/components/image/lib/handle-loading.js.map +1 -0
  254. package/dist/components/image/lib/loader.d.ts +39 -0
  255. package/dist/components/image/lib/loader.js +57 -0
  256. package/dist/components/image/lib/loader.js.map +1 -0
  257. package/dist/components/image/lib/static-import.d.ts +14 -0
  258. package/dist/components/image/lib/static-import.js +17 -0
  259. package/dist/components/image/lib/static-import.js.map +1 -0
  260. package/dist/components/input-group/InputGroup/InputGroup.js +8 -3
  261. package/dist/components/input-group/InputGroup/InputGroup.js.map +1 -1
  262. package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js +3 -0
  263. package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js.map +1 -1
  264. package/dist/components/input-group/InputGroupButton/InputGroupButton.js +3 -0
  265. package/dist/components/input-group/InputGroupButton/InputGroupButton.js.map +1 -1
  266. package/dist/components/input-group/InputGroupInput/InputGroupInput.js +3 -0
  267. package/dist/components/input-group/InputGroupInput/InputGroupInput.js.map +1 -1
  268. package/dist/components/input-group/InputGroupText/InputGroupText.js +8 -3
  269. package/dist/components/input-group/InputGroupText/InputGroupText.js.map +1 -1
  270. package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js +3 -0
  271. package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js.map +1 -1
  272. package/dist/components/item/Item/Item.js +9 -0
  273. package/dist/components/item/Item/Item.js.map +1 -1
  274. package/dist/components/item/ItemActions/ItemActions.js +8 -3
  275. package/dist/components/item/ItemActions/ItemActions.js.map +1 -1
  276. package/dist/components/item/ItemContent/ItemContent.js +8 -3
  277. package/dist/components/item/ItemContent/ItemContent.js.map +1 -1
  278. package/dist/components/item/ItemDescription/ItemDescription.js +8 -3
  279. package/dist/components/item/ItemDescription/ItemDescription.js.map +1 -1
  280. package/dist/components/item/ItemFooter/ItemFooter.js +8 -3
  281. package/dist/components/item/ItemFooter/ItemFooter.js.map +1 -1
  282. package/dist/components/item/ItemGroup/ItemGroup.js +8 -3
  283. package/dist/components/item/ItemGroup/ItemGroup.js.map +1 -1
  284. package/dist/components/item/ItemHeader/ItemHeader.js +8 -3
  285. package/dist/components/item/ItemHeader/ItemHeader.js.map +1 -1
  286. package/dist/components/item/ItemMedia/ItemMedia.js +3 -0
  287. package/dist/components/item/ItemMedia/ItemMedia.js.map +1 -1
  288. package/dist/components/item/ItemSeparator/ItemSeparator.js +3 -0
  289. package/dist/components/item/ItemSeparator/ItemSeparator.js.map +1 -1
  290. package/dist/components/item/ItemTitle/ItemTitle.js +8 -3
  291. package/dist/components/item/ItemTitle/ItemTitle.js.map +1 -1
  292. package/dist/components/kbd/Kbd.js +16 -6
  293. package/dist/components/kbd/Kbd.js.map +1 -1
  294. package/dist/components/label/Label.js +3 -0
  295. package/dist/components/label/Label.js.map +1 -1
  296. package/dist/components/marker/Marker/Marker.styles.d.ts +1 -1
  297. package/dist/components/message-scroller/message-scroller.anchoring.d.ts +60 -0
  298. package/dist/components/message-scroller/message-scroller.anchoring.js +139 -0
  299. package/dist/components/message-scroller/message-scroller.anchoring.js.map +1 -0
  300. package/dist/components/message-scroller/message-scroller.anchors.d.ts +12 -0
  301. package/dist/components/message-scroller/message-scroller.anchors.js +23 -0
  302. package/dist/components/message-scroller/message-scroller.anchors.js.map +1 -0
  303. package/dist/components/message-scroller/message-scroller.commands.d.ts +43 -0
  304. package/dist/components/message-scroller/message-scroller.commands.js +51 -0
  305. package/dist/components/message-scroller/message-scroller.commands.js.map +1 -0
  306. package/dist/components/message-scroller/message-scroller.dom-measure.d.ts +29 -0
  307. package/dist/components/message-scroller/message-scroller.dom-measure.js +37 -0
  308. package/dist/components/message-scroller/message-scroller.dom-measure.js.map +1 -0
  309. package/dist/components/message-scroller/message-scroller.measure.d.ts +27 -0
  310. package/dist/components/message-scroller/message-scroller.measure.js +21 -0
  311. package/dist/components/message-scroller/message-scroller.measure.js.map +1 -0
  312. package/dist/components/message-scroller/message-scroller.scroll-state.d.ts +54 -0
  313. package/dist/components/message-scroller/message-scroller.scroll-state.js +74 -0
  314. package/dist/components/message-scroller/message-scroller.scroll-state.js.map +1 -0
  315. package/dist/components/message-scroller/message-scroller.scroll-target.d.ts +27 -0
  316. package/dist/components/message-scroller/message-scroller.scroll-target.js +33 -0
  317. package/dist/components/message-scroller/message-scroller.scroll-target.js.map +1 -0
  318. package/dist/components/message-scroller/message-scroller.utils.d.ts +7 -0
  319. package/dist/components/message-scroller/message-scroller.utils.js +3 -2
  320. package/dist/components/message-scroller/message-scroller.utils.js.map +1 -1
  321. package/dist/components/message-scroller/message-scroller.visibility.d.ts +43 -0
  322. package/dist/components/message-scroller/message-scroller.visibility.js +82 -0
  323. package/dist/components/message-scroller/message-scroller.visibility.js.map +1 -0
  324. package/dist/components/message-scroller/useMessageScrollerEngine.js +87 -337
  325. package/dist/components/message-scroller/useMessageScrollerEngine.js.map +1 -1
  326. package/dist/components/number-input/NumberInput/NumberInput.js +21 -19
  327. package/dist/components/number-input/NumberInput/NumberInput.js.map +1 -1
  328. package/dist/components/number-input/NumberInput/NumberInput.utils.d.ts +6 -2
  329. package/dist/components/number-input/NumberInput/NumberInput.utils.js +1 -3
  330. package/dist/components/number-input/NumberInput/NumberInput.utils.js.map +1 -1
  331. package/dist/components/number-input/NumberInput/create-change-event-details.d.ts +1 -2
  332. package/dist/components/number-input/NumberInput/create-change-event-details.js +4 -20
  333. package/dist/components/number-input/NumberInput/create-change-event-details.js.map +1 -1
  334. package/dist/components/pagination/Pagination/Pagination.js +8 -3
  335. package/dist/components/pagination/Pagination/Pagination.js.map +1 -1
  336. package/dist/components/pagination/PaginationContent/PaginationContent.js +8 -3
  337. package/dist/components/pagination/PaginationContent/PaginationContent.js.map +1 -1
  338. package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js +8 -3
  339. package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js.map +1 -1
  340. package/dist/components/pagination/PaginationLink/PaginationLink.js +3 -0
  341. package/dist/components/pagination/PaginationLink/PaginationLink.js.map +1 -1
  342. package/dist/components/pagination/PaginationNext/PaginationNext.js +3 -0
  343. package/dist/components/pagination/PaginationNext/PaginationNext.js.map +1 -1
  344. package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js +3 -0
  345. package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js.map +1 -1
  346. package/dist/components/popover/PopoverContent/PopoverContent.js +3 -0
  347. package/dist/components/popover/PopoverContent/PopoverContent.js.map +1 -1
  348. package/dist/components/progress/Progress/Progress.context.js +1 -1
  349. package/dist/components/progress/Progress/Progress.context.js.map +1 -1
  350. package/dist/components/progress/Progress/Progress.js +3 -0
  351. package/dist/components/progress/Progress/Progress.js.map +1 -1
  352. package/dist/components/progress/ProgressIndicator/ProgressIndicator.js +3 -0
  353. package/dist/components/progress/ProgressIndicator/ProgressIndicator.js.map +1 -1
  354. package/dist/components/progress/ProgressLabel/ProgressLabel.js +8 -3
  355. package/dist/components/progress/ProgressLabel/ProgressLabel.js.map +1 -1
  356. package/dist/components/progress/ProgressTrack/ProgressTrack.js +3 -0
  357. package/dist/components/progress/ProgressTrack/ProgressTrack.js.map +1 -1
  358. package/dist/components/progress/ProgressValue/ProgressValue.js +8 -3
  359. package/dist/components/progress/ProgressValue/ProgressValue.js.map +1 -1
  360. package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.d.ts +48 -0
  361. package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.js +23 -0
  362. package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.js.map +1 -0
  363. package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js +62 -49
  364. package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js.map +1 -1
  365. package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js +4 -1
  366. package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js.map +1 -1
  367. package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js +1 -2
  368. package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js.map +1 -1
  369. package/dist/components/questionnaire/questionnaire.answers.d.ts +42 -0
  370. package/dist/components/questionnaire/questionnaire.answers.js +62 -0
  371. package/dist/components/questionnaire/questionnaire.answers.js.map +1 -0
  372. package/dist/components/questionnaire/questionnaire.aria.d.ts +34 -0
  373. package/dist/components/questionnaire/questionnaire.aria.js +28 -0
  374. package/dist/components/questionnaire/questionnaire.aria.js.map +1 -0
  375. package/dist/components/questionnaire/questionnaire.dom-watch.d.ts +9 -0
  376. package/dist/components/questionnaire/questionnaire.dom-watch.js +18 -0
  377. package/dist/components/questionnaire/questionnaire.dom-watch.js.map +1 -0
  378. package/dist/components/questionnaire/questionnaire.focus.d.ts +26 -0
  379. package/dist/components/questionnaire/questionnaire.focus.js +19 -0
  380. package/dist/components/questionnaire/questionnaire.focus.js.map +1 -0
  381. package/dist/components/questionnaire/questionnaire.item-view.d.ts +50 -0
  382. package/dist/components/questionnaire/questionnaire.item-view.js +36 -0
  383. package/dist/components/questionnaire/questionnaire.item-view.js.map +1 -0
  384. package/dist/components/questionnaire/questionnaire.keys.d.ts +29 -0
  385. package/dist/components/questionnaire/questionnaire.keys.js +34 -0
  386. package/dist/components/questionnaire/questionnaire.keys.js.map +1 -0
  387. package/dist/components/questionnaire/questionnaire.registry.d.ts +21 -0
  388. package/dist/components/questionnaire/questionnaire.registry.js +15 -0
  389. package/dist/components/questionnaire/questionnaire.registry.js.map +1 -0
  390. package/dist/components/questionnaire/questionnaire.shortcuts.d.ts +24 -0
  391. package/dist/components/questionnaire/questionnaire.shortcuts.js +31 -0
  392. package/dist/components/questionnaire/questionnaire.shortcuts.js.map +1 -0
  393. package/dist/components/questionnaire/questionnaire.utils.d.ts +17 -1
  394. package/dist/components/questionnaire/questionnaire.utils.js +5 -2
  395. package/dist/components/questionnaire/questionnaire.utils.js.map +1 -1
  396. package/dist/components/questionnaire/questionnaire.validation.d.ts +43 -0
  397. package/dist/components/questionnaire/questionnaire.validation.js +17 -0
  398. package/dist/components/questionnaire/questionnaire.validation.js.map +1 -0
  399. package/dist/components/questionnaire/useQuestionnaireItem.d.ts +0 -2
  400. package/dist/components/questionnaire/useQuestionnaireItem.js +83 -121
  401. package/dist/components/questionnaire/useQuestionnaireItem.js.map +1 -1
  402. package/dist/components/questionnaire/useQuestionnaireRoot.js +78 -99
  403. package/dist/components/questionnaire/useQuestionnaireRoot.js.map +1 -1
  404. package/dist/components/radio-group/RadioGroup/RadioGroup.js +3 -0
  405. package/dist/components/radio-group/RadioGroup/RadioGroup.js.map +1 -1
  406. package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js +3 -0
  407. package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js.map +1 -1
  408. package/dist/components/resizable/ResizableHandle/resizable.handle-drag.d.ts +37 -0
  409. package/dist/components/resizable/ResizableHandle/resizable.handle-drag.js +37 -0
  410. package/dist/components/resizable/ResizableHandle/resizable.handle-drag.js.map +1 -0
  411. package/dist/components/resizable/ResizableHandle/resizable.handle-keys.d.ts +24 -0
  412. package/dist/components/resizable/ResizableHandle/resizable.handle-keys.js +36 -0
  413. package/dist/components/resizable/ResizableHandle/resizable.handle-keys.js.map +1 -0
  414. package/dist/components/resizable/ResizableHandle/useResizableHandle.d.ts +3 -4
  415. package/dist/components/resizable/ResizableHandle/useResizableHandle.js +30 -63
  416. package/dist/components/resizable/ResizableHandle/useResizableHandle.js.map +1 -1
  417. package/dist/components/resizable/ResizablePanel/ResizablePanel.d.ts +4 -2
  418. package/dist/components/resizable/ResizablePanel/ResizablePanel.js +23 -50
  419. package/dist/components/resizable/ResizablePanel/ResizablePanel.js.map +1 -1
  420. package/dist/components/resizable/ResizablePanel/useResizablePanel.d.ts +30 -0
  421. package/dist/components/resizable/ResizablePanel/useResizablePanel.js +37 -0
  422. package/dist/components/resizable/ResizablePanel/useResizablePanel.js.map +1 -0
  423. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.d.ts +4 -1
  424. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js +10 -17
  425. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js.map +1 -1
  426. package/dist/components/resizable/ResizablePanelGroup/useDragCursor.d.ts +11 -0
  427. package/dist/components/resizable/ResizablePanelGroup/useDragCursor.js +17 -0
  428. package/dist/components/resizable/ResizablePanelGroup/useDragCursor.js.map +1 -0
  429. package/dist/components/resizable/resizable.collapse.d.ts +27 -0
  430. package/dist/components/resizable/resizable.collapse.js +24 -0
  431. package/dist/components/resizable/resizable.collapse.js.map +1 -0
  432. package/dist/components/resizable/resizable.commands.d.ts +32 -0
  433. package/dist/components/resizable/resizable.commands.js +40 -0
  434. package/dist/components/resizable/resizable.commands.js.map +1 -0
  435. package/dist/components/resizable/resizable.constraints.d.ts +23 -0
  436. package/dist/components/resizable/resizable.constraints.js +32 -0
  437. package/dist/components/resizable/resizable.constraints.js.map +1 -0
  438. package/dist/components/resizable/resizable.lifecycle.d.ts +35 -0
  439. package/dist/components/resizable/resizable.lifecycle.js +32 -0
  440. package/dist/components/resizable/resizable.lifecycle.js.map +1 -0
  441. package/dist/components/resizable/resizable.registry.d.ts +31 -0
  442. package/dist/components/resizable/resizable.registry.js +38 -0
  443. package/dist/components/resizable/resizable.registry.js.map +1 -0
  444. package/dist/components/resizable/resizable.reporting.d.ts +36 -0
  445. package/dist/components/resizable/resizable.reporting.js +33 -0
  446. package/dist/components/resizable/resizable.reporting.js.map +1 -0
  447. package/dist/components/resizable/resizable.resize.d.ts +47 -0
  448. package/dist/components/resizable/resizable.resize.js +28 -0
  449. package/dist/components/resizable/resizable.resize.js.map +1 -0
  450. package/dist/components/resizable/resizable.sizes.d.ts +31 -0
  451. package/dist/components/resizable/resizable.sizes.js +46 -0
  452. package/dist/components/resizable/resizable.sizes.js.map +1 -0
  453. package/dist/components/resizable/resizable.storage.d.ts +17 -0
  454. package/dist/components/resizable/resizable.storage.js +29 -0
  455. package/dist/components/resizable/resizable.storage.js.map +1 -0
  456. package/dist/components/resizable/resizable.utils.d.ts +10 -3
  457. package/dist/components/resizable/resizable.utils.js +16 -10
  458. package/dist/components/resizable/resizable.utils.js.map +1 -1
  459. package/dist/components/resizable/useResizablePanelGroup.js +62 -164
  460. package/dist/components/resizable/useResizablePanelGroup.js.map +1 -1
  461. package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js +1 -1
  462. package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js.map +1 -1
  463. package/dist/components/scroll-area/ScrollArea/ScrollArea.d.ts +9 -0
  464. package/dist/components/scroll-area/ScrollArea/ScrollArea.js +28 -39
  465. package/dist/components/scroll-area/ScrollArea/ScrollArea.js.map +1 -1
  466. package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js +3 -3
  467. package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js.map +1 -1
  468. package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.d.ts +22 -0
  469. package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.js +34 -0
  470. package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.js.map +1 -0
  471. package/dist/components/scroll-area/ScrollBar/ScrollBar.d.ts +8 -0
  472. package/dist/components/scroll-area/ScrollBar/ScrollBar.js +38 -71
  473. package/dist/components/scroll-area/ScrollBar/ScrollBar.js.map +1 -1
  474. package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.d.ts +56 -0
  475. package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.js +61 -0
  476. package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.js.map +1 -0
  477. package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.d.ts +25 -0
  478. package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.js +26 -0
  479. package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.js.map +1 -0
  480. package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.d.ts +19 -0
  481. package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.js +37 -0
  482. package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.js.map +1 -0
  483. package/dist/components/scroll-arrows/ScrollArrowButton.d.ts +5 -7
  484. package/dist/components/scroll-arrows/ScrollArrowButton.js +14 -44
  485. package/dist/components/scroll-arrows/ScrollArrowButton.js.map +1 -1
  486. package/dist/components/scroll-arrows/ScrollArrows.d.ts +4 -3
  487. package/dist/components/scroll-arrows/ScrollArrows.js +16 -22
  488. package/dist/components/scroll-arrows/ScrollArrows.js.map +1 -1
  489. package/dist/components/scroll-arrows/ScrollArrows.types.d.ts +7 -7
  490. package/dist/components/scroll-arrows/useHoverScroll.d.ts +29 -0
  491. package/dist/components/scroll-arrows/useHoverScroll.js +39 -0
  492. package/dist/components/scroll-arrows/useHoverScroll.js.map +1 -0
  493. package/dist/components/select/SelectContent/useSelectContent.js +3 -3
  494. package/dist/components/select/SelectGroup/SelectGroup.d.ts +8 -2
  495. package/dist/components/select/SelectGroup/SelectGroup.js +20 -6
  496. package/dist/components/select/SelectGroup/SelectGroup.js.map +1 -1
  497. package/dist/components/select/SelectGroup/SelectGroup.types.d.ts +9 -0
  498. package/dist/components/select/SelectGroup/index.d.ts +1 -0
  499. package/dist/components/select/SelectTrigger/SelectTrigger.js.map +1 -1
  500. package/dist/components/select/SelectTrigger/useSelectTrigger.js +1 -1
  501. package/dist/components/select/SelectTrigger/useSelectTrigger.js.map +1 -1
  502. package/dist/components/separator/Separator.js +3 -0
  503. package/dist/components/separator/Separator.js.map +1 -1
  504. package/dist/components/sheet/SheetClose/SheetClose.js +18 -17
  505. package/dist/components/sheet/SheetClose/SheetClose.js.map +1 -1
  506. package/dist/components/sidebar/Sidebar/Sidebar.js +14 -6
  507. package/dist/components/sidebar/Sidebar/Sidebar.js.map +1 -1
  508. package/dist/components/sidebar/SidebarContent/SidebarContent.js +8 -3
  509. package/dist/components/sidebar/SidebarContent/SidebarContent.js.map +1 -1
  510. package/dist/components/sidebar/SidebarFooter/SidebarFooter.js +8 -3
  511. package/dist/components/sidebar/SidebarFooter/SidebarFooter.js.map +1 -1
  512. package/dist/components/sidebar/SidebarGroup/SidebarGroup.js +8 -3
  513. package/dist/components/sidebar/SidebarGroup/SidebarGroup.js.map +1 -1
  514. package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js +3 -0
  515. package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js.map +1 -1
  516. package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js +8 -3
  517. package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js.map +1 -1
  518. package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js +3 -0
  519. package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js.map +1 -1
  520. package/dist/components/sidebar/SidebarHeader/SidebarHeader.js +8 -3
  521. package/dist/components/sidebar/SidebarHeader/SidebarHeader.js.map +1 -1
  522. package/dist/components/sidebar/SidebarInput/SidebarInput.js +3 -0
  523. package/dist/components/sidebar/SidebarInput/SidebarInput.js.map +1 -1
  524. package/dist/components/sidebar/SidebarInset/SidebarInset.js +8 -3
  525. package/dist/components/sidebar/SidebarInset/SidebarInset.js.map +1 -1
  526. package/dist/components/sidebar/SidebarMenu/SidebarMenu.js +8 -3
  527. package/dist/components/sidebar/SidebarMenu/SidebarMenu.js.map +1 -1
  528. package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js +8 -3
  529. package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js.map +1 -1
  530. package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js +6 -0
  531. package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js.map +1 -1
  532. package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js +8 -3
  533. package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js.map +1 -1
  534. package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js +8 -3
  535. package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js.map +1 -1
  536. package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js +8 -3
  537. package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js.map +1 -1
  538. package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js +3 -0
  539. package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js.map +1 -1
  540. package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js +8 -3
  541. package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js.map +1 -1
  542. package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js +1 -1
  543. package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js.map +1 -1
  544. package/dist/components/sidebar/SidebarProvider/SidebarProvider.js +30 -27
  545. package/dist/components/sidebar/SidebarProvider/SidebarProvider.js.map +1 -1
  546. package/dist/components/sidebar/SidebarProvider/useIsMobile.d.ts +10 -0
  547. package/dist/components/sidebar/SidebarProvider/useIsMobile.js +14 -0
  548. package/dist/components/sidebar/SidebarProvider/useIsMobile.js.map +1 -0
  549. package/dist/components/sidebar/SidebarRail/SidebarRail.js +8 -3
  550. package/dist/components/sidebar/SidebarRail/SidebarRail.js.map +1 -1
  551. package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js +3 -0
  552. package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js.map +1 -1
  553. package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js +3 -0
  554. package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js.map +1 -1
  555. package/dist/components/skeleton/Skeleton.js +8 -3
  556. package/dist/components/skeleton/Skeleton.js.map +1 -1
  557. package/dist/components/slider/Slider/Slider.context.js +1 -1
  558. package/dist/components/slider/Slider/Slider.context.js.map +1 -1
  559. package/dist/components/slider/Slider/Slider.js +3 -0
  560. package/dist/components/slider/Slider/Slider.js.map +1 -1
  561. package/dist/components/slider/SliderControl/SliderControl.js +4 -1
  562. package/dist/components/slider/SliderControl/SliderControl.js.map +1 -1
  563. package/dist/components/slider/SliderIndicator/SliderIndicator.js +3 -0
  564. package/dist/components/slider/SliderIndicator/SliderIndicator.js.map +1 -1
  565. package/dist/components/slider/SliderThumb/SliderThumb.js +18 -3
  566. package/dist/components/slider/SliderThumb/SliderThumb.js.map +1 -1
  567. package/dist/components/slider/SliderThumb/useSliderThumb.d.ts +1 -0
  568. package/dist/components/slider/SliderThumb/useSliderThumb.js +3 -2
  569. package/dist/components/slider/SliderThumb/useSliderThumb.js.map +1 -1
  570. package/dist/components/slider/SliderTrack/SliderTrack.js +3 -0
  571. package/dist/components/slider/SliderTrack/SliderTrack.js.map +1 -1
  572. package/dist/components/spinner/Spinner.js +3 -0
  573. package/dist/components/spinner/Spinner.js.map +1 -1
  574. package/dist/components/switch/Switch.js +7 -0
  575. package/dist/components/switch/Switch.js.map +1 -1
  576. package/dist/components/tabs/Tabs/Tabs.context.js +1 -1
  577. package/dist/components/tabs/Tabs/Tabs.context.js.map +1 -1
  578. package/dist/components/tabs/Tabs/useTabsKeyboard.d.ts +7 -11
  579. package/dist/components/tabs/Tabs/useTabsKeyboard.js +8 -42
  580. package/dist/components/tabs/Tabs/useTabsKeyboard.js.map +1 -1
  581. package/dist/components/tabs/TabsList/TabsList.context.js +1 -1
  582. package/dist/components/tabs/TabsList/TabsList.context.js.map +1 -1
  583. package/dist/components/tabs/TabsList/TabsList.js +10 -10
  584. package/dist/components/tabs/TabsList/TabsList.js.map +1 -1
  585. package/dist/components/tabs/TabsTrigger/TabsTrigger.js +8 -8
  586. package/dist/components/tabs/TabsTrigger/TabsTrigger.js.map +1 -1
  587. package/dist/components/textarea/Textarea.js +8 -3
  588. package/dist/components/textarea/Textarea.js.map +1 -1
  589. package/dist/components/time-picker/TimePicker/create-change-event-details.d.ts +1 -2
  590. package/dist/components/time-picker/TimePicker/create-change-event-details.js +4 -20
  591. package/dist/components/time-picker/TimePicker/create-change-event-details.js.map +1 -1
  592. package/dist/components/time-picker/TimePickerColumn/TimePickerColumn.js +1 -3
  593. package/dist/components/time-picker/TimePickerColumn/TimePickerColumn.js.map +1 -1
  594. package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.d.ts +34 -0
  595. package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.js +43 -0
  596. package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.js.map +1 -0
  597. package/dist/components/time-picker/TimePickerColumn/useTimePickerColumn.js +34 -59
  598. package/dist/components/time-picker/TimePickerColumn/useTimePickerColumn.js.map +1 -1
  599. package/dist/components/toast/Toast/Toast.d.ts +8 -2
  600. package/dist/components/toast/Toast/Toast.js +92 -146
  601. package/dist/components/toast/Toast/Toast.js.map +1 -1
  602. package/dist/components/toast/Toast/Toast.types.d.ts +1 -1
  603. package/dist/components/toast/Toast/Toast.types.js.map +1 -1
  604. package/dist/components/toast/Toast/Toast.utils.d.ts +47 -0
  605. package/dist/components/toast/Toast/Toast.utils.js +47 -0
  606. package/dist/components/toast/Toast/Toast.utils.js.map +1 -0
  607. package/dist/components/toast/Toast/ToastActionButton.d.ts +16 -0
  608. package/dist/components/toast/Toast/ToastActionButton.js +27 -0
  609. package/dist/components/toast/Toast/ToastActionButton.js.map +1 -0
  610. package/dist/components/toast/Toast/ToastActions.d.ts +12 -0
  611. package/dist/components/toast/Toast/ToastActions.js +65 -0
  612. package/dist/components/toast/Toast/ToastActions.js.map +1 -0
  613. package/dist/components/toast/Toast/ToastCloseButton.d.ts +12 -0
  614. package/dist/components/toast/Toast/ToastCloseButton.js +26 -0
  615. package/dist/components/toast/Toast/ToastCloseButton.js.map +1 -0
  616. package/dist/components/toast/Toast/ToastContent.d.ts +8 -0
  617. package/dist/components/toast/Toast/ToastContent.js +30 -0
  618. package/dist/components/toast/Toast/ToastContent.js.map +1 -0
  619. package/dist/components/toast/Toast/ToastIcon.d.ts +14 -0
  620. package/dist/components/toast/Toast/ToastIcon.js +36 -0
  621. package/dist/components/toast/Toast/ToastIcon.js.map +1 -0
  622. package/dist/components/toast/Toast/useToastLifecycle.d.ts +29 -0
  623. package/dist/components/toast/Toast/useToastLifecycle.js +30 -0
  624. package/dist/components/toast/Toast/useToastLifecycle.js.map +1 -0
  625. package/dist/components/toast/Toaster/ToastViewport.d.ts +33 -0
  626. package/dist/components/toast/Toaster/ToastViewport.js +73 -0
  627. package/dist/components/toast/Toaster/ToastViewport.js.map +1 -0
  628. package/dist/components/toast/Toaster/Toaster.d.ts +4 -0
  629. package/dist/components/toast/Toaster/Toaster.js +64 -82
  630. package/dist/components/toast/Toaster/Toaster.js.map +1 -1
  631. package/dist/components/toast/Toaster/Toaster.utils.d.ts +15 -0
  632. package/dist/components/toast/Toaster/Toaster.utils.js +4 -1
  633. package/dist/components/toast/Toaster/Toaster.utils.js.map +1 -1
  634. package/dist/components/toast/Toaster/useToaster.d.ts +28 -0
  635. package/dist/components/toast/Toaster/useToaster.js +26 -0
  636. package/dist/components/toast/Toaster/useToaster.js.map +1 -0
  637. package/dist/components/toast/index.js +4 -3
  638. package/dist/components/toast/state/promise-toast.d.ts +17 -0
  639. package/dist/components/toast/state/promise-toast.js +33 -0
  640. package/dist/components/toast/state/promise-toast.js.map +1 -0
  641. package/dist/components/toast/state/store.d.ts +21 -0
  642. package/dist/components/toast/state/store.js +45 -0
  643. package/dist/components/toast/state/store.js.map +1 -0
  644. package/dist/components/toast/state/toast.d.ts +9 -10
  645. package/dist/components/toast/state/toast.js +30 -89
  646. package/dist/components/toast/state/toast.js.map +1 -1
  647. package/dist/components/toggle/Toggle/Toggle.js +2 -1
  648. package/dist/components/toggle/Toggle/Toggle.js.map +1 -1
  649. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +1 -1
  650. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -1
  651. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.d.ts +6 -2
  652. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js +4 -20
  653. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js.map +1 -1
  654. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.d.ts +7 -10
  655. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js +10 -40
  656. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js.map +1 -1
  657. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js +5 -5
  658. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js.map +1 -1
  659. package/dist/components/tooltip/TooltipContent/usePresence.d.ts +27 -0
  660. package/dist/components/tooltip/TooltipContent/usePresence.js +24 -0
  661. package/dist/components/tooltip/TooltipContent/usePresence.js.map +1 -0
  662. package/dist/components/tooltip/TooltipContent/useTooltipContent.js +22 -35
  663. package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
  664. package/dist/hooks/useFontLoader.js +1 -1
  665. package/dist/hooks/useFontLoader.js.map +1 -1
  666. package/dist/hooks/useScrollLock.js +13 -16
  667. package/dist/hooks/useScrollLock.js.map +1 -1
  668. package/dist/index.js +328 -320
  669. package/dist/lib/positioner/index.d.ts +1 -0
  670. package/dist/lib/positioner/utils/dom.d.ts +8 -0
  671. package/dist/lib/positioner/utils/dom.js +1 -1
  672. package/dist/lib/positioner/utils/dom.js.map +1 -1
  673. package/dist/types/props.types.d.ts +1 -1
  674. package/dist/ui.css +1 -1
  675. package/dist/utils/call-event-handler.d.ts +16 -0
  676. package/dist/utils/call-event-handler.js +15 -0
  677. package/dist/utils/call-event-handler.js.map +1 -0
  678. package/dist/utils/clsx.d.ts +1 -1
  679. package/dist/utils/clsx.js +2 -7
  680. package/dist/utils/create-change-event-details.d.ts +25 -0
  681. package/dist/utils/create-change-event-details.js +25 -0
  682. package/dist/utils/create-change-event-details.js.map +1 -0
  683. package/dist/utils/get-style.d.ts +7 -9
  684. package/dist/utils/get-style.js +16 -0
  685. package/dist/utils/get-style.js.map +1 -0
  686. package/dist/utils/index.d.ts +8 -0
  687. package/dist/utils/index.js +7 -1
  688. package/dist/utils/number.d.ts +7 -0
  689. package/dist/utils/number.js +8 -0
  690. package/dist/utils/number.js.map +1 -0
  691. package/dist/utils/roving-navigation.d.ts +64 -0
  692. package/dist/utils/roving-navigation.js +66 -0
  693. package/dist/utils/roving-navigation.js.map +1 -0
  694. package/dist/utils/string.d.ts +17 -0
  695. package/dist/utils/string.js +11 -0
  696. package/dist/utils/string.js.map +1 -0
  697. package/package.json +18 -7
  698. package/dist/components/carousel/Carousel/Carousel.utils.d.ts +0 -0
  699. package/dist/components/field/FieldError/useFieldError.d.ts +0 -0
  700. package/dist/components/hover-card/hover-card.utils.d.ts +0 -6
  701. package/dist/components/tabs/Tabs/call-event-handler.d.ts +0 -5
  702. package/dist/components/tabs/Tabs/call-event-handler.js +0 -9
  703. package/dist/components/tabs/Tabs/call-event-handler.js.map +0 -1
  704. package/dist/components/toggle-group/call-event-handler.d.ts +0 -5
  705. package/dist/components/toggle-group/call-event-handler.js +0 -9
  706. package/dist/components/toggle-group/call-event-handler.js.map +0 -1
  707. package/dist/utils/clsx.js.map +0 -1
@@ -1,6 +1,11 @@
1
- import { createEffect as e, createSignal as t, onCleanup as n } from "solid-js";
1
+ import { createDomMeasure as e } from "./message-scroller.dom-measure.js";
2
+ import { createAnchoring as t } from "./message-scroller.anchoring.js";
3
+ import { createScrollCommands as n } from "./message-scroller.commands.js";
4
+ import { createScrollState as r } from "./message-scroller.scroll-state.js";
5
+ import { createVisibility as i } from "./message-scroller.visibility.js";
6
+ import { createEffect as a, createSignal as o, onCleanup as s } from "solid-js";
2
7
  //#region src/components/message-scroller/useMessageScrollerEngine.ts
3
- var r = .5, i = 180, a = /* @__PURE__ */ new Set([
8
+ var c = /* @__PURE__ */ new Set([
4
9
  "ArrowDown",
5
10
  "ArrowUp",
6
11
  "End",
@@ -9,364 +14,109 @@ var r = .5, i = 180, a = /* @__PURE__ */ new Set([
9
14
  "PageUp",
10
15
  " "
11
16
  ]);
12
- function o(e) {
13
- let t = Number.parseFloat(e);
14
- return Number.isFinite(t) ? t : 0;
15
- }
16
- function s(e) {
17
- let t = window.getComputedStyle(e);
18
- return {
19
- start: o(t.paddingBlockStart || t.paddingTop),
20
- end: o(t.paddingBlockEnd || t.paddingBottom)
21
- };
22
- }
23
- function c(e) {
24
- if (!e) return 0;
25
- let t = window.getComputedStyle(e);
26
- return o(t.rowGap === "normal" ? t.gap : t.rowGap);
27
- }
28
- function l(o) {
29
- let [l, ee] = t(), [u, te] = t(), [d, ne] = t(), [f, re] = t(!0), [ie, ae] = t(!1), [oe, se] = t(!1), [p, m] = t(!1), [ce, h] = t(o().defaultScrollPosition !== "start"), [le, g] = t(null), [ue, _] = t([]), v = /* @__PURE__ */ new Map(), y = /* @__PURE__ */ new Set(), b = /* @__PURE__ */ new WeakSet(), x = o().autoScroll ? "following-bottom" : "free-scrolling", S = 0, C = 0, w = null, T = !1, E = null, D = null, O = null, k = 0, A = 0, j = null, M = null, N = null, P = null, F = null, I = 0, L = () => {
30
- let e = u(), t = d();
31
- return e ? Array.from(e.children).filter((e) => e instanceof HTMLElement && e !== t) : [];
32
- }, R = (e) => {
33
- let t = l();
34
- return t ? e.getBoundingClientRect().top - t.getBoundingClientRect().top + t.scrollTop : 0;
35
- }, z = (e) => {
36
- let t = l();
37
- return t ? e.getBoundingClientRect().top - t.getBoundingClientRect().top : 0;
38
- }, B = () => {
39
- let e = l(), t = u();
40
- if (!e || !t) return 0;
41
- let n = s(t), r = e.getBoundingClientRect(), i = n.start + n.end;
42
- for (let t of L()) {
43
- let a = t.getBoundingClientRect();
44
- i = Math.max(i, a.bottom - r.top + e.scrollTop + n.end);
45
- }
46
- return i;
47
- }, de = () => {
48
- let e = l();
49
- return e ? Math.max(0, e.scrollHeight - e.clientHeight) : 0;
50
- }, V = (e) => {
51
- let t = d();
52
- if (!t) return;
53
- let n = Math.max(0, Math.ceil(e));
54
- k !== n && (k = n, t.hidden = n === 0, t.style.height = `${n}px`, t.style.marginTop = n > 0 ? `${-A}px` : "");
55
- }, fe = () => {
56
- let e = l(), t = u();
57
- if (!e || !t) return {
58
- start: !1,
59
- end: !1
60
- };
61
- let n = o().scrollEdgeThreshold, r = B();
62
- return {
63
- start: e.scrollTop > n,
64
- end: r - e.scrollTop - e.clientHeight > n
65
- };
66
- }, pe = (e) => {
67
- let t = l();
68
- if (!t) return;
69
- let n = t.scrollTop, i = n < S - r;
70
- S = n, o().autoScroll && !e.end && x !== "settling-jump" && x !== "anchored-to-message" ? x = "following-bottom" : x === "following-bottom" && e.end && i && !p() && (x = "free-scrolling");
71
- }, H = () => {
72
- let e = fe();
73
- pe(e);
74
- let t = x === "following-bottom" ? {
75
- ...e,
76
- end: !1
77
- } : e;
78
- ae(t.start), se(t.end);
79
- }, U = () => {
80
- M === null && (M = window.requestAnimationFrame(() => {
81
- M = null, H();
82
- }));
83
- }, W = () => {
84
- N === null && (N = window.requestAnimationFrame(() => {
85
- N = null, I > 0 && Ee();
86
- }));
87
- }, G = (e) => {
88
- j !== null && (window.clearTimeout(j), j = null), p() !== e && (m(e), H()), e && (j = window.setTimeout(() => {
89
- j = null, m(!1), H();
90
- }, i));
91
- }, K = (e, { behavior: t = "auto", auto: n = !1 } = {}) => {
92
- let i = l();
93
- if (!i) return;
94
- let a = Math.max(0, e);
95
- if (Math.abs(i.scrollTop - a) <= r) {
96
- i.scrollTop = a, H();
97
- return;
98
- }
99
- n && G(!0), i.scrollTo({
100
- top: a,
101
- behavior: t
102
- }), U();
103
- }, q = (e) => l() ? (V(0), E = null, x = "free-scrolling", K(0, { behavior: e?.behavior ?? "auto" }), W(), !0) : !1, J = (e) => l() ? (V(0), E = null, x = o().autoScroll ? "following-bottom" : "free-scrolling", K(de(), {
104
- behavior: e?.behavior ?? "auto",
105
- auto: !0
106
- }), W(), !0) : !1, me = (e, t, n) => {
107
- let r = l();
108
- if (!r) return 0;
109
- let i = u() ? s(u()) : {
110
- start: 0,
111
- end: 0
112
- }, a = R(e), o = e.getBoundingClientRect().height;
113
- switch (t?.align ?? "start") {
114
- case "center": {
115
- let e = Math.max(0, r.clientHeight - i.start - i.end);
116
- return a - i.start - (e - o) / 2 - n;
117
- }
118
- case "end": return a - r.clientHeight + o + i.end + n;
119
- case "nearest": {
120
- let e = a + o, t = r.scrollTop + i.start, s = r.scrollTop + r.clientHeight - i.end;
121
- return a >= t && e <= s ? r.scrollTop : a < t ? a - i.start - n : e - r.clientHeight + i.end + n;
122
- }
123
- default: return a - i.start - n;
124
- }
125
- }, Y = (e, t, { keepPreviousPeek: n = !1 } = {}) => {
126
- let r = l(), i = u();
127
- if (!r || !i?.contains(e)) return !1;
128
- let a = (t?.scrollMargin ?? o().scrollMargin) + (n ? o().scrollPreviousItemPeek : 0), s = me(e, t, a);
129
- return V(Math.max(0, s + r.clientHeight - B())), O = {
130
- element: e,
131
- viewportTop: z(e)
132
- }, x = n ? "anchored-to-message" : "settling-jump", E = n ? e : null, K(s, { behavior: t?.behavior ?? "auto" }), W(), !0;
133
- }, he = () => {
134
- let e = E;
135
- return !e?.isConnected || x !== "anchored-to-message" ? !1 : Y(e, { align: "start" }, { keepPreviousPeek: !0 });
136
- }, ge = () => {
137
- let e = l();
138
- if (!e || T || C === 0) return !1;
139
- let t = o().defaultScrollPosition, n = !1;
140
- if (t === "last-anchor") {
141
- let t = [...L()].reverse().find((e) => e.dataset.scrollAnchor === "true") ?? null;
142
- n = t ? B() - R(t) <= e.clientHeight ? J({ behavior: "auto" }) : Y(t, { align: "start" }, { keepPreviousPeek: !0 }) : J({ behavior: "auto" });
143
- } else n = t === "end" ? J({ behavior: "auto" }) : q({ behavior: "auto" });
144
- return n && (T = !0, h(!1)), n;
145
- }, X = () => {
146
- let e = D;
147
- if (!e) return !1;
148
- let t = v.get(e.id);
149
- return !t || !Y(t, e.options) ? !1 : (D = null, T = !0, h(!1), !0);
150
- }, _e = () => {
151
- P === null && (P = window.requestAnimationFrame(() => {
152
- P = null, X() && Z();
153
- }));
154
- }, ve = (e, t) => {
155
- let n = v.get(e);
156
- return n ? Y(n, t) ? (D = null, !0) : (D = {
157
- id: e,
158
- options: t
159
- }, !0) : C === 0 && (D = {
160
- id: e,
161
- options: t
162
- }, h(!1), !0);
163
- }, Z = () => {
164
- let e = l();
165
- if (!e) {
166
- O = null;
167
- return;
168
- }
169
- let t = e.getBoundingClientRect(), n = L().find((e) => {
170
- if (!e.dataset.messageId) return !1;
171
- let n = e.getBoundingClientRect();
172
- return n.bottom > t.top && n.top < t.bottom;
173
- }) ?? null;
174
- O = n ? {
175
- element: n,
176
- viewportTop: z(n)
177
- } : null;
178
- }, ye = () => {
179
- let e = O, t = l();
180
- if (!e || !t || !e.element.isConnected) return !1;
181
- let n = z(e.element) - e.viewportTop;
182
- return Math.abs(n) <= r ? !1 : (t.scrollTop += n, e.viewportTop = z(e.element), U(), W(), !0);
183
- }, be = (e, t) => {
184
- for (let n = t; n < e.length; n += 1) {
185
- let t = e[n];
186
- if (t?.dataset.scrollAnchor === "true") return t;
187
- }
188
- return null;
189
- }, xe = (e) => e.find((e) => e.dataset.scrollAnchor === "true" && !b.has(e)) ?? null, Se = (e, t) => {
190
- let n = 0;
191
- for (let r = t; r < e.length; r += 1) if (e[r]?.dataset.scrollAnchor === "true" && (n += 1, n > 1)) return !0;
192
- return !1;
193
- }, Q = () => {
194
- if (!u()) return;
195
- let e = L(), t = C, n = w;
196
- if (C = e.length, w = e[0] ?? null, e.length === 0 && h(!1), X()) {
197
- Z();
198
- return;
199
- }
200
- if (t === 0) {
201
- for (let t of e) t.dataset.scrollAnchor === "true" && b.add(t);
202
- if (ge()) {
203
- Z();
204
- return;
205
- }
206
- if (e.length > 0 && o().autoScroll && J({ behavior: "auto" })) {
207
- Z();
208
- return;
209
- }
210
- H(), W(), Z();
211
- return;
212
- }
213
- let r = n ? e.indexOf(n) : -1;
214
- if (f() && r > 0) {
215
- ye(), Z();
216
- return;
217
- }
218
- if (e.length > t) {
219
- let n = be(e, t);
220
- if (n) {
221
- if (o().autoScroll && x === "following-bottom" && Se(e, t)) {
222
- J({ behavior: "auto" }), Z();
223
- return;
224
- }
225
- Y(n, { align: "start" }, { keepPreviousPeek: !0 }), b.add(n), Z();
226
- return;
227
- }
228
- }
229
- if (e.length === t) {
230
- let t = xe(e);
231
- if (t) {
232
- Y(t, { align: "start" }, { keepPreviousPeek: !0 }), b.add(t), Z();
233
- return;
234
- }
235
- }
236
- x === "following-bottom" && o().autoScroll ? J({ behavior: "auto" }) : (H(), W()), Z();
237
- }, Ce = () => {
238
- if (x === "following-bottom" && o().autoScroll) {
239
- J({ behavior: "auto" });
240
- return;
241
- }
242
- let e = k;
243
- if (he()) {
244
- o().autoScroll && e > 0 && k === 0 && J({ behavior: "auto" });
245
- return;
246
- }
247
- U(), W();
248
- }, we = () => {
249
- H(), W(), Z();
250
- }, Te = () => {
251
- (x === "following-bottom" || x === "anchored-to-message" || x === "settling-jump") && (G(!1), x = "free-scrolling");
252
- }, Ee = () => {
253
- let e = l(), t = u();
254
- if (!e || !t) {
255
- _([]), g(null);
256
- return;
257
- }
258
- let n = e.getBoundingClientRect(), i = n.top + o().scrollMargin + o().scrollPreviousItemPeek, a = typeof IntersectionObserver > "u", s = [], c = null;
259
- for (let e of L()) {
260
- let t = e.dataset.messageId;
261
- if (!t) continue;
262
- let o = e.dataset.scrollAnchor === "true", l = o || a ? e.getBoundingClientRect() : null;
263
- (a && l ? l.bottom > i && l.top < n.bottom : y.has(t)) && s.push(t), o && l && l.top <= i + r && (c = t);
264
- }
265
- if (s.length === 0 && c === null) {
266
- _([]), g(null);
267
- return;
268
- }
269
- _(s), g(c);
270
- }, De = () => {
271
- if (typeof IntersectionObserver > "u") {
272
- W();
273
- return;
274
- }
275
- let e = l();
276
- !F && e && (F = new IntersectionObserver((e) => {
277
- for (let t of e) {
278
- let e = t.target.dataset.messageId;
279
- e && (t.isIntersecting ? y.add(e) : y.delete(e));
280
- }
281
- W();
282
- }, {
283
- root: e,
284
- rootMargin: `${-(o().scrollMargin + o().scrollPreviousItemPeek)}px 0px 0px 0px`,
285
- threshold: [
286
- 0,
287
- .01,
288
- .5,
289
- 1
290
- ]
291
- }));
292
- for (let e of v.values()) F?.observe(e);
293
- W();
294
- }, Oe = () => {
295
- N !== null && (window.cancelAnimationFrame(N), N = null), F?.disconnect(), F = null, y.clear(), _([]), g(null);
296
- }, ke = () => {
297
- I += 1, I === 1 && De(), W();
298
- let e = !1;
299
- return () => {
300
- e || (e = !0, --I, I === 0 && Oe());
301
- };
302
- }, $ = (e, t, n) => {
17
+ function l(l) {
18
+ let [u, d] = o(), [f, p] = o(), [m, h] = o(), [g, _] = o(!0), v = /* @__PURE__ */ new Map(), y = e({
19
+ viewport: u,
20
+ content: f,
21
+ spacer: m
22
+ }), { items: b, contentBottom: x } = y, S = i({
23
+ viewport: u,
24
+ content: f,
25
+ items: b,
26
+ options: l,
27
+ registeredElements: () => v.values()
28
+ }), { currentAnchorId: C, visibleMessageIds: w, schedule: T } = S, E = r({
29
+ viewport: u,
30
+ options: l,
31
+ contentBottom: x
32
+ }), { scrollableStart: D, scrollableEnd: O, autoscrolling: k, commit: A, schedule: j, releaseFollow: M } = E, N = n({
33
+ viewport: u,
34
+ content: f,
35
+ spacer: m,
36
+ options: l,
37
+ measure: y,
38
+ state: E,
39
+ scheduleVisibility: T
40
+ }), P = t({
41
+ viewport: u,
42
+ content: f,
43
+ options: l,
44
+ measure: y,
45
+ commands: N,
46
+ state: E,
47
+ scheduleState: j,
48
+ commitState: A,
49
+ scheduleVisibility: T,
50
+ preserveScrollOnPrepend: g,
51
+ getMessageElement: (e) => v.get(e)
52
+ }), { pendingScroll: F, scrollToStart: I, scrollToEnd: L, scrollToMessage: R, handleContentChange: z, handleResize: B, syncAfterScroll: V } = P, H = (e, t, n) => {
303
53
  if (t) {
304
- v.set(e, t), F?.observe(t), W(), D?.id === e && _e();
54
+ v.set(e, t), S.observe(t), T(), P.notifyMessageRegistered(e);
305
55
  return;
306
56
  }
307
- n && v.get(e) === n && (v.delete(e), y.delete(e), F?.unobserve(n), W());
57
+ n && v.get(e) === n && (v.delete(e), S.unobserve(e, n), T());
308
58
  };
309
- return e(() => {
310
- let e = u();
59
+ return a(() => {
60
+ let e = f();
311
61
  if (!e) return;
312
- Q();
313
- let t = typeof MutationObserver < "u" ? new MutationObserver(() => Q()) : null;
62
+ z();
63
+ let t = typeof MutationObserver < "u" ? new MutationObserver(() => z()) : null;
314
64
  t?.observe(e, { childList: !0 });
315
- let r = typeof MutationObserver < "u" ? new MutationObserver(() => Q()) : null;
316
- r?.observe(e, {
65
+ let n = typeof MutationObserver < "u" ? new MutationObserver(() => z()) : null;
66
+ n?.observe(e, {
317
67
  attributes: !0,
318
68
  attributeFilter: ["data-scroll-anchor"],
319
69
  subtree: !0
320
70
  });
321
- let i = 0, a = typeof ResizeObserver < "u" ? new ResizeObserver(() => {
322
- window.cancelAnimationFrame(i), i = window.requestAnimationFrame(Ce);
71
+ let r = 0, i = typeof ResizeObserver < "u" ? new ResizeObserver(() => {
72
+ window.cancelAnimationFrame(r), r = window.requestAnimationFrame(B);
323
73
  }) : null;
324
- a?.observe(e), n(() => {
325
- t?.disconnect(), r?.disconnect(), a?.disconnect(), window.cancelAnimationFrame(i);
74
+ i?.observe(e), s(() => {
75
+ t?.disconnect(), n?.disconnect(), i?.disconnect(), window.cancelAnimationFrame(r);
326
76
  });
327
- }), e(() => {
328
- let e = l();
77
+ }), a(() => {
78
+ let e = u();
329
79
  if (!e) return;
330
- I > 0 && !F && De();
331
- let t = () => we(), r = () => Te(), i = (e) => {
332
- a.has(e.key) && Te();
80
+ S.ensureObserver();
81
+ let t = () => V(), n = () => M(), r = (e) => {
82
+ c.has(e.key) && M();
333
83
  };
334
- e.addEventListener("scroll", t, { passive: !0 }), e.addEventListener("wheel", r, { passive: !0 }), e.addEventListener("touchmove", r, { passive: !0 }), e.addEventListener("keydown", i);
335
- let o = 0, s = typeof ResizeObserver < "u" ? new ResizeObserver(() => {
336
- window.cancelAnimationFrame(o), o = window.requestAnimationFrame(Ce);
84
+ e.addEventListener("scroll", t, { passive: !0 }), e.addEventListener("wheel", n, { passive: !0 }), e.addEventListener("touchmove", n, { passive: !0 }), e.addEventListener("keydown", r);
85
+ let i = 0, a = typeof ResizeObserver < "u" ? new ResizeObserver(() => {
86
+ window.cancelAnimationFrame(i), i = window.requestAnimationFrame(B);
337
87
  }) : null;
338
- s?.observe(e), n(() => {
339
- e.removeEventListener("scroll", t), e.removeEventListener("wheel", r), e.removeEventListener("touchmove", r), e.removeEventListener("keydown", i), s?.disconnect(), window.cancelAnimationFrame(o);
88
+ a?.observe(e), s(() => {
89
+ e.removeEventListener("scroll", t), e.removeEventListener("wheel", n), e.removeEventListener("touchmove", n), e.removeEventListener("keydown", r), a?.disconnect(), window.cancelAnimationFrame(i);
340
90
  });
341
- }), n(() => {
342
- j !== null && window.clearTimeout(j), M !== null && window.cancelAnimationFrame(M), P !== null && window.cancelAnimationFrame(P), N !== null && window.cancelAnimationFrame(N), F?.disconnect(), F = null;
91
+ }), s(() => {
92
+ P.dispose(), E.dispose(), S.dispose();
343
93
  }), {
344
- viewport: l,
345
- setViewport: ee,
346
- content: u,
347
- setContent: te,
94
+ viewport: u,
95
+ setViewport: d,
96
+ content: f,
97
+ setContent: p,
348
98
  setSpacer: (e) => {
349
- ne(e), A = c(e?.parentElement ?? null);
99
+ h(e);
350
100
  },
351
101
  registerItem: (e) => {
352
102
  let t = e.id;
353
- return t && $(t, e.element), () => {
354
- t && $(t, void 0, e.element);
103
+ return t && H(t, e.element), () => {
104
+ t && H(t, void 0, e.element);
355
105
  };
356
106
  },
357
- preserveScrollOnPrepend: f,
358
- setPreserveScrollOnPrepend: re,
359
- scrollableStart: ie,
360
- scrollableEnd: oe,
361
- autoscrolling: p,
362
- pendingScroll: ce,
363
- scrollToStart: q,
364
- scrollToEnd: J,
365
- scrollToMessage: ve,
366
- currentAnchorId: le,
367
- visibleMessageIds: ue,
368
- subscribeVisibility: ke,
369
- options: o
107
+ preserveScrollOnPrepend: g,
108
+ setPreserveScrollOnPrepend: _,
109
+ scrollableStart: D,
110
+ scrollableEnd: O,
111
+ autoscrolling: k,
112
+ pendingScroll: F,
113
+ scrollToStart: I,
114
+ scrollToEnd: L,
115
+ scrollToMessage: R,
116
+ currentAnchorId: C,
117
+ visibleMessageIds: w,
118
+ subscribeVisibility: S.subscribe,
119
+ options: l
370
120
  };
371
121
  }
372
122
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useMessageScrollerEngine.js","names":["AT_EDGE_TOLERANCE","AUTO_SCROLLING_TIMEOUT_MS","NAV_KEYS","parsePx","parsed","value","paddingBox","style","element","rowGap","useMessageScrollerEngine","viewport","setViewport","createSignal","content","setContent","spacer","setSpacer","preserveScrollOnPrepend","setPreserveScrollOnPrepend","scrollableStart","setScrollableStart","scrollableEnd","setScrollableEnd","autoscrolling","setAutoscrolling","pendingScroll","setPendingScroll","options","currentAnchorId","setCurrentAnchorId","visibleMessageIds","setVisibleMessageIds","messageElements","visibleIds","handledScrollAnchors","mode","lastScrollTop","itemCount","firstItem","defaultApplied","streamingTurn","pendingMessage","prependAnchor","spacerHeight","spacerGap","autoscrollingTimer","stateFrame","visibilityFrame","pendingFrame","observer","visibilitySubscribers","items","root","sp","child","itemOffsetTop","vp","itemTopInViewport","contentBottom","pad","vpRect","bottom","item","rect","maxScrollTop","setSpacerHeight","next","height","computeScrollable","threshold","updateModeFromScroll","top","movedUp","state","commitScrollState","exposed","scheduleStateCommit","scheduleVisibilitySync","computeVisibility","applyAutoscrolling","setScrollTop","auto","scrollToStart","command","scrollToEnd","targetTopFor","itemTop","visible","margin","vTop","vBottom","scrollToElement","keepPreviousPeek","target","reanchorToAnchoredMessage","el","applyDefaultScrollPosition","position","applied","lastAnchor","flushPendingScrollToMessage","pending","schedulePendingFlush","capturePrependAnchor","scrollToMessage","messageId","firstVisible","restorePrependAnchor","anchor","delta","firstAnchorFrom","index","from","list","firstUnhandledAnchor","hasMultipleAnchorsFrom","count","handleContentChange","previousCount","previousFirst","previousFirstIndex","firstNewAnchor","unhandled","handleResize","before","syncAfterScroll","releaseFollow","readingLine","hasObserver","anchorId","id","isAnchor","startVisibilityObserver","entry","entries","stopVisibilityObserver","subscribeVisibility","released","registerMessage","previous","createEffect","mutation","anchorMutation","frame","resize","onCleanup","onScroll","onIntent","onKeyDown","event"],"sources":["../../../src/components/message-scroller/useMessageScrollerEngine.ts"],"sourcesContent":["import { createEffect, createSignal, onCleanup } from \"solid-js\";\nimport type {\n MessageScrollerContextValue,\n MessageScrollerItemEntry,\n MessageScrollerProviderProps,\n MessageScrollerScrollOptions,\n} from \"./message-scroller.types\";\n\n/** 滚动位置比较容差(0.5px),对应上游的 `J` */\nconst AT_EDGE_TOLERANCE = 0.5;\n/** 「滚动到最新」后 data-autoscrolling 的持续时间 */\nconst AUTO_SCROLLING_TIMEOUT_MS = 180;\n/** 会让界面「让位」的键盘滚动键 */\nconst NAV_KEYS = new Set([\n \"ArrowDown\",\n \"ArrowUp\",\n \"End\",\n \"Home\",\n \"PageDown\",\n \"PageUp\",\n \" \",\n]);\n\ntype Mode =\n | \"following-bottom\"\n | \"free-scrolling\"\n | \"anchored-to-message\"\n | \"settling-jump\";\n\ninterface ScrollState {\n start: boolean;\n end: boolean;\n}\n\ninterface PaddingBox {\n start: number;\n end: number;\n}\n\nfunction parsePx(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction paddingBox(element: HTMLElement): PaddingBox {\n const style = window.getComputedStyle(element);\n return {\n start: parsePx(style.paddingBlockStart || style.paddingTop),\n end: parsePx(style.paddingBlockEnd || style.paddingBottom),\n };\n}\n\nfunction rowGap(element: HTMLElement | null): number {\n if (!element) return 0;\n const style = window.getComputedStyle(element);\n return parsePx(style.rowGap === \"normal\" ? style.gap : style.rowGap);\n}\n\n/**\n * MessageScroller 的滚动引擎(headless,行为对齐 `@shadcn/react`):\n * - 滚动状态(能否向上/下)由 content 的**非 spacer** 内容底部计算,spacer 不计入;\n * - `autoScroll` 只在模式为 `following-bottom` 时跟随;滚轮/触摸/键盘滚动与显式跳转\n * 都会立刻让位(`free-scrolling`);\n * - 新回合锚定:新增 scrollAnchor 行时用 `scrollToElement(keepPreviousPeek)` 将其放到\n * 顶部并保留上一项;同时把该行记为 `streamingTurn`,回复生长时原地重锚定;\n * - `scrollToElement` 会按需设置尾部 spacer,让目标行即使靠近会话末尾也能滚到顶部;\n * - `defaultScrollPosition`:首次非空渲染定位一次;`last-anchor` 无锚点或放得下时回退 end;\n * - `preserveScrollOnPrepend`:记录首个可见行及其视口位置,上方插入历史后按差值补偿;\n * - 可见性:IntersectionObserver 按需订阅(rootMargin 用 scrollMargin + peek),无 IO 时退化为\n * 逐帧测量;`currentAnchorId` 是阅读行之上最后一个锚点。\n */\nexport function useMessageScrollerEngine(\n options: () => Required<Omit<MessageScrollerProviderProps, \"children\">>,\n): MessageScrollerContextValue {\n const [viewport, setViewport] = createSignal<HTMLElement>();\n const [content, setContent] = createSignal<HTMLElement>();\n const [spacer, setSpacer] = createSignal<HTMLElement>();\n const [preserveScrollOnPrepend, setPreserveScrollOnPrepend] =\n createSignal(true);\n const [scrollableStart, setScrollableStart] = createSignal(false);\n const [scrollableEnd, setScrollableEnd] = createSignal(false);\n const [autoscrolling, setAutoscrolling] = createSignal(false);\n const [pendingScroll, setPendingScroll] = createSignal(\n options().defaultScrollPosition !== \"start\",\n );\n const [currentAnchorId, setCurrentAnchorId] = createSignal<string | null>(\n null,\n );\n const [visibleMessageIds, setVisibleMessageIds] = createSignal<string[]>([]);\n\n const messageElements = new Map<string, HTMLElement>();\n const visibleIds = new Set<string>();\n const handledScrollAnchors = new WeakSet<HTMLElement>();\n\n let mode: Mode = options().autoScroll ? \"following-bottom\" : \"free-scrolling\";\n let lastScrollTop = 0;\n let itemCount = 0;\n let firstItem: HTMLElement | null = null;\n let defaultApplied = false;\n let streamingTurn: HTMLElement | null = null;\n let pendingMessage: {\n id: string;\n options?: MessageScrollerScrollOptions;\n } | null = null;\n let prependAnchor: { element: HTMLElement; viewportTop: number } | null =\n null;\n let spacerHeight = 0;\n let spacerGap = 0;\n let autoscrollingTimer: number | null = null;\n let stateFrame: number | null = null;\n let visibilityFrame: number | null = null;\n let pendingFrame: number | null = null;\n let observer: IntersectionObserver | null = null;\n let visibilitySubscribers = 0;\n\n /** content 的直接子元素,排除内部 spacer */\n const items = (): HTMLElement[] => {\n const root = content();\n const sp = spacer();\n if (!root) return [];\n return Array.from(root.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement && child !== sp,\n );\n };\n\n /** 行相对滚动容器内容顶部的偏移(用测量,避免 offsetParent 不确定) */\n const itemOffsetTop = (element: HTMLElement) => {\n const vp = viewport();\n if (!vp) return 0;\n return (\n element.getBoundingClientRect().top -\n vp.getBoundingClientRect().top +\n vp.scrollTop\n );\n };\n\n const itemTopInViewport = (element: HTMLElement) => {\n const vp = viewport();\n if (!vp) return 0;\n return element.getBoundingClientRect().top - vp.getBoundingClientRect().top;\n };\n\n /** 内容底部(不含 spacer),即内容真实滚动高度 */\n const contentBottom = () => {\n const vp = viewport();\n const root = content();\n if (!vp || !root) return 0;\n const pad = paddingBox(root);\n const vpRect = vp.getBoundingClientRect();\n let bottom = pad.start + pad.end;\n for (const item of items()) {\n const rect = item.getBoundingClientRect();\n bottom = Math.max(\n bottom,\n rect.bottom - vpRect.top + vp.scrollTop + pad.end,\n );\n }\n return bottom;\n };\n\n const maxScrollTop = () => {\n const vp = viewport();\n return vp ? Math.max(0, vp.scrollHeight - vp.clientHeight) : 0;\n };\n\n /** 设置尾部 spacer:让目标行有空间滚到指定位置;0 时隐藏 */\n const setSpacerHeight = (height: number) => {\n const sp = spacer();\n if (!sp) return;\n const next = Math.max(0, Math.ceil(height));\n if (spacerHeight === next) return;\n spacerHeight = next;\n sp.hidden = next === 0;\n sp.style.height = `${next}px`;\n sp.style.marginTop = next > 0 ? `${-spacerGap}px` : \"\";\n };\n\n const computeScrollable = (): ScrollState => {\n const vp = viewport();\n const root = content();\n if (!vp || !root) return { start: false, end: false };\n const threshold = options().scrollEdgeThreshold;\n const bottom = contentBottom();\n return {\n start: vp.scrollTop > threshold,\n end: bottom - vp.scrollTop - vp.clientHeight > threshold,\n };\n };\n\n const updateModeFromScroll = (state: ScrollState) => {\n const vp = viewport();\n if (!vp) return;\n const top = vp.scrollTop;\n const movedUp = top < lastScrollTop - AT_EDGE_TOLERANCE;\n lastScrollTop = top;\n if (\n options().autoScroll &&\n !state.end &&\n mode !== \"settling-jump\" &&\n mode !== \"anchored-to-message\"\n ) {\n mode = \"following-bottom\";\n } else if (\n mode === \"following-bottom\" &&\n state.end &&\n movedUp &&\n !autoscrolling()\n ) {\n mode = \"free-scrolling\";\n }\n };\n\n const commitScrollState = () => {\n const state = computeScrollable();\n updateModeFromScroll(state);\n // 跟随输出时对 UI 隐藏「还能向下滚」——按钮不出现,直到读者回到实时边缘\n const exposed =\n mode === \"following-bottom\" ? { ...state, end: false } : state;\n setScrollableStart(exposed.start);\n setScrollableEnd(exposed.end);\n };\n\n const scheduleStateCommit = () => {\n if (stateFrame !== null) return;\n stateFrame = window.requestAnimationFrame(() => {\n stateFrame = null;\n commitScrollState();\n });\n };\n\n const scheduleVisibilitySync = () => {\n if (visibilityFrame !== null) return;\n visibilityFrame = window.requestAnimationFrame(() => {\n visibilityFrame = null;\n if (visibilitySubscribers > 0) computeVisibility();\n });\n };\n\n const applyAutoscrolling = (next: boolean) => {\n if (autoscrollingTimer !== null) {\n window.clearTimeout(autoscrollingTimer);\n autoscrollingTimer = null;\n }\n if (autoscrolling() !== next) {\n setAutoscrolling(next);\n commitScrollState();\n }\n if (next) {\n autoscrollingTimer = window.setTimeout(() => {\n autoscrollingTimer = null;\n setAutoscrolling(false);\n commitScrollState();\n }, AUTO_SCROLLING_TIMEOUT_MS);\n }\n };\n\n const setScrollTop = (\n top: number,\n {\n behavior = \"auto\" as ScrollBehavior,\n auto = false,\n }: { behavior?: ScrollBehavior; auto?: boolean } = {},\n ) => {\n const vp = viewport();\n if (!vp) return;\n const next = Math.max(0, top);\n if (Math.abs(vp.scrollTop - next) <= AT_EDGE_TOLERANCE) {\n vp.scrollTop = next;\n commitScrollState();\n return;\n }\n if (auto) applyAutoscrolling(true);\n vp.scrollTo({ top: next, behavior });\n scheduleStateCommit();\n };\n\n const scrollToStart = (command?: MessageScrollerScrollOptions) => {\n if (!viewport()) return false;\n setSpacerHeight(0);\n streamingTurn = null;\n mode = \"free-scrolling\";\n setScrollTop(0, { behavior: command?.behavior ?? \"auto\" });\n scheduleVisibilitySync();\n return true;\n };\n\n const scrollToEnd = (command?: MessageScrollerScrollOptions) => {\n if (!viewport()) return false;\n setSpacerHeight(0);\n streamingTurn = null;\n mode = options().autoScroll ? \"following-bottom\" : \"free-scrolling\";\n setScrollTop(maxScrollTop(), {\n behavior: command?.behavior ?? \"auto\",\n auto: true,\n });\n scheduleVisibilitySync();\n return true;\n };\n\n const targetTopFor = (\n element: HTMLElement,\n command: MessageScrollerScrollOptions | undefined,\n margin: number,\n ) => {\n const vp = viewport();\n if (!vp) return 0;\n const pad = content() ? paddingBox(content()!) : { start: 0, end: 0 };\n const itemTop = itemOffsetTop(element);\n const height = element.getBoundingClientRect().height;\n switch (command?.align ?? \"start\") {\n case \"center\": {\n const visible = Math.max(0, vp.clientHeight - pad.start - pad.end);\n return itemTop - pad.start - (visible - height) / 2 - margin;\n }\n case \"end\":\n return itemTop - vp.clientHeight + height + pad.end + margin;\n case \"nearest\": {\n const bottom = itemTop + height;\n const vTop = vp.scrollTop + pad.start;\n const vBottom = vp.scrollTop + vp.clientHeight - pad.end;\n if (itemTop >= vTop && bottom <= vBottom) return vp.scrollTop;\n if (itemTop < vTop) return itemTop - pad.start - margin;\n return bottom - vp.clientHeight + pad.end + margin;\n }\n default:\n return itemTop - pad.start - margin;\n }\n };\n\n const scrollToElement = (\n element: HTMLElement,\n command?: MessageScrollerScrollOptions,\n { keepPreviousPeek = false }: { keepPreviousPeek?: boolean } = {},\n ) => {\n const vp = viewport();\n const root = content();\n if (!vp || !root?.contains(element)) return false;\n const margin =\n (command?.scrollMargin ?? options().scrollMargin) +\n (keepPreviousPeek ? options().scrollPreviousItemPeek : 0);\n const target = targetTopFor(element, command, margin);\n setSpacerHeight(Math.max(0, target + vp.clientHeight - contentBottom()));\n prependAnchor = { element, viewportTop: itemTopInViewport(element) };\n mode = keepPreviousPeek ? \"anchored-to-message\" : \"settling-jump\";\n streamingTurn = keepPreviousPeek ? element : null;\n setScrollTop(target, { behavior: command?.behavior ?? \"auto\" });\n scheduleVisibilitySync();\n return true;\n };\n\n const reanchorToAnchoredMessage = () => {\n const el = streamingTurn;\n if (!el?.isConnected || mode !== \"anchored-to-message\") return false;\n return scrollToElement(el, { align: \"start\" }, { keepPreviousPeek: true });\n };\n\n const applyDefaultScrollPosition = () => {\n const vp = viewport();\n if (!vp || defaultApplied || itemCount === 0) return false;\n const position = options().defaultScrollPosition;\n let applied = false;\n if (position === \"last-anchor\") {\n const list = items();\n const lastAnchor =\n [...list].reverse().find((el) => el.dataset.scrollAnchor === \"true\") ??\n null;\n if (!lastAnchor) {\n applied = scrollToEnd({ behavior: \"auto\" });\n } else if (\n contentBottom() - itemOffsetTop(lastAnchor) <=\n vp.clientHeight\n ) {\n // 该回合完全放得下 → 直接到底\n applied = scrollToEnd({ behavior: \"auto\" });\n } else {\n applied = scrollToElement(\n lastAnchor,\n { align: \"start\" },\n { keepPreviousPeek: true },\n );\n }\n } else if (position === \"end\") {\n applied = scrollToEnd({ behavior: \"auto\" });\n } else {\n applied = scrollToStart({ behavior: \"auto\" });\n }\n if (applied) {\n defaultApplied = true;\n setPendingScroll(false);\n }\n return applied;\n };\n\n const flushPendingScrollToMessage = () => {\n const pending = pendingMessage;\n if (!pending) return false;\n const element = messageElements.get(pending.id);\n if (!element || !scrollToElement(element, pending.options)) return false;\n pendingMessage = null;\n defaultApplied = true;\n setPendingScroll(false);\n return true;\n };\n\n const schedulePendingFlush = () => {\n if (pendingFrame !== null) return;\n pendingFrame = window.requestAnimationFrame(() => {\n pendingFrame = null;\n if (flushPendingScrollToMessage()) capturePrependAnchor();\n });\n };\n\n const scrollToMessage = (\n messageId: string,\n command?: MessageScrollerScrollOptions,\n ) => {\n const element = messageElements.get(messageId);\n if (element) {\n if (scrollToElement(element, command)) {\n pendingMessage = null;\n return true;\n }\n pendingMessage = { id: messageId, options: command };\n return true;\n }\n // 会话尚未挂载任何行时可排队(客户端解析永久链接);已挂载但缺失则返回 false\n if (itemCount === 0) {\n pendingMessage = { id: messageId, options: command };\n setPendingScroll(false);\n return true;\n }\n return false;\n };\n\n const capturePrependAnchor = () => {\n const vp = viewport();\n if (!vp) {\n prependAnchor = null;\n return;\n }\n const vpRect = vp.getBoundingClientRect();\n const firstVisible =\n items().find((el) => {\n if (!el.dataset.messageId) return false;\n const rect = el.getBoundingClientRect();\n return rect.bottom > vpRect.top && rect.top < vpRect.bottom;\n }) ?? null;\n prependAnchor = firstVisible\n ? { element: firstVisible, viewportTop: itemTopInViewport(firstVisible) }\n : null;\n };\n\n const restorePrependAnchor = () => {\n const anchor = prependAnchor;\n const vp = viewport();\n if (!anchor || !vp || !anchor.element.isConnected) return false;\n const delta = itemTopInViewport(anchor.element) - anchor.viewportTop;\n if (Math.abs(delta) <= AT_EDGE_TOLERANCE) return false;\n vp.scrollTop += delta;\n anchor.viewportTop = itemTopInViewport(anchor.element);\n scheduleStateCommit();\n scheduleVisibilitySync();\n return true;\n };\n\n const firstAnchorFrom = (list: HTMLElement[], from: number) => {\n for (let index = from; index < list.length; index += 1) {\n const el = list[index];\n if (el?.dataset.scrollAnchor === \"true\") return el;\n }\n return null;\n };\n\n const firstUnhandledAnchor = (list: HTMLElement[]) =>\n list.find(\n (el) =>\n el.dataset.scrollAnchor === \"true\" && !handledScrollAnchors.has(el),\n ) ?? null;\n\n const hasMultipleAnchorsFrom = (list: HTMLElement[], from: number) => {\n let count = 0;\n for (let index = from; index < list.length; index += 1) {\n if (list[index]?.dataset.scrollAnchor === \"true\") {\n count += 1;\n if (count > 1) return true;\n }\n }\n return false;\n };\n\n const handleContentChange = () => {\n const root = content();\n if (!root) return;\n const list = items();\n const previousCount = itemCount;\n const previousFirst = firstItem;\n itemCount = list.length;\n firstItem = list[0] ?? null;\n\n // 空会话不隐藏视口(data-pending-scroll 跳过)\n if (list.length === 0) setPendingScroll(false);\n\n if (flushPendingScrollToMessage()) {\n capturePrependAnchor();\n return;\n }\n\n if (previousCount === 0) {\n // 初次定位时把已存在的锚点标记为已处理,避免后续 resize/属性变化误触发重锚定\n for (const el of list) {\n if (el.dataset.scrollAnchor === \"true\") handledScrollAnchors.add(el);\n }\n if (applyDefaultScrollPosition()) {\n capturePrependAnchor();\n return;\n }\n if (\n list.length > 0 &&\n options().autoScroll &&\n scrollToEnd({ behavior: \"auto\" })\n ) {\n capturePrependAnchor();\n return;\n }\n commitScrollState();\n scheduleVisibilitySync();\n capturePrependAnchor();\n return;\n }\n\n const previousFirstIndex = previousFirst ? list.indexOf(previousFirst) : -1;\n if (preserveScrollOnPrepend() && previousFirstIndex > 0) {\n restorePrependAnchor();\n capturePrependAnchor();\n return;\n }\n\n if (list.length > previousCount) {\n const firstNewAnchor = firstAnchorFrom(list, previousCount);\n if (firstNewAnchor) {\n // 同批新增多个锚点:跟随底部,避免在多个锚点间跳来跳去\n if (\n options().autoScroll &&\n mode === \"following-bottom\" &&\n hasMultipleAnchorsFrom(list, previousCount)\n ) {\n scrollToEnd({ behavior: \"auto\" });\n capturePrependAnchor();\n return;\n }\n scrollToElement(\n firstNewAnchor,\n { align: \"start\" },\n { keepPreviousPeek: true },\n );\n handledScrollAnchors.add(firstNewAnchor);\n capturePrependAnchor();\n return;\n }\n }\n\n // 行数没变但出现了未处理的新锚点(例如给已有行打开 scrollAnchor)\n if (list.length === previousCount) {\n const unhandled = firstUnhandledAnchor(list);\n if (unhandled) {\n scrollToElement(\n unhandled,\n { align: \"start\" },\n { keepPreviousPeek: true },\n );\n handledScrollAnchors.add(unhandled);\n capturePrependAnchor();\n return;\n }\n }\n\n if (mode === \"following-bottom\" && options().autoScroll) {\n scrollToEnd({ behavior: \"auto\" });\n } else {\n commitScrollState();\n scheduleVisibilitySync();\n }\n capturePrependAnchor();\n };\n\n const handleResize = () => {\n if (mode === \"following-bottom\" && options().autoScroll) {\n scrollToEnd({ behavior: \"auto\" });\n return;\n }\n const before = spacerHeight;\n if (reanchorToAnchoredMessage()) {\n if (options().autoScroll && before > 0 && spacerHeight === 0) {\n scrollToEnd({ behavior: \"auto\" });\n }\n return;\n }\n scheduleStateCommit();\n scheduleVisibilitySync();\n };\n\n const syncAfterScroll = () => {\n commitScrollState();\n scheduleVisibilitySync();\n capturePrependAnchor();\n };\n\n /** 滚轮/触摸/键盘滚动:立刻放弃跟随,把位置交还读者 */\n const releaseFollow = () => {\n if (\n mode === \"following-bottom\" ||\n mode === \"anchored-to-message\" ||\n mode === \"settling-jump\"\n ) {\n applyAutoscrolling(false);\n mode = \"free-scrolling\";\n }\n };\n\n const computeVisibility = () => {\n const vp = viewport();\n const root = content();\n if (!vp || !root) {\n setVisibleMessageIds([]);\n setCurrentAnchorId(null);\n return;\n }\n const vpRect = vp.getBoundingClientRect();\n const readingLine =\n vpRect.top + options().scrollMargin + options().scrollPreviousItemPeek;\n const hasObserver = typeof IntersectionObserver === \"undefined\";\n const visible: string[] = [];\n let anchorId: string | null = null;\n for (const item of items()) {\n const id = item.dataset.messageId;\n if (!id) continue;\n const isAnchor = item.dataset.scrollAnchor === \"true\";\n const rect =\n isAnchor || hasObserver ? item.getBoundingClientRect() : null;\n const isVisible =\n hasObserver && rect\n ? rect.bottom > readingLine && rect.top < vpRect.bottom\n : visibleIds.has(id);\n if (isVisible) visible.push(id);\n if (isAnchor && rect && rect.top <= readingLine + AT_EDGE_TOLERANCE) {\n anchorId = id;\n }\n }\n if (visible.length === 0 && anchorId === null) {\n setVisibleMessageIds([]);\n setCurrentAnchorId(null);\n return;\n }\n setVisibleMessageIds(visible);\n setCurrentAnchorId(anchorId);\n };\n\n const startVisibilityObserver = () => {\n if (typeof IntersectionObserver === \"undefined\") {\n scheduleVisibilitySync();\n return;\n }\n const vp = viewport();\n if (!observer && vp) {\n observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const id = (entry.target as HTMLElement).dataset.messageId;\n if (!id) continue;\n if (entry.isIntersecting) visibleIds.add(id);\n else visibleIds.delete(id);\n }\n scheduleVisibilitySync();\n },\n {\n root: vp,\n rootMargin: `${-(options().scrollMargin + options().scrollPreviousItemPeek)}px 0px 0px 0px`,\n threshold: [0, 0.01, 0.5, 1],\n },\n );\n }\n for (const element of messageElements.values()) observer?.observe(element);\n scheduleVisibilitySync();\n };\n\n const stopVisibilityObserver = () => {\n if (visibilityFrame !== null) {\n window.cancelAnimationFrame(visibilityFrame);\n visibilityFrame = null;\n }\n observer?.disconnect();\n observer = null;\n visibleIds.clear();\n setVisibleMessageIds([]);\n setCurrentAnchorId(null);\n };\n\n const subscribeVisibility = () => {\n visibilitySubscribers += 1;\n if (visibilitySubscribers === 1) startVisibilityObserver();\n scheduleVisibilitySync();\n let released = false;\n return () => {\n if (released) return;\n released = true;\n visibilitySubscribers -= 1;\n if (visibilitySubscribers === 0) stopVisibilityObserver();\n };\n };\n\n const registerMessage = (\n id: string,\n element: HTMLElement | undefined,\n previous?: HTMLElement,\n ) => {\n if (element) {\n messageElements.set(id, element);\n observer?.observe(element);\n scheduleVisibilitySync();\n if (pendingMessage?.id === id) schedulePendingFlush();\n return;\n }\n if (previous && messageElements.get(id) === previous) {\n messageElements.delete(id);\n visibleIds.delete(id);\n observer?.unobserve(previous);\n scheduleVisibilitySync();\n }\n };\n\n const registerItem = (entry: MessageScrollerItemEntry) => {\n const id = entry.id;\n if (id) registerMessage(id, entry.element);\n return () => {\n if (id) registerMessage(id, undefined, entry.element);\n };\n };\n\n const setSpacerElement = (element: HTMLElement | undefined) => {\n setSpacer(element);\n spacerGap = rowGap(element?.parentElement ?? null);\n };\n\n // 内容观察:初次定位 / prepend 保位 / 新回合锚定 / 跟随 / 尺寸\n createEffect(() => {\n const root = content();\n if (!root) return;\n handleContentChange();\n\n const mutation =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(() => handleContentChange())\n : null;\n mutation?.observe(root, { childList: true });\n\n // 已有行切换 scrollAnchor(dataset 变化)也要重新锚定\n const anchorMutation =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(() => handleContentChange())\n : null;\n anchorMutation?.observe(root, {\n attributes: true,\n attributeFilter: [\"data-scroll-anchor\"],\n subtree: true,\n });\n\n let frame = 0;\n const resize =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n window.cancelAnimationFrame(frame);\n frame = window.requestAnimationFrame(handleResize);\n })\n : null;\n resize?.observe(root);\n\n onCleanup(() => {\n mutation?.disconnect();\n anchorMutation?.disconnect();\n resize?.disconnect();\n window.cancelAnimationFrame(frame);\n });\n });\n\n // 视口:scroll / 用户滚动意图 / 尺寸\n createEffect(() => {\n const vp = viewport();\n if (!vp) return;\n if (visibilitySubscribers > 0 && !observer) startVisibilityObserver();\n\n const onScroll = () => syncAfterScroll();\n const onIntent = () => releaseFollow();\n const onKeyDown = (event: KeyboardEvent) => {\n if (NAV_KEYS.has(event.key)) releaseFollow();\n };\n vp.addEventListener(\"scroll\", onScroll, { passive: true });\n vp.addEventListener(\"wheel\", onIntent, { passive: true });\n vp.addEventListener(\"touchmove\", onIntent, { passive: true });\n vp.addEventListener(\"keydown\", onKeyDown);\n\n let frame = 0;\n const resize =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n window.cancelAnimationFrame(frame);\n frame = window.requestAnimationFrame(handleResize);\n })\n : null;\n resize?.observe(vp);\n\n onCleanup(() => {\n vp.removeEventListener(\"scroll\", onScroll);\n vp.removeEventListener(\"wheel\", onIntent);\n vp.removeEventListener(\"touchmove\", onIntent);\n vp.removeEventListener(\"keydown\", onKeyDown);\n resize?.disconnect();\n window.cancelAnimationFrame(frame);\n });\n });\n\n onCleanup(() => {\n if (autoscrollingTimer !== null) window.clearTimeout(autoscrollingTimer);\n if (stateFrame !== null) window.cancelAnimationFrame(stateFrame);\n if (pendingFrame !== null) window.cancelAnimationFrame(pendingFrame);\n if (visibilityFrame !== null) window.cancelAnimationFrame(visibilityFrame);\n observer?.disconnect();\n observer = null;\n });\n\n return {\n viewport,\n setViewport,\n content,\n setContent,\n setSpacer: setSpacerElement,\n registerItem,\n preserveScrollOnPrepend,\n setPreserveScrollOnPrepend,\n scrollableStart,\n scrollableEnd,\n autoscrolling,\n pendingScroll,\n scrollToStart,\n scrollToEnd,\n scrollToMessage,\n currentAnchorId,\n visibleMessageIds,\n subscribeVisibility,\n options,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useMessageScrollerEngine.js","names":["NAV_KEYS","useMessageScrollerEngine","viewport","setViewport","createSignal","content","setContent","spacer","setSpacerSignal","preserveScrollOnPrepend","setPreserveScrollOnPrepend","messageElements","measure","createDomMeasure","visibility","createVisibility","scheduleVisibilitySync","scrollState","createScrollState","commitScrollState","scheduleStateCommit","commands","createScrollCommands","anchoring","createAnchoring","id","registerMessage","element","previous","createEffect","root","mutation","handleContentChange","anchorMutation","frame","resize","handleResize","onCleanup","vp","onScroll","syncAfterScroll","onIntent","releaseFollow","onKeyDown","event","entry"],"sources":["../../../src/components/message-scroller/useMessageScrollerEngine.ts"],"sourcesContent":["import { createEffect, createSignal, onCleanup } from \"solid-js\";\nimport type {\n MessageScrollerContextValue,\n MessageScrollerItemEntry,\n MessageScrollerProviderProps,\n} from \"./message-scroller.types\";\nimport { createDomMeasure } from \"./message-scroller.dom-measure\";\nimport { createAnchoring } from \"./message-scroller.anchoring\";\nimport { createScrollCommands } from \"./message-scroller.commands\";\nimport { createScrollState } from \"./message-scroller.scroll-state\";\nimport { createVisibility } from \"./message-scroller.visibility\";\n\n/** 会让界面「让位」的键盘滚动键 */\nconst NAV_KEYS = new Set([\n \"ArrowDown\",\n \"ArrowUp\",\n \"End\",\n \"Home\",\n \"PageDown\",\n \"PageUp\",\n \" \",\n]);\n\n/**\n * MessageScroller 的滚动引擎(headless,行为对齐 `@shadcn/react`):\n * - 滚动状态(能否向上/下)由 content 的**非 spacer** 内容底部计算,spacer 不计入;\n * - `autoScroll` 只在模式为 `following-bottom` 时跟随;滚轮/触摸/键盘滚动与显式跳转\n * 都会立刻让位(`free-scrolling`);\n * - 新回合锚定:新增 scrollAnchor 行时用 `scrollToElement(keepPreviousPeek)` 将其放到\n * 顶部并保留上一项;同时把该行记为 `streamingTurn`,回复生长时原地重锚定;\n * - `scrollToElement` 会按需设置尾部 spacer,让目标行即使靠近会话末尾也能滚到顶部;\n * - `defaultScrollPosition`:首次非空渲染定位一次;`last-anchor` 无锚点或放得下时回退 end;\n * - `preserveScrollOnPrepend`:记录首个可见行及其视口位置,上方插入历史后按差值补偿;\n * - 可见性:IntersectionObserver 按需订阅(rootMargin 用 scrollMargin + peek),无 IO 时退化为\n * 逐帧测量;`currentAnchorId` 是阅读行之上最后一个锚点。\n */\nexport function useMessageScrollerEngine(\n options: () => Required<Omit<MessageScrollerProviderProps, \"children\">>,\n): MessageScrollerContextValue {\n const [viewport, setViewport] = createSignal<HTMLElement>();\n const [content, setContent] = createSignal<HTMLElement>();\n const [spacer, setSpacerSignal] = createSignal<HTMLElement>();\n const [preserveScrollOnPrepend, setPreserveScrollOnPrepend] =\n createSignal(true);\n\n const messageElements = new Map<string, HTMLElement>();\n\n const measure = createDomMeasure({ viewport, content, spacer });\n const { items, contentBottom } = measure;\n\n const visibility = createVisibility({\n viewport,\n content,\n items,\n options,\n registeredElements: () => messageElements.values(),\n });\n const {\n currentAnchorId,\n visibleMessageIds,\n schedule: scheduleVisibilitySync,\n } = visibility;\n\n const scrollState = createScrollState({ viewport, options, contentBottom });\n const {\n scrollableStart,\n scrollableEnd,\n autoscrolling,\n commit: commitScrollState,\n schedule: scheduleStateCommit,\n releaseFollow,\n } = scrollState;\n\n const commands = createScrollCommands({\n viewport,\n content,\n spacer,\n options,\n measure,\n state: scrollState,\n scheduleVisibility: scheduleVisibilitySync,\n });\n\n const anchoring = createAnchoring({\n viewport,\n content,\n options,\n measure,\n commands,\n state: scrollState,\n scheduleState: scheduleStateCommit,\n commitState: commitScrollState,\n scheduleVisibility: scheduleVisibilitySync,\n preserveScrollOnPrepend,\n getMessageElement: (id) => messageElements.get(id),\n });\n const {\n pendingScroll,\n scrollToStart,\n scrollToEnd,\n scrollToMessage,\n handleContentChange,\n handleResize,\n syncAfterScroll,\n } = anchoring;\n\n const registerMessage = (\n id: string,\n element: HTMLElement | undefined,\n previous?: HTMLElement,\n ) => {\n if (element) {\n messageElements.set(id, element);\n visibility.observe(element);\n scheduleVisibilitySync();\n anchoring.notifyMessageRegistered(id);\n return;\n }\n if (previous && messageElements.get(id) === previous) {\n messageElements.delete(id);\n visibility.unobserve(id, previous);\n scheduleVisibilitySync();\n }\n };\n\n const registerItem = (entry: MessageScrollerItemEntry) => {\n const id = entry.id;\n if (id) registerMessage(id, entry.element);\n return () => {\n if (id) registerMessage(id, undefined, entry.element);\n };\n };\n\n /** 公共入口:挂上尾部 spacer 元素(行间距在真正写高度时才惰性读取) */\n const attachSpacer = (element: HTMLElement | undefined) => {\n setSpacerSignal(element);\n };\n\n // 内容观察:初次定位 / prepend 保位 / 新回合锚定 / 跟随 / 尺寸\n createEffect(() => {\n const root = content();\n if (!root) return;\n handleContentChange();\n\n const mutation =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(() => handleContentChange())\n : null;\n mutation?.observe(root, { childList: true });\n\n // 已有行切换 scrollAnchor(dataset 变化)也要重新锚定\n const anchorMutation =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(() => handleContentChange())\n : null;\n anchorMutation?.observe(root, {\n attributes: true,\n attributeFilter: [\"data-scroll-anchor\"],\n subtree: true,\n });\n\n let frame = 0;\n const resize =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n window.cancelAnimationFrame(frame);\n frame = window.requestAnimationFrame(handleResize);\n })\n : null;\n resize?.observe(root);\n\n onCleanup(() => {\n mutation?.disconnect();\n anchorMutation?.disconnect();\n resize?.disconnect();\n window.cancelAnimationFrame(frame);\n });\n });\n\n // 视口:scroll / 用户滚动意图 / 尺寸\n createEffect(() => {\n const vp = viewport();\n if (!vp) return;\n visibility.ensureObserver();\n\n const onScroll = () => syncAfterScroll();\n const onIntent = () => releaseFollow();\n const onKeyDown = (event: KeyboardEvent) => {\n if (NAV_KEYS.has(event.key)) releaseFollow();\n };\n vp.addEventListener(\"scroll\", onScroll, { passive: true });\n vp.addEventListener(\"wheel\", onIntent, { passive: true });\n vp.addEventListener(\"touchmove\", onIntent, { passive: true });\n vp.addEventListener(\"keydown\", onKeyDown);\n\n let frame = 0;\n const resize =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n window.cancelAnimationFrame(frame);\n frame = window.requestAnimationFrame(handleResize);\n })\n : null;\n resize?.observe(vp);\n\n onCleanup(() => {\n vp.removeEventListener(\"scroll\", onScroll);\n vp.removeEventListener(\"wheel\", onIntent);\n vp.removeEventListener(\"touchmove\", onIntent);\n vp.removeEventListener(\"keydown\", onKeyDown);\n resize?.disconnect();\n window.cancelAnimationFrame(frame);\n });\n });\n\n onCleanup(() => {\n anchoring.dispose();\n scrollState.dispose();\n visibility.dispose();\n });\n\n return {\n viewport,\n setViewport,\n content,\n setContent,\n setSpacer: attachSpacer,\n registerItem,\n preserveScrollOnPrepend,\n setPreserveScrollOnPrepend,\n scrollableStart,\n scrollableEnd,\n autoscrolling,\n pendingScroll,\n scrollToStart,\n scrollToEnd,\n scrollToMessage,\n currentAnchorId,\n visibleMessageIds,\n subscribeVisibility: visibility.subscribe,\n options,\n };\n}\n"],"mappings":"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"}