@neut/ui 0.0.17 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (707) hide show
  1. package/dist/components/accordion/Accordion/Accordion.js +3 -0
  2. package/dist/components/accordion/Accordion/Accordion.js.map +1 -1
  3. package/dist/components/accordion/AccordionContent/AccordionContent.js +27 -21
  4. package/dist/components/accordion/AccordionContent/AccordionContent.js.map +1 -1
  5. package/dist/components/accordion/AccordionItem/AccordionItem.js +3 -0
  6. package/dist/components/accordion/AccordionItem/AccordionItem.js.map +1 -1
  7. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js +19 -18
  8. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js.map +1 -1
  9. package/dist/components/alert/Alert/Alert.js +8 -3
  10. package/dist/components/alert/Alert/Alert.js.map +1 -1
  11. package/dist/components/alert/AlertAction/AlertAction.js +8 -3
  12. package/dist/components/alert/AlertAction/AlertAction.js.map +1 -1
  13. package/dist/components/alert/AlertDescription/AlertDescription.js +8 -3
  14. package/dist/components/alert/AlertDescription/AlertDescription.js.map +1 -1
  15. package/dist/components/alert/AlertTitle/AlertTitle.js +8 -3
  16. package/dist/components/alert/AlertTitle/AlertTitle.js.map +1 -1
  17. package/dist/components/alert-dialog/AlertDialog/AlertDialog.d.ts +3 -1
  18. package/dist/components/alert-dialog/AlertDialog/AlertDialog.js +6 -1
  19. package/dist/components/alert-dialog/AlertDialog/AlertDialog.js.map +1 -1
  20. package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js +9 -7
  21. package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js.map +1 -1
  22. package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.types.d.ts +9 -3
  23. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js +8 -3
  24. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js.map +1 -1
  25. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js +8 -3
  26. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js.map +1 -1
  27. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js +8 -3
  28. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js.map +1 -1
  29. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js +8 -3
  30. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js.map +1 -1
  31. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js +8 -3
  32. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js.map +1 -1
  33. package/dist/components/aspect-ratio/AspectRatio.js +3 -0
  34. package/dist/components/aspect-ratio/AspectRatio.js.map +1 -1
  35. package/dist/components/attachment/AttachmentTrigger/AttachmentTrigger.js +15 -7
  36. package/dist/components/attachment/AttachmentTrigger/AttachmentTrigger.js.map +1 -1
  37. package/dist/components/avatar/Avatar/Avatar.context.d.ts +7 -0
  38. package/dist/components/avatar/Avatar/Avatar.context.js +1 -1
  39. package/dist/components/avatar/Avatar/Avatar.context.js.map +1 -1
  40. package/dist/components/avatar/Avatar/Avatar.js +7 -2
  41. package/dist/components/avatar/Avatar/Avatar.js.map +1 -1
  42. package/dist/components/avatar/AvatarBadge/AvatarBadge.js +8 -3
  43. package/dist/components/avatar/AvatarBadge/AvatarBadge.js.map +1 -1
  44. package/dist/components/avatar/AvatarFallback/AvatarFallback.js +10 -5
  45. package/dist/components/avatar/AvatarFallback/AvatarFallback.js.map +1 -1
  46. package/dist/components/avatar/AvatarGroup/AvatarGroup.js +8 -3
  47. package/dist/components/avatar/AvatarGroup/AvatarGroup.js.map +1 -1
  48. package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js +8 -3
  49. package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js.map +1 -1
  50. package/dist/components/avatar/AvatarImage/AvatarImage.js +19 -12
  51. package/dist/components/avatar/AvatarImage/AvatarImage.js.map +1 -1
  52. package/dist/components/badge/Badge.js +9 -4
  53. package/dist/components/badge/Badge.js.map +1 -1
  54. package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js +8 -3
  55. package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js.map +1 -1
  56. package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js +8 -3
  57. package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js.map +1 -1
  58. package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js +3 -0
  59. package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js.map +1 -1
  60. package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js +8 -3
  61. package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js.map +1 -1
  62. package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js +8 -3
  63. package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js.map +1 -1
  64. package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js +8 -3
  65. package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js.map +1 -1
  66. package/dist/components/bubble/BubbleContent/BubbleContent.js +21 -10
  67. package/dist/components/bubble/BubbleContent/BubbleContent.js.map +1 -1
  68. package/dist/components/button/Button.js +3 -0
  69. package/dist/components/button/Button.js.map +1 -1
  70. package/dist/components/button-group/ButtonGroup/ButtonGroup.js +3 -0
  71. package/dist/components/button-group/ButtonGroup/ButtonGroup.js.map +1 -1
  72. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js +16 -7
  73. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js.map +1 -1
  74. package/dist/components/calendar/Calendar/Calendar.d.ts +2 -3
  75. package/dist/components/calendar/Calendar/Calendar.js +89 -264
  76. package/dist/components/calendar/Calendar/Calendar.js.map +1 -1
  77. package/dist/components/calendar/Calendar/Calendar.options.d.ts +43 -0
  78. package/dist/components/calendar/Calendar/Calendar.options.js +38 -0
  79. package/dist/components/calendar/Calendar/Calendar.options.js.map +1 -0
  80. package/dist/components/calendar/Calendar/Calendar.selection.d.ts +16 -0
  81. package/dist/components/calendar/Calendar/Calendar.selection.js +50 -0
  82. package/dist/components/calendar/Calendar/Calendar.selection.js.map +1 -0
  83. package/dist/components/calendar/Calendar/Calendar.styles.d.ts +8 -0
  84. package/dist/components/calendar/Calendar/Calendar.styles.js +32 -0
  85. package/dist/components/calendar/Calendar/Calendar.styles.js.map +1 -0
  86. package/dist/components/calendar/Calendar/Calendar.utils.d.ts +3 -1
  87. package/dist/components/calendar/Calendar/Calendar.utils.js +4 -1
  88. package/dist/components/calendar/Calendar/Calendar.utils.js.map +1 -1
  89. package/dist/components/calendar/Calendar/CalendarDay.d.ts +28 -0
  90. package/dist/components/calendar/Calendar/CalendarDay.js +41 -0
  91. package/dist/components/calendar/Calendar/CalendarDay.js.map +1 -0
  92. package/dist/components/calendar/Calendar/CalendarMonth.d.ts +35 -0
  93. package/dist/components/calendar/Calendar/CalendarMonth.js +127 -0
  94. package/dist/components/calendar/Calendar/CalendarMonth.js.map +1 -0
  95. package/dist/components/calendar/Calendar/CalendarMonthCaption.d.ts +22 -0
  96. package/dist/components/calendar/Calendar/CalendarMonthCaption.js +103 -0
  97. package/dist/components/calendar/Calendar/CalendarMonthCaption.js.map +1 -0
  98. package/dist/components/calendar/index.js +3 -2
  99. package/dist/components/card/Card/Card.js +3 -0
  100. package/dist/components/card/Card/Card.js.map +1 -1
  101. package/dist/components/card/CardAction/CardAction.js +8 -3
  102. package/dist/components/card/CardAction/CardAction.js.map +1 -1
  103. package/dist/components/card/CardContent/CardContent.js +8 -3
  104. package/dist/components/card/CardContent/CardContent.js.map +1 -1
  105. package/dist/components/card/CardDescription/CardDescription.js +8 -3
  106. package/dist/components/card/CardDescription/CardDescription.js.map +1 -1
  107. package/dist/components/card/CardFooter/CardFooter.js +8 -3
  108. package/dist/components/card/CardFooter/CardFooter.js.map +1 -1
  109. package/dist/components/card/CardHeader/CardHeader.js +8 -3
  110. package/dist/components/card/CardHeader/CardHeader.js.map +1 -1
  111. package/dist/components/card/CardTitle/CardTitle.js +8 -3
  112. package/dist/components/card/CardTitle/CardTitle.js.map +1 -1
  113. package/dist/components/carousel/Carousel/Carousel.context.js +1 -1
  114. package/dist/components/carousel/Carousel/Carousel.context.js.map +1 -1
  115. package/dist/components/carousel/Carousel/Carousel.js +19 -12
  116. package/dist/components/carousel/Carousel/Carousel.js.map +1 -1
  117. package/dist/components/carousel/Carousel/useKeyboardNavigation.d.ts +11 -1
  118. package/dist/components/carousel/Carousel/useKeyboardNavigation.js +5 -4
  119. package/dist/components/carousel/Carousel/useKeyboardNavigation.js.map +1 -1
  120. package/dist/components/carousel/CarouselContent/CarouselContent.js +8 -3
  121. package/dist/components/carousel/CarouselContent/CarouselContent.js.map +1 -1
  122. package/dist/components/carousel/CarouselNext/CarouselNext.js +29 -16
  123. package/dist/components/carousel/CarouselNext/CarouselNext.js.map +1 -1
  124. package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js +29 -16
  125. package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js.map +1 -1
  126. package/dist/components/checkbox/Checkbox/Checkbox.js +32 -25
  127. package/dist/components/checkbox/Checkbox/Checkbox.js.map +1 -1
  128. package/dist/components/collapsible/Collapsible/Collapsible.context.js +1 -1
  129. package/dist/components/collapsible/Collapsible/Collapsible.context.js.map +1 -1
  130. package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js +13 -12
  131. package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js.map +1 -1
  132. package/dist/components/combobox/Combobox/Combobox.js +52 -52
  133. package/dist/components/combobox/Combobox/Combobox.js.map +1 -1
  134. package/dist/components/combobox/Combobox/Combobox.types.d.ts +15 -6
  135. package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js +7 -3
  136. package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js.map +1 -1
  137. package/dist/components/combobox/ComboboxClear/ComboboxClear.js +1 -1
  138. package/dist/components/combobox/ComboboxClear/ComboboxClear.js.map +1 -1
  139. package/dist/components/combobox/ComboboxInput/ComboboxInput.js +26 -10
  140. package/dist/components/combobox/ComboboxInput/ComboboxInput.js.map +1 -1
  141. package/dist/components/combobox/ComboboxItem/ComboboxItem.js +6 -5
  142. package/dist/components/combobox/ComboboxItem/ComboboxItem.js.map +1 -1
  143. package/dist/components/combobox/ComboboxList/ComboboxList.js +17 -11
  144. package/dist/components/combobox/ComboboxList/ComboboxList.js.map +1 -1
  145. package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js +8 -1
  146. package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js.map +1 -1
  147. package/dist/components/context-menu/ContextMenu/ContextMenu.js +10 -8
  148. package/dist/components/context-menu/ContextMenu/ContextMenu.js.map +1 -1
  149. package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.d.ts +33 -0
  150. package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.js +41 -0
  151. package/dist/components/context-menu/ContextMenuContent/context-menu.highlight.js.map +1 -0
  152. package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.d.ts +25 -0
  153. package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.js +20 -0
  154. package/dist/components/context-menu/ContextMenuContent/context-menu.popup-items.js.map +1 -0
  155. package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.d.ts +31 -0
  156. package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.js +39 -0
  157. package/dist/components/context-menu/ContextMenuContent/context-menu.positioner.js.map +1 -0
  158. package/dist/components/context-menu/ContextMenuContent/useContextMenuContent.js +70 -136
  159. package/dist/components/context-menu/ContextMenuContent/useContextMenuContent.js.map +1 -1
  160. package/dist/components/context-menu/ContextMenuSub/ContextMenuSub.js +2 -1
  161. package/dist/components/context-menu/ContextMenuSub/ContextMenuSub.js.map +1 -1
  162. package/dist/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.js +20 -10
  163. package/dist/components/context-menu/ContextMenuTrigger/ContextMenuTrigger.js.map +1 -1
  164. package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.d.ts +24 -0
  165. package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.js +26 -0
  166. package/dist/components/context-menu/ContextMenuTrigger/context-menu.long-press.js.map +1 -0
  167. package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.d.ts +35 -0
  168. package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.js +17 -0
  169. package/dist/components/context-menu/ContextMenuTrigger/context-menu.trigger.utils.js.map +1 -0
  170. package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.d.ts +9 -11
  171. package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.js +36 -33
  172. package/dist/components/context-menu/ContextMenuTrigger/useContextMenuTrigger.js.map +1 -1
  173. package/dist/components/context-menu/context-menu.keyboard.d.ts +29 -0
  174. package/dist/components/context-menu/context-menu.keyboard.js +52 -0
  175. package/dist/components/context-menu/context-menu.keyboard.js.map +1 -0
  176. package/dist/components/context-menu/context-menu.typeahead.d.ts +27 -0
  177. package/dist/components/context-menu/context-menu.typeahead.js +19 -0
  178. package/dist/components/context-menu/context-menu.typeahead.js.map +1 -0
  179. package/dist/components/context-menu/context-menu.utils.d.ts +5 -2
  180. package/dist/components/context-menu/context-menu.utils.js +17 -39
  181. package/dist/components/context-menu/context-menu.utils.js.map +1 -1
  182. package/dist/components/date-picker/DatePicker/DatePicker.js +6 -0
  183. package/dist/components/date-picker/DatePicker/DatePicker.js.map +1 -1
  184. package/dist/components/dialog/Dialog/Dialog.context.js +1 -1
  185. package/dist/components/dialog/Dialog/Dialog.context.js.map +1 -1
  186. package/dist/components/dialog/Dialog/Dialog.js +24 -15
  187. package/dist/components/dialog/Dialog/Dialog.js.map +1 -1
  188. package/dist/components/dialog/Dialog/Dialog.types.d.ts +5 -0
  189. package/dist/components/dialog/DialogClose/DialogClose.js +20 -19
  190. package/dist/components/dialog/DialogClose/DialogClose.js.map +1 -1
  191. package/dist/components/dialog/DialogContent/DialogContent.context.js +1 -1
  192. package/dist/components/dialog/DialogContent/DialogContent.context.js.map +1 -1
  193. package/dist/components/dialog/DialogDescription/DialogDescription.js +8 -3
  194. package/dist/components/dialog/DialogDescription/DialogDescription.js.map +1 -1
  195. package/dist/components/dialog/DialogFooter/DialogFooter.js +8 -3
  196. package/dist/components/dialog/DialogFooter/DialogFooter.js.map +1 -1
  197. package/dist/components/dialog/DialogHeader/DialogHeader.js +8 -3
  198. package/dist/components/dialog/DialogHeader/DialogHeader.js.map +1 -1
  199. package/dist/components/dialog/DialogOverlay/DialogOverlay.js +3 -0
  200. package/dist/components/dialog/DialogOverlay/DialogOverlay.js.map +1 -1
  201. package/dist/components/dialog/DialogSurface/DialogSurface.js +34 -26
  202. package/dist/components/dialog/DialogSurface/DialogSurface.js.map +1 -1
  203. package/dist/components/dialog/DialogTitle/DialogTitle.js +8 -3
  204. package/dist/components/dialog/DialogTitle/DialogTitle.js.map +1 -1
  205. package/dist/components/drawer/Drawer/Drawer.js +1 -1
  206. package/dist/components/drawer/Drawer/Drawer.js.map +1 -1
  207. package/dist/components/drawer/Drawer/create-change-event-details.js +4 -20
  208. package/dist/components/drawer/Drawer/create-change-event-details.js.map +1 -1
  209. package/dist/components/drawer/DrawerContent/drawer-swipe.utils.d.ts +32 -0
  210. package/dist/components/drawer/DrawerContent/drawer-swipe.utils.js +36 -0
  211. package/dist/components/drawer/DrawerContent/drawer-swipe.utils.js.map +1 -0
  212. package/dist/components/drawer/DrawerContent/useDrawerSwipe.d.ts +3 -0
  213. package/dist/components/drawer/DrawerContent/useDrawerSwipe.js +22 -42
  214. package/dist/components/drawer/DrawerContent/useDrawerSwipe.js.map +1 -1
  215. package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js +1 -1
  216. package/dist/components/drawer/DrawerOverlay/DrawerOverlay.js.map +1 -1
  217. package/dist/components/dropdown-menu/DropdownMenuTrigger/DropdownMenuTrigger.js +7 -7
  218. package/dist/components/dropdown-menu/DropdownMenuTrigger/DropdownMenuTrigger.js.map +1 -1
  219. package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.d.ts +7 -1
  220. package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.js +10 -10
  221. package/dist/components/dropdown-menu/DropdownMenuTrigger/useDropdownMenuTrigger.js.map +1 -1
  222. package/dist/components/field/Field/Field.js +3 -0
  223. package/dist/components/field/Field/Field.js.map +1 -1
  224. package/dist/components/field/FieldContent/FieldContent.js +8 -3
  225. package/dist/components/field/FieldContent/FieldContent.js.map +1 -1
  226. package/dist/components/field/FieldDescription/FieldDescription.js +8 -3
  227. package/dist/components/field/FieldDescription/FieldDescription.js.map +1 -1
  228. package/dist/components/field/FieldError/FieldError.js +8 -3
  229. package/dist/components/field/FieldError/FieldError.js.map +1 -1
  230. package/dist/components/field/FieldGroup/FieldGroup.js +8 -3
  231. package/dist/components/field/FieldGroup/FieldGroup.js.map +1 -1
  232. package/dist/components/field/FieldLabel/FieldLabel.js +3 -0
  233. package/dist/components/field/FieldLabel/FieldLabel.js.map +1 -1
  234. package/dist/components/field/FieldLegend/FieldLegend.js +3 -0
  235. package/dist/components/field/FieldLegend/FieldLegend.js.map +1 -1
  236. package/dist/components/field/FieldSeparator/FieldSeparator.js +3 -0
  237. package/dist/components/field/FieldSeparator/FieldSeparator.js.map +1 -1
  238. package/dist/components/field/FieldSet/FieldSet.js +8 -3
  239. package/dist/components/field/FieldSet/FieldSet.js.map +1 -1
  240. package/dist/components/field/FieldTitle/FieldTitle.js +8 -3
  241. package/dist/components/field/FieldTitle/FieldTitle.js.map +1 -1
  242. package/dist/components/image/Image.utils.d.ts +14 -16
  243. package/dist/components/image/Image.utils.js +146 -190
  244. package/dist/components/image/Image.utils.js.map +1 -1
  245. package/dist/components/image/ImageElement.js +31 -27
  246. package/dist/components/image/ImageElement.js.map +1 -1
  247. package/dist/components/image/lib/blur.d.ts +31 -0
  248. package/dist/components/image/lib/blur.js +24 -0
  249. package/dist/components/image/lib/blur.js.map +1 -0
  250. package/dist/components/image/lib/dev-checks.d.ts +52 -0
  251. package/dist/components/image/lib/handle-loading.d.ts +13 -0
  252. package/dist/components/image/lib/handle-loading.js +20 -0
  253. package/dist/components/image/lib/handle-loading.js.map +1 -0
  254. package/dist/components/image/lib/loader.d.ts +39 -0
  255. package/dist/components/image/lib/loader.js +57 -0
  256. package/dist/components/image/lib/loader.js.map +1 -0
  257. package/dist/components/image/lib/static-import.d.ts +14 -0
  258. package/dist/components/image/lib/static-import.js +17 -0
  259. package/dist/components/image/lib/static-import.js.map +1 -0
  260. package/dist/components/input-group/InputGroup/InputGroup.js +8 -3
  261. package/dist/components/input-group/InputGroup/InputGroup.js.map +1 -1
  262. package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js +3 -0
  263. package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js.map +1 -1
  264. package/dist/components/input-group/InputGroupButton/InputGroupButton.js +3 -0
  265. package/dist/components/input-group/InputGroupButton/InputGroupButton.js.map +1 -1
  266. package/dist/components/input-group/InputGroupInput/InputGroupInput.js +3 -0
  267. package/dist/components/input-group/InputGroupInput/InputGroupInput.js.map +1 -1
  268. package/dist/components/input-group/InputGroupText/InputGroupText.js +8 -3
  269. package/dist/components/input-group/InputGroupText/InputGroupText.js.map +1 -1
  270. package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js +3 -0
  271. package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js.map +1 -1
  272. package/dist/components/item/Item/Item.js +9 -0
  273. package/dist/components/item/Item/Item.js.map +1 -1
  274. package/dist/components/item/ItemActions/ItemActions.js +8 -3
  275. package/dist/components/item/ItemActions/ItemActions.js.map +1 -1
  276. package/dist/components/item/ItemContent/ItemContent.js +8 -3
  277. package/dist/components/item/ItemContent/ItemContent.js.map +1 -1
  278. package/dist/components/item/ItemDescription/ItemDescription.js +8 -3
  279. package/dist/components/item/ItemDescription/ItemDescription.js.map +1 -1
  280. package/dist/components/item/ItemFooter/ItemFooter.js +8 -3
  281. package/dist/components/item/ItemFooter/ItemFooter.js.map +1 -1
  282. package/dist/components/item/ItemGroup/ItemGroup.js +8 -3
  283. package/dist/components/item/ItemGroup/ItemGroup.js.map +1 -1
  284. package/dist/components/item/ItemHeader/ItemHeader.js +8 -3
  285. package/dist/components/item/ItemHeader/ItemHeader.js.map +1 -1
  286. package/dist/components/item/ItemMedia/ItemMedia.js +3 -0
  287. package/dist/components/item/ItemMedia/ItemMedia.js.map +1 -1
  288. package/dist/components/item/ItemSeparator/ItemSeparator.js +3 -0
  289. package/dist/components/item/ItemSeparator/ItemSeparator.js.map +1 -1
  290. package/dist/components/item/ItemTitle/ItemTitle.js +8 -3
  291. package/dist/components/item/ItemTitle/ItemTitle.js.map +1 -1
  292. package/dist/components/kbd/Kbd.js +16 -6
  293. package/dist/components/kbd/Kbd.js.map +1 -1
  294. package/dist/components/label/Label.js +3 -0
  295. package/dist/components/label/Label.js.map +1 -1
  296. package/dist/components/marker/Marker/Marker.styles.d.ts +1 -1
  297. package/dist/components/message-scroller/message-scroller.anchoring.d.ts +60 -0
  298. package/dist/components/message-scroller/message-scroller.anchoring.js +139 -0
  299. package/dist/components/message-scroller/message-scroller.anchoring.js.map +1 -0
  300. package/dist/components/message-scroller/message-scroller.anchors.d.ts +12 -0
  301. package/dist/components/message-scroller/message-scroller.anchors.js +23 -0
  302. package/dist/components/message-scroller/message-scroller.anchors.js.map +1 -0
  303. package/dist/components/message-scroller/message-scroller.commands.d.ts +43 -0
  304. package/dist/components/message-scroller/message-scroller.commands.js +51 -0
  305. package/dist/components/message-scroller/message-scroller.commands.js.map +1 -0
  306. package/dist/components/message-scroller/message-scroller.dom-measure.d.ts +29 -0
  307. package/dist/components/message-scroller/message-scroller.dom-measure.js +37 -0
  308. package/dist/components/message-scroller/message-scroller.dom-measure.js.map +1 -0
  309. package/dist/components/message-scroller/message-scroller.measure.d.ts +27 -0
  310. package/dist/components/message-scroller/message-scroller.measure.js +21 -0
  311. package/dist/components/message-scroller/message-scroller.measure.js.map +1 -0
  312. package/dist/components/message-scroller/message-scroller.scroll-state.d.ts +54 -0
  313. package/dist/components/message-scroller/message-scroller.scroll-state.js +74 -0
  314. package/dist/components/message-scroller/message-scroller.scroll-state.js.map +1 -0
  315. package/dist/components/message-scroller/message-scroller.scroll-target.d.ts +27 -0
  316. package/dist/components/message-scroller/message-scroller.scroll-target.js +33 -0
  317. package/dist/components/message-scroller/message-scroller.scroll-target.js.map +1 -0
  318. package/dist/components/message-scroller/message-scroller.utils.d.ts +7 -0
  319. package/dist/components/message-scroller/message-scroller.utils.js +3 -2
  320. package/dist/components/message-scroller/message-scroller.utils.js.map +1 -1
  321. package/dist/components/message-scroller/message-scroller.visibility.d.ts +43 -0
  322. package/dist/components/message-scroller/message-scroller.visibility.js +82 -0
  323. package/dist/components/message-scroller/message-scroller.visibility.js.map +1 -0
  324. package/dist/components/message-scroller/useMessageScrollerEngine.js +87 -337
  325. package/dist/components/message-scroller/useMessageScrollerEngine.js.map +1 -1
  326. package/dist/components/number-input/NumberInput/NumberInput.js +21 -19
  327. package/dist/components/number-input/NumberInput/NumberInput.js.map +1 -1
  328. package/dist/components/number-input/NumberInput/NumberInput.utils.d.ts +6 -2
  329. package/dist/components/number-input/NumberInput/NumberInput.utils.js +1 -3
  330. package/dist/components/number-input/NumberInput/NumberInput.utils.js.map +1 -1
  331. package/dist/components/number-input/NumberInput/create-change-event-details.d.ts +1 -2
  332. package/dist/components/number-input/NumberInput/create-change-event-details.js +4 -20
  333. package/dist/components/number-input/NumberInput/create-change-event-details.js.map +1 -1
  334. package/dist/components/pagination/Pagination/Pagination.js +8 -3
  335. package/dist/components/pagination/Pagination/Pagination.js.map +1 -1
  336. package/dist/components/pagination/PaginationContent/PaginationContent.js +8 -3
  337. package/dist/components/pagination/PaginationContent/PaginationContent.js.map +1 -1
  338. package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js +8 -3
  339. package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js.map +1 -1
  340. package/dist/components/pagination/PaginationLink/PaginationLink.js +3 -0
  341. package/dist/components/pagination/PaginationLink/PaginationLink.js.map +1 -1
  342. package/dist/components/pagination/PaginationNext/PaginationNext.js +3 -0
  343. package/dist/components/pagination/PaginationNext/PaginationNext.js.map +1 -1
  344. package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js +3 -0
  345. package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js.map +1 -1
  346. package/dist/components/popover/PopoverContent/PopoverContent.js +3 -0
  347. package/dist/components/popover/PopoverContent/PopoverContent.js.map +1 -1
  348. package/dist/components/progress/Progress/Progress.context.js +1 -1
  349. package/dist/components/progress/Progress/Progress.context.js.map +1 -1
  350. package/dist/components/progress/Progress/Progress.js +3 -0
  351. package/dist/components/progress/Progress/Progress.js.map +1 -1
  352. package/dist/components/progress/ProgressIndicator/ProgressIndicator.js +3 -0
  353. package/dist/components/progress/ProgressIndicator/ProgressIndicator.js.map +1 -1
  354. package/dist/components/progress/ProgressLabel/ProgressLabel.js +8 -3
  355. package/dist/components/progress/ProgressLabel/ProgressLabel.js.map +1 -1
  356. package/dist/components/progress/ProgressTrack/ProgressTrack.js +3 -0
  357. package/dist/components/progress/ProgressTrack/ProgressTrack.js.map +1 -1
  358. package/dist/components/progress/ProgressValue/ProgressValue.js +8 -3
  359. package/dist/components/progress/ProgressValue/ProgressValue.js.map +1 -1
  360. package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.d.ts +48 -0
  361. package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.js +23 -0
  362. package/dist/components/questionnaire/QuestionnaireChoice/questionnaire-choice.utils.js.map +1 -0
  363. package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js +62 -49
  364. package/dist/components/questionnaire/QuestionnaireChoice/useQuestionnaireChoice.js.map +1 -1
  365. package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js +4 -1
  366. package/dist/components/questionnaire/QuestionnaireInput/useQuestionnaireInput.js.map +1 -1
  367. package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js +1 -2
  368. package/dist/components/questionnaire/QuestionnaireItem/QuestionnaireItem.js.map +1 -1
  369. package/dist/components/questionnaire/questionnaire.answers.d.ts +42 -0
  370. package/dist/components/questionnaire/questionnaire.answers.js +62 -0
  371. package/dist/components/questionnaire/questionnaire.answers.js.map +1 -0
  372. package/dist/components/questionnaire/questionnaire.aria.d.ts +34 -0
  373. package/dist/components/questionnaire/questionnaire.aria.js +28 -0
  374. package/dist/components/questionnaire/questionnaire.aria.js.map +1 -0
  375. package/dist/components/questionnaire/questionnaire.dom-watch.d.ts +9 -0
  376. package/dist/components/questionnaire/questionnaire.dom-watch.js +18 -0
  377. package/dist/components/questionnaire/questionnaire.dom-watch.js.map +1 -0
  378. package/dist/components/questionnaire/questionnaire.focus.d.ts +26 -0
  379. package/dist/components/questionnaire/questionnaire.focus.js +19 -0
  380. package/dist/components/questionnaire/questionnaire.focus.js.map +1 -0
  381. package/dist/components/questionnaire/questionnaire.item-view.d.ts +50 -0
  382. package/dist/components/questionnaire/questionnaire.item-view.js +36 -0
  383. package/dist/components/questionnaire/questionnaire.item-view.js.map +1 -0
  384. package/dist/components/questionnaire/questionnaire.keys.d.ts +29 -0
  385. package/dist/components/questionnaire/questionnaire.keys.js +34 -0
  386. package/dist/components/questionnaire/questionnaire.keys.js.map +1 -0
  387. package/dist/components/questionnaire/questionnaire.registry.d.ts +21 -0
  388. package/dist/components/questionnaire/questionnaire.registry.js +15 -0
  389. package/dist/components/questionnaire/questionnaire.registry.js.map +1 -0
  390. package/dist/components/questionnaire/questionnaire.shortcuts.d.ts +24 -0
  391. package/dist/components/questionnaire/questionnaire.shortcuts.js +31 -0
  392. package/dist/components/questionnaire/questionnaire.shortcuts.js.map +1 -0
  393. package/dist/components/questionnaire/questionnaire.utils.d.ts +17 -1
  394. package/dist/components/questionnaire/questionnaire.utils.js +5 -2
  395. package/dist/components/questionnaire/questionnaire.utils.js.map +1 -1
  396. package/dist/components/questionnaire/questionnaire.validation.d.ts +43 -0
  397. package/dist/components/questionnaire/questionnaire.validation.js +17 -0
  398. package/dist/components/questionnaire/questionnaire.validation.js.map +1 -0
  399. package/dist/components/questionnaire/useQuestionnaireItem.d.ts +0 -2
  400. package/dist/components/questionnaire/useQuestionnaireItem.js +83 -121
  401. package/dist/components/questionnaire/useQuestionnaireItem.js.map +1 -1
  402. package/dist/components/questionnaire/useQuestionnaireRoot.js +78 -99
  403. package/dist/components/questionnaire/useQuestionnaireRoot.js.map +1 -1
  404. package/dist/components/radio-group/RadioGroup/RadioGroup.js +3 -0
  405. package/dist/components/radio-group/RadioGroup/RadioGroup.js.map +1 -1
  406. package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js +3 -0
  407. package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js.map +1 -1
  408. package/dist/components/resizable/ResizableHandle/resizable.handle-drag.d.ts +37 -0
  409. package/dist/components/resizable/ResizableHandle/resizable.handle-drag.js +37 -0
  410. package/dist/components/resizable/ResizableHandle/resizable.handle-drag.js.map +1 -0
  411. package/dist/components/resizable/ResizableHandle/resizable.handle-keys.d.ts +24 -0
  412. package/dist/components/resizable/ResizableHandle/resizable.handle-keys.js +36 -0
  413. package/dist/components/resizable/ResizableHandle/resizable.handle-keys.js.map +1 -0
  414. package/dist/components/resizable/ResizableHandle/useResizableHandle.d.ts +3 -4
  415. package/dist/components/resizable/ResizableHandle/useResizableHandle.js +30 -63
  416. package/dist/components/resizable/ResizableHandle/useResizableHandle.js.map +1 -1
  417. package/dist/components/resizable/ResizablePanel/ResizablePanel.d.ts +4 -2
  418. package/dist/components/resizable/ResizablePanel/ResizablePanel.js +23 -50
  419. package/dist/components/resizable/ResizablePanel/ResizablePanel.js.map +1 -1
  420. package/dist/components/resizable/ResizablePanel/useResizablePanel.d.ts +30 -0
  421. package/dist/components/resizable/ResizablePanel/useResizablePanel.js +37 -0
  422. package/dist/components/resizable/ResizablePanel/useResizablePanel.js.map +1 -0
  423. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.d.ts +4 -1
  424. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js +10 -17
  425. package/dist/components/resizable/ResizablePanelGroup/ResizablePanelGroup.js.map +1 -1
  426. package/dist/components/resizable/ResizablePanelGroup/useDragCursor.d.ts +11 -0
  427. package/dist/components/resizable/ResizablePanelGroup/useDragCursor.js +17 -0
  428. package/dist/components/resizable/ResizablePanelGroup/useDragCursor.js.map +1 -0
  429. package/dist/components/resizable/resizable.collapse.d.ts +27 -0
  430. package/dist/components/resizable/resizable.collapse.js +24 -0
  431. package/dist/components/resizable/resizable.collapse.js.map +1 -0
  432. package/dist/components/resizable/resizable.commands.d.ts +32 -0
  433. package/dist/components/resizable/resizable.commands.js +40 -0
  434. package/dist/components/resizable/resizable.commands.js.map +1 -0
  435. package/dist/components/resizable/resizable.constraints.d.ts +23 -0
  436. package/dist/components/resizable/resizable.constraints.js +32 -0
  437. package/dist/components/resizable/resizable.constraints.js.map +1 -0
  438. package/dist/components/resizable/resizable.lifecycle.d.ts +35 -0
  439. package/dist/components/resizable/resizable.lifecycle.js +32 -0
  440. package/dist/components/resizable/resizable.lifecycle.js.map +1 -0
  441. package/dist/components/resizable/resizable.registry.d.ts +31 -0
  442. package/dist/components/resizable/resizable.registry.js +38 -0
  443. package/dist/components/resizable/resizable.registry.js.map +1 -0
  444. package/dist/components/resizable/resizable.reporting.d.ts +36 -0
  445. package/dist/components/resizable/resizable.reporting.js +33 -0
  446. package/dist/components/resizable/resizable.reporting.js.map +1 -0
  447. package/dist/components/resizable/resizable.resize.d.ts +47 -0
  448. package/dist/components/resizable/resizable.resize.js +28 -0
  449. package/dist/components/resizable/resizable.resize.js.map +1 -0
  450. package/dist/components/resizable/resizable.sizes.d.ts +31 -0
  451. package/dist/components/resizable/resizable.sizes.js +46 -0
  452. package/dist/components/resizable/resizable.sizes.js.map +1 -0
  453. package/dist/components/resizable/resizable.storage.d.ts +17 -0
  454. package/dist/components/resizable/resizable.storage.js +29 -0
  455. package/dist/components/resizable/resizable.storage.js.map +1 -0
  456. package/dist/components/resizable/resizable.utils.d.ts +10 -3
  457. package/dist/components/resizable/resizable.utils.js +16 -10
  458. package/dist/components/resizable/resizable.utils.js.map +1 -1
  459. package/dist/components/resizable/useResizablePanelGroup.js +62 -164
  460. package/dist/components/resizable/useResizablePanelGroup.js.map +1 -1
  461. package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js +1 -1
  462. package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js.map +1 -1
  463. package/dist/components/scroll-area/ScrollArea/ScrollArea.d.ts +9 -0
  464. package/dist/components/scroll-area/ScrollArea/ScrollArea.js +28 -39
  465. package/dist/components/scroll-area/ScrollArea/ScrollArea.js.map +1 -1
  466. package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js +3 -3
  467. package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js.map +1 -1
  468. package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.d.ts +22 -0
  469. package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.js +34 -0
  470. package/dist/components/scroll-area/ScrollArea/useScrollAreaMetrics.js.map +1 -0
  471. package/dist/components/scroll-area/ScrollBar/ScrollBar.d.ts +8 -0
  472. package/dist/components/scroll-area/ScrollBar/ScrollBar.js +38 -71
  473. package/dist/components/scroll-area/ScrollBar/ScrollBar.js.map +1 -1
  474. package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.d.ts +56 -0
  475. package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.js +61 -0
  476. package/dist/components/scroll-area/ScrollBar/ScrollBar.utils.js.map +1 -0
  477. package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.d.ts +25 -0
  478. package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.js +26 -0
  479. package/dist/components/scroll-area/ScrollBar/scroll-bar.thumb-drag.js.map +1 -0
  480. package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.d.ts +19 -0
  481. package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.js +37 -0
  482. package/dist/components/scroll-area/ScrollBar/useScrollBarInteraction.js.map +1 -0
  483. package/dist/components/scroll-arrows/ScrollArrowButton.d.ts +5 -7
  484. package/dist/components/scroll-arrows/ScrollArrowButton.js +14 -44
  485. package/dist/components/scroll-arrows/ScrollArrowButton.js.map +1 -1
  486. package/dist/components/scroll-arrows/ScrollArrows.d.ts +4 -3
  487. package/dist/components/scroll-arrows/ScrollArrows.js +16 -22
  488. package/dist/components/scroll-arrows/ScrollArrows.js.map +1 -1
  489. package/dist/components/scroll-arrows/ScrollArrows.types.d.ts +7 -7
  490. package/dist/components/scroll-arrows/useHoverScroll.d.ts +29 -0
  491. package/dist/components/scroll-arrows/useHoverScroll.js +39 -0
  492. package/dist/components/scroll-arrows/useHoverScroll.js.map +1 -0
  493. package/dist/components/select/SelectContent/useSelectContent.js +3 -3
  494. package/dist/components/select/SelectGroup/SelectGroup.d.ts +8 -2
  495. package/dist/components/select/SelectGroup/SelectGroup.js +20 -6
  496. package/dist/components/select/SelectGroup/SelectGroup.js.map +1 -1
  497. package/dist/components/select/SelectGroup/SelectGroup.types.d.ts +9 -0
  498. package/dist/components/select/SelectGroup/index.d.ts +1 -0
  499. package/dist/components/select/SelectTrigger/SelectTrigger.js.map +1 -1
  500. package/dist/components/select/SelectTrigger/useSelectTrigger.js +1 -1
  501. package/dist/components/select/SelectTrigger/useSelectTrigger.js.map +1 -1
  502. package/dist/components/separator/Separator.js +3 -0
  503. package/dist/components/separator/Separator.js.map +1 -1
  504. package/dist/components/sheet/SheetClose/SheetClose.js +18 -17
  505. package/dist/components/sheet/SheetClose/SheetClose.js.map +1 -1
  506. package/dist/components/sidebar/Sidebar/Sidebar.js +14 -6
  507. package/dist/components/sidebar/Sidebar/Sidebar.js.map +1 -1
  508. package/dist/components/sidebar/SidebarContent/SidebarContent.js +8 -3
  509. package/dist/components/sidebar/SidebarContent/SidebarContent.js.map +1 -1
  510. package/dist/components/sidebar/SidebarFooter/SidebarFooter.js +8 -3
  511. package/dist/components/sidebar/SidebarFooter/SidebarFooter.js.map +1 -1
  512. package/dist/components/sidebar/SidebarGroup/SidebarGroup.js +8 -3
  513. package/dist/components/sidebar/SidebarGroup/SidebarGroup.js.map +1 -1
  514. package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js +3 -0
  515. package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js.map +1 -1
  516. package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js +8 -3
  517. package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js.map +1 -1
  518. package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js +3 -0
  519. package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js.map +1 -1
  520. package/dist/components/sidebar/SidebarHeader/SidebarHeader.js +8 -3
  521. package/dist/components/sidebar/SidebarHeader/SidebarHeader.js.map +1 -1
  522. package/dist/components/sidebar/SidebarInput/SidebarInput.js +3 -0
  523. package/dist/components/sidebar/SidebarInput/SidebarInput.js.map +1 -1
  524. package/dist/components/sidebar/SidebarInset/SidebarInset.js +8 -3
  525. package/dist/components/sidebar/SidebarInset/SidebarInset.js.map +1 -1
  526. package/dist/components/sidebar/SidebarMenu/SidebarMenu.js +8 -3
  527. package/dist/components/sidebar/SidebarMenu/SidebarMenu.js.map +1 -1
  528. package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js +8 -3
  529. package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js.map +1 -1
  530. package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js +6 -0
  531. package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js.map +1 -1
  532. package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js +8 -3
  533. package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js.map +1 -1
  534. package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js +8 -3
  535. package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js.map +1 -1
  536. package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js +8 -3
  537. package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js.map +1 -1
  538. package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js +3 -0
  539. package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js.map +1 -1
  540. package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js +8 -3
  541. package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js.map +1 -1
  542. package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js +1 -1
  543. package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js.map +1 -1
  544. package/dist/components/sidebar/SidebarProvider/SidebarProvider.js +30 -27
  545. package/dist/components/sidebar/SidebarProvider/SidebarProvider.js.map +1 -1
  546. package/dist/components/sidebar/SidebarProvider/useIsMobile.d.ts +10 -0
  547. package/dist/components/sidebar/SidebarProvider/useIsMobile.js +14 -0
  548. package/dist/components/sidebar/SidebarProvider/useIsMobile.js.map +1 -0
  549. package/dist/components/sidebar/SidebarRail/SidebarRail.js +8 -3
  550. package/dist/components/sidebar/SidebarRail/SidebarRail.js.map +1 -1
  551. package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js +3 -0
  552. package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js.map +1 -1
  553. package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js +3 -0
  554. package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js.map +1 -1
  555. package/dist/components/skeleton/Skeleton.js +8 -3
  556. package/dist/components/skeleton/Skeleton.js.map +1 -1
  557. package/dist/components/slider/Slider/Slider.context.js +1 -1
  558. package/dist/components/slider/Slider/Slider.context.js.map +1 -1
  559. package/dist/components/slider/Slider/Slider.js +3 -0
  560. package/dist/components/slider/Slider/Slider.js.map +1 -1
  561. package/dist/components/slider/SliderControl/SliderControl.js +4 -1
  562. package/dist/components/slider/SliderControl/SliderControl.js.map +1 -1
  563. package/dist/components/slider/SliderIndicator/SliderIndicator.js +3 -0
  564. package/dist/components/slider/SliderIndicator/SliderIndicator.js.map +1 -1
  565. package/dist/components/slider/SliderThumb/SliderThumb.js +18 -3
  566. package/dist/components/slider/SliderThumb/SliderThumb.js.map +1 -1
  567. package/dist/components/slider/SliderThumb/useSliderThumb.d.ts +1 -0
  568. package/dist/components/slider/SliderThumb/useSliderThumb.js +3 -2
  569. package/dist/components/slider/SliderThumb/useSliderThumb.js.map +1 -1
  570. package/dist/components/slider/SliderTrack/SliderTrack.js +3 -0
  571. package/dist/components/slider/SliderTrack/SliderTrack.js.map +1 -1
  572. package/dist/components/spinner/Spinner.js +3 -0
  573. package/dist/components/spinner/Spinner.js.map +1 -1
  574. package/dist/components/switch/Switch.js +7 -0
  575. package/dist/components/switch/Switch.js.map +1 -1
  576. package/dist/components/tabs/Tabs/Tabs.context.js +1 -1
  577. package/dist/components/tabs/Tabs/Tabs.context.js.map +1 -1
  578. package/dist/components/tabs/Tabs/useTabsKeyboard.d.ts +7 -11
  579. package/dist/components/tabs/Tabs/useTabsKeyboard.js +8 -42
  580. package/dist/components/tabs/Tabs/useTabsKeyboard.js.map +1 -1
  581. package/dist/components/tabs/TabsList/TabsList.context.js +1 -1
  582. package/dist/components/tabs/TabsList/TabsList.context.js.map +1 -1
  583. package/dist/components/tabs/TabsList/TabsList.js +10 -10
  584. package/dist/components/tabs/TabsList/TabsList.js.map +1 -1
  585. package/dist/components/tabs/TabsTrigger/TabsTrigger.js +8 -8
  586. package/dist/components/tabs/TabsTrigger/TabsTrigger.js.map +1 -1
  587. package/dist/components/textarea/Textarea.js +8 -3
  588. package/dist/components/textarea/Textarea.js.map +1 -1
  589. package/dist/components/time-picker/TimePicker/create-change-event-details.d.ts +1 -2
  590. package/dist/components/time-picker/TimePicker/create-change-event-details.js +4 -20
  591. package/dist/components/time-picker/TimePicker/create-change-event-details.js.map +1 -1
  592. package/dist/components/time-picker/TimePickerColumn/TimePickerColumn.js +1 -3
  593. package/dist/components/time-picker/TimePickerColumn/TimePickerColumn.js.map +1 -1
  594. package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.d.ts +34 -0
  595. package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.js +43 -0
  596. package/dist/components/time-picker/TimePickerColumn/time-picker.column-utils.js.map +1 -0
  597. package/dist/components/time-picker/TimePickerColumn/useTimePickerColumn.js +34 -59
  598. package/dist/components/time-picker/TimePickerColumn/useTimePickerColumn.js.map +1 -1
  599. package/dist/components/toast/Toast/Toast.d.ts +8 -2
  600. package/dist/components/toast/Toast/Toast.js +92 -146
  601. package/dist/components/toast/Toast/Toast.js.map +1 -1
  602. package/dist/components/toast/Toast/Toast.types.d.ts +1 -1
  603. package/dist/components/toast/Toast/Toast.types.js.map +1 -1
  604. package/dist/components/toast/Toast/Toast.utils.d.ts +47 -0
  605. package/dist/components/toast/Toast/Toast.utils.js +47 -0
  606. package/dist/components/toast/Toast/Toast.utils.js.map +1 -0
  607. package/dist/components/toast/Toast/ToastActionButton.d.ts +16 -0
  608. package/dist/components/toast/Toast/ToastActionButton.js +27 -0
  609. package/dist/components/toast/Toast/ToastActionButton.js.map +1 -0
  610. package/dist/components/toast/Toast/ToastActions.d.ts +12 -0
  611. package/dist/components/toast/Toast/ToastActions.js +65 -0
  612. package/dist/components/toast/Toast/ToastActions.js.map +1 -0
  613. package/dist/components/toast/Toast/ToastCloseButton.d.ts +12 -0
  614. package/dist/components/toast/Toast/ToastCloseButton.js +26 -0
  615. package/dist/components/toast/Toast/ToastCloseButton.js.map +1 -0
  616. package/dist/components/toast/Toast/ToastContent.d.ts +8 -0
  617. package/dist/components/toast/Toast/ToastContent.js +30 -0
  618. package/dist/components/toast/Toast/ToastContent.js.map +1 -0
  619. package/dist/components/toast/Toast/ToastIcon.d.ts +14 -0
  620. package/dist/components/toast/Toast/ToastIcon.js +36 -0
  621. package/dist/components/toast/Toast/ToastIcon.js.map +1 -0
  622. package/dist/components/toast/Toast/useToastLifecycle.d.ts +29 -0
  623. package/dist/components/toast/Toast/useToastLifecycle.js +30 -0
  624. package/dist/components/toast/Toast/useToastLifecycle.js.map +1 -0
  625. package/dist/components/toast/Toaster/ToastViewport.d.ts +33 -0
  626. package/dist/components/toast/Toaster/ToastViewport.js +73 -0
  627. package/dist/components/toast/Toaster/ToastViewport.js.map +1 -0
  628. package/dist/components/toast/Toaster/Toaster.d.ts +4 -0
  629. package/dist/components/toast/Toaster/Toaster.js +64 -82
  630. package/dist/components/toast/Toaster/Toaster.js.map +1 -1
  631. package/dist/components/toast/Toaster/Toaster.utils.d.ts +15 -0
  632. package/dist/components/toast/Toaster/Toaster.utils.js +4 -1
  633. package/dist/components/toast/Toaster/Toaster.utils.js.map +1 -1
  634. package/dist/components/toast/Toaster/useToaster.d.ts +28 -0
  635. package/dist/components/toast/Toaster/useToaster.js +26 -0
  636. package/dist/components/toast/Toaster/useToaster.js.map +1 -0
  637. package/dist/components/toast/index.js +4 -3
  638. package/dist/components/toast/state/promise-toast.d.ts +17 -0
  639. package/dist/components/toast/state/promise-toast.js +33 -0
  640. package/dist/components/toast/state/promise-toast.js.map +1 -0
  641. package/dist/components/toast/state/store.d.ts +21 -0
  642. package/dist/components/toast/state/store.js +45 -0
  643. package/dist/components/toast/state/store.js.map +1 -0
  644. package/dist/components/toast/state/toast.d.ts +9 -10
  645. package/dist/components/toast/state/toast.js +30 -89
  646. package/dist/components/toast/state/toast.js.map +1 -1
  647. package/dist/components/toggle/Toggle/Toggle.js +2 -1
  648. package/dist/components/toggle/Toggle/Toggle.js.map +1 -1
  649. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +1 -1
  650. package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -1
  651. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.d.ts +6 -2
  652. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js +4 -20
  653. package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js.map +1 -1
  654. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.d.ts +7 -10
  655. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js +10 -40
  656. package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js.map +1 -1
  657. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js +5 -5
  658. package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js.map +1 -1
  659. package/dist/components/tooltip/TooltipContent/usePresence.d.ts +27 -0
  660. package/dist/components/tooltip/TooltipContent/usePresence.js +24 -0
  661. package/dist/components/tooltip/TooltipContent/usePresence.js.map +1 -0
  662. package/dist/components/tooltip/TooltipContent/useTooltipContent.js +22 -35
  663. package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
  664. package/dist/hooks/useFontLoader.js +1 -1
  665. package/dist/hooks/useFontLoader.js.map +1 -1
  666. package/dist/hooks/useScrollLock.js +13 -16
  667. package/dist/hooks/useScrollLock.js.map +1 -1
  668. package/dist/index.js +328 -320
  669. package/dist/lib/positioner/index.d.ts +1 -0
  670. package/dist/lib/positioner/utils/dom.d.ts +8 -0
  671. package/dist/lib/positioner/utils/dom.js +1 -1
  672. package/dist/lib/positioner/utils/dom.js.map +1 -1
  673. package/dist/types/props.types.d.ts +1 -1
  674. package/dist/ui.css +1 -1
  675. package/dist/utils/call-event-handler.d.ts +16 -0
  676. package/dist/utils/call-event-handler.js +15 -0
  677. package/dist/utils/call-event-handler.js.map +1 -0
  678. package/dist/utils/clsx.d.ts +1 -1
  679. package/dist/utils/clsx.js +2 -7
  680. package/dist/utils/create-change-event-details.d.ts +25 -0
  681. package/dist/utils/create-change-event-details.js +25 -0
  682. package/dist/utils/create-change-event-details.js.map +1 -0
  683. package/dist/utils/get-style.d.ts +7 -9
  684. package/dist/utils/get-style.js +16 -0
  685. package/dist/utils/get-style.js.map +1 -0
  686. package/dist/utils/index.d.ts +8 -0
  687. package/dist/utils/index.js +7 -1
  688. package/dist/utils/number.d.ts +7 -0
  689. package/dist/utils/number.js +8 -0
  690. package/dist/utils/number.js.map +1 -0
  691. package/dist/utils/roving-navigation.d.ts +64 -0
  692. package/dist/utils/roving-navigation.js +66 -0
  693. package/dist/utils/roving-navigation.js.map +1 -0
  694. package/dist/utils/string.d.ts +17 -0
  695. package/dist/utils/string.js +11 -0
  696. package/dist/utils/string.js.map +1 -0
  697. package/package.json +18 -7
  698. package/dist/components/carousel/Carousel/Carousel.utils.d.ts +0 -0
  699. package/dist/components/field/FieldError/useFieldError.d.ts +0 -0
  700. package/dist/components/hover-card/hover-card.utils.d.ts +0 -6
  701. package/dist/components/tabs/Tabs/call-event-handler.d.ts +0 -5
  702. package/dist/components/tabs/Tabs/call-event-handler.js +0 -9
  703. package/dist/components/tabs/Tabs/call-event-handler.js.map +0 -1
  704. package/dist/components/toggle-group/call-event-handler.d.ts +0 -5
  705. package/dist/components/toggle-group/call-event-handler.js +0 -9
  706. package/dist/components/toggle-group/call-event-handler.js.map +0 -1
  707. package/dist/utils/clsx.js.map +0 -1
@@ -1,141 +1,103 @@
1
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";
2
+ import { buildDescribedBy as t, buildItemKeyshortcuts as n, createIdRegistry as r } from "./questionnaire.aria.js";
3
+ import { createAnswerBookkeeping as i } from "./questionnaire.answers.js";
4
+ import { focusItem as a, moveAnswerFocus as o } from "./questionnaire.focus.js";
5
+ import { buildShortcutByAnswerId as s, buildShortcutByChoiceValue as c, findAnswerByShortcut as l } from "./questionnaire.shortcuts.js";
6
+ import { findNativeInvalidAnswer as u, isItemSatisfied as d, resolveItemInvalid as f } from "./questionnaire.validation.js";
7
+ import { createMemo as p, createSignal as m } from "solid-js";
4
8
  //#region src/components/questionnaire/useQuestionnaireItem.ts
5
- function 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);
9
+ function h(h) {
10
+ let g = e("QuestionnaireItem"), [_, v] = m(), y = i({
11
+ multiple: h.multiple,
12
+ required: h.required
13
+ }), { answers: b, selections: x, touched: S, resetVersion: C, status: w, skippable: T, answeredOk: E, hasInputAnswer: D, registerAnswerControl: O, registerAnswerSelection: k, setAnswerDefault: A, setAnswerSelectionFromInteraction: j, syncControlledAnswerSelection: M, getAnswerByElement: N } = y, P = r(), F = r(), I = p(() => g.activeItemName() === h.name), L = p(() => f({
14
+ disabled: h.disabled(),
15
+ invalid: h.invalid(),
16
+ skippable: T(),
17
+ touched: S(),
18
+ answeredOk: E()
19
+ })), R = () => a(_()), z = () => {
20
+ if (y.markTouched(), !d({
21
+ disabled: h.disabled(),
22
+ status: w(),
23
+ required: h.required(),
24
+ invalid: h.invalid()
25
+ })) return !1;
26
+ if (!g.nativeValidation()) return !0;
27
+ let e = u(b());
35
28
  return !e || (e.element.focus(), e.element.reportValidity(), !1);
36
- }, H = () => {
37
- 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
- };
29
+ }, B = p(() => c(g.itemDefinitions()?.get(h.name), g.shortcuts())), V = p(() => s(b(), B() !== null, g.shortcuts())), H = (e) => l(e, {
30
+ byChoiceValue: B(),
31
+ byAnswerId: V(),
32
+ answers: b()
33
+ }), U = (e, t) => o({
34
+ scope: _(),
35
+ target: e,
36
+ direction: t,
37
+ answers: b()
38
+ }), W = () => t(P.ids(), F.ids(), L()), G = () => n({
39
+ active: I(),
40
+ hasAnswers: b().length > 0,
41
+ first: g.state().first,
42
+ last: g.state().last,
43
+ status: w()
44
+ });
83
45
  return {
84
46
  context: {
85
- name: 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,
47
+ name: h.name,
48
+ active: I,
49
+ disabled: h.disabled,
50
+ invalid: L,
51
+ multiple: h.multiple,
52
+ required: h.required,
53
+ status: w,
54
+ hasInputAnswer: D,
55
+ selectedAnswerIds: x,
56
+ resetVersion: C,
57
+ shortcutByAnswerId: V,
58
+ shortcutByChoiceValue: B,
59
+ shortcuts: g.shortcuts,
98
60
  registerAnswerControl: O,
99
- registerAnswerSelection: 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
61
+ registerAnswerSelection: k,
62
+ registerDescription: P.register,
63
+ registerError: F.register,
64
+ setAnswerDefault: A,
65
+ setAnswerSelectionFromInteraction: j,
66
+ syncControlledAnswerSelection: M
105
67
  },
106
68
  itemProps: () => ({
107
- "aria-describedby": Y(),
108
- "aria-invalid": z() || void 0,
109
- "aria-keyshortcuts": X(),
110
- disabled: s.disabled(),
111
- hidden: !D(),
112
- inert: !D(),
69
+ "aria-describedby": W(),
70
+ "aria-invalid": L() || void 0,
71
+ "aria-keyshortcuts": G(),
72
+ disabled: h.disabled(),
73
+ hidden: !I(),
74
+ inert: !I(),
113
75
  tabIndex: -1
114
76
  }),
115
77
  registerElement: (e) => {
116
- u(e);
78
+ v(e);
117
79
  let t = {
118
- name: s.name,
80
+ name: h.name,
119
81
  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
82
+ disabled: h.disabled,
83
+ required: h.required,
84
+ status: w,
85
+ validate: z,
86
+ focus: R,
87
+ focusInvalid: R,
88
+ skip: y.skip,
89
+ reset: y.reset,
90
+ getAnswerByElement: N,
91
+ getAnswerByShortcut: H,
92
+ moveAnswerFocus: U
131
93
  };
132
- return c.registerItem(t);
94
+ return g.registerItem(t);
133
95
  },
134
- describedBy: Y,
135
- keyshortcuts: X
96
+ describedBy: W,
97
+ keyshortcuts: G
136
98
  };
137
99
  }
138
100
  //#endregion
139
- export { s as useQuestionnaireItem };
101
+ export { h as useQuestionnaireItem };
140
102
 
141
103
  //# sourceMappingURL=useQuestionnaireItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQuestionnaireItem.js","names":["useQuestionnaireItem","root","useQuestionnaireRootContext","element","setElement","createSignal","answers","setAnswers","selections","setSelections","defaults","setDefaults","skipped","setSkipped","touched","setTouched","resetVersion","setResetVersion","descriptionIds","setDescriptionIds","errorIds","setErrorIds","active","createMemo","options","registerAnswerControl","prev","item","entry","applySelection","selected","id","value","registerAnswerSelection","initialSelected","setAnswerDefault","setAnswerSelectionFromInteraction","syncControlledAnswerSelection","isEntryDisabled","hasInputAnswer","status","skippable","answeredOk","invalid","focus","target","filled","anyInput","validate","answer","isAnswerFilled","skip","reset","getAnswerByElement","shortcutByChoiceValue","mode","definition","alphabet","shortcutAlphabet","map","cursor","choice","letter","shortcutByAnswerId","choices","index","getAnswerByShortcut","byValue","shortcut","moveAnswerFocus","scope","focusable","isTypingElement","position","next","direction","isNativeRadio","describedBy","ids","keyshortcuts","state","handle"],"sources":["../../../src/components/questionnaire/useQuestionnaireItem.ts"],"sourcesContent":["import { createMemo, createSignal, type Accessor } from \"solid-js\";\nimport {\n useQuestionnaireRootContext,\n type QuestionnaireAnswerEntry,\n type QuestionnaireItemContextValue,\n type QuestionnaireItemHandle,\n} from \"./questionnaire.context\";\nimport type { QuestionnaireItemStatus } from \"./questionnaire.types\";\nimport {\n isAnswerFilled,\n isNativeRadio,\n isTypingElement,\n shortcutAlphabet,\n} from \"./questionnaire.utils\";\n\ninterface Options {\n name: string;\n required: Accessor<boolean>;\n multiple: Accessor<boolean>;\n disabled: Accessor<boolean>;\n invalid: Accessor<boolean>;\n onStatusChange?: (status: QuestionnaireItemStatus) => void;\n}\n\nexport interface QuestionnaireItemDomProps {\n \"aria-describedby\": string | undefined;\n \"aria-invalid\": boolean | undefined;\n \"aria-keyshortcuts\": string | undefined;\n disabled: boolean;\n hidden: boolean;\n inert: boolean;\n tabIndex: number;\n}\n\nexport interface UseQuestionnaireItemResult {\n context: QuestionnaireItemContextValue;\n /** 反应式:每次读取都根据当前 active/invalid 重新计算 */\n itemProps: () => QuestionnaireItemDomProps;\n describedBy: () => string | undefined;\n keyshortcuts: () => string | undefined;\n /** 在 fieldset 的 ref 里调用:登记 DOM 元素并把句柄注册到 Root */\n registerElement: (element: HTMLElement) => () => void;\n}\n\n/**\n * 单个题目的状态:答案注册与选中、跳过、校验、快捷键,以及给 Root 的句柄。\n */\nexport function useQuestionnaireItem(\n options: Options,\n): UseQuestionnaireItemResult {\n const root = useQuestionnaireRootContext(\"QuestionnaireItem\");\n\n const [element, setElement] = createSignal<HTMLElement>();\n const [answers, setAnswers] = createSignal<QuestionnaireAnswerEntry[]>([]);\n const [selections, setSelections] = createSignal<string[]>([]);\n const [defaults, setDefaults] = createSignal<string[]>([]);\n const [skipped, setSkipped] = createSignal(false);\n const [touched, setTouched] = createSignal(false);\n const [resetVersion, setResetVersion] = createSignal(0);\n const [descriptionIds, setDescriptionIds] = createSignal<string[]>([]);\n const [errorIds, setErrorIds] = createSignal<string[]>([]);\n\n const active = createMemo(() => root.activeItemName() === options.name);\n\n const registerAnswerControl = (entry: QuestionnaireAnswerEntry) => {\n setAnswers((prev) => [\n ...prev.filter(\n (item) => item.id !== entry.id && item.element !== entry.element,\n ),\n entry,\n ]);\n return () => setAnswers((prev) => prev.filter((item) => item !== entry));\n };\n\n const applySelection = (id: string, selected: boolean) => {\n setSelections((prev) => {\n if (selected) {\n return options.multiple()\n ? prev.includes(id)\n ? prev\n : [...prev, id]\n : [id];\n }\n return prev.filter((value) => value !== id);\n });\n };\n\n const registerAnswerSelection = (id: string, initialSelected: boolean) => {\n if (initialSelected) {\n setSelections((prev) =>\n options.multiple()\n ? prev.includes(id)\n ? prev\n : [...prev, id]\n : prev.length\n ? prev\n : [id],\n );\n }\n return () => {\n setSelections((prev) => prev.filter((value) => value !== id));\n setDefaults((prev) => prev.filter((value) => value !== id));\n };\n };\n\n const setAnswerDefault = (id: string, selected: boolean) => {\n setDefaults((prev) => {\n if (selected) return prev.includes(id) ? prev : [...prev, id];\n return prev.filter((value) => value !== id);\n });\n };\n\n const setAnswerSelectionFromInteraction = (id: string, selected: boolean) => {\n setSkipped(false);\n applySelection(id, selected);\n };\n\n const syncControlledAnswerSelection = (id: string, selected: boolean) => {\n applySelection(id, selected);\n };\n\n const isEntryDisabled = (entry: QuestionnaireAnswerEntry) =>\n entry.disabled || entry.element.disabled;\n\n const hasInputAnswer = createMemo(() =>\n answers().some(\n (entry) =>\n entry.type === \"input\" &&\n ![\"button\", \"checkbox\", \"radio\", \"reset\", \"submit\"].includes(\n entry.element.type,\n ),\n ),\n );\n\n const status = createMemo<QuestionnaireItemStatus>(() => {\n if (skipped()) return \"skipped\";\n const selected = selections();\n const answered = answers().some(\n (entry) => selected.includes(entry.id) && !isEntryDisabled(entry),\n );\n return answered ? \"answered\" : \"unanswered\";\n });\n\n const skippable = createMemo(\n () => status() === \"skipped\" && !options.required(),\n );\n const answeredOk = createMemo(() => status() === \"answered\");\n\n const invalid = createMemo(\n () =>\n !options.disabled() &&\n !skippable() &&\n (options.invalid() ||\n (touched() && !(skippable() || (!options.invalid() && answeredOk())))),\n );\n\n const focus = () => {\n const target = element();\n if (!target) return;\n const filled = target.querySelector<HTMLElement>(\n \"input[data-filled][name]:not(:disabled)\",\n );\n const anyInput = target.querySelector<HTMLElement>(\n \"input:not([type=hidden]):not(:disabled), textarea:not(:disabled)\",\n );\n (filled ?? anyInput ?? target).focus();\n };\n\n const validate = () => {\n setTouched(true);\n const satisfied =\n options.disabled() ||\n (status() === \"skipped\" && !options.required()) ||\n (!options.invalid() && status() === \"answered\");\n if (!satisfied) return false;\n if (!root.nativeValidation()) return true;\n const answer = answers().find(\n (entry) =>\n isAnswerFilled(entry) &&\n entry.element.willValidate &&\n !entry.element.validity.valid,\n );\n if (answer) {\n answer.element.focus();\n answer.element.reportValidity();\n return false;\n }\n return true;\n };\n\n const skip = () => {\n if (options.required()) return;\n setSelections([]);\n setSkipped(true);\n };\n\n const reset = () => {\n setTouched(false);\n setSkipped(false);\n setSelections(\n options.multiple() ? [...defaults()] : defaults().slice(0, 1),\n );\n setResetVersion((value) => value + 1);\n };\n\n const getAnswerByElement = (target: Element) =>\n answers().find((entry) => entry.element === target) ?? null;\n\n const shortcutByChoiceValue = createMemo<Map<string, string> | null>(() => {\n const mode = root.shortcuts();\n const definition = root.itemDefinitions()?.get(options.name);\n if (!mode || !definition?.choices) return null;\n const alphabet = shortcutAlphabet(mode);\n const map = new Map<string, string>();\n let cursor = 0;\n for (const choice of definition.choices) {\n if (choice.disabled) continue;\n const letter = alphabet[cursor];\n if (!letter) break;\n map.set(choice.value, letter);\n cursor += 1;\n }\n return map;\n });\n\n const shortcutByAnswerId = createMemo<Map<string, string>>(() => {\n if (shortcutByChoiceValue()) return new Map();\n const alphabet = shortcutAlphabet(root.shortcuts());\n const choices = answers().filter((entry) => entry.type === \"choice\");\n return new Map(\n choices\n .slice(0, alphabet.length)\n .map((entry, index) => [entry.id, alphabet[index]!]),\n );\n });\n\n const getAnswerByShortcut = (shortcut: string) => {\n const byValue = shortcutByChoiceValue();\n if (byValue) {\n const value = [...byValue.entries()].find(\n ([, letter]) => letter === shortcut,\n )?.[0];\n return (\n answers().find(\n (entry) => entry.type === \"choice\" && entry.value === value,\n ) ?? null\n );\n }\n const id = [...shortcutByAnswerId().entries()].find(\n ([, letter]) => letter === shortcut,\n )?.[0];\n return answers().find((entry) => entry.id === id) ?? null;\n };\n\n const moveAnswerFocus = (target: Element, direction: \"next\" | \"previous\") => {\n const scope = element();\n const focusable = answers().filter(\n (entry) =>\n !isEntryDisabled(entry) &&\n entry.element.isConnected &&\n !(isTypingElement(target) && entry.type === \"input\"),\n );\n if (!focusable.length) return false;\n const position = focusable.findIndex((entry) => entry.element === target);\n if (position < 0 && target !== scope) return false;\n const nextIndex =\n position < 0\n ? direction === \"next\"\n ? 0\n : focusable.length - 1\n : (position + (direction === \"next\" ? 1 : -1) + focusable.length) %\n focusable.length;\n const next = focusable[nextIndex];\n if (!next || next.element === target) return false;\n next.element.focus();\n if (next.type === \"choice\" && isNativeRadio(next.element)) {\n (next.element as HTMLInputElement).click();\n }\n return true;\n };\n\n const describedBy = () => {\n const ids = [...descriptionIds(), ...(invalid() ? errorIds() : [])];\n return [...new Set(ids)].join(\" \") || undefined;\n };\n\n const keyshortcuts = () => {\n if (!active()) return undefined;\n const state = root.state();\n return (\n [\n \"Meta+Enter Control+Enter\",\n answers().length ? \"ArrowUp ArrowDown\" : null,\n !state.first ? \"ArrowLeft\" : null,\n !state.last && status() !== \"unanswered\" ? \"ArrowRight\" : null,\n ]\n .filter(Boolean)\n .join(\" \") || undefined\n );\n };\n\n const registerDescription = (id: string) => {\n setDescriptionIds((prev) => (prev.includes(id) ? prev : [...prev, id]));\n return () =>\n setDescriptionIds((prev) => prev.filter((value) => value !== id));\n };\n\n const registerError = (id: string) => {\n setErrorIds((prev) => (prev.includes(id) ? prev : [...prev, id]));\n return () => setErrorIds((prev) => prev.filter((value) => value !== id));\n };\n\n const context: QuestionnaireItemContextValue = {\n name: options.name,\n active,\n disabled: options.disabled,\n invalid,\n multiple: options.multiple,\n required: options.required,\n status,\n hasInputAnswer,\n selectedAnswerIds: selections,\n resetVersion,\n shortcutByAnswerId,\n shortcutByChoiceValue,\n shortcuts: root.shortcuts,\n registerAnswerControl,\n registerAnswerSelection,\n registerDescription,\n registerError,\n setAnswerDefault,\n setAnswerSelectionFromInteraction,\n syncControlledAnswerSelection,\n };\n\n const registerElement = (target: HTMLElement) => {\n setElement(target);\n const handle: QuestionnaireItemHandle = {\n name: options.name,\n element: target,\n disabled: options.disabled,\n required: options.required,\n status,\n validate,\n focus,\n focusInvalid: focus,\n skip,\n reset,\n getAnswerByElement,\n getAnswerByShortcut,\n moveAnswerFocus,\n };\n return root.registerItem(handle);\n };\n\n return {\n context,\n itemProps: () => ({\n \"aria-describedby\": describedBy(),\n \"aria-invalid\": invalid() || undefined,\n \"aria-keyshortcuts\": keyshortcuts(),\n disabled: options.disabled(),\n hidden: !active(),\n inert: !active(),\n tabIndex: -1,\n }),\n registerElement,\n describedBy,\n keyshortcuts,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useQuestionnaireItem.js","names":["moveAnswerFocus","moveAnswerFocusInItem","useQuestionnaireItem","root","useQuestionnaireRootContext","element","setElement","createSignal","book","createAnswerBookkeeping","options","descriptions","createIdRegistry","errors","active","createMemo","invalid","resolveItemInvalid","skippable","touched","answeredOk","focus","focusItem","validate","isItemSatisfied","status","answer","findNativeInvalidAnswer","answers","shortcutByChoiceValue","buildShortcutByChoiceValue","shortcutByAnswerId","buildShortcutByAnswerId","getAnswerByShortcut","findAnswerByShortcut","shortcut","moveAnswerFocus$1","moveAnswerFocus","describedBy","buildDescribedBy","keyshortcuts","buildItemKeyshortcuts","selections","target","handle"],"sources":["../../../src/components/questionnaire/useQuestionnaireItem.ts"],"sourcesContent":["import { createMemo, createSignal, type Accessor } from \"solid-js\";\nimport {\n useQuestionnaireRootContext,\n type QuestionnaireItemContextValue,\n type QuestionnaireItemHandle,\n} from \"./questionnaire.context\";\nimport {\n buildDescribedBy,\n buildItemKeyshortcuts,\n createIdRegistry,\n} from \"./questionnaire.aria\";\nimport { createAnswerBookkeeping } from \"./questionnaire.answers\";\nimport {\n focusItem,\n moveAnswerFocus as moveAnswerFocusInItem,\n} from \"./questionnaire.focus\";\nimport {\n buildShortcutByAnswerId,\n buildShortcutByChoiceValue,\n findAnswerByShortcut,\n} from \"./questionnaire.shortcuts\";\nimport {\n findNativeInvalidAnswer,\n isItemSatisfied,\n resolveItemInvalid,\n} from \"./questionnaire.validation\";\n\ninterface Options {\n name: string;\n required: Accessor<boolean>;\n multiple: Accessor<boolean>;\n disabled: Accessor<boolean>;\n invalid: Accessor<boolean>;\n}\n\nexport interface QuestionnaireItemDomProps {\n \"aria-describedby\": string | undefined;\n \"aria-invalid\": boolean | undefined;\n \"aria-keyshortcuts\": string | undefined;\n disabled: boolean;\n hidden: boolean;\n inert: boolean;\n tabIndex: number;\n}\n\nexport interface UseQuestionnaireItemResult {\n context: QuestionnaireItemContextValue;\n /** 反应式:每次读取都根据当前 active/invalid 重新计算 */\n itemProps: () => QuestionnaireItemDomProps;\n describedBy: () => string | undefined;\n keyshortcuts: () => string | undefined;\n /** 在 fieldset 的 ref 里调用:登记 DOM 元素并把句柄注册到 Root */\n registerElement: (element: HTMLElement) => () => void;\n}\n\n/**\n * 单个题目的状态:答案注册与选中、跳过、校验、快捷键,以及给 Root 的句柄。\n */\nexport function useQuestionnaireItem(\n options: Options,\n): UseQuestionnaireItemResult {\n const root = useQuestionnaireRootContext(\"QuestionnaireItem\");\n\n const [element, setElement] = createSignal<HTMLElement>();\n\n const book = createAnswerBookkeeping({\n multiple: options.multiple,\n required: options.required,\n });\n const {\n answers,\n selections,\n touched,\n resetVersion,\n status,\n skippable,\n answeredOk,\n hasInputAnswer,\n registerAnswerControl,\n registerAnswerSelection,\n setAnswerDefault,\n setAnswerSelectionFromInteraction,\n syncControlledAnswerSelection,\n getAnswerByElement,\n } = book;\n\n const descriptions = createIdRegistry();\n const errors = createIdRegistry();\n\n const active = createMemo(() => root.activeItemName() === options.name);\n\n const invalid = createMemo(() =>\n resolveItemInvalid({\n disabled: options.disabled(),\n invalid: options.invalid(),\n skippable: skippable(),\n touched: touched(),\n answeredOk: answeredOk(),\n }),\n );\n\n const focus = () => focusItem(element());\n\n const validate = () => {\n book.markTouched();\n const satisfied = isItemSatisfied({\n disabled: options.disabled(),\n status: status(),\n required: options.required(),\n invalid: options.invalid(),\n });\n if (!satisfied) return false;\n if (!root.nativeValidation()) return true;\n\n const answer = findNativeInvalidAnswer(answers());\n if (!answer) return true;\n answer.element.focus();\n answer.element.reportValidity();\n return false;\n };\n\n const shortcutByChoiceValue = createMemo(() =>\n buildShortcutByChoiceValue(\n root.itemDefinitions()?.get(options.name),\n root.shortcuts(),\n ),\n );\n\n const shortcutByAnswerId = createMemo(() =>\n buildShortcutByAnswerId(\n answers(),\n shortcutByChoiceValue() !== null,\n root.shortcuts(),\n ),\n );\n\n const getAnswerByShortcut = (shortcut: string) =>\n findAnswerByShortcut(shortcut, {\n byChoiceValue: shortcutByChoiceValue(),\n byAnswerId: shortcutByAnswerId(),\n answers: answers(),\n });\n\n const moveAnswerFocus = (target: Element, direction: \"next\" | \"previous\") =>\n moveAnswerFocusInItem({\n scope: element(),\n target,\n direction,\n answers: answers(),\n });\n\n const describedBy = () =>\n buildDescribedBy(descriptions.ids(), errors.ids(), invalid());\n\n const keyshortcuts = () =>\n buildItemKeyshortcuts({\n active: active(),\n hasAnswers: answers().length > 0,\n first: root.state().first,\n last: root.state().last,\n status: status(),\n });\n\n const context: QuestionnaireItemContextValue = {\n name: options.name,\n active,\n disabled: options.disabled,\n invalid,\n multiple: options.multiple,\n required: options.required,\n status,\n hasInputAnswer,\n selectedAnswerIds: selections,\n resetVersion,\n shortcutByAnswerId,\n shortcutByChoiceValue,\n shortcuts: root.shortcuts,\n registerAnswerControl,\n registerAnswerSelection,\n registerDescription: descriptions.register,\n registerError: errors.register,\n setAnswerDefault,\n setAnswerSelectionFromInteraction,\n syncControlledAnswerSelection,\n };\n\n const registerElement = (target: HTMLElement) => {\n setElement(target);\n const handle: QuestionnaireItemHandle = {\n name: options.name,\n element: target,\n disabled: options.disabled,\n required: options.required,\n status,\n validate,\n focus,\n focusInvalid: focus,\n skip: book.skip,\n reset: book.reset,\n getAnswerByElement,\n getAnswerByShortcut,\n moveAnswerFocus,\n };\n return root.registerItem(handle);\n };\n\n return {\n context,\n itemProps: () => ({\n \"aria-describedby\": describedBy(),\n \"aria-invalid\": invalid() || undefined,\n \"aria-keyshortcuts\": keyshortcuts(),\n disabled: options.disabled(),\n hidden: !active(),\n inert: !active(),\n tabIndex: -1,\n }),\n registerElement,\n describedBy,\n keyshortcuts,\n };\n}\n"],"mappings":"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"}
@@ -1,144 +1,123 @@
1
- import { 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";
1
+ import { createDomVersionWatcher as e } from "./questionnaire.dom-watch.js";
2
+ import { createItemView as t, resolveActiveName as n } from "./questionnaire.item-view.js";
3
+ import { handleQuestionnaireKeyDown as r } from "./questionnaire.keys.js";
4
+ import { createItemRegistry as i } from "./questionnaire.registry.js";
5
+ import { createEffect as a, createSignal as o } from "solid-js";
3
6
  //#region src/components/questionnaire/useQuestionnaireRoot.ts
4
- function 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
- };
7
+ function s(s) {
8
+ let c = i(), l = e(s.formRef), [u, d] = o(null), f = null, p = t({
9
+ registered: c.items,
10
+ domVersion: l,
11
+ controlledItem: s.item,
12
+ internalName: u,
13
+ definitions: s.items
14
+ }), { enabled: m, activeName: h, activeItem: g, total: _, index: v, first: y, last: b } = p, { current: x, itemDefinitions: S } = p, C = () => n({
15
+ enabled: m(),
16
+ controlledItem: s.item(),
17
+ defaultItem: s.defaultItem()
18
+ });
12
19
  a(() => {
13
- if (l.item() !== void 0) return;
14
- let e = v(), t = y();
20
+ if (s.item() !== void 0) return;
21
+ let e = m(), t = h();
15
22
  if (t && e.some((e) => e.name === t)) return;
16
- let n = D();
17
- n !== t && h(n);
23
+ let n = C();
24
+ n !== t && d(n);
18
25
  });
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") => {
26
+ let w = c.register, T = (e, t = "item") => {
22
27
  if (e) {
23
- if (e === y()) {
24
- t === "invalid" && b()?.focusInvalid();
28
+ if (e === h()) {
29
+ t === "invalid" && g()?.focusInvalid();
25
30
  return;
26
31
  }
27
- g = {
32
+ f = {
28
33
  name: e,
29
34
  target: t
30
- }, l.item() === void 0 && h(e), l.onItemChange?.(e);
35
+ }, s.item() === void 0 && d(e), s.onItemChange?.(e);
31
36
  }
32
- }, A = () => l.formRef()?.requestSubmit(), j = () => {
33
- let e = b();
37
+ }, E = () => s.formRef()?.requestSubmit(), D = () => {
38
+ let e = g();
34
39
  if (!e) return;
35
40
  if (!e.validate()) {
36
41
  e.focusInvalid();
37
42
  return;
38
43
  }
39
- let t = 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();
44
+ let t = m(), n = t.indexOf(e);
45
+ n < 0 || n >= t.length - 1 || T(t[n + 1].name);
46
+ }, O = () => {
47
+ let e = m(), t = v();
48
+ t <= 0 || T(e[t - 1].name);
49
+ }, k = () => {
50
+ let e = g();
46
51
  if (!e || e.required()) return;
47
- if (e.skip(), T()) {
48
- queueMicrotask(A);
52
+ if (e.skip(), b()) {
53
+ queueMicrotask(E);
49
54
  return;
50
55
  }
51
- let t = v(), n = t.indexOf(e);
52
- k(t[n + 1]?.name ?? null);
53
- }, P = () => {
54
- T() ? A() : j();
56
+ let t = m(), n = t.indexOf(e);
57
+ T(t[n + 1].name);
58
+ }, A = () => {
59
+ b() ? E() : D();
55
60
  };
56
61
  return a(() => {
57
- let e = 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
+ let e = h();
63
+ if (!f || f.name !== e) return;
64
+ let t = f.target;
65
+ f = null;
66
+ let n = m().find((t) => t.name === e);
62
67
  n && queueMicrotask(() => {
63
68
  t === "invalid" ? n.focusInvalid() : n.focus();
64
69
  });
65
- }), a(() => {
66
- let e = l.formRef();
67
- if (!e || typeof MutationObserver > "u") return;
68
- let t = new MutationObserver(() => p((e) => e + 1));
69
- t.observe(e, {
70
- childList: !0,
71
- subtree: !0
72
- }), c(() => t.disconnect());
73
70
  }), {
74
71
  context: {
75
72
  state: () => ({
76
- current: C(),
77
- first: w(),
78
- last: T(),
79
- total: x()
73
+ current: x(),
74
+ first: y(),
75
+ last: b(),
76
+ total: _()
80
77
  }),
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
78
+ activeItemName: h,
79
+ activeItemRequired: () => g()?.required() ?? null,
80
+ activeItemStatus: () => g()?.status() ?? null,
81
+ shortcuts: () => s.shortcuts() ?? null,
82
+ nativeValidation: () => s.noValidate() === !1,
83
+ itemDefinitions: S,
84
+ registerItem: w,
85
+ goNext: D,
86
+ goPrevious: O,
87
+ skipCurrent: k,
88
+ requestSubmit: E
92
89
  },
93
90
  formProps: {
94
- "data-shortcuts": l.shortcuts(),
91
+ "data-shortcuts": s.shortcuts(),
95
92
  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()));
93
+ let t = g();
94
+ t && r(e, {
95
+ item: t,
96
+ status: () => t.status(),
97
+ shortcuts: s.shortcuts() ?? null,
98
+ goNext: D,
99
+ goPrevious: O,
100
+ submitOrNext: A
101
+ });
123
102
  },
124
103
  onSubmit: (e) => {
125
- let t = v().find((e) => !e.validate());
104
+ let t = m().find((e) => !e.validate());
126
105
  if (t) {
127
- e.preventDefault(), k(t.name, "invalid");
106
+ e.preventDefault(), T(t.name, "invalid");
128
107
  return;
129
108
  }
130
- l.onSubmit?.(e);
109
+ s.onSubmit?.(e);
131
110
  },
132
111
  onReset: (e) => {
133
- if (l.onReset?.(e), !e.defaultPrevented) {
134
- for (let e of v()) e.reset();
135
- k(D());
112
+ if (s.onReset?.(e), !e.defaultPrevented) {
113
+ for (let e of m()) e.reset();
114
+ T(C());
136
115
  }
137
116
  }
138
117
  }
139
118
  };
140
119
  }
141
120
  //#endregion
142
- export { l as useQuestionnaireRoot };
121
+ export { s as useQuestionnaireRoot };
143
122
 
144
123
  //# sourceMappingURL=useQuestionnaireRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQuestionnaireRoot.js","names":["useQuestionnaireRoot","registered","setRegistered","createSignal","domVersion","setDomVersion","internalName","setInternalName","pendingFocus","ordered","createMemo","compareDocumentOrder","a","b","enabled","item","activeName","options","activeItem","total","index","current","first","last","itemDefinitions","list","definition","resolveName","candidate","entry","name","next","registerItem","prev","handle","navigate","target","requestSubmit","goNext","position","goPrevious","skipCurrent","submitOrNext","createEffect","form","observer","v","onCleanup","event","isTypingElement","isNativeRadio","answer","isAnswerFilled","mode","shortcut","normalizeShortcut","invalid"],"sources":["../../../src/components/questionnaire/useQuestionnaireRoot.ts"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n onCleanup,\n type Accessor,\n} from \"solid-js\";\nimport type {\n QuestionnaireItemHandle,\n QuestionnaireRootContextValue,\n} from \"./questionnaire.context\";\nimport type {\n QuestionnaireItemDefinition,\n QuestionnaireShortcutMode,\n} from \"./questionnaire.types\";\nimport {\n compareDocumentOrder,\n isAnswerFilled,\n isNativeRadio,\n isTypingElement,\n normalizeShortcut,\n} from \"./questionnaire.utils\";\n\ninterface Options {\n item: Accessor<string | undefined>;\n defaultItem: Accessor<string | undefined>;\n items: Accessor<readonly QuestionnaireItemDefinition[] | undefined>;\n shortcuts: Accessor<QuestionnaireShortcutMode | undefined>;\n noValidate: Accessor<boolean | undefined>;\n onItemChange: (item: string) => void;\n onReset?: (event: Event) => void;\n onSubmit?: (event: SubmitEvent) => void;\n formRef: Accessor<HTMLFormElement | undefined>;\n}\n\n/**\n * Questionnaire 根状态机:\n * - 注册各 Item(按 DOM 顺序排序),维护激活项与进度;\n * - 导航(上一题/下一题/跳过/提交)与校验;\n * - 键盘:Mod+Enter 提交、上下箭头在答案间移动、左右箭头切题、方向键/Esc/快捷键。\n */\nexport function useQuestionnaireRoot(options: Options): {\n context: QuestionnaireRootContextValue;\n formProps: {\n \"data-shortcuts\": string | undefined;\n onKeyDown: (event: KeyboardEvent) => void;\n onSubmit: (event: SubmitEvent) => void;\n onReset: (event: Event) => void;\n };\n} {\n const [registered, setRegistered] = createSignal<QuestionnaireItemHandle[]>(\n [],\n );\n const [domVersion, setDomVersion] = createSignal(0);\n const [internalName, setInternalName] = createSignal<string | null>(null);\n let pendingFocus: { name: string; target: \"item\" | \"invalid\" } | null = null;\n\n const ordered = createMemo(() => {\n domVersion();\n return [...registered()].sort((a, b) =>\n compareDocumentOrder(a.element, b.element),\n );\n });\n const enabled = createMemo(() =>\n ordered().filter((item) => !item.disabled()),\n );\n const activeName = createMemo(() => options.item() ?? internalName());\n const activeItem = createMemo(\n () => enabled().find((item) => item.name === activeName()) ?? null,\n );\n const total = createMemo(() => enabled().length);\n const index = createMemo(() =>\n enabled().findIndex((item) => item.name === activeName()),\n );\n const current = createMemo(() => (index() < 0 ? 0 : index() + 1));\n const first = createMemo(() => total() > 0 && index() === 0);\n const last = createMemo(() => total() > 0 && index() === total() - 1);\n\n const itemDefinitions = createMemo(() => {\n const list = options.items();\n if (!list) return null;\n return new Map(list.map((definition) => [definition.name, definition]));\n });\n\n const resolveName = () => {\n const list = enabled();\n const candidate = options.item() ?? options.defaultItem();\n if (candidate && list.some((entry) => entry.name === candidate)) {\n return candidate;\n }\n return list[0]?.name ?? null;\n };\n\n // 激活项不可用时回退到定义/第一个可用项\n createEffect(() => {\n if (options.item() !== undefined) return;\n const list = enabled();\n const name = activeName();\n if (name && list.some((entry) => entry.name === name)) return;\n const next = resolveName();\n if (next !== name) setInternalName(next);\n });\n\n const registerItem = (handle: QuestionnaireItemHandle) => {\n setRegistered((prev) => {\n const exists = prev.some((item) => item.element === handle.element);\n return exists\n ? prev.map((item) => (item.element === handle.element ? handle : item))\n : [...prev, handle];\n });\n return () => {\n setRegistered((prev) => prev.filter((item) => item !== handle));\n };\n };\n\n const navigate = (\n name: string | null,\n target: \"item\" | \"invalid\" = \"item\",\n ) => {\n if (!name) return;\n if (name === activeName()) {\n if (target === \"invalid\") activeItem()?.focusInvalid();\n return;\n }\n pendingFocus = { name, target };\n if (options.item() === undefined) setInternalName(name);\n options.onItemChange?.(name);\n };\n\n const requestSubmit = () => options.formRef()?.requestSubmit();\n\n const goNext = () => {\n const item = activeItem();\n if (!item) return;\n if (!item.validate()) {\n item.focusInvalid();\n return;\n }\n const list = enabled();\n const position = list.indexOf(item);\n if (position < 0 || position >= list.length - 1) return;\n navigate(list[position + 1]!.name);\n };\n\n const goPrevious = () => {\n const list = enabled();\n const position = index();\n if (position <= 0) return;\n navigate(list[position - 1]!.name);\n };\n\n const skipCurrent = () => {\n const item = activeItem();\n if (!item || item.required()) return;\n item.skip();\n if (last()) {\n queueMicrotask(requestSubmit);\n return;\n }\n const list = enabled();\n const position = list.indexOf(item);\n navigate(list[position + 1]?.name ?? null);\n };\n\n const submitOrNext = () => {\n if (last()) requestSubmit();\n else goNext();\n };\n\n const handleSubmit = (event: SubmitEvent) => {\n const invalid = enabled().find((item) => !item.validate());\n if (invalid) {\n event.preventDefault();\n navigate(invalid.name, \"invalid\");\n return;\n }\n options.onSubmit?.(event);\n };\n\n const handleReset = (event: Event) => {\n options.onReset?.(event);\n if (event.defaultPrevented) return;\n for (const item of enabled()) item.reset();\n navigate(resolveName());\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const item = activeItem();\n if (!item) return;\n if (\n event.defaultPrevented ||\n event.isComposing ||\n event.keyCode === 229 ||\n !(event.target instanceof Element)\n ) {\n return;\n }\n const target = event.target;\n\n if (\n event.key === \"Enter\" &&\n (event.metaKey || event.ctrlKey) &&\n !event.altKey &&\n !event.shiftKey\n ) {\n event.preventDefault();\n if (!event.repeat) submitOrNext();\n return;\n }\n if (event.metaKey || event.ctrlKey || event.altKey) return;\n\n if (\n (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") &&\n item.moveAnswerFocus(\n target,\n event.key === \"ArrowDown\" ? \"next\" : \"previous\",\n )\n ) {\n event.preventDefault();\n return;\n }\n\n if (\n (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") &&\n !isTypingElement(target) &&\n !isNativeRadio(target)\n ) {\n event.preventDefault();\n if (event.repeat) return;\n if (event.key === \"ArrowLeft\") goPrevious();\n else if (item.status() !== \"unanswered\") goNext();\n return;\n }\n\n if (event.key === \"Enter\") {\n const answer = item.getAnswerByElement(target);\n if (!answer) return;\n event.preventDefault();\n if (!event.repeat && isAnswerFilled(answer)) submitOrNext();\n return;\n }\n\n const mode = options.shortcuts() ?? null;\n if (!mode || isTypingElement(target)) return;\n const shortcut = normalizeShortcut(event.key, mode);\n const answer = shortcut ? item.getAnswerByShortcut(shortcut) : null;\n if (!answer) return;\n event.preventDefault();\n if (event.repeat) return;\n answer.element.focus();\n if (answer.type === \"choice\") (answer.element as HTMLInputElement).click();\n };\n\n // 导航后聚焦新激活项(或它的首个答案控件)\n createEffect(() => {\n const name = activeName();\n if (!pendingFocus || pendingFocus.name !== name) return;\n const target = pendingFocus.target;\n pendingFocus = null;\n const handle = enabled().find((item) => item.name === name);\n if (!handle) return;\n queueMicrotask(() => {\n if (target === \"invalid\") handle.focusInvalid();\n else handle.focus();\n });\n });\n\n // 观察 DOM 变化(动态增删 Item)以便重新排序\n createEffect(() => {\n const form = options.formRef();\n if (!form || typeof MutationObserver === \"undefined\") return;\n const observer = new MutationObserver(() => setDomVersion((v) => v + 1));\n observer.observe(form, { childList: true, subtree: true });\n onCleanup(() => observer.disconnect());\n });\n\n const context: QuestionnaireRootContextValue = {\n state: () => ({\n current: current(),\n first: first(),\n last: last(),\n total: total(),\n }),\n activeItemName: activeName,\n activeItemRequired: () => activeItem()?.required() ?? null,\n activeItemStatus: () => activeItem()?.status() ?? null,\n shortcuts: () => options.shortcuts() ?? null,\n nativeValidation: () => options.noValidate() === false,\n itemDefinitions,\n registerItem,\n goNext,\n goPrevious,\n skipCurrent,\n requestSubmit,\n };\n\n return {\n context,\n formProps: {\n \"data-shortcuts\": options.shortcuts(),\n onKeyDown: handleKeyDown,\n onSubmit: handleSubmit,\n onReset: handleReset,\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useQuestionnaireRoot.js","names":["useQuestionnaireRoot","registry","createItemRegistry","domVersion","createDomVersionWatcher","options","internalName","setInternalName","createSignal","pendingFocus","view","createItemView","resolveName","resolveActiveName","enabled","list","name","activeName","entry","next","registerItem","navigate","target","activeItem","requestSubmit","goNext","item","position","goPrevious","index","skipCurrent","last","submitOrNext","createEffect","handle","current","first","total","handleQuestionnaireKeyDown","event","invalid"],"sources":["../../../src/components/questionnaire/useQuestionnaireRoot.ts"],"sourcesContent":["import { createEffect, createSignal, type Accessor } from \"solid-js\";\nimport type { QuestionnaireRootContextValue } from \"./questionnaire.context\";\nimport type {\n QuestionnaireItemDefinition,\n QuestionnaireShortcutMode,\n} from \"./questionnaire.types\";\nimport { createDomVersionWatcher } from \"./questionnaire.dom-watch\";\nimport { createItemView, resolveActiveName } from \"./questionnaire.item-view\";\nimport { handleQuestionnaireKeyDown } from \"./questionnaire.keys\";\nimport { createItemRegistry } from \"./questionnaire.registry\";\n\ninterface Options {\n item: Accessor<string | undefined>;\n defaultItem: Accessor<string | undefined>;\n items: Accessor<readonly QuestionnaireItemDefinition[] | undefined>;\n shortcuts: Accessor<QuestionnaireShortcutMode | undefined>;\n noValidate: Accessor<boolean | undefined>;\n onItemChange: (item: string) => void;\n onReset?: (event: Event) => void;\n onSubmit?: (event: SubmitEvent) => void;\n formRef: Accessor<HTMLFormElement | undefined>;\n}\n\n/**\n * Questionnaire 根状态机:\n * - 注册各 Item(按 DOM 顺序排序),维护激活项与进度;\n * - 导航(上一题/下一题/跳过/提交)与校验;\n * - 键盘:Mod+Enter 提交、上下箭头在答案间移动、左右箭头切题、方向键/Esc/快捷键。\n */\nexport function useQuestionnaireRoot(options: Options): {\n context: QuestionnaireRootContextValue;\n formProps: {\n \"data-shortcuts\": string | undefined;\n onKeyDown: (event: KeyboardEvent) => void;\n onSubmit: (event: SubmitEvent) => void;\n onReset: (event: Event) => void;\n };\n} {\n const registry = createItemRegistry();\n const domVersion = createDomVersionWatcher(options.formRef);\n const [internalName, setInternalName] = createSignal<string | null>(null);\n let pendingFocus: { name: string; target: \"item\" | \"invalid\" } | null = null;\n\n const view = createItemView({\n registered: registry.items,\n domVersion,\n controlledItem: options.item,\n internalName,\n definitions: options.items,\n });\n const { enabled, activeName, activeItem, total, index, first, last } = view;\n const { current, itemDefinitions } = view;\n\n const resolveName = () =>\n resolveActiveName({\n enabled: enabled(),\n controlledItem: options.item(),\n defaultItem: options.defaultItem(),\n });\n\n // 激活项不可用时回退到定义/第一个可用项\n createEffect(() => {\n if (options.item() !== undefined) return;\n const list = enabled();\n const name = activeName();\n if (name && list.some((entry) => entry.name === name)) return;\n const next = resolveName();\n if (next !== name) setInternalName(next);\n });\n\n const registerItem = registry.register;\n\n const navigate = (\n name: string | null,\n target: \"item\" | \"invalid\" = \"item\",\n ) => {\n if (!name) return;\n if (name === activeName()) {\n if (target === \"invalid\") activeItem()?.focusInvalid();\n return;\n }\n pendingFocus = { name, target };\n if (options.item() === undefined) setInternalName(name);\n options.onItemChange?.(name);\n };\n\n const requestSubmit = () => options.formRef()?.requestSubmit();\n\n const goNext = () => {\n const item = activeItem();\n if (!item) return;\n if (!item.validate()) {\n item.focusInvalid();\n return;\n }\n const list = enabled();\n const position = list.indexOf(item);\n if (position < 0 || position >= list.length - 1) return;\n navigate(list[position + 1]!.name);\n };\n\n const goPrevious = () => {\n const list = enabled();\n const position = index();\n if (position <= 0) return;\n navigate(list[position - 1]!.name);\n };\n\n const skipCurrent = () => {\n const item = activeItem();\n if (!item || item.required()) return;\n item.skip();\n if (last()) {\n queueMicrotask(requestSubmit);\n return;\n }\n const list = enabled();\n const position = list.indexOf(item);\n // 走到这里说明 last() 为 false,即 position 必然小于末位;\n // 且 position 与 item-view 的 index() 同源于 enabled(),因此下一项一定存在\n navigate(list[position + 1].name);\n };\n\n const submitOrNext = () => {\n if (last()) requestSubmit();\n else goNext();\n };\n\n const handleSubmit = (event: SubmitEvent) => {\n const invalid = enabled().find((item) => !item.validate());\n if (invalid) {\n event.preventDefault();\n navigate(invalid.name, \"invalid\");\n return;\n }\n options.onSubmit?.(event);\n };\n\n const handleReset = (event: Event) => {\n options.onReset?.(event);\n if (event.defaultPrevented) return;\n for (const item of enabled()) item.reset();\n navigate(resolveName());\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const item = activeItem();\n if (!item) return;\n\n handleQuestionnaireKeyDown(event, {\n item,\n status: () => item.status(),\n shortcuts: options.shortcuts() ?? null,\n goNext,\n goPrevious,\n submitOrNext,\n });\n };\n\n // 导航后聚焦新激活项(或它的首个答案控件)\n createEffect(() => {\n const name = activeName();\n if (!pendingFocus || pendingFocus.name !== name) return;\n const target = pendingFocus.target;\n pendingFocus = null;\n const handle = enabled().find((item) => item.name === name);\n if (!handle) return;\n queueMicrotask(() => {\n if (target === \"invalid\") handle.focusInvalid();\n else handle.focus();\n });\n });\n\n const context: QuestionnaireRootContextValue = {\n state: () => ({\n current: current(),\n first: first(),\n last: last(),\n total: total(),\n }),\n activeItemName: activeName,\n activeItemRequired: () => activeItem()?.required() ?? null,\n activeItemStatus: () => activeItem()?.status() ?? null,\n shortcuts: () => options.shortcuts() ?? null,\n nativeValidation: () => options.noValidate() === false,\n itemDefinitions,\n registerItem,\n goNext,\n goPrevious,\n skipCurrent,\n requestSubmit,\n };\n\n return {\n context,\n formProps: {\n \"data-shortcuts\": options.shortcuts(),\n onKeyDown: handleKeyDown,\n onSubmit: handleSubmit,\n onReset: handleReset,\n },\n };\n}\n"],"mappings":"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"}
@@ -36,6 +36,9 @@ function d(o) {
36
36
  get class() {
37
37
  return e("grid w-full gap-2", d.class);
38
38
  },
39
+ get classList() {
40
+ return d.classList;
41
+ },
39
42
  get style() {
40
43
  return d.style;
41
44
  },
@@ -1 +1 @@
1
- {"version":3,"file":"RadioGroup.js","names":["createMemo","createSignal","splitProps","JSX","clsx","RadioGroupContext","RadioGroupContextValue","RadioGroupProps","RadioGroup","props","Element","local","rest","internalValue","setInternalValue","defaultValue","value","undefined","disabled","itemElements","Map","HTMLElement","setValue","next","onValueChange","registerItem","itemValue","element","set","get","delete","focusItem","focus","ctx","name","_el$","_tmpl$","_$spread","_$mergeProps","class","style","dir","_$insert","_$createComponent","Provider","children","_$mergeProps","_$createComponent","_tmpl$","RadioGroup","local","rest","splitProps","props","internalValue","setInternalValue","createSignal","value","createMemo","disabled","itemElements","ctx","next","itemValue","element","_el$","spread","mergeProps","\"class\"","clsx","insert","createComponent","RadioGroupContext"],"sources":["../../../../src/components/radio-group/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import { createMemo, createSignal, splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { RadioGroupContext } from \"./RadioGroup.context\";\nimport type {\n RadioGroupContextValue,\n RadioGroupProps,\n} from \"./RadioGroup.types\";\n\n/**\n * RadioGroup 根组件:渲染一个 <div role=\"radiogroup\">,并向下提供选中值、\n * 禁用状态和 item 注册方法。选中值支持受控(value)和非受控(defaultValue)。\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"comfortable\">\n * <RadioGroupItem value=\"default\" />\n * <RadioGroupItem value=\"comfortable\" />\n * </RadioGroup>\n * ```\n */\nexport function RadioGroup(props: RadioGroupProps): JSX.Element {\n const [local, rest] = splitProps(props, [\n \"value\",\n \"defaultValue\",\n \"onValueChange\",\n \"disabled\",\n \"name\",\n \"class\",\n \"classList\",\n \"style\",\n \"dir\",\n \"children\",\n ]);\n\n const [internalValue, setInternalValue] = createSignal(local.defaultValue);\n const value = createMemo(() =>\n local.value !== undefined ? local.value : internalValue(),\n );\n const disabled = createMemo(() => !!local.disabled);\n\n const itemElements = new Map<string, HTMLElement>();\n\n const setValue = (next: string) => {\n if (local.value === undefined) setInternalValue(next);\n local.onValueChange?.(next);\n };\n\n const registerItem = (itemValue: string, element: HTMLElement) => {\n itemElements.set(itemValue, element);\n return () => {\n if (itemElements.get(itemValue) === element) {\n itemElements.delete(itemValue);\n }\n };\n };\n\n const focusItem = (itemValue: string) => {\n itemElements.get(itemValue)?.focus();\n };\n\n const ctx: RadioGroupContextValue = {\n value,\n setValue,\n disabled,\n name: local.name,\n registerItem,\n focusItem,\n };\n\n return (\n <div\n role=\"radiogroup\"\n data-slot=\"radio-group\"\n class={clsx(\"grid w-full gap-2\", local.class)}\n style={local.style}\n dir={local.dir}\n {...rest}\n >\n <RadioGroupContext.Provider value={ctx}>\n {local.children}\n </RadioGroupContext.Provider>\n </div>\n );\n}\n"],"mappings":";;;;;;AAoBA,SAAgBQ,EAAWC,GAAqC;CAC9D,IAAM,CAACE,GAAOC,KAAQV,EAAWO,GAAO;EACtC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX,GAEK,CAACI,GAAeC,KAAoBb,EAAaU,EAAMI,YAAY,GACnEC,IAAQhB,QACZW,EAAMK,UAAUC,KAAAA,IAA0BJ,EAAc,IAA5BF,EAAMK,KACpC,GACME,IAAWlB,QAAiB,CAAC,CAACW,EAAMO,QAAQ,GAE5CC,oBAAe,IAAIC,IAAyB,GAoB5Ca,IAA8B;EAClCjB;EACAM,WApBgBC,MAAiB;GAEjCZ,AADIA,EAAMK,UAAUC,KAAAA,KAAWH,EAAiBS,CAAI,GACpDZ,EAAMa,gBAAgBD,CAAI;EAC5B;EAkBEL;EACAgB,MAAMvB,EAAMuB;EACZT,eAlBoBC,GAAmBC,OACvCR,EAAaS,IAAIF,GAAWC,CAAO,SACtB;GACX,AAAIR,EAAaU,IAAIH,CAAS,MAAMC,KAClCR,EAAaW,OAAOJ,CAAS;EAEjC;EAaAK,YAViBL,MAAsB;GACvCP,EAAaU,IAAIH,CAAS,CAAC,EAAEM,MAAM;EACrC;CASA;CAEA,cAAA;EAAA,IAAAG,IAAAC,EAAA;EAUqB,OAVrBC,EAAAF,GAAAG,EAAA;GAAA,IAAA8B,QAAA;IAAA,OAIWhE,EAAK,qBAAqBO,EAAM4B,KAAK;GAAC;GAAA,IAC7CC,QAAK;IAAA,OAAE7B,EAAM6B;GAAK;GAAA,IAClBC,MAAG;IAAA,OAAE9B,EAAM8B;GAAG;EAAA,GACV7B,CAAI,GAAA,IAAA,EAAA,GAAA8B,EAAAP,GAAAQ,EAEPtC,EAAkBuC,UAAQ;GAAC5B,OAAOiB;GAAG,IAAAY,WAAA;IAAA,OACnClC,EAAMkC;GAAQ;EAAA,CAAA,CAAA,GAAAV;CAAA,EAAA,CAAA;AAIvB"}
1
+ {"version":3,"file":"RadioGroup.js","names":["createMemo","createSignal","splitProps","JSX","clsx","RadioGroupContext","RadioGroupContextValue","RadioGroupProps","RadioGroup","props","Element","local","rest","internalValue","setInternalValue","defaultValue","value","undefined","disabled","itemElements","Map","HTMLElement","setValue","next","onValueChange","registerItem","itemValue","element","set","get","delete","focusItem","focus","ctx","name","_el$","_tmpl$","_$spread","_$mergeProps","class","classList","style","dir","_$insert","_$createComponent","Provider","children","_$mergeProps","_$createComponent","_tmpl$","RadioGroup","local","rest","splitProps","props","internalValue","setInternalValue","createSignal","value","createMemo","disabled","itemElements","ctx","next","itemValue","element","_el$","spread","mergeProps","\"class\"","clsx","insert","createComponent","RadioGroupContext"],"sources":["../../../../src/components/radio-group/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import { createMemo, createSignal, splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { RadioGroupContext } from \"./RadioGroup.context\";\nimport type {\n RadioGroupContextValue,\n RadioGroupProps,\n} from \"./RadioGroup.types\";\n\n/**\n * RadioGroup 根组件:渲染一个 <div role=\"radiogroup\">,并向下提供选中值、\n * 禁用状态和 item 注册方法。选中值支持受控(value)和非受控(defaultValue)。\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"comfortable\">\n * <RadioGroupItem value=\"default\" />\n * <RadioGroupItem value=\"comfortable\" />\n * </RadioGroup>\n * ```\n */\nexport function RadioGroup(props: RadioGroupProps): JSX.Element {\n const [local, rest] = splitProps(props, [\n \"value\",\n \"defaultValue\",\n \"onValueChange\",\n \"disabled\",\n \"name\",\n \"class\",\n \"classList\",\n \"style\",\n \"dir\",\n \"children\",\n ]);\n\n const [internalValue, setInternalValue] = createSignal(local.defaultValue);\n const value = createMemo(() =>\n local.value !== undefined ? local.value : internalValue(),\n );\n const disabled = createMemo(() => !!local.disabled);\n\n const itemElements = new Map<string, HTMLElement>();\n\n const setValue = (next: string) => {\n if (local.value === undefined) setInternalValue(next);\n local.onValueChange?.(next);\n };\n\n const registerItem = (itemValue: string, element: HTMLElement) => {\n itemElements.set(itemValue, element);\n return () => {\n if (itemElements.get(itemValue) === element) {\n itemElements.delete(itemValue);\n }\n };\n };\n\n const focusItem = (itemValue: string) => {\n itemElements.get(itemValue)?.focus();\n };\n\n const ctx: RadioGroupContextValue = {\n value,\n setValue,\n disabled,\n name: local.name,\n registerItem,\n focusItem,\n };\n\n return (\n <div\n role=\"radiogroup\"\n data-slot=\"radio-group\"\n class={clsx(\"grid w-full gap-2\", local.class)}\n classList={local.classList}\n style={local.style}\n dir={local.dir}\n {...rest}\n >\n <RadioGroupContext.Provider value={ctx}>\n {local.children}\n </RadioGroupContext.Provider>\n </div>\n );\n}\n"],"mappings":";;;;;;AAoBA,SAAgBQ,EAAWC,GAAqC;CAC9D,IAAM,CAACE,GAAOC,KAAQV,EAAWO,GAAO;EACtC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX,GAEK,CAACI,GAAeC,KAAoBb,EAAaU,EAAMI,YAAY,GACnEC,IAAQhB,QACZW,EAAMK,UAAUC,KAAAA,IAA0BJ,EAAc,IAA5BF,EAAMK,KACpC,GACME,IAAWlB,QAAiB,CAAC,CAACW,EAAMO,QAAQ,GAE5CC,oBAAe,IAAIC,IAAyB,GAoB5Ca,IAA8B;EAClCjB;EACAM,WApBgBC,MAAiB;GAEjCZ,AADIA,EAAMK,UAAUC,KAAAA,KAAWH,EAAiBS,CAAI,GACpDZ,EAAMa,gBAAgBD,CAAI;EAC5B;EAkBEL;EACAgB,MAAMvB,EAAMuB;EACZT,eAlBoBC,GAAmBC,OACvCR,EAAaS,IAAIF,GAAWC,CAAO,SACtB;GACX,AAAIR,EAAaU,IAAIH,CAAS,MAAMC,KAClCR,EAAaW,OAAOJ,CAAS;EAEjC;EAaAK,YAViBL,MAAsB;GACvCP,EAAaU,IAAIH,CAAS,CAAC,EAAEM,MAAM;EACrC;CASA;CAEA,cAAA;EAAA,IAAAG,IAAAC,EAAA;EAWqB,OAXrBC,EAAAF,GAAAG,EAAA;GAAA,IAAA+B,QAAA;IAAA,OAIWjE,EAAK,qBAAqBO,EAAM4B,KAAK;GAAC;GAAA,IAC7CC,YAAS;IAAA,OAAE7B,EAAM6B;GAAS;GAAA,IAC1BC,QAAK;IAAA,OAAE9B,EAAM8B;GAAK;GAAA,IAClBC,MAAG;IAAA,OAAE/B,EAAM+B;GAAG;EAAA,GACV9B,CAAI,GAAA,IAAA,EAAA,GAAA+B,EAAAR,GAAAS,EAEPvC,EAAkBwC,UAAQ;GAAC7B,OAAOiB;GAAG,IAAAa,WAAA;IAAA,OACnCnC,EAAMmC;GAAQ;EAAA,CAAA,CAAA,GAAAX;CAAA,EAAA,CAAA;AAIvB"}