@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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Accessor } from 'solid-js';
|
|
2
|
+
import { ContextMenuItemEntry } from '../context-menu.types';
|
|
3
|
+
/**
|
|
4
|
+
* 浮层内的高亮导航。
|
|
5
|
+
*
|
|
6
|
+
* 单一职责:维护"当前高亮的是哪一项",并提供移动/跳到首尾的能力。
|
|
7
|
+
* 交互模型是焦点留在 popup 上、高亮用 `aria-activedescendant` 表达,
|
|
8
|
+
* 因此这里只改 id,不碰真实焦点。
|
|
9
|
+
*/
|
|
10
|
+
/** 键盘移动时的目标下标(-1 表示列表为空,调用方据此放弃) */
|
|
11
|
+
export declare function resolveNextActiveIndex(currentIndex: number, delta: 1 | -1, length: number, loopFocus: boolean): number;
|
|
12
|
+
export interface CreateHighlightOptions {
|
|
13
|
+
/** 全部菜单项(按 DOM 顺序),用于反查当前高亮项 */
|
|
14
|
+
orderedItems: Accessor<ContextMenuItemEntry[]>;
|
|
15
|
+
/** 可参与导航的菜单项(排除 disabled) */
|
|
16
|
+
enabledItems: Accessor<ContextMenuItemEntry[]>;
|
|
17
|
+
loopFocus: () => boolean;
|
|
18
|
+
/** 当前展开的子菜单项 id(没有展开时为 undefined) */
|
|
19
|
+
openPopupId: Accessor<string | undefined>;
|
|
20
|
+
/** 关闭已展开的子菜单 */
|
|
21
|
+
closeOpenPopup: () => void;
|
|
22
|
+
/** 本浮层是否打开;关闭时清空高亮,保证下次从第一项开始 */
|
|
23
|
+
open: Accessor<boolean>;
|
|
24
|
+
}
|
|
25
|
+
export interface HighlightNavigation {
|
|
26
|
+
activeId: Accessor<string | undefined>;
|
|
27
|
+
activeEntry: Accessor<ContextMenuItemEntry | undefined>;
|
|
28
|
+
setActiveId: (id: string | undefined) => void;
|
|
29
|
+
moveActive: (delta: 1 | -1) => void;
|
|
30
|
+
focusFirst: () => void;
|
|
31
|
+
focusLast: () => void;
|
|
32
|
+
}
|
|
33
|
+
export declare function createHighlight(options: CreateHighlightOptions): HighlightNavigation;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createEffect as e, createMemo as t, createSignal as n } from "solid-js";
|
|
2
|
+
//#region src/components/context-menu/ContextMenuContent/context-menu.highlight.ts
|
|
3
|
+
function r(e, t, n, r) {
|
|
4
|
+
if (n <= 0) return -1;
|
|
5
|
+
if (e === -1) return t > 0 ? 0 : n - 1;
|
|
6
|
+
let i = e + t;
|
|
7
|
+
return i < 0 ? r ? n - 1 : 0 : i >= n ? r ? 0 : n - 1 : i;
|
|
8
|
+
}
|
|
9
|
+
function i(i) {
|
|
10
|
+
let [a, o] = n(), s = (e) => {
|
|
11
|
+
o(e);
|
|
12
|
+
let t = i.openPopupId();
|
|
13
|
+
t !== void 0 && t !== e && i.closeOpenPopup();
|
|
14
|
+
}, c = t(() => i.orderedItems().find((e) => e.id === a()));
|
|
15
|
+
return e(() => {
|
|
16
|
+
let e = c();
|
|
17
|
+
e && e.element.scrollIntoView({ block: "nearest" });
|
|
18
|
+
}), e(() => {
|
|
19
|
+
i.open() || (o(void 0), i.closeOpenPopup());
|
|
20
|
+
}), {
|
|
21
|
+
activeId: a,
|
|
22
|
+
activeEntry: c,
|
|
23
|
+
setActiveId: s,
|
|
24
|
+
moveActive(e) {
|
|
25
|
+
let t = i.enabledItems(), n = r(t.findIndex((e) => e.id === a()), e, t.length, i.loopFocus());
|
|
26
|
+
n !== -1 && s(t[n].id);
|
|
27
|
+
},
|
|
28
|
+
focusFirst() {
|
|
29
|
+
let e = i.enabledItems();
|
|
30
|
+
s(e.length > 0 ? e[0].id : void 0);
|
|
31
|
+
},
|
|
32
|
+
focusLast() {
|
|
33
|
+
let e = i.enabledItems();
|
|
34
|
+
s(e.length > 0 ? e[e.length - 1].id : void 0);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { i as createHighlight, r as resolveNextActiveIndex };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=context-menu.highlight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-menu.highlight.js","names":["resolveNextActiveIndex","length","currentIndex","delta","next","loopFocus","createHighlight","activeId","setActiveIdInternal","createSignal","setActiveId","id","openId","options","activeEntry","createMemo","item","createEffect","entry","list","nextIndex"],"sources":["../../../../src/components/context-menu/ContextMenuContent/context-menu.highlight.ts"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n type Accessor,\n} from \"solid-js\";\nimport type { ContextMenuItemEntry } from \"../context-menu.types\";\n\n/**\n * 浮层内的高亮导航。\n *\n * 单一职责:维护\"当前高亮的是哪一项\",并提供移动/跳到首尾的能力。\n * 交互模型是焦点留在 popup 上、高亮用 `aria-activedescendant` 表达,\n * 因此这里只改 id,不碰真实焦点。\n */\n\n/** 键盘移动时的目标下标(-1 表示列表为空,调用方据此放弃) */\nexport function resolveNextActiveIndex(\n currentIndex: number,\n delta: 1 | -1,\n length: number,\n loopFocus: boolean,\n): number {\n if (length <= 0) return -1;\n if (currentIndex === -1) return delta > 0 ? 0 : length - 1;\n\n const next = currentIndex + delta;\n if (next < 0) return loopFocus ? length - 1 : 0;\n if (next >= length) return loopFocus ? 0 : length - 1;\n return next;\n}\n\nexport interface CreateHighlightOptions {\n /** 全部菜单项(按 DOM 顺序),用于反查当前高亮项 */\n orderedItems: Accessor<ContextMenuItemEntry[]>;\n /** 可参与导航的菜单项(排除 disabled) */\n enabledItems: Accessor<ContextMenuItemEntry[]>;\n loopFocus: () => boolean;\n /** 当前展开的子菜单项 id(没有展开时为 undefined) */\n openPopupId: Accessor<string | undefined>;\n /** 关闭已展开的子菜单 */\n closeOpenPopup: () => void;\n /** 本浮层是否打开;关闭时清空高亮,保证下次从第一项开始 */\n open: Accessor<boolean>;\n}\n\nexport interface HighlightNavigation {\n activeId: Accessor<string | undefined>;\n activeEntry: Accessor<ContextMenuItemEntry | undefined>;\n setActiveId: (id: string | undefined) => void;\n moveActive: (delta: 1 | -1) => void;\n focusFirst: () => void;\n focusLast: () => void;\n}\n\nexport function createHighlight(\n options: CreateHighlightOptions,\n): HighlightNavigation {\n const [activeId, setActiveIdInternal] = createSignal<string | undefined>();\n\n /** 高亮某项;若高亮切到了别的项,顺手关掉已展开的子菜单 */\n const setActiveId = (id: string | undefined) => {\n setActiveIdInternal(id);\n const openId = options.openPopupId();\n if (openId !== undefined && openId !== id) options.closeOpenPopup();\n };\n\n const activeEntry = createMemo(() =>\n options.orderedItems().find((item) => item.id === activeId()),\n );\n\n // 高亮项变化时滚动到可见区域\n createEffect(() => {\n const entry = activeEntry();\n if (!entry) return;\n entry.element.scrollIntoView({ block: \"nearest\" });\n });\n\n // 关闭时清空高亮与子菜单状态\n createEffect(() => {\n if (options.open()) return;\n setActiveIdInternal(undefined);\n options.closeOpenPopup();\n });\n\n return {\n activeId,\n activeEntry,\n setActiveId,\n moveActive(delta) {\n const list = options.enabledItems();\n const currentIndex = list.findIndex((item) => item.id === activeId());\n const nextIndex = resolveNextActiveIndex(\n currentIndex,\n delta,\n list.length,\n options.loopFocus(),\n );\n if (nextIndex === -1) return;\n setActiveId(list[nextIndex]!.id);\n },\n focusFirst() {\n const list = options.enabledItems();\n setActiveId(list.length > 0 ? list[0]!.id : undefined);\n },\n focusLast() {\n const list = options.enabledItems();\n setActiveId(list.length > 0 ? list[list.length - 1]!.id : undefined);\n },\n };\n}\n"],"mappings":";;AAiBA,SAAgBA,EACd,GACA,GACA,GACA,GACQ;CACR,IAAIC,KAAU,GAAG,OAAO;CACxB,IAAIC,MAAiB,IAAI,OAAOC,IAAQ,IAAI,IAAIF,IAAS;CAEzD,IAAMG,IAAOF,IAAeC;CAG5B,OAFIC,IAAO,IAAUC,IAAYJ,IAAS,IAAI,IAC1CG,KAAQH,IAAeI,IAAY,IAAIJ,IAAS,IAC7CG;AACT;AAyBA,SAAgBE,EACd,GACqB;CACrB,IAAM,CAACC,GAAUC,KAAuBC,EAAiC,GAGnEC,KAAe,MAA2B;EAC9C,EAAoBC,CAAE;EACtB,IAAMC,IAASC,EAAQ,YAAY;EACnC,AAAID,MAAW,KAAA,KAAaA,MAAWD,KAAIE,EAAQ,eAAe;CACpE,GAEMC,IAAcC,QAClBF,EAAQ,aAAa,CAAC,CAAC,MAAM,MAASG,EAAK,OAAOT,EAAS,CAAC,CAC9D;CAgBA,OAbAU,QAAmB;EACjB,IAAMC,IAAQJ,EAAY;EAC1B,AAAKI,KACLA,EAAM,QAAQ,eAAe,EAAE,OAAO,UAAU,CAAC;CACnD,CAAC,GAGDD,QAAmB;EACjB,AAAIJ,EAAQ,KAAK,MACjBL,EAAoB,KAAA,CAAS,GAC7BK,EAAQ,eAAe;CACzB,CAAC,GAEM;EACL;EACA;EACA;EACA,WAAW,GAAO;GAChB,IAAMM,IAAON,EAAQ,aAAa,GAE5BO,IAAYpB,EADGmB,EAAK,WAAW,MAASH,EAAK,OAAOT,EAAS,CAEjE,GACAJ,GACAgB,EAAK,QACLN,EAAQ,UAAU,CACpB;GACA,AAAIO,MAAc,MAClBV,EAAYS,EAAKC,EAAU,CAAE,EAAE;EACjC;EACA,aAAa;GACX,IAAMD,IAAON,EAAQ,aAAa;GAClC,EAAYM,EAAK,SAAS,IAAIA,EAAK,EAAE,CAAE,KAAK,KAAA,CAAS;EACvD;EACA,YAAY;GACV,IAAMA,IAAON,EAAQ,aAAa;GAClC,EAAYM,EAAK,SAAS,IAAIA,EAAKA,EAAK,SAAS,EAAE,CAAE,KAAK,KAAA,CAAS;EACrE;CACF;AACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Accessor } from 'solid-js';
|
|
2
|
+
import { ContextMenuItemEntry } from '../context-menu.types';
|
|
3
|
+
/**
|
|
4
|
+
* 浮层内的菜单项集合。
|
|
5
|
+
*
|
|
6
|
+
* 单一职责:维护"这一层里注册了哪些菜单项",并给出两种派生视图——
|
|
7
|
+
* 按 DOM 顺序排好的全部项、以及其中未禁用的项。浮层之间的父子关系、
|
|
8
|
+
* 高亮与定位都不在这里。
|
|
9
|
+
*/
|
|
10
|
+
/** 按 DOM 顺序比较两个菜单项:A 在 B 之前返回 -1,之后返回 1,同一元素返回 0 */
|
|
11
|
+
export declare function compareItemElements(a: ContextMenuItemEntry, b: ContextMenuItemEntry): number;
|
|
12
|
+
export interface ItemCollection {
|
|
13
|
+
/** 按注册时机排列的原始列表(`orderedItems` 之前的状态) */
|
|
14
|
+
items: Accessor<ContextMenuItemEntry[]>;
|
|
15
|
+
registerItem: (entry: ContextMenuItemEntry) => () => void;
|
|
16
|
+
/**
|
|
17
|
+
* 按 DOM 顺序排序后的列表。
|
|
18
|
+
* 调用方常用 `<For>` 动态生成菜单项,注册顺序与实际渲染顺序可能不同,
|
|
19
|
+
* 而"上一项/下一项"必须按用户看到的顺序走。
|
|
20
|
+
*/
|
|
21
|
+
orderedItems: Accessor<ContextMenuItemEntry[]>;
|
|
22
|
+
/** 可参与键盘导航的项(排除 disabled) */
|
|
23
|
+
enabledItems: Accessor<ContextMenuItemEntry[]>;
|
|
24
|
+
}
|
|
25
|
+
export declare function createItemCollection(): ItemCollection;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createMemo as e, createSignal as t } from "solid-js";
|
|
2
|
+
//#region src/components/context-menu/ContextMenuContent/context-menu.popup-items.ts
|
|
3
|
+
function n(e, t) {
|
|
4
|
+
return e.element === t.element ? 0 : e.element.compareDocumentPosition(t.element) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;
|
|
5
|
+
}
|
|
6
|
+
function r() {
|
|
7
|
+
let [r, i] = t([]), a = e(() => [...r()].sort(n));
|
|
8
|
+
return {
|
|
9
|
+
items: r,
|
|
10
|
+
orderedItems: a,
|
|
11
|
+
enabledItems: e(() => a().filter((e) => !e.disabled())),
|
|
12
|
+
registerItem(e) {
|
|
13
|
+
return i((t) => [...t, e]), () => i((t) => t.filter((t) => t.id !== e.id));
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { n as compareItemElements, r as createItemCollection };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=context-menu.popup-items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-menu.popup-items.js","names":["compareItemElements","a","b","createItemCollection","items","setItems","createSignal","orderedItems","createMemo","item","list","entry","it"],"sources":["../../../../src/components/context-menu/ContextMenuContent/context-menu.popup-items.ts"],"sourcesContent":["import { createMemo, createSignal, type Accessor } from \"solid-js\";\nimport type { ContextMenuItemEntry } from \"../context-menu.types\";\n\n/**\n * 浮层内的菜单项集合。\n *\n * 单一职责:维护\"这一层里注册了哪些菜单项\",并给出两种派生视图——\n * 按 DOM 顺序排好的全部项、以及其中未禁用的项。浮层之间的父子关系、\n * 高亮与定位都不在这里。\n */\n\n/** 按 DOM 顺序比较两个菜单项:A 在 B 之前返回 -1,之后返回 1,同一元素返回 0 */\nexport function compareItemElements(\n a: ContextMenuItemEntry,\n b: ContextMenuItemEntry,\n): number {\n if (a.element === b.element) return 0;\n const relation = a.element.compareDocumentPosition(b.element);\n return relation & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n}\n\nexport interface ItemCollection {\n /** 按注册时机排列的原始列表(`orderedItems` 之前的状态) */\n items: Accessor<ContextMenuItemEntry[]>;\n registerItem: (entry: ContextMenuItemEntry) => () => void;\n /**\n * 按 DOM 顺序排序后的列表。\n * 调用方常用 `<For>` 动态生成菜单项,注册顺序与实际渲染顺序可能不同,\n * 而\"上一项/下一项\"必须按用户看到的顺序走。\n */\n orderedItems: Accessor<ContextMenuItemEntry[]>;\n /** 可参与键盘导航的项(排除 disabled) */\n enabledItems: Accessor<ContextMenuItemEntry[]>;\n}\n\nexport function createItemCollection(): ItemCollection {\n const [items, setItems] = createSignal<ContextMenuItemEntry[]>([]);\n\n const orderedItems = createMemo(() => [...items()].sort(compareItemElements));\n\n return {\n items,\n orderedItems,\n enabledItems: createMemo(() =>\n orderedItems().filter((item) => !item.disabled()),\n ),\n registerItem(entry) {\n setItems((list) => [...list, entry]);\n return () => setItems((list) => list.filter((it) => it.id !== entry.id));\n },\n };\n}\n"],"mappings":";;AAYA,SAAgBA,EACd,GACA,GACQ;CAGR,OAFIC,EAAE,YAAYC,EAAE,UAAgB,IACnBD,EAAE,QAAQ,wBAAwBC,EAAE,OAC9C,IAAW,KAAK,8BAA8B,KAAK;AAC5D;AAgBA,SAAgBC,IAAuC;CACrD,IAAM,CAACC,GAAOC,KAAYC,EAAqC,CAAC,CAAC,GAE3DC,IAAeC,QAAiB,CAAC,GAAGJ,EAAM,CAAC,CAAC,CAAC,KAAKJ,CAAmB,CAAC;CAE5E,OAAO;EACL;EACA;EACA,cAAcQ,QACZD,EAAa,CAAC,CAAC,QAAQ,MAAS,CAACE,EAAK,SAAS,CAAC,CAClD;EACA,aAAa,GAAO;GAElB,OADAJ,GAAU,MAAS,CAAC,GAAGK,GAAMC,CAAK,CAAC,SACtBN,GAAU,MAASK,EAAK,QAAQ,MAAOE,EAAG,OAAOD,EAAM,EAAE,CAAC;EACzE;CACF;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Accessor } from 'solid-js';
|
|
2
|
+
import { Placement, Positioner, ReferenceElement } from '../../../lib';
|
|
3
|
+
import { ContextMenuAlign, ContextMenuSide } from '../context-menu.types';
|
|
4
|
+
export interface PopupPositionerOptions {
|
|
5
|
+
/** 定位锚点:根菜单是鼠标坐标的虚拟元素,子菜单是子菜单触发器 */
|
|
6
|
+
reference: Accessor<ReferenceElement | undefined>;
|
|
7
|
+
/** 负责定位的外层元素 */
|
|
8
|
+
positionerElement: Accessor<HTMLElement | undefined>;
|
|
9
|
+
side: Accessor<ContextMenuSide>;
|
|
10
|
+
align: Accessor<ContextMenuAlign>;
|
|
11
|
+
dir: Accessor<"ltr" | "rtl" | "auto" | undefined>;
|
|
12
|
+
sideOffset: Accessor<number>;
|
|
13
|
+
alignOffset: Accessor<number>;
|
|
14
|
+
collisionPadding: Accessor<number>;
|
|
15
|
+
}
|
|
16
|
+
export interface PopupPositioner {
|
|
17
|
+
pos: Positioner;
|
|
18
|
+
availableHeight: Accessor<number | undefined>;
|
|
19
|
+
placement: Accessor<Placement>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 浮层的定位配置。
|
|
23
|
+
*
|
|
24
|
+
* 单一职责:把 `side` / `align` / 偏移 / 碰撞内边距这些 props 翻译成
|
|
25
|
+
* middleware 组合(offset → flip → shift → size → hide → containingBlockOffset),
|
|
26
|
+
* 并把 size 中间件算出的可用高度暴露给调用方(用于 max-height 滚动)。
|
|
27
|
+
*
|
|
28
|
+
* `containingBlockOffset` 放在最后:Portal 里的浮层相对视口定位,
|
|
29
|
+
* 但祖先若有 `transform`,fixed 定位的参考系会变,需要补上这段偏移。
|
|
30
|
+
*/
|
|
31
|
+
export declare function createPopupPositioner(options: PopupPositionerOptions): PopupPositioner;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createPositioner as e } from "../../../lib/positioner/create-positioner.js";
|
|
2
|
+
import { offset as t } from "../../../lib/positioner/middleware/offset.js";
|
|
3
|
+
import { shift as n } from "../../../lib/positioner/middleware/shift.js";
|
|
4
|
+
import { flip as r } from "../../../lib/positioner/middleware/flip.js";
|
|
5
|
+
import { size as i } from "../../../lib/positioner/middleware/size.js";
|
|
6
|
+
import { hide as a } from "../../../lib/positioner/middleware/hide.js";
|
|
7
|
+
import { containingBlockOffset as o } from "../../../lib/positioner/middleware/containing-block-offset.js";
|
|
8
|
+
import { toContextMenuPlacement as s } from "../context-menu.utils.js";
|
|
9
|
+
import { createSignal as c } from "solid-js";
|
|
10
|
+
//#region src/components/context-menu/ContextMenuContent/context-menu.positioner.ts
|
|
11
|
+
function l(l) {
|
|
12
|
+
let [u, d] = c(), f = e(l.reference, l.positionerElement, {
|
|
13
|
+
placement: () => s(l.side(), l.align(), l.dir()),
|
|
14
|
+
strategy: "fixed",
|
|
15
|
+
middleware: () => [
|
|
16
|
+
t({
|
|
17
|
+
mainAxis: l.sideOffset(),
|
|
18
|
+
crossAxis: l.alignOffset()
|
|
19
|
+
}),
|
|
20
|
+
r(),
|
|
21
|
+
n({ padding: l.collisionPadding() }),
|
|
22
|
+
i({
|
|
23
|
+
padding: l.collisionPadding(),
|
|
24
|
+
apply: ({ availableHeight: e }) => d(e)
|
|
25
|
+
}),
|
|
26
|
+
a(),
|
|
27
|
+
o()
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
pos: f,
|
|
32
|
+
availableHeight: u,
|
|
33
|
+
placement: f.placement
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { l as createPopupPositioner };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=context-menu.positioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-menu.positioner.js","names":["createPopupPositioner","availableHeight","setAvailableHeight","createSignal","pos","createPositioner","options","toContextMenuPlacement","offset","flip","shift","size","hide","containingBlockOffset"],"sources":["../../../../src/components/context-menu/ContextMenuContent/context-menu.positioner.ts"],"sourcesContent":["import { createSignal, type Accessor } from \"solid-js\";\nimport {\n containingBlockOffset,\n createPositioner,\n flip,\n hide,\n offset,\n shift,\n size,\n type Placement,\n type Positioner,\n type ReferenceElement,\n} from \"~/lib\";\nimport type { ContextMenuAlign, ContextMenuSide } from \"../context-menu.types\";\nimport { toContextMenuPlacement } from \"../context-menu.utils\";\n\nexport interface PopupPositionerOptions {\n /** 定位锚点:根菜单是鼠标坐标的虚拟元素,子菜单是子菜单触发器 */\n reference: Accessor<ReferenceElement | undefined>;\n /** 负责定位的外层元素 */\n positionerElement: Accessor<HTMLElement | undefined>;\n side: Accessor<ContextMenuSide>;\n align: Accessor<ContextMenuAlign>;\n dir: Accessor<\"ltr\" | \"rtl\" | \"auto\" | undefined>;\n sideOffset: Accessor<number>;\n alignOffset: Accessor<number>;\n collisionPadding: Accessor<number>;\n}\n\nexport interface PopupPositioner {\n pos: Positioner;\n availableHeight: Accessor<number | undefined>;\n placement: Accessor<Placement>;\n}\n\n/**\n * 浮层的定位配置。\n *\n * 单一职责:把 `side` / `align` / 偏移 / 碰撞内边距这些 props 翻译成\n * middleware 组合(offset → flip → shift → size → hide → containingBlockOffset),\n * 并把 size 中间件算出的可用高度暴露给调用方(用于 max-height 滚动)。\n *\n * `containingBlockOffset` 放在最后:Portal 里的浮层相对视口定位,\n * 但祖先若有 `transform`,fixed 定位的参考系会变,需要补上这段偏移。\n */\nexport function createPopupPositioner(\n options: PopupPositionerOptions,\n): PopupPositioner {\n const [availableHeight, setAvailableHeight] = createSignal<number>();\n\n const pos = createPositioner(options.reference, options.positionerElement, {\n placement: () =>\n toContextMenuPlacement(options.side(), options.align(), options.dir()),\n strategy: \"fixed\",\n middleware: () => [\n offset({\n mainAxis: options.sideOffset(),\n crossAxis: options.alignOffset(),\n }),\n flip(),\n shift({ padding: options.collisionPadding() }),\n size({\n padding: options.collisionPadding(),\n apply: ({ availableHeight }) => setAvailableHeight(availableHeight),\n }),\n hide(),\n containingBlockOffset(),\n ],\n });\n\n return { pos, availableHeight, placement: pos.placement };\n}\n"],"mappings":";;;;;;;;;;AA6CA,SAAgBA,EACd,GACiB;CACjB,IAAM,CAACC,GAAiBC,KAAsBC,EAAqB,GAE7DC,IAAMC,EAAiBC,EAAQ,WAAWA,EAAQ,mBAAmB;EACzE,iBACEC,EAAuBD,EAAQ,KAAK,GAAGA,EAAQ,MAAM,GAAGA,EAAQ,IAAI,CAAC;EACvE,UAAU;EACV,kBAAkB;GAChBE,EAAO;IACL,UAAUF,EAAQ,WAAW;IAC7B,WAAWA,EAAQ,YAAY;GACjC,CAAC;GACDG,EAAK;GACLC,EAAM,EAAE,SAASJ,EAAQ,iBAAiB,EAAE,CAAC;GAC7CK,EAAK;IACH,SAASL,EAAQ,iBAAiB;IAClC,QAAQ,EAAE,yBAAsBJ,EAAmBD,CAAe;GACpE,CAAC;GACDW,EAAK;GACLC,EAAsB;EACxB;CACF,CAAC;CAED,OAAO;EAAE;EAAK;EAAiB,WAAWT,EAAI;CAAU;AAC1D"}
|
|
@@ -1,153 +1,87 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { containingBlockOffset as o } from "../../../lib/positioner/middleware/containing-block-offset.js";
|
|
8
|
-
import { toContextMenuPlacement as s } from "../context-menu.utils.js";
|
|
9
|
-
import { createEffect as c, createMemo as l, createSignal as u, createUniqueId as d, onCleanup as f } from "solid-js";
|
|
1
|
+
import { handleMenuKeyDown as e } from "../context-menu.keyboard.js";
|
|
2
|
+
import { createHighlight as t } from "./context-menu.highlight.js";
|
|
3
|
+
import { createPopupPositioner as n } from "./context-menu.positioner.js";
|
|
4
|
+
import { createItemCollection as r } from "./context-menu.popup-items.js";
|
|
5
|
+
import { createTypeahead as i } from "../context-menu.typeahead.js";
|
|
6
|
+
import { createSignal as a, createUniqueId as o, onCleanup as s } from "solid-js";
|
|
10
7
|
//#region src/components/context-menu/ContextMenuContent/useContextMenuContent.ts
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}, z = (e) => {
|
|
35
|
-
let t = P();
|
|
36
|
-
if (t.length === 0) return;
|
|
37
|
-
let n = t.findIndex((e) => e.id === T()), r;
|
|
38
|
-
n === -1 ? r = e > 0 ? 0 : t.length - 1 : (r = n + e, r < 0 ? r = g() ? t.length - 1 : 0 : r >= t.length && (r = g() ? 0 : t.length - 1)), R(t[r].id);
|
|
39
|
-
}, B = () => {
|
|
40
|
-
let e = P();
|
|
41
|
-
R(e.length > 0 ? e[0].id : void 0);
|
|
42
|
-
}, V = () => {
|
|
43
|
-
let e = P();
|
|
44
|
-
R(e.length > 0 ? e[e.length - 1].id : void 0);
|
|
45
|
-
};
|
|
46
|
-
c(() => {
|
|
47
|
-
let e = T();
|
|
48
|
-
e && N().find((t) => t.id === e)?.element.scrollIntoView({ block: "nearest" });
|
|
49
|
-
}), c(() => {
|
|
50
|
-
m.open() || (E(void 0), O(void 0));
|
|
8
|
+
function c(c) {
|
|
9
|
+
let { root: l } = c, u = () => c.loopFocus?.() ?? l.loopFocus(), d = () => c.orientation?.() ?? l.orientation(), f = () => c.highlightItemOnHover?.() ?? l.highlightItemOnHover(), [p, m] = a(), [h, g] = a(), { registerItem: _, orderedItems: v, enabledItems: y } = r(), [b, x] = a(), S = `context-menu-popup-${o()}`, { pos: C, availableHeight: w, placement: T } = n({
|
|
10
|
+
reference: c.reference,
|
|
11
|
+
positionerElement: h,
|
|
12
|
+
side: c.side,
|
|
13
|
+
align: c.align,
|
|
14
|
+
dir: c.dir,
|
|
15
|
+
sideOffset: c.sideOffset,
|
|
16
|
+
alignOffset: c.alignOffset,
|
|
17
|
+
collisionPadding: c.collisionPadding
|
|
18
|
+
}), E = () => x(void 0), { activeId: D, activeEntry: O, setActiveId: k, moveActive: A, focusFirst: j, focusLast: M } = t({
|
|
19
|
+
orderedItems: v,
|
|
20
|
+
enabledItems: y,
|
|
21
|
+
loopFocus: u,
|
|
22
|
+
openPopupId: () => b()?.id,
|
|
23
|
+
closeOpenPopup: E,
|
|
24
|
+
open: c.open
|
|
25
|
+
}), N = i({
|
|
26
|
+
candidates: () => y().map((e) => ({
|
|
27
|
+
id: e.id,
|
|
28
|
+
label: e.label()
|
|
29
|
+
})),
|
|
30
|
+
onMatch: (e) => k(e)
|
|
51
31
|
});
|
|
52
|
-
|
|
53
|
-
H += e.toLowerCase(), U !== void 0 && window.clearTimeout(U), U = window.setTimeout(() => {
|
|
54
|
-
H = "", U = void 0;
|
|
55
|
-
}, p);
|
|
56
|
-
let t = P().find((e) => e.label().toLowerCase().startsWith(H));
|
|
57
|
-
t && R(t.id);
|
|
58
|
-
};
|
|
59
|
-
return f(() => {
|
|
60
|
-
U !== void 0 && window.clearTimeout(U);
|
|
61
|
-
}), {
|
|
32
|
+
return s(() => N.dispose()), {
|
|
62
33
|
popupCtx: {
|
|
63
|
-
root:
|
|
64
|
-
parent:
|
|
65
|
-
submenu:
|
|
66
|
-
menuId:
|
|
67
|
-
isSubmenu:
|
|
68
|
-
popup:
|
|
69
|
-
setPopup: (e) =>
|
|
70
|
-
items:
|
|
71
|
-
registerItem:
|
|
72
|
-
activeId:
|
|
73
|
-
setActiveId:
|
|
74
|
-
activeEntry:
|
|
75
|
-
moveActive:
|
|
76
|
-
focusFirst:
|
|
77
|
-
focusLast:
|
|
78
|
-
highlight: (e) =>
|
|
79
|
-
openPopupState:
|
|
80
|
-
openPopup: (e, t, n) =>
|
|
34
|
+
root: l,
|
|
35
|
+
parent: c.parent,
|
|
36
|
+
submenu: c.submenu,
|
|
37
|
+
menuId: S,
|
|
38
|
+
isSubmenu: c.isSubmenu,
|
|
39
|
+
popup: p,
|
|
40
|
+
setPopup: (e) => m(e),
|
|
41
|
+
items: v,
|
|
42
|
+
registerItem: _,
|
|
43
|
+
activeId: D,
|
|
44
|
+
setActiveId: k,
|
|
45
|
+
activeEntry: O,
|
|
46
|
+
moveActive: A,
|
|
47
|
+
focusFirst: j,
|
|
48
|
+
focusLast: M,
|
|
49
|
+
highlight: (e) => k(e),
|
|
50
|
+
openPopupState: b,
|
|
51
|
+
openPopup: (e, t, n) => x({
|
|
81
52
|
id: e,
|
|
82
53
|
reason: t,
|
|
83
54
|
event: n
|
|
84
55
|
}),
|
|
85
|
-
closeOpenPopup:
|
|
86
|
-
closeAll: (e, t) =>
|
|
87
|
-
highlightItemOnHover:
|
|
88
|
-
},
|
|
89
|
-
pos: M,
|
|
90
|
-
popupEl: y,
|
|
91
|
-
setPopupEl: (e) => b(e),
|
|
92
|
-
positionerEl: x,
|
|
93
|
-
setPositionerEl: (e) => S(e),
|
|
94
|
-
availableHeight: k,
|
|
95
|
-
placement: M.placement,
|
|
96
|
-
onKeyDown: (e) => {
|
|
97
|
-
let t = m.submenu, n = _() === "horizontal";
|
|
98
|
-
switch (e.key) {
|
|
99
|
-
case "ArrowDown":
|
|
100
|
-
e.preventDefault(), z(1);
|
|
101
|
-
break;
|
|
102
|
-
case "ArrowUp":
|
|
103
|
-
e.preventDefault(), z(-1);
|
|
104
|
-
break;
|
|
105
|
-
case "ArrowRight": {
|
|
106
|
-
if (n) {
|
|
107
|
-
e.preventDefault(), z(1);
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
let t = F();
|
|
111
|
-
t?.hasPopup() && (e.preventDefault(), t.openPopup?.("list-navigation", e));
|
|
112
|
-
break;
|
|
113
|
-
}
|
|
114
|
-
case "ArrowLeft":
|
|
115
|
-
if (n) {
|
|
116
|
-
e.preventDefault(), z(-1);
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
t && (e.preventDefault(), e.stopPropagation(), t.closeSubmenu("list-navigation", e, !0));
|
|
120
|
-
break;
|
|
121
|
-
case "Home":
|
|
122
|
-
e.preventDefault(), B();
|
|
123
|
-
break;
|
|
124
|
-
case "End":
|
|
125
|
-
e.preventDefault(), V();
|
|
126
|
-
break;
|
|
127
|
-
case "Enter":
|
|
128
|
-
case " ": {
|
|
129
|
-
e.preventDefault();
|
|
130
|
-
let t = F();
|
|
131
|
-
t && !t.disabled() && t.activate();
|
|
132
|
-
break;
|
|
133
|
-
}
|
|
134
|
-
case "Escape":
|
|
135
|
-
e.preventDefault(), e.stopPropagation(), t && !t.closeParentOnEsc() ? t.closeSubmenu("escape-key", e, !0) : h.closeAll("escape-key", e);
|
|
136
|
-
break;
|
|
137
|
-
case "Tab":
|
|
138
|
-
e.preventDefault(), h.closeAll("focus-out", e);
|
|
139
|
-
break;
|
|
140
|
-
default: e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey && W(e.key);
|
|
141
|
-
}
|
|
56
|
+
closeOpenPopup: E,
|
|
57
|
+
closeAll: (e, t) => l.closeAll(e, t),
|
|
58
|
+
highlightItemOnHover: f
|
|
142
59
|
},
|
|
60
|
+
pos: C,
|
|
61
|
+
popupEl: p,
|
|
62
|
+
setPopupEl: (e) => m(e),
|
|
63
|
+
positionerEl: h,
|
|
64
|
+
setPositionerEl: (e) => g(e),
|
|
65
|
+
availableHeight: w,
|
|
66
|
+
placement: T,
|
|
67
|
+
onKeyDown: (t) => e(t, {
|
|
68
|
+
horizontal: d() === "horizontal",
|
|
69
|
+
activeEntry: O,
|
|
70
|
+
moveActive: A,
|
|
71
|
+
focusFirst: j,
|
|
72
|
+
focusLast: M,
|
|
73
|
+
typeahead: (e) => N.handle(e),
|
|
74
|
+
submenu: c.submenu,
|
|
75
|
+
closeAll: (e, t) => l.closeAll(e, t)
|
|
76
|
+
}),
|
|
143
77
|
setupOnOpen: () => {
|
|
144
78
|
queueMicrotask(() => {
|
|
145
|
-
|
|
79
|
+
c.open() && (p()?.focus({ preventScroll: !0 }), D() === void 0 && j());
|
|
146
80
|
});
|
|
147
81
|
}
|
|
148
82
|
};
|
|
149
83
|
}
|
|
150
84
|
//#endregion
|
|
151
|
-
export {
|
|
85
|
+
export { c as createContextMenuPopupRuntime };
|
|
152
86
|
|
|
153
87
|
//# sourceMappingURL=useContextMenuContent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContextMenuContent.js","names":["TYPEAHEAD_TIMEOUT","createContextMenuPopupRuntime","options","loopFocus","root","orientation","highlightItemOnHover","popupEl","setPopupEl","createSignal","positionerEl","setPositionerEl","items","setItems","activeId","setActiveIdInternal","openPopupState","setOpenPopupState","availableHeight","setAvailableHeight","menuId","createUniqueId","pos","createPositioner","toContextMenuPlacement","offset","flip","shift","size","hide","containingBlockOffset","orderedItems","createMemo","a","b","enabledItems","item","activeEntry","registerItem","list","entry","it","closeOpenPopup","setActiveId","id","state","moveActive","currentIndex","nextIndex","delta","focusFirst","focusLast","createEffect","typeaheadBuffer","typeaheadTimer","runTypeahead","char","match","onCleanup","el","reason","event","submenu","horizontal"],"sources":["../../../../src/components/context-menu/ContextMenuContent/useContextMenuContent.ts"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n onCleanup,\n type Accessor,\n} from \"solid-js\";\nimport {\n containingBlockOffset,\n createPositioner,\n flip,\n hide,\n offset,\n shift,\n size,\n type Placement,\n type Positioner,\n type ReferenceElement,\n} from \"~/lib\";\nimport type {\n ContextMenuAlign,\n ContextMenuContextValue,\n ContextMenuOpenPopupState,\n ContextMenuItemEntry,\n ContextMenuOrientation,\n ContextMenuPopupContextValue,\n ContextMenuSide,\n ContextMenuSubmenuContextValue,\n} from \"../context-menu.types\";\nimport { toContextMenuPlacement } from \"../context-menu.utils\";\n\n/** 键盘字符导航的缓冲窗口(毫秒) */\nconst TYPEAHEAD_TIMEOUT = 500;\n\nexport interface CreateContextMenuPopupOptions {\n root: ContextMenuContextValue;\n /** 该浮层自身的打开状态(根菜单 = root.open,子菜单 = submenu.open) */\n open: Accessor<boolean>;\n /** 父级浮层:根菜单为 undefined,子菜单为触发它的那个浮层 */\n parent?: ContextMenuPopupContextValue;\n isSubmenu: boolean;\n /** 定位锚点:根菜单是鼠标坐标的虚拟元素,子菜单是子菜单触发器 */\n reference: Accessor<ReferenceElement | undefined>;\n side: Accessor<ContextMenuSide>;\n align: Accessor<ContextMenuAlign>;\n sideOffset: Accessor<number>;\n alignOffset: Accessor<number>;\n collisionPadding: Accessor<number>;\n dir: Accessor<\"ltr\" | \"rtl\" | \"auto\" | undefined>;\n /** 子菜单可以覆盖根组件的行为;不传则回退到 root 上的值 */\n loopFocus?: Accessor<boolean>;\n orientation?: Accessor<ContextMenuOrientation>;\n highlightItemOnHover?: Accessor<boolean>;\n /** 子菜单场景下提供,用于 ArrowLeft / Escape 只关闭当前子菜单 */\n submenu?: ContextMenuSubmenuContextValue;\n}\n\nexport interface ContextMenuPopupRuntime {\n popupCtx: ContextMenuPopupContextValue;\n pos: Positioner;\n /** 真正承载焦点的 popup 元素 */\n popupEl: Accessor<HTMLElement | undefined>;\n setPopupEl: (el: HTMLElement | undefined) => void;\n /** 负责定位的外层元素 */\n positionerEl: Accessor<HTMLElement | undefined>;\n setPositionerEl: (el: HTMLElement | undefined) => void;\n /** size 中间件算出的可用高度,用于 max-height 滚动 */\n availableHeight: Accessor<number | undefined>;\n placement: Accessor<Placement>;\n onKeyDown: (e: KeyboardEvent) => void;\n /** 打开后聚焦 popup 并把高亮落到第一项 */\n setupOnOpen: () => void;\n}\n\n/**\n * 一个浮层(根菜单或子菜单)的运行时:定位、菜单项注册、高亮/键盘导航、\n * 类型头(typeahead)以及开关联动都收敛在这里。`ContextMenuContent` 与\n * `ContextMenuSubContent` 共用它,只是传入的锚点与父子关系不同。\n *\n * 交互模型:焦点始终落在 popup 上,高亮项通过 `aria-activedescendant` 表达\n * (而不是把真实焦点在菜单项之间搬来搬去)。这与本项目 Select 的做法一致,\n * 既避免了焦点在 Portal / 子菜单之间的来回跳,也让\"关闭后把焦点还给触发器\"\n * 变得非常简单。\n */\nexport function createContextMenuPopupRuntime(\n options: CreateContextMenuPopupOptions,\n): ContextMenuPopupRuntime {\n const { root } = options;\n const loopFocus = () => options.loopFocus?.() ?? root.loopFocus();\n const orientation = () => options.orientation?.() ?? root.orientation();\n const highlightItemOnHover = () =>\n options.highlightItemOnHover?.() ?? root.highlightItemOnHover();\n\n const [popupEl, setPopupEl] = createSignal<HTMLElement>();\n const [positionerEl, setPositionerEl] = createSignal<HTMLElement>();\n const [items, setItems] = createSignal<ContextMenuItemEntry[]>([]);\n const [activeId, setActiveIdInternal] = createSignal<string | undefined>();\n const [openPopupState, setOpenPopupState] =\n createSignal<ContextMenuOpenPopupState>();\n const [availableHeight, setAvailableHeight] = createSignal<number>();\n\n const menuId = `context-menu-popup-${createUniqueId()}`;\n\n const pos = createPositioner(options.reference, positionerEl, {\n placement: () =>\n toContextMenuPlacement(options.side(), options.align(), options.dir()),\n strategy: \"fixed\",\n middleware: () => [\n offset({\n mainAxis: options.sideOffset(),\n crossAxis: options.alignOffset(),\n }),\n flip(),\n shift({ padding: options.collisionPadding() }),\n size({\n padding: options.collisionPadding(),\n apply: ({ availableHeight }) => setAvailableHeight(availableHeight),\n }),\n hide(),\n containingBlockOffset(),\n ],\n });\n\n // 按 DOM 顺序排序,避免调用方用 <For> 动态生成菜单项时顺序错乱。\n const orderedItems = createMemo(() => {\n const list = items();\n return [...list].sort((a, b) => {\n if (a.element === b.element) return 0;\n const relation = a.element.compareDocumentPosition(b.element);\n return relation & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;\n });\n });\n\n const enabledItems = createMemo(() =>\n orderedItems().filter((item) => !item.disabled()),\n );\n\n const activeEntry = () =>\n orderedItems().find((item) => item.id === activeId());\n\n const registerItem = (entry: ContextMenuItemEntry) => {\n setItems((list) => [...list, entry]);\n return () => setItems((list) => list.filter((it) => it.id !== entry.id));\n };\n\n const closeOpenPopup = () => setOpenPopupState(undefined);\n\n /** 高亮某项;若高亮切到了别的项,顺手关掉已展开的子菜单 */\n const setActiveId = (id: string | undefined) => {\n setActiveIdInternal(id);\n const state = openPopupState();\n if (state && state.id !== id) closeOpenPopup();\n };\n\n const moveActive = (delta: 1 | -1) => {\n const list = enabledItems();\n if (list.length === 0) return;\n const currentIndex = list.findIndex((item) => item.id === activeId());\n let nextIndex: number;\n if (currentIndex === -1) {\n nextIndex = delta > 0 ? 0 : list.length - 1;\n } else {\n nextIndex = currentIndex + delta;\n if (nextIndex < 0) {\n nextIndex = loopFocus() ? list.length - 1 : 0;\n } else if (nextIndex >= list.length) {\n nextIndex = loopFocus() ? 0 : list.length - 1;\n }\n }\n setActiveId(list[nextIndex].id);\n };\n\n const focusFirst = () => {\n const list = enabledItems();\n setActiveId(list.length > 0 ? list[0].id : undefined);\n };\n\n const focusLast = () => {\n const list = enabledItems();\n setActiveId(list.length > 0 ? list[list.length - 1].id : undefined);\n };\n\n // 高亮项变化时滚动到可见区域\n createEffect(() => {\n const id = activeId();\n if (!id) return;\n orderedItems()\n .find((item) => item.id === id)\n ?.element.scrollIntoView({ block: \"nearest\" });\n });\n\n // 关闭时清空高亮与子菜单状态,保证下次打开重新从第一项开始。\n createEffect(() => {\n if (!options.open()) {\n setActiveIdInternal(undefined);\n setOpenPopupState(undefined);\n }\n });\n\n // --- 键盘字符导航 ---\n let typeaheadBuffer = \"\";\n let typeaheadTimer: number | undefined;\n\n const runTypeahead = (char: string) => {\n typeaheadBuffer += char.toLowerCase();\n if (typeaheadTimer !== undefined) window.clearTimeout(typeaheadTimer);\n typeaheadTimer = window.setTimeout(() => {\n typeaheadBuffer = \"\";\n typeaheadTimer = undefined;\n }, TYPEAHEAD_TIMEOUT);\n\n const match = enabledItems().find((item) =>\n item.label().toLowerCase().startsWith(typeaheadBuffer),\n );\n if (match) setActiveId(match.id);\n };\n\n onCleanup(() => {\n if (typeaheadTimer !== undefined) window.clearTimeout(typeaheadTimer);\n });\n\n const onKeyDown = (e: KeyboardEvent) => {\n const submenu = options.submenu;\n const horizontal = orientation() === \"horizontal\";\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n moveActive(1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n moveActive(-1);\n break;\n case \"ArrowRight\": {\n if (horizontal) {\n e.preventDefault();\n moveActive(1);\n break;\n }\n const entry = activeEntry();\n if (entry?.hasPopup()) {\n e.preventDefault();\n entry.openPopup?.(\"list-navigation\", e);\n }\n break;\n }\n case \"ArrowLeft\": {\n if (horizontal) {\n e.preventDefault();\n moveActive(-1);\n break;\n }\n if (submenu) {\n e.preventDefault();\n // 阻止冒泡,避免父级浮层也处理这次按键\n e.stopPropagation();\n submenu.closeSubmenu(\"list-navigation\", e, true);\n }\n break;\n }\n case \"Home\":\n e.preventDefault();\n focusFirst();\n break;\n case \"End\":\n e.preventDefault();\n focusLast();\n break;\n case \"Enter\":\n case \" \": {\n e.preventDefault();\n const entry = activeEntry();\n if (entry && !entry.disabled()) entry.activate();\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n e.stopPropagation();\n if (submenu && !submenu.closeParentOnEsc()) {\n submenu.closeSubmenu(\"escape-key\", e, true);\n } else {\n root.closeAll(\"escape-key\", e);\n }\n break;\n }\n case \"Tab\": {\n // 关闭菜单并把焦点交还触发器,浏览器随后的 Tab 会从触发器之后继续\n e.preventDefault();\n root.closeAll(\"focus-out\", e);\n break;\n }\n default: {\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n runTypeahead(e.key);\n }\n }\n }\n };\n\n const popupCtx: ContextMenuPopupContextValue = {\n root,\n parent: options.parent,\n submenu: options.submenu,\n menuId,\n isSubmenu: options.isSubmenu,\n popup: popupEl,\n setPopup: (el) => setPopupEl(el),\n items: orderedItems,\n registerItem,\n activeId,\n setActiveId,\n activeEntry,\n moveActive,\n focusFirst,\n focusLast,\n highlight: (id) => setActiveId(id),\n openPopupState,\n openPopup: (id, reason, event) => setOpenPopupState({ id, reason, event }),\n closeOpenPopup,\n closeAll: (reason, event) => root.closeAll(reason, event),\n highlightItemOnHover,\n };\n\n /** 浮层挂载完成后的收尾:聚焦 popup(键盘事件依赖它)并高亮第一项 */\n const setupOnOpen = () => {\n queueMicrotask(() => {\n if (!options.open()) return;\n popupEl()?.focus({ preventScroll: true });\n if (activeId() === undefined) focusFirst();\n });\n };\n\n return {\n popupCtx,\n pos,\n popupEl,\n setPopupEl: (el) => setPopupEl(el),\n positionerEl,\n setPositionerEl: (el) => setPositionerEl(el),\n availableHeight,\n placement: pos.placement,\n onKeyDown,\n setupOnOpen,\n };\n}\n"],"mappings":";;;;;;;;;;AAiCA,IAAMA,IAAoB;AAoD1B,SAAgBC,EACd,GACyB;CACzB,IAAM,EAAE,YAASC,GACXC,UAAkBD,EAAQ,YAAY,KAAKE,EAAK,UAAU,GAC1DC,UAAoBH,EAAQ,cAAc,KAAKE,EAAK,YAAY,GAChEE,UACJJ,EAAQ,uBAAuB,KAAKE,EAAK,qBAAqB,GAE1D,CAACG,GAASC,KAAcC,EAA0B,GAClD,CAACC,GAAcC,KAAmBF,EAA0B,GAC5D,CAACG,GAAOC,KAAYJ,EAAqC,CAAC,CAAC,GAC3D,CAACK,GAAUC,KAAuBN,EAAiC,GACnE,CAACO,GAAgBC,KACrBR,EAAwC,GACpC,CAACS,GAAiBC,KAAsBV,EAAqB,GAE7DW,IAAS,sBAAsBC,EAAe,KAE9CC,IAAMC,EAAiBrB,EAAQ,WAAWQ,GAAc;EAC5D,iBACEc,EAAuBtB,EAAQ,KAAK,GAAGA,EAAQ,MAAM,GAAGA,EAAQ,IAAI,CAAC;EACvE,UAAU;EACV,kBAAkB;GAChBuB,EAAO;IACL,UAAUvB,EAAQ,WAAW;IAC7B,WAAWA,EAAQ,YAAY;GACjC,CAAC;GACDwB,EAAK;GACLC,EAAM,EAAE,SAASzB,EAAQ,iBAAiB,EAAE,CAAC;GAC7C0B,EAAK;IACH,SAAS1B,EAAQ,iBAAiB;IAClC,QAAQ,EAAE,yBAAsBiB,EAAmBD,CAAe;GACpE,CAAC;GACDW,EAAK;GACLC,EAAsB;EACxB;CACF,CAAC,GAGKC,IAAeC,QAEZ,CAAC,GADKpB,EACF,CAAI,CAAC,CAAC,MAAM,GAAG,MACpBqB,EAAE,YAAYC,EAAE,UAAgB,IACnBD,EAAE,QAAQ,wBAAwBC,EAAE,OAC9C,IAAW,KAAK,8BAA8B,KAAK,CAC3D,CACF,GAEKC,IAAeH,QACnBD,EAAa,CAAC,CAAC,QAAQ,MAAS,CAACK,EAAK,SAAS,CAAC,CAClD,GAEMC,UACJN,EAAa,CAAC,CAAC,MAAM,MAASK,EAAK,OAAOtB,EAAS,CAAC,GAEhDwB,KAAgB,OACpBzB,GAAU,MAAS,CAAC,GAAG0B,GAAMC,CAAK,CAAC,SACtB3B,GAAU,MAAS0B,EAAK,QAAQ,MAAOE,EAAG,OAAOD,EAAM,EAAE,CAAC,IAGnEE,UAAuBzB,EAAkB,KAAA,CAAS,GAGlD0B,KAAe,MAA2B;EAC9C,EAAoBC,CAAE;EACtB,IAAMC,IAAQ7B,EAAe;EAC7B,AAAI6B,KAASA,EAAM,OAAOD,KAAIF,EAAe;CAC/C,GAEMI,KAAc,MAAkB;EACpC,IAAMP,IAAOJ,EAAa;EAC1B,IAAII,EAAK,WAAW,GAAG;EACvB,IAAMQ,IAAeR,EAAK,WAAW,MAASH,EAAK,OAAOtB,EAAS,CAAC,GAChEkC;EAWJ,AAVID,MAAiB,KACnB,IAAYE,IAAQ,IAAI,IAAIV,EAAK,SAAS,KAE1C,IAAYQ,IAAeE,GACvBD,IAAY,IACd,IAAY7C,EAAU,IAAIoC,EAAK,SAAS,IAAI,IACnCS,KAAaT,EAAK,WAC3B,IAAYpC,EAAU,IAAI,IAAIoC,EAAK,SAAS,KAGhDI,EAAYJ,EAAKS,EAAU,CAAC,EAAE;CAChC,GAEME,UAAmB;EACvB,IAAMX,IAAOJ,EAAa;EAC1B,EAAYI,EAAK,SAAS,IAAIA,EAAK,EAAE,CAAC,KAAK,KAAA,CAAS;CACtD,GAEMY,UAAkB;EACtB,IAAMZ,IAAOJ,EAAa;EAC1B,EAAYI,EAAK,SAAS,IAAIA,EAAKA,EAAK,SAAS,EAAE,CAAC,KAAK,KAAA,CAAS;CACpE;CAYA,AATAa,QAAmB;EACjB,IAAMR,IAAK9B,EAAS;EACpB,AAAK8B,KACLb,EAAa,CAAC,CACX,MAAM,MAASK,EAAK,OAAOQ,CAAE,CAAC,EAC7B,QAAQ,eAAe,EAAE,OAAO,UAAU,CAAC;CACjD,CAAC,GAGDQ,QAAmB;EACjB,AAAKlD,EAAQ,KAAK,MAChBa,EAAoB,KAAA,CAAS,GAC7BE,EAAkB,KAAA,CAAS;CAE/B,CAAC;CAGD,IAAIoC,IAAkB,IAClBC,GAEEC,KAAgB,MAAiB;EAGrC,AAFA,KAAmBC,EAAK,YAAY,GAChCF,MAAmB,KAAA,KAAW,OAAO,aAAaA,CAAc,GACpE,IAAiB,OAAO,iBAAiB;GAEvC,AADA,IAAkB,IAClB,IAAiB,KAAA;EACnB,GAAGtD,CAAiB;EAEpB,IAAMyD,IAAQtB,EAAa,CAAC,CAAC,MAAM,MACjCC,EAAK,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,WAAWiB,CAAe,CACvD;EACA,AAAII,KAAOd,EAAYc,EAAM,EAAE;CACjC;CAsHA,OApHAC,QAAgB;EACd,AAAIJ,MAAmB,KAAA,KAAW,OAAO,aAAaA,CAAc;CACtE,CAAC,GAkHM;EACL;GAjCA;GACA,QAAQpD,EAAQ;GAChB,SAASA,EAAQ;GACjB;GACA,WAAWA,EAAQ;GACnB,OAAOK;GACP,WAAW,MAAOC,EAAWmD,CAAE;GAC/B,OAAO5B;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA,YAAY,MAAOY,EAAYC,CAAE;GACjC;GACA,YAAY,GAAI,GAAQ,MAAU3B,EAAkB;IAAE;IAAI;IAAQ;GAAM,CAAC;GACzE;GACA,WAAW,GAAQ,MAAUb,EAAK,SAASwD,GAAQC,CAAK;GACxD;EAaA;EACA;EACA;EACA,aAAa,MAAOrD,EAAWmD,CAAE;EACjC;EACA,kBAAkB,MAAOhD,EAAgBgD,CAAE;EAC3C;EACA,WAAWrC,EAAI;EACf,YAzHiB,MAAqB;GACtC,IAAMwC,IAAU5D,EAAQ,SAClB6D,IAAa1D,EAAY,MAAM;GAErC,QAAQ,EAAE,KAAV;IACE,KAAK;KAEH,AADA,EAAE,eAAe,GACjByC,EAAW,CAAC;KACZ;IACF,KAAK;KAEH,AADA,EAAE,eAAe,GACjBA,EAAW,EAAE;KACb;IACF,KAAK,cAAc;KACjB,IAAIiB,GAAY;MAEd,AADA,EAAE,eAAe,GACjBjB,EAAW,CAAC;MACZ;KACF;KACA,IAAMN,IAAQH,EAAY;KAC1B,AAAIG,GAAO,SAAS,MAClB,EAAE,eAAe,GACjBA,EAAM,YAAY,mBAAmB,CAAC;KAExC;IACF;IACA,KAAK;KACH,IAAIuB,GAAY;MAEd,AADA,EAAE,eAAe,GACjBjB,EAAW,EAAE;MACb;KACF;KACA,AAAIgB,MACF,EAAE,eAAe,GAEjB,EAAE,gBAAgB,GAClBA,EAAQ,aAAa,mBAAmB,GAAG,EAAI;KAEjD;IAEF,KAAK;KAEH,AADA,EAAE,eAAe,GACjBZ,EAAW;KACX;IACF,KAAK;KAEH,AADA,EAAE,eAAe,GACjBC,EAAU;KACV;IACF,KAAK;IACL,KAAK,KAAK;KACR,EAAE,eAAe;KACjB,IAAMX,IAAQH,EAAY;KAC1B,AAAIG,KAAS,CAACA,EAAM,SAAS,KAAGA,EAAM,SAAS;KAC/C;IACF;IACA,KAAK;KAGH,AAFA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GACdsB,KAAW,CAACA,EAAQ,iBAAiB,IACvCA,EAAQ,aAAa,cAAc,GAAG,EAAI,IAE1C1D,EAAK,SAAS,cAAc,CAAC;KAE/B;IAEF,KAAK;KAGH,AADA,EAAE,eAAe,GACjBA,EAAK,SAAS,aAAa,CAAC;KAC5B;IAEF,SACE,AAAI,EAAE,IAAI,WAAW,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,UACvDmD,EAAa,EAAE,GAAG;GAGxB;EACF;EA6CE,mBAlBwB;GACxB,qBAAqB;IACnB,AAAKrD,EAAQ,KAAK,MAClBK,EAAQ,CAAC,EAAE,MAAM,EAAE,eAAe,GAAK,CAAC,GACpCO,EAAS,MAAM,KAAA,KAAWoC,EAAW;GAC3C,CAAC;EACH;CAaA;AACF"}
|
|
1
|
+
{"version":3,"file":"useContextMenuContent.js","names":["createContextMenuPopupRuntime","options","loopFocus","root","orientation","highlightItemOnHover","popupEl","setPopupEl","createSignal","positionerEl","setPositionerEl","createItemCollection","openPopupState","setOpenPopupState","menuId","createUniqueId","createPopupPositioner","closeOpenPopup","createHighlight","typeahead","createTypeahead","enabledItems","item","setActiveId","id","onCleanup","el","orderedItems","reason","event","handleMenuKeyDown","char","e","activeId","focusFirst"],"sources":["../../../../src/components/context-menu/ContextMenuContent/useContextMenuContent.ts"],"sourcesContent":["import {\n createSignal,\n createUniqueId,\n onCleanup,\n type Accessor,\n} from \"solid-js\";\nimport type { Placement, Positioner, ReferenceElement } from \"~/lib\";\nimport type {\n ContextMenuAlign,\n ContextMenuContextValue,\n ContextMenuOpenPopupState,\n ContextMenuOrientation,\n ContextMenuPopupContextValue,\n ContextMenuSide,\n ContextMenuSubmenuContextValue,\n} from \"../context-menu.types\";\nimport { handleMenuKeyDown } from \"../context-menu.keyboard\";\nimport { createHighlight } from \"./context-menu.highlight\";\nimport { createPopupPositioner } from \"./context-menu.positioner\";\nimport { createItemCollection } from \"./context-menu.popup-items\";\nimport { createTypeahead } from \"../context-menu.typeahead\";\n\nexport interface CreateContextMenuPopupOptions {\n root: ContextMenuContextValue;\n /** 该浮层自身的打开状态(根菜单 = root.open,子菜单 = submenu.open) */\n open: Accessor<boolean>;\n /** 父级浮层:根菜单为 undefined,子菜单为触发它的那个浮层 */\n parent?: ContextMenuPopupContextValue;\n isSubmenu: boolean;\n /** 定位锚点:根菜单是鼠标坐标的虚拟元素,子菜单是子菜单触发器 */\n reference: Accessor<ReferenceElement | undefined>;\n side: Accessor<ContextMenuSide>;\n align: Accessor<ContextMenuAlign>;\n sideOffset: Accessor<number>;\n alignOffset: Accessor<number>;\n collisionPadding: Accessor<number>;\n dir: Accessor<\"ltr\" | \"rtl\" | \"auto\" | undefined>;\n /** 子菜单可以覆盖根组件的行为;不传则回退到 root 上的值 */\n loopFocus?: Accessor<boolean>;\n orientation?: Accessor<ContextMenuOrientation>;\n highlightItemOnHover?: Accessor<boolean>;\n /** 子菜单场景下提供,用于 ArrowLeft / Escape 只关闭当前子菜单 */\n submenu?: ContextMenuSubmenuContextValue;\n}\n\nexport interface ContextMenuPopupRuntime {\n popupCtx: ContextMenuPopupContextValue;\n pos: Positioner;\n /** 真正承载焦点的 popup 元素 */\n popupEl: Accessor<HTMLElement | undefined>;\n setPopupEl: (el: HTMLElement | undefined) => void;\n /** 负责定位的外层元素 */\n positionerEl: Accessor<HTMLElement | undefined>;\n setPositionerEl: (el: HTMLElement | undefined) => void;\n /** size 中间件算出的可用高度,用于 max-height 滚动 */\n availableHeight: Accessor<number | undefined>;\n placement: Accessor<Placement>;\n onKeyDown: (e: KeyboardEvent) => void;\n /** 打开后聚焦 popup 并把高亮落到第一项 */\n setupOnOpen: () => void;\n}\n\n/**\n * 一个浮层(根菜单或子菜单)的运行时:定位、菜单项注册、高亮/键盘导航、\n * 类型头(typeahead)以及开关联动都收敛在这里。`ContextMenuContent` 与\n * `ContextMenuSubContent` 共用它,只是传入的锚点与父子关系不同。\n *\n * 交互模型:焦点始终落在 popup 上,高亮项通过 `aria-activedescendant` 表达\n * (而不是把真实焦点在菜单项之间搬来搬去)。这与本项目 Select 的做法一致,\n * 既避免了焦点在 Portal / 子菜单之间的来回跳,也让\"关闭后把焦点还给触发器\"\n * 变得非常简单。\n */\nexport function createContextMenuPopupRuntime(\n options: CreateContextMenuPopupOptions,\n): ContextMenuPopupRuntime {\n const { root } = options;\n const loopFocus = () => options.loopFocus?.() ?? root.loopFocus();\n const orientation = () => options.orientation?.() ?? root.orientation();\n const highlightItemOnHover = () =>\n options.highlightItemOnHover?.() ?? root.highlightItemOnHover();\n\n const [popupEl, setPopupEl] = createSignal<HTMLElement>();\n const [positionerEl, setPositionerEl] = createSignal<HTMLElement>();\n const { registerItem, orderedItems, enabledItems } = createItemCollection();\n const [openPopupState, setOpenPopupState] =\n createSignal<ContextMenuOpenPopupState>();\n const menuId = `context-menu-popup-${createUniqueId()}`;\n\n const { pos, availableHeight, placement } = createPopupPositioner({\n reference: options.reference,\n positionerElement: positionerEl,\n side: options.side,\n align: options.align,\n dir: options.dir,\n sideOffset: options.sideOffset,\n alignOffset: options.alignOffset,\n collisionPadding: options.collisionPadding,\n });\n\n const closeOpenPopup = () => setOpenPopupState(undefined);\n\n const highlight = createHighlight({\n orderedItems,\n enabledItems,\n loopFocus,\n openPopupId: () => openPopupState()?.id,\n closeOpenPopup,\n open: options.open,\n });\n const {\n activeId,\n activeEntry,\n setActiveId,\n moveActive,\n focusFirst,\n focusLast,\n } = highlight;\n\n // --- 键盘字符导航 ---\n const typeahead = createTypeahead({\n candidates: () =>\n enabledItems().map((item) => ({ id: item.id, label: item.label() })),\n onMatch: (id) => setActiveId(id),\n });\n\n onCleanup(() => typeahead.dispose());\n\n const onKeyDown = (event: KeyboardEvent) =>\n handleMenuKeyDown(event, {\n horizontal: orientation() === \"horizontal\",\n activeEntry,\n moveActive,\n focusFirst,\n focusLast,\n typeahead: (char) => typeahead.handle(char),\n submenu: options.submenu,\n closeAll: (reason, e) => root.closeAll(reason, e),\n });\n\n const popupCtx: ContextMenuPopupContextValue = {\n root,\n parent: options.parent,\n submenu: options.submenu,\n menuId,\n isSubmenu: options.isSubmenu,\n popup: popupEl,\n setPopup: (el) => setPopupEl(el),\n items: orderedItems,\n registerItem,\n activeId,\n setActiveId,\n activeEntry,\n moveActive,\n focusFirst,\n focusLast,\n highlight: (id) => setActiveId(id),\n openPopupState,\n openPopup: (id, reason, event) => setOpenPopupState({ id, reason, event }),\n closeOpenPopup,\n closeAll: (reason, event) => root.closeAll(reason, event),\n highlightItemOnHover,\n };\n\n /** 浮层挂载完成后的收尾:聚焦 popup(键盘事件依赖它)并高亮第一项 */\n const setupOnOpen = () => {\n queueMicrotask(() => {\n if (!options.open()) return;\n popupEl()?.focus({ preventScroll: true });\n if (activeId() === undefined) focusFirst();\n });\n };\n\n return {\n popupCtx,\n pos,\n popupEl,\n setPopupEl: (el) => setPopupEl(el),\n positionerEl,\n setPositionerEl: (el) => setPositionerEl(el),\n availableHeight,\n placement,\n onKeyDown,\n setupOnOpen,\n };\n}\n"],"mappings":";;;;;;;AAwEA,SAAgBA,EACd,GACyB;CACzB,IAAM,EAAE,YAASC,GACXC,UAAkBD,EAAQ,YAAY,KAAKE,EAAK,UAAU,GAC1DC,UAAoBH,EAAQ,cAAc,KAAKE,EAAK,YAAY,GAChEE,UACJJ,EAAQ,uBAAuB,KAAKE,EAAK,qBAAqB,GAE1D,CAACG,GAASC,KAAcC,EAA0B,GAClD,CAACC,GAAcC,KAAmBF,EAA0B,GAC5D,EAAE,iBAAc,iBAAc,oBAAiBG,EAAqB,GACpE,CAACC,GAAgBC,KACrBL,EAAwC,GACpCM,IAAS,sBAAsBC,EAAe,KAE9C,EAAE,QAAK,oBAAiB,iBAAcC,EAAsB;EAChE,WAAWf,EAAQ;EACnB,mBAAmBQ;EACnB,MAAMR,EAAQ;EACd,OAAOA,EAAQ;EACf,KAAKA,EAAQ;EACb,YAAYA,EAAQ;EACpB,aAAaA,EAAQ;EACrB,kBAAkBA,EAAQ;CAC5B,CAAC,GAEKgB,UAAuBJ,EAAkB,KAAA,CAAS,GAUlD,EACJ,aACA,gBACA,gBACA,eACA,eACA,iBAdgBK,EAAgB;EAChC;EACA;EACA;EACA,mBAAmBN,EAAe,CAAC,EAAE;EACrC;EACA,MAAMX,EAAQ;CAChB,CAQI,GAGEkB,IAAYC,EAAgB;EAChC,kBACEC,EAAa,CAAC,CAAC,KAAK,OAAU;GAAE,IAAIC,EAAK;GAAI,OAAOA,EAAK,MAAM;EAAE,EAAE;EACrE,UAAU,MAAOC,EAAYC,CAAE;CACjC,CAAC;CAiDD,OA/CAC,QAAgBN,EAAU,QAAQ,CAAC,GA+C5B;EACL;GAjCA;GACA,QAAQlB,EAAQ;GAChB,SAASA,EAAQ;GACjB;GACA,WAAWA,EAAQ;GACnB,OAAOK;GACP,WAAW,MAAOC,EAAWmB,CAAE;GAC/B,OAAOC;GACP;GACA;GACA;GACA;GACA;GACA;GACA;GACA,YAAY,MAAOJ,EAAYC,CAAE;GACjC;GACA,YAAY,GAAI,GAAQ,MAAUX,EAAkB;IAAE;IAAI;IAAQ;GAAM,CAAC;GACzE;GACA,WAAW,GAAQ,MAAUV,EAAK,SAASyB,GAAQC,CAAK;GACxD;EAaA;EACA;EACA;EACA,aAAa,MAAOtB,EAAWmB,CAAE;EACjC;EACA,kBAAkB,MAAOhB,EAAgBgB,CAAE;EAC3C;EACA;EACA,YAtDiB,MACjBI,EAAkBD,GAAO;GACvB,YAAYzB,EAAY,MAAM;GAC9B;GACA;GACA;GACA;GACA,YAAY,MAASe,EAAU,OAAOY,CAAI;GAC1C,SAAS9B,EAAQ;GACjB,WAAW,GAAQ,MAAME,EAAK,SAASyB,GAAQI,CAAC;EAClD,CAAC;EA6CD,mBAlBwB;GACxB,qBAAqB;IACnB,AAAK/B,EAAQ,KAAK,MAClBK,EAAQ,CAAC,EAAE,MAAM,EAAE,eAAe,GAAK,CAAC,GACpC2B,EAAS,MAAM,KAAA,KAAWC,EAAW;GAC3C,CAAC;EACH;CAaA;AACF"}
|
|
@@ -11,7 +11,8 @@ function l(l) {
|
|
|
11
11
|
};
|
|
12
12
|
s(T);
|
|
13
13
|
let E = (e, n, r) => {
|
|
14
|
-
|
|
14
|
+
let i = t(n, r, b());
|
|
15
|
+
l.onOpenChange?.(e, i), !i.isCanceled && l.open === void 0 && p(e);
|
|
15
16
|
}, D = (e, t, n = !1) => {
|
|
16
17
|
let r = S();
|
|
17
18
|
T(), m() && E(!1, e, t), r && d.openPopupState()?.id === r && d.closeOpenPopup(), n && r && (d.setActiveId(r), d.popup()?.focus({ preventScroll: !0 }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenuSub.js","names":["createMemo","createSignal","onCleanup","JSX","useContextMenuContext","ContextMenuSubmenuContext","useContextMenuPopup","ContextMenuChangeEventReason","ContextMenuSubmenuContextValue","createChangeEventDetails","ContextMenuSubProps","HOVER_CLOSE_GRACE","ContextMenuSub","props","Element","root","parentPopup","internalOpen","setInternalOpen","defaultOpen","open","undefined","disabled","closeParentOnEsc","loopFocus","orientation","highlightItemOnHover","trigger","setTrigger","HTMLElement","itemId","setItemId","closeTimer","cancelClose","window","clearTimeout","setOpen","next","reason","event","Event","onOpenChange","closeSubmenu","focusTrigger","id","openPopupState","closeOpenPopup","setActiveId","popup","focus","preventScroll","openSubmenu","openPopup","scheduleClose","delay","setTimeout","Math","max","ctx","_$createComponent","Provider","value","children","_$createComponent","HOVER_CLOSE_GRACE","ContextMenuSub","root","useContextMenuContext","parentPopup","useContextMenuPopup","internalOpen","setInternalOpen","createSignal","props","open","createMemo","disabled","closeParentOnEsc","loopFocus","orientation","highlightItemOnHover","trigger","setTrigger","itemId","setItemId","closeTimer","cancelClose","setOpen","
|
|
1
|
+
{"version":3,"file":"ContextMenuSub.js","names":["createMemo","createSignal","onCleanup","JSX","useContextMenuContext","ContextMenuSubmenuContext","useContextMenuPopup","ContextMenuChangeEventReason","ContextMenuSubmenuContextValue","createChangeEventDetails","ContextMenuSubProps","HOVER_CLOSE_GRACE","ContextMenuSub","props","Element","root","parentPopup","internalOpen","setInternalOpen","defaultOpen","open","undefined","disabled","closeParentOnEsc","loopFocus","orientation","highlightItemOnHover","trigger","setTrigger","HTMLElement","itemId","setItemId","closeTimer","cancelClose","window","clearTimeout","setOpen","next","reason","event","Event","details","onOpenChange","isCanceled","closeSubmenu","focusTrigger","id","openPopupState","closeOpenPopup","setActiveId","popup","focus","preventScroll","openSubmenu","openPopup","scheduleClose","delay","setTimeout","Math","max","ctx","_$createComponent","Provider","value","children","_$createComponent","HOVER_CLOSE_GRACE","ContextMenuSub","root","useContextMenuContext","parentPopup","useContextMenuPopup","internalOpen","setInternalOpen","createSignal","props","open","createMemo","disabled","closeParentOnEsc","loopFocus","orientation","highlightItemOnHover","trigger","setTrigger","itemId","setItemId","closeTimer","cancelClose","setOpen","details","createChangeEventDetails","reason","event","next","closeSubmenu","id","focusTrigger","ctx","delay","createComponent","ContextMenuSubmenuContext"],"sources":["../../../../src/components/context-menu/ContextMenuSub/ContextMenuSub.tsx"],"sourcesContent":["import { createMemo, createSignal, onCleanup, type JSX } from \"solid-js\";\nimport { useContextMenuContext } from \"../ContextMenu/ContextMenu.context\";\nimport {\n ContextMenuSubmenuContext,\n useContextMenuPopup,\n} from \"../context-menu.context\";\nimport type {\n ContextMenuChangeEventReason,\n ContextMenuSubmenuContextValue,\n} from \"../context-menu.types\";\nimport { createChangeEventDetails } from \"../context-menu.utils\";\nimport type { ContextMenuSubProps } from \"./ContextMenuSub.types\";\n\n/** 鼠标穿越触发器与子菜单之间的间隙时的防抖下限(毫秒) */\nconst HOVER_CLOSE_GRACE = 100;\n\n/**\n * 子菜单根组件:不渲染 DOM,维护子菜单的开关状态、定位锚点(触发器)与\n * 与父浮层之间的联动(同一时间只允许一个子菜单打开)。\n */\nexport function ContextMenuSub(props: ContextMenuSubProps): JSX.Element {\n const root = useContextMenuContext(\"ContextMenuSub\");\n const parentPopup = useContextMenuPopup(\"ContextMenuSub\");\n\n const [internalOpen, setInternalOpen] = createSignal(\n props.defaultOpen ?? false,\n );\n const open = createMemo(() =>\n props.open !== undefined ? props.open : internalOpen(),\n );\n const disabled = createMemo(() => !!props.disabled);\n const closeParentOnEsc = createMemo(() => !!props.closeParentOnEsc);\n const loopFocus = createMemo(() => props.loopFocus ?? root.loopFocus());\n const orientation = createMemo(() => props.orientation ?? root.orientation());\n const highlightItemOnHover = createMemo(\n () => props.highlightItemOnHover ?? root.highlightItemOnHover(),\n );\n\n const [trigger, setTrigger] = createSignal<HTMLElement>();\n const [itemId, setItemId] = createSignal<string>();\n\n let closeTimer: number | undefined;\n const cancelClose = () => {\n if (closeTimer !== undefined) {\n window.clearTimeout(closeTimer);\n closeTimer = undefined;\n }\n };\n onCleanup(cancelClose);\n\n const setOpen = (\n next: boolean,\n reason: ContextMenuChangeEventReason,\n event?: Event,\n ) => {\n const details = createChangeEventDetails(reason, event, trigger());\n // 同根组件:先回调,cancel() 时不落状态\n props.onOpenChange?.(next, details);\n if (details.isCanceled) return;\n if (props.open === undefined) setInternalOpen(next);\n };\n\n const closeSubmenu = (\n reason: ContextMenuChangeEventReason,\n event?: Event,\n focusTrigger = false,\n ) => {\n const id = itemId();\n cancelClose();\n // 先关自己再清父浮层的登记:写信号会同步刷新相关 effect,若反过来,\n // 子菜单触发器的同步 effect 会抢先以 \"list-navigation\" 的 reason 关掉它,\n // 覆盖掉这里想上报的真实关闭原因。\n if (open()) setOpen(false, reason, event);\n if (id && parentPopup.openPopupState()?.id === id) {\n parentPopup.closeOpenPopup();\n }\n\n if (focusTrigger && id) {\n // 焦点还给父浮层,并重新高亮触发器,键盘可以继续在父菜单里导航\n parentPopup.setActiveId(id);\n parentPopup.popup()?.focus({ preventScroll: true });\n }\n };\n\n const openSubmenu = (reason: ContextMenuChangeEventReason, event?: Event) => {\n if (disabled()) return;\n const id = itemId();\n if (!id) return;\n cancelClose();\n if (open()) return;\n // 先登记到父浮层,父浮层据此保证\"同时只有一个子菜单打开\"\n parentPopup.openPopup(id, reason, event);\n setOpen(true, reason, event);\n };\n\n const scheduleClose = (delay = HOVER_CLOSE_GRACE) => {\n cancelClose();\n closeTimer = window.setTimeout(\n () => {\n closeTimer = undefined;\n closeSubmenu(\"trigger-hover\");\n },\n Math.max(delay, HOVER_CLOSE_GRACE),\n );\n };\n\n const ctx: ContextMenuSubmenuContextValue = {\n root,\n parentPopup,\n open,\n setOpen,\n disabled,\n closeParentOnEsc,\n loopFocus,\n orientation,\n highlightItemOnHover,\n trigger,\n setTrigger,\n itemId,\n setItemId,\n openSubmenu,\n closeSubmenu,\n scheduleClose,\n cancelClose,\n };\n\n return (\n <ContextMenuSubmenuContext.Provider value={ctx}>\n {props.children}\n </ContextMenuSubmenuContext.Provider>\n );\n}\n"],"mappings":";;;;;;AAcA,IAAMW,IAAoB;AAM1B,SAAgBC,EAAeC,GAAyC;CACtE,IAAME,IAAOX,EAAsB,gBAAgB,GAC7CY,IAAcV,EAAoB,gBAAgB,GAElD,CAACW,GAAcC,KAAmBjB,EACtCY,EAAMM,eAAe,EACvB,GACMC,IAAOpB,QACXa,EAAMO,SAASC,KAAAA,IAAyBJ,EAAa,IAA1BJ,EAAMO,IACnC,GACME,IAAWtB,QAAiB,CAAC,CAACa,EAAMS,QAAQ,GAC5CC,IAAmBvB,QAAiB,CAAC,CAACa,EAAMU,gBAAgB,GAC5DC,IAAYxB,QAAiBa,EAAMW,aAAaT,EAAKS,UAAU,CAAC,GAChEC,IAAczB,QAAiBa,EAAMY,eAAeV,EAAKU,YAAY,CAAC,GACtEC,IAAuB1B,QACrBa,EAAMa,wBAAwBX,EAAKW,qBAAqB,CAChE,GAEM,CAACC,GAASC,KAAc3B,EAA0B,GAClD,CAAC6B,GAAQC,KAAa9B,EAAqB,GAE7C+B,GACEC,UAAoB;EACxB,AAAID,MAAeX,KAAAA,MACjBa,OAAOC,aAAaH,CAAU,GAC9BA,IAAaX,KAAAA;CAEjB;CACAnB,EAAU+B,CAAW;CAErB,IAAMG,KACJC,GACAC,GACAC,MACG;EACH,IAAME,IAAUhC,EAAyB6B,GAAQC,GAAOZ,EAAQ,CAAC;EAGjE,AADAd,EAAM6B,eAAeL,GAAMI,CAAO,GAC9BA,GAAQE,cACR9B,EAAMO,SAASC,KAAAA,KAAWH,EAAgBmB,CAAI;CACpD,GAEMO,KACJN,GACAC,GACAM,IAAe,OACZ;EACH,IAAMC,IAAKhB,EAAO;EAUlB,AATAG,EAAY,GAIRb,EAAK,KAAGgB,EAAQ,IAAOE,GAAQC,CAAK,GACpCO,KAAM9B,EAAY+B,eAAe,CAAC,EAAED,OAAOA,KAC7C9B,EAAYgC,eAAe,GAGzBH,KAAgBC,MAElB9B,EAAYiC,YAAYH,CAAE,GAC1B9B,EAAYkC,MAAM,CAAC,EAAEC,MAAM,EAAEC,eAAe,GAAK,CAAC;CAEtD,GAwBMQ,IAAsC;EAC1C7C;EACAC;EACAI;EACAgB;EACAd;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAE;EACAC;EACAsB,cApCmBf,GAAsCC,MAAkB;GAC3E,IAAIjB,EAAS,GAAG;GAChB,IAAMwB,IAAKhB,EAAO;GAClB,AAAKgB,MACLb,EAAY,GACRb,GAAK,MAETJ,EAAYsC,UAAUR,GAAIR,GAAQC,CAAK,GACvCH,EAAQ,IAAME,GAAQC,CAAK;EAC7B;EA4BEK;EACAW,gBA3BqBC,IAAQ7C,MAAsB;GAEnDqB,AADAC,EAAY,GACZD,IAAaE,OAAOuB,iBACZ;IAEJb,AADAZ,IAAaX,KAAAA,GACbuB,EAAa,eAAe;GAC9B,GACAc,KAAKC,IAAIH,GAAO7C,CAAiB,CACnC;EACF;EAmBEsB;CACF;CAEA,OAAA4B,EACGxD,EAA0ByD,UAAQ;EAACC,OAAOH;EAAG,IAAAI,WAAA;GAAA,OAC3CnD,EAAMmD;EAAQ;CAAA,CAAA;AAGrB"}
|
|
@@ -2,33 +2,43 @@ import { clsx as e } from "../../../utils/clsx.js";
|
|
|
2
2
|
import { mergeRefs as t } from "../../../utils/ref.js";
|
|
3
3
|
import { useContextMenuTrigger as n } from "./useContextMenuTrigger.js";
|
|
4
4
|
import { Dynamic as r, createComponent as i, mergeProps as a } from "solid-js/web";
|
|
5
|
+
import { splitProps as o } from "solid-js";
|
|
5
6
|
//#region src/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.tsx
|
|
6
|
-
var
|
|
7
|
-
let { ctx:
|
|
8
|
-
|
|
7
|
+
var s = (s) => {
|
|
8
|
+
let { ctx: c, attachListeners: l } = n(), [u, d] = o(s, [
|
|
9
|
+
"component",
|
|
10
|
+
"class",
|
|
11
|
+
"classList",
|
|
12
|
+
"ref",
|
|
13
|
+
"tabIndex"
|
|
14
|
+
]);
|
|
15
|
+
return i(r, a(d, {
|
|
9
16
|
get component() {
|
|
10
|
-
return
|
|
17
|
+
return u.component ?? "div";
|
|
11
18
|
},
|
|
12
19
|
ref(e) {
|
|
13
|
-
var n = t((e) =>
|
|
20
|
+
var n = t((e) => c.setTrigger(e), u.ref, l);
|
|
14
21
|
typeof n == "function" && n(e);
|
|
15
22
|
},
|
|
16
23
|
"data-slot": "context-menu-trigger",
|
|
17
24
|
get "data-popup-open"() {
|
|
18
|
-
return
|
|
25
|
+
return c.open() ? "" : void 0;
|
|
19
26
|
},
|
|
20
27
|
get "data-pressed"() {
|
|
21
|
-
return
|
|
28
|
+
return c.open() ? "" : void 0;
|
|
22
29
|
},
|
|
23
30
|
get tabIndex() {
|
|
24
|
-
return
|
|
31
|
+
return u.tabIndex ?? 0;
|
|
25
32
|
},
|
|
26
33
|
get class() {
|
|
27
|
-
return e("select-none",
|
|
34
|
+
return e("select-none", u.class);
|
|
35
|
+
},
|
|
36
|
+
get classList() {
|
|
37
|
+
return u.classList;
|
|
28
38
|
}
|
|
29
39
|
}));
|
|
30
40
|
};
|
|
31
41
|
//#endregion
|
|
32
|
-
export {
|
|
42
|
+
export { s as ContextMenuTrigger };
|
|
33
43
|
|
|
34
44
|
//# sourceMappingURL=ContextMenuTrigger.js.map
|