@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.
Files changed (386) hide show
  1. package/dist/components/bubble/Bubble/Bubble.d.ts +3 -0
  2. package/dist/components/bubble/Bubble/Bubble.js +39 -0
  3. package/dist/components/bubble/Bubble/Bubble.js.map +1 -0
  4. package/dist/components/bubble/Bubble/Bubble.styles.d.ts +7 -0
  5. package/dist/components/bubble/Bubble/Bubble.styles.js +18 -0
  6. package/dist/components/bubble/Bubble/Bubble.styles.js.map +1 -0
  7. package/dist/components/bubble/Bubble/Bubble.types.d.ts +8 -0
  8. package/dist/components/bubble/Bubble/index.d.ts +2 -0
  9. package/dist/components/bubble/BubbleContent/BubbleContent.d.ts +7 -0
  10. package/dist/components/bubble/BubbleContent/BubbleContent.js +17 -0
  11. package/dist/components/bubble/BubbleContent/BubbleContent.js.map +1 -0
  12. package/dist/components/bubble/BubbleContent/BubbleContent.styles.d.ts +1 -0
  13. package/dist/components/bubble/BubbleContent/BubbleContent.styles.js +6 -0
  14. package/dist/components/bubble/BubbleContent/BubbleContent.styles.js.map +1 -0
  15. package/dist/components/bubble/BubbleContent/BubbleContent.types.d.ts +3 -0
  16. package/dist/components/bubble/BubbleContent/index.d.ts +2 -0
  17. package/dist/components/bubble/BubbleGroup/BubbleGroup.d.ts +3 -0
  18. package/dist/components/bubble/BubbleGroup/BubbleGroup.js +24 -0
  19. package/dist/components/bubble/BubbleGroup/BubbleGroup.js.map +1 -0
  20. package/dist/components/bubble/BubbleGroup/BubbleGroup.types.d.ts +2 -0
  21. package/dist/components/bubble/BubbleGroup/index.d.ts +2 -0
  22. package/dist/components/bubble/BubbleReactions/BubbleReactions.d.ts +6 -0
  23. package/dist/components/bubble/BubbleReactions/BubbleReactions.js +42 -0
  24. package/dist/components/bubble/BubbleReactions/BubbleReactions.js.map +1 -0
  25. package/dist/components/bubble/BubbleReactions/BubbleReactions.styles.d.ts +4 -0
  26. package/dist/components/bubble/BubbleReactions/BubbleReactions.styles.js +22 -0
  27. package/dist/components/bubble/BubbleReactions/BubbleReactions.styles.js.map +1 -0
  28. package/dist/components/bubble/BubbleReactions/BubbleReactions.types.d.ts +4 -0
  29. package/dist/components/bubble/BubbleReactions/index.d.ts +2 -0
  30. package/dist/components/bubble/index.d.ts +8 -0
  31. package/dist/components/bubble/index.js +5 -0
  32. package/dist/components/drawer/Drawer/Drawer.context.d.ts +3 -0
  33. package/dist/components/drawer/Drawer/Drawer.context.js +12 -0
  34. package/dist/components/drawer/Drawer/Drawer.context.js.map +1 -0
  35. package/dist/components/drawer/Drawer/Drawer.d.ts +7 -0
  36. package/dist/components/drawer/Drawer/Drawer.js +63 -0
  37. package/dist/components/drawer/Drawer/Drawer.js.map +1 -0
  38. package/dist/components/drawer/Drawer/Drawer.types.d.ts +50 -0
  39. package/dist/components/drawer/Drawer/create-change-event-details.d.ts +3 -0
  40. package/dist/components/drawer/Drawer/create-change-event-details.js +25 -0
  41. package/dist/components/drawer/Drawer/create-change-event-details.js.map +1 -0
  42. package/dist/components/drawer/Drawer/index.d.ts +3 -0
  43. package/dist/components/drawer/DrawerClose/DrawerClose.d.ts +5 -0
  44. package/dist/components/drawer/DrawerClose/DrawerClose.js +26 -0
  45. package/dist/components/drawer/DrawerClose/DrawerClose.js.map +1 -0
  46. package/dist/components/drawer/DrawerClose/index.d.ts +1 -0
  47. package/dist/components/drawer/DrawerContent/DrawerContent.d.ts +6 -0
  48. package/dist/components/drawer/DrawerContent/DrawerContent.js +103 -0
  49. package/dist/components/drawer/DrawerContent/DrawerContent.js.map +1 -0
  50. package/dist/components/drawer/DrawerContent/DrawerContent.styles.d.ts +10 -0
  51. package/dist/components/drawer/DrawerContent/DrawerContent.styles.js +25 -0
  52. package/dist/components/drawer/DrawerContent/DrawerContent.styles.js.map +1 -0
  53. package/dist/components/drawer/DrawerContent/DrawerContent.types.d.ts +2 -0
  54. package/dist/components/drawer/DrawerContent/index.d.ts +2 -0
  55. package/dist/components/drawer/DrawerContent/useDrawerSwipe.d.ts +11 -0
  56. package/dist/components/drawer/DrawerContent/useDrawerSwipe.js +56 -0
  57. package/dist/components/drawer/DrawerContent/useDrawerSwipe.js.map +1 -0
  58. package/dist/components/drawer/DrawerDescription/DrawerDescription.d.ts +2 -0
  59. package/dist/components/drawer/DrawerDescription/DrawerDescription.js +28 -0
  60. package/dist/components/drawer/DrawerDescription/DrawerDescription.js.map +1 -0
  61. package/dist/components/drawer/DrawerDescription/DrawerDescription.types.d.ts +2 -0
  62. package/dist/components/drawer/DrawerDescription/index.d.ts +2 -0
  63. package/dist/components/drawer/DrawerFooter/DrawerFooter.d.ts +2 -0
  64. package/dist/components/drawer/DrawerFooter/DrawerFooter.js +24 -0
  65. package/dist/components/drawer/DrawerFooter/DrawerFooter.js.map +1 -0
  66. package/dist/components/drawer/DrawerFooter/DrawerFooter.types.d.ts +2 -0
  67. package/dist/components/drawer/DrawerFooter/index.d.ts +2 -0
  68. package/dist/components/drawer/DrawerHeader/DrawerHeader.d.ts +2 -0
  69. package/dist/components/drawer/DrawerHeader/DrawerHeader.js +24 -0
  70. package/dist/components/drawer/DrawerHeader/DrawerHeader.js.map +1 -0
  71. package/dist/components/drawer/DrawerHeader/DrawerHeader.types.d.ts +2 -0
  72. package/dist/components/drawer/DrawerHeader/index.d.ts +2 -0
  73. package/dist/components/drawer/DrawerOverlay/DrawerOverlay.d.ts +3 -0
  74. package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js +43 -0
  75. package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js.map +1 -0
  76. package/dist/components/drawer/DrawerOverlay/DrawerOverlay.types.d.ts +2 -0
  77. package/dist/components/drawer/DrawerOverlay/index.d.ts +2 -0
  78. package/dist/components/drawer/DrawerPortal/DrawerPortal.d.ts +2 -0
  79. package/dist/components/drawer/DrawerPortal/DrawerPortal.js +10 -0
  80. package/dist/components/drawer/DrawerPortal/DrawerPortal.js.map +1 -0
  81. package/dist/components/drawer/DrawerPortal/DrawerPortal.types.d.ts +2 -0
  82. package/dist/components/drawer/DrawerPortal/index.d.ts +2 -0
  83. package/dist/components/drawer/DrawerSwipeHandle/DrawerSwipeHandle.d.ts +6 -0
  84. package/dist/components/drawer/DrawerSwipeHandle/DrawerSwipeHandle.js +27 -0
  85. package/dist/components/drawer/DrawerSwipeHandle/DrawerSwipeHandle.js.map +1 -0
  86. package/dist/components/drawer/DrawerSwipeHandle/DrawerSwipeHandle.types.d.ts +2 -0
  87. package/dist/components/drawer/DrawerSwipeHandle/index.d.ts +2 -0
  88. package/dist/components/drawer/DrawerTitle/DrawerTitle.d.ts +2 -0
  89. package/dist/components/drawer/DrawerTitle/DrawerTitle.js +28 -0
  90. package/dist/components/drawer/DrawerTitle/DrawerTitle.js.map +1 -0
  91. package/dist/components/drawer/DrawerTitle/DrawerTitle.types.d.ts +2 -0
  92. package/dist/components/drawer/DrawerTitle/index.d.ts +2 -0
  93. package/dist/components/drawer/DrawerTrigger/DrawerTrigger.d.ts +5 -0
  94. package/dist/components/drawer/DrawerTrigger/DrawerTrigger.js +38 -0
  95. package/dist/components/drawer/DrawerTrigger/DrawerTrigger.js.map +1 -0
  96. package/dist/components/drawer/DrawerTrigger/index.d.ts +1 -0
  97. package/dist/components/drawer/index.d.ts +20 -0
  98. package/dist/components/drawer/index.js +13 -0
  99. package/dist/components/hover-card/HoverCard/HoverCard.d.ts +7 -0
  100. package/dist/components/hover-card/HoverCard/HoverCard.js +47 -0
  101. package/dist/components/hover-card/HoverCard/HoverCard.js.map +1 -0
  102. package/dist/components/hover-card/HoverCard/index.d.ts +1 -0
  103. package/dist/components/hover-card/HoverCardContent/HoverCardContent.d.ts +6 -0
  104. package/dist/components/hover-card/HoverCardContent/HoverCardContent.js +74 -0
  105. package/dist/components/hover-card/HoverCardContent/HoverCardContent.js.map +1 -0
  106. package/dist/components/hover-card/HoverCardContent/index.d.ts +1 -0
  107. package/dist/components/hover-card/HoverCardContent/useHoverCardContent.d.ts +16 -0
  108. package/dist/components/hover-card/HoverCardContent/useHoverCardContent.js +58 -0
  109. package/dist/components/hover-card/HoverCardContent/useHoverCardContent.js.map +1 -0
  110. package/dist/components/hover-card/HoverCardTrigger/HoverCardTrigger.d.ts +4 -0
  111. package/dist/components/hover-card/HoverCardTrigger/HoverCardTrigger.js +40 -0
  112. package/dist/components/hover-card/HoverCardTrigger/HoverCardTrigger.js.map +1 -0
  113. package/dist/components/hover-card/HoverCardTrigger/index.d.ts +1 -0
  114. package/dist/components/hover-card/HoverCardTrigger/useHoverCardTrigger.d.ts +18 -0
  115. package/dist/components/hover-card/HoverCardTrigger/useHoverCardTrigger.js +34 -0
  116. package/dist/components/hover-card/HoverCardTrigger/useHoverCardTrigger.js.map +1 -0
  117. package/dist/components/hover-card/hover-card.context.d.ts +3 -0
  118. package/dist/components/hover-card/hover-card.context.js +12 -0
  119. package/dist/components/hover-card/hover-card.context.js.map +1 -0
  120. package/dist/components/hover-card/hover-card.types.d.ts +50 -0
  121. package/dist/components/hover-card/hover-card.utils.d.ts +6 -0
  122. package/dist/components/hover-card/index.d.ts +4 -0
  123. package/dist/components/hover-card/index.js +4 -0
  124. package/dist/components/marker/Marker/Marker.d.ts +7 -0
  125. package/dist/components/marker/Marker/Marker.js +35 -0
  126. package/dist/components/marker/Marker/Marker.js.map +1 -0
  127. package/dist/components/marker/Marker/Marker.styles.d.ts +3 -0
  128. package/dist/components/marker/Marker/Marker.styles.js +14 -0
  129. package/dist/components/marker/Marker/Marker.styles.js.map +1 -0
  130. package/dist/components/marker/Marker/Marker.types.d.ts +5 -0
  131. package/dist/components/marker/Marker/index.d.ts +3 -0
  132. package/dist/components/marker/MarkerContent/MarkerContent.d.ts +2 -0
  133. package/dist/components/marker/MarkerContent/MarkerContent.js +24 -0
  134. package/dist/components/marker/MarkerContent/MarkerContent.js.map +1 -0
  135. package/dist/components/marker/MarkerContent/MarkerContent.types.d.ts +2 -0
  136. package/dist/components/marker/MarkerContent/index.d.ts +2 -0
  137. package/dist/components/marker/MarkerIcon/MarkerIcon.d.ts +3 -0
  138. package/dist/components/marker/MarkerIcon/MarkerIcon.js +25 -0
  139. package/dist/components/marker/MarkerIcon/MarkerIcon.js.map +1 -0
  140. package/dist/components/marker/MarkerIcon/MarkerIcon.types.d.ts +2 -0
  141. package/dist/components/marker/MarkerIcon/index.d.ts +2 -0
  142. package/dist/components/marker/index.d.ts +6 -0
  143. package/dist/components/marker/index.js +5 -0
  144. package/dist/components/message/Message/Message.d.ts +3 -0
  145. package/dist/components/message/Message/Message.js +31 -0
  146. package/dist/components/message/Message/Message.js.map +1 -0
  147. package/dist/components/message/Message/Message.types.d.ts +5 -0
  148. package/dist/components/message/Message/index.d.ts +2 -0
  149. package/dist/components/message/MessageAvatar/MessageAvatar.d.ts +5 -0
  150. package/dist/components/message/MessageAvatar/MessageAvatar.js +24 -0
  151. package/dist/components/message/MessageAvatar/MessageAvatar.js.map +1 -0
  152. package/dist/components/message/MessageAvatar/MessageAvatar.types.d.ts +2 -0
  153. package/dist/components/message/MessageAvatar/index.d.ts +2 -0
  154. package/dist/components/message/MessageContent/MessageContent.d.ts +3 -0
  155. package/dist/components/message/MessageContent/MessageContent.js +24 -0
  156. package/dist/components/message/MessageContent/MessageContent.js.map +1 -0
  157. package/dist/components/message/MessageContent/MessageContent.types.d.ts +2 -0
  158. package/dist/components/message/MessageContent/index.d.ts +2 -0
  159. package/dist/components/message/MessageFooter/MessageFooter.d.ts +3 -0
  160. package/dist/components/message/MessageFooter/MessageFooter.js +24 -0
  161. package/dist/components/message/MessageFooter/MessageFooter.js.map +1 -0
  162. package/dist/components/message/MessageFooter/MessageFooter.types.d.ts +2 -0
  163. package/dist/components/message/MessageFooter/index.d.ts +2 -0
  164. package/dist/components/message/MessageGroup/MessageGroup.d.ts +3 -0
  165. package/dist/components/message/MessageGroup/MessageGroup.js +24 -0
  166. package/dist/components/message/MessageGroup/MessageGroup.js.map +1 -0
  167. package/dist/components/message/MessageGroup/MessageGroup.types.d.ts +2 -0
  168. package/dist/components/message/MessageGroup/index.d.ts +2 -0
  169. package/dist/components/message/MessageHeader/MessageHeader.d.ts +3 -0
  170. package/dist/components/message/MessageHeader/MessageHeader.js +24 -0
  171. package/dist/components/message/MessageHeader/MessageHeader.js.map +1 -0
  172. package/dist/components/message/MessageHeader/MessageHeader.types.d.ts +2 -0
  173. package/dist/components/message/MessageHeader/index.d.ts +2 -0
  174. package/dist/components/message/index.d.ts +12 -0
  175. package/dist/components/message/index.js +7 -0
  176. package/dist/components/message-scroller/MessageScroller/MessageScroller.d.ts +3 -0
  177. package/dist/components/message-scroller/MessageScroller/MessageScroller.js +35 -0
  178. package/dist/components/message-scroller/MessageScroller/MessageScroller.js.map +1 -0
  179. package/dist/components/message-scroller/MessageScroller/index.d.ts +1 -0
  180. package/dist/components/message-scroller/MessageScrollerButton/MessageScrollerButton.d.ts +6 -0
  181. package/dist/components/message-scroller/MessageScrollerButton/MessageScrollerButton.js +90 -0
  182. package/dist/components/message-scroller/MessageScrollerButton/MessageScrollerButton.js.map +1 -0
  183. package/dist/components/message-scroller/MessageScrollerButton/index.d.ts +1 -0
  184. package/dist/components/message-scroller/MessageScrollerContent/MessageScrollerContent.d.ts +6 -0
  185. package/dist/components/message-scroller/MessageScrollerContent/MessageScrollerContent.js +46 -0
  186. package/dist/components/message-scroller/MessageScrollerContent/MessageScrollerContent.js.map +1 -0
  187. package/dist/components/message-scroller/MessageScrollerContent/index.d.ts +1 -0
  188. package/dist/components/message-scroller/MessageScrollerItem/MessageScrollerItem.d.ts +6 -0
  189. package/dist/components/message-scroller/MessageScrollerItem/MessageScrollerItem.js +42 -0
  190. package/dist/components/message-scroller/MessageScrollerItem/MessageScrollerItem.js.map +1 -0
  191. package/dist/components/message-scroller/MessageScrollerItem/index.d.ts +1 -0
  192. package/dist/components/message-scroller/MessageScrollerProvider/MessageScrollerProvider.d.ts +4 -0
  193. package/dist/components/message-scroller/MessageScrollerProvider/MessageScrollerProvider.js +37 -0
  194. package/dist/components/message-scroller/MessageScrollerProvider/MessageScrollerProvider.js.map +1 -0
  195. package/dist/components/message-scroller/MessageScrollerProvider/index.d.ts +1 -0
  196. package/dist/components/message-scroller/MessageScrollerViewport/MessageScrollerViewport.d.ts +6 -0
  197. package/dist/components/message-scroller/MessageScrollerViewport/MessageScrollerViewport.js +55 -0
  198. package/dist/components/message-scroller/MessageScrollerViewport/MessageScrollerViewport.js.map +1 -0
  199. package/dist/components/message-scroller/MessageScrollerViewport/index.d.ts +1 -0
  200. package/dist/components/message-scroller/index.d.ts +10 -0
  201. package/dist/components/message-scroller/index.js +10 -0
  202. package/dist/components/message-scroller/message-scroller.context.d.ts +3 -0
  203. package/dist/components/message-scroller/message-scroller.context.js +12 -0
  204. package/dist/components/message-scroller/message-scroller.context.js.map +1 -0
  205. package/dist/components/message-scroller/message-scroller.types.d.ts +92 -0
  206. package/dist/components/message-scroller/message-scroller.utils.d.ts +7 -0
  207. package/dist/components/message-scroller/message-scroller.utils.js +9 -0
  208. package/dist/components/message-scroller/message-scroller.utils.js.map +1 -0
  209. package/dist/components/message-scroller/useMessageScroller.d.ts +6 -0
  210. package/dist/components/message-scroller/useMessageScroller.js +14 -0
  211. package/dist/components/message-scroller/useMessageScroller.js.map +1 -0
  212. package/dist/components/message-scroller/useMessageScrollerEngine.d.ts +15 -0
  213. package/dist/components/message-scroller/useMessageScrollerEngine.js +375 -0
  214. package/dist/components/message-scroller/useMessageScrollerEngine.js.map +1 -0
  215. package/dist/components/message-scroller/useMessageScrollerScrollable.d.ts +5 -0
  216. package/dist/components/message-scroller/useMessageScrollerScrollable.js +13 -0
  217. package/dist/components/message-scroller/useMessageScrollerScrollable.js.map +1 -0
  218. package/dist/components/message-scroller/useMessageScrollerVisibility.d.ts +7 -0
  219. package/dist/components/message-scroller/useMessageScrollerVisibility.js +17 -0
  220. package/dist/components/message-scroller/useMessageScrollerVisibility.js.map +1 -0
  221. package/dist/components/popover/PopoverContent/PopoverContent.utils.d.ts +6 -13
  222. package/dist/components/popover/PopoverContent/PopoverContent.utils.js +7 -30
  223. package/dist/components/popover/PopoverContent/PopoverContent.utils.js.map +1 -1
  224. package/dist/components/questionnaire/Questionnaire/Questionnaire.d.ts +3 -0
  225. package/dist/components/questionnaire/Questionnaire/Questionnaire.js +68 -0
  226. package/dist/components/questionnaire/Questionnaire/Questionnaire.js.map +1 -0
  227. package/dist/components/questionnaire/Questionnaire/index.d.ts +1 -0
  228. package/dist/components/questionnaire/QuestionnaireActions/QuestionnaireActions.d.ts +3 -0
  229. package/dist/components/questionnaire/QuestionnaireActions/QuestionnaireActions.js +24 -0
  230. package/dist/components/questionnaire/QuestionnaireActions/QuestionnaireActions.js.map +1 -0
  231. package/dist/components/questionnaire/QuestionnaireActions/index.d.ts +1 -0
  232. package/dist/components/questionnaire/QuestionnaireChoice/QuestionnaireChoice.d.ts +3 -0
  233. package/dist/components/questionnaire/QuestionnaireChoice/QuestionnaireChoice.js +99 -0
  234. package/dist/components/questionnaire/QuestionnaireChoice/QuestionnaireChoice.js.map +1 -0
  235. package/dist/components/questionnaire/QuestionnaireChoice/index.d.ts +1 -0
  236. package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.d.ts +38 -0
  237. package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js +67 -0
  238. package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js.map +1 -0
  239. package/dist/components/questionnaire/QuestionnaireChoices/QuestionnaireChoices.d.ts +3 -0
  240. package/dist/components/questionnaire/QuestionnaireChoices/QuestionnaireChoices.js +28 -0
  241. package/dist/components/questionnaire/QuestionnaireChoices/QuestionnaireChoices.js.map +1 -0
  242. package/dist/components/questionnaire/QuestionnaireChoices/index.d.ts +1 -0
  243. package/dist/components/questionnaire/QuestionnaireDescription/QuestionnaireDescription.d.ts +4 -0
  244. package/dist/components/questionnaire/QuestionnaireDescription/QuestionnaireDescription.js +30 -0
  245. package/dist/components/questionnaire/QuestionnaireDescription/QuestionnaireDescription.js.map +1 -0
  246. package/dist/components/questionnaire/QuestionnaireDescription/index.d.ts +1 -0
  247. package/dist/components/questionnaire/QuestionnaireError/QuestionnaireError.d.ts +4 -0
  248. package/dist/components/questionnaire/QuestionnaireError/QuestionnaireError.js +43 -0
  249. package/dist/components/questionnaire/QuestionnaireError/QuestionnaireError.js.map +1 -0
  250. package/dist/components/questionnaire/QuestionnaireError/index.d.ts +1 -0
  251. package/dist/components/questionnaire/QuestionnaireInput/QuestionnaireInput.d.ts +3 -0
  252. package/dist/components/questionnaire/QuestionnaireInput/QuestionnaireInput.js +78 -0
  253. package/dist/components/questionnaire/QuestionnaireInput/QuestionnaireInput.js.map +1 -0
  254. package/dist/components/questionnaire/QuestionnaireInput/index.d.ts +1 -0
  255. package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.d.ts +37 -0
  256. package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js +58 -0
  257. package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js.map +1 -0
  258. package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.d.ts +3 -0
  259. package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js +89 -0
  260. package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js.map +1 -0
  261. package/dist/components/questionnaire/QuestionnaireItem/index.d.ts +1 -0
  262. package/dist/components/questionnaire/QuestionnaireNavigation/QuestionnaireNavigation.d.ts +5 -0
  263. package/dist/components/questionnaire/QuestionnaireNavigation/QuestionnaireNavigation.js +104 -0
  264. package/dist/components/questionnaire/QuestionnaireNavigation/QuestionnaireNavigation.js.map +1 -0
  265. package/dist/components/questionnaire/QuestionnaireNavigation/index.d.ts +1 -0
  266. package/dist/components/questionnaire/QuestionnaireProgress/QuestionnaireProgress.d.ts +4 -0
  267. package/dist/components/questionnaire/QuestionnaireProgress/QuestionnaireProgress.js +62 -0
  268. package/dist/components/questionnaire/QuestionnaireProgress/QuestionnaireProgress.js.map +1 -0
  269. package/dist/components/questionnaire/QuestionnaireProgress/index.d.ts +1 -0
  270. package/dist/components/questionnaire/QuestionnaireTitle/QuestionnaireTitle.d.ts +4 -0
  271. package/dist/components/questionnaire/QuestionnaireTitle/QuestionnaireTitle.js +27 -0
  272. package/dist/components/questionnaire/QuestionnaireTitle/QuestionnaireTitle.js.map +1 -0
  273. package/dist/components/questionnaire/QuestionnaireTitle/index.d.ts +1 -0
  274. package/dist/components/questionnaire/index.d.ts +12 -0
  275. package/dist/components/questionnaire/index.js +12 -0
  276. package/dist/components/questionnaire/questionnaire.context.d.ts +65 -0
  277. package/dist/components/questionnaire/questionnaire.context.js +18 -0
  278. package/dist/components/questionnaire/questionnaire.context.js.map +1 -0
  279. package/dist/components/questionnaire/questionnaire.types.d.ts +82 -0
  280. package/dist/components/questionnaire/questionnaire.utils.d.ts +24 -0
  281. package/dist/components/questionnaire/questionnaire.utils.js +38 -0
  282. package/dist/components/questionnaire/questionnaire.utils.js.map +1 -0
  283. package/dist/components/questionnaire/useQuestionnaireItem.d.ts +34 -0
  284. package/dist/components/questionnaire/useQuestionnaireItem.js +141 -0
  285. package/dist/components/questionnaire/useQuestionnaireItem.js.map +1 -0
  286. package/dist/components/questionnaire/useQuestionnaireRoot.d.ts +30 -0
  287. package/dist/components/questionnaire/useQuestionnaireRoot.js +144 -0
  288. package/dist/components/questionnaire/useQuestionnaireRoot.js.map +1 -0
  289. package/dist/components/resizable/ResizableHandle/ResizableHandle.d.ts +6 -0
  290. package/dist/components/resizable/ResizableHandle/ResizableHandle.js +92 -0
  291. package/dist/components/resizable/ResizableHandle/ResizableHandle.js.map +1 -0
  292. package/dist/components/resizable/ResizableHandle/ResizableHandle.styles.d.ts +3 -0
  293. package/dist/components/resizable/ResizableHandle/ResizableHandle.styles.js +6 -0
  294. package/dist/components/resizable/ResizableHandle/ResizableHandle.styles.js.map +1 -0
  295. package/dist/components/resizable/ResizableHandle/index.d.ts +1 -0
  296. package/dist/components/resizable/ResizableHandle/useResizableHandle.d.ts +17 -0
  297. package/dist/components/resizable/ResizableHandle/useResizableHandle.js +72 -0
  298. package/dist/components/resizable/ResizableHandle/useResizableHandle.js.map +1 -0
  299. package/dist/components/resizable/ResizablePanel/ResizablePanel.d.ts +6 -0
  300. package/dist/components/resizable/ResizablePanel/ResizablePanel.js +91 -0
  301. package/dist/components/resizable/ResizablePanel/ResizablePanel.js.map +1 -0
  302. package/dist/components/resizable/ResizablePanel/index.d.ts +1 -0
  303. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.d.ts +6 -0
  304. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js +66 -0
  305. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js.map +1 -0
  306. package/dist/components/resizable/ResizablePanelGroup/index.d.ts +1 -0
  307. package/dist/components/resizable/index.d.ts +4 -0
  308. package/dist/components/resizable/index.js +4 -0
  309. package/dist/components/resizable/resizable.context.d.ts +38 -0
  310. package/dist/components/resizable/resizable.context.js +12 -0
  311. package/dist/components/resizable/resizable.context.js.map +1 -0
  312. package/dist/components/resizable/resizable.types.d.ts +76 -0
  313. package/dist/components/resizable/resizable.utils.d.ts +16 -0
  314. package/dist/components/resizable/resizable.utils.js +45 -0
  315. package/dist/components/resizable/resizable.utils.js.map +1 -0
  316. package/dist/components/resizable/useResizablePanelGroup.d.ts +22 -0
  317. package/dist/components/resizable/useResizablePanelGroup.js +176 -0
  318. package/dist/components/resizable/useResizablePanelGroup.js.map +1 -0
  319. package/dist/components/scroll-arrows/ScrollArrowButton.d.ts +7 -4
  320. package/dist/components/scroll-arrows/ScrollArrowButton.js +28 -19
  321. package/dist/components/scroll-arrows/ScrollArrowButton.js.map +1 -1
  322. package/dist/components/scroll-arrows/ScrollArrows.d.ts +5 -2
  323. package/dist/components/scroll-arrows/ScrollArrows.js +6 -0
  324. package/dist/components/scroll-arrows/ScrollArrows.js.map +1 -1
  325. package/dist/components/scroll-arrows/ScrollArrows.types.d.ts +7 -0
  326. package/dist/components/sheet/Sheet/Sheet.d.ts +6 -0
  327. package/dist/components/sheet/Sheet/Sheet.js +10 -0
  328. package/dist/components/sheet/Sheet/Sheet.js.map +1 -0
  329. package/dist/components/sheet/Sheet/index.d.ts +1 -0
  330. package/dist/components/sheet/SheetClose/SheetClose.d.ts +6 -0
  331. package/dist/components/sheet/SheetClose/SheetClose.js +39 -0
  332. package/dist/components/sheet/SheetClose/SheetClose.js.map +1 -0
  333. package/dist/components/sheet/SheetClose/index.d.ts +1 -0
  334. package/dist/components/sheet/SheetContent/SheetContent.d.ts +6 -0
  335. package/dist/components/sheet/SheetContent/SheetContent.js +48 -0
  336. package/dist/components/sheet/SheetContent/SheetContent.js.map +1 -0
  337. package/dist/components/sheet/SheetContent/SheetContent.styles.d.ts +10 -0
  338. package/dist/components/sheet/SheetContent/SheetContent.styles.js +17 -0
  339. package/dist/components/sheet/SheetContent/SheetContent.styles.js.map +1 -0
  340. package/dist/components/sheet/SheetContent/index.d.ts +1 -0
  341. package/dist/components/sheet/SheetDescription/SheetDescription.d.ts +2 -0
  342. package/dist/components/sheet/SheetDescription/SheetDescription.js +25 -0
  343. package/dist/components/sheet/SheetDescription/SheetDescription.js.map +1 -0
  344. package/dist/components/sheet/SheetDescription/SheetDescription.styles.d.ts +1 -0
  345. package/dist/components/sheet/SheetDescription/SheetDescription.styles.js +6 -0
  346. package/dist/components/sheet/SheetDescription/SheetDescription.styles.js.map +1 -0
  347. package/dist/components/sheet/SheetDescription/index.d.ts +1 -0
  348. package/dist/components/sheet/SheetFooter/SheetFooter.d.ts +2 -0
  349. package/dist/components/sheet/SheetFooter/SheetFooter.js +24 -0
  350. package/dist/components/sheet/SheetFooter/SheetFooter.js.map +1 -0
  351. package/dist/components/sheet/SheetFooter/index.d.ts +1 -0
  352. package/dist/components/sheet/SheetHeader/SheetHeader.d.ts +2 -0
  353. package/dist/components/sheet/SheetHeader/SheetHeader.js +24 -0
  354. package/dist/components/sheet/SheetHeader/SheetHeader.js.map +1 -0
  355. package/dist/components/sheet/SheetHeader/index.d.ts +1 -0
  356. package/dist/components/sheet/SheetTitle/SheetTitle.d.ts +3 -0
  357. package/dist/components/sheet/SheetTitle/SheetTitle.js +25 -0
  358. package/dist/components/sheet/SheetTitle/SheetTitle.js.map +1 -0
  359. package/dist/components/sheet/SheetTitle/SheetTitle.styles.d.ts +1 -0
  360. package/dist/components/sheet/SheetTitle/SheetTitle.styles.js +6 -0
  361. package/dist/components/sheet/SheetTitle/SheetTitle.styles.js.map +1 -0
  362. package/dist/components/sheet/SheetTitle/index.d.ts +1 -0
  363. package/dist/components/sheet/SheetTrigger/SheetTrigger.d.ts +8 -0
  364. package/dist/components/sheet/SheetTrigger/SheetTrigger.js +32 -0
  365. package/dist/components/sheet/SheetTrigger/SheetTrigger.js.map +1 -0
  366. package/dist/components/sheet/SheetTrigger/index.d.ts +1 -0
  367. package/dist/components/sheet/index.d.ts +9 -0
  368. package/dist/components/sheet/index.js +9 -0
  369. package/dist/components/sheet/sheet.types.d.ts +19 -0
  370. package/dist/components/tooltip/TooltipContent/TooltipContent.js +1 -1
  371. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.d.ts +5 -49
  372. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js +10 -39
  373. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js.map +1 -1
  374. package/dist/components/tooltip/TooltipContent/useTooltipContent.js +6 -5
  375. package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
  376. package/dist/hooks/useScrollEdges.d.ts +3 -0
  377. package/dist/hooks/useScrollEdges.js +18 -16
  378. package/dist/hooks/useScrollEdges.js.map +1 -1
  379. package/dist/index.d.ts +9 -0
  380. package/dist/index.js +253 -193
  381. package/dist/lib/positioner/index.d.ts +1 -0
  382. package/dist/lib/positioner/utils/floating.d.ts +25 -0
  383. package/dist/lib/positioner/utils/floating.js +42 -0
  384. package/dist/lib/positioner/utils/floating.js.map +1 -0
  385. package/dist/ui.css +1 -1
  386. 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;