@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,45 +1,15 @@
1
+ import { createRovingNavigation as e } from "../../../utils/roving-navigation.js";
1
2
  //#region src/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.ts
2
- var e = /* @__PURE__ */ new Set([
3
- "ArrowLeft",
4
- "ArrowRight",
5
- "ArrowUp",
6
- "ArrowDown",
7
- "Home",
8
- "End"
9
- ]);
10
3
  function t(t) {
11
- return { handleKeyDown: (n) => {
12
- if (t.disabled() || !e.has(n.key)) return;
13
- let r = document.activeElement, i = t.getItems().filter((e) => !e.disabled());
14
- if (i.length === 0) return;
15
- let a = i.findIndex((e) => e.element === r);
16
- if (a === -1) return;
17
- let o = t.orientation() === "vertical", s = t.dir(), c = s === "rtl" || s !== "ltr" && typeof document < "u" && getComputedStyle(n.currentTarget).direction === "rtl", l;
18
- switch (n.key) {
19
- case "Home":
20
- l = 0;
21
- break;
22
- case "End":
23
- l = i.length - 1;
24
- break;
25
- case "ArrowLeft":
26
- if (o) return;
27
- l = a + (c ? 1 : -1);
28
- break;
29
- case "ArrowRight":
30
- if (o) return;
31
- l = a + (c ? -1 : 1);
32
- break;
33
- case "ArrowUp":
34
- if (!o) return;
35
- l = a - 1;
36
- break;
37
- case "ArrowDown":
38
- if (!o) return;
39
- l = a + 1;
40
- }
41
- l !== void 0 && (n.preventDefault(), l = t.loopFocus() ? (l + i.length) % i.length : Math.min(i.length - 1, Math.max(0, l)), i[l].element.focus(), t.setHighlightedValue(i[l].value));
42
- } };
4
+ return e({
5
+ getItems: () => t.getItems(),
6
+ orientation: t.orientation,
7
+ dir: t.dir,
8
+ loop: t.loopFocus,
9
+ disabled: t.disabled,
10
+ getDirectionElement: (e) => e.currentTarget,
11
+ onHighlight: t.setHighlightedValue
12
+ });
43
13
  }
44
14
  //#endregion
45
15
  export { t as useToggleGroupKeyboard };
@@ -1 +1 @@
1
- {"version":3,"file":"useToggleGroupKeyboard.js","names":["NAV_KEYS","useToggleGroupKeyboard","ctx","e","activeEl","items","item","currentIndex","isVertical","dir","isRTL","nextIndex"],"sources":["../../../../src/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.ts"],"sourcesContent":["import type {\n ToggleGroupContextValue,\n ToggleGroupValue,\n} from \"./ToggleGroup.types\";\n\n/** 键盘导航按键:方向键 + Home/End(对齐 base-ui CompositeRoot 的 enableHomeAndEndKeys) */\nconst NAV_KEYS = new Set([\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Home\",\n \"End\",\n]);\n\n/**\n * ToggleGroup 的 roving focus 键盘导航(纯逻辑,可独立单测)。\n *\n * 方向映射:\n * - horizontal + ltr: ArrowRight → next, ArrowLeft → prev\n * - horizontal + rtl: 左右反转\n * - vertical: ArrowDown → next, ArrowUp → prev\n * - Home → 第一个,End → 最后一个\n * - loopFocus=true 环绕,false 边界停止;跳过 disabled 的 item\n *\n * 只有焦点已经在某个 item 上时才接管按键,避免影响外部其它元素;\n * 移动焦点后由 item 的 onFocus 更新高亮。\n */\nexport function useToggleGroupKeyboard<\n TValue extends ToggleGroupValue = ToggleGroupValue,\n>(ctx: ToggleGroupContextValue<TValue>) {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (ctx.disabled()) return;\n if (!NAV_KEYS.has(e.key)) return;\n\n const activeEl = document.activeElement as HTMLElement | null;\n const items = ctx.getItems().filter((item) => !item.disabled());\n if (items.length === 0) return;\n\n const currentIndex = items.findIndex((item) => item.element === activeEl);\n if (currentIndex === -1) return;\n\n const isVertical = ctx.orientation() === \"vertical\";\n // dir 未指定/auto 时,按根元素的实际书写方向判断(兼容祖先节点上的 dir)\n const dir = ctx.dir();\n const isRTL =\n dir === \"rtl\" ||\n (dir !== \"ltr\" &&\n typeof document !== \"undefined\" &&\n getComputedStyle(e.currentTarget as Element).direction === \"rtl\");\n\n let nextIndex: number | undefined;\n switch (e.key) {\n case \"Home\":\n nextIndex = 0;\n break;\n case \"End\":\n nextIndex = items.length - 1;\n break;\n case \"ArrowLeft\":\n if (isVertical) return;\n nextIndex = currentIndex + (isRTL ? 1 : -1);\n break;\n case \"ArrowRight\":\n if (isVertical) return;\n nextIndex = currentIndex + (isRTL ? -1 : 1);\n break;\n case \"ArrowUp\":\n if (!isVertical) return;\n nextIndex = currentIndex - 1;\n break;\n case \"ArrowDown\":\n if (!isVertical) return;\n nextIndex = currentIndex + 1;\n break;\n }\n\n if (nextIndex === undefined) return;\n\n // 方向键与当前布局匹配,接管默认滚动行为\n e.preventDefault();\n\n if (ctx.loopFocus()) {\n nextIndex = (nextIndex + items.length) % items.length;\n } else {\n nextIndex = Math.min(items.length - 1, Math.max(0, nextIndex));\n }\n\n items[nextIndex].element.focus();\n ctx.setHighlightedValue(items[nextIndex].value);\n };\n\n return { handleKeyDown };\n}\n"],"mappings":";AAMA,IAAMA,oBAAW,IAAI,IAAI;CACvB;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAeD,SAAgBC,EAEd,GAAsC;CA8DtC,OAAO,EAAE,gBA7Dc,MAAqB;EAE1C,IADIC,EAAI,SAAS,KACb,CAACF,EAAS,IAAIG,EAAE,GAAG,GAAG;EAE1B,IAAMC,IAAW,SAAS,eACpBC,IAAQH,EAAI,SAAS,CAAC,CAAC,QAAQ,MAAS,CAACI,EAAK,SAAS,CAAC;EAC9D,IAAID,EAAM,WAAW,GAAG;EAExB,IAAME,IAAeF,EAAM,WAAW,MAASC,EAAK,YAAYF,CAAQ;EACxE,IAAIG,MAAiB,IAAI;EAEzB,IAAMC,IAAaN,EAAI,YAAY,MAAM,YAEnCO,IAAMP,EAAI,IAAI,GACdQ,IACJD,MAAQ,SACPA,MAAQ,SACP,OAAO,WAAa,OACpB,iBAAiBN,EAAE,aAAwB,CAAC,CAAC,cAAc,OAE3DQ;EACJ,QAAQR,EAAE,KAAV;GACE,KAAK;IACH,IAAY;IACZ;GACF,KAAK;IACH,IAAYE,EAAM,SAAS;IAC3B;GACF,KAAK;IACH,IAAIG,GAAY;IAChB,IAAYD,KAAgBG,IAAQ,IAAI;IACxC;GACF,KAAK;IACH,IAAIF,GAAY;IAChB,IAAYD,KAAgBG,IAAQ,KAAK;IACzC;GACF,KAAK;IACH,IAAI,CAACF,GAAY;IACjB,IAAYD,IAAe;IAC3B;GACF,KAAK;IACH,IAAI,CAACC,GAAY;IACjB,IAAYD,IAAe;EAE/B;EAEA,AAAII,MAAc,KAAA,MAGlBR,EAAE,eAAe,GAEjB,AAGEQ,IAHET,EAAI,UAAU,KACHS,IAAYN,EAAM,UAAUA,EAAM,SAEnC,KAAK,IAAIA,EAAM,SAAS,GAAG,KAAK,IAAI,GAAGM,CAAS,CAAC,GAG/DN,EAAMM,EAAU,CAAC,QAAQ,MAAM,GAC/BT,EAAI,oBAAoBG,EAAMM,EAAU,CAAC,KAAK;CAChD,EAEuB;AACzB"}
1
+ {"version":3,"file":"useToggleGroupKeyboard.js","names":["useToggleGroupKeyboard","createRovingNavigation","ctx","event"],"sources":["../../../../src/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.ts"],"sourcesContent":["import { createRovingNavigation } from \"~/utils\";\nimport type {\n ToggleGroupContextValue,\n ToggleGroupValue,\n} from \"./ToggleGroup.types\";\n\n/**\n * ToggleGroup 的 roving focus 键盘导航。\n *\n * 通用算法已抽到 `~/utils/roving-navigation`(与 Tabs 共用同一份),\n * 这里只接上 context,并补两处 ToggleGroup 特有语义:\n *\n * - 整组 `disabled` 时不接管任何按键;\n * - 判断书写方向时用 `event.currentTarget` 的实际 computed direction,\n * 这样祖先节点上的 `dir=\"rtl\"` 也能被正确识别(对齐 base-ui)。\n */\nexport function useToggleGroupKeyboard<\n TValue extends ToggleGroupValue = ToggleGroupValue,\n>(ctx: ToggleGroupContextValue<TValue>) {\n return createRovingNavigation<TValue>({\n getItems: () => ctx.getItems(),\n orientation: ctx.orientation,\n dir: ctx.dir,\n loop: ctx.loopFocus,\n disabled: ctx.disabled,\n getDirectionElement: (event) => event.currentTarget as Element | null,\n onHighlight: ctx.setHighlightedValue,\n });\n}\n"],"mappings":";;AAgBA,SAAgBA,EAEd,GAAsC;CACtC,OAAOC,EAA+B;EACpC,gBAAgBC,EAAI,SAAS;EAC7B,aAAaA,EAAI;EACjB,KAAKA,EAAI;EACT,MAAMA,EAAI;EACV,UAAUA,EAAI;EACd,sBAAsB,MAAUC,EAAM;EACtC,aAAaD,EAAI;CACnB,CAAC;AACH"}
@@ -1,6 +1,6 @@
1
1
  import { clsx as e } from "../../../utils/clsx.js";
2
- import { toggleVariants as t } from "../../toggle/Toggle/Toggle.styles.js";
3
- import { callEventHandler as n } from "../call-event-handler.js";
2
+ import { callEventHandler as t } from "../../../utils/call-event-handler.js";
3
+ import { toggleVariants as n } from "../../toggle/Toggle/Toggle.styles.js";
4
4
  import { useToggleGroupContext as r } from "../ToggleGroup/ToggleGroup.context.js";
5
5
  import { toggleGroupItemVariants as i } from "./ToggleGroupItem.styles.js";
6
6
  import { delegateEvents as a, insert as o, mergeProps as s, spread as c, template as l, use as u } from "solid-js/web";
@@ -33,9 +33,9 @@ function g(a) {
33
33
  }), (() => {
34
34
  var r = h();
35
35
  return r.addEventListener("focus", (e) => {
36
- C() || l.setHighlightedValue(_.value), n(_.onFocus, e);
36
+ C() || l.setHighlightedValue(_.value), t(_.onFocus, e);
37
37
  }), r.$$click = (e) => {
38
- n(_.onClick, e), !e.defaultPrevented && !C() && l.toggleItem(_.value, e, e.currentTarget);
38
+ t(_.onClick, e), !e.defaultPrevented && !C() && l.toggleItem(_.value, e, e.currentTarget);
39
39
  }, u((e) => {
40
40
  y = e;
41
41
  }, r), c(r, s({
@@ -70,7 +70,7 @@ function g(a) {
70
70
  return S();
71
71
  },
72
72
  get class() {
73
- return e(t({
73
+ return e(n({
74
74
  variant: b(),
75
75
  size: x()
76
76
  }), i(), _.class);
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleGroupItem.js","names":["mergeProps","onCleanup","onMount","splitProps","JSX","clsx","toggleVariants","callEventHandler","useToggleGroupContext","ToggleGroupValue","toggleGroupItemVariants","ToggleGroupItemProps","ToggleGroupItem","props","TValue","Element","ctx","merged","type","const","local","rest","elementRef","HTMLButtonElement","variant","size","pressed","isPressed","value","disabled","tabIndex","highlighted","highlightedValue","isUsable","undefined","isFirstEnabled","registerItem","element","_el$","_tmpl$","addEventListener","e","setHighlightedValue","onFocus","$$click","onClick","defaultPrevented","toggleItem","currentTarget","_$use","el","_$spread","_$mergeProps","tabindex","data-variant","data-size","data-spacing","spacing","data-pressed","data-disabled","data-state","aria-pressed","class","classList","_$insert","children","_$delegateEvents","mergeProps","_$mergeProps","_$delegateEvents","mergeProps$1","_tmpl$","ToggleGroupItem","ctx","useToggleGroupContext","merged","props","local","rest","splitProps","elementRef","variant","size","pressed","disabled","tabIndex","highlighted","onMount","_el$","callEventHandler","use","el","spread","mergeProps","\"class\"","clsx","toggleVariants","toggleGroupItemVariants","insert","delegateEvents"],"sources":["../../../../src/components/toggle-group/ToggleGroupItem/ToggleGroupItem.tsx"],"sourcesContent":["import { mergeProps, onCleanup, onMount, splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { toggleVariants } from \"~/components/toggle/Toggle/Toggle.styles\";\nimport { callEventHandler } from \"../call-event-handler\";\nimport { useToggleGroupContext } from \"../ToggleGroup/ToggleGroup.context\";\nimport type { ToggleGroupValue } from \"../ToggleGroup/ToggleGroup.types\";\nimport { toggleGroupItemVariants } from \"./ToggleGroupItem.styles\";\nimport type { ToggleGroupItemProps } from \"./ToggleGroupItem.types\";\n\n/**\n * ToggleGroupItem:ToggleGroup 内的两态按钮。\n *\n * - 选中值由 ToggleGroup 统一持有,点击通过 `ctx.toggleItem` 触发变更\n * - disabled 继承整组状态,可在 item 上单独禁用\n * - roving tabindex:整组只有一个 tab 停靠点,方向键在同组内移动焦点\n */\nexport function ToggleGroupItem<\n TValue extends ToggleGroupValue = ToggleGroupValue,\n>(props: ToggleGroupItemProps<TValue>): JSX.Element {\n // context 用宽值类型读取:item 无法从父级推导 group 的值类型,\n // 自己的 TValue 始终可以传给宽类型参数\n const ctx = useToggleGroupContext(\"ToggleGroupItem\");\n const merged = mergeProps({ type: \"button\" as const }, props);\n\n const [local, rest] = splitProps(merged, [\n \"value\",\n \"variant\",\n \"size\",\n \"class\",\n \"classList\",\n \"disabled\",\n \"type\",\n \"onClick\",\n \"onFocus\",\n \"children\",\n ]);\n\n let elementRef: HTMLButtonElement | undefined;\n\n // 组级未显式指定 variant/size 时,item 可单独覆盖\n const variant = () => ctx.variant() ?? local.variant ?? \"default\";\n const size = () => ctx.size() ?? local.size ?? \"default\";\n const pressed = () => ctx.isPressed(local.value);\n const disabled = () => ctx.disabled() || !!local.disabled;\n\n // roving tabindex:高亮 item 持 0;高亮缺失或指向不可用 item(disabled/卸载)时,\n // 首个可用 item 持 0 作为键盘起点,避免整组键盘不可达\n const tabIndex = () => {\n if (disabled()) return -1;\n const highlighted = ctx.highlightedValue();\n if (highlighted === local.value && ctx.isUsable(local.value)) return 0;\n if (\n (highlighted === undefined || !ctx.isUsable(highlighted)) &&\n ctx.isFirstEnabled(local.value)\n ) {\n return 0;\n }\n return -1;\n };\n\n onMount(() => {\n onCleanup(\n ctx.registerItem({\n value: local.value,\n disabled,\n element: elementRef!,\n }),\n );\n });\n\n return (\n <button\n ref={(el) => {\n elementRef = el;\n }}\n type={local.type}\n disabled={disabled()}\n tabindex={tabIndex()}\n data-slot=\"toggle-group-item\"\n data-variant={variant()}\n data-size={size()}\n data-spacing={ctx.spacing()}\n data-pressed={pressed() ? \"\" : null}\n data-disabled={disabled() ? \"\" : null}\n data-state={pressed() ? \"on\" : \"off\"}\n aria-pressed={pressed()}\n class={clsx(\n toggleVariants({ variant: variant(), size: size() }),\n toggleGroupItemVariants(),\n local.class,\n )}\n classList={local.classList}\n onClick={(e) => {\n // 用户回调优先,可用 preventDefault() 阻止本次选中\n callEventHandler(local.onClick, e);\n if (!e.defaultPrevented && !disabled()) {\n ctx.toggleItem(local.value, e, e.currentTarget);\n }\n }}\n onFocus={(e) => {\n // 聚焦更新高亮(roving focus 起点)\n if (!disabled()) ctx.setHighlightedValue(local.value);\n callEventHandler(local.onFocus, e);\n }}\n {...rest}\n >\n {local.children}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgBY,EAEdC,GAAkD;CAGlD,IAAMG,IAAMR,EAAsB,iBAAiB,GAC7CS,IAASjB,EAAW,EAAEkB,MAAM,SAAkB,GAAGL,CAAK,GAEtD,CAACO,GAAOC,KAAQlB,EAAWc,GAAQ;EACvC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX,GAEGK,GAGEE,UAAgBR,EAAIQ,QAAQ,KAAKJ,EAAMI,WAAW,WAClDC,UAAaT,EAAIS,KAAK,KAAKL,EAAMK,QAAQ,WACzCC,UAAgBV,EAAIW,UAAUP,EAAMQ,KAAK,GACzCC,UAAiBb,EAAIa,SAAS,KAAK,CAAC,CAACT,EAAMS,UAI3CC,UAAiB;EACrB,IAAID,EAAS,GAAG,OAAO;EACvB,IAAME,IAAcf,EAAIgB,iBAAiB;EAQzC,OAPID,MAAgBX,EAAMQ,SAASZ,EAAIiB,SAASb,EAAMQ,KAAK,MAExDG,MAAgBG,KAAAA,KAAa,CAAClB,EAAIiB,SAASF,CAAW,MACvDf,EAAImB,eAAef,EAAMQ,KAAK,IAEvB,IAEF;CACT;CAYA,OAVA1B,QAAc;EACZD,EACEe,EAAIoB,aAAa;GACfR,OAAOR,EAAMQ;GACbC;GACAQ,SAASf;EACX,CAAC,CACH;CACF,CAAC,UAED;EAAA,IAAAgB,IAAAC,EAAA;EAoCmB,OApCnBD,EAAAE,iBAAA,UA6BcC,MAAM;GAGdlC,AADKsB,EAAS,KAAGb,EAAI0B,oBAAoBtB,EAAMQ,KAAK,GACpDrB,EAAiBa,EAAMuB,SAASF,CAAC;EACnC,CAAC,GAAAH,EAAAM,WAXSH,MAAM;GAGd,AADAlC,EAAiBa,EAAMyB,SAASJ,CAAC,GAC7B,CAACA,EAAEK,oBAAoB,CAACjB,EAAS,KACnCb,EAAI+B,WAAW3B,EAAMQ,OAAOa,GAAGA,EAAEO,aAAa;EAElD,GAACC,GA1BKC,MAAO;GACX5B,IAAa4B;EACf,GAACZ,CAAA,GAAAa,EAAAb,GAAAc,EAAA;GAAA,IACDlC,OAAI;IAAA,OAAEE,EAAMF;GAAI;GAAA,IAChBW,WAAQ;IAAA,OAAEA,EAAS;GAAC;GAAA,IACpBwB,WAAQ;IAAA,OAAEvB,EAAS;GAAC;GAAA,IAAA,iBAAA;IAAA,OAENN,EAAQ;GAAC;GAAA,IAAA,cAAA;IAAA,OACZC,EAAK;GAAC;GAAA,IAAA,iBAAA;IAAA,OACHT,EAAIyC,QAAQ;GAAC;GAAA,IAAA,iBAAA;IAAA,OACb/B,EAAQ,IAAI,KAAK;GAAI;GAAA,IAAA,kBAAA;IAAA,OACpBG,EAAS,IAAI,KAAK;GAAI;GAAA,IAAA,eAAA;IAAA,OACzBH,EAAQ,IAAI,OAAO;GAAK;GAAA,IAAA,iBAAA;IAAA,OACtBA,EAAQ;GAAC;GAAA,IAAAoE,QAAA;IAAA,OAChBzF,EACLC,EAAe;KAAEkB,SAASA,EAAQ;KAAGC,MAAMA,EAAK;IAAE,CAAC,GACnDf,EAAwB,GACxBU,EAAM0C,KACR;GAAC;GAAA,IACDC,YAAS;IAAA,OAAE3C,EAAM2C;GAAS;EAAA,GAatB1C,CAAI,GAAA,IAAA,EAAA,GAAA2C,EAAA1B,SAEPlB,EAAM6C,QAAQ,GAAA3B;CAAA,EAAA,CAAA;AAGrB;AAAC4B,EAAA,CAAA,OAAA,CAAA"}
1
+ {"version":3,"file":"ToggleGroupItem.js","names":["mergeProps","onCleanup","onMount","splitProps","JSX","clsx","toggleVariants","callEventHandler","useToggleGroupContext","ToggleGroupValue","toggleGroupItemVariants","ToggleGroupItemProps","ToggleGroupItem","props","TValue","Element","ctx","merged","type","const","local","rest","elementRef","HTMLButtonElement","variant","size","pressed","isPressed","value","disabled","tabIndex","highlighted","highlightedValue","isUsable","undefined","isFirstEnabled","registerItem","element","_el$","_tmpl$","addEventListener","e","setHighlightedValue","onFocus","$$click","onClick","defaultPrevented","toggleItem","currentTarget","_$use","el","_$spread","_$mergeProps","tabindex","data-variant","data-size","data-spacing","spacing","data-pressed","data-disabled","data-state","aria-pressed","class","classList","_$insert","children","_$delegateEvents","mergeProps","_$mergeProps","_$delegateEvents","mergeProps$1","_tmpl$","ToggleGroupItem","ctx","useToggleGroupContext","merged","props","local","rest","splitProps","elementRef","variant","size","pressed","disabled","tabIndex","highlighted","onMount","_el$","callEventHandler","use","el","spread","mergeProps","\"class\"","clsx","toggleVariants","toggleGroupItemVariants","insert","delegateEvents"],"sources":["../../../../src/components/toggle-group/ToggleGroupItem/ToggleGroupItem.tsx"],"sourcesContent":["import { mergeProps, onCleanup, onMount, splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { toggleVariants } from \"~/components/toggle/Toggle/Toggle.styles\";\nimport { callEventHandler } from \"~/utils\";\nimport { useToggleGroupContext } from \"../ToggleGroup/ToggleGroup.context\";\nimport type { ToggleGroupValue } from \"../ToggleGroup/ToggleGroup.types\";\nimport { toggleGroupItemVariants } from \"./ToggleGroupItem.styles\";\nimport type { ToggleGroupItemProps } from \"./ToggleGroupItem.types\";\n\n/**\n * ToggleGroupItem:ToggleGroup 内的两态按钮。\n *\n * - 选中值由 ToggleGroup 统一持有,点击通过 `ctx.toggleItem` 触发变更\n * - disabled 继承整组状态,可在 item 上单独禁用\n * - roving tabindex:整组只有一个 tab 停靠点,方向键在同组内移动焦点\n */\nexport function ToggleGroupItem<\n TValue extends ToggleGroupValue = ToggleGroupValue,\n>(props: ToggleGroupItemProps<TValue>): JSX.Element {\n // context 用宽值类型读取:item 无法从父级推导 group 的值类型,\n // 自己的 TValue 始终可以传给宽类型参数\n const ctx = useToggleGroupContext(\"ToggleGroupItem\");\n const merged = mergeProps({ type: \"button\" as const }, props);\n\n const [local, rest] = splitProps(merged, [\n \"value\",\n \"variant\",\n \"size\",\n \"class\",\n \"classList\",\n \"disabled\",\n \"type\",\n \"onClick\",\n \"onFocus\",\n \"children\",\n ]);\n\n let elementRef: HTMLButtonElement | undefined;\n\n // 组级未显式指定 variant/size 时,item 可单独覆盖\n const variant = () => ctx.variant() ?? local.variant ?? \"default\";\n const size = () => ctx.size() ?? local.size ?? \"default\";\n const pressed = () => ctx.isPressed(local.value);\n const disabled = () => ctx.disabled() || !!local.disabled;\n\n // roving tabindex:高亮 item 持 0;高亮缺失或指向不可用 item(disabled/卸载)时,\n // 首个可用 item 持 0 作为键盘起点,避免整组键盘不可达\n const tabIndex = () => {\n if (disabled()) return -1;\n const highlighted = ctx.highlightedValue();\n if (highlighted === local.value && ctx.isUsable(local.value)) return 0;\n if (\n (highlighted === undefined || !ctx.isUsable(highlighted)) &&\n ctx.isFirstEnabled(local.value)\n ) {\n return 0;\n }\n return -1;\n };\n\n onMount(() => {\n onCleanup(\n ctx.registerItem({\n value: local.value,\n disabled,\n element: elementRef!,\n }),\n );\n });\n\n return (\n <button\n ref={(el) => {\n elementRef = el;\n }}\n type={local.type}\n disabled={disabled()}\n tabindex={tabIndex()}\n data-slot=\"toggle-group-item\"\n data-variant={variant()}\n data-size={size()}\n data-spacing={ctx.spacing()}\n data-pressed={pressed() ? \"\" : null}\n data-disabled={disabled() ? \"\" : null}\n data-state={pressed() ? \"on\" : \"off\"}\n aria-pressed={pressed()}\n class={clsx(\n toggleVariants({ variant: variant(), size: size() }),\n toggleGroupItemVariants(),\n local.class,\n )}\n classList={local.classList}\n onClick={(e) => {\n // 用户回调优先,可用 preventDefault() 阻止本次选中\n callEventHandler(local.onClick, e);\n if (!e.defaultPrevented && !disabled()) {\n ctx.toggleItem(local.value, e, e.currentTarget);\n }\n }}\n onFocus={(e) => {\n // 聚焦更新高亮(roving focus 起点)\n if (!disabled()) ctx.setHighlightedValue(local.value);\n callEventHandler(local.onFocus, e);\n }}\n {...rest}\n >\n {local.children}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgBY,EAEdC,GAAkD;CAGlD,IAAMG,IAAMR,EAAsB,iBAAiB,GAC7CS,IAASjB,EAAW,EAAEkB,MAAM,SAAkB,GAAGL,CAAK,GAEtD,CAACO,GAAOC,KAAQlB,EAAWc,GAAQ;EACvC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX,GAEGK,GAGEE,UAAgBR,EAAIQ,QAAQ,KAAKJ,EAAMI,WAAW,WAClDC,UAAaT,EAAIS,KAAK,KAAKL,EAAMK,QAAQ,WACzCC,UAAgBV,EAAIW,UAAUP,EAAMQ,KAAK,GACzCC,UAAiBb,EAAIa,SAAS,KAAK,CAAC,CAACT,EAAMS,UAI3CC,UAAiB;EACrB,IAAID,EAAS,GAAG,OAAO;EACvB,IAAME,IAAcf,EAAIgB,iBAAiB;EAQzC,OAPID,MAAgBX,EAAMQ,SAASZ,EAAIiB,SAASb,EAAMQ,KAAK,MAExDG,MAAgBG,KAAAA,KAAa,CAAClB,EAAIiB,SAASF,CAAW,MACvDf,EAAImB,eAAef,EAAMQ,KAAK,IAEvB,IAEF;CACT;CAYA,OAVA1B,QAAc;EACZD,EACEe,EAAIoB,aAAa;GACfR,OAAOR,EAAMQ;GACbC;GACAQ,SAASf;EACX,CAAC,CACH;CACF,CAAC,UAED;EAAA,IAAAgB,IAAAC,EAAA;EAoCmB,OApCnBD,EAAAE,iBAAA,UA6BcC,MAAM;GAGdlC,AADKsB,EAAS,KAAGb,EAAI0B,oBAAoBtB,EAAMQ,KAAK,GACpDrB,EAAiBa,EAAMuB,SAASF,CAAC;EACnC,CAAC,GAAAH,EAAAM,WAXSH,MAAM;GAGd,AADAlC,EAAiBa,EAAMyB,SAASJ,CAAC,GAC7B,CAACA,EAAEK,oBAAoB,CAACjB,EAAS,KACnCb,EAAI+B,WAAW3B,EAAMQ,OAAOa,GAAGA,EAAEO,aAAa;EAElD,GAACC,GA1BKC,MAAO;GACX5B,IAAa4B;EACf,GAACZ,CAAA,GAAAa,EAAAb,GAAAc,EAAA;GAAA,IACDlC,OAAI;IAAA,OAAEE,EAAMF;GAAI;GAAA,IAChBW,WAAQ;IAAA,OAAEA,EAAS;GAAC;GAAA,IACpBwB,WAAQ;IAAA,OAAEvB,EAAS;GAAC;GAAA,IAAA,iBAAA;IAAA,OAENN,EAAQ;GAAC;GAAA,IAAA,cAAA;IAAA,OACZC,EAAK;GAAC;GAAA,IAAA,iBAAA;IAAA,OACHT,EAAIyC,QAAQ;GAAC;GAAA,IAAA,iBAAA;IAAA,OACb/B,EAAQ,IAAI,KAAK;GAAI;GAAA,IAAA,kBAAA;IAAA,OACpBG,EAAS,IAAI,KAAK;GAAI;GAAA,IAAA,eAAA;IAAA,OACzBH,EAAQ,IAAI,OAAO;GAAK;GAAA,IAAA,iBAAA;IAAA,OACtBA,EAAQ;GAAC;GAAA,IAAAoE,QAAA;IAAA,OAChBzF,EACLC,EAAe;KAAEkB,SAASA,EAAQ;KAAGC,MAAMA,EAAK;IAAE,CAAC,GACnDf,EAAwB,GACxBU,EAAM0C,KACR;GAAC;GAAA,IACDC,YAAS;IAAA,OAAE3C,EAAM2C;GAAS;EAAA,GAatB1C,CAAI,GAAA,IAAA,EAAA,GAAA2C,EAAA1B,SAEPlB,EAAM6C,QAAQ,GAAA3B;CAAA,EAAA,CAAA;AAGrB;AAAC4B,EAAA,CAAA,OAAA,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { Accessor } from 'solid-js';
2
+ /** 没有触发任何 CSS animation 时的兜底卸载延迟(ms) */
3
+ export declare const EXIT_FALLBACK_MS = 300;
4
+ export interface UsePresenceOptions {
5
+ /** 逻辑上是否应该打开 */
6
+ visible: Accessor<boolean>;
7
+ /** 真正承载进出场动画的元素(没有它就无法等 animationend) */
8
+ element: Accessor<HTMLElement | undefined>;
9
+ /**
10
+ * 一次性询问"这次关闭是否要跳过退场动画"(例如被同组的另一个浮层抢占,
11
+ * 必须立即卸载以免两个浮层同时出现在屏幕上)。
12
+ */
13
+ consumeSuppressExitAnimation: () => boolean;
14
+ /** 兜底卸载延迟,默认 300ms */
15
+ fallbackMs?: number;
16
+ }
17
+ /**
18
+ * 退场动画支持(Presence):
19
+ *
20
+ * `visible` 从 true 变 false 时不立刻卸载节点——先让调用方把 `data-state` 切到
21
+ * closed 触发退场动画,等内容元素自己的 `animationend` 触发后才把 `mounted`
22
+ * 置 false,交给 `<Show>` 卸载。若动画永远不会触发(没装动画库、只用了
23
+ * transition 而自定义样式里没有 @keyframes),则由兜底定时器收尾。
24
+ *
25
+ * 单次关闭只会卸载一次:animationend 与兜底定时器都会在 `onCleanup` 里回收。
26
+ */
27
+ export declare function usePresence(options: UsePresenceOptions): Accessor<boolean>;
@@ -0,0 +1,24 @@
1
+ import { createEffect as e, createSignal as t, onCleanup as n } from "solid-js";
2
+ function r(r) {
3
+ let i = r.fallbackMs ?? 300, [a, o] = t(r.visible());
4
+ return e((e) => {
5
+ let t = r.visible(), a = r.element();
6
+ if (t) o(!0);
7
+ else if (e && a) {
8
+ if (r.consumeSuppressExitAnimation()) o(!1);
9
+ else {
10
+ let e = (e) => {
11
+ e.target === a && o(!1);
12
+ };
13
+ a.addEventListener("animationend", e), n(() => a.removeEventListener("animationend", e));
14
+ let t = window.setTimeout(() => o(!1), i);
15
+ n(() => window.clearTimeout(t));
16
+ }
17
+ } else o(!1);
18
+ return t;
19
+ }, r.visible()), a;
20
+ }
21
+ //#endregion
22
+ export { r as usePresence };
23
+
24
+ //# sourceMappingURL=usePresence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePresence.js","names":["usePresence","fallbackMs","options","mounted","setMounted","createSignal","createEffect","visible","element","wasVisible","handleAnimationEnd","event","onCleanup","fallback"],"sources":["../../../../src/components/tooltip/TooltipContent/usePresence.ts"],"sourcesContent":["import { type Accessor, createEffect, createSignal, onCleanup } from \"solid-js\";\n\n/** 没有触发任何 CSS animation 时的兜底卸载延迟(ms) */\nexport const EXIT_FALLBACK_MS = 300;\n\nexport interface UsePresenceOptions {\n /** 逻辑上是否应该打开 */\n visible: Accessor<boolean>;\n /** 真正承载进出场动画的元素(没有它就无法等 animationend) */\n element: Accessor<HTMLElement | undefined>;\n /**\n * 一次性询问\"这次关闭是否要跳过退场动画\"(例如被同组的另一个浮层抢占,\n * 必须立即卸载以免两个浮层同时出现在屏幕上)。\n */\n consumeSuppressExitAnimation: () => boolean;\n /** 兜底卸载延迟,默认 300ms */\n fallbackMs?: number;\n}\n\n/**\n * 退场动画支持(Presence):\n *\n * `visible` 从 true 变 false 时不立刻卸载节点——先让调用方把 `data-state` 切到\n * closed 触发退场动画,等内容元素自己的 `animationend` 触发后才把 `mounted`\n * 置 false,交给 `<Show>` 卸载。若动画永远不会触发(没装动画库、只用了\n * transition 而自定义样式里没有 @keyframes),则由兜底定时器收尾。\n *\n * 单次关闭只会卸载一次:animationend 与兜底定时器都会在 `onCleanup` 里回收。\n */\nexport function usePresence(options: UsePresenceOptions): Accessor<boolean> {\n const fallbackMs = options.fallbackMs ?? EXIT_FALLBACK_MS;\n const [mounted, setMounted] = createSignal(options.visible());\n\n createEffect<boolean>((wasVisible) => {\n const visible = options.visible();\n const element = options.element();\n\n if (visible) {\n setMounted(true);\n } else if (wasVisible && element) {\n if (options.consumeSuppressExitAnimation()) {\n setMounted(false);\n } else {\n const handleAnimationEnd = (event: AnimationEvent) => {\n // 忽略从子元素冒泡上来的 animationend,只认元素自己播放的那个动画\n if (event.target !== element) return;\n setMounted(false);\n };\n element.addEventListener(\"animationend\", handleAnimationEnd);\n onCleanup(() =>\n element.removeEventListener(\"animationend\", handleAnimationEnd),\n );\n\n const fallback = window.setTimeout(() => setMounted(false), fallbackMs);\n onCleanup(() => window.clearTimeout(fallback));\n }\n } else {\n // 走到这里必然 !visible(上面的 if 已排除 visible 分支),无需再判一次\n setMounted(false);\n }\n\n return visible;\n }, options.visible());\n\n return mounted;\n}\n"],"mappings":";AA6BA,SAAgBA,EAAY,GAAgD;CAC1E,IAAMC,IAAaC,EAAQ,cAAA,KACrB,CAACC,GAASC,KAAcC,EAAaH,EAAQ,QAAQ,CAAC;CAiC5D,OA/BAI,GAAuB,MAAe;EACpC,IAAMC,IAAUL,EAAQ,QAAQ,GAC1BM,IAAUN,EAAQ,QAAQ;EAEhC,IAAIK,GACF,EAAW,EAAI;OACV,IAAIE,KAAcD,GAAS;GAChC,IAAIN,EAAQ,6BAA6B,GACvC,EAAW,EAAK;QACX;IACL,IAAMQ,KAAsB,MAA0B;KAEpD,AAAIC,EAAM,WAAWH,KACrBJ,EAAW,EAAK;IAClB;IAEA,AADAI,EAAQ,iBAAiB,gBAAgBE,CAAkB,GAC3DE,QACEJ,EAAQ,oBAAoB,gBAAgBE,CAAkB,CAChE;IAEA,IAAMG,IAAW,OAAO,iBAAiBT,EAAW,EAAK,GAAGH,CAAU;IACtE,QAAgB,OAAO,aAAaY,CAAQ,CAAC;GAC/C;EACF,OAEE,EAAW,EAAK;EAGlB,OAAON;CACT,GAAGL,EAAQ,QAAQ,CAAC,GAEbC;AACT"}
@@ -2,11 +2,11 @@ import { createPositioner as e } from "../../../lib/positioner/create-positioner
2
2
  import { toPlacement as t } from "../../../lib/positioner/utils/floating.js";
3
3
  import { useTooltipContext as n } from "../Tooltip/Tooltip.context.js";
4
4
  import { createTooltipMiddleware as r } from "./TooltipContent.utils.js";
5
- import { createEffect as i, createMemo as a, createSignal as o, onCleanup as s } from "solid-js";
5
+ import { usePresence as i } from "./usePresence.js";
6
+ import { createEffect as a, createMemo as o, createSignal as s, onCleanup as c } from "solid-js";
6
7
  //#region src/components/tooltip/TooltipContent/useTooltipContent.ts
7
- var c = 300;
8
8
  function l(l) {
9
- let u = n("TooltipContent"), [d, f] = o(), [p, m] = o(), h = e(u.reference, u.floating, {
9
+ let u = n("TooltipContent"), [d, f] = s(), [p, m] = s(), h = e(u.reference, u.floating, {
10
10
  placement: () => t(l().side ?? "top", l().align ?? "center", l().dir),
11
11
  strategy: "fixed",
12
12
  middleware: () => r({
@@ -15,15 +15,19 @@ function l(l) {
15
15
  collisionPadding: l().collisionPadding ?? 8,
16
16
  arrowElement: d
17
17
  })
18
- }), g = a(() => u.open() && !h.middlewareData().hide?.referenceHidden), [_, v] = o("closed");
19
- i(() => {
18
+ }), g = o(() => u.open() && !h.middlewareData().hide?.referenceHidden), [_, v] = s("closed");
19
+ a(() => {
20
20
  if (g()) {
21
21
  let e = requestAnimationFrame(() => v("open"));
22
- s(() => cancelAnimationFrame(e));
22
+ c(() => cancelAnimationFrame(e));
23
23
  } else v("closed");
24
24
  });
25
- let [y, b] = o(), [x, S] = o(g());
26
- i(() => {
25
+ let [y, b] = s(), x = i({
26
+ visible: g,
27
+ element: p,
28
+ consumeSuppressExitAnimation: () => u.consumeSuppressExitAnimation()
29
+ });
30
+ return a(() => {
27
31
  if (!x()) return;
28
32
  let e = u.pendingSlideFrom();
29
33
  if (!e || !h.isPositioned()) return;
@@ -35,32 +39,7 @@ function l(l) {
35
39
  x: 0,
36
40
  y: 0
37
41
  }));
38
- });
39
- let C = a(() => {
40
- let e = y();
41
- if (!e) return {};
42
- let t = e.x === 0 && e.y === 0;
43
- return {
44
- transform: `translate(${e.x}px, ${e.y}px)`,
45
- transition: t ? "transform 150ms ease" : void 0
46
- };
47
- });
48
- return i((e) => {
49
- let t = g(), n = p();
50
- if (t) S(!0);
51
- else if (e && n) {
52
- if (u.consumeSuppressExitAnimation()) S(!1);
53
- else {
54
- let e = (e) => {
55
- e.target === n && S(!1);
56
- };
57
- n.addEventListener("animationend", e), s(() => n.removeEventListener("animationend", e));
58
- let t = window.setTimeout(() => S(!1), c);
59
- s(() => window.clearTimeout(t));
60
- }
61
- } else t || S(!1);
62
- return t;
63
- }, g()), {
42
+ }), {
64
43
  ctx: u,
65
44
  pos: h,
66
45
  isVisible: g,
@@ -70,7 +49,15 @@ function l(l) {
70
49
  setArrowElement: f,
71
50
  contentElement: p,
72
51
  setContentElement: m,
73
- slideStyle: C
52
+ slideStyle: o(() => {
53
+ let e = y();
54
+ if (!e) return {};
55
+ let t = e.x === 0 && e.y === 0;
56
+ return {
57
+ transform: `translate(${e.x}px, ${e.y}px)`,
58
+ transition: t ? "transform 150ms ease" : void 0
59
+ };
60
+ })
74
61
  };
75
62
  }
76
63
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useTooltipContent.js","names":["EXIT_FALLBACK_MS","useTooltipContent","ctx","useTooltipContext","arrowElement","setArrowElement","createSignal","contentElement","setContentElement","pos","createPositioner","toPlacement","props","createTooltipMiddleware","isVisible","createMemo","animationState","setAnimationState","raf","slideOffset","setSlideOffset","mounted","setMounted","from","dx","dy","slideStyle","offset","atRest","createEffect","visible","el","wasVisible","handleAnimationEnd","onCleanup","fallback"],"sources":["../../../../src/components/tooltip/TooltipContent/useTooltipContent.ts"],"sourcesContent":["import { createSignal, createMemo, createEffect, onCleanup } from \"solid-js\";\nimport { createPositioner, type Positioner } from \"~/lib\";\nimport { useTooltipContext } from \"../Tooltip/Tooltip.context\";\nimport { createTooltipMiddleware, toPlacement } from \"./TooltipContent.utils\";\nimport type { TooltipContentProps } from \"./TooltipContent.types\";\n\n/** 没有触发任何 CSS animation 时的兜底卸载延迟(ms)——比如没装 tailwindcss-animate、\n * 或者自定义样式只用了 transition 而不是 @keyframes,animationend 永远不会触发,\n * 避免元素卡在 DOM 里退不出去。 */\nconst EXIT_FALLBACK_MS = 300;\n\nexport interface UseTooltipContentResult {\n ctx: ReturnType<typeof useTooltipContext>;\n pos: Positioner;\n /** 综合了 open 状态 + hide 中间件的 referenceHidden 判断,代表\"逻辑上应不应该打开\" */\n isVisible: () => boolean;\n /**\n * 代表\"DOM 里要不要还留着这个节点\"。isVisible 变 false 之后,mounted 不会立刻\n * 跟着变 false,而是等退场动画播完(或者兜底超时)才变——展示层应该用它来控制\n * <Show>,而不是直接用 isVisible,否则退场动画根本来不及播放就被卸载了。\n */\n mounted: () => boolean;\n /**\n * 真正用来驱动 data-state(进而驱动 CSS 进出场动画 class)的状态,\n * 展示层应该用它,而不是直接用 isVisible。\n *\n * 和 isVisible 的区别只在\"打开\"这一侧:isVisible 变 true 的瞬间,\n * animationState 不会立刻跟着变 \"open\",而是等一帧(requestAnimationFrame)\n * 之后才变——这一帧的间隙用来让箭头(TooltipArrow)完成挂载、把自己注册给\n * arrow middleware、拿到正确的位置偏移。如果不等这一帧,动画会在箭头位置\n * 还没算对的时候就开始播放,播到一半箭头才\"跳\"到正确位置,看起来就像是\n * 箭头比内容慢一拍——这正是因为内容的淡入/缩放靠的是 CSS 动画(父元素的\n * opacity/transform 会连带影响所有子元素,包括箭头,两者本该同步),而箭头\n * 的具体位置靠的是 JS 算出来的 left/top,这是两套完全独立的机制,只有当\n * \"开始播放动画\"这个时间点晚于\"箭头位置算完\",才能保证两者观感一致。\n * 关闭这一侧不需要这个延迟,isVisible 变 false 时 animationState 立刻跟着变。\n */\n animationState: () => \"open\" | \"closed\";\n arrowElement: () => Element | undefined;\n setArrowElement: (el: Element) => void;\n /** 内层内容元素(真正播放进出场动画的那一层),TooltipContent 需要把它 ref 进来 */\n contentElement: () => HTMLElement | undefined;\n setContentElement: (el: HTMLElement) => void;\n /**\n * 加在\"滑动层\"(定位层和内容层之间的中间那层)上的 style。\n * 命中 TooltipGroup 抢占时会有一个非零初始偏移,下一帧起会用 CSS transition\n * 平滑归零,从而制造出\"从旧 tooltip 位置滑到新位置\"的效果;平时是空对象,\n * 不产生任何影响。\n */\n slideStyle: () => { transform?: string; transition?: string };\n}\n\nexport function useTooltipContent(\n props: () => TooltipContentProps,\n): UseTooltipContentResult {\n const ctx = useTooltipContext(\"TooltipContent\");\n const [arrowElement, setArrowElement] = createSignal<Element>();\n const [contentElement, setContentElement] = createSignal<HTMLElement>();\n\n const pos = createPositioner(ctx.reference, ctx.floating, {\n placement: () =>\n toPlacement(\n props().side ?? \"top\",\n props().align ?? \"center\",\n props().dir,\n ),\n strategy: \"fixed\",\n middleware: () =>\n createTooltipMiddleware({\n sideOffset: props().sideOffset ?? 4,\n alignOffset: props().alignOffset ?? 0,\n collisionPadding: props().collisionPadding ?? 8,\n arrowElement,\n }),\n });\n\n // reference 完全滚出视口(比如所在容器被单独滚动)时,hide middleware 会标记\n // referenceHidden,这里据此隐藏浮层,避免它悬空显示在一个已经看不到的触发器旁边。\n const isVisible = createMemo(\n () => ctx.open() && !pos.middlewareData().hide?.referenceHidden,\n );\n\n // --- 箭头和内容同步入场:延迟一帧再触发动画 class ---\n // 见 UseTooltipContentResult.animationState 的注释:只有\"开始播放动画\"这个\n // 时间点晚于\"箭头位置算完\",才能保证箭头不会在动画播到一半时才跳到正确位置。\n const [animationState, setAnimationState] = createSignal<\"open\" | \"closed\">(\n \"closed\",\n );\n\n createEffect(() => {\n if (isVisible()) {\n const raf = requestAnimationFrame(() => setAnimationState(\"open\"));\n onCleanup(() => cancelAnimationFrame(raf));\n } else {\n // 关闭不需要等——退场动画本来就是从\"当前已经落定的位置\"往外淡出/缩小,\n // 不存在箭头位置还没算好这个问题,没理由延迟。\n setAnimationState(\"closed\");\n }\n });\n\n // --- TooltipGroup 抢占时的\"滑入\"过渡(FLIP 技术) ---\n const [slideOffset, setSlideOffset] = createSignal<{\n x: number;\n y: number;\n }>();\n\n const [mounted, setMounted] = createSignal(isVisible());\n\n createEffect(() => {\n if (!mounted()) return;\n const from = ctx.pendingSlideFrom();\n if (!from) return;\n // 必须等真正定位完成(知道自己算出来的最终坐标)才能算出\"要从哪滑过来\"的差值。\n if (!pos.isPositioned()) return;\n\n const dx = from.x - pos.x();\n const dy = from.y - pos.y();\n // 第一步:把偏移设成非零值——这一步和 floatingStyles() 的最终坐标叠加后,\n // 视觉上让新 tooltip 一出现就恰好在旧 tooltip 原来的位置,没有任何跳动。\n setSlideOffset({ x: dx, y: dy });\n // 消费一次立刻清空,避免后续 autoUpdate(滚动/resize 触发的重新定位)\n // 又把这次的偏移重新套用一遍。\n ctx.clearPendingSlideFrom();\n\n // 第二步:下一帧再把偏移量归零。因为这次更新带上了 transition(见下面\n // slideStyle 的实现),浏览器会把\"从非零偏移回到 0\"这个变化平滑动画出来,\n // 效果就是从旧位置滑到新位置。用 requestAnimationFrame 而不是同步归零,\n // 是为了确保浏览器先真正画出第一帧(非零偏移、无 transition),\n // 下一帧的变化才有\"起点\"可以过渡,不会被浏览器合并成一次跳变。\n requestAnimationFrame(() => setSlideOffset({ x: 0, y: 0 }));\n });\n\n const slideStyle = createMemo(() => {\n const offset = slideOffset();\n if (!offset) return {};\n const atRest = offset.x === 0 && offset.y === 0;\n return {\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n // 只有\"归零\"这一步才带 transition:非零的那一帧要求瞬间落位、不能有动画,\n // 否则会先看到它从视口原点飞过来,而不是从旧 tooltip 的位置飞过来。\n transition: atRest ? \"transform 150ms ease\" : undefined,\n };\n });\n\n // --- 退场动画支持(Presence)---\n // isVisible 从 true 变 false 的瞬间,不立刻让 <Show> 卸载节点:先把 data-state\n // 切到 closed(触发退场动画的 CSS class),等这个节点自己的 animationend 触发\n // (或者兜底超时)之后,才真正把 mounted 设为 false,交给 <Show> 卸载。\n createEffect((wasVisible: boolean) => {\n const visible = isVisible();\n const el = contentElement();\n\n if (visible) {\n setMounted(true);\n } else if (wasVisible && el) {\n if (ctx.consumeSuppressExitAnimation()) {\n // 被 TooltipGroup 抢占强制关闭:跳过退场动画,立即卸载,避免和正在\n // 滑入的新 tooltip 同时出现在屏幕上(这是\"同时存在两个 tooltip\"这个\n // bug 的根因——之前不管什么原因关闭,都统一走了退场动画那条路)。\n setMounted(false);\n } else {\n const handleAnimationEnd = (e: AnimationEvent) => {\n // 忽略从子元素冒泡上来的 animationend,只认内容元素自己播放的那个动画\n if (e.target !== el) return;\n setMounted(false);\n };\n el.addEventListener(\"animationend\", handleAnimationEnd);\n onCleanup(() =>\n el.removeEventListener(\"animationend\", handleAnimationEnd),\n );\n\n const fallback = window.setTimeout(\n () => setMounted(false),\n EXIT_FALLBACK_MS,\n );\n onCleanup(() => window.clearTimeout(fallback));\n }\n } else if (!visible) {\n setMounted(false);\n }\n\n return visible;\n }, isVisible());\n\n return {\n ctx,\n pos,\n isVisible,\n mounted,\n animationState,\n arrowElement,\n setArrowElement,\n contentElement,\n setContentElement,\n slideStyle,\n };\n}\n"],"mappings":";;;;;;AASA,IAAMA,IAAmB;AA2CzB,SAAgBC,EACd,GACyB;CACzB,IAAMC,IAAMC,EAAkB,gBAAgB,GACxC,CAACC,GAAcC,KAAmBC,EAAsB,GACxD,CAACC,GAAgBC,KAAqBF,EAA0B,GAEhEG,IAAMC,EAAiBR,EAAI,WAAWA,EAAI,UAAU;EACxD,iBACES,EACEC,EAAM,CAAC,CAAC,QAAQ,OAChBA,EAAM,CAAC,CAAC,SAAS,UACjBA,EAAM,CAAC,CAAC,GACV;EACF,UAAU;EACV,kBACEC,EAAwB;GACtB,YAAYD,EAAM,CAAC,CAAC,cAAc;GAClC,aAAaA,EAAM,CAAC,CAAC,eAAe;GACpC,kBAAkBA,EAAM,CAAC,CAAC,oBAAoB;GAC9C;EACF,CAAC;CACL,CAAC,GAIKE,IAAYC,QACVb,EAAI,KAAK,KAAK,CAACO,EAAI,eAAe,CAAC,CAAC,MAAM,eAClD,GAKM,CAACO,GAAgBC,KAAqBX,EAC1C,QACF;CAEA,QAAmB;EACjB,IAAIQ,EAAU,GAAG;GACf,IAAMI,IAAM,4BAA4BD,EAAkB,MAAM,CAAC;GACjE,QAAgB,qBAAqBC,CAAG,CAAC;EAC3C,OAGE,EAAkB,QAAQ;CAE9B,CAAC;CAGD,IAAM,CAACC,GAAaC,KAAkBd,EAGnC,GAEG,CAACe,GAASC,KAAchB,EAAaQ,EAAU,CAAC;CAEtD,QAAmB;EACjB,IAAI,CAACO,EAAQ,GAAG;EAChB,IAAME,IAAOrB,EAAI,iBAAiB;EAGlC,IAFI,CAACqB,KAED,CAACd,EAAI,aAAa,GAAG;EAEzB,IAAMe,IAAKD,EAAK,IAAId,EAAI,EAAE,GACpBgB,IAAKF,EAAK,IAAId,EAAI,EAAE;EAa1B,AAVAW,EAAe;GAAE,GAAGI;GAAI,GAAGC;EAAG,CAAC,GAG/BvB,EAAI,sBAAsB,GAO1B,4BAA4BkB,EAAe;GAAE,GAAG;GAAG,GAAG;EAAE,CAAC,CAAC;CAC5D,CAAC;CAED,IAAMM,IAAaX,QAAiB;EAClC,IAAMY,IAASR,EAAY;EAC3B,IAAI,CAACQ,GAAQ,OAAO,CAAC;EACrB,IAAMC,IAASD,EAAO,MAAM,KAAKA,EAAO,MAAM;EAC9C,OAAO;GACL,WAAW,aAAaA,EAAO,EAAE,MAAMA,EAAO,EAAE;GAGhD,YAAYC,IAAS,yBAAyB,KAAA;EAChD;CACF,CAAC;CA0CD,OApCAC,GAAc,MAAwB;EACpC,IAAMC,IAAUhB,EAAU,GACpBiB,IAAKxB,EAAe;EAE1B,IAAIuB,GACF,EAAW,EAAI;OACV,IAAIE,KAAcD,GAAI;GAC3B,IAAI7B,EAAI,6BAA6B,GAInC,EAAW,EAAK;QACX;IACL,IAAM+B,KAAsB,MAAsB;KAEhD,AAAI,EAAE,WAAWF,KACjBT,EAAW,EAAK;IAClB;IAEA,AADAS,EAAG,iBAAiB,gBAAgBE,CAAkB,GACtDC,QACEH,EAAG,oBAAoB,gBAAgBE,CAAkB,CAC3D;IAEA,IAAME,IAAW,OAAO,iBAChBb,EAAW,EAAK,GACtBtB,CACF;IACA,QAAgB,OAAO,aAAamC,CAAQ,CAAC;GAC/C;EACF,OAAO,AAAKL,KACVR,EAAW,EAAK;EAGlB,OAAOQ;CACT,GAAGhB,EAAU,CAAC,GAEP;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"useTooltipContent.js","names":["useTooltipContent","ctx","useTooltipContext","arrowElement","setArrowElement","createSignal","contentElement","setContentElement","pos","createPositioner","toPlacement","props","createTooltipMiddleware","isVisible","createMemo","animationState","setAnimationState","raf","slideOffset","setSlideOffset","mounted","usePresence","createEffect","from","dx","dy","offset","atRest"],"sources":["../../../../src/components/tooltip/TooltipContent/useTooltipContent.ts"],"sourcesContent":["import { createSignal, createMemo, createEffect, onCleanup } from \"solid-js\";\nimport { createPositioner, type Positioner } from \"~/lib\";\nimport { useTooltipContext } from \"../Tooltip/Tooltip.context\";\nimport { createTooltipMiddleware, toPlacement } from \"./TooltipContent.utils\";\nimport { usePresence } from \"./usePresence\";\nimport type { TooltipContentProps } from \"./TooltipContent.types\";\n\nexport interface UseTooltipContentResult {\n ctx: ReturnType<typeof useTooltipContext>;\n pos: Positioner;\n /** 综合了 open 状态 + hide 中间件的 referenceHidden 判断,代表\"逻辑上应不应该打开\" */\n isVisible: () => boolean;\n /**\n * 代表\"DOM 里要不要还留着这个节点\"。isVisible 变 false 之后,mounted 不会立刻\n * 跟着变 false,而是等退场动画播完(或者兜底超时)才变——展示层应该用它来控制\n * <Show>,而不是直接用 isVisible,否则退场动画根本来不及播放就被卸载了。\n */\n mounted: () => boolean;\n /**\n * 真正用来驱动 data-state(进而驱动 CSS 进出场动画 class)的状态,\n * 展示层应该用它,而不是直接用 isVisible。\n *\n * 和 isVisible 的区别只在\"打开\"这一侧:isVisible 变 true 的瞬间,\n * animationState 不会立刻跟着变 \"open\",而是等一帧(requestAnimationFrame)\n * 之后才变——这一帧的间隙用来让箭头(TooltipArrow)完成挂载、把自己注册给\n * arrow middleware、拿到正确的位置偏移。如果不等这一帧,动画会在箭头位置\n * 还没算对的时候就开始播放,播到一半箭头才\"跳\"到正确位置,看起来就像是\n * 箭头比内容慢一拍——这正是因为内容的淡入/缩放靠的是 CSS 动画(父元素的\n * opacity/transform 会连带影响所有子元素,包括箭头,两者本该同步),而箭头\n * 的具体位置靠的是 JS 算出来的 left/top,这是两套完全独立的机制,只有当\n * \"开始播放动画\"这个时间点晚于\"箭头位置算完\",才能保证两者观感一致。\n * 关闭这一侧不需要这个延迟,isVisible 变 false 时 animationState 立刻跟着变。\n */\n animationState: () => \"open\" | \"closed\";\n arrowElement: () => Element | undefined;\n setArrowElement: (el: Element) => void;\n /** 内层内容元素(真正播放进出场动画的那一层),TooltipContent 需要把它 ref 进来 */\n contentElement: () => HTMLElement | undefined;\n setContentElement: (el: HTMLElement) => void;\n /**\n * 加在\"滑动层\"(定位层和内容层之间的中间那层)上的 style。\n * 命中 TooltipGroup 抢占时会有一个非零初始偏移,下一帧起会用 CSS transition\n * 平滑归零,从而制造出\"从旧 tooltip 位置滑到新位置\"的效果;平时是空对象,\n * 不产生任何影响。\n */\n slideStyle: () => { transform?: string; transition?: string };\n}\n\nexport function useTooltipContent(\n props: () => TooltipContentProps,\n): UseTooltipContentResult {\n const ctx = useTooltipContext(\"TooltipContent\");\n const [arrowElement, setArrowElement] = createSignal<Element>();\n const [contentElement, setContentElement] = createSignal<HTMLElement>();\n\n const pos = createPositioner(ctx.reference, ctx.floating, {\n placement: () =>\n toPlacement(\n props().side ?? \"top\",\n props().align ?? \"center\",\n props().dir,\n ),\n strategy: \"fixed\",\n middleware: () =>\n createTooltipMiddleware({\n sideOffset: props().sideOffset ?? 4,\n alignOffset: props().alignOffset ?? 0,\n collisionPadding: props().collisionPadding ?? 8,\n arrowElement,\n }),\n });\n\n // reference 完全滚出视口(比如所在容器被单独滚动)时,hide middleware 会标记\n // referenceHidden,这里据此隐藏浮层,避免它悬空显示在一个已经看不到的触发器旁边。\n const isVisible = createMemo(\n () => ctx.open() && !pos.middlewareData().hide?.referenceHidden,\n );\n\n // --- 箭头和内容同步入场:延迟一帧再触发动画 class ---\n // 见 UseTooltipContentResult.animationState 的注释:只有\"开始播放动画\"这个\n // 时间点晚于\"箭头位置算完\",才能保证箭头不会在动画播到一半时才跳到正确位置。\n const [animationState, setAnimationState] = createSignal<\"open\" | \"closed\">(\n \"closed\",\n );\n\n createEffect(() => {\n if (isVisible()) {\n const raf = requestAnimationFrame(() => setAnimationState(\"open\"));\n onCleanup(() => cancelAnimationFrame(raf));\n } else {\n // 关闭不需要等——退场动画本来就是从\"当前已经落定的位置\"往外淡出/缩小,\n // 不存在箭头位置还没算好这个问题,没理由延迟。\n setAnimationState(\"closed\");\n }\n });\n\n // --- TooltipGroup 抢占时的\"滑入\"过渡(FLIP 技术) ---\n const [slideOffset, setSlideOffset] = createSignal<{\n x: number;\n y: number;\n }>();\n\n const mounted = usePresence({\n visible: isVisible,\n element: contentElement,\n consumeSuppressExitAnimation: () => ctx.consumeSuppressExitAnimation(),\n });\n\n createEffect(() => {\n if (!mounted()) return;\n const from = ctx.pendingSlideFrom();\n if (!from) return;\n // 必须等真正定位完成(知道自己算出来的最终坐标)才能算出\"要从哪滑过来\"的差值。\n if (!pos.isPositioned()) return;\n\n const dx = from.x - pos.x();\n const dy = from.y - pos.y();\n // 第一步:把偏移设成非零值——这一步和 floatingStyles() 的最终坐标叠加后,\n // 视觉上让新 tooltip 一出现就恰好在旧 tooltip 原来的位置,没有任何跳动。\n setSlideOffset({ x: dx, y: dy });\n // 消费一次立刻清空,避免后续 autoUpdate(滚动/resize 触发的重新定位)\n // 又把这次的偏移重新套用一遍。\n ctx.clearPendingSlideFrom();\n\n // 第二步:下一帧再把偏移量归零。因为这次更新带上了 transition(见下面\n // slideStyle 的实现),浏览器会把\"从非零偏移回到 0\"这个变化平滑动画出来,\n // 效果就是从旧位置滑到新位置。用 requestAnimationFrame 而不是同步归零,\n // 是为了确保浏览器先真正画出第一帧(非零偏移、无 transition),\n // 下一帧的变化才有\"起点\"可以过渡,不会被浏览器合并成一次跳变。\n requestAnimationFrame(() => setSlideOffset({ x: 0, y: 0 }));\n });\n\n const slideStyle = createMemo(() => {\n const offset = slideOffset();\n if (!offset) return {};\n const atRest = offset.x === 0 && offset.y === 0;\n return {\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n // 只有\"归零\"这一步才带 transition:非零的那一帧要求瞬间落位、不能有动画,\n // 否则会先看到它从视口原点飞过来,而不是从旧 tooltip 的位置飞过来。\n transition: atRest ? \"transform 150ms ease\" : undefined,\n };\n });\n\n return {\n ctx,\n pos,\n isVisible,\n mounted,\n animationState,\n arrowElement,\n setArrowElement,\n contentElement,\n setContentElement,\n slideStyle,\n };\n}\n"],"mappings":";;;;;;;AAgDA,SAAgBA,EACd,GACyB;CACzB,IAAMC,IAAMC,EAAkB,gBAAgB,GACxC,CAACC,GAAcC,KAAmBC,EAAsB,GACxD,CAACC,GAAgBC,KAAqBF,EAA0B,GAEhEG,IAAMC,EAAiBR,EAAI,WAAWA,EAAI,UAAU;EACxD,iBACES,EACEC,EAAM,CAAC,CAAC,QAAQ,OAChBA,EAAM,CAAC,CAAC,SAAS,UACjBA,EAAM,CAAC,CAAC,GACV;EACF,UAAU;EACV,kBACEC,EAAwB;GACtB,YAAYD,EAAM,CAAC,CAAC,cAAc;GAClC,aAAaA,EAAM,CAAC,CAAC,eAAe;GACpC,kBAAkBA,EAAM,CAAC,CAAC,oBAAoB;GAC9C;EACF,CAAC;CACL,CAAC,GAIKE,IAAYC,QACVb,EAAI,KAAK,KAAK,CAACO,EAAI,eAAe,CAAC,CAAC,MAAM,eAClD,GAKM,CAACO,GAAgBC,KAAqBX,EAC1C,QACF;CAEA,QAAmB;EACjB,IAAIQ,EAAU,GAAG;GACf,IAAMI,IAAM,4BAA4BD,EAAkB,MAAM,CAAC;GACjE,QAAgB,qBAAqBC,CAAG,CAAC;EAC3C,OAGE,EAAkB,QAAQ;CAE9B,CAAC;CAGD,IAAM,CAACC,GAAaC,KAAkBd,EAGnC,GAEGe,IAAUC,EAAY;EAC1B,SAASR;EACT,SAASP;EACT,oCAAoCL,EAAI,6BAA6B;CACvE,CAAC;CAsCD,OApCAqB,QAAmB;EACjB,IAAI,CAACF,EAAQ,GAAG;EAChB,IAAMG,IAAOtB,EAAI,iBAAiB;EAGlC,IAFI,CAACsB,KAED,CAACf,EAAI,aAAa,GAAG;EAEzB,IAAMgB,IAAKD,EAAK,IAAIf,EAAI,EAAE,GACpBiB,IAAKF,EAAK,IAAIf,EAAI,EAAE;EAa1B,AAVAW,EAAe;GAAE,GAAGK;GAAI,GAAGC;EAAG,CAAC,GAG/BxB,EAAI,sBAAsB,GAO1B,4BAA4BkB,EAAe;GAAE,GAAG;GAAG,GAAG;EAAE,CAAC,CAAC;CAC5D,CAAC,GAcM;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YAtBiBL,QAAiB;GAClC,IAAMY,IAASR,EAAY;GAC3B,IAAI,CAACQ,GAAQ,OAAO,CAAC;GACrB,IAAMC,IAASD,EAAO,MAAM,KAAKA,EAAO,MAAM;GAC9C,OAAO;IACL,WAAW,aAAaA,EAAO,EAAE,MAAMA,EAAO,EAAE;IAGhD,YAAYC,IAAS,yBAAyB,KAAA;GAChD;EACF,CAYE;CACF;AACF"}
@@ -77,7 +77,7 @@ function o(n) {
77
77
  a(c);
78
78
  }), e(() => {
79
79
  if (!s || c.length === 0) return;
80
- let e = o ?? document.documentElement, n = c[0], r = e.getAttribute("data-lang");
80
+ let e = o, n = c[0], r = e.getAttribute("data-lang");
81
81
  e.setAttribute("data-lang", n), t(() => {
82
82
  r === null ? e.removeAttribute("data-lang") : e.setAttribute("data-lang", r);
83
83
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useFontLoader.js","names":["FONT_MAP","loaded","filterValidLangs","langs","lang","loadGoogleFonts","toLoad","families","family","weights","link","useFontLoader","options","validLangs","createEffect","apply","el","targetRef","prev","onCleanup"],"sources":["../../src/hooks/useFontLoader.ts"],"sourcesContent":["import { createEffect, onCleanup } from \"solid-js\";\n\n// ─── 字体配置表 ────────────────────────────────────────────────\nconst FONT_MAP = {\n en: { family: \"Inter\", weights: \"400;500;700\" },\n fr: { family: \"Inter\", weights: \"400;500;700\" },\n de: { family: \"Inter\", weights: \"400;500;700\" },\n ru: { family: \"Noto+Sans\", weights: \"400;500;700\" },\n \"zh-hans\": { family: \"Noto+Sans+SC\", weights: \"400;500;700\" },\n \"zh-hant\": { family: \"Noto+Sans+TC\", weights: \"400;500;700\" },\n ja: { family: \"Noto+Sans+JP\", weights: \"400;500;700\" },\n ko: { family: \"Noto+Sans+KR\", weights: \"400;500;700\" },\n hi: { family: \"Noto+Sans+Devanagari\", weights: \"400;500;700\" },\n th: { family: \"Noto+Sans+Thai\", weights: \"400;500;700\" },\n bn: { family: \"Noto+Sans+Bengali\", weights: \"400;500;700\" },\n ar: { family: \"Noto+Sans+Arabic\", weights: \"400;500;700\" },\n he: { family: \"Noto+Sans+Hebrew\", weights: \"400;500;700\" },\n fa: { family: \"Noto+Sans+Arabic\", weights: \"400;500;700\" },\n} as const satisfies Record<string, { family: string; weights: string }>;\n\nexport type Lang = keyof typeof FONT_MAP;\n\n// ─── 已加载字体缓存(模块级单例,避免重复插入) ──────────────\nconst loaded = new Set<string>();\n\nfunction filterValidLangs(langs: string[]): Lang[] {\n return langs.filter((lang): lang is Lang => {\n if (lang in FONT_MAP) return true;\n if (!import.meta.env.PROD) {\n console.warn(\n `[useFontLoader] unsupported lang: \"${lang}\". ` +\n `Supported values: ${Object.keys(FONT_MAP).join(\", \")}`,\n );\n }\n return false;\n });\n}\n\nexport interface UseFontLoaderOptions {\n /**\n * 要加载的字体对应的语言\n *\n * 默认为`en`\n */\n langs?: Lang | Lang[];\n\n /**\n * 指定 data-lang 写入的目标元素。\n * - 传入 ref:仅在该元素上生效,适合局部语言切换。\n * - 不传(undefined):写入 ,全局生效。\n * 卸载时自动恢复目标元素的原始 data-lang 值。\n *\n * apply 为 false 时此选项无效。\n */\n targetRef?: HTMLElement;\n\n /**\n * 是否将 data-lang 写入目标元素以应用字体样式。\n * - true(默认):写入 data-lang,字体立即生效。\n * - false:仅预加载字体资源,不修改任何 DOM,\n * 适合提前预热用户可能切换到的语言字体。\n * @default\n */\n apply?: boolean;\n}\n\n/* ----------------------------------------------------------------\n 工具:插入 Google Fonts\n ---------------------------------------------------------------- */\nfunction loadGoogleFonts(langs: Lang[]): void {\n const toLoad = langs.filter((lang) => !loaded.has(FONT_MAP[lang].family));\n if (toLoad.length === 0) return;\n\n const families = [\n ...new Set(\n toLoad.map((lang) => {\n const { family, weights } = FONT_MAP[lang];\n return `family=${family}:wght@${weights}`;\n }),\n ),\n ];\n\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n\n document.head.appendChild(link);\n for (const lang of toLoad) {\n loaded.add(FONT_MAP[lang].family);\n }\n}\n\n// ─── Hook ─────────────────────────────────────────────────────\nexport function useFontLoader(options?: UseFontLoaderOptions) {\n const {\n langs = \"en\",\n targetRef = document.documentElement,\n apply = true,\n } = options ?? {};\n\n const langList = Array.isArray(langs) ? langs : [langs];\n const validLangs = filterValidLangs(langList);\n\n // --- 加载字体资源 ---\n createEffect(() => {\n loadGoogleFonts(validLangs);\n });\n\n // --- 将 data-lang 写入目标元素 ---\n createEffect(() => {\n if (!apply || validLangs.length === 0) return;\n\n // targetRef 未传或 ref.current 尚未挂载时,回退到\n const el = targetRef ?? document.documentElement;\n const lang = validLangs[0];\n const prev = el.getAttribute(\"data-lang\");\n\n el.setAttribute(\"data-lang\", lang);\n\n onCleanup(() => {\n // 卸载时恢复:原本有值则还原,原本无则移除\n if (prev === null) {\n el.removeAttribute(\"data-lang\");\n } else {\n el.setAttribute(\"data-lang\", prev);\n }\n });\n });\n}\n"],"mappings":";;AAGA,IAAMA,IAAW;CACf,IAAI;EAAE,QAAQ;EAAS,SAAS;CAAc;CAC9C,IAAI;EAAE,QAAQ;EAAS,SAAS;CAAc;CAC9C,IAAI;EAAE,QAAQ;EAAS,SAAS;CAAc;CAC9C,IAAI;EAAE,QAAQ;EAAa,SAAS;CAAc;CAClD,WAAW;EAAE,QAAQ;EAAgB,SAAS;CAAc;CAC5D,WAAW;EAAE,QAAQ;EAAgB,SAAS;CAAc;CAC5D,IAAI;EAAE,QAAQ;EAAgB,SAAS;CAAc;CACrD,IAAI;EAAE,QAAQ;EAAgB,SAAS;CAAc;CACrD,IAAI;EAAE,QAAQ;EAAwB,SAAS;CAAc;CAC7D,IAAI;EAAE,QAAQ;EAAkB,SAAS;CAAc;CACvD,IAAI;EAAE,QAAQ;EAAqB,SAAS;CAAc;CAC1D,IAAI;EAAE,QAAQ;EAAoB,SAAS;CAAc;CACzD,IAAI;EAAE,QAAQ;EAAoB,SAAS;CAAc;CACzD,IAAI;EAAE,QAAQ;EAAoB,SAAS;CAAc;AAC3D,GAKMC,oBAAS,IAAI,IAAY;AAE/B,SAASC,EAAiB,GAAyB;CACjD,OAAOC,EAAM,QAAQ,MACfC,KAAQJ,CAQb;AACH;AAiCA,SAASK,EAAgB,GAAqB;CAC5C,IAAMC,IAASH,EAAM,QAAQ,MAAS,CAACF,EAAO,IAAID,EAASI,EAAK,CAAC,MAAM,CAAC;CACxE,IAAIE,EAAO,WAAW,GAAG;CAEzB,IAAMC,IAAW,CACf,GAAG,IAAI,IACLD,EAAO,KAAK,MAAS;EACnB,IAAM,EAAE,WAAQ,eAAYN,EAASI;EACrC,OAAO,UAAUI,EAAO,QAAQC;CAClC,CAAC,CACH,CACF,GAEMC,IAAO,SAAS,cAAc,MAAM;CAI1C,AAHA,EAAK,MAAM,cACX,EAAK,OAAO,qCAAqCH,EAAS,KAAK,GAAG,EAAE,gBAEpE,SAAS,KAAK,YAAYG,CAAI;CAC9B,KAAK,IAAMN,KAAQE,GACjB,EAAO,IAAIN,EAASI,EAAK,CAAC,MAAM;AAEpC;AAGA,SAAgBO,EAAc,GAAgC;CAC5D,IAAM,EACJ,WAAQ,MACR,eAAY,SAAS,iBACrB,WAAQ,OACNC,KAAW,CAAC,GAGVC,IAAaX,EADF,MAAM,QAAQC,CAAK,IAAIA,IAAQ,CAACA,CAAK,CACV;CAQ5C,AALAW,QAAmB;EACjB,EAAgBD,CAAU;CAC5B,CAAC,GAGDC,QAAmB;EACjB,IAAI,CAACC,KAASF,EAAW,WAAW,GAAG;EAGvC,IAAMG,IAAKC,KAAa,SAAS,iBAC3Bb,IAAOS,EAAW,IAClBK,IAAOF,EAAG,aAAa,WAAW;EAIxC,AAFAA,EAAG,aAAa,aAAaZ,CAAI,GAEjCe,QAAgB;GAEd,AAAID,MAAS,OACXF,EAAG,gBAAgB,WAAW,IAE9BA,EAAG,aAAa,aAAaE,CAAI;EAErC,CAAC;CACH,CAAC;AACH"}
1
+ {"version":3,"file":"useFontLoader.js","names":["FONT_MAP","loaded","filterValidLangs","langs","lang","loadGoogleFonts","toLoad","families","family","weights","link","useFontLoader","options","validLangs","createEffect","apply","el","targetRef","prev","onCleanup"],"sources":["../../src/hooks/useFontLoader.ts"],"sourcesContent":["import { createEffect, onCleanup } from \"solid-js\";\n\n// ─── 字体配置表 ────────────────────────────────────────────────\nconst FONT_MAP = {\n en: { family: \"Inter\", weights: \"400;500;700\" },\n fr: { family: \"Inter\", weights: \"400;500;700\" },\n de: { family: \"Inter\", weights: \"400;500;700\" },\n ru: { family: \"Noto+Sans\", weights: \"400;500;700\" },\n \"zh-hans\": { family: \"Noto+Sans+SC\", weights: \"400;500;700\" },\n \"zh-hant\": { family: \"Noto+Sans+TC\", weights: \"400;500;700\" },\n ja: { family: \"Noto+Sans+JP\", weights: \"400;500;700\" },\n ko: { family: \"Noto+Sans+KR\", weights: \"400;500;700\" },\n hi: { family: \"Noto+Sans+Devanagari\", weights: \"400;500;700\" },\n th: { family: \"Noto+Sans+Thai\", weights: \"400;500;700\" },\n bn: { family: \"Noto+Sans+Bengali\", weights: \"400;500;700\" },\n ar: { family: \"Noto+Sans+Arabic\", weights: \"400;500;700\" },\n he: { family: \"Noto+Sans+Hebrew\", weights: \"400;500;700\" },\n fa: { family: \"Noto+Sans+Arabic\", weights: \"400;500;700\" },\n} as const satisfies Record<string, { family: string; weights: string }>;\n\nexport type Lang = keyof typeof FONT_MAP;\n\n// ─── 已加载字体缓存(模块级单例,避免重复插入) ──────────────\nconst loaded = new Set<string>();\n\nfunction filterValidLangs(langs: string[]): Lang[] {\n return langs.filter((lang): lang is Lang => {\n if (lang in FONT_MAP) return true;\n if (!import.meta.env.PROD) {\n console.warn(\n `[useFontLoader] unsupported lang: \"${lang}\". ` +\n `Supported values: ${Object.keys(FONT_MAP).join(\", \")}`,\n );\n }\n return false;\n });\n}\n\nexport interface UseFontLoaderOptions {\n /**\n * 要加载的字体对应的语言\n *\n * 默认为`en`\n */\n langs?: Lang | Lang[];\n\n /**\n * 指定 data-lang 写入的目标元素。\n * - 传入 ref:仅在该元素上生效,适合局部语言切换。\n * - 不传(undefined):写入 ,全局生效。\n * 卸载时自动恢复目标元素的原始 data-lang 值。\n *\n * apply 为 false 时此选项无效。\n */\n targetRef?: HTMLElement;\n\n /**\n * 是否将 data-lang 写入目标元素以应用字体样式。\n * - true(默认):写入 data-lang,字体立即生效。\n * - false:仅预加载字体资源,不修改任何 DOM,\n * 适合提前预热用户可能切换到的语言字体。\n * @default\n */\n apply?: boolean;\n}\n\n/* ----------------------------------------------------------------\n 工具:插入 Google Fonts\n ---------------------------------------------------------------- */\nfunction loadGoogleFonts(langs: Lang[]): void {\n const toLoad = langs.filter((lang) => !loaded.has(FONT_MAP[lang].family));\n if (toLoad.length === 0) return;\n\n const families = [\n ...new Set(\n toLoad.map((lang) => {\n const { family, weights } = FONT_MAP[lang];\n return `family=${family}:wght@${weights}`;\n }),\n ),\n ];\n\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n\n document.head.appendChild(link);\n for (const lang of toLoad) {\n loaded.add(FONT_MAP[lang].family);\n }\n}\n\n// ─── Hook ─────────────────────────────────────────────────────\nexport function useFontLoader(options?: UseFontLoaderOptions) {\n const {\n langs = \"en\",\n targetRef = document.documentElement,\n apply = true,\n } = options ?? {};\n\n const langList = Array.isArray(langs) ? langs : [langs];\n const validLangs = filterValidLangs(langList);\n\n // --- 加载字体资源 ---\n createEffect(() => {\n loadGoogleFonts(validLangs);\n });\n\n // --- 将 data-lang 写入目标元素 ---\n createEffect(() => {\n if (!apply || validLangs.length === 0) return;\n\n // targetRef 在解构 options 时已默认成 document.documentElement\n // (显式传 undefined 也会走默认值),因此这里不再需要二次兜底。\n const el = targetRef;\n const lang = validLangs[0];\n const prev = el.getAttribute(\"data-lang\");\n\n el.setAttribute(\"data-lang\", lang);\n\n onCleanup(() => {\n // 卸载时恢复:原本有值则还原,原本无则移除\n if (prev === null) {\n el.removeAttribute(\"data-lang\");\n } else {\n el.setAttribute(\"data-lang\", prev);\n }\n });\n });\n}\n"],"mappings":";;AAGA,IAAMA,IAAW;CACf,IAAI;EAAE,QAAQ;EAAS,SAAS;CAAc;CAC9C,IAAI;EAAE,QAAQ;EAAS,SAAS;CAAc;CAC9C,IAAI;EAAE,QAAQ;EAAS,SAAS;CAAc;CAC9C,IAAI;EAAE,QAAQ;EAAa,SAAS;CAAc;CAClD,WAAW;EAAE,QAAQ;EAAgB,SAAS;CAAc;CAC5D,WAAW;EAAE,QAAQ;EAAgB,SAAS;CAAc;CAC5D,IAAI;EAAE,QAAQ;EAAgB,SAAS;CAAc;CACrD,IAAI;EAAE,QAAQ;EAAgB,SAAS;CAAc;CACrD,IAAI;EAAE,QAAQ;EAAwB,SAAS;CAAc;CAC7D,IAAI;EAAE,QAAQ;EAAkB,SAAS;CAAc;CACvD,IAAI;EAAE,QAAQ;EAAqB,SAAS;CAAc;CAC1D,IAAI;EAAE,QAAQ;EAAoB,SAAS;CAAc;CACzD,IAAI;EAAE,QAAQ;EAAoB,SAAS;CAAc;CACzD,IAAI;EAAE,QAAQ;EAAoB,SAAS;CAAc;AAC3D,GAKMC,oBAAS,IAAI,IAAY;AAE/B,SAASC,EAAiB,GAAyB;CACjD,OAAOC,EAAM,QAAQ,MACfC,KAAQJ,CAQb;AACH;AAiCA,SAASK,EAAgB,GAAqB;CAC5C,IAAMC,IAASH,EAAM,QAAQ,MAAS,CAACF,EAAO,IAAID,EAASI,EAAK,CAAC,MAAM,CAAC;CACxE,IAAIE,EAAO,WAAW,GAAG;CAEzB,IAAMC,IAAW,CACf,GAAG,IAAI,IACLD,EAAO,KAAK,MAAS;EACnB,IAAM,EAAE,WAAQ,eAAYN,EAASI;EACrC,OAAO,UAAUI,EAAO,QAAQC;CAClC,CAAC,CACH,CACF,GAEMC,IAAO,SAAS,cAAc,MAAM;CAI1C,AAHA,EAAK,MAAM,cACX,EAAK,OAAO,qCAAqCH,EAAS,KAAK,GAAG,EAAE,gBAEpE,SAAS,KAAK,YAAYG,CAAI;CAC9B,KAAK,IAAMN,KAAQE,GACjB,EAAO,IAAIN,EAASI,EAAK,CAAC,MAAM;AAEpC;AAGA,SAAgBO,EAAc,GAAgC;CAC5D,IAAM,EACJ,WAAQ,MACR,eAAY,SAAS,iBACrB,WAAQ,OACNC,KAAW,CAAC,GAGVC,IAAaX,EADF,MAAM,QAAQC,CAAK,IAAIA,IAAQ,CAACA,CAAK,CACV;CAQ5C,AALAW,QAAmB;EACjB,EAAgBD,CAAU;CAC5B,CAAC,GAGDC,QAAmB;EACjB,IAAI,CAACC,KAASF,EAAW,WAAW,GAAG;EAIvC,IAAMG,IAAKC,GACLb,IAAOS,EAAW,IAClBK,IAAOF,EAAG,aAAa,WAAW;EAIxC,AAFAA,EAAG,aAAa,aAAaZ,CAAI,GAEjCe,QAAgB;GAEd,AAAID,MAAS,OACXF,EAAG,gBAAgB,WAAW,IAE9BA,EAAG,aAAa,aAAaE,CAAI;EAErC,CAAC;CACH,CAAC;AACH"}
@@ -1,20 +1,17 @@
1
- import { createEffect as e, onCleanup as t } from "solid-js";
1
+ import { isOverflowElement as e } from "../lib/positioner/utils/dom.js";
2
+ import { createEffect as t, onCleanup as n } from "solid-js";
2
3
  //#region src/hooks/useScrollLock.ts
3
- var n = 0, r, i = /* @__PURE__ */ new Set();
4
- function a(e) {
5
- let { overflow: t, overflowX: n, overflowY: r } = getComputedStyle(e);
6
- return /auto|scroll|overlay|hidden/.test(t + n + r);
7
- }
4
+ var r = 0, i, a = /* @__PURE__ */ new Set();
8
5
  function o() {
9
- let e = document.documentElement;
10
- return a(e) ? e : document.body;
6
+ let t = document.documentElement;
7
+ return e(t) ? t : document.body;
11
8
  }
12
9
  function s() {
13
10
  return typeof CSS < "u" && typeof CSS.supports == "function" && CSS.supports("scrollbar-gutter", "stable");
14
11
  }
15
12
  function c(e) {
16
13
  if (!(e instanceof Element)) return !1;
17
- for (let t of i) if (e.closest(t)) return !0;
14
+ for (let t of a) if (e.closest(t)) return !0;
18
15
  return !1;
19
16
  }
20
17
  function l() {
@@ -42,17 +39,17 @@ function l() {
42
39
  };
43
40
  }
44
41
  function u(e) {
45
- n += 1, e && i.add(e), n === 1 && (r = l());
42
+ r += 1, e && a.add(e), r === 1 && (i = l());
46
43
  let t = !1;
47
44
  return () => {
48
- t || (t = !0, --n, n === 0 && (r?.(), r = void 0, i.clear()));
45
+ t || (t = !0, --r, r === 0 && (i?.(), i = void 0, a.clear()));
49
46
  };
50
47
  }
51
- function d(n, r) {
52
- e(() => {
53
- if (!n()) return;
54
- let e = u(r?.allowedSelector);
55
- t(e);
48
+ function d(e, r) {
49
+ t(() => {
50
+ if (!e()) return;
51
+ let t = u(r?.allowedSelector);
52
+ n(t);
56
53
  });
57
54
  }
58
55
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollLock.js","names":["lockCount","release","allowedSelectors","isOverflowElement","el","overflow","overflowX","overflowY","getViewportScroller","html","supportsStableScrollbarGutter","isWithinAllowedScroll","target","selector","lockViewport","body","scroller","previous","scrollbarWidth","gutterSupported","padding","preventScroll","event","acquireLock","allowedSelector","released","useScrollLock","locked","unlock","options"],"sources":["../../src/hooks/useScrollLock.ts"],"sourcesContent":["import { createEffect, onCleanup, type Accessor } from \"solid-js\";\n\nexport interface UseScrollLockOptions {\n /**\n * 允许在锁滚动期间继续滚动的容器选择器(通常是浮层自身)。\n * 未命中该选择器的滚轮/触摸滚动会被拦截;不传则整个页面都锁定滚动。\n */\n allowedSelector?: string;\n}\n\n// 多个浮层/嵌套浮层可能同时持锁,用计数避免其中一个关闭就提前恢复页面滚动。\nlet lockCount = 0;\nlet release: (() => void) | undefined;\n// 各持锁浮层允许滚动的容器选择器。preventScroll 读取的是实时集合,\n// 因此即使某个选择器在锁生效之后才加入,也能立即对它放行。\nconst allowedSelectors = new Set<string>();\n\n/** 元素自身是否建立了滚动容器(与 positioner 里的判断口径一致) */\nfunction isOverflowElement(el: Element): boolean {\n const { overflow, overflowX, overflowY } = getComputedStyle(el);\n return /auto|scroll|overlay|hidden/.test(overflow + overflowX + overflowY);\n}\n\n/**\n * 页面的滚动容器:html 自己建立了滚动上下文时锁 html,否则锁 body\n * ——把 overflow 写在另一个元素上并不会锁住页面(Base UI 同样的判断)。\n */\nfunction getViewportScroller(): HTMLElement {\n const html = document.documentElement;\n return isOverflowElement(html) ? html : document.body;\n}\n\nfunction supportsStableScrollbarGutter(): boolean {\n return (\n typeof CSS !== \"undefined\" &&\n typeof CSS.supports === \"function\" &&\n CSS.supports(\"scrollbar-gutter\", \"stable\")\n );\n}\n\nfunction isWithinAllowedScroll(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false;\n for (const selector of allowedSelectors) {\n if (target.closest(selector)) return true;\n }\n return false;\n}\n\nfunction lockViewport(): () => void {\n const html = document.documentElement;\n const body = document.body;\n const scroller = getViewportScroller();\n\n const previous = {\n htmlScrollbarGutter: html.style.scrollbarGutter,\n scrollerOverflowX: scroller.style.overflowX,\n scrollerOverflowY: scroller.style.overflowY,\n bodyPaddingRight: body.style.paddingRight,\n scrollTop: scroller.scrollTop,\n scrollLeft: scroller.scrollLeft,\n };\n\n // 抵消滚动条消失带来的横向抖动:能用 scrollbar-gutter 就用它,\n // 否则退化成给 body 补一个滚动条宽度的右内边距。\n // 只有页面自身真的存在占位滚动条时才需要补偿:滚动条长在某个嵌套容器上时,\n // 锁 html/body 并不会移除那条滚动条,再给 html 加 gutter 只会额外多出一条空白\n // (滚动条 + gutter 双倍宽度),反而破坏布局。\n const scrollbarWidth = Math.max(0, window.innerWidth - html.clientWidth);\n const gutterSupported = supportsStableScrollbarGutter();\n if (scrollbarWidth > 0) {\n if (gutterSupported) {\n html.style.scrollbarGutter = \"stable\";\n } else {\n const padding =\n Number.parseFloat(getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${padding + scrollbarWidth}px`;\n }\n }\n\n scroller.style.overflowX = \"hidden\";\n scroller.style.overflowY = \"hidden\";\n\n // 兜底:部分浏览器即使 overflow:hidden 仍能被滚轮/触摸滚动,\n // 因此直接拦截浮层之外的滚动事件;浮层内部(命中 allowedSelector)保留滚动能力。\n const preventScroll = (event: Event) => {\n if (isWithinAllowedScroll(event.target)) return;\n event.preventDefault();\n };\n document.addEventListener(\"wheel\", preventScroll, { passive: false });\n document.addEventListener(\"touchmove\", preventScroll, { passive: false });\n\n return () => {\n html.style.scrollbarGutter = previous.htmlScrollbarGutter;\n if (!gutterSupported) {\n body.style.paddingRight = previous.bodyPaddingRight;\n }\n scroller.style.overflowX = previous.scrollerOverflowX;\n scroller.style.overflowY = previous.scrollerOverflowY;\n document.removeEventListener(\"wheel\", preventScroll);\n document.removeEventListener(\"touchmove\", preventScroll);\n scroller.scrollTop = previous.scrollTop;\n scroller.scrollLeft = previous.scrollLeft;\n };\n}\n\nfunction acquireLock(allowedSelector?: string): () => void {\n lockCount += 1;\n if (allowedSelector) allowedSelectors.add(allowedSelector);\n if (lockCount === 1) release = lockViewport();\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n lockCount -= 1;\n if (lockCount === 0) {\n release?.();\n release = undefined;\n // 全部释放后清空放行名单,避免残留的选择器影响下一次锁。\n allowedSelectors.clear();\n }\n };\n}\n\n/**\n * 浮层打开时锁定页面滚动,关闭后恢复——对齐 Base UI 的 modal 行为\n * (文档滚动被锁定、浮层之外的滚轮/触摸滚动被拦截),避免浮窗锚点随页面滚动而\"飘移\"。\n *\n * 多个浮层可同时持锁(引用计数);`allowedSelector` 命中的容器内仍可滚动,\n * 通常传入浮层自身,例如 Popover 传 `[data-slot=\"popover-content\"]`。\n */\nexport function useScrollLock(\n locked: Accessor<boolean>,\n options?: UseScrollLockOptions,\n) {\n createEffect(() => {\n if (!locked()) return;\n const unlock = acquireLock(options?.allowedSelector);\n onCleanup(unlock);\n });\n}\n"],"mappings":";;AAWA,IAAIA,IAAY,GACZC,GAGEC,oBAAmB,IAAI,IAAY;AAGzC,SAASC,EAAkB,GAAsB;CAC/C,IAAM,EAAE,aAAU,cAAW,iBAAc,iBAAiBC,CAAE;CAC9D,OAAO,6BAA6B,KAAKC,IAAWC,IAAYC,CAAS;AAC3E;AAMA,SAASC,IAAmC;CAC1C,IAAMC,IAAO,SAAS;CACtB,OAAON,EAAkBM,CAAI,IAAIA,IAAO,SAAS;AACnD;AAEA,SAASC,IAAyC;CAChD,OACE,OAAO,MAAQ,OACf,OAAO,IAAI,YAAa,cACxB,IAAI,SAAS,oBAAoB,QAAQ;AAE7C;AAEA,SAASC,EAAsB,GAAqC;CAClE,IAAI,EAAEC,aAAkB,UAAU,OAAO;CACzC,KAAK,IAAMC,KAAYX,GACrB,IAAIU,EAAO,QAAQC,CAAQ,GAAG,OAAO;CAEvC,OAAO;AACT;AAEA,SAASC,IAA2B;CAClC,IAAML,IAAO,SAAS,iBAChBM,IAAO,SAAS,MAChBC,IAAWR,EAAoB,GAE/BS,IAAW;EACf,qBAAqBR,EAAK,MAAM;EAChC,mBAAmBO,EAAS,MAAM;EAClC,mBAAmBA,EAAS,MAAM;EAClC,kBAAkBD,EAAK,MAAM;EAC7B,WAAWC,EAAS;EACpB,YAAYA,EAAS;CACvB,GAOME,IAAiB,KAAK,IAAI,GAAG,OAAO,aAAaT,EAAK,WAAW,GACjEU,IAAkBT,EAA8B;CACtD,IAAIQ,IAAiB,GAAG;EACtB,IAAIC,GACF,EAAK,MAAM,kBAAkB;OACxB;GACL,IAAMC,IACJ,OAAO,WAAW,iBAAiBL,CAAI,CAAC,CAAC,YAAY,KAAK;GAC5D,EAAK,MAAM,eAAe,GAAGK,IAAUF,EAAe;EACxD;CACF;CAGA,AADA,EAAS,MAAM,YAAY,UAC3B,EAAS,MAAM,YAAY;CAI3B,IAAMG,KAAiB,MAAiB;EACtC,AAAIV,EAAsBW,EAAM,MAAM,KACtCA,EAAM,eAAe;CACvB;CAIA,OAHA,SAAS,iBAAiB,SAASD,GAAe,EAAE,SAAS,GAAM,CAAC,GACpE,SAAS,iBAAiB,aAAaA,GAAe,EAAE,SAAS,GAAM,CAAC,SAE3D;EAUX,AATA,EAAK,MAAM,kBAAkBJ,EAAS,qBACjCE,MACH,EAAK,MAAM,eAAeF,EAAS,mBAErC,EAAS,MAAM,YAAYA,EAAS,mBACpC,EAAS,MAAM,YAAYA,EAAS,mBACpC,SAAS,oBAAoB,SAASI,CAAa,GACnD,SAAS,oBAAoB,aAAaA,CAAa,GACvD,EAAS,YAAYJ,EAAS,WAC9B,EAAS,aAAaA,EAAS;CACjC;AACF;AAEA,SAASM,EAAY,GAAsC;CAGzD,AAFA,KAAa,GACTC,KAAiBtB,EAAiB,IAAIsB,CAAe,GACrDxB,MAAc,MAAG,IAAUc,EAAa;CAE5C,IAAIW,IAAW;CACf,aAAa;EACX,AAAIA,MACJ,IAAW,IACX,KACIzB,MAAc,MAChBC,IAAU,GACV,IAAU,KAAA,GAEVC,EAAiB,MAAM;CAE3B;AACF;AASA,SAAgBwB,EACd,GACA,GACA;CACA,QAAmB;EACjB,IAAI,CAACC,EAAO,GAAG;EACf,IAAMC,IAASL,EAAYM,GAAS,eAAe;EACnD,EAAUD,CAAM;CAClB,CAAC;AACH"}
1
+ {"version":3,"file":"useScrollLock.js","names":["lockCount","release","allowedSelectors","getViewportScroller","html","isOverflowElement","supportsStableScrollbarGutter","isWithinAllowedScroll","target","selector","lockViewport","body","scroller","previous","scrollbarWidth","gutterSupported","padding","preventScroll","event","acquireLock","allowedSelector","released","useScrollLock","locked","unlock","options"],"sources":["../../src/hooks/useScrollLock.ts"],"sourcesContent":["import { createEffect, onCleanup, type Accessor } from \"solid-js\";\nimport { isOverflowElement } from \"~/lib\";\n\nexport interface UseScrollLockOptions {\n /**\n * 允许在锁滚动期间继续滚动的容器选择器(通常是浮层自身)。\n * 未命中该选择器的滚轮/触摸滚动会被拦截;不传则整个页面都锁定滚动。\n */\n allowedSelector?: string;\n}\n\n// 多个浮层/嵌套浮层可能同时持锁,用计数避免其中一个关闭就提前恢复页面滚动。\nlet lockCount = 0;\nlet release: (() => void) | undefined;\n// 各持锁浮层允许滚动的容器选择器。preventScroll 读取的是实时集合,\n// 因此即使某个选择器在锁生效之后才加入,也能立即对它放行。\nconst allowedSelectors = new Set<string>();\n\n/**\n * 页面的滚动容器:html 自己建立了滚动上下文时锁 html,否则锁 body\n * ——把 overflow 写在另一个元素上并不会锁住页面(Base UI 同样的判断)。\n *\n * `isOverflowElement` 复用 positioner 的实现,保证\"锁哪个元素\"与\n * autoUpdate 监听哪些祖先 scroll 的口径完全一致。\n */\nfunction getViewportScroller(): HTMLElement {\n const html = document.documentElement;\n return isOverflowElement(html) ? html : document.body;\n}\n\nfunction supportsStableScrollbarGutter(): boolean {\n return (\n typeof CSS !== \"undefined\" &&\n typeof CSS.supports === \"function\" &&\n CSS.supports(\"scrollbar-gutter\", \"stable\")\n );\n}\n\nfunction isWithinAllowedScroll(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false;\n for (const selector of allowedSelectors) {\n if (target.closest(selector)) return true;\n }\n return false;\n}\n\nfunction lockViewport(): () => void {\n const html = document.documentElement;\n const body = document.body;\n const scroller = getViewportScroller();\n\n const previous = {\n htmlScrollbarGutter: html.style.scrollbarGutter,\n scrollerOverflowX: scroller.style.overflowX,\n scrollerOverflowY: scroller.style.overflowY,\n bodyPaddingRight: body.style.paddingRight,\n scrollTop: scroller.scrollTop,\n scrollLeft: scroller.scrollLeft,\n };\n\n // 抵消滚动条消失带来的横向抖动:能用 scrollbar-gutter 就用它,\n // 否则退化成给 body 补一个滚动条宽度的右内边距。\n // 只有页面自身真的存在占位滚动条时才需要补偿:滚动条长在某个嵌套容器上时,\n // 锁 html/body 并不会移除那条滚动条,再给 html 加 gutter 只会额外多出一条空白\n // (滚动条 + gutter 双倍宽度),反而破坏布局。\n const scrollbarWidth = Math.max(0, window.innerWidth - html.clientWidth);\n const gutterSupported = supportsStableScrollbarGutter();\n if (scrollbarWidth > 0) {\n if (gutterSupported) {\n html.style.scrollbarGutter = \"stable\";\n } else {\n const padding =\n Number.parseFloat(getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${padding + scrollbarWidth}px`;\n }\n }\n\n scroller.style.overflowX = \"hidden\";\n scroller.style.overflowY = \"hidden\";\n\n // 兜底:部分浏览器即使 overflow:hidden 仍能被滚轮/触摸滚动,\n // 因此直接拦截浮层之外的滚动事件;浮层内部(命中 allowedSelector)保留滚动能力。\n const preventScroll = (event: Event) => {\n if (isWithinAllowedScroll(event.target)) return;\n event.preventDefault();\n };\n document.addEventListener(\"wheel\", preventScroll, { passive: false });\n document.addEventListener(\"touchmove\", preventScroll, { passive: false });\n\n return () => {\n html.style.scrollbarGutter = previous.htmlScrollbarGutter;\n if (!gutterSupported) {\n body.style.paddingRight = previous.bodyPaddingRight;\n }\n scroller.style.overflowX = previous.scrollerOverflowX;\n scroller.style.overflowY = previous.scrollerOverflowY;\n document.removeEventListener(\"wheel\", preventScroll);\n document.removeEventListener(\"touchmove\", preventScroll);\n scroller.scrollTop = previous.scrollTop;\n scroller.scrollLeft = previous.scrollLeft;\n };\n}\n\nfunction acquireLock(allowedSelector?: string): () => void {\n lockCount += 1;\n if (allowedSelector) allowedSelectors.add(allowedSelector);\n if (lockCount === 1) release = lockViewport();\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n lockCount -= 1;\n if (lockCount === 0) {\n release?.();\n release = undefined;\n // 全部释放后清空放行名单,避免残留的选择器影响下一次锁。\n allowedSelectors.clear();\n }\n };\n}\n\n/**\n * 浮层打开时锁定页面滚动,关闭后恢复——对齐 Base UI 的 modal 行为\n * (文档滚动被锁定、浮层之外的滚轮/触摸滚动被拦截),避免浮窗锚点随页面滚动而\"飘移\"。\n *\n * 多个浮层可同时持锁(引用计数);`allowedSelector` 命中的容器内仍可滚动,\n * 通常传入浮层自身,例如 Popover 传 `[data-slot=\"popover-content\"]`。\n */\nexport function useScrollLock(\n locked: Accessor<boolean>,\n options?: UseScrollLockOptions,\n) {\n createEffect(() => {\n if (!locked()) return;\n const unlock = acquireLock(options?.allowedSelector);\n onCleanup(unlock);\n });\n}\n"],"mappings":";;;AAYA,IAAIA,IAAY,GACZC,GAGEC,oBAAmB,IAAI,IAAY;AASzC,SAASC,IAAmC;CAC1C,IAAMC,IAAO,SAAS;CACtB,OAAOC,EAAkBD,CAAI,IAAIA,IAAO,SAAS;AACnD;AAEA,SAASE,IAAyC;CAChD,OACE,OAAO,MAAQ,OACf,OAAO,IAAI,YAAa,cACxB,IAAI,SAAS,oBAAoB,QAAQ;AAE7C;AAEA,SAASC,EAAsB,GAAqC;CAClE,IAAI,EAAEC,aAAkB,UAAU,OAAO;CACzC,KAAK,IAAMC,KAAYP,GACrB,IAAIM,EAAO,QAAQC,CAAQ,GAAG,OAAO;CAEvC,OAAO;AACT;AAEA,SAASC,IAA2B;CAClC,IAAMN,IAAO,SAAS,iBAChBO,IAAO,SAAS,MAChBC,IAAWT,EAAoB,GAE/BU,IAAW;EACf,qBAAqBT,EAAK,MAAM;EAChC,mBAAmBQ,EAAS,MAAM;EAClC,mBAAmBA,EAAS,MAAM;EAClC,kBAAkBD,EAAK,MAAM;EAC7B,WAAWC,EAAS;EACpB,YAAYA,EAAS;CACvB,GAOME,IAAiB,KAAK,IAAI,GAAG,OAAO,aAAaV,EAAK,WAAW,GACjEW,IAAkBT,EAA8B;CACtD,IAAIQ,IAAiB,GAAG;EACtB,IAAIC,GACF,EAAK,MAAM,kBAAkB;OACxB;GACL,IAAMC,IACJ,OAAO,WAAW,iBAAiBL,CAAI,CAAC,CAAC,YAAY,KAAK;GAC5D,EAAK,MAAM,eAAe,GAAGK,IAAUF,EAAe;EACxD;CACF;CAGA,AADA,EAAS,MAAM,YAAY,UAC3B,EAAS,MAAM,YAAY;CAI3B,IAAMG,KAAiB,MAAiB;EACtC,AAAIV,EAAsBW,EAAM,MAAM,KACtCA,EAAM,eAAe;CACvB;CAIA,OAHA,SAAS,iBAAiB,SAASD,GAAe,EAAE,SAAS,GAAM,CAAC,GACpE,SAAS,iBAAiB,aAAaA,GAAe,EAAE,SAAS,GAAM,CAAC,SAE3D;EAUX,AATA,EAAK,MAAM,kBAAkBJ,EAAS,qBACjCE,MACH,EAAK,MAAM,eAAeF,EAAS,mBAErC,EAAS,MAAM,YAAYA,EAAS,mBACpC,EAAS,MAAM,YAAYA,EAAS,mBACpC,SAAS,oBAAoB,SAASI,CAAa,GACnD,SAAS,oBAAoB,aAAaA,CAAa,GACvD,EAAS,YAAYJ,EAAS,WAC9B,EAAS,aAAaA,EAAS;CACjC;AACF;AAEA,SAASM,EAAY,GAAsC;CAGzD,AAFA,KAAa,GACTC,KAAiBlB,EAAiB,IAAIkB,CAAe,GACrDpB,MAAc,MAAG,IAAUU,EAAa;CAE5C,IAAIW,IAAW;CACf,aAAa;EACX,AAAIA,MACJ,IAAW,IACX,KACIrB,MAAc,MAChBC,IAAU,GACV,IAAU,KAAA,GAEVC,EAAiB,MAAM;CAE3B;AACF;AASA,SAAgBoB,EACd,GACA,GACA;CACA,QAAmB;EACjB,IAAI,CAACC,EAAO,GAAG;EACf,IAAMC,IAASL,EAAYM,GAAS,eAAe;EACnD,EAAUD,CAAM;CAClB,CAAC;AACH"}