@neut/ui 0.0.17 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion/Accordion/Accordion.js +3 -0
- package/dist/components/accordion/Accordion/Accordion.js.map +1 -1
- package/dist/components/accordion/AccordionContent/AccordionContent.js +27 -21
- package/dist/components/accordion/AccordionContent/AccordionContent.js.map +1 -1
- package/dist/components/accordion/AccordionItem/AccordionItem.js +3 -0
- package/dist/components/accordion/AccordionItem/AccordionItem.js.map +1 -1
- package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js +19 -18
- package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js.map +1 -1
- package/dist/components/alert/Alert/Alert.js +8 -3
- package/dist/components/alert/Alert/Alert.js.map +1 -1
- package/dist/components/alert/AlertAction/AlertAction.js +8 -3
- package/dist/components/alert/AlertAction/AlertAction.js.map +1 -1
- package/dist/components/alert/AlertDescription/AlertDescription.js +8 -3
- package/dist/components/alert/AlertDescription/AlertDescription.js.map +1 -1
- package/dist/components/alert/AlertTitle/AlertTitle.js +8 -3
- package/dist/components/alert/AlertTitle/AlertTitle.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialog/AlertDialog.d.ts +3 -1
- package/dist/components/alert-dialog/AlertDialog/AlertDialog.js +6 -1
- package/dist/components/alert-dialog/AlertDialog/AlertDialog.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js +9 -7
- package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.types.d.ts +9 -3
- package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js +8 -3
- package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js +8 -3
- package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js +8 -3
- package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js +8 -3
- package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js.map +1 -1
- package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js +8 -3
- package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js.map +1 -1
- package/dist/components/aspect-ratio/AspectRatio.js +3 -0
- package/dist/components/aspect-ratio/AspectRatio.js.map +1 -1
- package/dist/components/attachment/AttachmentTrigger/AttachmentTrigger.js +15 -7
- package/dist/components/attachment/AttachmentTrigger/AttachmentTrigger.js.map +1 -1
- package/dist/components/avatar/Avatar/Avatar.context.d.ts +7 -0
- package/dist/components/avatar/Avatar/Avatar.context.js +1 -1
- package/dist/components/avatar/Avatar/Avatar.context.js.map +1 -1
- package/dist/components/avatar/Avatar/Avatar.js +7 -2
- package/dist/components/avatar/Avatar/Avatar.js.map +1 -1
- package/dist/components/avatar/AvatarBadge/AvatarBadge.js +8 -3
- package/dist/components/avatar/AvatarBadge/AvatarBadge.js.map +1 -1
- package/dist/components/avatar/AvatarFallback/AvatarFallback.js +10 -5
- package/dist/components/avatar/AvatarFallback/AvatarFallback.js.map +1 -1
- package/dist/components/avatar/AvatarGroup/AvatarGroup.js +8 -3
- package/dist/components/avatar/AvatarGroup/AvatarGroup.js.map +1 -1
- package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js +8 -3
- package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js.map +1 -1
- package/dist/components/avatar/AvatarImage/AvatarImage.js +19 -12
- package/dist/components/avatar/AvatarImage/AvatarImage.js.map +1 -1
- package/dist/components/badge/Badge.js +9 -4
- package/dist/components/badge/Badge.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js +3 -0
- package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js.map +1 -1
- package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js +8 -3
- package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js.map +1 -1
- package/dist/components/bubble/BubbleContent/BubbleContent.js +21 -10
- package/dist/components/bubble/BubbleContent/BubbleContent.js.map +1 -1
- package/dist/components/button/Button.js +3 -0
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/button-group/ButtonGroup/ButtonGroup.js +3 -0
- package/dist/components/button-group/ButtonGroup/ButtonGroup.js.map +1 -1
- package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js +16 -7
- package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js.map +1 -1
- package/dist/components/calendar/Calendar/Calendar.d.ts +2 -3
- package/dist/components/calendar/Calendar/Calendar.js +89 -264
- package/dist/components/calendar/Calendar/Calendar.js.map +1 -1
- package/dist/components/calendar/Calendar/Calendar.options.d.ts +43 -0
- package/dist/components/calendar/Calendar/Calendar.options.js +38 -0
- package/dist/components/calendar/Calendar/Calendar.options.js.map +1 -0
- package/dist/components/calendar/Calendar/Calendar.selection.d.ts +16 -0
- package/dist/components/calendar/Calendar/Calendar.selection.js +50 -0
- package/dist/components/calendar/Calendar/Calendar.selection.js.map +1 -0
- package/dist/components/calendar/Calendar/Calendar.styles.d.ts +8 -0
- package/dist/components/calendar/Calendar/Calendar.styles.js +32 -0
- package/dist/components/calendar/Calendar/Calendar.styles.js.map +1 -0
- package/dist/components/calendar/Calendar/Calendar.utils.d.ts +3 -1
- package/dist/components/calendar/Calendar/Calendar.utils.js +4 -1
- package/dist/components/calendar/Calendar/Calendar.utils.js.map +1 -1
- package/dist/components/calendar/Calendar/CalendarDay.d.ts +28 -0
- package/dist/components/calendar/Calendar/CalendarDay.js +41 -0
- package/dist/components/calendar/Calendar/CalendarDay.js.map +1 -0
- package/dist/components/calendar/Calendar/CalendarMonth.d.ts +35 -0
- package/dist/components/calendar/Calendar/CalendarMonth.js +127 -0
- package/dist/components/calendar/Calendar/CalendarMonth.js.map +1 -0
- package/dist/components/calendar/Calendar/CalendarMonthCaption.d.ts +22 -0
- package/dist/components/calendar/Calendar/CalendarMonthCaption.js +103 -0
- package/dist/components/calendar/Calendar/CalendarMonthCaption.js.map +1 -0
- package/dist/components/calendar/index.js +3 -2
- package/dist/components/card/Card/Card.js +3 -0
- package/dist/components/card/Card/Card.js.map +1 -1
- package/dist/components/card/CardAction/CardAction.js +8 -3
- package/dist/components/card/CardAction/CardAction.js.map +1 -1
- package/dist/components/card/CardContent/CardContent.js +8 -3
- package/dist/components/card/CardContent/CardContent.js.map +1 -1
- package/dist/components/card/CardDescription/CardDescription.js +8 -3
- package/dist/components/card/CardDescription/CardDescription.js.map +1 -1
- package/dist/components/card/CardFooter/CardFooter.js +8 -3
- package/dist/components/card/CardFooter/CardFooter.js.map +1 -1
- package/dist/components/card/CardHeader/CardHeader.js +8 -3
- package/dist/components/card/CardHeader/CardHeader.js.map +1 -1
- package/dist/components/card/CardTitle/CardTitle.js +8 -3
- package/dist/components/card/CardTitle/CardTitle.js.map +1 -1
- package/dist/components/carousel/Carousel/Carousel.context.js +1 -1
- package/dist/components/carousel/Carousel/Carousel.context.js.map +1 -1
- package/dist/components/carousel/Carousel/Carousel.js +19 -12
- package/dist/components/carousel/Carousel/Carousel.js.map +1 -1
- package/dist/components/carousel/Carousel/useKeyboardNavigation.d.ts +11 -1
- package/dist/components/carousel/Carousel/useKeyboardNavigation.js +5 -4
- package/dist/components/carousel/Carousel/useKeyboardNavigation.js.map +1 -1
- package/dist/components/carousel/CarouselContent/CarouselContent.js +8 -3
- package/dist/components/carousel/CarouselContent/CarouselContent.js.map +1 -1
- package/dist/components/carousel/CarouselNext/CarouselNext.js +29 -16
- package/dist/components/carousel/CarouselNext/CarouselNext.js.map +1 -1
- package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js +29 -16
- package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js.map +1 -1
- package/dist/components/checkbox/Checkbox/Checkbox.js +32 -25
- package/dist/components/checkbox/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/collapsible/Collapsible/Collapsible.context.js +1 -1
- package/dist/components/collapsible/Collapsible/Collapsible.context.js.map +1 -1
- package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js +13 -12
- package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js.map +1 -1
- package/dist/components/combobox/Combobox/Combobox.js +52 -52
- package/dist/components/combobox/Combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/Combobox/Combobox.types.d.ts +15 -6
- package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js +7 -3
- package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js.map +1 -1
- package/dist/components/combobox/ComboboxClear/ComboboxClear.js +1 -1
- package/dist/components/combobox/ComboboxClear/ComboboxClear.js.map +1 -1
- package/dist/components/combobox/ComboboxInput/ComboboxInput.js +26 -10
- package/dist/components/combobox/ComboboxInput/ComboboxInput.js.map +1 -1
- package/dist/components/combobox/ComboboxItem/ComboboxItem.js +6 -5
- package/dist/components/combobox/ComboboxItem/ComboboxItem.js.map +1 -1
- package/dist/components/combobox/ComboboxList/ComboboxList.js +17 -11
- package/dist/components/combobox/ComboboxList/ComboboxList.js.map +1 -1
- package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js +8 -1
- package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js.map +1 -1
- package/dist/components/context-menu/ContextMenu/ContextMenu.js +10 -8
- package/dist/components/context-menu/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.d.ts +33 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.js +41 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.js.map +1 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.d.ts +25 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.js +20 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.js.map +1 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.d.ts +31 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.js +39 -0
- package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.js.map +1 -0
- package/dist/components/context-menu/ContextMenuContent/useContextMenuContent.js +70 -136
- package/dist/components/context-menu/ContextMenuContent/useContextMenuContent.js.map +1 -1
- package/dist/components/context-menu/ContextMenuSub/ContextMenuSub.js +2 -1
- package/dist/components/context-menu/ContextMenuSub/ContextMenuSub.js.map +1 -1
- package/dist/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.js +20 -10
- package/dist/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.js.map +1 -1
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.d.ts +24 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.js +26 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.js.map +1 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.d.ts +35 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.js +17 -0
- package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.js.map +1 -0
- package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.d.ts +9 -11
- package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.js +36 -33
- package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.js.map +1 -1
- package/dist/components/context-menu/context-menu.keyboard.d.ts +29 -0
- package/dist/components/context-menu/context-menu.keyboard.js +52 -0
- package/dist/components/context-menu/context-menu.keyboard.js.map +1 -0
- package/dist/components/context-menu/context-menu.typeahead.d.ts +27 -0
- package/dist/components/context-menu/context-menu.typeahead.js +19 -0
- package/dist/components/context-menu/context-menu.typeahead.js.map +1 -0
- package/dist/components/context-menu/context-menu.utils.d.ts +5 -2
- package/dist/components/context-menu/context-menu.utils.js +17 -39
- package/dist/components/context-menu/context-menu.utils.js.map +1 -1
- package/dist/components/date-picker/DatePicker/DatePicker.js +6 -0
- package/dist/components/date-picker/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/dialog/Dialog/Dialog.context.js +1 -1
- package/dist/components/dialog/Dialog/Dialog.context.js.map +1 -1
- package/dist/components/dialog/Dialog/Dialog.js +24 -15
- package/dist/components/dialog/Dialog/Dialog.js.map +1 -1
- package/dist/components/dialog/Dialog/Dialog.types.d.ts +5 -0
- package/dist/components/dialog/DialogClose/DialogClose.js +20 -19
- package/dist/components/dialog/DialogClose/DialogClose.js.map +1 -1
- package/dist/components/dialog/DialogContent/DialogContent.context.js +1 -1
- package/dist/components/dialog/DialogContent/DialogContent.context.js.map +1 -1
- package/dist/components/dialog/DialogDescription/DialogDescription.js +8 -3
- package/dist/components/dialog/DialogDescription/DialogDescription.js.map +1 -1
- package/dist/components/dialog/DialogFooter/DialogFooter.js +8 -3
- package/dist/components/dialog/DialogFooter/DialogFooter.js.map +1 -1
- package/dist/components/dialog/DialogHeader/DialogHeader.js +8 -3
- package/dist/components/dialog/DialogHeader/DialogHeader.js.map +1 -1
- package/dist/components/dialog/DialogOverlay/DialogOverlay.js +3 -0
- package/dist/components/dialog/DialogOverlay/DialogOverlay.js.map +1 -1
- package/dist/components/dialog/DialogSurface/DialogSurface.js +34 -26
- package/dist/components/dialog/DialogSurface/DialogSurface.js.map +1 -1
- package/dist/components/dialog/DialogTitle/DialogTitle.js +8 -3
- package/dist/components/dialog/DialogTitle/DialogTitle.js.map +1 -1
- package/dist/components/drawer/Drawer/Drawer.js +1 -1
- package/dist/components/drawer/Drawer/Drawer.js.map +1 -1
- package/dist/components/drawer/Drawer/create-change-event-details.js +4 -20
- package/dist/components/drawer/Drawer/create-change-event-details.js.map +1 -1
- package/dist/components/drawer/DrawerContent/drawer-swipe.utils.d.ts +32 -0
- package/dist/components/drawer/DrawerContent/drawer-swipe.utils.js +36 -0
- package/dist/components/drawer/DrawerContent/drawer-swipe.utils.js.map +1 -0
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.d.ts +3 -0
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.js +22 -42
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.js.map +1 -1
- package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js +1 -1
- package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuTrigger/DropdownMenuTrigger.js +7 -7
- package/dist/components/dropdown-menu/DropdownMenuTrigger/DropdownMenuTrigger.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.d.ts +7 -1
- package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.js +10 -10
- package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.js.map +1 -1
- package/dist/components/field/Field/Field.js +3 -0
- package/dist/components/field/Field/Field.js.map +1 -1
- package/dist/components/field/FieldContent/FieldContent.js +8 -3
- package/dist/components/field/FieldContent/FieldContent.js.map +1 -1
- package/dist/components/field/FieldDescription/FieldDescription.js +8 -3
- package/dist/components/field/FieldDescription/FieldDescription.js.map +1 -1
- package/dist/components/field/FieldError/FieldError.js +8 -3
- package/dist/components/field/FieldError/FieldError.js.map +1 -1
- package/dist/components/field/FieldGroup/FieldGroup.js +8 -3
- package/dist/components/field/FieldGroup/FieldGroup.js.map +1 -1
- package/dist/components/field/FieldLabel/FieldLabel.js +3 -0
- package/dist/components/field/FieldLabel/FieldLabel.js.map +1 -1
- package/dist/components/field/FieldLegend/FieldLegend.js +3 -0
- package/dist/components/field/FieldLegend/FieldLegend.js.map +1 -1
- package/dist/components/field/FieldSeparator/FieldSeparator.js +3 -0
- package/dist/components/field/FieldSeparator/FieldSeparator.js.map +1 -1
- package/dist/components/field/FieldSet/FieldSet.js +8 -3
- package/dist/components/field/FieldSet/FieldSet.js.map +1 -1
- package/dist/components/field/FieldTitle/FieldTitle.js +8 -3
- package/dist/components/field/FieldTitle/FieldTitle.js.map +1 -1
- package/dist/components/image/Image.utils.d.ts +14 -16
- package/dist/components/image/Image.utils.js +146 -190
- package/dist/components/image/Image.utils.js.map +1 -1
- package/dist/components/image/ImageElement.js +31 -27
- package/dist/components/image/ImageElement.js.map +1 -1
- package/dist/components/image/lib/blur.d.ts +31 -0
- package/dist/components/image/lib/blur.js +24 -0
- package/dist/components/image/lib/blur.js.map +1 -0
- package/dist/components/image/lib/dev-checks.d.ts +52 -0
- package/dist/components/image/lib/handle-loading.d.ts +13 -0
- package/dist/components/image/lib/handle-loading.js +20 -0
- package/dist/components/image/lib/handle-loading.js.map +1 -0
- package/dist/components/image/lib/loader.d.ts +39 -0
- package/dist/components/image/lib/loader.js +57 -0
- package/dist/components/image/lib/loader.js.map +1 -0
- package/dist/components/image/lib/static-import.d.ts +14 -0
- package/dist/components/image/lib/static-import.js +17 -0
- package/dist/components/image/lib/static-import.js.map +1 -0
- package/dist/components/input-group/InputGroup/InputGroup.js +8 -3
- package/dist/components/input-group/InputGroup/InputGroup.js.map +1 -1
- package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js +3 -0
- package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js.map +1 -1
- package/dist/components/input-group/InputGroupButton/InputGroupButton.js +3 -0
- package/dist/components/input-group/InputGroupButton/InputGroupButton.js.map +1 -1
- package/dist/components/input-group/InputGroupInput/InputGroupInput.js +3 -0
- package/dist/components/input-group/InputGroupInput/InputGroupInput.js.map +1 -1
- package/dist/components/input-group/InputGroupText/InputGroupText.js +8 -3
- package/dist/components/input-group/InputGroupText/InputGroupText.js.map +1 -1
- package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js +3 -0
- package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js.map +1 -1
- package/dist/components/item/Item/Item.js +9 -0
- package/dist/components/item/Item/Item.js.map +1 -1
- package/dist/components/item/ItemActions/ItemActions.js +8 -3
- package/dist/components/item/ItemActions/ItemActions.js.map +1 -1
- package/dist/components/item/ItemContent/ItemContent.js +8 -3
- package/dist/components/item/ItemContent/ItemContent.js.map +1 -1
- package/dist/components/item/ItemDescription/ItemDescription.js +8 -3
- package/dist/components/item/ItemDescription/ItemDescription.js.map +1 -1
- package/dist/components/item/ItemFooter/ItemFooter.js +8 -3
- package/dist/components/item/ItemFooter/ItemFooter.js.map +1 -1
- package/dist/components/item/ItemGroup/ItemGroup.js +8 -3
- package/dist/components/item/ItemGroup/ItemGroup.js.map +1 -1
- package/dist/components/item/ItemHeader/ItemHeader.js +8 -3
- package/dist/components/item/ItemHeader/ItemHeader.js.map +1 -1
- package/dist/components/item/ItemMedia/ItemMedia.js +3 -0
- package/dist/components/item/ItemMedia/ItemMedia.js.map +1 -1
- package/dist/components/item/ItemSeparator/ItemSeparator.js +3 -0
- package/dist/components/item/ItemSeparator/ItemSeparator.js.map +1 -1
- package/dist/components/item/ItemTitle/ItemTitle.js +8 -3
- package/dist/components/item/ItemTitle/ItemTitle.js.map +1 -1
- package/dist/components/kbd/Kbd.js +16 -6
- package/dist/components/kbd/Kbd.js.map +1 -1
- package/dist/components/label/Label.js +3 -0
- package/dist/components/label/Label.js.map +1 -1
- package/dist/components/marker/Marker/Marker.styles.d.ts +1 -1
- package/dist/components/message-scroller/message-scroller.anchoring.d.ts +60 -0
- package/dist/components/message-scroller/message-scroller.anchoring.js +139 -0
- package/dist/components/message-scroller/message-scroller.anchoring.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.anchors.d.ts +12 -0
- package/dist/components/message-scroller/message-scroller.anchors.js +23 -0
- package/dist/components/message-scroller/message-scroller.anchors.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.commands.d.ts +43 -0
- package/dist/components/message-scroller/message-scroller.commands.js +51 -0
- package/dist/components/message-scroller/message-scroller.commands.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.dom-measure.d.ts +29 -0
- package/dist/components/message-scroller/message-scroller.dom-measure.js +37 -0
- package/dist/components/message-scroller/message-scroller.dom-measure.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.measure.d.ts +27 -0
- package/dist/components/message-scroller/message-scroller.measure.js +21 -0
- package/dist/components/message-scroller/message-scroller.measure.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.scroll-state.d.ts +54 -0
- package/dist/components/message-scroller/message-scroller.scroll-state.js +74 -0
- package/dist/components/message-scroller/message-scroller.scroll-state.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.scroll-target.d.ts +27 -0
- package/dist/components/message-scroller/message-scroller.scroll-target.js +33 -0
- package/dist/components/message-scroller/message-scroller.scroll-target.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.utils.d.ts +7 -0
- package/dist/components/message-scroller/message-scroller.utils.js +3 -2
- package/dist/components/message-scroller/message-scroller.utils.js.map +1 -1
- package/dist/components/message-scroller/message-scroller.visibility.d.ts +43 -0
- package/dist/components/message-scroller/message-scroller.visibility.js +82 -0
- package/dist/components/message-scroller/message-scroller.visibility.js.map +1 -0
- package/dist/components/message-scroller/useMessageScrollerEngine.js +87 -337
- package/dist/components/message-scroller/useMessageScrollerEngine.js.map +1 -1
- package/dist/components/number-input/NumberInput/NumberInput.js +21 -19
- package/dist/components/number-input/NumberInput/NumberInput.js.map +1 -1
- package/dist/components/number-input/NumberInput/NumberInput.utils.d.ts +6 -2
- package/dist/components/number-input/NumberInput/NumberInput.utils.js +1 -3
- package/dist/components/number-input/NumberInput/NumberInput.utils.js.map +1 -1
- package/dist/components/number-input/NumberInput/create-change-event-details.d.ts +1 -2
- package/dist/components/number-input/NumberInput/create-change-event-details.js +4 -20
- package/dist/components/number-input/NumberInput/create-change-event-details.js.map +1 -1
- package/dist/components/pagination/Pagination/Pagination.js +8 -3
- package/dist/components/pagination/Pagination/Pagination.js.map +1 -1
- package/dist/components/pagination/PaginationContent/PaginationContent.js +8 -3
- package/dist/components/pagination/PaginationContent/PaginationContent.js.map +1 -1
- package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js +8 -3
- package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js.map +1 -1
- package/dist/components/pagination/PaginationLink/PaginationLink.js +3 -0
- package/dist/components/pagination/PaginationLink/PaginationLink.js.map +1 -1
- package/dist/components/pagination/PaginationNext/PaginationNext.js +3 -0
- package/dist/components/pagination/PaginationNext/PaginationNext.js.map +1 -1
- package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js +3 -0
- package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js.map +1 -1
- package/dist/components/popover/PopoverContent/PopoverContent.js +3 -0
- package/dist/components/popover/PopoverContent/PopoverContent.js.map +1 -1
- package/dist/components/progress/Progress/Progress.context.js +1 -1
- package/dist/components/progress/Progress/Progress.context.js.map +1 -1
- package/dist/components/progress/Progress/Progress.js +3 -0
- package/dist/components/progress/Progress/Progress.js.map +1 -1
- package/dist/components/progress/ProgressIndicator/ProgressIndicator.js +3 -0
- package/dist/components/progress/ProgressIndicator/ProgressIndicator.js.map +1 -1
- package/dist/components/progress/ProgressLabel/ProgressLabel.js +8 -3
- package/dist/components/progress/ProgressLabel/ProgressLabel.js.map +1 -1
- package/dist/components/progress/ProgressTrack/ProgressTrack.js +3 -0
- package/dist/components/progress/ProgressTrack/ProgressTrack.js.map +1 -1
- package/dist/components/progress/ProgressValue/ProgressValue.js +8 -3
- package/dist/components/progress/ProgressValue/ProgressValue.js.map +1 -1
- package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.d.ts +48 -0
- package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.js +23 -0
- package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js +62 -49
- package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js.map +1 -1
- package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js +4 -1
- package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js.map +1 -1
- package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js +1 -2
- package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js.map +1 -1
- package/dist/components/questionnaire/questionnaire.answers.d.ts +42 -0
- package/dist/components/questionnaire/questionnaire.answers.js +62 -0
- package/dist/components/questionnaire/questionnaire.answers.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.aria.d.ts +34 -0
- package/dist/components/questionnaire/questionnaire.aria.js +28 -0
- package/dist/components/questionnaire/questionnaire.aria.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.dom-watch.d.ts +9 -0
- package/dist/components/questionnaire/questionnaire.dom-watch.js +18 -0
- package/dist/components/questionnaire/questionnaire.dom-watch.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.focus.d.ts +26 -0
- package/dist/components/questionnaire/questionnaire.focus.js +19 -0
- package/dist/components/questionnaire/questionnaire.focus.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.item-view.d.ts +50 -0
- package/dist/components/questionnaire/questionnaire.item-view.js +36 -0
- package/dist/components/questionnaire/questionnaire.item-view.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.keys.d.ts +29 -0
- package/dist/components/questionnaire/questionnaire.keys.js +34 -0
- package/dist/components/questionnaire/questionnaire.keys.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.registry.d.ts +21 -0
- package/dist/components/questionnaire/questionnaire.registry.js +15 -0
- package/dist/components/questionnaire/questionnaire.registry.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.shortcuts.d.ts +24 -0
- package/dist/components/questionnaire/questionnaire.shortcuts.js +31 -0
- package/dist/components/questionnaire/questionnaire.shortcuts.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.utils.d.ts +17 -1
- package/dist/components/questionnaire/questionnaire.utils.js +5 -2
- package/dist/components/questionnaire/questionnaire.utils.js.map +1 -1
- package/dist/components/questionnaire/questionnaire.validation.d.ts +43 -0
- package/dist/components/questionnaire/questionnaire.validation.js +17 -0
- package/dist/components/questionnaire/questionnaire.validation.js.map +1 -0
- package/dist/components/questionnaire/useQuestionnaireItem.d.ts +0 -2
- package/dist/components/questionnaire/useQuestionnaireItem.js +83 -121
- package/dist/components/questionnaire/useQuestionnaireItem.js.map +1 -1
- package/dist/components/questionnaire/useQuestionnaireRoot.js +78 -99
- package/dist/components/questionnaire/useQuestionnaireRoot.js.map +1 -1
- package/dist/components/radio-group/RadioGroup/RadioGroup.js +3 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js +3 -0
- package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js.map +1 -1
- package/dist/components/resizable/ResizableHandle/resizable.handle-drag.d.ts +37 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-drag.js +37 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-drag.js.map +1 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-keys.d.ts +24 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-keys.js +36 -0
- package/dist/components/resizable/ResizableHandle/resizable.handle-keys.js.map +1 -0
- package/dist/components/resizable/ResizableHandle/useResizableHandle.d.ts +3 -4
- package/dist/components/resizable/ResizableHandle/useResizableHandle.js +30 -63
- package/dist/components/resizable/ResizableHandle/useResizableHandle.js.map +1 -1
- package/dist/components/resizable/ResizablePanel/ResizablePanel.d.ts +4 -2
- package/dist/components/resizable/ResizablePanel/ResizablePanel.js +23 -50
- package/dist/components/resizable/ResizablePanel/ResizablePanel.js.map +1 -1
- package/dist/components/resizable/ResizablePanel/useResizablePanel.d.ts +30 -0
- package/dist/components/resizable/ResizablePanel/useResizablePanel.js +37 -0
- package/dist/components/resizable/ResizablePanel/useResizablePanel.js.map +1 -0
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.d.ts +4 -1
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js +10 -17
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js.map +1 -1
- package/dist/components/resizable/ResizablePanelGroup/useDragCursor.d.ts +11 -0
- package/dist/components/resizable/ResizablePanelGroup/useDragCursor.js +17 -0
- package/dist/components/resizable/ResizablePanelGroup/useDragCursor.js.map +1 -0
- package/dist/components/resizable/resizable.collapse.d.ts +27 -0
- package/dist/components/resizable/resizable.collapse.js +24 -0
- package/dist/components/resizable/resizable.collapse.js.map +1 -0
- package/dist/components/resizable/resizable.commands.d.ts +32 -0
- package/dist/components/resizable/resizable.commands.js +40 -0
- package/dist/components/resizable/resizable.commands.js.map +1 -0
- package/dist/components/resizable/resizable.constraints.d.ts +23 -0
- package/dist/components/resizable/resizable.constraints.js +32 -0
- package/dist/components/resizable/resizable.constraints.js.map +1 -0
- package/dist/components/resizable/resizable.lifecycle.d.ts +35 -0
- package/dist/components/resizable/resizable.lifecycle.js +32 -0
- package/dist/components/resizable/resizable.lifecycle.js.map +1 -0
- package/dist/components/resizable/resizable.registry.d.ts +31 -0
- package/dist/components/resizable/resizable.registry.js +38 -0
- package/dist/components/resizable/resizable.registry.js.map +1 -0
- package/dist/components/resizable/resizable.reporting.d.ts +36 -0
- package/dist/components/resizable/resizable.reporting.js +33 -0
- package/dist/components/resizable/resizable.reporting.js.map +1 -0
- package/dist/components/resizable/resizable.resize.d.ts +47 -0
- package/dist/components/resizable/resizable.resize.js +28 -0
- package/dist/components/resizable/resizable.resize.js.map +1 -0
- package/dist/components/resizable/resizable.sizes.d.ts +31 -0
- package/dist/components/resizable/resizable.sizes.js +46 -0
- package/dist/components/resizable/resizable.sizes.js.map +1 -0
- package/dist/components/resizable/resizable.storage.d.ts +17 -0
- package/dist/components/resizable/resizable.storage.js +29 -0
- package/dist/components/resizable/resizable.storage.js.map +1 -0
- package/dist/components/resizable/resizable.utils.d.ts +10 -3
- package/dist/components/resizable/resizable.utils.js +16 -10
- package/dist/components/resizable/resizable.utils.js.map +1 -1
- package/dist/components/resizable/useResizablePanelGroup.js +62 -164
- package/dist/components/resizable/useResizablePanelGroup.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js +1 -1
- package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea/ScrollArea.d.ts +9 -0
- package/dist/components/scroll-area/ScrollArea/ScrollArea.js +28 -39
- package/dist/components/scroll-area/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js +3 -3
- package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.d.ts +22 -0
- package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.js +34 -0
- package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.js.map +1 -0
- package/dist/components/scroll-area/ScrollBar/ScrollBar.d.ts +8 -0
- package/dist/components/scroll-area/ScrollBar/ScrollBar.js +38 -71
- package/dist/components/scroll-area/ScrollBar/ScrollBar.js.map +1 -1
- package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.d.ts +56 -0
- package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.js +61 -0
- package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.js.map +1 -0
- package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.d.ts +25 -0
- package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.js +26 -0
- package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.js.map +1 -0
- package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.d.ts +19 -0
- package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.js +37 -0
- package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.js.map +1 -0
- package/dist/components/scroll-arrows/ScrollArrowButton.d.ts +5 -7
- package/dist/components/scroll-arrows/ScrollArrowButton.js +14 -44
- package/dist/components/scroll-arrows/ScrollArrowButton.js.map +1 -1
- package/dist/components/scroll-arrows/ScrollArrows.d.ts +4 -3
- package/dist/components/scroll-arrows/ScrollArrows.js +16 -22
- package/dist/components/scroll-arrows/ScrollArrows.js.map +1 -1
- package/dist/components/scroll-arrows/ScrollArrows.types.d.ts +7 -7
- package/dist/components/scroll-arrows/useHoverScroll.d.ts +29 -0
- package/dist/components/scroll-arrows/useHoverScroll.js +39 -0
- package/dist/components/scroll-arrows/useHoverScroll.js.map +1 -0
- package/dist/components/select/SelectContent/useSelectContent.js +3 -3
- package/dist/components/select/SelectGroup/SelectGroup.d.ts +8 -2
- package/dist/components/select/SelectGroup/SelectGroup.js +20 -6
- package/dist/components/select/SelectGroup/SelectGroup.js.map +1 -1
- package/dist/components/select/SelectGroup/SelectGroup.types.d.ts +9 -0
- package/dist/components/select/SelectGroup/index.d.ts +1 -0
- package/dist/components/select/SelectTrigger/SelectTrigger.js.map +1 -1
- package/dist/components/select/SelectTrigger/useSelectTrigger.js +1 -1
- package/dist/components/select/SelectTrigger/useSelectTrigger.js.map +1 -1
- package/dist/components/separator/Separator.js +3 -0
- package/dist/components/separator/Separator.js.map +1 -1
- package/dist/components/sheet/SheetClose/SheetClose.js +18 -17
- package/dist/components/sheet/SheetClose/SheetClose.js.map +1 -1
- package/dist/components/sidebar/Sidebar/Sidebar.js +14 -6
- package/dist/components/sidebar/Sidebar/Sidebar.js.map +1 -1
- package/dist/components/sidebar/SidebarContent/SidebarContent.js +8 -3
- package/dist/components/sidebar/SidebarContent/SidebarContent.js.map +1 -1
- package/dist/components/sidebar/SidebarFooter/SidebarFooter.js +8 -3
- package/dist/components/sidebar/SidebarFooter/SidebarFooter.js.map +1 -1
- package/dist/components/sidebar/SidebarGroup/SidebarGroup.js +8 -3
- package/dist/components/sidebar/SidebarGroup/SidebarGroup.js.map +1 -1
- package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js +3 -0
- package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js.map +1 -1
- package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js +8 -3
- package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js.map +1 -1
- package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js +3 -0
- package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js.map +1 -1
- package/dist/components/sidebar/SidebarHeader/SidebarHeader.js +8 -3
- package/dist/components/sidebar/SidebarHeader/SidebarHeader.js.map +1 -1
- package/dist/components/sidebar/SidebarInput/SidebarInput.js +3 -0
- package/dist/components/sidebar/SidebarInput/SidebarInput.js.map +1 -1
- package/dist/components/sidebar/SidebarInset/SidebarInset.js +8 -3
- package/dist/components/sidebar/SidebarInset/SidebarInset.js.map +1 -1
- package/dist/components/sidebar/SidebarMenu/SidebarMenu.js +8 -3
- package/dist/components/sidebar/SidebarMenu/SidebarMenu.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js +8 -3
- package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js +6 -0
- package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js +8 -3
- package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js +8 -3
- package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js +8 -3
- package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js +3 -0
- package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js.map +1 -1
- package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js +8 -3
- package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js.map +1 -1
- package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js +1 -1
- package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js.map +1 -1
- package/dist/components/sidebar/SidebarProvider/SidebarProvider.js +30 -27
- package/dist/components/sidebar/SidebarProvider/SidebarProvider.js.map +1 -1
- package/dist/components/sidebar/SidebarProvider/useIsMobile.d.ts +10 -0
- package/dist/components/sidebar/SidebarProvider/useIsMobile.js +14 -0
- package/dist/components/sidebar/SidebarProvider/useIsMobile.js.map +1 -0
- package/dist/components/sidebar/SidebarRail/SidebarRail.js +8 -3
- package/dist/components/sidebar/SidebarRail/SidebarRail.js.map +1 -1
- package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js +3 -0
- package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js.map +1 -1
- package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js +3 -0
- package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js.map +1 -1
- package/dist/components/skeleton/Skeleton.js +8 -3
- package/dist/components/skeleton/Skeleton.js.map +1 -1
- package/dist/components/slider/Slider/Slider.context.js +1 -1
- package/dist/components/slider/Slider/Slider.context.js.map +1 -1
- package/dist/components/slider/Slider/Slider.js +3 -0
- package/dist/components/slider/Slider/Slider.js.map +1 -1
- package/dist/components/slider/SliderControl/SliderControl.js +4 -1
- package/dist/components/slider/SliderControl/SliderControl.js.map +1 -1
- package/dist/components/slider/SliderIndicator/SliderIndicator.js +3 -0
- package/dist/components/slider/SliderIndicator/SliderIndicator.js.map +1 -1
- package/dist/components/slider/SliderThumb/SliderThumb.js +18 -3
- package/dist/components/slider/SliderThumb/SliderThumb.js.map +1 -1
- package/dist/components/slider/SliderThumb/useSliderThumb.d.ts +1 -0
- package/dist/components/slider/SliderThumb/useSliderThumb.js +3 -2
- package/dist/components/slider/SliderThumb/useSliderThumb.js.map +1 -1
- package/dist/components/slider/SliderTrack/SliderTrack.js +3 -0
- package/dist/components/slider/SliderTrack/SliderTrack.js.map +1 -1
- package/dist/components/spinner/Spinner.js +3 -0
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/switch/Switch.js +7 -0
- package/dist/components/switch/Switch.js.map +1 -1
- package/dist/components/tabs/Tabs/Tabs.context.js +1 -1
- package/dist/components/tabs/Tabs/Tabs.context.js.map +1 -1
- package/dist/components/tabs/Tabs/useTabsKeyboard.d.ts +7 -11
- package/dist/components/tabs/Tabs/useTabsKeyboard.js +8 -42
- package/dist/components/tabs/Tabs/useTabsKeyboard.js.map +1 -1
- package/dist/components/tabs/TabsList/TabsList.context.js +1 -1
- package/dist/components/tabs/TabsList/TabsList.context.js.map +1 -1
- package/dist/components/tabs/TabsList/TabsList.js +10 -10
- package/dist/components/tabs/TabsList/TabsList.js.map +1 -1
- package/dist/components/tabs/TabsTrigger/TabsTrigger.js +8 -8
- package/dist/components/tabs/TabsTrigger/TabsTrigger.js.map +1 -1
- package/dist/components/textarea/Textarea.js +8 -3
- package/dist/components/textarea/Textarea.js.map +1 -1
- package/dist/components/time-picker/TimePicker/create-change-event-details.d.ts +1 -2
- package/dist/components/time-picker/TimePicker/create-change-event-details.js +4 -20
- package/dist/components/time-picker/TimePicker/create-change-event-details.js.map +1 -1
- package/dist/components/time-picker/TimePickerColumn/TimePickerColumn.js +1 -3
- package/dist/components/time-picker/TimePickerColumn/TimePickerColumn.js.map +1 -1
- package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.d.ts +34 -0
- package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.js +43 -0
- package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.js.map +1 -0
- package/dist/components/time-picker/TimePickerColumn/useTimePickerColumn.js +34 -59
- package/dist/components/time-picker/TimePickerColumn/useTimePickerColumn.js.map +1 -1
- package/dist/components/toast/Toast/Toast.d.ts +8 -2
- package/dist/components/toast/Toast/Toast.js +92 -146
- package/dist/components/toast/Toast/Toast.js.map +1 -1
- package/dist/components/toast/Toast/Toast.types.d.ts +1 -1
- package/dist/components/toast/Toast/Toast.types.js.map +1 -1
- package/dist/components/toast/Toast/Toast.utils.d.ts +47 -0
- package/dist/components/toast/Toast/Toast.utils.js +47 -0
- package/dist/components/toast/Toast/Toast.utils.js.map +1 -0
- package/dist/components/toast/Toast/ToastActionButton.d.ts +16 -0
- package/dist/components/toast/Toast/ToastActionButton.js +27 -0
- package/dist/components/toast/Toast/ToastActionButton.js.map +1 -0
- package/dist/components/toast/Toast/ToastActions.d.ts +12 -0
- package/dist/components/toast/Toast/ToastActions.js +65 -0
- package/dist/components/toast/Toast/ToastActions.js.map +1 -0
- package/dist/components/toast/Toast/ToastCloseButton.d.ts +12 -0
- package/dist/components/toast/Toast/ToastCloseButton.js +26 -0
- package/dist/components/toast/Toast/ToastCloseButton.js.map +1 -0
- package/dist/components/toast/Toast/ToastContent.d.ts +8 -0
- package/dist/components/toast/Toast/ToastContent.js +30 -0
- package/dist/components/toast/Toast/ToastContent.js.map +1 -0
- package/dist/components/toast/Toast/ToastIcon.d.ts +14 -0
- package/dist/components/toast/Toast/ToastIcon.js +36 -0
- package/dist/components/toast/Toast/ToastIcon.js.map +1 -0
- package/dist/components/toast/Toast/useToastLifecycle.d.ts +29 -0
- package/dist/components/toast/Toast/useToastLifecycle.js +30 -0
- package/dist/components/toast/Toast/useToastLifecycle.js.map +1 -0
- package/dist/components/toast/Toaster/ToastViewport.d.ts +33 -0
- package/dist/components/toast/Toaster/ToastViewport.js +73 -0
- package/dist/components/toast/Toaster/ToastViewport.js.map +1 -0
- package/dist/components/toast/Toaster/Toaster.d.ts +4 -0
- package/dist/components/toast/Toaster/Toaster.js +64 -82
- package/dist/components/toast/Toaster/Toaster.js.map +1 -1
- package/dist/components/toast/Toaster/Toaster.utils.d.ts +15 -0
- package/dist/components/toast/Toaster/Toaster.utils.js +4 -1
- package/dist/components/toast/Toaster/Toaster.utils.js.map +1 -1
- package/dist/components/toast/Toaster/useToaster.d.ts +28 -0
- package/dist/components/toast/Toaster/useToaster.js +26 -0
- package/dist/components/toast/Toaster/useToaster.js.map +1 -0
- package/dist/components/toast/index.js +4 -3
- package/dist/components/toast/state/promise-toast.d.ts +17 -0
- package/dist/components/toast/state/promise-toast.js +33 -0
- package/dist/components/toast/state/promise-toast.js.map +1 -0
- package/dist/components/toast/state/store.d.ts +21 -0
- package/dist/components/toast/state/store.js +45 -0
- package/dist/components/toast/state/store.js.map +1 -0
- package/dist/components/toast/state/toast.d.ts +9 -10
- package/dist/components/toast/state/toast.js +30 -89
- package/dist/components/toast/state/toast.js.map +1 -1
- package/dist/components/toggle/Toggle/Toggle.js +2 -1
- package/dist/components/toggle/Toggle/Toggle.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +1 -1
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.d.ts +6 -2
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js +4 -20
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.d.ts +7 -10
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js +10 -40
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js +5 -5
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js.map +1 -1
- package/dist/components/tooltip/TooltipContent/usePresence.d.ts +27 -0
- package/dist/components/tooltip/TooltipContent/usePresence.js +24 -0
- package/dist/components/tooltip/TooltipContent/usePresence.js.map +1 -0
- package/dist/components/tooltip/TooltipContent/useTooltipContent.js +22 -35
- package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
- package/dist/hooks/useFontLoader.js +1 -1
- package/dist/hooks/useFontLoader.js.map +1 -1
- package/dist/hooks/useScrollLock.js +13 -16
- package/dist/hooks/useScrollLock.js.map +1 -1
- package/dist/index.js +328 -320
- package/dist/lib/positioner/index.d.ts +1 -0
- package/dist/lib/positioner/utils/dom.d.ts +8 -0
- package/dist/lib/positioner/utils/dom.js +1 -1
- package/dist/lib/positioner/utils/dom.js.map +1 -1
- package/dist/types/props.types.d.ts +1 -1
- package/dist/ui.css +1 -1
- package/dist/utils/call-event-handler.d.ts +16 -0
- package/dist/utils/call-event-handler.js +15 -0
- package/dist/utils/call-event-handler.js.map +1 -0
- package/dist/utils/clsx.d.ts +1 -1
- package/dist/utils/clsx.js +2 -7
- package/dist/utils/create-change-event-details.d.ts +25 -0
- package/dist/utils/create-change-event-details.js +25 -0
- package/dist/utils/create-change-event-details.js.map +1 -0
- package/dist/utils/get-style.d.ts +7 -9
- package/dist/utils/get-style.js +16 -0
- package/dist/utils/get-style.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.js +7 -1
- package/dist/utils/number.d.ts +7 -0
- package/dist/utils/number.js +8 -0
- package/dist/utils/number.js.map +1 -0
- package/dist/utils/roving-navigation.d.ts +64 -0
- package/dist/utils/roving-navigation.js +66 -0
- package/dist/utils/roving-navigation.js.map +1 -0
- package/dist/utils/string.d.ts +17 -0
- package/dist/utils/string.js +11 -0
- package/dist/utils/string.js.map +1 -0
- package/package.json +18 -7
- package/dist/components/carousel/Carousel/Carousel.utils.d.ts +0 -0
- package/dist/components/field/FieldError/useFieldError.d.ts +0 -0
- package/dist/components/hover-card/hover-card.utils.d.ts +0 -6
- package/dist/components/tabs/Tabs/call-event-handler.d.ts +0 -5
- package/dist/components/tabs/Tabs/call-event-handler.js +0 -9
- package/dist/components/tabs/Tabs/call-event-handler.js.map +0 -1
- package/dist/components/toggle-group/call-event-handler.d.ts +0 -5
- package/dist/components/toggle-group/call-event-handler.js +0 -9
- package/dist/components/toggle-group/call-event-handler.js.map +0 -1
- package/dist/utils/clsx.js.map +0 -1
|
@@ -1,141 +1,103 @@
|
|
|
1
1
|
import { useQuestionnaireRootContext as e } from "./questionnaire.context.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { buildDescribedBy as t, buildItemKeyshortcuts as n, createIdRegistry as r } from "./questionnaire.aria.js";
|
|
3
|
+
import { createAnswerBookkeeping as i } from "./questionnaire.answers.js";
|
|
4
|
+
import { focusItem as a, moveAnswerFocus as o } from "./questionnaire.focus.js";
|
|
5
|
+
import { buildShortcutByAnswerId as s, buildShortcutByChoiceValue as c, findAnswerByShortcut as l } from "./questionnaire.shortcuts.js";
|
|
6
|
+
import { findNativeInvalidAnswer as u, isItemSatisfied as d, resolveItemInvalid as f } from "./questionnaire.validation.js";
|
|
7
|
+
import { createMemo as p, createSignal as m } from "solid-js";
|
|
4
8
|
//#region src/components/questionnaire/useQuestionnaireItem.ts
|
|
5
|
-
function
|
|
6
|
-
let
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
let e = p();
|
|
25
|
-
return d().some((t) => e.includes(t.id) && !P(t)) ? "answered" : "unanswered";
|
|
26
|
-
}), L = a(() => I() === "skipped" && !s.required()), R = a(() => I() === "answered"), z = a(() => !s.disabled() && !L() && (s.invalid() || y() && !(L() || !s.invalid() && R()))), B = () => {
|
|
27
|
-
let e = l();
|
|
28
|
-
if (!e) return;
|
|
29
|
-
let t = e.querySelector("input[data-filled][name]:not(:disabled)"), n = e.querySelector("input:not([type=hidden]):not(:disabled), textarea:not(:disabled)");
|
|
30
|
-
(t ?? n ?? e).focus();
|
|
31
|
-
}, V = () => {
|
|
32
|
-
if (b(!0), !(s.disabled() || I() === "skipped" && !s.required() || !s.invalid() && I() === "answered")) return !1;
|
|
33
|
-
if (!c.nativeValidation()) return !0;
|
|
34
|
-
let e = d().find((e) => t(e) && e.element.willValidate && !e.element.validity.valid);
|
|
9
|
+
function h(h) {
|
|
10
|
+
let g = e("QuestionnaireItem"), [_, v] = m(), y = i({
|
|
11
|
+
multiple: h.multiple,
|
|
12
|
+
required: h.required
|
|
13
|
+
}), { answers: b, selections: x, touched: S, resetVersion: C, status: w, skippable: T, answeredOk: E, hasInputAnswer: D, registerAnswerControl: O, registerAnswerSelection: k, setAnswerDefault: A, setAnswerSelectionFromInteraction: j, syncControlledAnswerSelection: M, getAnswerByElement: N } = y, P = r(), F = r(), I = p(() => g.activeItemName() === h.name), L = p(() => f({
|
|
14
|
+
disabled: h.disabled(),
|
|
15
|
+
invalid: h.invalid(),
|
|
16
|
+
skippable: T(),
|
|
17
|
+
touched: S(),
|
|
18
|
+
answeredOk: E()
|
|
19
|
+
})), R = () => a(_()), z = () => {
|
|
20
|
+
if (y.markTouched(), !d({
|
|
21
|
+
disabled: h.disabled(),
|
|
22
|
+
status: w(),
|
|
23
|
+
required: h.required(),
|
|
24
|
+
invalid: h.invalid()
|
|
25
|
+
})) return !1;
|
|
26
|
+
if (!g.nativeValidation()) return !0;
|
|
27
|
+
let e = u(b());
|
|
35
28
|
return !e || (e.element.focus(), e.element.reportValidity(), !1);
|
|
36
|
-
}, H = () => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
})
|
|
52
|
-
if (G()) return /* @__PURE__ */ new Map();
|
|
53
|
-
let e = i(c.shortcuts()), t = d().filter((e) => e.type === "choice");
|
|
54
|
-
return new Map(t.slice(0, e.length).map((t, n) => [t.id, e[n]]));
|
|
55
|
-
}), q = (e) => {
|
|
56
|
-
let t = G();
|
|
57
|
-
if (t) {
|
|
58
|
-
let n = [...t.entries()].find(([, t]) => t === e)?.[0];
|
|
59
|
-
return d().find((e) => e.type === "choice" && e.value === n) ?? null;
|
|
60
|
-
}
|
|
61
|
-
let n = [...K().entries()].find(([, t]) => t === e)?.[0];
|
|
62
|
-
return d().find((e) => e.id === n) ?? null;
|
|
63
|
-
}, J = (e, t) => {
|
|
64
|
-
let i = l(), a = d().filter((t) => !P(t) && t.element.isConnected && !(r(e) && t.type === "input"));
|
|
65
|
-
if (!a.length) return !1;
|
|
66
|
-
let o = a.findIndex((t) => t.element === e);
|
|
67
|
-
if (o < 0 && e !== i) return !1;
|
|
68
|
-
let s = a[o < 0 ? t === "next" ? 0 : a.length - 1 : (o + (t === "next" ? 1 : -1) + a.length) % a.length];
|
|
69
|
-
return !s || s.element === e ? !1 : (s.element.focus(), s.type === "choice" && n(s.element) && s.element.click(), !0);
|
|
70
|
-
}, Y = () => {
|
|
71
|
-
let e = [...C(), ...z() ? T() : []];
|
|
72
|
-
return [...new Set(e)].join(" ") || void 0;
|
|
73
|
-
}, X = () => {
|
|
74
|
-
if (!D()) return;
|
|
75
|
-
let e = c.state();
|
|
76
|
-
return [
|
|
77
|
-
"Meta+Enter Control+Enter",
|
|
78
|
-
d().length ? "ArrowUp ArrowDown" : null,
|
|
79
|
-
e.first ? null : "ArrowLeft",
|
|
80
|
-
!e.last && I() !== "unanswered" ? "ArrowRight" : null
|
|
81
|
-
].filter(Boolean).join(" ") || void 0;
|
|
82
|
-
};
|
|
29
|
+
}, B = p(() => c(g.itemDefinitions()?.get(h.name), g.shortcuts())), V = p(() => s(b(), B() !== null, g.shortcuts())), H = (e) => l(e, {
|
|
30
|
+
byChoiceValue: B(),
|
|
31
|
+
byAnswerId: V(),
|
|
32
|
+
answers: b()
|
|
33
|
+
}), U = (e, t) => o({
|
|
34
|
+
scope: _(),
|
|
35
|
+
target: e,
|
|
36
|
+
direction: t,
|
|
37
|
+
answers: b()
|
|
38
|
+
}), W = () => t(P.ids(), F.ids(), L()), G = () => n({
|
|
39
|
+
active: I(),
|
|
40
|
+
hasAnswers: b().length > 0,
|
|
41
|
+
first: g.state().first,
|
|
42
|
+
last: g.state().last,
|
|
43
|
+
status: w()
|
|
44
|
+
});
|
|
83
45
|
return {
|
|
84
46
|
context: {
|
|
85
|
-
name:
|
|
86
|
-
active:
|
|
87
|
-
disabled:
|
|
88
|
-
invalid:
|
|
89
|
-
multiple:
|
|
90
|
-
required:
|
|
91
|
-
status:
|
|
92
|
-
hasInputAnswer:
|
|
93
|
-
selectedAnswerIds:
|
|
94
|
-
resetVersion:
|
|
95
|
-
shortcutByAnswerId:
|
|
96
|
-
shortcutByChoiceValue:
|
|
97
|
-
shortcuts:
|
|
47
|
+
name: h.name,
|
|
48
|
+
active: I,
|
|
49
|
+
disabled: h.disabled,
|
|
50
|
+
invalid: L,
|
|
51
|
+
multiple: h.multiple,
|
|
52
|
+
required: h.required,
|
|
53
|
+
status: w,
|
|
54
|
+
hasInputAnswer: D,
|
|
55
|
+
selectedAnswerIds: x,
|
|
56
|
+
resetVersion: C,
|
|
57
|
+
shortcutByAnswerId: V,
|
|
58
|
+
shortcutByChoiceValue: B,
|
|
59
|
+
shortcuts: g.shortcuts,
|
|
98
60
|
registerAnswerControl: O,
|
|
99
|
-
registerAnswerSelection:
|
|
100
|
-
registerDescription:
|
|
101
|
-
registerError:
|
|
102
|
-
setAnswerDefault:
|
|
103
|
-
setAnswerSelectionFromInteraction:
|
|
104
|
-
syncControlledAnswerSelection:
|
|
61
|
+
registerAnswerSelection: k,
|
|
62
|
+
registerDescription: P.register,
|
|
63
|
+
registerError: F.register,
|
|
64
|
+
setAnswerDefault: A,
|
|
65
|
+
setAnswerSelectionFromInteraction: j,
|
|
66
|
+
syncControlledAnswerSelection: M
|
|
105
67
|
},
|
|
106
68
|
itemProps: () => ({
|
|
107
|
-
"aria-describedby":
|
|
108
|
-
"aria-invalid":
|
|
109
|
-
"aria-keyshortcuts":
|
|
110
|
-
disabled:
|
|
111
|
-
hidden: !
|
|
112
|
-
inert: !
|
|
69
|
+
"aria-describedby": W(),
|
|
70
|
+
"aria-invalid": L() || void 0,
|
|
71
|
+
"aria-keyshortcuts": G(),
|
|
72
|
+
disabled: h.disabled(),
|
|
73
|
+
hidden: !I(),
|
|
74
|
+
inert: !I(),
|
|
113
75
|
tabIndex: -1
|
|
114
76
|
}),
|
|
115
77
|
registerElement: (e) => {
|
|
116
|
-
|
|
78
|
+
v(e);
|
|
117
79
|
let t = {
|
|
118
|
-
name:
|
|
80
|
+
name: h.name,
|
|
119
81
|
element: e,
|
|
120
|
-
disabled:
|
|
121
|
-
required:
|
|
122
|
-
status:
|
|
123
|
-
validate:
|
|
124
|
-
focus:
|
|
125
|
-
focusInvalid:
|
|
126
|
-
skip:
|
|
127
|
-
reset:
|
|
128
|
-
getAnswerByElement:
|
|
129
|
-
getAnswerByShortcut:
|
|
130
|
-
moveAnswerFocus:
|
|
82
|
+
disabled: h.disabled,
|
|
83
|
+
required: h.required,
|
|
84
|
+
status: w,
|
|
85
|
+
validate: z,
|
|
86
|
+
focus: R,
|
|
87
|
+
focusInvalid: R,
|
|
88
|
+
skip: y.skip,
|
|
89
|
+
reset: y.reset,
|
|
90
|
+
getAnswerByElement: N,
|
|
91
|
+
getAnswerByShortcut: H,
|
|
92
|
+
moveAnswerFocus: U
|
|
131
93
|
};
|
|
132
|
-
return
|
|
94
|
+
return g.registerItem(t);
|
|
133
95
|
},
|
|
134
|
-
describedBy:
|
|
135
|
-
keyshortcuts:
|
|
96
|
+
describedBy: W,
|
|
97
|
+
keyshortcuts: G
|
|
136
98
|
};
|
|
137
99
|
}
|
|
138
100
|
//#endregion
|
|
139
|
-
export {
|
|
101
|
+
export { h as useQuestionnaireItem };
|
|
140
102
|
|
|
141
103
|
//# sourceMappingURL=useQuestionnaireItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuestionnaireItem.js","names":["useQuestionnaireItem","root","useQuestionnaireRootContext","element","setElement","createSignal","answers","setAnswers","selections","setSelections","defaults","setDefaults","skipped","setSkipped","touched","setTouched","resetVersion","setResetVersion","descriptionIds","setDescriptionIds","errorIds","setErrorIds","active","createMemo","options","registerAnswerControl","prev","item","entry","applySelection","selected","id","value","registerAnswerSelection","initialSelected","setAnswerDefault","setAnswerSelectionFromInteraction","syncControlledAnswerSelection","isEntryDisabled","hasInputAnswer","status","skippable","answeredOk","invalid","focus","target","filled","anyInput","validate","answer","isAnswerFilled","skip","reset","getAnswerByElement","shortcutByChoiceValue","mode","definition","alphabet","shortcutAlphabet","map","cursor","choice","letter","shortcutByAnswerId","choices","index","getAnswerByShortcut","byValue","shortcut","moveAnswerFocus","scope","focusable","isTypingElement","position","next","direction","isNativeRadio","describedBy","ids","keyshortcuts","state","handle"],"sources":["../../../src/components/questionnaire/useQuestionnaireItem.ts"],"sourcesContent":["import { createMemo, createSignal, type Accessor } from \"solid-js\";\nimport {\n useQuestionnaireRootContext,\n type QuestionnaireAnswerEntry,\n type QuestionnaireItemContextValue,\n type QuestionnaireItemHandle,\n} from \"./questionnaire.context\";\nimport type { QuestionnaireItemStatus } from \"./questionnaire.types\";\nimport {\n isAnswerFilled,\n isNativeRadio,\n isTypingElement,\n shortcutAlphabet,\n} from \"./questionnaire.utils\";\n\ninterface Options {\n name: string;\n required: Accessor<boolean>;\n multiple: Accessor<boolean>;\n disabled: Accessor<boolean>;\n invalid: Accessor<boolean>;\n onStatusChange?: (status: QuestionnaireItemStatus) => void;\n}\n\nexport interface QuestionnaireItemDomProps {\n \"aria-describedby\": string | undefined;\n \"aria-invalid\": boolean | undefined;\n \"aria-keyshortcuts\": string | undefined;\n disabled: boolean;\n hidden: boolean;\n inert: boolean;\n tabIndex: number;\n}\n\nexport interface UseQuestionnaireItemResult {\n context: QuestionnaireItemContextValue;\n /** 反应式:每次读取都根据当前 active/invalid 重新计算 */\n itemProps: () => QuestionnaireItemDomProps;\n describedBy: () => string | undefined;\n keyshortcuts: () => string | undefined;\n /** 在 fieldset 的 ref 里调用:登记 DOM 元素并把句柄注册到 Root */\n registerElement: (element: HTMLElement) => () => void;\n}\n\n/**\n * 单个题目的状态:答案注册与选中、跳过、校验、快捷键,以及给 Root 的句柄。\n */\nexport function useQuestionnaireItem(\n options: Options,\n): UseQuestionnaireItemResult {\n const root = useQuestionnaireRootContext(\"QuestionnaireItem\");\n\n const [element, setElement] = createSignal<HTMLElement>();\n const [answers, setAnswers] = createSignal<QuestionnaireAnswerEntry[]>([]);\n const [selections, setSelections] = createSignal<string[]>([]);\n const [defaults, setDefaults] = createSignal<string[]>([]);\n const [skipped, setSkipped] = createSignal(false);\n const [touched, setTouched] = createSignal(false);\n const [resetVersion, setResetVersion] = createSignal(0);\n const [descriptionIds, setDescriptionIds] = createSignal<string[]>([]);\n const [errorIds, setErrorIds] = createSignal<string[]>([]);\n\n const active = createMemo(() => root.activeItemName() === options.name);\n\n const registerAnswerControl = (entry: QuestionnaireAnswerEntry) => {\n setAnswers((prev) => [\n ...prev.filter(\n (item) => item.id !== entry.id && item.element !== entry.element,\n ),\n entry,\n ]);\n return () => setAnswers((prev) => prev.filter((item) => item !== entry));\n };\n\n const applySelection = (id: string, selected: boolean) => {\n setSelections((prev) => {\n if (selected) {\n return options.multiple()\n ? prev.includes(id)\n ? prev\n : [...prev, id]\n : [id];\n }\n return prev.filter((value) => value !== id);\n });\n };\n\n const registerAnswerSelection = (id: string, initialSelected: boolean) => {\n if (initialSelected) {\n setSelections((prev) =>\n options.multiple()\n ? prev.includes(id)\n ? prev\n : [...prev, id]\n : prev.length\n ? prev\n : [id],\n );\n }\n return () => {\n setSelections((prev) => prev.filter((value) => value !== id));\n setDefaults((prev) => prev.filter((value) => value !== id));\n };\n };\n\n const setAnswerDefault = (id: string, selected: boolean) => {\n setDefaults((prev) => {\n if (selected) return prev.includes(id) ? prev : [...prev, id];\n return prev.filter((value) => value !== id);\n });\n };\n\n const setAnswerSelectionFromInteraction = (id: string, selected: boolean) => {\n setSkipped(false);\n applySelection(id, selected);\n };\n\n const syncControlledAnswerSelection = (id: string, selected: boolean) => {\n applySelection(id, selected);\n };\n\n const isEntryDisabled = (entry: QuestionnaireAnswerEntry) =>\n entry.disabled || entry.element.disabled;\n\n const hasInputAnswer = createMemo(() =>\n answers().some(\n (entry) =>\n entry.type === \"input\" &&\n ![\"button\", \"checkbox\", \"radio\", \"reset\", \"submit\"].includes(\n entry.element.type,\n ),\n ),\n );\n\n const status = createMemo<QuestionnaireItemStatus>(() => {\n if (skipped()) return \"skipped\";\n const selected = selections();\n const answered = answers().some(\n (entry) => selected.includes(entry.id) && !isEntryDisabled(entry),\n );\n return answered ? \"answered\" : \"unanswered\";\n });\n\n const skippable = createMemo(\n () => status() === \"skipped\" && !options.required(),\n );\n const answeredOk = createMemo(() => status() === \"answered\");\n\n const invalid = createMemo(\n () =>\n !options.disabled() &&\n !skippable() &&\n (options.invalid() ||\n (touched() && !(skippable() || (!options.invalid() && answeredOk())))),\n );\n\n const focus = () => {\n const target = element();\n if (!target) return;\n const filled = target.querySelector<HTMLElement>(\n \"input[data-filled][name]:not(:disabled)\",\n );\n const anyInput = target.querySelector<HTMLElement>(\n \"input:not([type=hidden]):not(:disabled), textarea:not(:disabled)\",\n );\n (filled ?? anyInput ?? target).focus();\n };\n\n const validate = () => {\n setTouched(true);\n const satisfied =\n options.disabled() ||\n (status() === \"skipped\" && !options.required()) ||\n (!options.invalid() && status() === \"answered\");\n if (!satisfied) return false;\n if (!root.nativeValidation()) return true;\n const answer = answers().find(\n (entry) =>\n isAnswerFilled(entry) &&\n entry.element.willValidate &&\n !entry.element.validity.valid,\n );\n if (answer) {\n answer.element.focus();\n answer.element.reportValidity();\n return false;\n }\n return true;\n };\n\n const skip = () => {\n if (options.required()) return;\n setSelections([]);\n setSkipped(true);\n };\n\n const reset = () => {\n setTouched(false);\n setSkipped(false);\n setSelections(\n options.multiple() ? [...defaults()] : defaults().slice(0, 1),\n );\n setResetVersion((value) => value + 1);\n };\n\n const getAnswerByElement = (target: Element) =>\n answers().find((entry) => entry.element === target) ?? null;\n\n const shortcutByChoiceValue = createMemo<Map<string, string> | null>(() => {\n const mode = root.shortcuts();\n const definition = root.itemDefinitions()?.get(options.name);\n if (!mode || !definition?.choices) return null;\n const alphabet = shortcutAlphabet(mode);\n const map = new Map<string, string>();\n let cursor = 0;\n for (const choice of definition.choices) {\n if (choice.disabled) continue;\n const letter = alphabet[cursor];\n if (!letter) break;\n map.set(choice.value, letter);\n cursor += 1;\n }\n return map;\n });\n\n const shortcutByAnswerId = createMemo<Map<string, string>>(() => {\n if (shortcutByChoiceValue()) return new Map();\n const alphabet = shortcutAlphabet(root.shortcuts());\n const choices = answers().filter((entry) => entry.type === \"choice\");\n return new Map(\n choices\n .slice(0, alphabet.length)\n .map((entry, index) => [entry.id, alphabet[index]!]),\n );\n });\n\n const getAnswerByShortcut = (shortcut: string) => {\n const byValue = shortcutByChoiceValue();\n if (byValue) {\n const value = [...byValue.entries()].find(\n ([, letter]) => letter === shortcut,\n )?.[0];\n return (\n answers().find(\n (entry) => entry.type === \"choice\" && entry.value === value,\n ) ?? null\n );\n }\n const id = [...shortcutByAnswerId().entries()].find(\n ([, letter]) => letter === shortcut,\n )?.[0];\n return answers().find((entry) => entry.id === id) ?? null;\n };\n\n const moveAnswerFocus = (target: Element, direction: \"next\" | \"previous\") => {\n const scope = element();\n const focusable = answers().filter(\n (entry) =>\n !isEntryDisabled(entry) &&\n entry.element.isConnected &&\n !(isTypingElement(target) && entry.type === \"input\"),\n );\n if (!focusable.length) return false;\n const position = focusable.findIndex((entry) => entry.element === target);\n if (position < 0 && target !== scope) return false;\n const nextIndex =\n position < 0\n ? direction === \"next\"\n ? 0\n : focusable.length - 1\n : (position + (direction === \"next\" ? 1 : -1) + focusable.length) %\n focusable.length;\n const next = focusable[nextIndex];\n if (!next || next.element === target) return false;\n next.element.focus();\n if (next.type === \"choice\" && isNativeRadio(next.element)) {\n (next.element as HTMLInputElement).click();\n }\n return true;\n };\n\n const describedBy = () => {\n const ids = [...descriptionIds(), ...(invalid() ? errorIds() : [])];\n return [...new Set(ids)].join(\" \") || undefined;\n };\n\n const keyshortcuts = () => {\n if (!active()) return undefined;\n const state = root.state();\n return (\n [\n \"Meta+Enter Control+Enter\",\n answers().length ? \"ArrowUp ArrowDown\" : null,\n !state.first ? \"ArrowLeft\" : null,\n !state.last && status() !== \"unanswered\" ? \"ArrowRight\" : null,\n ]\n .filter(Boolean)\n .join(\" \") || undefined\n );\n };\n\n const registerDescription = (id: string) => {\n setDescriptionIds((prev) => (prev.includes(id) ? prev : [...prev, id]));\n return () =>\n setDescriptionIds((prev) => prev.filter((value) => value !== id));\n };\n\n const registerError = (id: string) => {\n setErrorIds((prev) => (prev.includes(id) ? prev : [...prev, id]));\n return () => setErrorIds((prev) => prev.filter((value) => value !== id));\n };\n\n const context: QuestionnaireItemContextValue = {\n name: options.name,\n active,\n disabled: options.disabled,\n invalid,\n multiple: options.multiple,\n required: options.required,\n status,\n hasInputAnswer,\n selectedAnswerIds: selections,\n resetVersion,\n shortcutByAnswerId,\n shortcutByChoiceValue,\n shortcuts: root.shortcuts,\n registerAnswerControl,\n registerAnswerSelection,\n registerDescription,\n registerError,\n setAnswerDefault,\n setAnswerSelectionFromInteraction,\n syncControlledAnswerSelection,\n };\n\n const registerElement = (target: HTMLElement) => {\n setElement(target);\n const handle: QuestionnaireItemHandle = {\n name: options.name,\n element: target,\n disabled: options.disabled,\n required: options.required,\n status,\n validate,\n focus,\n focusInvalid: focus,\n skip,\n reset,\n getAnswerByElement,\n getAnswerByShortcut,\n moveAnswerFocus,\n };\n return root.registerItem(handle);\n };\n\n return {\n context,\n itemProps: () => ({\n \"aria-describedby\": describedBy(),\n \"aria-invalid\": invalid() || undefined,\n \"aria-keyshortcuts\": keyshortcuts(),\n disabled: options.disabled(),\n hidden: !active(),\n inert: !active(),\n tabIndex: -1,\n }),\n registerElement,\n describedBy,\n keyshortcuts,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useQuestionnaireItem.js","names":["moveAnswerFocus","moveAnswerFocusInItem","useQuestionnaireItem","root","useQuestionnaireRootContext","element","setElement","createSignal","book","createAnswerBookkeeping","options","descriptions","createIdRegistry","errors","active","createMemo","invalid","resolveItemInvalid","skippable","touched","answeredOk","focus","focusItem","validate","isItemSatisfied","status","answer","findNativeInvalidAnswer","answers","shortcutByChoiceValue","buildShortcutByChoiceValue","shortcutByAnswerId","buildShortcutByAnswerId","getAnswerByShortcut","findAnswerByShortcut","shortcut","moveAnswerFocus$1","moveAnswerFocus","describedBy","buildDescribedBy","keyshortcuts","buildItemKeyshortcuts","selections","target","handle"],"sources":["../../../src/components/questionnaire/useQuestionnaireItem.ts"],"sourcesContent":["import { createMemo, createSignal, type Accessor } from \"solid-js\";\nimport {\n useQuestionnaireRootContext,\n type QuestionnaireItemContextValue,\n type QuestionnaireItemHandle,\n} from \"./questionnaire.context\";\nimport {\n buildDescribedBy,\n buildItemKeyshortcuts,\n createIdRegistry,\n} from \"./questionnaire.aria\";\nimport { createAnswerBookkeeping } from \"./questionnaire.answers\";\nimport {\n focusItem,\n moveAnswerFocus as moveAnswerFocusInItem,\n} from \"./questionnaire.focus\";\nimport {\n buildShortcutByAnswerId,\n buildShortcutByChoiceValue,\n findAnswerByShortcut,\n} from \"./questionnaire.shortcuts\";\nimport {\n findNativeInvalidAnswer,\n isItemSatisfied,\n resolveItemInvalid,\n} from \"./questionnaire.validation\";\n\ninterface Options {\n name: string;\n required: Accessor<boolean>;\n multiple: Accessor<boolean>;\n disabled: Accessor<boolean>;\n invalid: Accessor<boolean>;\n}\n\nexport interface QuestionnaireItemDomProps {\n \"aria-describedby\": string | undefined;\n \"aria-invalid\": boolean | undefined;\n \"aria-keyshortcuts\": string | undefined;\n disabled: boolean;\n hidden: boolean;\n inert: boolean;\n tabIndex: number;\n}\n\nexport interface UseQuestionnaireItemResult {\n context: QuestionnaireItemContextValue;\n /** 反应式:每次读取都根据当前 active/invalid 重新计算 */\n itemProps: () => QuestionnaireItemDomProps;\n describedBy: () => string | undefined;\n keyshortcuts: () => string | undefined;\n /** 在 fieldset 的 ref 里调用:登记 DOM 元素并把句柄注册到 Root */\n registerElement: (element: HTMLElement) => () => void;\n}\n\n/**\n * 单个题目的状态:答案注册与选中、跳过、校验、快捷键,以及给 Root 的句柄。\n */\nexport function useQuestionnaireItem(\n options: Options,\n): UseQuestionnaireItemResult {\n const root = useQuestionnaireRootContext(\"QuestionnaireItem\");\n\n const [element, setElement] = createSignal<HTMLElement>();\n\n const book = createAnswerBookkeeping({\n multiple: options.multiple,\n required: options.required,\n });\n const {\n answers,\n selections,\n touched,\n resetVersion,\n status,\n skippable,\n answeredOk,\n hasInputAnswer,\n registerAnswerControl,\n registerAnswerSelection,\n setAnswerDefault,\n setAnswerSelectionFromInteraction,\n syncControlledAnswerSelection,\n getAnswerByElement,\n } = book;\n\n const descriptions = createIdRegistry();\n const errors = createIdRegistry();\n\n const active = createMemo(() => root.activeItemName() === options.name);\n\n const invalid = createMemo(() =>\n resolveItemInvalid({\n disabled: options.disabled(),\n invalid: options.invalid(),\n skippable: skippable(),\n touched: touched(),\n answeredOk: answeredOk(),\n }),\n );\n\n const focus = () => focusItem(element());\n\n const validate = () => {\n book.markTouched();\n const satisfied = isItemSatisfied({\n disabled: options.disabled(),\n status: status(),\n required: options.required(),\n invalid: options.invalid(),\n });\n if (!satisfied) return false;\n if (!root.nativeValidation()) return true;\n\n const answer = findNativeInvalidAnswer(answers());\n if (!answer) return true;\n answer.element.focus();\n answer.element.reportValidity();\n return false;\n };\n\n const shortcutByChoiceValue = createMemo(() =>\n buildShortcutByChoiceValue(\n root.itemDefinitions()?.get(options.name),\n root.shortcuts(),\n ),\n );\n\n const shortcutByAnswerId = createMemo(() =>\n buildShortcutByAnswerId(\n answers(),\n shortcutByChoiceValue() !== null,\n root.shortcuts(),\n ),\n );\n\n const getAnswerByShortcut = (shortcut: string) =>\n findAnswerByShortcut(shortcut, {\n byChoiceValue: shortcutByChoiceValue(),\n byAnswerId: shortcutByAnswerId(),\n answers: answers(),\n });\n\n const moveAnswerFocus = (target: Element, direction: \"next\" | \"previous\") =>\n moveAnswerFocusInItem({\n scope: element(),\n target,\n direction,\n answers: answers(),\n });\n\n const describedBy = () =>\n buildDescribedBy(descriptions.ids(), errors.ids(), invalid());\n\n const keyshortcuts = () =>\n buildItemKeyshortcuts({\n active: active(),\n hasAnswers: answers().length > 0,\n first: root.state().first,\n last: root.state().last,\n status: status(),\n });\n\n const context: QuestionnaireItemContextValue = {\n name: options.name,\n active,\n disabled: options.disabled,\n invalid,\n multiple: options.multiple,\n required: options.required,\n status,\n hasInputAnswer,\n selectedAnswerIds: selections,\n resetVersion,\n shortcutByAnswerId,\n shortcutByChoiceValue,\n shortcuts: root.shortcuts,\n registerAnswerControl,\n registerAnswerSelection,\n registerDescription: descriptions.register,\n registerError: errors.register,\n setAnswerDefault,\n setAnswerSelectionFromInteraction,\n syncControlledAnswerSelection,\n };\n\n const registerElement = (target: HTMLElement) => {\n setElement(target);\n const handle: QuestionnaireItemHandle = {\n name: options.name,\n element: target,\n disabled: options.disabled,\n required: options.required,\n status,\n validate,\n focus,\n focusInvalid: focus,\n skip: book.skip,\n reset: book.reset,\n getAnswerByElement,\n getAnswerByShortcut,\n moveAnswerFocus,\n };\n return root.registerItem(handle);\n };\n\n return {\n context,\n itemProps: () => ({\n \"aria-describedby\": describedBy(),\n \"aria-invalid\": invalid() || undefined,\n \"aria-keyshortcuts\": keyshortcuts(),\n disabled: options.disabled(),\n hidden: !active(),\n inert: !active(),\n tabIndex: -1,\n }),\n registerElement,\n describedBy,\n keyshortcuts,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,144 +1,123 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createDomVersionWatcher as e } from "./questionnaire.dom-watch.js";
|
|
2
|
+
import { createItemView as t, resolveActiveName as n } from "./questionnaire.item-view.js";
|
|
3
|
+
import { handleQuestionnaireKeyDown as r } from "./questionnaire.keys.js";
|
|
4
|
+
import { createItemRegistry as i } from "./questionnaire.registry.js";
|
|
5
|
+
import { createEffect as a, createSignal as o } from "solid-js";
|
|
3
6
|
//#region src/components/questionnaire/useQuestionnaireRoot.ts
|
|
4
|
-
function
|
|
5
|
-
let
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
7
|
+
function s(s) {
|
|
8
|
+
let c = i(), l = e(s.formRef), [u, d] = o(null), f = null, p = t({
|
|
9
|
+
registered: c.items,
|
|
10
|
+
domVersion: l,
|
|
11
|
+
controlledItem: s.item,
|
|
12
|
+
internalName: u,
|
|
13
|
+
definitions: s.items
|
|
14
|
+
}), { enabled: m, activeName: h, activeItem: g, total: _, index: v, first: y, last: b } = p, { current: x, itemDefinitions: S } = p, C = () => n({
|
|
15
|
+
enabled: m(),
|
|
16
|
+
controlledItem: s.item(),
|
|
17
|
+
defaultItem: s.defaultItem()
|
|
18
|
+
});
|
|
12
19
|
a(() => {
|
|
13
|
-
if (
|
|
14
|
-
let e =
|
|
20
|
+
if (s.item() !== void 0) return;
|
|
21
|
+
let e = m(), t = h();
|
|
15
22
|
if (t && e.some((e) => e.name === t)) return;
|
|
16
|
-
let n =
|
|
17
|
-
n !== t &&
|
|
23
|
+
let n = C();
|
|
24
|
+
n !== t && d(n);
|
|
18
25
|
});
|
|
19
|
-
let
|
|
20
|
-
d((t) => t.filter((t) => t !== e));
|
|
21
|
-
}), k = (e, t = "item") => {
|
|
26
|
+
let w = c.register, T = (e, t = "item") => {
|
|
22
27
|
if (e) {
|
|
23
|
-
if (e ===
|
|
24
|
-
t === "invalid" &&
|
|
28
|
+
if (e === h()) {
|
|
29
|
+
t === "invalid" && g()?.focusInvalid();
|
|
25
30
|
return;
|
|
26
31
|
}
|
|
27
|
-
|
|
32
|
+
f = {
|
|
28
33
|
name: e,
|
|
29
34
|
target: t
|
|
30
|
-
},
|
|
35
|
+
}, s.item() === void 0 && d(e), s.onItemChange?.(e);
|
|
31
36
|
}
|
|
32
|
-
},
|
|
33
|
-
let e =
|
|
37
|
+
}, E = () => s.formRef()?.requestSubmit(), D = () => {
|
|
38
|
+
let e = g();
|
|
34
39
|
if (!e) return;
|
|
35
40
|
if (!e.validate()) {
|
|
36
41
|
e.focusInvalid();
|
|
37
42
|
return;
|
|
38
43
|
}
|
|
39
|
-
let t =
|
|
40
|
-
n < 0 || n >= t.length - 1 ||
|
|
41
|
-
},
|
|
42
|
-
let e =
|
|
43
|
-
t <= 0 ||
|
|
44
|
-
},
|
|
45
|
-
let e =
|
|
44
|
+
let t = m(), n = t.indexOf(e);
|
|
45
|
+
n < 0 || n >= t.length - 1 || T(t[n + 1].name);
|
|
46
|
+
}, O = () => {
|
|
47
|
+
let e = m(), t = v();
|
|
48
|
+
t <= 0 || T(e[t - 1].name);
|
|
49
|
+
}, k = () => {
|
|
50
|
+
let e = g();
|
|
46
51
|
if (!e || e.required()) return;
|
|
47
|
-
if (e.skip(),
|
|
48
|
-
queueMicrotask(
|
|
52
|
+
if (e.skip(), b()) {
|
|
53
|
+
queueMicrotask(E);
|
|
49
54
|
return;
|
|
50
55
|
}
|
|
51
|
-
let t =
|
|
52
|
-
|
|
53
|
-
},
|
|
54
|
-
|
|
56
|
+
let t = m(), n = t.indexOf(e);
|
|
57
|
+
T(t[n + 1].name);
|
|
58
|
+
}, A = () => {
|
|
59
|
+
b() ? E() : D();
|
|
55
60
|
};
|
|
56
61
|
return a(() => {
|
|
57
|
-
let e =
|
|
58
|
-
if (!
|
|
59
|
-
let t =
|
|
60
|
-
|
|
61
|
-
let n =
|
|
62
|
+
let e = h();
|
|
63
|
+
if (!f || f.name !== e) return;
|
|
64
|
+
let t = f.target;
|
|
65
|
+
f = null;
|
|
66
|
+
let n = m().find((t) => t.name === e);
|
|
62
67
|
n && queueMicrotask(() => {
|
|
63
68
|
t === "invalid" ? n.focusInvalid() : n.focus();
|
|
64
69
|
});
|
|
65
|
-
}), a(() => {
|
|
66
|
-
let e = l.formRef();
|
|
67
|
-
if (!e || typeof MutationObserver > "u") return;
|
|
68
|
-
let t = new MutationObserver(() => p((e) => e + 1));
|
|
69
|
-
t.observe(e, {
|
|
70
|
-
childList: !0,
|
|
71
|
-
subtree: !0
|
|
72
|
-
}), c(() => t.disconnect());
|
|
73
70
|
}), {
|
|
74
71
|
context: {
|
|
75
72
|
state: () => ({
|
|
76
|
-
current:
|
|
77
|
-
first:
|
|
78
|
-
last:
|
|
79
|
-
total:
|
|
73
|
+
current: x(),
|
|
74
|
+
first: y(),
|
|
75
|
+
last: b(),
|
|
76
|
+
total: _()
|
|
80
77
|
}),
|
|
81
|
-
activeItemName:
|
|
82
|
-
activeItemRequired: () =>
|
|
83
|
-
activeItemStatus: () =>
|
|
84
|
-
shortcuts: () =>
|
|
85
|
-
nativeValidation: () =>
|
|
86
|
-
itemDefinitions:
|
|
87
|
-
registerItem:
|
|
88
|
-
goNext:
|
|
89
|
-
goPrevious:
|
|
90
|
-
skipCurrent:
|
|
91
|
-
requestSubmit:
|
|
78
|
+
activeItemName: h,
|
|
79
|
+
activeItemRequired: () => g()?.required() ?? null,
|
|
80
|
+
activeItemStatus: () => g()?.status() ?? null,
|
|
81
|
+
shortcuts: () => s.shortcuts() ?? null,
|
|
82
|
+
nativeValidation: () => s.noValidate() === !1,
|
|
83
|
+
itemDefinitions: S,
|
|
84
|
+
registerItem: w,
|
|
85
|
+
goNext: D,
|
|
86
|
+
goPrevious: O,
|
|
87
|
+
skipCurrent: k,
|
|
88
|
+
requestSubmit: E
|
|
92
89
|
},
|
|
93
90
|
formProps: {
|
|
94
|
-
"data-shortcuts":
|
|
91
|
+
"data-shortcuts": s.shortcuts(),
|
|
95
92
|
onKeyDown: (e) => {
|
|
96
|
-
let
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
e.preventDefault();
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
if ((e.key === "ArrowLeft" || e.key === "ArrowRight") && !r(o) && !n(o)) {
|
|
109
|
-
if (e.preventDefault(), e.repeat) return;
|
|
110
|
-
e.key === "ArrowLeft" ? M() : a.status() !== "unanswered" && j();
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
if (e.key === "Enter") {
|
|
114
|
-
let n = a.getAnswerByElement(o);
|
|
115
|
-
if (!n) return;
|
|
116
|
-
e.preventDefault(), !e.repeat && t(n) && P();
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
let s = l.shortcuts() ?? null;
|
|
120
|
-
if (!s || r(o)) return;
|
|
121
|
-
let c = i(e.key, s), u = c ? a.getAnswerByShortcut(c) : null;
|
|
122
|
-
u && (e.preventDefault(), !e.repeat && (u.element.focus(), u.type === "choice" && u.element.click()));
|
|
93
|
+
let t = g();
|
|
94
|
+
t && r(e, {
|
|
95
|
+
item: t,
|
|
96
|
+
status: () => t.status(),
|
|
97
|
+
shortcuts: s.shortcuts() ?? null,
|
|
98
|
+
goNext: D,
|
|
99
|
+
goPrevious: O,
|
|
100
|
+
submitOrNext: A
|
|
101
|
+
});
|
|
123
102
|
},
|
|
124
103
|
onSubmit: (e) => {
|
|
125
|
-
let t =
|
|
104
|
+
let t = m().find((e) => !e.validate());
|
|
126
105
|
if (t) {
|
|
127
|
-
e.preventDefault(),
|
|
106
|
+
e.preventDefault(), T(t.name, "invalid");
|
|
128
107
|
return;
|
|
129
108
|
}
|
|
130
|
-
|
|
109
|
+
s.onSubmit?.(e);
|
|
131
110
|
},
|
|
132
111
|
onReset: (e) => {
|
|
133
|
-
if (
|
|
134
|
-
for (let e of
|
|
135
|
-
|
|
112
|
+
if (s.onReset?.(e), !e.defaultPrevented) {
|
|
113
|
+
for (let e of m()) e.reset();
|
|
114
|
+
T(C());
|
|
136
115
|
}
|
|
137
116
|
}
|
|
138
117
|
}
|
|
139
118
|
};
|
|
140
119
|
}
|
|
141
120
|
//#endregion
|
|
142
|
-
export {
|
|
121
|
+
export { s as useQuestionnaireRoot };
|
|
143
122
|
|
|
144
123
|
//# sourceMappingURL=useQuestionnaireRoot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuestionnaireRoot.js","names":["useQuestionnaireRoot","registered","setRegistered","createSignal","domVersion","setDomVersion","internalName","setInternalName","pendingFocus","ordered","createMemo","compareDocumentOrder","a","b","enabled","item","activeName","options","activeItem","total","index","current","first","last","itemDefinitions","list","definition","resolveName","candidate","entry","name","next","registerItem","prev","handle","navigate","target","requestSubmit","goNext","position","goPrevious","skipCurrent","submitOrNext","createEffect","form","observer","v","onCleanup","event","isTypingElement","isNativeRadio","answer","isAnswerFilled","mode","shortcut","normalizeShortcut","invalid"],"sources":["../../../src/components/questionnaire/useQuestionnaireRoot.ts"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n onCleanup,\n type Accessor,\n} from \"solid-js\";\nimport type {\n QuestionnaireItemHandle,\n QuestionnaireRootContextValue,\n} from \"./questionnaire.context\";\nimport type {\n QuestionnaireItemDefinition,\n QuestionnaireShortcutMode,\n} from \"./questionnaire.types\";\nimport {\n compareDocumentOrder,\n isAnswerFilled,\n isNativeRadio,\n isTypingElement,\n normalizeShortcut,\n} from \"./questionnaire.utils\";\n\ninterface Options {\n item: Accessor<string | undefined>;\n defaultItem: Accessor<string | undefined>;\n items: Accessor<readonly QuestionnaireItemDefinition[] | undefined>;\n shortcuts: Accessor<QuestionnaireShortcutMode | undefined>;\n noValidate: Accessor<boolean | undefined>;\n onItemChange: (item: string) => void;\n onReset?: (event: Event) => void;\n onSubmit?: (event: SubmitEvent) => void;\n formRef: Accessor<HTMLFormElement | undefined>;\n}\n\n/**\n * Questionnaire 根状态机:\n * - 注册各 Item(按 DOM 顺序排序),维护激活项与进度;\n * - 导航(上一题/下一题/跳过/提交)与校验;\n * - 键盘:Mod+Enter 提交、上下箭头在答案间移动、左右箭头切题、方向键/Esc/快捷键。\n */\nexport function useQuestionnaireRoot(options: Options): {\n context: QuestionnaireRootContextValue;\n formProps: {\n \"data-shortcuts\": string | undefined;\n onKeyDown: (event: KeyboardEvent) => void;\n onSubmit: (event: SubmitEvent) => void;\n onReset: (event: Event) => void;\n };\n} {\n const [registered, setRegistered] = createSignal<QuestionnaireItemHandle[]>(\n [],\n );\n const [domVersion, setDomVersion] = createSignal(0);\n const [internalName, setInternalName] = createSignal<string | null>(null);\n let pendingFocus: { name: string; target: \"item\" | \"invalid\" } | null = null;\n\n const ordered = createMemo(() => {\n domVersion();\n return [...registered()].sort((a, b) =>\n compareDocumentOrder(a.element, b.element),\n );\n });\n const enabled = createMemo(() =>\n ordered().filter((item) => !item.disabled()),\n );\n const activeName = createMemo(() => options.item() ?? internalName());\n const activeItem = createMemo(\n () => enabled().find((item) => item.name === activeName()) ?? null,\n );\n const total = createMemo(() => enabled().length);\n const index = createMemo(() =>\n enabled().findIndex((item) => item.name === activeName()),\n );\n const current = createMemo(() => (index() < 0 ? 0 : index() + 1));\n const first = createMemo(() => total() > 0 && index() === 0);\n const last = createMemo(() => total() > 0 && index() === total() - 1);\n\n const itemDefinitions = createMemo(() => {\n const list = options.items();\n if (!list) return null;\n return new Map(list.map((definition) => [definition.name, definition]));\n });\n\n const resolveName = () => {\n const list = enabled();\n const candidate = options.item() ?? options.defaultItem();\n if (candidate && list.some((entry) => entry.name === candidate)) {\n return candidate;\n }\n return list[0]?.name ?? null;\n };\n\n // 激活项不可用时回退到定义/第一个可用项\n createEffect(() => {\n if (options.item() !== undefined) return;\n const list = enabled();\n const name = activeName();\n if (name && list.some((entry) => entry.name === name)) return;\n const next = resolveName();\n if (next !== name) setInternalName(next);\n });\n\n const registerItem = (handle: QuestionnaireItemHandle) => {\n setRegistered((prev) => {\n const exists = prev.some((item) => item.element === handle.element);\n return exists\n ? prev.map((item) => (item.element === handle.element ? handle : item))\n : [...prev, handle];\n });\n return () => {\n setRegistered((prev) => prev.filter((item) => item !== handle));\n };\n };\n\n const navigate = (\n name: string | null,\n target: \"item\" | \"invalid\" = \"item\",\n ) => {\n if (!name) return;\n if (name === activeName()) {\n if (target === \"invalid\") activeItem()?.focusInvalid();\n return;\n }\n pendingFocus = { name, target };\n if (options.item() === undefined) setInternalName(name);\n options.onItemChange?.(name);\n };\n\n const requestSubmit = () => options.formRef()?.requestSubmit();\n\n const goNext = () => {\n const item = activeItem();\n if (!item) return;\n if (!item.validate()) {\n item.focusInvalid();\n return;\n }\n const list = enabled();\n const position = list.indexOf(item);\n if (position < 0 || position >= list.length - 1) return;\n navigate(list[position + 1]!.name);\n };\n\n const goPrevious = () => {\n const list = enabled();\n const position = index();\n if (position <= 0) return;\n navigate(list[position - 1]!.name);\n };\n\n const skipCurrent = () => {\n const item = activeItem();\n if (!item || item.required()) return;\n item.skip();\n if (last()) {\n queueMicrotask(requestSubmit);\n return;\n }\n const list = enabled();\n const position = list.indexOf(item);\n navigate(list[position + 1]?.name ?? null);\n };\n\n const submitOrNext = () => {\n if (last()) requestSubmit();\n else goNext();\n };\n\n const handleSubmit = (event: SubmitEvent) => {\n const invalid = enabled().find((item) => !item.validate());\n if (invalid) {\n event.preventDefault();\n navigate(invalid.name, \"invalid\");\n return;\n }\n options.onSubmit?.(event);\n };\n\n const handleReset = (event: Event) => {\n options.onReset?.(event);\n if (event.defaultPrevented) return;\n for (const item of enabled()) item.reset();\n navigate(resolveName());\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const item = activeItem();\n if (!item) return;\n if (\n event.defaultPrevented ||\n event.isComposing ||\n event.keyCode === 229 ||\n !(event.target instanceof Element)\n ) {\n return;\n }\n const target = event.target;\n\n if (\n event.key === \"Enter\" &&\n (event.metaKey || event.ctrlKey) &&\n !event.altKey &&\n !event.shiftKey\n ) {\n event.preventDefault();\n if (!event.repeat) submitOrNext();\n return;\n }\n if (event.metaKey || event.ctrlKey || event.altKey) return;\n\n if (\n (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") &&\n item.moveAnswerFocus(\n target,\n event.key === \"ArrowDown\" ? \"next\" : \"previous\",\n )\n ) {\n event.preventDefault();\n return;\n }\n\n if (\n (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") &&\n !isTypingElement(target) &&\n !isNativeRadio(target)\n ) {\n event.preventDefault();\n if (event.repeat) return;\n if (event.key === \"ArrowLeft\") goPrevious();\n else if (item.status() !== \"unanswered\") goNext();\n return;\n }\n\n if (event.key === \"Enter\") {\n const answer = item.getAnswerByElement(target);\n if (!answer) return;\n event.preventDefault();\n if (!event.repeat && isAnswerFilled(answer)) submitOrNext();\n return;\n }\n\n const mode = options.shortcuts() ?? null;\n if (!mode || isTypingElement(target)) return;\n const shortcut = normalizeShortcut(event.key, mode);\n const answer = shortcut ? item.getAnswerByShortcut(shortcut) : null;\n if (!answer) return;\n event.preventDefault();\n if (event.repeat) return;\n answer.element.focus();\n if (answer.type === \"choice\") (answer.element as HTMLInputElement).click();\n };\n\n // 导航后聚焦新激活项(或它的首个答案控件)\n createEffect(() => {\n const name = activeName();\n if (!pendingFocus || pendingFocus.name !== name) return;\n const target = pendingFocus.target;\n pendingFocus = null;\n const handle = enabled().find((item) => item.name === name);\n if (!handle) return;\n queueMicrotask(() => {\n if (target === \"invalid\") handle.focusInvalid();\n else handle.focus();\n });\n });\n\n // 观察 DOM 变化(动态增删 Item)以便重新排序\n createEffect(() => {\n const form = options.formRef();\n if (!form || typeof MutationObserver === \"undefined\") return;\n const observer = new MutationObserver(() => setDomVersion((v) => v + 1));\n observer.observe(form, { childList: true, subtree: true });\n onCleanup(() => observer.disconnect());\n });\n\n const context: QuestionnaireRootContextValue = {\n state: () => ({\n current: current(),\n first: first(),\n last: last(),\n total: total(),\n }),\n activeItemName: activeName,\n activeItemRequired: () => activeItem()?.required() ?? null,\n activeItemStatus: () => activeItem()?.status() ?? null,\n shortcuts: () => options.shortcuts() ?? null,\n nativeValidation: () => options.noValidate() === false,\n itemDefinitions,\n registerItem,\n goNext,\n goPrevious,\n skipCurrent,\n requestSubmit,\n };\n\n return {\n context,\n formProps: {\n \"data-shortcuts\": options.shortcuts(),\n onKeyDown: handleKeyDown,\n onSubmit: handleSubmit,\n onReset: handleReset,\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useQuestionnaireRoot.js","names":["useQuestionnaireRoot","registry","createItemRegistry","domVersion","createDomVersionWatcher","options","internalName","setInternalName","createSignal","pendingFocus","view","createItemView","resolveName","resolveActiveName","enabled","list","name","activeName","entry","next","registerItem","navigate","target","activeItem","requestSubmit","goNext","item","position","goPrevious","index","skipCurrent","last","submitOrNext","createEffect","handle","current","first","total","handleQuestionnaireKeyDown","event","invalid"],"sources":["../../../src/components/questionnaire/useQuestionnaireRoot.ts"],"sourcesContent":["import { createEffect, createSignal, type Accessor } from \"solid-js\";\nimport type { QuestionnaireRootContextValue } from \"./questionnaire.context\";\nimport type {\n QuestionnaireItemDefinition,\n QuestionnaireShortcutMode,\n} from \"./questionnaire.types\";\nimport { createDomVersionWatcher } from \"./questionnaire.dom-watch\";\nimport { createItemView, resolveActiveName } from \"./questionnaire.item-view\";\nimport { handleQuestionnaireKeyDown } from \"./questionnaire.keys\";\nimport { createItemRegistry } from \"./questionnaire.registry\";\n\ninterface Options {\n item: Accessor<string | undefined>;\n defaultItem: Accessor<string | undefined>;\n items: Accessor<readonly QuestionnaireItemDefinition[] | undefined>;\n shortcuts: Accessor<QuestionnaireShortcutMode | undefined>;\n noValidate: Accessor<boolean | undefined>;\n onItemChange: (item: string) => void;\n onReset?: (event: Event) => void;\n onSubmit?: (event: SubmitEvent) => void;\n formRef: Accessor<HTMLFormElement | undefined>;\n}\n\n/**\n * Questionnaire 根状态机:\n * - 注册各 Item(按 DOM 顺序排序),维护激活项与进度;\n * - 导航(上一题/下一题/跳过/提交)与校验;\n * - 键盘:Mod+Enter 提交、上下箭头在答案间移动、左右箭头切题、方向键/Esc/快捷键。\n */\nexport function useQuestionnaireRoot(options: Options): {\n context: QuestionnaireRootContextValue;\n formProps: {\n \"data-shortcuts\": string | undefined;\n onKeyDown: (event: KeyboardEvent) => void;\n onSubmit: (event: SubmitEvent) => void;\n onReset: (event: Event) => void;\n };\n} {\n const registry = createItemRegistry();\n const domVersion = createDomVersionWatcher(options.formRef);\n const [internalName, setInternalName] = createSignal<string | null>(null);\n let pendingFocus: { name: string; target: \"item\" | \"invalid\" } | null = null;\n\n const view = createItemView({\n registered: registry.items,\n domVersion,\n controlledItem: options.item,\n internalName,\n definitions: options.items,\n });\n const { enabled, activeName, activeItem, total, index, first, last } = view;\n const { current, itemDefinitions } = view;\n\n const resolveName = () =>\n resolveActiveName({\n enabled: enabled(),\n controlledItem: options.item(),\n defaultItem: options.defaultItem(),\n });\n\n // 激活项不可用时回退到定义/第一个可用项\n createEffect(() => {\n if (options.item() !== undefined) return;\n const list = enabled();\n const name = activeName();\n if (name && list.some((entry) => entry.name === name)) return;\n const next = resolveName();\n if (next !== name) setInternalName(next);\n });\n\n const registerItem = registry.register;\n\n const navigate = (\n name: string | null,\n target: \"item\" | \"invalid\" = \"item\",\n ) => {\n if (!name) return;\n if (name === activeName()) {\n if (target === \"invalid\") activeItem()?.focusInvalid();\n return;\n }\n pendingFocus = { name, target };\n if (options.item() === undefined) setInternalName(name);\n options.onItemChange?.(name);\n };\n\n const requestSubmit = () => options.formRef()?.requestSubmit();\n\n const goNext = () => {\n const item = activeItem();\n if (!item) return;\n if (!item.validate()) {\n item.focusInvalid();\n return;\n }\n const list = enabled();\n const position = list.indexOf(item);\n if (position < 0 || position >= list.length - 1) return;\n navigate(list[position + 1]!.name);\n };\n\n const goPrevious = () => {\n const list = enabled();\n const position = index();\n if (position <= 0) return;\n navigate(list[position - 1]!.name);\n };\n\n const skipCurrent = () => {\n const item = activeItem();\n if (!item || item.required()) return;\n item.skip();\n if (last()) {\n queueMicrotask(requestSubmit);\n return;\n }\n const list = enabled();\n const position = list.indexOf(item);\n // 走到这里说明 last() 为 false,即 position 必然小于末位;\n // 且 position 与 item-view 的 index() 同源于 enabled(),因此下一项一定存在\n navigate(list[position + 1].name);\n };\n\n const submitOrNext = () => {\n if (last()) requestSubmit();\n else goNext();\n };\n\n const handleSubmit = (event: SubmitEvent) => {\n const invalid = enabled().find((item) => !item.validate());\n if (invalid) {\n event.preventDefault();\n navigate(invalid.name, \"invalid\");\n return;\n }\n options.onSubmit?.(event);\n };\n\n const handleReset = (event: Event) => {\n options.onReset?.(event);\n if (event.defaultPrevented) return;\n for (const item of enabled()) item.reset();\n navigate(resolveName());\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const item = activeItem();\n if (!item) return;\n\n handleQuestionnaireKeyDown(event, {\n item,\n status: () => item.status(),\n shortcuts: options.shortcuts() ?? null,\n goNext,\n goPrevious,\n submitOrNext,\n });\n };\n\n // 导航后聚焦新激活项(或它的首个答案控件)\n createEffect(() => {\n const name = activeName();\n if (!pendingFocus || pendingFocus.name !== name) return;\n const target = pendingFocus.target;\n pendingFocus = null;\n const handle = enabled().find((item) => item.name === name);\n if (!handle) return;\n queueMicrotask(() => {\n if (target === \"invalid\") handle.focusInvalid();\n else handle.focus();\n });\n });\n\n const context: QuestionnaireRootContextValue = {\n state: () => ({\n current: current(),\n first: first(),\n last: last(),\n total: total(),\n }),\n activeItemName: activeName,\n activeItemRequired: () => activeItem()?.required() ?? null,\n activeItemStatus: () => activeItem()?.status() ?? null,\n shortcuts: () => options.shortcuts() ?? null,\n nativeValidation: () => options.noValidate() === false,\n itemDefinitions,\n registerItem,\n goNext,\n goPrevious,\n skipCurrent,\n requestSubmit,\n };\n\n return {\n context,\n formProps: {\n \"data-shortcuts\": options.shortcuts(),\n onKeyDown: handleKeyDown,\n onSubmit: handleSubmit,\n onReset: handleReset,\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioGroup.js","names":["createMemo","createSignal","splitProps","JSX","clsx","RadioGroupContext","RadioGroupContextValue","RadioGroupProps","RadioGroup","props","Element","local","rest","internalValue","setInternalValue","defaultValue","value","undefined","disabled","itemElements","Map","HTMLElement","setValue","next","onValueChange","registerItem","itemValue","element","set","get","delete","focusItem","focus","ctx","name","_el$","_tmpl$","_$spread","_$mergeProps","class","style","dir","_$insert","_$createComponent","Provider","children","_$mergeProps","_$createComponent","_tmpl$","RadioGroup","local","rest","splitProps","props","internalValue","setInternalValue","createSignal","value","createMemo","disabled","itemElements","ctx","next","itemValue","element","_el$","spread","mergeProps","\"class\"","clsx","insert","createComponent","RadioGroupContext"],"sources":["../../../../src/components/radio-group/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import { createMemo, createSignal, splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { RadioGroupContext } from \"./RadioGroup.context\";\nimport type {\n RadioGroupContextValue,\n RadioGroupProps,\n} from \"./RadioGroup.types\";\n\n/**\n * RadioGroup 根组件:渲染一个 <div role=\"radiogroup\">,并向下提供选中值、\n * 禁用状态和 item 注册方法。选中值支持受控(value)和非受控(defaultValue)。\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"comfortable\">\n * <RadioGroupItem value=\"default\" />\n * <RadioGroupItem value=\"comfortable\" />\n * </RadioGroup>\n * ```\n */\nexport function RadioGroup(props: RadioGroupProps): JSX.Element {\n const [local, rest] = splitProps(props, [\n \"value\",\n \"defaultValue\",\n \"onValueChange\",\n \"disabled\",\n \"name\",\n \"class\",\n \"classList\",\n \"style\",\n \"dir\",\n \"children\",\n ]);\n\n const [internalValue, setInternalValue] = createSignal(local.defaultValue);\n const value = createMemo(() =>\n local.value !== undefined ? local.value : internalValue(),\n );\n const disabled = createMemo(() => !!local.disabled);\n\n const itemElements = new Map<string, HTMLElement>();\n\n const setValue = (next: string) => {\n if (local.value === undefined) setInternalValue(next);\n local.onValueChange?.(next);\n };\n\n const registerItem = (itemValue: string, element: HTMLElement) => {\n itemElements.set(itemValue, element);\n return () => {\n if (itemElements.get(itemValue) === element) {\n itemElements.delete(itemValue);\n }\n };\n };\n\n const focusItem = (itemValue: string) => {\n itemElements.get(itemValue)?.focus();\n };\n\n const ctx: RadioGroupContextValue = {\n value,\n setValue,\n disabled,\n name: local.name,\n registerItem,\n focusItem,\n };\n\n return (\n <div\n role=\"radiogroup\"\n data-slot=\"radio-group\"\n class={clsx(\"grid w-full gap-2\", local.class)}\n style={local.style}\n dir={local.dir}\n {...rest}\n >\n <RadioGroupContext.Provider value={ctx}>\n {local.children}\n </RadioGroupContext.Provider>\n </div>\n );\n}\n"],"mappings":";;;;;;AAoBA,SAAgBQ,EAAWC,GAAqC;CAC9D,IAAM,CAACE,GAAOC,KAAQV,EAAWO,GAAO;EACtC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX,GAEK,CAACI,GAAeC,KAAoBb,EAAaU,EAAMI,YAAY,GACnEC,IAAQhB,QACZW,EAAMK,UAAUC,KAAAA,IAA0BJ,EAAc,IAA5BF,EAAMK,KACpC,GACME,IAAWlB,QAAiB,CAAC,CAACW,EAAMO,QAAQ,GAE5CC,oBAAe,IAAIC,IAAyB,GAoB5Ca,IAA8B;EAClCjB;EACAM,WApBgBC,MAAiB;GAEjCZ,AADIA,EAAMK,UAAUC,KAAAA,KAAWH,EAAiBS,CAAI,GACpDZ,EAAMa,gBAAgBD,CAAI;EAC5B;EAkBEL;EACAgB,MAAMvB,EAAMuB;EACZT,eAlBoBC,GAAmBC,OACvCR,EAAaS,IAAIF,GAAWC,CAAO,SACtB;GACX,AAAIR,EAAaU,IAAIH,CAAS,MAAMC,KAClCR,EAAaW,OAAOJ,CAAS;EAEjC;EAaAK,YAViBL,MAAsB;GACvCP,EAAaU,IAAIH,CAAS,CAAC,EAAEM,MAAM;EACrC;CASA;CAEA,cAAA;EAAA,IAAAG,IAAAC,EAAA;
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","names":["createMemo","createSignal","splitProps","JSX","clsx","RadioGroupContext","RadioGroupContextValue","RadioGroupProps","RadioGroup","props","Element","local","rest","internalValue","setInternalValue","defaultValue","value","undefined","disabled","itemElements","Map","HTMLElement","setValue","next","onValueChange","registerItem","itemValue","element","set","get","delete","focusItem","focus","ctx","name","_el$","_tmpl$","_$spread","_$mergeProps","class","classList","style","dir","_$insert","_$createComponent","Provider","children","_$mergeProps","_$createComponent","_tmpl$","RadioGroup","local","rest","splitProps","props","internalValue","setInternalValue","createSignal","value","createMemo","disabled","itemElements","ctx","next","itemValue","element","_el$","spread","mergeProps","\"class\"","clsx","insert","createComponent","RadioGroupContext"],"sources":["../../../../src/components/radio-group/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import { createMemo, createSignal, splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { RadioGroupContext } from \"./RadioGroup.context\";\nimport type {\n RadioGroupContextValue,\n RadioGroupProps,\n} from \"./RadioGroup.types\";\n\n/**\n * RadioGroup 根组件:渲染一个 <div role=\"radiogroup\">,并向下提供选中值、\n * 禁用状态和 item 注册方法。选中值支持受控(value)和非受控(defaultValue)。\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"comfortable\">\n * <RadioGroupItem value=\"default\" />\n * <RadioGroupItem value=\"comfortable\" />\n * </RadioGroup>\n * ```\n */\nexport function RadioGroup(props: RadioGroupProps): JSX.Element {\n const [local, rest] = splitProps(props, [\n \"value\",\n \"defaultValue\",\n \"onValueChange\",\n \"disabled\",\n \"name\",\n \"class\",\n \"classList\",\n \"style\",\n \"dir\",\n \"children\",\n ]);\n\n const [internalValue, setInternalValue] = createSignal(local.defaultValue);\n const value = createMemo(() =>\n local.value !== undefined ? local.value : internalValue(),\n );\n const disabled = createMemo(() => !!local.disabled);\n\n const itemElements = new Map<string, HTMLElement>();\n\n const setValue = (next: string) => {\n if (local.value === undefined) setInternalValue(next);\n local.onValueChange?.(next);\n };\n\n const registerItem = (itemValue: string, element: HTMLElement) => {\n itemElements.set(itemValue, element);\n return () => {\n if (itemElements.get(itemValue) === element) {\n itemElements.delete(itemValue);\n }\n };\n };\n\n const focusItem = (itemValue: string) => {\n itemElements.get(itemValue)?.focus();\n };\n\n const ctx: RadioGroupContextValue = {\n value,\n setValue,\n disabled,\n name: local.name,\n registerItem,\n focusItem,\n };\n\n return (\n <div\n role=\"radiogroup\"\n data-slot=\"radio-group\"\n class={clsx(\"grid w-full gap-2\", local.class)}\n classList={local.classList}\n style={local.style}\n dir={local.dir}\n {...rest}\n >\n <RadioGroupContext.Provider value={ctx}>\n {local.children}\n </RadioGroupContext.Provider>\n </div>\n );\n}\n"],"mappings":";;;;;;AAoBA,SAAgBQ,EAAWC,GAAqC;CAC9D,IAAM,CAACE,GAAOC,KAAQV,EAAWO,GAAO;EACtC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX,GAEK,CAACI,GAAeC,KAAoBb,EAAaU,EAAMI,YAAY,GACnEC,IAAQhB,QACZW,EAAMK,UAAUC,KAAAA,IAA0BJ,EAAc,IAA5BF,EAAMK,KACpC,GACME,IAAWlB,QAAiB,CAAC,CAACW,EAAMO,QAAQ,GAE5CC,oBAAe,IAAIC,IAAyB,GAoB5Ca,IAA8B;EAClCjB;EACAM,WApBgBC,MAAiB;GAEjCZ,AADIA,EAAMK,UAAUC,KAAAA,KAAWH,EAAiBS,CAAI,GACpDZ,EAAMa,gBAAgBD,CAAI;EAC5B;EAkBEL;EACAgB,MAAMvB,EAAMuB;EACZT,eAlBoBC,GAAmBC,OACvCR,EAAaS,IAAIF,GAAWC,CAAO,SACtB;GACX,AAAIR,EAAaU,IAAIH,CAAS,MAAMC,KAClCR,EAAaW,OAAOJ,CAAS;EAEjC;EAaAK,YAViBL,MAAsB;GACvCP,EAAaU,IAAIH,CAAS,CAAC,EAAEM,MAAM;EACrC;CASA;CAEA,cAAA;EAAA,IAAAG,IAAAC,EAAA;EAWqB,OAXrBC,EAAAF,GAAAG,EAAA;GAAA,IAAA+B,QAAA;IAAA,OAIWjE,EAAK,qBAAqBO,EAAM4B,KAAK;GAAC;GAAA,IAC7CC,YAAS;IAAA,OAAE7B,EAAM6B;GAAS;GAAA,IAC1BC,QAAK;IAAA,OAAE9B,EAAM8B;GAAK;GAAA,IAClBC,MAAG;IAAA,OAAE/B,EAAM+B;GAAG;EAAA,GACV9B,CAAI,GAAA,IAAA,EAAA,GAAA+B,EAAAR,GAAAS,EAEPvC,EAAkBwC,UAAQ;GAAC7B,OAAOiB;GAAG,IAAAa,WAAA;IAAA,OACnCnC,EAAMmC;GAAQ;EAAA,CAAA,CAAA,GAAAX;CAAA,EAAA,CAAA;AAIvB"}
|