@neut/ui 0.0.16 → 0.0.17
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/bubble/Bubble/Bubble.d.ts +3 -0
- package/dist/components/bubble/Bubble/Bubble.js +39 -0
- package/dist/components/bubble/Bubble/Bubble.js.map +1 -0
- package/dist/components/bubble/Bubble/Bubble.styles.d.ts +7 -0
- package/dist/components/bubble/Bubble/Bubble.styles.js +18 -0
- package/dist/components/bubble/Bubble/Bubble.styles.js.map +1 -0
- package/dist/components/bubble/Bubble/Bubble.types.d.ts +8 -0
- package/dist/components/bubble/Bubble/index.d.ts +2 -0
- package/dist/components/bubble/BubbleContent/BubbleContent.d.ts +7 -0
- package/dist/components/bubble/BubbleContent/BubbleContent.js +17 -0
- package/dist/components/bubble/BubbleContent/BubbleContent.js.map +1 -0
- package/dist/components/bubble/BubbleContent/BubbleContent.styles.d.ts +1 -0
- package/dist/components/bubble/BubbleContent/BubbleContent.styles.js +6 -0
- package/dist/components/bubble/BubbleContent/BubbleContent.styles.js.map +1 -0
- package/dist/components/bubble/BubbleContent/BubbleContent.types.d.ts +3 -0
- package/dist/components/bubble/BubbleContent/index.d.ts +2 -0
- package/dist/components/bubble/BubbleGroup/BubbleGroup.d.ts +3 -0
- package/dist/components/bubble/BubbleGroup/BubbleGroup.js +24 -0
- package/dist/components/bubble/BubbleGroup/BubbleGroup.js.map +1 -0
- package/dist/components/bubble/BubbleGroup/BubbleGroup.types.d.ts +2 -0
- package/dist/components/bubble/BubbleGroup/index.d.ts +2 -0
- package/dist/components/bubble/BubbleReactions/BubbleReactions.d.ts +6 -0
- package/dist/components/bubble/BubbleReactions/BubbleReactions.js +42 -0
- package/dist/components/bubble/BubbleReactions/BubbleReactions.js.map +1 -0
- package/dist/components/bubble/BubbleReactions/BubbleReactions.styles.d.ts +4 -0
- package/dist/components/bubble/BubbleReactions/BubbleReactions.styles.js +22 -0
- package/dist/components/bubble/BubbleReactions/BubbleReactions.styles.js.map +1 -0
- package/dist/components/bubble/BubbleReactions/BubbleReactions.types.d.ts +4 -0
- package/dist/components/bubble/BubbleReactions/index.d.ts +2 -0
- package/dist/components/bubble/index.d.ts +8 -0
- package/dist/components/bubble/index.js +5 -0
- package/dist/components/drawer/Drawer/Drawer.context.d.ts +3 -0
- package/dist/components/drawer/Drawer/Drawer.context.js +12 -0
- package/dist/components/drawer/Drawer/Drawer.context.js.map +1 -0
- package/dist/components/drawer/Drawer/Drawer.d.ts +7 -0
- package/dist/components/drawer/Drawer/Drawer.js +63 -0
- package/dist/components/drawer/Drawer/Drawer.js.map +1 -0
- package/dist/components/drawer/Drawer/Drawer.types.d.ts +50 -0
- package/dist/components/drawer/Drawer/create-change-event-details.d.ts +3 -0
- package/dist/components/drawer/Drawer/create-change-event-details.js +25 -0
- package/dist/components/drawer/Drawer/create-change-event-details.js.map +1 -0
- package/dist/components/drawer/Drawer/index.d.ts +3 -0
- package/dist/components/drawer/DrawerClose/DrawerClose.d.ts +5 -0
- package/dist/components/drawer/DrawerClose/DrawerClose.js +26 -0
- package/dist/components/drawer/DrawerClose/DrawerClose.js.map +1 -0
- package/dist/components/drawer/DrawerClose/index.d.ts +1 -0
- package/dist/components/drawer/DrawerContent/DrawerContent.d.ts +6 -0
- package/dist/components/drawer/DrawerContent/DrawerContent.js +103 -0
- package/dist/components/drawer/DrawerContent/DrawerContent.js.map +1 -0
- package/dist/components/drawer/DrawerContent/DrawerContent.styles.d.ts +10 -0
- package/dist/components/drawer/DrawerContent/DrawerContent.styles.js +25 -0
- package/dist/components/drawer/DrawerContent/DrawerContent.styles.js.map +1 -0
- package/dist/components/drawer/DrawerContent/DrawerContent.types.d.ts +2 -0
- package/dist/components/drawer/DrawerContent/index.d.ts +2 -0
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.d.ts +11 -0
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.js +56 -0
- package/dist/components/drawer/DrawerContent/useDrawerSwipe.js.map +1 -0
- package/dist/components/drawer/DrawerDescription/DrawerDescription.d.ts +2 -0
- package/dist/components/drawer/DrawerDescription/DrawerDescription.js +28 -0
- package/dist/components/drawer/DrawerDescription/DrawerDescription.js.map +1 -0
- package/dist/components/drawer/DrawerDescription/DrawerDescription.types.d.ts +2 -0
- package/dist/components/drawer/DrawerDescription/index.d.ts +2 -0
- package/dist/components/drawer/DrawerFooter/DrawerFooter.d.ts +2 -0
- package/dist/components/drawer/DrawerFooter/DrawerFooter.js +24 -0
- package/dist/components/drawer/DrawerFooter/DrawerFooter.js.map +1 -0
- package/dist/components/drawer/DrawerFooter/DrawerFooter.types.d.ts +2 -0
- package/dist/components/drawer/DrawerFooter/index.d.ts +2 -0
- package/dist/components/drawer/DrawerHeader/DrawerHeader.d.ts +2 -0
- package/dist/components/drawer/DrawerHeader/DrawerHeader.js +24 -0
- package/dist/components/drawer/DrawerHeader/DrawerHeader.js.map +1 -0
- package/dist/components/drawer/DrawerHeader/DrawerHeader.types.d.ts +2 -0
- package/dist/components/drawer/DrawerHeader/index.d.ts +2 -0
- package/dist/components/drawer/DrawerOverlay/DrawerOverlay.d.ts +3 -0
- package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js +43 -0
- package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js.map +1 -0
- package/dist/components/drawer/DrawerOverlay/DrawerOverlay.types.d.ts +2 -0
- package/dist/components/drawer/DrawerOverlay/index.d.ts +2 -0
- package/dist/components/drawer/DrawerPortal/DrawerPortal.d.ts +2 -0
- package/dist/components/drawer/DrawerPortal/DrawerPortal.js +10 -0
- package/dist/components/drawer/DrawerPortal/DrawerPortal.js.map +1 -0
- package/dist/components/drawer/DrawerPortal/DrawerPortal.types.d.ts +2 -0
- package/dist/components/drawer/DrawerPortal/index.d.ts +2 -0
- package/dist/components/drawer/DrawerSwipeHandle/DrawerSwipeHandle.d.ts +6 -0
- package/dist/components/drawer/DrawerSwipeHandle/DrawerSwipeHandle.js +27 -0
- package/dist/components/drawer/DrawerSwipeHandle/DrawerSwipeHandle.js.map +1 -0
- package/dist/components/drawer/DrawerSwipeHandle/DrawerSwipeHandle.types.d.ts +2 -0
- package/dist/components/drawer/DrawerSwipeHandle/index.d.ts +2 -0
- package/dist/components/drawer/DrawerTitle/DrawerTitle.d.ts +2 -0
- package/dist/components/drawer/DrawerTitle/DrawerTitle.js +28 -0
- package/dist/components/drawer/DrawerTitle/DrawerTitle.js.map +1 -0
- package/dist/components/drawer/DrawerTitle/DrawerTitle.types.d.ts +2 -0
- package/dist/components/drawer/DrawerTitle/index.d.ts +2 -0
- package/dist/components/drawer/DrawerTrigger/DrawerTrigger.d.ts +5 -0
- package/dist/components/drawer/DrawerTrigger/DrawerTrigger.js +38 -0
- package/dist/components/drawer/DrawerTrigger/DrawerTrigger.js.map +1 -0
- package/dist/components/drawer/DrawerTrigger/index.d.ts +1 -0
- package/dist/components/drawer/index.d.ts +20 -0
- package/dist/components/drawer/index.js +13 -0
- package/dist/components/hover-card/HoverCard/HoverCard.d.ts +7 -0
- package/dist/components/hover-card/HoverCard/HoverCard.js +47 -0
- package/dist/components/hover-card/HoverCard/HoverCard.js.map +1 -0
- package/dist/components/hover-card/HoverCard/index.d.ts +1 -0
- package/dist/components/hover-card/HoverCardContent/HoverCardContent.d.ts +6 -0
- package/dist/components/hover-card/HoverCardContent/HoverCardContent.js +74 -0
- package/dist/components/hover-card/HoverCardContent/HoverCardContent.js.map +1 -0
- package/dist/components/hover-card/HoverCardContent/index.d.ts +1 -0
- package/dist/components/hover-card/HoverCardContent/useHoverCardContent.d.ts +16 -0
- package/dist/components/hover-card/HoverCardContent/useHoverCardContent.js +58 -0
- package/dist/components/hover-card/HoverCardContent/useHoverCardContent.js.map +1 -0
- package/dist/components/hover-card/HoverCardTrigger/HoverCardTrigger.d.ts +4 -0
- package/dist/components/hover-card/HoverCardTrigger/HoverCardTrigger.js +40 -0
- package/dist/components/hover-card/HoverCardTrigger/HoverCardTrigger.js.map +1 -0
- package/dist/components/hover-card/HoverCardTrigger/index.d.ts +1 -0
- package/dist/components/hover-card/HoverCardTrigger/useHoverCardTrigger.d.ts +18 -0
- package/dist/components/hover-card/HoverCardTrigger/useHoverCardTrigger.js +34 -0
- package/dist/components/hover-card/HoverCardTrigger/useHoverCardTrigger.js.map +1 -0
- package/dist/components/hover-card/hover-card.context.d.ts +3 -0
- package/dist/components/hover-card/hover-card.context.js +12 -0
- package/dist/components/hover-card/hover-card.context.js.map +1 -0
- package/dist/components/hover-card/hover-card.types.d.ts +50 -0
- package/dist/components/hover-card/hover-card.utils.d.ts +6 -0
- package/dist/components/hover-card/index.d.ts +4 -0
- package/dist/components/hover-card/index.js +4 -0
- package/dist/components/marker/Marker/Marker.d.ts +7 -0
- package/dist/components/marker/Marker/Marker.js +35 -0
- package/dist/components/marker/Marker/Marker.js.map +1 -0
- package/dist/components/marker/Marker/Marker.styles.d.ts +3 -0
- package/dist/components/marker/Marker/Marker.styles.js +14 -0
- package/dist/components/marker/Marker/Marker.styles.js.map +1 -0
- package/dist/components/marker/Marker/Marker.types.d.ts +5 -0
- package/dist/components/marker/Marker/index.d.ts +3 -0
- package/dist/components/marker/MarkerContent/MarkerContent.d.ts +2 -0
- package/dist/components/marker/MarkerContent/MarkerContent.js +24 -0
- package/dist/components/marker/MarkerContent/MarkerContent.js.map +1 -0
- package/dist/components/marker/MarkerContent/MarkerContent.types.d.ts +2 -0
- package/dist/components/marker/MarkerContent/index.d.ts +2 -0
- package/dist/components/marker/MarkerIcon/MarkerIcon.d.ts +3 -0
- package/dist/components/marker/MarkerIcon/MarkerIcon.js +25 -0
- package/dist/components/marker/MarkerIcon/MarkerIcon.js.map +1 -0
- package/dist/components/marker/MarkerIcon/MarkerIcon.types.d.ts +2 -0
- package/dist/components/marker/MarkerIcon/index.d.ts +2 -0
- package/dist/components/marker/index.d.ts +6 -0
- package/dist/components/marker/index.js +5 -0
- package/dist/components/message/Message/Message.d.ts +3 -0
- package/dist/components/message/Message/Message.js +31 -0
- package/dist/components/message/Message/Message.js.map +1 -0
- package/dist/components/message/Message/Message.types.d.ts +5 -0
- package/dist/components/message/Message/index.d.ts +2 -0
- package/dist/components/message/MessageAvatar/MessageAvatar.d.ts +5 -0
- package/dist/components/message/MessageAvatar/MessageAvatar.js +24 -0
- package/dist/components/message/MessageAvatar/MessageAvatar.js.map +1 -0
- package/dist/components/message/MessageAvatar/MessageAvatar.types.d.ts +2 -0
- package/dist/components/message/MessageAvatar/index.d.ts +2 -0
- package/dist/components/message/MessageContent/MessageContent.d.ts +3 -0
- package/dist/components/message/MessageContent/MessageContent.js +24 -0
- package/dist/components/message/MessageContent/MessageContent.js.map +1 -0
- package/dist/components/message/MessageContent/MessageContent.types.d.ts +2 -0
- package/dist/components/message/MessageContent/index.d.ts +2 -0
- package/dist/components/message/MessageFooter/MessageFooter.d.ts +3 -0
- package/dist/components/message/MessageFooter/MessageFooter.js +24 -0
- package/dist/components/message/MessageFooter/MessageFooter.js.map +1 -0
- package/dist/components/message/MessageFooter/MessageFooter.types.d.ts +2 -0
- package/dist/components/message/MessageFooter/index.d.ts +2 -0
- package/dist/components/message/MessageGroup/MessageGroup.d.ts +3 -0
- package/dist/components/message/MessageGroup/MessageGroup.js +24 -0
- package/dist/components/message/MessageGroup/MessageGroup.js.map +1 -0
- package/dist/components/message/MessageGroup/MessageGroup.types.d.ts +2 -0
- package/dist/components/message/MessageGroup/index.d.ts +2 -0
- package/dist/components/message/MessageHeader/MessageHeader.d.ts +3 -0
- package/dist/components/message/MessageHeader/MessageHeader.js +24 -0
- package/dist/components/message/MessageHeader/MessageHeader.js.map +1 -0
- package/dist/components/message/MessageHeader/MessageHeader.types.d.ts +2 -0
- package/dist/components/message/MessageHeader/index.d.ts +2 -0
- package/dist/components/message/index.d.ts +12 -0
- package/dist/components/message/index.js +7 -0
- package/dist/components/message-scroller/MessageScroller/MessageScroller.d.ts +3 -0
- package/dist/components/message-scroller/MessageScroller/MessageScroller.js +35 -0
- package/dist/components/message-scroller/MessageScroller/MessageScroller.js.map +1 -0
- package/dist/components/message-scroller/MessageScroller/index.d.ts +1 -0
- package/dist/components/message-scroller/MessageScrollerButton/MessageScrollerButton.d.ts +6 -0
- package/dist/components/message-scroller/MessageScrollerButton/MessageScrollerButton.js +90 -0
- package/dist/components/message-scroller/MessageScrollerButton/MessageScrollerButton.js.map +1 -0
- package/dist/components/message-scroller/MessageScrollerButton/index.d.ts +1 -0
- package/dist/components/message-scroller/MessageScrollerContent/MessageScrollerContent.d.ts +6 -0
- package/dist/components/message-scroller/MessageScrollerContent/MessageScrollerContent.js +46 -0
- package/dist/components/message-scroller/MessageScrollerContent/MessageScrollerContent.js.map +1 -0
- package/dist/components/message-scroller/MessageScrollerContent/index.d.ts +1 -0
- package/dist/components/message-scroller/MessageScrollerItem/MessageScrollerItem.d.ts +6 -0
- package/dist/components/message-scroller/MessageScrollerItem/MessageScrollerItem.js +42 -0
- package/dist/components/message-scroller/MessageScrollerItem/MessageScrollerItem.js.map +1 -0
- package/dist/components/message-scroller/MessageScrollerItem/index.d.ts +1 -0
- package/dist/components/message-scroller/MessageScrollerProvider/MessageScrollerProvider.d.ts +4 -0
- package/dist/components/message-scroller/MessageScrollerProvider/MessageScrollerProvider.js +37 -0
- package/dist/components/message-scroller/MessageScrollerProvider/MessageScrollerProvider.js.map +1 -0
- package/dist/components/message-scroller/MessageScrollerProvider/index.d.ts +1 -0
- package/dist/components/message-scroller/MessageScrollerViewport/MessageScrollerViewport.d.ts +6 -0
- package/dist/components/message-scroller/MessageScrollerViewport/MessageScrollerViewport.js +55 -0
- package/dist/components/message-scroller/MessageScrollerViewport/MessageScrollerViewport.js.map +1 -0
- package/dist/components/message-scroller/MessageScrollerViewport/index.d.ts +1 -0
- package/dist/components/message-scroller/index.d.ts +10 -0
- package/dist/components/message-scroller/index.js +10 -0
- package/dist/components/message-scroller/message-scroller.context.d.ts +3 -0
- package/dist/components/message-scroller/message-scroller.context.js +12 -0
- package/dist/components/message-scroller/message-scroller.context.js.map +1 -0
- package/dist/components/message-scroller/message-scroller.types.d.ts +92 -0
- package/dist/components/message-scroller/message-scroller.utils.d.ts +7 -0
- package/dist/components/message-scroller/message-scroller.utils.js +9 -0
- package/dist/components/message-scroller/message-scroller.utils.js.map +1 -0
- package/dist/components/message-scroller/useMessageScroller.d.ts +6 -0
- package/dist/components/message-scroller/useMessageScroller.js +14 -0
- package/dist/components/message-scroller/useMessageScroller.js.map +1 -0
- package/dist/components/message-scroller/useMessageScrollerEngine.d.ts +15 -0
- package/dist/components/message-scroller/useMessageScrollerEngine.js +375 -0
- package/dist/components/message-scroller/useMessageScrollerEngine.js.map +1 -0
- package/dist/components/message-scroller/useMessageScrollerScrollable.d.ts +5 -0
- package/dist/components/message-scroller/useMessageScrollerScrollable.js +13 -0
- package/dist/components/message-scroller/useMessageScrollerScrollable.js.map +1 -0
- package/dist/components/message-scroller/useMessageScrollerVisibility.d.ts +7 -0
- package/dist/components/message-scroller/useMessageScrollerVisibility.js +17 -0
- package/dist/components/message-scroller/useMessageScrollerVisibility.js.map +1 -0
- package/dist/components/popover/PopoverContent/PopoverContent.utils.d.ts +6 -13
- package/dist/components/popover/PopoverContent/PopoverContent.utils.js +7 -30
- package/dist/components/popover/PopoverContent/PopoverContent.utils.js.map +1 -1
- package/dist/components/questionnaire/Questionnaire/Questionnaire.d.ts +3 -0
- package/dist/components/questionnaire/Questionnaire/Questionnaire.js +68 -0
- package/dist/components/questionnaire/Questionnaire/Questionnaire.js.map +1 -0
- package/dist/components/questionnaire/Questionnaire/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireActions/QuestionnaireActions.d.ts +3 -0
- package/dist/components/questionnaire/QuestionnaireActions/QuestionnaireActions.js +24 -0
- package/dist/components/questionnaire/QuestionnaireActions/QuestionnaireActions.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireActions/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireChoice/QuestionnaireChoice.d.ts +3 -0
- package/dist/components/questionnaire/QuestionnaireChoice/QuestionnaireChoice.js +99 -0
- package/dist/components/questionnaire/QuestionnaireChoice/QuestionnaireChoice.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireChoice/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.d.ts +38 -0
- package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js +67 -0
- package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireChoices/QuestionnaireChoices.d.ts +3 -0
- package/dist/components/questionnaire/QuestionnaireChoices/QuestionnaireChoices.js +28 -0
- package/dist/components/questionnaire/QuestionnaireChoices/QuestionnaireChoices.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireChoices/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireDescription/QuestionnaireDescription.d.ts +4 -0
- package/dist/components/questionnaire/QuestionnaireDescription/QuestionnaireDescription.js +30 -0
- package/dist/components/questionnaire/QuestionnaireDescription/QuestionnaireDescription.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireDescription/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireError/QuestionnaireError.d.ts +4 -0
- package/dist/components/questionnaire/QuestionnaireError/QuestionnaireError.js +43 -0
- package/dist/components/questionnaire/QuestionnaireError/QuestionnaireError.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireError/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireInput/QuestionnaireInput.d.ts +3 -0
- package/dist/components/questionnaire/QuestionnaireInput/QuestionnaireInput.js +78 -0
- package/dist/components/questionnaire/QuestionnaireInput/QuestionnaireInput.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireInput/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.d.ts +37 -0
- package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js +58 -0
- package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.d.ts +3 -0
- package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js +89 -0
- package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireItem/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireNavigation/QuestionnaireNavigation.d.ts +5 -0
- package/dist/components/questionnaire/QuestionnaireNavigation/QuestionnaireNavigation.js +104 -0
- package/dist/components/questionnaire/QuestionnaireNavigation/QuestionnaireNavigation.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireNavigation/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireProgress/QuestionnaireProgress.d.ts +4 -0
- package/dist/components/questionnaire/QuestionnaireProgress/QuestionnaireProgress.js +62 -0
- package/dist/components/questionnaire/QuestionnaireProgress/QuestionnaireProgress.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireProgress/index.d.ts +1 -0
- package/dist/components/questionnaire/QuestionnaireTitle/QuestionnaireTitle.d.ts +4 -0
- package/dist/components/questionnaire/QuestionnaireTitle/QuestionnaireTitle.js +27 -0
- package/dist/components/questionnaire/QuestionnaireTitle/QuestionnaireTitle.js.map +1 -0
- package/dist/components/questionnaire/QuestionnaireTitle/index.d.ts +1 -0
- package/dist/components/questionnaire/index.d.ts +12 -0
- package/dist/components/questionnaire/index.js +12 -0
- package/dist/components/questionnaire/questionnaire.context.d.ts +65 -0
- package/dist/components/questionnaire/questionnaire.context.js +18 -0
- package/dist/components/questionnaire/questionnaire.context.js.map +1 -0
- package/dist/components/questionnaire/questionnaire.types.d.ts +82 -0
- package/dist/components/questionnaire/questionnaire.utils.d.ts +24 -0
- package/dist/components/questionnaire/questionnaire.utils.js +38 -0
- package/dist/components/questionnaire/questionnaire.utils.js.map +1 -0
- package/dist/components/questionnaire/useQuestionnaireItem.d.ts +34 -0
- package/dist/components/questionnaire/useQuestionnaireItem.js +141 -0
- package/dist/components/questionnaire/useQuestionnaireItem.js.map +1 -0
- package/dist/components/questionnaire/useQuestionnaireRoot.d.ts +30 -0
- package/dist/components/questionnaire/useQuestionnaireRoot.js +144 -0
- package/dist/components/questionnaire/useQuestionnaireRoot.js.map +1 -0
- package/dist/components/resizable/ResizableHandle/ResizableHandle.d.ts +6 -0
- package/dist/components/resizable/ResizableHandle/ResizableHandle.js +92 -0
- package/dist/components/resizable/ResizableHandle/ResizableHandle.js.map +1 -0
- package/dist/components/resizable/ResizableHandle/ResizableHandle.styles.d.ts +3 -0
- package/dist/components/resizable/ResizableHandle/ResizableHandle.styles.js +6 -0
- package/dist/components/resizable/ResizableHandle/ResizableHandle.styles.js.map +1 -0
- package/dist/components/resizable/ResizableHandle/index.d.ts +1 -0
- package/dist/components/resizable/ResizableHandle/useResizableHandle.d.ts +17 -0
- package/dist/components/resizable/ResizableHandle/useResizableHandle.js +72 -0
- package/dist/components/resizable/ResizableHandle/useResizableHandle.js.map +1 -0
- package/dist/components/resizable/ResizablePanel/ResizablePanel.d.ts +6 -0
- package/dist/components/resizable/ResizablePanel/ResizablePanel.js +91 -0
- package/dist/components/resizable/ResizablePanel/ResizablePanel.js.map +1 -0
- package/dist/components/resizable/ResizablePanel/index.d.ts +1 -0
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.d.ts +6 -0
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js +66 -0
- package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js.map +1 -0
- package/dist/components/resizable/ResizablePanelGroup/index.d.ts +1 -0
- package/dist/components/resizable/index.d.ts +4 -0
- package/dist/components/resizable/index.js +4 -0
- package/dist/components/resizable/resizable.context.d.ts +38 -0
- package/dist/components/resizable/resizable.context.js +12 -0
- package/dist/components/resizable/resizable.context.js.map +1 -0
- package/dist/components/resizable/resizable.types.d.ts +76 -0
- package/dist/components/resizable/resizable.utils.d.ts +16 -0
- package/dist/components/resizable/resizable.utils.js +45 -0
- package/dist/components/resizable/resizable.utils.js.map +1 -0
- package/dist/components/resizable/useResizablePanelGroup.d.ts +22 -0
- package/dist/components/resizable/useResizablePanelGroup.js +176 -0
- package/dist/components/resizable/useResizablePanelGroup.js.map +1 -0
- package/dist/components/scroll-arrows/ScrollArrowButton.d.ts +7 -4
- package/dist/components/scroll-arrows/ScrollArrowButton.js +28 -19
- package/dist/components/scroll-arrows/ScrollArrowButton.js.map +1 -1
- package/dist/components/scroll-arrows/ScrollArrows.d.ts +5 -2
- package/dist/components/scroll-arrows/ScrollArrows.js +6 -0
- package/dist/components/scroll-arrows/ScrollArrows.js.map +1 -1
- package/dist/components/scroll-arrows/ScrollArrows.types.d.ts +7 -0
- package/dist/components/sheet/Sheet/Sheet.d.ts +6 -0
- package/dist/components/sheet/Sheet/Sheet.js +10 -0
- package/dist/components/sheet/Sheet/Sheet.js.map +1 -0
- package/dist/components/sheet/Sheet/index.d.ts +1 -0
- package/dist/components/sheet/SheetClose/SheetClose.d.ts +6 -0
- package/dist/components/sheet/SheetClose/SheetClose.js +39 -0
- package/dist/components/sheet/SheetClose/SheetClose.js.map +1 -0
- package/dist/components/sheet/SheetClose/index.d.ts +1 -0
- package/dist/components/sheet/SheetContent/SheetContent.d.ts +6 -0
- package/dist/components/sheet/SheetContent/SheetContent.js +48 -0
- package/dist/components/sheet/SheetContent/SheetContent.js.map +1 -0
- package/dist/components/sheet/SheetContent/SheetContent.styles.d.ts +10 -0
- package/dist/components/sheet/SheetContent/SheetContent.styles.js +17 -0
- package/dist/components/sheet/SheetContent/SheetContent.styles.js.map +1 -0
- package/dist/components/sheet/SheetContent/index.d.ts +1 -0
- package/dist/components/sheet/SheetDescription/SheetDescription.d.ts +2 -0
- package/dist/components/sheet/SheetDescription/SheetDescription.js +25 -0
- package/dist/components/sheet/SheetDescription/SheetDescription.js.map +1 -0
- package/dist/components/sheet/SheetDescription/SheetDescription.styles.d.ts +1 -0
- package/dist/components/sheet/SheetDescription/SheetDescription.styles.js +6 -0
- package/dist/components/sheet/SheetDescription/SheetDescription.styles.js.map +1 -0
- package/dist/components/sheet/SheetDescription/index.d.ts +1 -0
- package/dist/components/sheet/SheetFooter/SheetFooter.d.ts +2 -0
- package/dist/components/sheet/SheetFooter/SheetFooter.js +24 -0
- package/dist/components/sheet/SheetFooter/SheetFooter.js.map +1 -0
- package/dist/components/sheet/SheetFooter/index.d.ts +1 -0
- package/dist/components/sheet/SheetHeader/SheetHeader.d.ts +2 -0
- package/dist/components/sheet/SheetHeader/SheetHeader.js +24 -0
- package/dist/components/sheet/SheetHeader/SheetHeader.js.map +1 -0
- package/dist/components/sheet/SheetHeader/index.d.ts +1 -0
- package/dist/components/sheet/SheetTitle/SheetTitle.d.ts +3 -0
- package/dist/components/sheet/SheetTitle/SheetTitle.js +25 -0
- package/dist/components/sheet/SheetTitle/SheetTitle.js.map +1 -0
- package/dist/components/sheet/SheetTitle/SheetTitle.styles.d.ts +1 -0
- package/dist/components/sheet/SheetTitle/SheetTitle.styles.js +6 -0
- package/dist/components/sheet/SheetTitle/SheetTitle.styles.js.map +1 -0
- package/dist/components/sheet/SheetTitle/index.d.ts +1 -0
- package/dist/components/sheet/SheetTrigger/SheetTrigger.d.ts +8 -0
- package/dist/components/sheet/SheetTrigger/SheetTrigger.js +32 -0
- package/dist/components/sheet/SheetTrigger/SheetTrigger.js.map +1 -0
- package/dist/components/sheet/SheetTrigger/index.d.ts +1 -0
- package/dist/components/sheet/index.d.ts +9 -0
- package/dist/components/sheet/index.js +9 -0
- package/dist/components/sheet/sheet.types.d.ts +19 -0
- package/dist/components/tooltip/TooltipContent/TooltipContent.js +1 -1
- package/dist/components/tooltip/TooltipContent/TooltipContent.utils.d.ts +5 -49
- package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js +10 -39
- package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js.map +1 -1
- package/dist/components/tooltip/TooltipContent/useTooltipContent.js +6 -5
- package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
- package/dist/hooks/useScrollEdges.d.ts +3 -0
- package/dist/hooks/useScrollEdges.js +18 -16
- package/dist/hooks/useScrollEdges.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +253 -193
- package/dist/lib/positioner/index.d.ts +1 -0
- package/dist/lib/positioner/utils/floating.d.ts +25 -0
- package/dist/lib/positioner/utils/floating.js +42 -0
- package/dist/lib/positioner/utils/floating.js.map +1 -0
- package/dist/ui.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { JSX, ParentProps, ValidComponent } from 'solid-js';
|
|
2
|
+
import { ButtonProps } from '../button';
|
|
3
|
+
import { BaseProps, PolymorphicProps } from '../../types';
|
|
4
|
+
export type QuestionnaireItemStatus = "unanswered" | "answered" | "skipped";
|
|
5
|
+
export type QuestionnaireShortcutMode = "letters" | "numbers";
|
|
6
|
+
export interface QuestionnaireChoiceDefinition {
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
value: string;
|
|
9
|
+
}
|
|
10
|
+
export interface QuestionnaireItemDefinition {
|
|
11
|
+
choices?: readonly QuestionnaireChoiceDefinition[];
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
name: string;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface QuestionnaireRootState {
|
|
17
|
+
current: number;
|
|
18
|
+
first: boolean;
|
|
19
|
+
last: boolean;
|
|
20
|
+
total: number;
|
|
21
|
+
}
|
|
22
|
+
interface BaseQuestionnaireProps extends BaseProps, ParentProps {
|
|
23
|
+
/** 初始激活项 */
|
|
24
|
+
defaultItem?: string;
|
|
25
|
+
/** 受控激活项;不传则由内部导航 */
|
|
26
|
+
item?: string;
|
|
27
|
+
/** 题目定义:提供后用于按定义顺序分配快捷键、校验名/required 一致性 */
|
|
28
|
+
items?: readonly QuestionnaireItemDefinition[];
|
|
29
|
+
onItemChange?: (item: string) => void;
|
|
30
|
+
/** 答案快捷键模式 */
|
|
31
|
+
shortcuts?: QuestionnaireShortcutMode;
|
|
32
|
+
/** 默认 true,关闭浏览器原生校验并走组件校验 */
|
|
33
|
+
noValidate?: boolean;
|
|
34
|
+
onReset?: (event: Event) => void;
|
|
35
|
+
onSubmit?: (event: SubmitEvent) => void;
|
|
36
|
+
}
|
|
37
|
+
export type QuestionnaireProps = PolymorphicProps<"form", BaseQuestionnaireProps, false>;
|
|
38
|
+
export type QuestionnaireProgressProps = PolymorphicProps<"div", BaseProps & {
|
|
39
|
+
children?: JSX.Element | ((state: QuestionnaireRootState) => JSX.Element);
|
|
40
|
+
}, false>;
|
|
41
|
+
export type QuestionnaireItemProps = PolymorphicProps<"fieldset", BaseProps & {
|
|
42
|
+
name: string;
|
|
43
|
+
required?: boolean;
|
|
44
|
+
multiple?: boolean;
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
invalid?: boolean;
|
|
47
|
+
onStatusChange?: (status: QuestionnaireItemStatus) => void;
|
|
48
|
+
"aria-labelledby"?: string;
|
|
49
|
+
}, false>;
|
|
50
|
+
export type QuestionnaireTitleProps<T extends ValidComponent = "legend"> = PolymorphicProps<T, BaseProps & {
|
|
51
|
+
id?: string;
|
|
52
|
+
children?: JSX.Element;
|
|
53
|
+
}>;
|
|
54
|
+
export type QuestionnaireDescriptionProps<T extends ValidComponent = "p"> = PolymorphicProps<T, BaseProps & {
|
|
55
|
+
id?: string;
|
|
56
|
+
children?: JSX.Element;
|
|
57
|
+
}>;
|
|
58
|
+
export type QuestionnaireChoicesProps = PolymorphicProps<"div", BaseProps, false>;
|
|
59
|
+
export type QuestionnaireChoiceProps = PolymorphicProps<"label", BaseProps & {
|
|
60
|
+
value: string;
|
|
61
|
+
checked?: boolean;
|
|
62
|
+
defaultChecked?: boolean;
|
|
63
|
+
disabled?: boolean;
|
|
64
|
+
onChange?: (event: Event) => void;
|
|
65
|
+
}, false>;
|
|
66
|
+
export type QuestionnaireInputType = "date" | "datetime-local" | "email" | "month" | "number" | "password" | "search" | "tel" | "text" | "time" | "url" | "week";
|
|
67
|
+
export type QuestionnaireInputProps = PolymorphicProps<"input", BaseProps & {
|
|
68
|
+
type?: QuestionnaireInputType;
|
|
69
|
+
defaultValue?: string;
|
|
70
|
+
value?: string;
|
|
71
|
+
disabled?: boolean;
|
|
72
|
+
onChange?: (event: Event) => void;
|
|
73
|
+
}, false>;
|
|
74
|
+
export type QuestionnaireErrorProps<T extends ValidComponent = "p"> = PolymorphicProps<T, BaseProps & {
|
|
75
|
+
id?: string;
|
|
76
|
+
children?: JSX.Element;
|
|
77
|
+
}>;
|
|
78
|
+
export type QuestionnaireNavigationProps = PolymorphicProps<"button", BaseProps & {
|
|
79
|
+
variant?: ButtonProps<"button">["variant"];
|
|
80
|
+
size?: ButtonProps<"button">["size"];
|
|
81
|
+
}, false>;
|
|
82
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { QuestionnaireShortcutMode } from './questionnaire.types';
|
|
2
|
+
/** 字符串/数组是否含有非空白内容(与上游 ce 一致) */
|
|
3
|
+
export declare function hasText(value: unknown): boolean;
|
|
4
|
+
/** 按模式生成快捷键字母表:letters = A..Z,numbers = 1..9 */
|
|
5
|
+
export declare function shortcutAlphabet(mode: QuestionnaireShortcutMode | null): string[];
|
|
6
|
+
/** 把按下的键规范成快捷键(字母大小写无关),不匹配返回 null */
|
|
7
|
+
export declare function normalizeShortcut(key: string, mode: QuestionnaireShortcutMode | null): string | null;
|
|
8
|
+
/** 拼 aria-keyshortcuts:有启用状态时额外附上 Enter */
|
|
9
|
+
export declare function keyShortcutText(shortcut: string | null, enterEnabled: boolean): string | undefined;
|
|
10
|
+
/** 判断答案控件当前是否有值(choice 看 checked,input 看 name+value) */
|
|
11
|
+
export declare function isAnswerFilled(entry: {
|
|
12
|
+
type: "choice" | "input";
|
|
13
|
+
element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;
|
|
14
|
+
}): boolean;
|
|
15
|
+
/** 文本类输入框为空(用于原生校验) */
|
|
16
|
+
export declare function isTextInputEmpty(entry: {
|
|
17
|
+
type: "choice" | "input";
|
|
18
|
+
element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;
|
|
19
|
+
}): boolean;
|
|
20
|
+
/** 是否为可输入文本的控件(用于决定方向键是否应当导航而非移动焦点) */
|
|
21
|
+
export declare function isTypingElement(element: EventTarget | null): boolean;
|
|
22
|
+
export declare function isNativeRadio(element: EventTarget | null): boolean;
|
|
23
|
+
/** 按文档顺序比较两个元素 */
|
|
24
|
+
export declare function compareDocumentOrder(a: Element, b: Element): number;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/components/questionnaire/questionnaire.utils.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
return Array.isArray(e) ? e.some((e) => String(e).trim().length > 0) : e != null && String(e).trim().length > 0;
|
|
4
|
+
}
|
|
5
|
+
function t(e) {
|
|
6
|
+
return e === "letters" ? Array.from({ length: 26 }, (e, t) => String.fromCharCode(65 + t)) : e === "numbers" ? Array.from({ length: 9 }, (e, t) => String(t + 1)) : [];
|
|
7
|
+
}
|
|
8
|
+
function n(e, n) {
|
|
9
|
+
let r = n === "letters" ? e.toUpperCase() : e;
|
|
10
|
+
return t(n).includes(r) ? r : null;
|
|
11
|
+
}
|
|
12
|
+
function r(e, t) {
|
|
13
|
+
return [e, t ? "Enter" : null].filter(Boolean).join(" ") || void 0;
|
|
14
|
+
}
|
|
15
|
+
function i(t) {
|
|
16
|
+
return t.type === "choice" ? t.element.checked : t.element.hasAttribute("name") && e(t.element.value);
|
|
17
|
+
}
|
|
18
|
+
function a(e) {
|
|
19
|
+
return e instanceof HTMLTextAreaElement || e instanceof HTMLSelectElement ? !0 : e instanceof HTMLInputElement ? ![
|
|
20
|
+
"button",
|
|
21
|
+
"checkbox",
|
|
22
|
+
"radio",
|
|
23
|
+
"reset",
|
|
24
|
+
"submit"
|
|
25
|
+
].includes(e.type) : e instanceof HTMLElement && e.isContentEditable;
|
|
26
|
+
}
|
|
27
|
+
function o(e) {
|
|
28
|
+
return e instanceof HTMLInputElement && e.type === "radio";
|
|
29
|
+
}
|
|
30
|
+
function s(e, t) {
|
|
31
|
+
if (e === t) return 0;
|
|
32
|
+
let n = e.compareDocumentPosition(t);
|
|
33
|
+
return n & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : n & Node.DOCUMENT_POSITION_PRECEDING ? 1 : 0;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { s as compareDocumentOrder, e as hasText, i as isAnswerFilled, o as isNativeRadio, a as isTypingElement, r as keyShortcutText, n as normalizeShortcut, t as shortcutAlphabet };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=questionnaire.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questionnaire.utils.js","names":["hasText","value","item","shortcutAlphabet","mode","index","normalizeShortcut","normalized","key","keyShortcutText","shortcut","enterEnabled","isAnswerFilled","entry","isTypingElement","element","isNativeRadio","compareDocumentOrder","a","b","position"],"sources":["../../../src/components/questionnaire/questionnaire.utils.ts"],"sourcesContent":["import type { QuestionnaireShortcutMode } from \"./questionnaire.types\";\n\n/** 字符串/数组是否含有非空白内容(与上游 ce 一致) */\nexport function hasText(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.some((item) => String(item).trim().length > 0);\n }\n return value != null && String(value).trim().length > 0;\n}\n\n/** 按模式生成快捷键字母表:letters = A..Z,numbers = 1..9 */\nexport function shortcutAlphabet(\n mode: QuestionnaireShortcutMode | null,\n): string[] {\n if (mode === \"letters\") {\n return Array.from({ length: 26 }, (_, index) =>\n String.fromCharCode(65 + index),\n );\n }\n if (mode === \"numbers\") {\n return Array.from({ length: 9 }, (_, index) => String(index + 1));\n }\n return [];\n}\n\n/** 把按下的键规范成快捷键(字母大小写无关),不匹配返回 null */\nexport function normalizeShortcut(\n key: string,\n mode: QuestionnaireShortcutMode | null,\n): string | null {\n const normalized = mode === \"letters\" ? key.toUpperCase() : key;\n return shortcutAlphabet(mode).includes(normalized) ? normalized : null;\n}\n\n/** 拼 aria-keyshortcuts:有启用状态时额外附上 Enter */\nexport function keyShortcutText(\n shortcut: string | null,\n enterEnabled: boolean,\n): string | undefined {\n return (\n [shortcut, enterEnabled ? \"Enter\" : null].filter(Boolean).join(\" \") ||\n undefined\n );\n}\n\n/** 判断答案控件当前是否有值(choice 看 checked,input 看 name+value) */\nexport function isAnswerFilled(entry: {\n type: \"choice\" | \"input\";\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n}): boolean {\n if (entry.type === \"choice\") {\n return (entry.element as HTMLInputElement).checked;\n }\n return entry.element.hasAttribute(\"name\") && hasText(entry.element.value);\n}\n\n/** 文本类输入框为空(用于原生校验) */\nexport function isTextInputEmpty(entry: {\n type: \"choice\" | \"input\";\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n}): boolean {\n return (\n entry.type === \"input\" &&\n [\"email\", \"password\", \"search\", \"tel\", \"text\", \"url\"].includes(\n entry.element.type,\n ) &&\n !hasText(entry.element.value)\n );\n}\n\n/** 是否为可输入文本的控件(用于决定方向键是否应当导航而非移动焦点) */\nexport function isTypingElement(element: EventTarget | null): boolean {\n if (element instanceof HTMLTextAreaElement) return true;\n if (element instanceof HTMLSelectElement) return true;\n if (element instanceof HTMLInputElement) {\n return ![\"button\", \"checkbox\", \"radio\", \"reset\", \"submit\"].includes(\n element.type,\n );\n }\n return element instanceof HTMLElement && element.isContentEditable;\n}\n\nexport function isNativeRadio(element: EventTarget | null): boolean {\n return element instanceof HTMLInputElement && element.type === \"radio\";\n}\n\n/** 按文档顺序比较两个元素 */\nexport function compareDocumentOrder(a: Element, b: Element): number {\n if (a === b) return 0;\n const position = a.compareDocumentPosition(b);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;\n return 0;\n}\n"],"mappings":";AAGA,SAAgBA,EAAQ,GAAyB;CAI/C,OAHI,MAAM,QAAQC,CAAK,IACdA,EAAM,MAAM,MAAS,OAAOC,CAAI,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,IAErDD,KAAS,QAAQ,OAAOA,CAAK,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS;AACxD;AAGA,SAAgBE,EACd,GACU;CASV,OARIC,MAAS,YACJ,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MACpC,OAAO,aAAa,KAAKC,CAAK,CAChC,IAEED,MAAS,YACJ,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAU,OAAOC,IAAQ,CAAC,CAAC,IAE3D,CAAC;AACV;AAGA,SAAgBC,EACd,GACA,GACe;CACf,IAAMC,IAAaH,MAAS,YAAYI,EAAI,YAAY,IAAIA;CAC5D,OAAOL,EAAiBC,CAAI,CAAC,CAAC,SAASG,CAAU,IAAIA,IAAa;AACpE;AAGA,SAAgBE,EACd,GACA,GACoB;CACpB,OACE,CAACC,GAAUC,IAAe,UAAU,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAClE,KAAA;AAEJ;AAGA,SAAgBC,EAAe,GAGnB;CAIV,OAHIC,EAAM,SAAS,WACTA,EAAM,QAA6B,UAEtCA,EAAM,QAAQ,aAAa,MAAM,KAAKb,EAAQa,EAAM,QAAQ,KAAK;AAC1E;AAiBA,SAAgBC,EAAgB,GAAsC;CAQpE,OAPIC,aAAmB,uBACnBA,aAAmB,oBAA0B,KAC7CA,aAAmB,mBACd,CAAC;EAAC;EAAU;EAAY;EAAS;EAAS;CAAQ,CAAC,CAAC,SACzDA,EAAQ,IACV,IAEKA,aAAmB,eAAeA,EAAQ;AACnD;AAEA,SAAgBC,EAAc,GAAsC;CAClE,OAAOD,aAAmB,oBAAoBA,EAAQ,SAAS;AACjE;AAGA,SAAgBE,EAAqB,GAAY,GAAoB;CACnE,IAAIC,MAAMC,GAAG,OAAO;CACpB,IAAMC,IAAWF,EAAE,wBAAwBC,CAAC;CAG5C,OAFIC,IAAW,KAAK,8BAAoC,KACpDA,IAAW,KAAK,8BAAoC,IACjD;AACT"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Accessor } from 'solid-js';
|
|
2
|
+
import { QuestionnaireItemContextValue } from './questionnaire.context';
|
|
3
|
+
import { QuestionnaireItemStatus } from './questionnaire.types';
|
|
4
|
+
interface Options {
|
|
5
|
+
name: string;
|
|
6
|
+
required: Accessor<boolean>;
|
|
7
|
+
multiple: Accessor<boolean>;
|
|
8
|
+
disabled: Accessor<boolean>;
|
|
9
|
+
invalid: Accessor<boolean>;
|
|
10
|
+
onStatusChange?: (status: QuestionnaireItemStatus) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface QuestionnaireItemDomProps {
|
|
13
|
+
"aria-describedby": string | undefined;
|
|
14
|
+
"aria-invalid": boolean | undefined;
|
|
15
|
+
"aria-keyshortcuts": string | undefined;
|
|
16
|
+
disabled: boolean;
|
|
17
|
+
hidden: boolean;
|
|
18
|
+
inert: boolean;
|
|
19
|
+
tabIndex: number;
|
|
20
|
+
}
|
|
21
|
+
export interface UseQuestionnaireItemResult {
|
|
22
|
+
context: QuestionnaireItemContextValue;
|
|
23
|
+
/** 反应式:每次读取都根据当前 active/invalid 重新计算 */
|
|
24
|
+
itemProps: () => QuestionnaireItemDomProps;
|
|
25
|
+
describedBy: () => string | undefined;
|
|
26
|
+
keyshortcuts: () => string | undefined;
|
|
27
|
+
/** 在 fieldset 的 ref 里调用:登记 DOM 元素并把句柄注册到 Root */
|
|
28
|
+
registerElement: (element: HTMLElement) => () => void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 单个题目的状态:答案注册与选中、跳过、校验、快捷键,以及给 Root 的句柄。
|
|
32
|
+
*/
|
|
33
|
+
export declare function useQuestionnaireItem(options: Options): UseQuestionnaireItemResult;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { useQuestionnaireRootContext as e } from "./questionnaire.context.js";
|
|
2
|
+
import { isAnswerFilled as t, isNativeRadio as n, isTypingElement as r, shortcutAlphabet as i } from "./questionnaire.utils.js";
|
|
3
|
+
import { createMemo as a, createSignal as o } from "solid-js";
|
|
4
|
+
//#region src/components/questionnaire/useQuestionnaireItem.ts
|
|
5
|
+
function s(s) {
|
|
6
|
+
let c = e("QuestionnaireItem"), [l, u] = o(), [d, f] = o([]), [p, m] = o([]), [h, g] = o([]), [_, v] = o(!1), [y, b] = o(!1), [x, S] = o(0), [C, w] = o([]), [T, E] = o([]), D = a(() => c.activeItemName() === s.name), O = (e) => (f((t) => [...t.filter((t) => t.id !== e.id && t.element !== e.element), e]), () => f((t) => t.filter((t) => t !== e))), k = (e, t) => {
|
|
7
|
+
m((n) => t ? s.multiple() ? n.includes(e) ? n : [...n, e] : [e] : n.filter((t) => t !== e));
|
|
8
|
+
}, A = (e, t) => (t && m((t) => s.multiple() ? t.includes(e) ? t : [...t, e] : t.length ? t : [e]), () => {
|
|
9
|
+
m((t) => t.filter((t) => t !== e)), g((t) => t.filter((t) => t !== e));
|
|
10
|
+
}), j = (e, t) => {
|
|
11
|
+
g((n) => t ? n.includes(e) ? n : [...n, e] : n.filter((t) => t !== e));
|
|
12
|
+
}, M = (e, t) => {
|
|
13
|
+
v(!1), k(e, t);
|
|
14
|
+
}, N = (e, t) => {
|
|
15
|
+
k(e, t);
|
|
16
|
+
}, P = (e) => e.disabled || e.element.disabled, F = a(() => d().some((e) => e.type === "input" && ![
|
|
17
|
+
"button",
|
|
18
|
+
"checkbox",
|
|
19
|
+
"radio",
|
|
20
|
+
"reset",
|
|
21
|
+
"submit"
|
|
22
|
+
].includes(e.element.type))), I = a(() => {
|
|
23
|
+
if (_()) return "skipped";
|
|
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);
|
|
35
|
+
return !e || (e.element.focus(), e.element.reportValidity(), !1);
|
|
36
|
+
}, H = () => {
|
|
37
|
+
s.required() || (m([]), v(!0));
|
|
38
|
+
}, U = () => {
|
|
39
|
+
b(!1), v(!1), m(s.multiple() ? [...h()] : h().slice(0, 1)), S((e) => e + 1);
|
|
40
|
+
}, W = (e) => d().find((t) => t.element === e) ?? null, G = a(() => {
|
|
41
|
+
let e = c.shortcuts(), t = c.itemDefinitions()?.get(s.name);
|
|
42
|
+
if (!e || !t?.choices) return null;
|
|
43
|
+
let n = i(e), r = /* @__PURE__ */ new Map(), a = 0;
|
|
44
|
+
for (let e of t.choices) {
|
|
45
|
+
if (e.disabled) continue;
|
|
46
|
+
let t = n[a];
|
|
47
|
+
if (!t) break;
|
|
48
|
+
r.set(e.value, t), a += 1;
|
|
49
|
+
}
|
|
50
|
+
return r;
|
|
51
|
+
}), K = a(() => {
|
|
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
|
+
};
|
|
83
|
+
return {
|
|
84
|
+
context: {
|
|
85
|
+
name: s.name,
|
|
86
|
+
active: D,
|
|
87
|
+
disabled: s.disabled,
|
|
88
|
+
invalid: z,
|
|
89
|
+
multiple: s.multiple,
|
|
90
|
+
required: s.required,
|
|
91
|
+
status: I,
|
|
92
|
+
hasInputAnswer: F,
|
|
93
|
+
selectedAnswerIds: p,
|
|
94
|
+
resetVersion: x,
|
|
95
|
+
shortcutByAnswerId: K,
|
|
96
|
+
shortcutByChoiceValue: G,
|
|
97
|
+
shortcuts: c.shortcuts,
|
|
98
|
+
registerAnswerControl: O,
|
|
99
|
+
registerAnswerSelection: A,
|
|
100
|
+
registerDescription: (e) => (w((t) => t.includes(e) ? t : [...t, e]), () => w((t) => t.filter((t) => t !== e))),
|
|
101
|
+
registerError: (e) => (E((t) => t.includes(e) ? t : [...t, e]), () => E((t) => t.filter((t) => t !== e))),
|
|
102
|
+
setAnswerDefault: j,
|
|
103
|
+
setAnswerSelectionFromInteraction: M,
|
|
104
|
+
syncControlledAnswerSelection: N
|
|
105
|
+
},
|
|
106
|
+
itemProps: () => ({
|
|
107
|
+
"aria-describedby": Y(),
|
|
108
|
+
"aria-invalid": z() || void 0,
|
|
109
|
+
"aria-keyshortcuts": X(),
|
|
110
|
+
disabled: s.disabled(),
|
|
111
|
+
hidden: !D(),
|
|
112
|
+
inert: !D(),
|
|
113
|
+
tabIndex: -1
|
|
114
|
+
}),
|
|
115
|
+
registerElement: (e) => {
|
|
116
|
+
u(e);
|
|
117
|
+
let t = {
|
|
118
|
+
name: s.name,
|
|
119
|
+
element: e,
|
|
120
|
+
disabled: s.disabled,
|
|
121
|
+
required: s.required,
|
|
122
|
+
status: I,
|
|
123
|
+
validate: V,
|
|
124
|
+
focus: B,
|
|
125
|
+
focusInvalid: B,
|
|
126
|
+
skip: H,
|
|
127
|
+
reset: U,
|
|
128
|
+
getAnswerByElement: W,
|
|
129
|
+
getAnswerByShortcut: q,
|
|
130
|
+
moveAnswerFocus: J
|
|
131
|
+
};
|
|
132
|
+
return c.registerItem(t);
|
|
133
|
+
},
|
|
134
|
+
describedBy: Y,
|
|
135
|
+
keyshortcuts: X
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//#endregion
|
|
139
|
+
export { s as useQuestionnaireItem };
|
|
140
|
+
|
|
141
|
+
//# sourceMappingURL=useQuestionnaireItem.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Accessor } from 'solid-js';
|
|
2
|
+
import { QuestionnaireRootContextValue } from './questionnaire.context';
|
|
3
|
+
import { QuestionnaireItemDefinition, QuestionnaireShortcutMode } from './questionnaire.types';
|
|
4
|
+
interface Options {
|
|
5
|
+
item: Accessor<string | undefined>;
|
|
6
|
+
defaultItem: Accessor<string | undefined>;
|
|
7
|
+
items: Accessor<readonly QuestionnaireItemDefinition[] | undefined>;
|
|
8
|
+
shortcuts: Accessor<QuestionnaireShortcutMode | undefined>;
|
|
9
|
+
noValidate: Accessor<boolean | undefined>;
|
|
10
|
+
onItemChange: (item: string) => void;
|
|
11
|
+
onReset?: (event: Event) => void;
|
|
12
|
+
onSubmit?: (event: SubmitEvent) => void;
|
|
13
|
+
formRef: Accessor<HTMLFormElement | undefined>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Questionnaire 根状态机:
|
|
17
|
+
* - 注册各 Item(按 DOM 顺序排序),维护激活项与进度;
|
|
18
|
+
* - 导航(上一题/下一题/跳过/提交)与校验;
|
|
19
|
+
* - 键盘:Mod+Enter 提交、上下箭头在答案间移动、左右箭头切题、方向键/Esc/快捷键。
|
|
20
|
+
*/
|
|
21
|
+
export declare function useQuestionnaireRoot(options: Options): {
|
|
22
|
+
context: QuestionnaireRootContextValue;
|
|
23
|
+
formProps: {
|
|
24
|
+
"data-shortcuts": string | undefined;
|
|
25
|
+
onKeyDown: (event: KeyboardEvent) => void;
|
|
26
|
+
onSubmit: (event: SubmitEvent) => void;
|
|
27
|
+
onReset: (event: Event) => void;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { compareDocumentOrder as e, isAnswerFilled as t, isNativeRadio as n, isTypingElement as r, normalizeShortcut as i } from "./questionnaire.utils.js";
|
|
2
|
+
import { createEffect as a, createMemo as o, createSignal as s, onCleanup as c } from "solid-js";
|
|
3
|
+
//#region src/components/questionnaire/useQuestionnaireRoot.ts
|
|
4
|
+
function l(l) {
|
|
5
|
+
let [u, d] = s([]), [f, p] = s(0), [m, h] = s(null), g = null, _ = o(() => (f(), [...u()].sort((t, n) => e(t.element, n.element)))), v = o(() => _().filter((e) => !e.disabled())), y = o(() => l.item() ?? m()), b = o(() => v().find((e) => e.name === y()) ?? null), x = o(() => v().length), S = o(() => v().findIndex((e) => e.name === y())), C = o(() => S() < 0 ? 0 : S() + 1), w = o(() => x() > 0 && S() === 0), T = o(() => x() > 0 && S() === x() - 1), E = o(() => {
|
|
6
|
+
let e = l.items();
|
|
7
|
+
return e ? new Map(e.map((e) => [e.name, e])) : null;
|
|
8
|
+
}), D = () => {
|
|
9
|
+
let e = v(), t = l.item() ?? l.defaultItem();
|
|
10
|
+
return t && e.some((e) => e.name === t) ? t : e[0]?.name ?? null;
|
|
11
|
+
};
|
|
12
|
+
a(() => {
|
|
13
|
+
if (l.item() !== void 0) return;
|
|
14
|
+
let e = v(), t = y();
|
|
15
|
+
if (t && e.some((e) => e.name === t)) return;
|
|
16
|
+
let n = D();
|
|
17
|
+
n !== t && h(n);
|
|
18
|
+
});
|
|
19
|
+
let O = (e) => (d((t) => t.some((t) => t.element === e.element) ? t.map((t) => t.element === e.element ? e : t) : [...t, e]), () => {
|
|
20
|
+
d((t) => t.filter((t) => t !== e));
|
|
21
|
+
}), k = (e, t = "item") => {
|
|
22
|
+
if (e) {
|
|
23
|
+
if (e === y()) {
|
|
24
|
+
t === "invalid" && b()?.focusInvalid();
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
g = {
|
|
28
|
+
name: e,
|
|
29
|
+
target: t
|
|
30
|
+
}, l.item() === void 0 && h(e), l.onItemChange?.(e);
|
|
31
|
+
}
|
|
32
|
+
}, A = () => l.formRef()?.requestSubmit(), j = () => {
|
|
33
|
+
let e = b();
|
|
34
|
+
if (!e) return;
|
|
35
|
+
if (!e.validate()) {
|
|
36
|
+
e.focusInvalid();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
let t = v(), n = t.indexOf(e);
|
|
40
|
+
n < 0 || n >= t.length - 1 || k(t[n + 1].name);
|
|
41
|
+
}, M = () => {
|
|
42
|
+
let e = v(), t = S();
|
|
43
|
+
t <= 0 || k(e[t - 1].name);
|
|
44
|
+
}, N = () => {
|
|
45
|
+
let e = b();
|
|
46
|
+
if (!e || e.required()) return;
|
|
47
|
+
if (e.skip(), T()) {
|
|
48
|
+
queueMicrotask(A);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
let t = v(), n = t.indexOf(e);
|
|
52
|
+
k(t[n + 1]?.name ?? null);
|
|
53
|
+
}, P = () => {
|
|
54
|
+
T() ? A() : j();
|
|
55
|
+
};
|
|
56
|
+
return a(() => {
|
|
57
|
+
let e = y();
|
|
58
|
+
if (!g || g.name !== e) return;
|
|
59
|
+
let t = g.target;
|
|
60
|
+
g = null;
|
|
61
|
+
let n = v().find((t) => t.name === e);
|
|
62
|
+
n && queueMicrotask(() => {
|
|
63
|
+
t === "invalid" ? n.focusInvalid() : n.focus();
|
|
64
|
+
});
|
|
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
|
+
}), {
|
|
74
|
+
context: {
|
|
75
|
+
state: () => ({
|
|
76
|
+
current: C(),
|
|
77
|
+
first: w(),
|
|
78
|
+
last: T(),
|
|
79
|
+
total: x()
|
|
80
|
+
}),
|
|
81
|
+
activeItemName: y,
|
|
82
|
+
activeItemRequired: () => b()?.required() ?? null,
|
|
83
|
+
activeItemStatus: () => b()?.status() ?? null,
|
|
84
|
+
shortcuts: () => l.shortcuts() ?? null,
|
|
85
|
+
nativeValidation: () => l.noValidate() === !1,
|
|
86
|
+
itemDefinitions: E,
|
|
87
|
+
registerItem: O,
|
|
88
|
+
goNext: j,
|
|
89
|
+
goPrevious: M,
|
|
90
|
+
skipCurrent: N,
|
|
91
|
+
requestSubmit: A
|
|
92
|
+
},
|
|
93
|
+
formProps: {
|
|
94
|
+
"data-shortcuts": l.shortcuts(),
|
|
95
|
+
onKeyDown: (e) => {
|
|
96
|
+
let a = b();
|
|
97
|
+
if (!a || e.defaultPrevented || e.isComposing || e.keyCode === 229 || !(e.target instanceof Element)) return;
|
|
98
|
+
let o = e.target;
|
|
99
|
+
if (e.key === "Enter" && (e.metaKey || e.ctrlKey) && !e.altKey && !e.shiftKey) {
|
|
100
|
+
e.preventDefault(), e.repeat || P();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (e.metaKey || e.ctrlKey || e.altKey) return;
|
|
104
|
+
if ((e.key === "ArrowUp" || e.key === "ArrowDown") && a.moveAnswerFocus(o, e.key === "ArrowDown" ? "next" : "previous")) {
|
|
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()));
|
|
123
|
+
},
|
|
124
|
+
onSubmit: (e) => {
|
|
125
|
+
let t = v().find((e) => !e.validate());
|
|
126
|
+
if (t) {
|
|
127
|
+
e.preventDefault(), k(t.name, "invalid");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
l.onSubmit?.(e);
|
|
131
|
+
},
|
|
132
|
+
onReset: (e) => {
|
|
133
|
+
if (l.onReset?.(e), !e.defaultPrevented) {
|
|
134
|
+
for (let e of v()) e.reset();
|
|
135
|
+
k(D());
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
export { l as useQuestionnaireRoot };
|
|
143
|
+
|
|
144
|
+
//# sourceMappingURL=useQuestionnaireRoot.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ResizableHandleProps } from '../resizable.types';
|
|
2
|
+
/**
|
|
3
|
+
* 两个面板之间的分隔条:支持拖拽、方向键、Home/End、Enter/Space 折叠。
|
|
4
|
+
* 默认只有 1px 可见线,靠 `::after` 扩大命中区域;`withHandle` 时显示抓手。
|
|
5
|
+
*/
|
|
6
|
+
export declare function ResizableHandle(props: ResizableHandleProps): import('solid-js').JSX.Element;
|