@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.
- package/dist/components/accordion/Accordion/Accordion.js +3 -0
- package/dist/components/accordion/Accordion/Accordion.js.map +1 -1
- package/dist/components/accordion/AccordionContent/AccordionContent.js +27 -21
- package/dist/components/accordion/AccordionContent/AccordionContent.js.map +1 -1
- package/dist/components/accordion/AccordionItem/AccordionItem.js +3 -0
- package/dist/components/accordion/AccordionItem/AccordionItem.js.map +1 -1
- package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js +19 -18
- package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js.map +1 -1
- package/dist/components/alert/Alert/Alert.js +8 -3
- package/dist/components/alert/Alert/Alert.js.map +1 -1
- package/dist/components/alert/AlertAction/AlertAction.js +8 -3
- package/dist/components/alert/AlertAction/AlertAction.js.map +1 -1
- package/dist/components/alert/AlertDescription/AlertDescription.js +8 -3
- package/dist/components/alert/AlertDescription/AlertDescription.js.map +1 -1
- package/dist/components/alert/AlertTitle/AlertTitle.js +8 -3
- package/dist/components/alert/AlertTitle/AlertTitle.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialog/AlertDialog.d.ts +3 -1
- package/dist/components/alert-dialog/AlertDialog/AlertDialog.js +6 -1
- package/dist/components/alert-dialog/AlertDialog/AlertDialog.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js +9 -7
- package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.types.d.ts +9 -3
- package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js +8 -3
- package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js +8 -3
- package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js +8 -3
- package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js +8 -3
- package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js +8 -3
- package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js.map +1 -1
- package/dist/components/aspect-ratio/AspectRatio.js +3 -0
- package/dist/components/aspect-ratio/AspectRatio.js.map +1 -1
- package/dist/components/attachment/AttachmentTrigger/AttachmentTrigger.js +15 -7
- package/dist/components/attachment/AttachmentTrigger/AttachmentTrigger.js.map +1 -1
- package/dist/components/avatar/Avatar/Avatar.context.d.ts +7 -0
- package/dist/components/avatar/Avatar/Avatar.context.js +1 -1
- package/dist/components/avatar/Avatar/Avatar.context.js.map +1 -1
- package/dist/components/avatar/Avatar/Avatar.js +7 -2
- package/dist/components/avatar/Avatar/Avatar.js.map +1 -1
- package/dist/components/avatar/AvatarBadge/AvatarBadge.js +8 -3
- package/dist/components/avatar/AvatarBadge/AvatarBadge.js.map +1 -1
- package/dist/components/avatar/AvatarFallback/AvatarFallback.js +10 -5
- package/dist/components/avatar/AvatarFallback/AvatarFallback.js.map +1 -1
- package/dist/components/avatar/AvatarGroup/AvatarGroup.js +8 -3
- package/dist/components/avatar/AvatarGroup/AvatarGroup.js.map +1 -1
- package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js +8 -3
- package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js.map +1 -1
- package/dist/components/avatar/AvatarImage/AvatarImage.js +19 -12
- package/dist/components/avatar/AvatarImage/AvatarImage.js.map +1 -1
- package/dist/components/badge/Badge.js +9 -4
- package/dist/components/badge/Badge.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js +3 -0
- package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js.map +1 -1
- package/dist/components/bubble/BubbleContent/BubbleContent.js +21 -10
- package/dist/components/bubble/BubbleContent/BubbleContent.js.map +1 -1
- package/dist/components/button/Button.js +3 -0
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/button-group/ButtonGroup/ButtonGroup.js +3 -0
- package/dist/components/button-group/ButtonGroup/ButtonGroup.js.map +1 -1
- package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js +16 -7
- package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js.map +1 -1
- package/dist/components/calendar/Calendar/Calendar.d.ts +2 -3
- package/dist/components/calendar/Calendar/Calendar.js +89 -264
- package/dist/components/calendar/Calendar/Calendar.js.map +1 -1
- package/dist/components/calendar/Calendar/Calendar.options.d.ts +43 -0
- package/dist/components/calendar/Calendar/Calendar.options.js +38 -0
- package/dist/components/calendar/Calendar/Calendar.options.js.map +1 -0
- package/dist/components/calendar/Calendar/Calendar.selection.d.ts +16 -0
- package/dist/components/calendar/Calendar/Calendar.selection.js +50 -0
- package/dist/components/calendar/Calendar/Calendar.selection.js.map +1 -0
- package/dist/components/calendar/Calendar/Calendar.styles.d.ts +8 -0
- package/dist/components/calendar/Calendar/Calendar.styles.js +32 -0
- package/dist/components/calendar/Calendar/Calendar.styles.js.map +1 -0
- package/dist/components/calendar/Calendar/Calendar.utils.d.ts +3 -1
- package/dist/components/calendar/Calendar/Calendar.utils.js +4 -1
- package/dist/components/calendar/Calendar/Calendar.utils.js.map +1 -1
- package/dist/components/calendar/Calendar/CalendarDay.d.ts +28 -0
- package/dist/components/calendar/Calendar/CalendarDay.js +41 -0
- package/dist/components/calendar/Calendar/CalendarDay.js.map +1 -0
- package/dist/components/calendar/Calendar/CalendarMonth.d.ts +35 -0
- package/dist/components/calendar/Calendar/CalendarMonth.js +127 -0
- package/dist/components/calendar/Calendar/CalendarMonth.js.map +1 -0
- package/dist/components/calendar/Calendar/CalendarMonthCaption.d.ts +22 -0
- package/dist/components/calendar/Calendar/CalendarMonthCaption.js +103 -0
- package/dist/components/calendar/Calendar/CalendarMonthCaption.js.map +1 -0
- package/dist/components/calendar/index.js +3 -2
- package/dist/components/card/Card/Card.js +3 -0
- package/dist/components/card/Card/Card.js.map +1 -1
- package/dist/components/card/CardAction/CardAction.js +8 -3
- package/dist/components/card/CardAction/CardAction.js.map +1 -1
- package/dist/components/card/CardContent/CardContent.js +8 -3
- package/dist/components/card/CardContent/CardContent.js.map +1 -1
- package/dist/components/card/CardDescription/CardDescription.js +8 -3
- package/dist/components/card/CardDescription/CardDescription.js.map +1 -1
- package/dist/components/card/CardFooter/CardFooter.js +8 -3
- package/dist/components/card/CardFooter/CardFooter.js.map +1 -1
- package/dist/components/card/CardHeader/CardHeader.js +8 -3
- package/dist/components/card/CardHeader/CardHeader.js.map +1 -1
- package/dist/components/card/CardTitle/CardTitle.js +8 -3
- package/dist/components/card/CardTitle/CardTitle.js.map +1 -1
- package/dist/components/carousel/Carousel/Carousel.context.js +1 -1
- package/dist/components/carousel/Carousel/Carousel.context.js.map +1 -1
- package/dist/components/carousel/Carousel/Carousel.js +19 -12
- package/dist/components/carousel/Carousel/Carousel.js.map +1 -1
- package/dist/components/carousel/Carousel/useKeyboardNavigation.d.ts +11 -1
- package/dist/components/carousel/Carousel/useKeyboardNavigation.js +5 -4
- package/dist/components/carousel/Carousel/useKeyboardNavigation.js.map +1 -1
- package/dist/components/carousel/CarouselContent/CarouselContent.js +8 -3
- package/dist/components/carousel/CarouselContent/CarouselContent.js.map +1 -1
- package/dist/components/carousel/CarouselNext/CarouselNext.js +29 -16
- package/dist/components/carousel/CarouselNext/CarouselNext.js.map +1 -1
- package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js +29 -16
- package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js.map +1 -1
- package/dist/components/checkbox/Checkbox/Checkbox.js +32 -25
- package/dist/components/checkbox/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/collapsible/Collapsible/Collapsible.context.js +1 -1
- package/dist/components/collapsible/Collapsible/Collapsible.context.js.map +1 -1
- package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js +13 -12
- package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js.map +1 -1
- package/dist/components/combobox/Combobox/Combobox.js +52 -52
- package/dist/components/combobox/Combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/Combobox/Combobox.types.d.ts +15 -6
- package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js +7 -3
- package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js.map +1 -1
- package/dist/components/combobox/ComboboxClear/ComboboxClear.js +1 -1
- package/dist/components/combobox/ComboboxClear/ComboboxClear.js.map +1 -1
- package/dist/components/combobox/ComboboxInput/ComboboxInput.js +26 -10
- package/dist/components/combobox/ComboboxInput/ComboboxInput.js.map +1 -1
- package/dist/components/combobox/ComboboxItem/ComboboxItem.js +6 -5
- package/dist/components/combobox/ComboboxItem/ComboboxItem.js.map +1 -1
- package/dist/components/combobox/ComboboxList/ComboboxList.js +17 -11
- package/dist/components/combobox/ComboboxList/ComboboxList.js.map +1 -1
- package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js +8 -1
- package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js.map +1 -1
- package/dist/components/context-menu/ContextMenu/ContextMenu.js +10 -8
- package/dist/components/context-menu/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.d.ts +33 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.js +41 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.js.map +1 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.d.ts +25 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.js +20 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.js.map +1 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.d.ts +31 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.js +39 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.js.map +1 -0
- package/dist/components/context-menu/ContextMenuContent/useContextMenuContent.js +70 -136
- package/dist/components/context-menu/ContextMenuContent/useContextMenuContent.js.map +1 -1
- package/dist/components/context-menu/ContextMenuSub/ContextMenuSub.js +2 -1
- package/dist/components/context-menu/ContextMenuSub/ContextMenuSub.js.map +1 -1
- package/dist/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.js +20 -10
- package/dist/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.js.map +1 -1
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.d.ts +24 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.js +26 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.js.map +1 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.d.ts +35 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.js +17 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.js.map +1 -0
- package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.d.ts +9 -11
- package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.js +36 -33
- package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.js.map +1 -1
- package/dist/components/context-menu/context-menu.keyboard.d.ts +29 -0
- package/dist/components/context-menu/context-menu.keyboard.js +52 -0
- package/dist/components/context-menu/context-menu.keyboard.js.map +1 -0
- package/dist/components/context-menu/context-menu.typeahead.d.ts +27 -0
- package/dist/components/context-menu/context-menu.typeahead.js +19 -0
- package/dist/components/context-menu/context-menu.typeahead.js.map +1 -0
- package/dist/components/context-menu/context-menu.utils.d.ts +5 -2
- package/dist/components/context-menu/context-menu.utils.js +17 -39
- package/dist/components/context-menu/context-menu.utils.js.map +1 -1
- package/dist/components/date-picker/DatePicker/DatePicker.js +6 -0
- package/dist/components/date-picker/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/dialog/Dialog/Dialog.context.js +1 -1
- package/dist/components/dialog/Dialog/Dialog.context.js.map +1 -1
- package/dist/components/dialog/Dialog/Dialog.js +24 -15
- package/dist/components/dialog/Dialog/Dialog.js.map +1 -1
- package/dist/components/dialog/Dialog/Dialog.types.d.ts +5 -0
- package/dist/components/dialog/DialogClose/DialogClose.js +20 -19
- package/dist/components/dialog/DialogClose/DialogClose.js.map +1 -1
- package/dist/components/dialog/DialogContent/DialogContent.context.js +1 -1
- package/dist/components/dialog/DialogContent/DialogContent.context.js.map +1 -1
- package/dist/components/dialog/DialogDescription/DialogDescription.js +8 -3
- package/dist/components/dialog/DialogDescription/DialogDescription.js.map +1 -1
- package/dist/components/dialog/DialogFooter/DialogFooter.js +8 -3
- package/dist/components/dialog/DialogFooter/DialogFooter.js.map +1 -1
- package/dist/components/dialog/DialogHeader/DialogHeader.js +8 -3
- package/dist/components/dialog/DialogHeader/DialogHeader.js.map +1 -1
- package/dist/components/dialog/DialogOverlay/DialogOverlay.js +3 -0
- package/dist/components/dialog/DialogOverlay/DialogOverlay.js.map +1 -1
- package/dist/components/dialog/DialogSurface/DialogSurface.js +34 -26
- package/dist/components/dialog/DialogSurface/DialogSurface.js.map +1 -1
- package/dist/components/dialog/DialogTitle/DialogTitle.js +8 -3
- package/dist/components/dialog/DialogTitle/DialogTitle.js.map +1 -1
- package/dist/components/drawer/Drawer/Drawer.js +1 -1
- package/dist/components/drawer/Drawer/Drawer.js.map +1 -1
- package/dist/components/drawer/Drawer/create-change-event-details.js +4 -20
- package/dist/components/drawer/Drawer/create-change-event-details.js.map +1 -1
- package/dist/components/drawer/DrawerContent/drawer-swipe.utils.d.ts +32 -0
- package/dist/components/drawer/DrawerContent/drawer-swipe.utils.js +36 -0
- package/dist/components/drawer/DrawerContent/drawer-swipe.utils.js.map +1 -0
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.d.ts +3 -0
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.js +22 -42
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.js.map +1 -1
- package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js +1 -1
- package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuTrigger/DropdownMenuTrigger.js +7 -7
- package/dist/components/dropdown-menu/DropdownMenuTrigger/DropdownMenuTrigger.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.d.ts +7 -1
- package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.js +10 -10
- package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.js.map +1 -1
- package/dist/components/field/Field/Field.js +3 -0
- package/dist/components/field/Field/Field.js.map +1 -1
- package/dist/components/field/FieldContent/FieldContent.js +8 -3
- package/dist/components/field/FieldContent/FieldContent.js.map +1 -1
- package/dist/components/field/FieldDescription/FieldDescription.js +8 -3
- package/dist/components/field/FieldDescription/FieldDescription.js.map +1 -1
- package/dist/components/field/FieldError/FieldError.js +8 -3
- package/dist/components/field/FieldError/FieldError.js.map +1 -1
- package/dist/components/field/FieldGroup/FieldGroup.js +8 -3
- package/dist/components/field/FieldGroup/FieldGroup.js.map +1 -1
- package/dist/components/field/FieldLabel/FieldLabel.js +3 -0
- package/dist/components/field/FieldLabel/FieldLabel.js.map +1 -1
- package/dist/components/field/FieldLegend/FieldLegend.js +3 -0
- package/dist/components/field/FieldLegend/FieldLegend.js.map +1 -1
- package/dist/components/field/FieldSeparator/FieldSeparator.js +3 -0
- package/dist/components/field/FieldSeparator/FieldSeparator.js.map +1 -1
- package/dist/components/field/FieldSet/FieldSet.js +8 -3
- package/dist/components/field/FieldSet/FieldSet.js.map +1 -1
- package/dist/components/field/FieldTitle/FieldTitle.js +8 -3
- package/dist/components/field/FieldTitle/FieldTitle.js.map +1 -1
- package/dist/components/image/Image.utils.d.ts +14 -16
- package/dist/components/image/Image.utils.js +146 -190
- package/dist/components/image/Image.utils.js.map +1 -1
- package/dist/components/image/ImageElement.js +31 -27
- package/dist/components/image/ImageElement.js.map +1 -1
- package/dist/components/image/lib/blur.d.ts +31 -0
- package/dist/components/image/lib/blur.js +24 -0
- package/dist/components/image/lib/blur.js.map +1 -0
- package/dist/components/image/lib/dev-checks.d.ts +52 -0
- package/dist/components/image/lib/handle-loading.d.ts +13 -0
- package/dist/components/image/lib/handle-loading.js +20 -0
- package/dist/components/image/lib/handle-loading.js.map +1 -0
- package/dist/components/image/lib/loader.d.ts +39 -0
- package/dist/components/image/lib/loader.js +57 -0
- package/dist/components/image/lib/loader.js.map +1 -0
- package/dist/components/image/lib/static-import.d.ts +14 -0
- package/dist/components/image/lib/static-import.js +17 -0
- package/dist/components/image/lib/static-import.js.map +1 -0
- package/dist/components/input-group/InputGroup/InputGroup.js +8 -3
- package/dist/components/input-group/InputGroup/InputGroup.js.map +1 -1
- package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js +3 -0
- package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js.map +1 -1
- package/dist/components/input-group/InputGroupButton/InputGroupButton.js +3 -0
- package/dist/components/input-group/InputGroupButton/InputGroupButton.js.map +1 -1
- package/dist/components/input-group/InputGroupInput/InputGroupInput.js +3 -0
- package/dist/components/input-group/InputGroupInput/InputGroupInput.js.map +1 -1
- package/dist/components/input-group/InputGroupText/InputGroupText.js +8 -3
- package/dist/components/input-group/InputGroupText/InputGroupText.js.map +1 -1
- package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js +3 -0
- package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js.map +1 -1
- package/dist/components/item/Item/Item.js +9 -0
- package/dist/components/item/Item/Item.js.map +1 -1
- package/dist/components/item/ItemActions/ItemActions.js +8 -3
- package/dist/components/item/ItemActions/ItemActions.js.map +1 -1
- package/dist/components/item/ItemContent/ItemContent.js +8 -3
- package/dist/components/item/ItemContent/ItemContent.js.map +1 -1
- package/dist/components/item/ItemDescription/ItemDescription.js +8 -3
- package/dist/components/item/ItemDescription/ItemDescription.js.map +1 -1
- package/dist/components/item/ItemFooter/ItemFooter.js +8 -3
- package/dist/components/item/ItemFooter/ItemFooter.js.map +1 -1
- package/dist/components/item/ItemGroup/ItemGroup.js +8 -3
- package/dist/components/item/ItemGroup/ItemGroup.js.map +1 -1
- package/dist/components/item/ItemHeader/ItemHeader.js +8 -3
- package/dist/components/item/ItemHeader/ItemHeader.js.map +1 -1
- package/dist/components/item/ItemMedia/ItemMedia.js +3 -0
- package/dist/components/item/ItemMedia/ItemMedia.js.map +1 -1
- package/dist/components/item/ItemSeparator/ItemSeparator.js +3 -0
- package/dist/components/item/ItemSeparator/ItemSeparator.js.map +1 -1
- package/dist/components/item/ItemTitle/ItemTitle.js +8 -3
- package/dist/components/item/ItemTitle/ItemTitle.js.map +1 -1
- package/dist/components/kbd/Kbd.js +16 -6
- package/dist/components/kbd/Kbd.js.map +1 -1
- package/dist/components/label/Label.js +3 -0
- package/dist/components/label/Label.js.map +1 -1
- package/dist/components/marker/Marker/Marker.styles.d.ts +1 -1
- package/dist/components/message-scroller/message-scroller.anchoring.d.ts +60 -0
- package/dist/components/message-scroller/message-scroller.anchoring.js +139 -0
- package/dist/components/message-scroller/message-scroller.anchoring.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.anchors.d.ts +12 -0
- package/dist/components/message-scroller/message-scroller.anchors.js +23 -0
- package/dist/components/message-scroller/message-scroller.anchors.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.commands.d.ts +43 -0
- package/dist/components/message-scroller/message-scroller.commands.js +51 -0
- package/dist/components/message-scroller/message-scroller.commands.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.dom-measure.d.ts +29 -0
- package/dist/components/message-scroller/message-scroller.dom-measure.js +37 -0
- package/dist/components/message-scroller/message-scroller.dom-measure.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.measure.d.ts +27 -0
- package/dist/components/message-scroller/message-scroller.measure.js +21 -0
- package/dist/components/message-scroller/message-scroller.measure.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.scroll-state.d.ts +54 -0
- package/dist/components/message-scroller/message-scroller.scroll-state.js +74 -0
- package/dist/components/message-scroller/message-scroller.scroll-state.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.scroll-target.d.ts +27 -0
- package/dist/components/message-scroller/message-scroller.scroll-target.js +33 -0
- package/dist/components/message-scroller/message-scroller.scroll-target.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.utils.d.ts +7 -0
- package/dist/components/message-scroller/message-scroller.utils.js +3 -2
- package/dist/components/message-scroller/message-scroller.utils.js.map +1 -1
- package/dist/components/message-scroller/message-scroller.visibility.d.ts +43 -0
- package/dist/components/message-scroller/message-scroller.visibility.js +82 -0
- package/dist/components/message-scroller/message-scroller.visibility.js.map +1 -0
- package/dist/components/message-scroller/useMessageScrollerEngine.js +87 -337
- package/dist/components/message-scroller/useMessageScrollerEngine.js.map +1 -1
- package/dist/components/number-input/NumberInput/NumberInput.js +21 -19
- package/dist/components/number-input/NumberInput/NumberInput.js.map +1 -1
- package/dist/components/number-input/NumberInput/NumberInput.utils.d.ts +6 -2
- package/dist/components/number-input/NumberInput/NumberInput.utils.js +1 -3
- package/dist/components/number-input/NumberInput/NumberInput.utils.js.map +1 -1
- package/dist/components/number-input/NumberInput/create-change-event-details.d.ts +1 -2
- package/dist/components/number-input/NumberInput/create-change-event-details.js +4 -20
- package/dist/components/number-input/NumberInput/create-change-event-details.js.map +1 -1
- package/dist/components/pagination/Pagination/Pagination.js +8 -3
- package/dist/components/pagination/Pagination/Pagination.js.map +1 -1
- package/dist/components/pagination/PaginationContent/PaginationContent.js +8 -3
- package/dist/components/pagination/PaginationContent/PaginationContent.js.map +1 -1
- package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js +8 -3
- package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js.map +1 -1
- package/dist/components/pagination/PaginationLink/PaginationLink.js +3 -0
- package/dist/components/pagination/PaginationLink/PaginationLink.js.map +1 -1
- package/dist/components/pagination/PaginationNext/PaginationNext.js +3 -0
- package/dist/components/pagination/PaginationNext/PaginationNext.js.map +1 -1
- package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js +3 -0
- package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js.map +1 -1
- package/dist/components/popover/PopoverContent/PopoverContent.js +3 -0
- package/dist/components/popover/PopoverContent/PopoverContent.js.map +1 -1
- package/dist/components/progress/Progress/Progress.context.js +1 -1
- package/dist/components/progress/Progress/Progress.context.js.map +1 -1
- package/dist/components/progress/Progress/Progress.js +3 -0
- package/dist/components/progress/Progress/Progress.js.map +1 -1
- package/dist/components/progress/ProgressIndicator/ProgressIndicator.js +3 -0
- package/dist/components/progress/ProgressIndicator/ProgressIndicator.js.map +1 -1
- package/dist/components/progress/ProgressLabel/ProgressLabel.js +8 -3
- package/dist/components/progress/ProgressLabel/ProgressLabel.js.map +1 -1
- package/dist/components/progress/ProgressTrack/ProgressTrack.js +3 -0
- package/dist/components/progress/ProgressTrack/ProgressTrack.js.map +1 -1
- package/dist/components/progress/ProgressValue/ProgressValue.js +8 -3
- package/dist/components/progress/ProgressValue/ProgressValue.js.map +1 -1
- package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.d.ts +48 -0
- package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.js +23 -0
- package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js +62 -49
- package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js.map +1 -1
- package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js +4 -1
- package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js.map +1 -1
- package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js +1 -2
- package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js.map +1 -1
- package/dist/components/questionnaire/questionnaire.answers.d.ts +42 -0
- package/dist/components/questionnaire/questionnaire.answers.js +62 -0
- package/dist/components/questionnaire/questionnaire.answers.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.aria.d.ts +34 -0
- package/dist/components/questionnaire/questionnaire.aria.js +28 -0
- package/dist/components/questionnaire/questionnaire.aria.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.dom-watch.d.ts +9 -0
- package/dist/components/questionnaire/questionnaire.dom-watch.js +18 -0
- package/dist/components/questionnaire/questionnaire.dom-watch.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.focus.d.ts +26 -0
- package/dist/components/questionnaire/questionnaire.focus.js +19 -0
- package/dist/components/questionnaire/questionnaire.focus.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.item-view.d.ts +50 -0
- package/dist/components/questionnaire/questionnaire.item-view.js +36 -0
- package/dist/components/questionnaire/questionnaire.item-view.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.keys.d.ts +29 -0
- package/dist/components/questionnaire/questionnaire.keys.js +34 -0
- package/dist/components/questionnaire/questionnaire.keys.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.registry.d.ts +21 -0
- package/dist/components/questionnaire/questionnaire.registry.js +15 -0
- package/dist/components/questionnaire/questionnaire.registry.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.shortcuts.d.ts +24 -0
- package/dist/components/questionnaire/questionnaire.shortcuts.js +31 -0
- package/dist/components/questionnaire/questionnaire.shortcuts.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.utils.d.ts +17 -1
- package/dist/components/questionnaire/questionnaire.utils.js +5 -2
- package/dist/components/questionnaire/questionnaire.utils.js.map +1 -1
- package/dist/components/questionnaire/questionnaire.validation.d.ts +43 -0
- package/dist/components/questionnaire/questionnaire.validation.js +17 -0
- package/dist/components/questionnaire/questionnaire.validation.js.map +1 -0
- package/dist/components/questionnaire/useQuestionnaireItem.d.ts +0 -2
- package/dist/components/questionnaire/useQuestionnaireItem.js +83 -121
- package/dist/components/questionnaire/useQuestionnaireItem.js.map +1 -1
- package/dist/components/questionnaire/useQuestionnaireRoot.js +78 -99
- package/dist/components/questionnaire/useQuestionnaireRoot.js.map +1 -1
- package/dist/components/radio-group/RadioGroup/RadioGroup.js +3 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js +3 -0
- package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js.map +1 -1
- package/dist/components/resizable/ResizableHandle/resizable.handle-drag.d.ts +37 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-drag.js +37 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-drag.js.map +1 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-keys.d.ts +24 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-keys.js +36 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-keys.js.map +1 -0
- package/dist/components/resizable/ResizableHandle/useResizableHandle.d.ts +3 -4
- package/dist/components/resizable/ResizableHandle/useResizableHandle.js +30 -63
- package/dist/components/resizable/ResizableHandle/useResizableHandle.js.map +1 -1
- package/dist/components/resizable/ResizablePanel/ResizablePanel.d.ts +4 -2
- package/dist/components/resizable/ResizablePanel/ResizablePanel.js +23 -50
- package/dist/components/resizable/ResizablePanel/ResizablePanel.js.map +1 -1
- package/dist/components/resizable/ResizablePanel/useResizablePanel.d.ts +30 -0
- package/dist/components/resizable/ResizablePanel/useResizablePanel.js +37 -0
- package/dist/components/resizable/ResizablePanel/useResizablePanel.js.map +1 -0
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.d.ts +4 -1
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js +10 -17
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js.map +1 -1
- package/dist/components/resizable/ResizablePanelGroup/useDragCursor.d.ts +11 -0
- package/dist/components/resizable/ResizablePanelGroup/useDragCursor.js +17 -0
- package/dist/components/resizable/ResizablePanelGroup/useDragCursor.js.map +1 -0
- package/dist/components/resizable/resizable.collapse.d.ts +27 -0
- package/dist/components/resizable/resizable.collapse.js +24 -0
- package/dist/components/resizable/resizable.collapse.js.map +1 -0
- package/dist/components/resizable/resizable.commands.d.ts +32 -0
- package/dist/components/resizable/resizable.commands.js +40 -0
- package/dist/components/resizable/resizable.commands.js.map +1 -0
- package/dist/components/resizable/resizable.constraints.d.ts +23 -0
- package/dist/components/resizable/resizable.constraints.js +32 -0
- package/dist/components/resizable/resizable.constraints.js.map +1 -0
- package/dist/components/resizable/resizable.lifecycle.d.ts +35 -0
- package/dist/components/resizable/resizable.lifecycle.js +32 -0
- package/dist/components/resizable/resizable.lifecycle.js.map +1 -0
- package/dist/components/resizable/resizable.registry.d.ts +31 -0
- package/dist/components/resizable/resizable.registry.js +38 -0
- package/dist/components/resizable/resizable.registry.js.map +1 -0
- package/dist/components/resizable/resizable.reporting.d.ts +36 -0
- package/dist/components/resizable/resizable.reporting.js +33 -0
- package/dist/components/resizable/resizable.reporting.js.map +1 -0
- package/dist/components/resizable/resizable.resize.d.ts +47 -0
- package/dist/components/resizable/resizable.resize.js +28 -0
- package/dist/components/resizable/resizable.resize.js.map +1 -0
- package/dist/components/resizable/resizable.sizes.d.ts +31 -0
- package/dist/components/resizable/resizable.sizes.js +46 -0
- package/dist/components/resizable/resizable.sizes.js.map +1 -0
- package/dist/components/resizable/resizable.storage.d.ts +17 -0
- package/dist/components/resizable/resizable.storage.js +29 -0
- package/dist/components/resizable/resizable.storage.js.map +1 -0
- package/dist/components/resizable/resizable.utils.d.ts +10 -3
- package/dist/components/resizable/resizable.utils.js +16 -10
- package/dist/components/resizable/resizable.utils.js.map +1 -1
- package/dist/components/resizable/useResizablePanelGroup.js +62 -164
- package/dist/components/resizable/useResizablePanelGroup.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js +1 -1
- package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea/ScrollArea.d.ts +9 -0
- package/dist/components/scroll-area/ScrollArea/ScrollArea.js +28 -39
- package/dist/components/scroll-area/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js +3 -3
- package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.d.ts +22 -0
- package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.js +34 -0
- package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.js.map +1 -0
- package/dist/components/scroll-area/ScrollBar/ScrollBar.d.ts +8 -0
- package/dist/components/scroll-area/ScrollBar/ScrollBar.js +38 -71
- package/dist/components/scroll-area/ScrollBar/ScrollBar.js.map +1 -1
- package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.d.ts +56 -0
- package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.js +61 -0
- package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.js.map +1 -0
- package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.d.ts +25 -0
- package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.js +26 -0
- package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.js.map +1 -0
- package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.d.ts +19 -0
- package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.js +37 -0
- package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.js.map +1 -0
- package/dist/components/scroll-arrows/ScrollArrowButton.d.ts +5 -7
- package/dist/components/scroll-arrows/ScrollArrowButton.js +14 -44
- package/dist/components/scroll-arrows/ScrollArrowButton.js.map +1 -1
- package/dist/components/scroll-arrows/ScrollArrows.d.ts +4 -3
- package/dist/components/scroll-arrows/ScrollArrows.js +16 -22
- package/dist/components/scroll-arrows/ScrollArrows.js.map +1 -1
- package/dist/components/scroll-arrows/ScrollArrows.types.d.ts +7 -7
- package/dist/components/scroll-arrows/useHoverScroll.d.ts +29 -0
- package/dist/components/scroll-arrows/useHoverScroll.js +39 -0
- package/dist/components/scroll-arrows/useHoverScroll.js.map +1 -0
- package/dist/components/select/SelectContent/useSelectContent.js +3 -3
- package/dist/components/select/SelectGroup/SelectGroup.d.ts +8 -2
- package/dist/components/select/SelectGroup/SelectGroup.js +20 -6
- package/dist/components/select/SelectGroup/SelectGroup.js.map +1 -1
- package/dist/components/select/SelectGroup/SelectGroup.types.d.ts +9 -0
- package/dist/components/select/SelectGroup/index.d.ts +1 -0
- package/dist/components/select/SelectTrigger/SelectTrigger.js.map +1 -1
- package/dist/components/select/SelectTrigger/useSelectTrigger.js +1 -1
- package/dist/components/select/SelectTrigger/useSelectTrigger.js.map +1 -1
- package/dist/components/separator/Separator.js +3 -0
- package/dist/components/separator/Separator.js.map +1 -1
- package/dist/components/sheet/SheetClose/SheetClose.js +18 -17
- package/dist/components/sheet/SheetClose/SheetClose.js.map +1 -1
- package/dist/components/sidebar/Sidebar/Sidebar.js +14 -6
- package/dist/components/sidebar/Sidebar/Sidebar.js.map +1 -1
- package/dist/components/sidebar/SidebarContent/SidebarContent.js +8 -3
- package/dist/components/sidebar/SidebarContent/SidebarContent.js.map +1 -1
- package/dist/components/sidebar/SidebarFooter/SidebarFooter.js +8 -3
- package/dist/components/sidebar/SidebarFooter/SidebarFooter.js.map +1 -1
- package/dist/components/sidebar/SidebarGroup/SidebarGroup.js +8 -3
- package/dist/components/sidebar/SidebarGroup/SidebarGroup.js.map +1 -1
- package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js +3 -0
- package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js.map +1 -1
- package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js +8 -3
- package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js.map +1 -1
- package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js +3 -0
- package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js.map +1 -1
- package/dist/components/sidebar/SidebarHeader/SidebarHeader.js +8 -3
- package/dist/components/sidebar/SidebarHeader/SidebarHeader.js.map +1 -1
- package/dist/components/sidebar/SidebarInput/SidebarInput.js +3 -0
- package/dist/components/sidebar/SidebarInput/SidebarInput.js.map +1 -1
- package/dist/components/sidebar/SidebarInset/SidebarInset.js +8 -3
- package/dist/components/sidebar/SidebarInset/SidebarInset.js.map +1 -1
- package/dist/components/sidebar/SidebarMenu/SidebarMenu.js +8 -3
- package/dist/components/sidebar/SidebarMenu/SidebarMenu.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js +8 -3
- package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js +6 -0
- package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js +8 -3
- package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js +8 -3
- package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js +8 -3
- package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js +3 -0
- package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js +8 -3
- package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js.map +1 -1
- package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js +1 -1
- package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js.map +1 -1
- package/dist/components/sidebar/SidebarProvider/SidebarProvider.js +30 -27
- package/dist/components/sidebar/SidebarProvider/SidebarProvider.js.map +1 -1
- package/dist/components/sidebar/SidebarProvider/useIsMobile.d.ts +10 -0
- package/dist/components/sidebar/SidebarProvider/useIsMobile.js +14 -0
- package/dist/components/sidebar/SidebarProvider/useIsMobile.js.map +1 -0
- package/dist/components/sidebar/SidebarRail/SidebarRail.js +8 -3
- package/dist/components/sidebar/SidebarRail/SidebarRail.js.map +1 -1
- package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js +3 -0
- package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js.map +1 -1
- package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js +3 -0
- package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js.map +1 -1
- package/dist/components/skeleton/Skeleton.js +8 -3
- package/dist/components/skeleton/Skeleton.js.map +1 -1
- package/dist/components/slider/Slider/Slider.context.js +1 -1
- package/dist/components/slider/Slider/Slider.context.js.map +1 -1
- package/dist/components/slider/Slider/Slider.js +3 -0
- package/dist/components/slider/Slider/Slider.js.map +1 -1
- package/dist/components/slider/SliderControl/SliderControl.js +4 -1
- package/dist/components/slider/SliderControl/SliderControl.js.map +1 -1
- package/dist/components/slider/SliderIndicator/SliderIndicator.js +3 -0
- package/dist/components/slider/SliderIndicator/SliderIndicator.js.map +1 -1
- package/dist/components/slider/SliderThumb/SliderThumb.js +18 -3
- package/dist/components/slider/SliderThumb/SliderThumb.js.map +1 -1
- package/dist/components/slider/SliderThumb/useSliderThumb.d.ts +1 -0
- package/dist/components/slider/SliderThumb/useSliderThumb.js +3 -2
- package/dist/components/slider/SliderThumb/useSliderThumb.js.map +1 -1
- package/dist/components/slider/SliderTrack/SliderTrack.js +3 -0
- package/dist/components/slider/SliderTrack/SliderTrack.js.map +1 -1
- package/dist/components/spinner/Spinner.js +3 -0
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/switch/Switch.js +7 -0
- package/dist/components/switch/Switch.js.map +1 -1
- package/dist/components/tabs/Tabs/Tabs.context.js +1 -1
- package/dist/components/tabs/Tabs/Tabs.context.js.map +1 -1
- package/dist/components/tabs/Tabs/useTabsKeyboard.d.ts +7 -11
- package/dist/components/tabs/Tabs/useTabsKeyboard.js +8 -42
- package/dist/components/tabs/Tabs/useTabsKeyboard.js.map +1 -1
- package/dist/components/tabs/TabsList/TabsList.context.js +1 -1
- package/dist/components/tabs/TabsList/TabsList.context.js.map +1 -1
- package/dist/components/tabs/TabsList/TabsList.js +10 -10
- package/dist/components/tabs/TabsList/TabsList.js.map +1 -1
- package/dist/components/tabs/TabsTrigger/TabsTrigger.js +8 -8
- package/dist/components/tabs/TabsTrigger/TabsTrigger.js.map +1 -1
- package/dist/components/textarea/Textarea.js +8 -3
- package/dist/components/textarea/Textarea.js.map +1 -1
- package/dist/components/time-picker/TimePicker/create-change-event-details.d.ts +1 -2
- package/dist/components/time-picker/TimePicker/create-change-event-details.js +4 -20
- package/dist/components/time-picker/TimePicker/create-change-event-details.js.map +1 -1
- package/dist/components/time-picker/TimePickerColumn/TimePickerColumn.js +1 -3
- package/dist/components/time-picker/TimePickerColumn/TimePickerColumn.js.map +1 -1
- package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.d.ts +34 -0
- package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.js +43 -0
- package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.js.map +1 -0
- package/dist/components/time-picker/TimePickerColumn/useTimePickerColumn.js +34 -59
- package/dist/components/time-picker/TimePickerColumn/useTimePickerColumn.js.map +1 -1
- package/dist/components/toast/Toast/Toast.d.ts +8 -2
- package/dist/components/toast/Toast/Toast.js +92 -146
- package/dist/components/toast/Toast/Toast.js.map +1 -1
- package/dist/components/toast/Toast/Toast.types.d.ts +1 -1
- package/dist/components/toast/Toast/Toast.types.js.map +1 -1
- package/dist/components/toast/Toast/Toast.utils.d.ts +47 -0
- package/dist/components/toast/Toast/Toast.utils.js +47 -0
- package/dist/components/toast/Toast/Toast.utils.js.map +1 -0
- package/dist/components/toast/Toast/ToastActionButton.d.ts +16 -0
- package/dist/components/toast/Toast/ToastActionButton.js +27 -0
- package/dist/components/toast/Toast/ToastActionButton.js.map +1 -0
- package/dist/components/toast/Toast/ToastActions.d.ts +12 -0
- package/dist/components/toast/Toast/ToastActions.js +65 -0
- package/dist/components/toast/Toast/ToastActions.js.map +1 -0
- package/dist/components/toast/Toast/ToastCloseButton.d.ts +12 -0
- package/dist/components/toast/Toast/ToastCloseButton.js +26 -0
- package/dist/components/toast/Toast/ToastCloseButton.js.map +1 -0
- package/dist/components/toast/Toast/ToastContent.d.ts +8 -0
- package/dist/components/toast/Toast/ToastContent.js +30 -0
- package/dist/components/toast/Toast/ToastContent.js.map +1 -0
- package/dist/components/toast/Toast/ToastIcon.d.ts +14 -0
- package/dist/components/toast/Toast/ToastIcon.js +36 -0
- package/dist/components/toast/Toast/ToastIcon.js.map +1 -0
- package/dist/components/toast/Toast/useToastLifecycle.d.ts +29 -0
- package/dist/components/toast/Toast/useToastLifecycle.js +30 -0
- package/dist/components/toast/Toast/useToastLifecycle.js.map +1 -0
- package/dist/components/toast/Toaster/ToastViewport.d.ts +33 -0
- package/dist/components/toast/Toaster/ToastViewport.js +73 -0
- package/dist/components/toast/Toaster/ToastViewport.js.map +1 -0
- package/dist/components/toast/Toaster/Toaster.d.ts +4 -0
- package/dist/components/toast/Toaster/Toaster.js +64 -82
- package/dist/components/toast/Toaster/Toaster.js.map +1 -1
- package/dist/components/toast/Toaster/Toaster.utils.d.ts +15 -0
- package/dist/components/toast/Toaster/Toaster.utils.js +4 -1
- package/dist/components/toast/Toaster/Toaster.utils.js.map +1 -1
- package/dist/components/toast/Toaster/useToaster.d.ts +28 -0
- package/dist/components/toast/Toaster/useToaster.js +26 -0
- package/dist/components/toast/Toaster/useToaster.js.map +1 -0
- package/dist/components/toast/index.js +4 -3
- package/dist/components/toast/state/promise-toast.d.ts +17 -0
- package/dist/components/toast/state/promise-toast.js +33 -0
- package/dist/components/toast/state/promise-toast.js.map +1 -0
- package/dist/components/toast/state/store.d.ts +21 -0
- package/dist/components/toast/state/store.js +45 -0
- package/dist/components/toast/state/store.js.map +1 -0
- package/dist/components/toast/state/toast.d.ts +9 -10
- package/dist/components/toast/state/toast.js +30 -89
- package/dist/components/toast/state/toast.js.map +1 -1
- package/dist/components/toggle/Toggle/Toggle.js +2 -1
- package/dist/components/toggle/Toggle/Toggle.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.d.ts +6 -2
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js +4 -20
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.d.ts +7 -10
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js +10 -40
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js +5 -5
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js.map +1 -1
- package/dist/components/tooltip/TooltipContent/usePresence.d.ts +27 -0
- package/dist/components/tooltip/TooltipContent/usePresence.js +24 -0
- package/dist/components/tooltip/TooltipContent/usePresence.js.map +1 -0
- package/dist/components/tooltip/TooltipContent/useTooltipContent.js +22 -35
- package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
- package/dist/hooks/useFontLoader.js +1 -1
- package/dist/hooks/useFontLoader.js.map +1 -1
- package/dist/hooks/useScrollLock.js +13 -16
- package/dist/hooks/useScrollLock.js.map +1 -1
- package/dist/index.js +328 -320
- package/dist/lib/positioner/index.d.ts +1 -0
- package/dist/lib/positioner/utils/dom.d.ts +8 -0
- package/dist/lib/positioner/utils/dom.js +1 -1
- package/dist/lib/positioner/utils/dom.js.map +1 -1
- package/dist/types/props.types.d.ts +1 -1
- package/dist/ui.css +1 -1
- package/dist/utils/call-event-handler.d.ts +16 -0
- package/dist/utils/call-event-handler.js +15 -0
- package/dist/utils/call-event-handler.js.map +1 -0
- package/dist/utils/clsx.d.ts +1 -1
- package/dist/utils/clsx.js +2 -7
- package/dist/utils/create-change-event-details.d.ts +25 -0
- package/dist/utils/create-change-event-details.js +25 -0
- package/dist/utils/create-change-event-details.js.map +1 -0
- package/dist/utils/get-style.d.ts +7 -9
- package/dist/utils/get-style.js +16 -0
- package/dist/utils/get-style.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.js +7 -1
- package/dist/utils/number.d.ts +7 -0
- package/dist/utils/number.js +8 -0
- package/dist/utils/number.js.map +1 -0
- package/dist/utils/roving-navigation.d.ts +64 -0
- package/dist/utils/roving-navigation.js +66 -0
- package/dist/utils/roving-navigation.js.map +1 -0
- package/dist/utils/string.d.ts +17 -0
- package/dist/utils/string.js +11 -0
- package/dist/utils/string.js.map +1 -0
- package/package.json +18 -7
- package/dist/components/carousel/Carousel/Carousel.utils.d.ts +0 -0
- package/dist/components/field/FieldError/useFieldError.d.ts +0 -0
- package/dist/components/hover-card/hover-card.utils.d.ts +0 -6
- package/dist/components/tabs/Tabs/call-event-handler.d.ts +0 -5
- package/dist/components/tabs/Tabs/call-event-handler.js +0 -9
- package/dist/components/tabs/Tabs/call-event-handler.js.map +0 -1
- package/dist/components/toggle-group/call-event-handler.d.ts +0 -5
- package/dist/components/toggle-group/call-event-handler.js +0 -9
- package/dist/components/toggle-group/call-event-handler.js.map +0 -1
- package/dist/utils/clsx.js.map +0 -1
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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
|
|
13
|
-
let
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
},
|
|
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),
|
|
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),
|
|
57
|
+
n && v.get(e) === n && (v.delete(e), S.unobserve(e, n), T());
|
|
308
58
|
};
|
|
309
|
-
return
|
|
310
|
-
let e =
|
|
59
|
+
return a(() => {
|
|
60
|
+
let e = f();
|
|
311
61
|
if (!e) return;
|
|
312
|
-
|
|
313
|
-
let t = typeof MutationObserver < "u" ? new MutationObserver(() =>
|
|
62
|
+
z();
|
|
63
|
+
let t = typeof MutationObserver < "u" ? new MutationObserver(() => z()) : null;
|
|
314
64
|
t?.observe(e, { childList: !0 });
|
|
315
|
-
let
|
|
316
|
-
|
|
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
|
|
322
|
-
window.cancelAnimationFrame(
|
|
71
|
+
let r = 0, i = typeof ResizeObserver < "u" ? new ResizeObserver(() => {
|
|
72
|
+
window.cancelAnimationFrame(r), r = window.requestAnimationFrame(B);
|
|
323
73
|
}) : null;
|
|
324
|
-
|
|
325
|
-
t?.disconnect(),
|
|
74
|
+
i?.observe(e), s(() => {
|
|
75
|
+
t?.disconnect(), n?.disconnect(), i?.disconnect(), window.cancelAnimationFrame(r);
|
|
326
76
|
});
|
|
327
|
-
}),
|
|
328
|
-
let e =
|
|
77
|
+
}), a(() => {
|
|
78
|
+
let e = u();
|
|
329
79
|
if (!e) return;
|
|
330
|
-
|
|
331
|
-
let t = () =>
|
|
332
|
-
|
|
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",
|
|
335
|
-
let
|
|
336
|
-
window.cancelAnimationFrame(
|
|
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
|
-
|
|
339
|
-
e.removeEventListener("scroll", t), e.removeEventListener("wheel",
|
|
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
|
-
}),
|
|
342
|
-
|
|
91
|
+
}), s(() => {
|
|
92
|
+
P.dispose(), E.dispose(), S.dispose();
|
|
343
93
|
}), {
|
|
344
|
-
viewport:
|
|
345
|
-
setViewport:
|
|
346
|
-
content:
|
|
347
|
-
setContent:
|
|
94
|
+
viewport: u,
|
|
95
|
+
setViewport: d,
|
|
96
|
+
content: f,
|
|
97
|
+
setContent: p,
|
|
348
98
|
setSpacer: (e) => {
|
|
349
|
-
|
|
99
|
+
h(e);
|
|
350
100
|
},
|
|
351
101
|
registerItem: (e) => {
|
|
352
102
|
let t = e.id;
|
|
353
|
-
return t &&
|
|
354
|
-
t &&
|
|
103
|
+
return t && H(t, e.element), () => {
|
|
104
|
+
t && H(t, void 0, e.element);
|
|
355
105
|
};
|
|
356
106
|
},
|
|
357
|
-
preserveScrollOnPrepend:
|
|
358
|
-
setPreserveScrollOnPrepend:
|
|
359
|
-
scrollableStart:
|
|
360
|
-
scrollableEnd:
|
|
361
|
-
autoscrolling:
|
|
362
|
-
pendingScroll:
|
|
363
|
-
scrollToStart:
|
|
364
|
-
scrollToEnd:
|
|
365
|
-
scrollToMessage:
|
|
366
|
-
currentAnchorId:
|
|
367
|
-
visibleMessageIds:
|
|
368
|
-
subscribeVisibility:
|
|
369
|
-
options:
|
|
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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"}
|