@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 +1 @@
1
- {"version":3,"file":"Image.utils.js","names":["handleLoading","src","img","placeholder","setBlurComplete","onLoad","event","onLoadingComplete","INVALID_BACKGROUND_SIZE_VALUES","getImgProps","merged","mergeProps","imgConf","props","local","others","splitProps","config","c","imageConfigDefault","allSizes","a","b","deviceSizes","qualities","defaultLoader","style","sizes","fill","loader","layoutToStyle","layoutToSizes","layoutStyle","layoutSizes","staticSrc","blurDataURL","widthInt","getInt","heightInt","blurWidth","blurHeight","isStaticImport","staticImageData","isStaticRequire","ratio","unoptimized","isLazy","qualityInt","imgStyle","showAltText","backgroundImage","blurComplete","getImageBlurSvg","backgroundSize","placeholderStyle","imgAttributes","generateImgAttrs","loadingFinal","params","width","quality","x","isStaticImageData","svgWidth","svgHeight","viewBox","objectFit","getWidths","last","widths","kind","w","i","viewportWidthRe","percentSizes","match","smallestRatio","s","p"],"sources":["../../../src/components/image/Image.utils.ts"],"sourcesContent":["/**\n * handle-loading.ts\n * 单一职责:封装图片加载完成后的所有副作用——decode、回调触发、开发环境警告。\n * 纯 TypeScript,不包含任何 JSX 或组件代码。\n */\n\nimport { mergeProps, splitProps } from \"solid-js\";\nimport { warnOnce } from \"~/utils\";\nimport { imageConfigDefault } from \"./Image.config\";\nimport type {\n ImageConfig,\n ImageConfigComplete,\n ImageLoaderProps,\n ImageLoaderWithConfig,\n ImageProps,\n ImgProps,\n ImgPropsResult,\n LoadingValue,\n OnLoad,\n OnLoadingComplete,\n PlaceholderStyle,\n PlaceholderValue,\n StaticImageData,\n StaticImport,\n StaticRequire,\n} from \"./Image.types\";\n\n// ─── 类型补充 ─────────────────────────────────────────────────────────────────\n\n/** 用于追踪每个 img 节点已处理的 src,避免重复触发 */\ntype ImgWithDataProp = HTMLImageElement & { \"data-loaded-src\"?: string };\n\n// ─── 主函数 ───────────────────────────────────────────────────────────────────\n\n/**\n * 在图片加载/hydrate 后调用。\n * - 使用 img.decode() 确保像素已解码再触发回调\n * - 清除 blur placeholder\n * - 开发环境下输出 fill / sizes 相关警告\n */\nexport function handleLoading(\n img: ImgWithDataProp,\n placeholder: PlaceholderValue,\n onLoad: OnLoad | undefined,\n onLoadingComplete: OnLoadingComplete | undefined,\n setBlurComplete: (v: boolean) => void,\n unoptimized: boolean,\n sizesInput: string | undefined,\n): void {\n const src = img?.src;\n // 同一张图只处理一次\n if (!img || img[\"data-loaded-src\"] === src) return;\n img[\"data-loaded-src\"] = src;\n\n const p: Promise<void> = \"decode\" in img ? img.decode() : Promise.resolve();\n\n p.catch(() => {}).then(() => {\n // 若组件已卸载则提前退出\n if (!img.parentElement || !img.isConnected) return;\n\n if (placeholder !== \"empty\") {\n setBlurComplete(true);\n }\n\n if (onLoad) {\n const event = new Event(\"load\");\n Object.defineProperty(event, \"target\", { writable: false, value: img });\n onLoad(\n event as Event & { currentTarget: HTMLImageElement; target: Element },\n );\n }\n\n if (onLoadingComplete) {\n onLoadingComplete(img);\n }\n\n if (import.meta.env.DEV) {\n warnFillUsage(img, unoptimized, sizesInput);\n warnAspectRatioMismatch(img);\n }\n });\n}\n\n// ─── 开发警告辅助 ──────────────────────────────────────────────────────────────\n\nfunction warnFillUsage(\n img: HTMLImageElement,\n unoptimized: boolean,\n sizesInput: string | undefined,\n): void {\n if (img.getAttribute(\"data-nimg\") !== \"fill\") return;\n\n const origSrc =\n new URL(img.src, \"http://n\").searchParams.get(\"url\") || img.src;\n\n if (!unoptimized) {\n const widthViewportRatio =\n img.getBoundingClientRect().width / window.innerWidth;\n if (widthViewportRatio < 0.6) {\n if (sizesInput === \"100vw\") {\n console.warn(\n `[Image] src=\"${origSrc}\" 设置了 fill 和 sizes=\"100vw\",但实际渲染宽度不足视口宽度,请调整 sizes 以提升性能。`,\n );\n } else if (!sizesInput) {\n console.warn(\n `[Image] src=\"${origSrc}\" 设置了 fill 但缺少 sizes 属性,请添加以提升性能。`,\n );\n }\n }\n }\n\n if (img.parentElement) {\n const { position } = window.getComputedStyle(img.parentElement);\n const valid = [\"absolute\", \"fixed\", \"relative\"];\n if (!valid.includes(position)) {\n console.warn(\n `[Image] src=\"${origSrc}\" 设置了 fill,但父元素 position=\"${position}\",应为 ${valid.join(\" | \")} 之一。`,\n );\n }\n }\n\n if (img.height === 0) {\n console.warn(\n `[Image] src=\"${origSrc}\" 设置了 fill 且高度为 0,请为父元素设置明确高度。`,\n );\n }\n}\n\nfunction warnAspectRatioMismatch(img: HTMLImageElement): void {\n const heightModified = img.height.toString() !== img.getAttribute(\"height\");\n const widthModified = img.width.toString() !== img.getAttribute(\"width\");\n if (\n (heightModified && !widthModified) ||\n (!heightModified && widthModified)\n ) {\n const origSrc =\n new URL(img.src, \"http://n\").searchParams.get(\"url\") || img.src;\n console.warn(\n `[Image] src=\"${origSrc}\" 仅修改了 width 或 height 其中之一,请同时添加 width: \"auto\" 或 height: \"auto\" 样式以保持宽高比。`,\n );\n }\n}\n\ninterface GetImgPropsOptions {\n imgConf: ImageConfigComplete;\n blurComplete: boolean;\n showAltText: boolean;\n}\n\nexport const VALID_LOADING_VALUES = [\"lazy\", \"eager\", undefined] as const;\n// Object-fit values that are not valid background-size values\nconst INVALID_BACKGROUND_SIZE_VALUES = [\n \"-moz-initial\",\n \"fill\",\n \"none\",\n \"scale-down\",\n undefined,\n];\n\nlet perfObserver: PerformanceObserver | undefined;\nconst allImgs = new Map<\n string,\n { src: string; loading: LoadingValue; placeholder: PlaceholderValue }\n>();\n\nexport function getImgProps(\n props: ImageProps,\n { imgConf, blurComplete, showAltText }: GetImgPropsOptions,\n): ImgPropsResult {\n const merged = mergeProps(\n {\n // loader: defaultLoader,\n fill: false,\n priority: false,\n preload: false,\n placeholder: \"empty\",\n unoptimized: imgConf.unoptimized,\n decoding: \"async\",\n } as const,\n props,\n );\n const [local, others] = splitProps(merged, [\n \"src\",\n \"loader\",\n \"quality\",\n \"width\",\n \"height\",\n \"fill\",\n \"sizes\",\n \"priority\",\n \"placeholder\",\n \"blurDataURL\",\n \"unoptimized\",\n \"overrideSrc\",\n \"onLoad\",\n \"onLoadingComplete\",\n \"layout\",\n \"style\",\n \"preload\",\n \"loading\",\n \"objectFit\",\n \"objectPosition\",\n \"lazyBoundary\",\n \"lazyRoot\",\n \"fetchpriority\",\n \"class\",\n \"decoding\",\n ]);\n\n let config: ImageConfig;\n const c = imgConf || imageConfigDefault;\n\n if (\"allSizes\" in c) {\n config = c as ImageConfig;\n } else {\n const allSizes = [...c.deviceSizes, ...c.imageSizes].sort((a, b) => a - b);\n const deviceSizes = c.deviceSizes.sort((a, b) => a - b);\n const qualities = c.qualities?.sort((a, b) => a - b);\n config = { ...c, allSizes, deviceSizes, qualities };\n }\n\n if (typeof defaultLoader === \"undefined\") {\n throw new Error(\n \"images.loaderFile detected but the file is missing default export.\\nRead more: https://nextjs.org/docs/messages/invalid-images-config\",\n );\n }\n\n let style = local.style;\n let sizes = local.sizes;\n let fill = local.fill;\n\n const loader: ImageLoaderWithConfig = local.loader || defaultLoader;\n\n if (local.layout) {\n if (local.layout === \"fill\") {\n fill = true;\n }\n const layoutToStyle: Record<string, Record<string, string> | undefined> = {\n intrinsic: { maxWidth: \"100%\", height: \"auto\" },\n responsive: { width: \"100%\", height: \"auto\" },\n };\n const layoutToSizes: Record<string, string | undefined> = {\n responsive: \"100vw\",\n fill: \"100vw\",\n };\n const layoutStyle = layoutToStyle[local.layout];\n if (layoutStyle) {\n style = { ...style, ...layoutStyle };\n }\n const layoutSizes = layoutToSizes[local.layout];\n if (layoutSizes && !sizes) {\n sizes = layoutSizes;\n }\n }\n\n let staticSrc = \"\";\n let blurDataURL = local.blurDataURL;\n let widthInt = getInt(local.width);\n let heightInt = getInt(local.height);\n let blurWidth: number | undefined;\n let blurHeight: number | undefined;\n\n if (isStaticImport(local.src)) {\n const staticImageData = isStaticRequire(local.src)\n ? local.src.default\n : local.src;\n\n if (!staticImageData.src) {\n throw new Error(\n `An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(\n staticImageData,\n )}`,\n );\n }\n if (!staticImageData.height || !staticImageData.width) {\n throw new Error(\n `An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(\n staticImageData,\n )}`,\n );\n }\n\n blurWidth = staticImageData.blurWidth;\n blurHeight = staticImageData.blurHeight;\n blurDataURL = blurDataURL || staticImageData.blurDataURL;\n staticSrc = staticImageData.src;\n\n if (!fill) {\n if (!widthInt && !heightInt) {\n widthInt = staticImageData.width;\n heightInt = staticImageData.height;\n } else if (widthInt && !heightInt) {\n const ratio = widthInt / staticImageData.width;\n heightInt = Math.round(staticImageData.height * ratio);\n } else if (!widthInt && heightInt) {\n const ratio = heightInt / staticImageData.height;\n widthInt = Math.round(staticImageData.width * ratio);\n }\n }\n }\n const src = typeof local.src === \"string\" ? local.src : staticSrc;\n\n let unoptimized = local.unoptimized;\n let isLazy =\n !local.priority &&\n !local.preload &&\n (local.loading === \"lazy\" || typeof local.loading === \"undefined\");\n if (!src || src.startsWith(\"data:\") || src.startsWith(\"blob:\")) {\n // https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n unoptimized = true;\n isLazy = false;\n }\n if (config.unoptimized) {\n unoptimized = true;\n }\n if (!config.dangerouslyAllowSVG && src.split(\"?\", 1)[0].endsWith(\".svg\")) {\n // Special case to make svg serve as-is to avoid proxying\n // through the built-in Image Optimization API.\n unoptimized = true;\n }\n\n const qualityInt = getInt(local.quality);\n\n if (!import.meta.env.PROD) {\n if (config.output === \"export\" && !unoptimized) {\n throw new Error(\n `Image Optimization using the default loader is not compatible with \\`{ output: 'export' }\\`.\n Possible solutions:\n - Remove \\`{ output: 'export' }\\` and run \"next start\" to run server mode including the Image Optimization API.\n - Configure \\`{ images: { unoptimized: true } }\\` in \\`next.config.js\\` to disable the Image Optimization API.\n Read more: https://nextjs.org/docs/messages/export-image-api`,\n );\n }\n if (!src) {\n // React doesn't show the stack trace and there's\n // no `src` to help identify which image, so we\n // instead console.error(ref) during mount.\n unoptimized = true;\n } else {\n if (fill) {\n if (local.width) {\n throw new Error(\n `Image with src \"${src}\" has both \"width\" and \"fill\" properties. Only one should be used.`,\n );\n }\n if (local.height) {\n throw new Error(\n `Image with src \"${src}\" has both \"height\" and \"fill\" properties. Only one should be used.`,\n );\n }\n if (style?.position && style.position !== \"absolute\") {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.position\" properties. Images with \"fill\" always use position absolute - it cannot be modified.`,\n );\n }\n if (style?.width && style.width !== \"100%\") {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.width\" properties. Images with \"fill\" always use width 100% - it cannot be modified.`,\n );\n }\n if (style?.height && style.height !== \"100%\") {\n throw new Error(\n `Image with src \"${src}\" has both \"fill\" and \"style.height\" properties. Images with \"fill\" always use height 100% - it cannot be modified.`,\n );\n }\n } else {\n if (typeof widthInt === \"undefined\") {\n throw new Error(\n `Image with src \"${src}\" is missing required \"width\" property.`,\n );\n } else if (Number.isNaN(widthInt)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"width\" property. Expected a numeric value in pixels but received \"${local.width}\".`,\n );\n }\n if (typeof heightInt === \"undefined\") {\n throw new Error(\n `Image with src \"${src}\" is missing required \"height\" property.`,\n );\n } else if (Number.isNaN(heightInt)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"height\" property. Expected a numeric value in pixels but received \"${local.height}\".`,\n );\n }\n\n // biome-ignore lint/suspicious/noControlCharactersInRegex: no-control-regex\n if (/^[\\x00-\\x20]/.test(src)) {\n throw new Error(\n `Image with src \"${src}\" cannot start with a space or control character. Use src.trimStart() to remove it or encodeURIComponent(src) to keep it.`,\n );\n }\n // biome-ignore lint/suspicious/noControlCharactersInRegex: no-control-regex\n if (/[\\x00-\\x20]$/.test(src)) {\n throw new Error(\n `Image with src \"${src}\" cannot end with a space or control character. Use src.trimEnd() to remove it or encodeURIComponent(src) to keep it.`,\n );\n }\n }\n }\n if (!VALID_LOADING_VALUES.includes(local.loading)) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"loading\" property. Provided \"${local.loading}\" should be one of ${VALID_LOADING_VALUES.map(\n String,\n ).join(\",\")}.`,\n );\n }\n if (local.priority && local.loading === \"lazy\") {\n throw new Error(\n `Image with src \"${src}\" has both \"priority\" and \"loading='lazy'\" properties. Only one should be used.`,\n );\n }\n if (local.preload && local.loading === \"lazy\") {\n throw new Error(\n `Image with src \"${src}\" has both \"preload\" and \"loading='lazy'\" properties. Only one should be used.`,\n );\n }\n if (local.preload && local.priority) {\n throw new Error(\n `Image with src \"${src}\" has both \"preload\" and \"priority\" properties. Only \"preload\" should be used.`,\n );\n }\n if (\n local.placeholder !== \"empty\" &&\n local.placeholder !== \"blur\" &&\n !local.placeholder.startsWith(\"data:image/\")\n ) {\n throw new Error(\n `Image with src \"${src}\" has invalid \"placeholder\" property \"${local.placeholder}\".`,\n );\n }\n if (local.placeholder !== \"empty\") {\n if (widthInt && heightInt && widthInt * heightInt < 1600) {\n warnOnce(\n `Image with src \"${src}\" is smaller than 40x40. Consider removing the \"placeholder\" property to improve performance.`,\n );\n }\n }\n if (\n qualityInt &&\n config.qualities &&\n !config.qualities.includes(qualityInt)\n ) {\n warnOnce(\n `Image with src \"${src}\" is using quality \"${qualityInt}\" which is not configured in images.qualities [${config.qualities.join(\", \")}]. Please update your config to [${[...config.qualities, qualityInt].sort().join(\", \")}].` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-qualities`,\n );\n }\n if (local.placeholder === \"blur\" && !blurDataURL) {\n const VALID_BLUR_EXT = [\"jpeg\", \"png\", \"webp\", \"avif\"]; // should match next-image-loader\n\n throw new Error(\n `Image with src \"${src}\" has \"placeholder='blur'\" property but is missing the \"blurDataURL\" property.\n Possible solutions:\n - Add a \"blurDataURL\" property, the contents should be a small Data URL to represent the image\n - Change the \"src\" property to a static import with one of the supported file types: ${VALID_BLUR_EXT.join(\n \",\",\n )} (animated images not supported)\n - Remove the \"placeholder\" property, effectively no blur effect\n Read more: https://nextjs.org/docs/messages/placeholder-blur-data-url`,\n );\n }\n if (\"ref\" in others) {\n warnOnce(\n `Image with src \"${src}\" is using unsupported \"ref\" property. Consider using the \"onLoad\" property instead.`,\n );\n }\n\n if (!unoptimized) {\n const urlStr = loader({\n config,\n src,\n width: widthInt || 400,\n quality: qualityInt || 75,\n });\n let url: URL | undefined;\n try {\n url = new URL(urlStr);\n } catch (err) {\n console.error(err);\n }\n if (urlStr === src || (url && url.pathname === src && !url.search)) {\n warnOnce(\n `Image with src \"${src}\" has a \"loader\" property that does not implement width. Please implement it or use the \"unoptimized\" property instead.` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader-width`,\n );\n }\n }\n\n if (local.onLoadingComplete) {\n warnOnce(\n `Image with src \"${src}\" is using deprecated \"onLoadingComplete\" property. Please use the \"onLoad\" property instead.`,\n );\n }\n\n for (const [legacyKey, legacyValue] of Object.entries({\n layout: local.layout,\n objectFit: local.objectFit,\n objectPosition: local.objectPosition,\n lazyBoundary: local.lazyBoundary,\n lazyRoot: local.lazyRoot,\n })) {\n if (legacyValue) {\n warnOnce(\n `Image with src \"${src}\" has legacy prop \"${legacyKey}\". Did you forget to run the codemod?` +\n `\\nRead more: https://nextjs.org/docs/messages/next-image-upgrade-to-13`,\n );\n }\n }\n\n if (\n typeof window !== \"undefined\" &&\n !perfObserver &&\n window.PerformanceObserver\n ) {\n perfObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries()) {\n // @ts-expect-error - missing \"LargestContentfulPaint\" class with \"element\" prop\n const imgSrc = entry?.element?.src || \"\";\n const lcpImage = allImgs.get(imgSrc);\n if (\n lcpImage &&\n lcpImage.loading === \"lazy\" &&\n lcpImage.placeholder === \"empty\" &&\n !lcpImage.src.startsWith(\"data:\") &&\n !lcpImage.src.startsWith(\"blob:\")\n ) {\n // https://web.dev/lcp/#measure-lcp-in-javascript\n warnOnce(\n `Image with src \"${lcpImage.src}\" was detected as the Largest Contentful Paint (LCP). Please add the \\`loading=\"eager\"\\` property if this image is above the fold.` +\n `\\nRead more: https://nextjs.org/docs/app/api-reference/components/image#loading`,\n );\n }\n }\n });\n try {\n perfObserver.observe({\n type: \"largest-contentful-paint\",\n buffered: true,\n });\n } catch (err) {\n // Log error but don't crash the app\n console.error(err);\n }\n }\n }\n\n const imgStyle = Object.assign(\n fill\n ? {\n position: \"absolute\",\n height: \"100%\",\n width: \"100%\",\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n objectFit: local.objectFit,\n objectPosition: local.objectPosition,\n }\n : {},\n showAltText ? {} : { color: \"transparent\" },\n style,\n );\n\n const backgroundImage =\n !blurComplete && local.placeholder !== \"empty\"\n ? local.placeholder === \"blur\"\n ? `url(\"data:image/svg+xml;charset=utf-8,${getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth,\n blurHeight,\n blurDataURL: blurDataURL || \"\", // assume not undefined\n objectFit: imgStyle.objectFit,\n })}\")`\n : `url(\"${local.placeholder}\")` // assume `data:image/`\n : null;\n\n const backgroundSize = !INVALID_BACKGROUND_SIZE_VALUES.includes(\n imgStyle.objectFit,\n )\n ? imgStyle.objectFit\n : imgStyle.objectFit === \"fill\"\n ? \"100% 100%\" // the background-size equivalent of `fill`\n : \"cover\";\n\n const placeholderStyle: PlaceholderStyle = backgroundImage\n ? {\n \"background-size\": backgroundSize,\n \"background-position\": imgStyle.objectPosition || \"50% 50%\",\n \"background-repeat\": \"no-repeat\",\n \"background-image\": backgroundImage,\n }\n : {};\n\n if (import.meta.env.DEV) {\n if (\n placeholderStyle[\"background-image\"] &&\n local.placeholder === \"blur\" &&\n blurDataURL?.startsWith(\"/\")\n ) {\n // During `next dev`, we don't want to generate blur placeholders with webpack\n // because it can delay starting the dev server. Instead, `next-image-loader.js`\n // will inline a special url to lazily generate the blur placeholder at request time.\n placeholderStyle[\"background-image\"] = `url(\"${blurDataURL}\")`;\n }\n }\n\n const imgAttributes = generateImgAttrs({\n config,\n src,\n unoptimized,\n width: widthInt,\n quality: qualityInt,\n sizes,\n loader,\n });\n\n const loadingFinal = isLazy ? \"lazy\" : local.loading;\n\n if (!import.meta.env.PROD) {\n if (typeof window !== \"undefined\") {\n let fullUrl: URL;\n try {\n fullUrl = new URL(imgAttributes.src);\n } catch (e) {\n console.error(e);\n fullUrl = new URL(imgAttributes.src, window.location.href);\n }\n allImgs.set(fullUrl.href, {\n src,\n loading: loadingFinal,\n placeholder: local.placeholder,\n });\n }\n }\n\n const newProps: ImgProps = {\n ...others,\n loading: loadingFinal,\n fetchpriority: local.fetchpriority,\n width: widthInt,\n height: heightInt,\n decoding: local.decoding,\n class: local.class,\n style: { ...imgStyle, ...placeholderStyle },\n sizes: imgAttributes.sizes,\n srcSet: imgAttributes.srcSet,\n src: local.overrideSrc || imgAttributes.src,\n };\n const meta = {\n unoptimized,\n preload: local.preload || local.priority,\n placeholder: local.placeholder,\n fill,\n };\n return { props: newProps, meta };\n}\n\nfunction defaultLoader({ src, width, quality }: ImageLoaderProps): string {\n if (import.meta.env.DEV) {\n const missingValues: string[] = [];\n if (!src) missingValues.push(\"src\");\n if (!width) missingValues.push(\"width\");\n if (missingValues.length > 0) {\n throw new Error(\n `[defaultLoader] 缺少必要属性:${missingValues.join(\", \")}。` +\n `请确认调用方式正确,或提供自定义 loader。`,\n );\n }\n }\n\n // 如果 src 本身已是带参数的 URL(外部图片),直接返回\n if (src.startsWith(\"http://\") || src.startsWith(\"https://\")) {\n return src;\n }\n\n // 本地图片:追加 w / q 参数(供自定义服务器处理)\n const params = new URLSearchParams();\n params.set(\"url\", src);\n params.set(\"w\", String(width));\n if (quality) params.set(\"q\", String(quality));\n return `/_image?${params.toString()}`;\n}\n\nfunction getInt(x: unknown): number | undefined {\n if (typeof x === \"undefined\") {\n return x;\n }\n if (typeof x === \"number\") {\n return Number.isFinite(x) ? x : NaN;\n }\n if (typeof x === \"string\" && /^[0-9]+$/.test(x)) {\n return parseInt(x, 10);\n }\n return NaN;\n}\n\nfunction isStaticRequire(\n src: StaticRequire | StaticImageData,\n): src is StaticRequire {\n return (src as StaticRequire).default !== undefined;\n}\n\nfunction isStaticImageData(\n src: StaticRequire | StaticImageData,\n): src is StaticImageData {\n return (src as StaticImageData).src !== undefined;\n}\n\nfunction isStaticImport(src: string | StaticImport): src is StaticImport {\n return (\n !!src &&\n typeof src === \"object\" &&\n (isStaticRequire(src as StaticImport) ||\n isStaticImageData(src as StaticImport))\n );\n}\n\nfunction getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth,\n blurHeight,\n blurDataURL,\n objectFit,\n}: {\n widthInt?: number;\n heightInt?: number;\n blurWidth?: number;\n blurHeight?: number;\n blurDataURL: string;\n objectFit?: string;\n}): string {\n const std = 20;\n const svgWidth = blurWidth ? blurWidth * 40 : widthInt;\n const svgHeight = blurHeight ? blurHeight * 40 : heightInt;\n\n const viewBox =\n svgWidth && svgHeight ? `viewBox='0 0 ${svgWidth} ${svgHeight}'` : \"\";\n const preserveAspectRatio = viewBox\n ? \"none\"\n : objectFit === \"contain\"\n ? \"xMidYMid\"\n : objectFit === \"cover\"\n ? \"xMidYMid slice\"\n : \"none\";\n\n return `%3Csvg xmlns='http://www.w3.org/2000/svg' ${viewBox}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${preserveAspectRatio}' style='filter: url(%23b);' href='${blurDataURL}'/%3E%3C/svg%3E`;\n}\n\ntype GenImgAttrsData = {\n config: ImageConfig;\n src: string;\n unoptimized: boolean;\n loader: ImageLoaderWithConfig;\n width?: number;\n quality?: number;\n sizes?: string;\n};\n\ntype GenImgAttrsResult = {\n src: string;\n srcSet: string | undefined;\n sizes: string | undefined;\n};\n\nfunction generateImgAttrs({\n config,\n src,\n unoptimized,\n width,\n quality,\n sizes,\n loader,\n}: GenImgAttrsData): GenImgAttrsResult {\n if (unoptimized) {\n return { src, srcSet: undefined, sizes: undefined };\n }\n\n const { widths, kind } = getWidths(config, width, sizes);\n const last = widths.length - 1;\n\n return {\n sizes: !sizes && kind === \"w\" ? \"100vw\" : sizes,\n srcSet: widths\n .map(\n (w, i) =>\n `${loader({ config, src, quality, width: w })} ${\n kind === \"w\" ? w : i + 1\n }${kind}`,\n )\n .join(\", \"),\n\n // It's intended to keep `src` the last attribute because React updates\n // attributes in order. If we keep `src` the first one, Safari will\n // immediately start to fetch `src`, before `sizes` and `srcSet` are even\n // updated by React. That causes multiple unnecessary requests if `srcSet`\n // and `sizes` are defined.\n // This bug cannot be reproduced in Chrome or Firefox.\n src: loader({ config, src, quality, width: widths[last] }),\n };\n}\n\nfunction getWidths(\n { deviceSizes, allSizes }: ImageConfig,\n width: number | undefined,\n sizes: string | undefined,\n): { widths: number[]; kind: \"w\" | \"x\" } {\n if (sizes) {\n // Find all the \"vw\" percent sizes used in the sizes prop\n const viewportWidthRe = /(^|\\s)(1?\\d?\\d)vw/g;\n const percentSizes = [];\n for (\n let match: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: nextjs code\n (match = viewportWidthRe.exec(sizes));\n match\n ) {\n percentSizes.push(Number.parseInt(match[2], 10));\n }\n if (percentSizes.length) {\n const smallestRatio = Math.min(...percentSizes) * 0.01;\n return {\n widths: allSizes.filter((s) => s >= deviceSizes[0] * smallestRatio),\n kind: \"w\",\n };\n }\n return { widths: allSizes, kind: \"w\" };\n }\n if (typeof width !== \"number\") {\n return { widths: deviceSizes, kind: \"w\" };\n }\n\n const widths = [\n ...new Set(\n // > This means that most OLED screens that say they are 3x resolution,\n // > are actually 3x in the green color, but only 1.5x in the red and\n // > blue colors. Showing a 3x resolution image in the app vs a 2x\n // > resolution image will be visually the same, though the 3x image\n // > takes significantly more data. Even true 3x resolution screens are\n // > wasteful as the human eye cannot see that level of detail without\n // > something like a magnifying glass.\n // https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html\n [width, width * 2 /*, width * 3*/].map(\n (w) => allSizes.find((p) => p >= w) || allSizes[allSizes.length - 1],\n ),\n ),\n ];\n return { widths, kind: \"x\" };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Image.utils.js","names":["getImgProps","config","normalizeConfig","imgConf","imageConfigDefault","merged","mergeProps","props","local","others","splitProps","loader","defaultLoader","resolveLayout","stat","resolveStaticImport","fill","widthInt","heightInt","blurDataURL","src","qualityInt","getInt","unoptimized","computeUnoptimized","isLazy","computeIsLazy","imgStyle","computeImgStyle","placeholderStyle","computePlaceholderStyle","imgAttributes","generateImgAttrs","buildImgProps","c","a","b","style","sizes","layout","layoutToStyle","layoutToSizes","layoutStyle","layoutSizes","result","isStaticImport","data","isStaticRequire","showAltText","blurComplete","placeholder","objectFit","objectPosition","backgroundImage","getImageBlurSvg","getPlaceholderStyle","loadingFinal","handleLoading"],"sources":["../../../src/components/image/Image.utils.ts"],"sourcesContent":["/**\n * `getImgProps`:把 `<Image>` 的 props 解析成原生 `<img>` 可用的属性集。\n *\n * 单一职责:**编排**各专项模块的结果——\n * - 静态导入识别 / 数值解析 → `./lib/static-import`\n * - URL 与 srcSet 生成 → `./lib/loader`\n * - blur 占位样式 → `./lib/blur`\n * - 开发期校验与警告 → `./lib/dev-checks`\n * - 加载完成后的副作用 → `./lib/handle-loading`\n *\n * 本文件不再自己实现上述任何一项,只负责顺序、默认值与最终 `props` / `meta` 组装。\n */\n\nimport { mergeProps, splitProps } from \"solid-js\";\nimport { imageConfigDefault } from \"./Image.config\";\nimport type {\n ImageConfig,\n ImageConfigComplete,\n ImageLoaderWithConfig,\n ImageProps,\n ImgProps,\n ImgPropsResult,\n PlaceholderStyle,\n StaticImport,\n} from \"./Image.types\";\nimport { getImageBlurSvg, getPlaceholderStyle } from \"./lib/blur\";\nimport {\n runDevChecks,\n trackImageForLcp,\n type ValidLoadingValue,\n} from \"./lib/dev-checks\";\nimport { defaultLoader, generateImgAttrs } from \"./lib/loader\";\nimport { getInt, isStaticRequire, isStaticImport } from \"./lib/static-import\";\n\n// 保持既有导入路径可用:`ImageElement` 从本模块拿 `handleLoading`,\n// `Image.types` 从本模块拿 `VALID_LOADING_VALUES` 的类型。\nexport { handleLoading } from \"./lib/handle-loading\";\nexport { VALID_LOADING_VALUES } from \"./lib/dev-checks\";\n\nexport interface GetImgPropsOptions {\n /** 省略时使用内置默认配置(与 ImageConfigProvider 的默认值一致) */\n imgConf?: ImageConfigComplete;\n blurComplete: boolean;\n showAltText: boolean;\n}\n\n/**\n * 解析 `<Image>` 的 props。\n *\n * 流程:合并默认值 → 规范化 config → 解析静态导入 → 决定 unoptimized/lazy →\n * 开发期校验 → 计算样式与占位 → 生成 `src`/`srcSet` → 组装结果。\n */\nexport function getImgProps(\n props: ImageProps,\n { imgConf, blurComplete, showAltText }: GetImgPropsOptions,\n): ImgPropsResult {\n // 先解析配置:下面合并 props 默认值时要读 config.unoptimized\n const config = normalizeConfig(imgConf ?? imageConfigDefault);\n\n const merged = mergeProps(\n {\n fill: false,\n priority: false,\n preload: false,\n placeholder: \"empty\",\n unoptimized: config.unoptimized,\n decoding: \"async\",\n } as const,\n props,\n );\n\n const [local, others] = splitProps(merged, [\n \"src\",\n \"loader\",\n \"quality\",\n \"width\",\n \"height\",\n \"fill\",\n \"sizes\",\n \"priority\",\n \"placeholder\",\n \"blurDataURL\",\n \"unoptimized\",\n \"overrideSrc\",\n \"onLoad\",\n \"onLoadingComplete\",\n \"layout\",\n \"style\",\n \"preload\",\n \"loading\",\n \"objectFit\",\n \"objectPosition\",\n \"lazyBoundary\",\n \"lazyRoot\",\n \"fetchpriority\",\n \"class\",\n \"decoding\",\n ]);\n\n const loader: ImageLoaderWithConfig = local.loader || defaultLoader;\n const { style, sizes, fill } = resolveLayout(local);\n\n // 静态导入(`import img from \"./x.png\"`)决定 src 与推导出的宽高\n const stat = resolveStaticImport(local, fill);\n const widthInt = stat.widthInt;\n const heightInt = stat.heightInt;\n const blurDataURL = local.blurDataURL || stat.blurDataURL;\n\n const src = typeof local.src === \"string\" ? local.src : stat.src;\n const qualityInt = getInt(local.quality);\n\n // unoptimized / lazy 的推导:data:、blob:、config.unoptimized、.svg 都跳过优化\n let unoptimized = computeUnoptimized(local, config, src);\n const isLazy = computeIsLazy(local, src);\n\n if (!import.meta.env.PROD) {\n unoptimized = runDevChecks({\n src,\n config,\n loader,\n fill,\n widthInt,\n heightInt,\n qualityInt,\n unoptimized,\n style,\n props: {\n width: local.width,\n height: local.height,\n loading: local.loading,\n priority: local.priority,\n preload: local.preload,\n placeholder: local.placeholder,\n blurDataURL,\n },\n otherKeys: Object.keys(others),\n legacyProps: {\n layout: local.layout,\n objectFit: local.objectFit,\n objectPosition: local.objectPosition,\n lazyBoundary: local.lazyBoundary,\n lazyRoot: local.lazyRoot,\n },\n });\n }\n\n const imgStyle = computeImgStyle({ fill, showAltText, style, local });\n const placeholderStyle = computePlaceholderStyle({\n blurComplete,\n placeholder: local.placeholder,\n blurDataURL,\n stat,\n widthInt,\n heightInt,\n imgStyle,\n });\n\n const imgAttributes = generateImgAttrs({\n config,\n src,\n unoptimized,\n width: widthInt,\n quality: qualityInt,\n sizes,\n loader,\n });\n\n const loadingFinal = isLazy ? \"lazy\" : (local.loading as ValidLoadingValue);\n\n if (!import.meta.env.PROD) {\n trackImageForLcp({\n src: imgAttributes.src,\n loading: loadingFinal,\n placeholder: local.placeholder,\n });\n }\n\n return {\n props: buildImgProps({\n others,\n loadingFinal,\n local,\n widthInt,\n heightInt,\n imgStyle,\n placeholderStyle,\n imgAttributes,\n }),\n meta: {\n unoptimized,\n preload: local.preload || local.priority,\n placeholder: local.placeholder,\n fill,\n },\n };\n}\n\n// ─── 私有步骤 ─────────────────────────────────────────────────────────────────\n\n/** 合并 deviceSizes / imageSizes 得到 allSizes,并按升序排列(不改动入参) */\nexport function normalizeConfig(\n c: ImageConfig | ImageConfigComplete,\n): ImageConfig {\n if (\"allSizes\" in c) return c as ImageConfig;\n return {\n ...c,\n allSizes: [...c.deviceSizes, ...c.imageSizes].sort((a, b) => a - b),\n deviceSizes: [...c.deviceSizes].sort((a, b) => a - b),\n qualities: c.qualities ? [...c.qualities].sort((a, b) => a - b) : undefined,\n };\n}\n\ninterface LayoutResult {\n style: ImageProps[\"style\"];\n sizes: string | undefined;\n fill: boolean;\n}\n\n/**\n * 处理遗留的 `layout` prop。它是 next 12 的写法,这里翻译成\n * `fill` / `sizes` / `style` 三者的等价组合。\n */\nfunction resolveLayout(local: {\n layout?: ImageProps[\"layout\"];\n style?: ImageProps[\"style\"];\n sizes?: string;\n /** 调用方(getImgProps)已通过 mergeProps 保证默认值为 false,故此处必填 */\n fill: boolean;\n}): LayoutResult {\n let style = local.style;\n let sizes = local.sizes;\n let fill = local.fill;\n\n const layout = local.layout;\n if (!layout) return { style, sizes, fill };\n if (layout === \"fill\") fill = true;\n\n const layoutToStyle: Record<string, Record<string, string> | undefined> = {\n intrinsic: { maxWidth: \"100%\", height: \"auto\" },\n responsive: { width: \"100%\", height: \"auto\" },\n };\n const layoutToSizes: Record<string, string | undefined> = {\n responsive: \"100vw\",\n fill: \"100vw\",\n };\n\n const layoutStyle = layoutToStyle[layout];\n if (layoutStyle) style = { ...style, ...layoutStyle };\n const layoutSizes = layoutToSizes[layout];\n if (layoutSizes && !sizes) sizes = layoutSizes;\n\n return { style, sizes, fill };\n}\n\ninterface StaticResolution {\n src: string;\n widthInt: number | undefined;\n heightInt: number | undefined;\n blurDataURL: string | undefined;\n blurWidth: number | undefined;\n blurHeight: number | undefined;\n}\n\n/**\n * 解析静态导入:拿到 src、blur 数据,并在调用方未指定宽高时按原图比例推导。\n *\n * 注意:`fill` 下不做推导(宽高由容器决定),否则填充图会被推导出固定尺寸。\n */\nfunction resolveStaticImport(\n local: {\n src: string | StaticImport;\n width?: string | number;\n height?: string | number;\n },\n fill: boolean,\n): StaticResolution {\n const result: StaticResolution = {\n src: \"\",\n widthInt: getInt(local.width),\n heightInt: getInt(local.height),\n blurDataURL: undefined,\n blurWidth: undefined,\n blurHeight: undefined,\n };\n\n if (!isStaticImport(local.src)) return result;\n\n const data = isStaticRequire(local.src) ? local.src.default : local.src;\n\n if (!data.src) {\n throw new Error(\n `An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(\n data,\n )}`,\n );\n }\n if (!data.height || !data.width) {\n throw new Error(\n `An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(\n data,\n )}`,\n );\n }\n\n result.src = data.src;\n result.blurWidth = data.blurWidth;\n result.blurHeight = data.blurHeight;\n result.blurDataURL = data.blurDataURL;\n\n if (!fill) {\n if (!result.widthInt && !result.heightInt) {\n result.widthInt = data.width;\n result.heightInt = data.height;\n } else if (result.widthInt && !result.heightInt) {\n result.heightInt = Math.round(\n data.height * (result.widthInt / data.width),\n );\n } else if (!result.widthInt && result.heightInt) {\n result.widthInt = Math.round(\n data.width * (result.heightInt / data.height),\n );\n }\n }\n\n return result;\n}\n\n/**\n * 判断是否跳过图片优化服务。\n *\n * 三种情况必须跳过:\n * - `data:` / `blob:` URL(无法被服务端处理)\n * - 配置里全局 `unoptimized`\n * - SVG 且未显式允许(走优化服务会被代理,反而出问题)\n */\nfunction computeUnoptimized(\n local: { unoptimized?: boolean },\n config: ImageConfig,\n src: string,\n): boolean {\n if (local.unoptimized) return true;\n if (!src || src.startsWith(\"data:\") || src.startsWith(\"blob:\")) return true;\n if (config.unoptimized) return true;\n if (!config.dangerouslyAllowSVG && src.split(\"?\", 1)[0].endsWith(\".svg\")) {\n return true;\n }\n return false;\n}\n\n/**\n * 是否给 `<img>` 加 `loading=\"lazy\"`。\n * `priority` / `preload` 表示\"首屏关键图\",必须立即加载;\n * `data:` / `blob:` 不占网络请求,也不需要 lazy。\n */\nfunction computeIsLazy(\n local: { priority?: boolean; preload?: boolean; loading?: string },\n src: string,\n): boolean {\n if (local.priority || local.preload) return false;\n if (local.loading === \"eager\") return false;\n if (!src || src.startsWith(\"data:\") || src.startsWith(\"blob:\")) return false;\n return true;\n}\n\n/** 最终内联样式的类型:由 `Object.assign` 合并出来的 CSS 属性集合 */\ntype ImgStyle = NonNullable<ImageProps[\"style\"]>;\n\ninterface ImgStyleOptions {\n fill: boolean;\n showAltText: boolean;\n style: ImageProps[\"style\"];\n local: { objectFit?: string; objectPosition?: string };\n}\n\n/**\n * 组装最终内联样式。\n * - `fill` 时补齐绝对定位与 100% 宽高(`object-fit` / `object-position` 透传)\n * - 不显示 alt 文本时用 `color: transparent` 隐藏浏览器自带的替代文字\n * - 调用方传入的 `style` 最后合并,优先级最高\n */\nfunction computeImgStyle({\n fill,\n showAltText,\n style,\n local,\n}: ImgStyleOptions): ImgStyle {\n return Object.assign(\n fill\n ? {\n position: \"absolute\",\n height: \"100%\",\n width: \"100%\",\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n objectFit: local.objectFit,\n objectPosition: local.objectPosition,\n }\n : {},\n showAltText ? {} : { color: \"transparent\" },\n style,\n ) as ImgStyle;\n}\n\ninterface PlaceholderOptions {\n blurComplete: boolean;\n placeholder: string;\n blurDataURL: string | undefined;\n stat: StaticResolution;\n widthInt: number | undefined;\n heightInt: number | undefined;\n imgStyle: ImgStyle;\n}\n\n/** 计算占位背景图(blur SVG 或自定义 data URL),再交给 `lib/blur` 生成样式 */\nfunction computePlaceholderStyle({\n blurComplete,\n placeholder,\n blurDataURL,\n stat,\n widthInt,\n heightInt,\n imgStyle,\n}: PlaceholderOptions): PlaceholderStyle {\n // 已解码完成或 placeholder=empty 时不显示占位\n if (blurComplete || placeholder === \"empty\") return {};\n\n const objectFit = imgStyle[\"object-fit\"] as string | undefined;\n const objectPosition = imgStyle[\"object-position\"] as string | undefined;\n\n const backgroundImage =\n placeholder === \"blur\"\n ? `url(\"data:image/svg+xml;charset=utf-8,${getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth: stat.blurWidth,\n blurHeight: stat.blurHeight,\n blurDataURL,\n objectFit,\n })}\")`\n : `url(\"${placeholder}\")`; // 形如 data:image/...\n\n return getPlaceholderStyle({\n blurComplete,\n placeholder,\n objectFit,\n objectPosition,\n backgroundImage,\n });\n}\n\ninterface BuildPropsOptions {\n others: Record<string, unknown>;\n loadingFinal: ValidLoadingValue;\n local: {\n fetchpriority?: ImageProps[\"fetchpriority\"];\n decoding?: string;\n class?: string;\n overrideSrc?: string;\n };\n widthInt: number | undefined;\n heightInt: number | undefined;\n imgStyle: ImgStyle;\n placeholderStyle: PlaceholderStyle;\n imgAttributes: {\n src: string;\n srcSet: string | undefined;\n sizes: string | undefined;\n };\n}\n\n/** 组装最终写进 `<img>` 的属性集 */\nfunction buildImgProps({\n others,\n loadingFinal,\n local,\n widthInt,\n heightInt,\n imgStyle,\n placeholderStyle,\n imgAttributes,\n}: BuildPropsOptions): ImgProps {\n return {\n ...others,\n loading: loadingFinal,\n fetchpriority: local.fetchpriority,\n width: widthInt,\n height: heightInt,\n decoding: local.decoding,\n class: local.class,\n style: { ...imgStyle, ...placeholderStyle },\n sizes: imgAttributes.sizes,\n srcSet: imgAttributes.srcSet,\n src: local.overrideSrc || imgAttributes.src,\n } as ImgProps;\n}\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
- import { handleLoading as e } from "./Image.utils.js";
2
- import { mergeProps as t, spread as n, template as r, use as i } from "solid-js/web";
3
- import { mergeProps as a, splitProps as o } from "solid-js";
1
+ import { callEventHandler as e } from "../../utils/call-event-handler.js";
2
+ import { handleLoading as t } from "./lib/handle-loading.js";
3
+ import { mergeProps as n, spread as r, template as i, use as a } from "solid-js/web";
4
+ import { mergeProps as o, splitProps as s } from "solid-js";
4
5
  //#region src/components/image/ImageElement.tsx
5
- var s = /*#__PURE__*/ r("<img>", !0, !1, !1), c = (r) => {
6
- let c = a({ decoding: "async" }, r), [l, u] = o(c, [
6
+ var c = /*#__PURE__*/ i("<img>", !0, !1, !1), l = (i) => {
7
+ let l = o({ decoding: "async" }, i), [u, d] = s(l, [
7
8
  "src",
8
9
  "srcSet",
9
10
  "sizes",
@@ -27,56 +28,59 @@ var s = /*#__PURE__*/ r("<img>", !0, !1, !1), c = (r) => {
27
28
  "ref",
28
29
  "alt"
29
30
  ]);
30
- function d(t) {
31
- t && (l.onError && (t.src = t.src), t.complete && e(t, l.placeholder, l.onLoad, l.onLoadingComplete, l.setBlurComplete, l.unoptimized, l.sizesInput), l.ref?.(t));
31
+ function f(e) {
32
+ e && (u.onError && (e.src = e.src), e.complete && t(e, u.placeholder, u.onLoad, u.onLoadingComplete, u.setBlurComplete, u.unoptimized, u.sizesInput), u.ref?.(e));
32
33
  }
33
34
  return (() => {
34
- var r = s(), a = d;
35
- return typeof a == "function" ? i(a, r) : d = r, n(r, t(u, {
35
+ var i = c(), o = f;
36
+ return typeof o == "function" ? a(o, i) : f = i, r(i, n(d, {
36
37
  get alt() {
37
- return l.alt;
38
+ return u.alt;
38
39
  },
39
40
  get loading() {
40
- return l.loading;
41
+ return u.loading;
41
42
  },
42
43
  get width() {
43
- return l.width;
44
+ return u.width;
44
45
  },
45
46
  get height() {
46
- return l.height;
47
+ return u.height;
47
48
  },
48
49
  get decoding() {
49
- return l.decoding;
50
+ return u.decoding;
50
51
  },
51
52
  get "data-nimg"() {
52
- return l.fill ? "fill" : "1";
53
+ return u.fill ? "fill" : "1";
53
54
  },
54
55
  get class() {
55
- return l.class;
56
+ return u.class;
57
+ },
58
+ get classList() {
59
+ return u.classList;
56
60
  },
57
61
  get style() {
58
- return l.style;
62
+ return u.style;
59
63
  },
60
64
  get sizes() {
61
- return l.sizes;
65
+ return u.sizes;
62
66
  },
63
67
  get srcset() {
64
- return l.srcSet;
68
+ return u.srcSet;
65
69
  },
66
70
  get src() {
67
- return l.src;
71
+ return u.src;
68
72
  },
69
- onLoad: (t) => {
70
- let n = t.currentTarget;
71
- e(n, l.placeholder, l.onLoad, l.onLoadingComplete, l.setBlurComplete, l.unoptimized, l.sizesInput);
73
+ onLoad: (e) => {
74
+ let n = e.currentTarget;
75
+ t(n, u.placeholder, u.onLoad, u.onLoadingComplete, u.setBlurComplete, u.unoptimized, u.sizesInput);
72
76
  },
73
- onError: (e) => {
74
- l.setShowAltText(!0), l.placeholder !== "empty" && l.setBlurComplete(!0), l.onError && typeof l.onError == "function" && l.onError(e);
77
+ onError: (t) => {
78
+ u.setShowAltText(!0), u.placeholder !== "empty" && u.setBlurComplete(!0), e(u.onError, t);
75
79
  }
76
- }), !1, !1), r;
80
+ }), !1, !1), i;
77
81
  })();
78
82
  };
79
83
  //#endregion
80
- export { c as default };
84
+ export { l as default };
81
85
 
82
86
  //# sourceMappingURL=ImageElement.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageElement.js","names":["Component","mergeProps","splitProps","ImgProps","OnLoad","OnLoadingComplete","PlaceholderValue","handleLoading","ImageElementProps","unoptimized","placeholder","setBlurComplete","v","setShowAltText","sizesInput","onLoad","onLoadingComplete","ref","el","HTMLImageElement","ImageElement","rawProps","props","decoding","const","internal","imgAttrs","handleRef","img","onError","src","import","meta","env","PROD","console","error","getAttribute","alt","undefined","complete","_el$","_tmpl$","_ref$","_$use","_$spread","_$mergeProps","loading","width","height","data-nimg","fill","class","style","sizes","srcset","srcSet","e","currentTarget","mergeProps","_$use","_$mergeProps","mergeProps$1","_tmpl$","ImageElement","props","rawProps","internal","imgAttrs","splitProps","handleRef","img","handleLoading","_el$","_ref$","use","spread","mergeProps","\"class\"","\"onLoad\"","e","\"onError\""],"sources":["../../../src/components/image/ImageElement.tsx"],"sourcesContent":["/**\n * ImageElement.tsx\n * 单一职责:仅负责渲染原生 <img> 元素,并将 ref 回调、onLoad、onError 事件桥接到\n * 上层传入的副作用函数。不包含配置解析、preload 或 blur placeholder 逻辑。\n */\n\nimport { type Component, mergeProps, splitProps } from \"solid-js\";\nimport type {\n ImgProps,\n OnLoad,\n OnLoadingComplete,\n PlaceholderValue,\n} from \"./Image.types\";\nimport { handleLoading } from \"./Image.utils\";\n\n// ─── 额外内部 Props ────────────────────────────────────────────────────────────\n\nexport interface ImageElementProps extends ImgProps {\n unoptimized: boolean;\n placeholder: PlaceholderValue;\n /** 上层通过 signal setter 传入,避免在此组件内管理状态 */\n setBlurComplete: (v: boolean) => void;\n setShowAltText: (v: boolean) => void;\n sizesInput: string | undefined;\n onLoad?: OnLoad;\n onLoadingComplete?: OnLoadingComplete;\n // onError?: (e: Event) => void;\n /** 透传给原生 img 的 ref */\n ref?: (el: HTMLImageElement) => void;\n}\n\n// ─── 组件 ─────────────────────────────────────────────────────────────────────\n\nconst ImageElement: Component<ImageElementProps> = (rawProps) => {\n const props = mergeProps({ decoding: \"async\" as const }, rawProps);\n\n // 分离内部 props 与透传给 <img> 的 props\n const [internal, imgAttrs] = splitProps(props, [\n \"src\",\n \"srcSet\",\n \"sizes\",\n \"height\",\n \"width\",\n \"decoding\",\n \"class\",\n \"classList\",\n \"style\",\n \"fetchpriority\",\n \"placeholder\",\n \"loading\",\n \"unoptimized\",\n \"fill\",\n \"setBlurComplete\",\n \"setShowAltText\",\n \"sizesInput\",\n \"onLoad\",\n \"onError\",\n \"onLoadingComplete\",\n \"ref\",\n \"alt\",\n ]);\n\n /**\n * ref 回调:在元素挂载后立即处理\"图片在 hydrate 前已加载完成\"的情况,\n * 并将 ref 透传给调用方(如需要访问 img 节点)。\n */\n function handleRef(img: HTMLImageElement) {\n if (!img) return;\n\n // 让 Safari 重新触发 onerror(如果图片在 hydrate 前就已失败)\n if (internal.onError) {\n // biome-ignore lint/correctness/noSelfAssign: If the image has an error before react hydrates, then the error is lost. The workaround is to wait until the image is mounted which is after hydration, then we set the src again to trigger the error handler (if there was an error).\n img.src = img.src;\n }\n\n if (!import.meta.env.PROD) {\n if (!internal.src) {\n console.error('[Image] 缺少必填属性 \"src\"', img);\n }\n if (img.getAttribute(\"alt\") === null && internal.alt === undefined) {\n console.error('[Image] 缺少必填属性 \"alt\"...');\n }\n }\n\n // 图片在组件挂载前已完成加载(cached 场景)\n if (img.complete) {\n handleLoading(\n img,\n internal.placeholder,\n internal.onLoad,\n internal.onLoadingComplete,\n internal.setBlurComplete,\n internal.unoptimized,\n internal.sizesInput,\n );\n }\n\n // 透传 ref\n internal.ref?.(img);\n }\n\n return (\n // 注意属性顺序:\n // 1. loading 在 src 之前,修复 Safari/Firefox 懒加载时机问题\n // 2. sizes / srcSet 在 src 之前,避免 Safari 提前请求错误尺寸\n // 3. src 最后设置\n <img\n {...imgAttrs}\n // React 19 使用 camelCase fetchPriority;SolidJS 直接透传 JSX 属性即可\n alt={internal.alt}\n loading={internal.loading}\n width={internal.width}\n height={internal.height}\n decoding={internal.decoding}\n data-nimg={internal.fill ? \"fill\" : \"1\"}\n class={internal.class}\n style={internal.style}\n sizes={internal.sizes}\n srcset={internal.srcSet}\n src={internal.src}\n ref={handleRef}\n onLoad={(e) => {\n const img = e.currentTarget as HTMLImageElement;\n handleLoading(\n img,\n internal.placeholder,\n internal.onLoad,\n internal.onLoadingComplete,\n internal.setBlurComplete,\n internal.unoptimized,\n internal.sizesInput,\n );\n }}\n onError={(e) => {\n // 图片加载失败时显示 alt 文本\n internal.setShowAltText(true);\n if (internal.placeholder !== \"empty\") {\n // 即使真实图片失败,也要移除 blur placeholder\n internal.setBlurComplete(true);\n }\n\n if (!internal.onError) return;\n\n if (typeof internal.onError !== \"function\") return;\n\n internal.onError(e);\n }}\n />\n );\n};\n\nexport default ImageElement;\n"],"mappings":";;;;8CAiCMoB,KAA8CC,MAAa;CAC/D,IAAMC,IAAQrB,EAAW,EAAEsB,UAAU,QAAiB,GAAGF,CAAQ,GAG3D,CAACI,GAAUC,KAAYxB,EAAWoB,GAAO;EAC7C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAK,CACN;CAMD,SAASK,EAAUC,GAAuB;EACxC,AAAKA,MAGDH,EAASI,YAEXD,EAAIE,MAAMF,EAAIE,MAaZF,EAAIY,YACNjC,EACEqB,GACAH,EAASf,aACTe,EAASV,QACTU,EAAST,mBACTS,EAASd,iBACTc,EAAShB,aACTgB,EAASX,UACX,GAIFW,EAASR,MAAMW,CAAG;CACpB;CAEA,cAIE;EAAA,IAAAa,IAAAC,EAAA,GAAAC,IAeOhB;EA0BJ,OA1Ba,OAAAgB,KAAA,aAAAC,EAAAD,GAAAF,CAAA,IAATd,IAASc,GAAAI,EAAAJ,GAAAK,EAbVpB,GAAQ;GAAA,IAEZY,MAAG;IAAA,OAAEb,EAASa;GAAG;GAAA,IACjBS,UAAO;IAAA,OAAEtB,EAASsB;GAAO;GAAA,IACzBC,QAAK;IAAA,OAAEvB,EAASuB;GAAK;GAAA,IACrBC,SAAM;IAAA,OAAExB,EAASwB;GAAM;GAAA,IACvB1B,WAAQ;IAAA,OAAEE,EAASF;GAAQ;GAAA,IAAA,cAAA;IAAA,OAChBE,EAAS0B,OAAO,SAAS;GAAG;GAAA,IAAA2B,QAAA;IAAA,OAChCrD,EAAS2B;GAAK;GAAA,IACrBC,QAAK;IAAA,OAAE5B,EAAS4B;GAAK;GAAA,IACrBC,QAAK;IAAA,OAAE7B,EAAS6B;GAAK;GAAA,IACrBC,SAAM;IAAA,OAAE9B,EAAS+B;GAAM;GAAA,IACvB1B,MAAG;IAAA,OAAEL,EAASK;GAAG;GAAAiD,SAERtB,MAAM;IACb,IAAM7B,IAAM6B,EAAEC;IACdnD,EACEqB,GACAH,EAASf,aACTe,EAASV,QACTU,EAAST,mBACTS,EAASd,iBACTc,EAAShB,aACTgB,EAASX,UACX;GACF;GAACmE,UACSxB,MAAM;IAQd,AANAhC,EAASZ,eAAe,EAAI,GACxBY,EAASf,gBAAgB,WAE3Be,EAASd,gBAAgB,EAAI,GAG1Bc,EAASI,WAEV,OAAOJ,EAASI,WAAY,cAEhCJ,EAASI,QAAQ4B,CAAC;GACpB;EAAC,CAAA,GAAA,IAAA,EAAA,GAAAhB;CAAA,EAAA,CAAA;AAGP"}
1
+ {"version":3,"file":"ImageElement.js","names":["Component","mergeProps","splitProps","ImgProps","OnLoad","OnLoadingComplete","PlaceholderValue","callEventHandler","handleLoading","ImageElementProps","unoptimized","placeholder","setBlurComplete","v","setShowAltText","sizesInput","onLoad","onLoadingComplete","ref","el","HTMLImageElement","ImageElement","rawProps","props","decoding","const","internal","imgAttrs","handleRef","img","onError","src","import","meta","env","PROD","console","error","getAttribute","alt","undefined","complete","_el$","_tmpl$","_ref$","_$use","_$spread","_$mergeProps","loading","width","height","data-nimg","fill","class","classList","style","sizes","srcset","srcSet","e","currentTarget","mergeProps","_$use","_$mergeProps","mergeProps$1","_tmpl$","ImageElement","props","rawProps","internal","imgAttrs","splitProps","handleRef","img","handleLoading","_el$","_ref$","use","spread","mergeProps","\"class\"","\"onLoad\"","\"onError\"","callEventHandler","e"],"sources":["../../../src/components/image/ImageElement.tsx"],"sourcesContent":["/**\n * ImageElement.tsx\n * 单一职责:仅负责渲染原生 <img> 元素,并将 ref 回调、onLoad、onError 事件桥接到\n * 上层传入的副作用函数。不包含配置解析、preload 或 blur placeholder 逻辑。\n */\n\nimport { type Component, mergeProps, splitProps } from \"solid-js\";\nimport type {\n ImgProps,\n OnLoad,\n OnLoadingComplete,\n PlaceholderValue,\n} from \"./Image.types\";\nimport { callEventHandler } from \"~/utils\";\nimport { handleLoading } from \"./Image.utils\";\n\n// ─── 额外内部 Props ────────────────────────────────────────────────────────────\n\nexport interface ImageElementProps extends ImgProps {\n unoptimized: boolean;\n placeholder: PlaceholderValue;\n /** 上层通过 signal setter 传入,避免在此组件内管理状态 */\n setBlurComplete: (v: boolean) => void;\n setShowAltText: (v: boolean) => void;\n sizesInput: string | undefined;\n onLoad?: OnLoad;\n onLoadingComplete?: OnLoadingComplete;\n // onError?: (e: Event) => void;\n /** 透传给原生 img 的 ref */\n ref?: (el: HTMLImageElement) => void;\n}\n\n// ─── 组件 ─────────────────────────────────────────────────────────────────────\n\nconst ImageElement: Component<ImageElementProps> = (rawProps) => {\n const props = mergeProps({ decoding: \"async\" as const }, rawProps);\n\n // 分离内部 props 与透传给 <img> 的 props\n const [internal, imgAttrs] = splitProps(props, [\n \"src\",\n \"srcSet\",\n \"sizes\",\n \"height\",\n \"width\",\n \"decoding\",\n \"class\",\n \"classList\",\n \"style\",\n \"fetchpriority\",\n \"placeholder\",\n \"loading\",\n \"unoptimized\",\n \"fill\",\n \"setBlurComplete\",\n \"setShowAltText\",\n \"sizesInput\",\n \"onLoad\",\n \"onError\",\n \"onLoadingComplete\",\n \"ref\",\n \"alt\",\n ]);\n\n /**\n * ref 回调:在元素挂载后立即处理\"图片在 hydrate 前已加载完成\"的情况,\n * 并将 ref 透传给调用方(如需要访问 img 节点)。\n */\n function handleRef(img: HTMLImageElement) {\n if (!img) return;\n\n // 让 Safari 重新触发 onerror(如果图片在 hydrate 前就已失败)\n if (internal.onError) {\n // biome-ignore lint/correctness/noSelfAssign: If the image has an error before react hydrates, then the error is lost. The workaround is to wait until the image is mounted which is after hydration, then we set the src again to trigger the error handler (if there was an error).\n img.src = img.src;\n }\n\n if (!import.meta.env.PROD) {\n if (!internal.src) {\n console.error('[Image] 缺少必填属性 \"src\"', img);\n }\n if (img.getAttribute(\"alt\") === null && internal.alt === undefined) {\n console.error('[Image] 缺少必填属性 \"alt\"...');\n }\n }\n\n // 图片在组件挂载前已完成加载(cached 场景)\n if (img.complete) {\n handleLoading(\n img,\n internal.placeholder,\n internal.onLoad,\n internal.onLoadingComplete,\n internal.setBlurComplete,\n internal.unoptimized,\n internal.sizesInput,\n );\n }\n\n // 透传 ref\n internal.ref?.(img);\n }\n\n return (\n // 注意属性顺序:\n // 1. loading 在 src 之前,修复 Safari/Firefox 懒加载时机问题\n // 2. sizes / srcSet 在 src 之前,避免 Safari 提前请求错误尺寸\n // 3. src 最后设置\n <img\n {...imgAttrs}\n // React 19 使用 camelCase fetchPriority;SolidJS 直接透传 JSX 属性即可\n alt={internal.alt}\n loading={internal.loading}\n width={internal.width}\n height={internal.height}\n decoding={internal.decoding}\n data-nimg={internal.fill ? \"fill\" : \"1\"}\n class={internal.class}\n classList={internal.classList}\n style={internal.style}\n sizes={internal.sizes}\n srcset={internal.srcSet}\n src={internal.src}\n ref={handleRef}\n onLoad={(e) => {\n const img = e.currentTarget as HTMLImageElement;\n handleLoading(\n img,\n internal.placeholder,\n internal.onLoad,\n internal.onLoadingComplete,\n internal.setBlurComplete,\n internal.unoptimized,\n internal.sizesInput,\n );\n }}\n onError={(e) => {\n // 图片加载失败时显示 alt 文本\n internal.setShowAltText(true);\n if (internal.placeholder !== \"empty\") {\n // 即使真实图片失败,也要移除 blur placeholder\n internal.setBlurComplete(true);\n }\n\n // 此前这里用 `typeof internal.onError !== \"function\"` 直接 return,\n // 等于把 Solid 的数组/绑定形式**静默丢掉**(既不报错也不回调)。\n // 统一走仓库的 callEventHandler(数组=多个处理器,非函数项跳过)。\n callEventHandler(internal.onError, e);\n }}\n />\n );\n};\n\nexport default ImageElement;\n"],"mappings":";;;;;8CAkCMqB,KAA8CC,MAAa;CAC/D,IAAMC,IAAQtB,EAAW,EAAEuB,UAAU,QAAiB,GAAGF,CAAQ,GAG3D,CAACI,GAAUC,KAAYzB,EAAWqB,GAAO;EAC7C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAK,CACN;CAMD,SAASK,EAAUC,GAAuB;EACxC,AAAKA,MAGDH,EAASI,YAEXD,EAAIE,MAAMF,EAAIE,MAaZF,EAAIY,YACNjC,EACEqB,GACAH,EAASf,aACTe,EAASV,QACTU,EAAST,mBACTS,EAASd,iBACTc,EAAShB,aACTgB,EAASX,UACX,GAIFW,EAASR,MAAMW,CAAG;CACpB;CAEA,cAIE;EAAA,IAAAa,IAAAC,EAAA,GAAAC,IAgBOhB;EAyBJ,OAzBa,OAAAgB,KAAA,aAAAC,EAAAD,GAAAF,CAAA,IAATd,IAASc,GAAAI,EAAAJ,GAAAK,EAdVpB,GAAQ;GAAA,IAEZY,MAAG;IAAA,OAAEb,EAASa;GAAG;GAAA,IACjBS,UAAO;IAAA,OAAEtB,EAASsB;GAAO;GAAA,IACzBC,QAAK;IAAA,OAAEvB,EAASuB;GAAK;GAAA,IACrBC,SAAM;IAAA,OAAExB,EAASwB;GAAM;GAAA,IACvB1B,WAAQ;IAAA,OAAEE,EAASF;GAAQ;GAAA,IAAA,cAAA;IAAA,OAChBE,EAAS0B,OAAO,SAAS;GAAG;GAAA,IAAA4B,QAAA;IAAA,OAChCtD,EAAS2B;GAAK;GAAA,IACrBC,YAAS;IAAA,OAAE5B,EAAS4B;GAAS;GAAA,IAC7BC,QAAK;IAAA,OAAE7B,EAAS6B;GAAK;GAAA,IACrBC,QAAK;IAAA,OAAE9B,EAAS8B;GAAK;GAAA,IACrBC,SAAM;IAAA,OAAE/B,EAASgC;GAAM;GAAA,IACvB3B,MAAG;IAAA,OAAEL,EAASK;GAAG;GAAAkD,SAERtB,MAAM;IACb,IAAM9B,IAAM8B,EAAEC;IACdpD,EACEqB,GACAH,EAASf,aACTe,EAASV,QACTU,EAAST,mBACTS,EAASd,iBACTc,EAAShB,aACTgB,EAASX,UACX;GACF;GAACmE,UACSvB,MAAM;IAWdpD,AATAmB,EAASZ,eAAe,EAAI,GACxBY,EAASf,gBAAgB,WAE3Be,EAASd,gBAAgB,EAAI,GAM/BL,EAAiBmB,EAASI,SAAS6B,CAAC;GACtC;EAAC,CAAA,GAAA,IAAA,EAAA,GAAAjB;CAAA,EAAA,CAAA;AAGP"}
@@ -0,0 +1,31 @@
1
+ import { PlaceholderStyle } from '../Image.types';
2
+ interface BlurSvgOptions {
3
+ widthInt?: number;
4
+ heightInt?: number;
5
+ blurWidth?: number;
6
+ blurHeight?: number;
7
+ /** 省略时按空串处理(生产构建跳过开发期校验时可能出现没有 blurDataURL 的情况) */
8
+ blurDataURL?: string;
9
+ objectFit?: string;
10
+ }
11
+ /**
12
+ * 生成内联的 blur SVG(URL 编码为 data URL 的 payload)。
13
+ *
14
+ * 采用与 next/image 相同的手法:把原图按放大 40 倍绘制,再叠加高斯模糊滤镜,
15
+ * 得到"低分辨率占位图"的观感,而不必真的生成缩略图。
16
+ */
17
+ export declare function getImageBlurSvg({ widthInt, heightInt, blurWidth, blurHeight, blurDataURL, objectFit, }: BlurSvgOptions): string;
18
+ interface PlaceholderOptions {
19
+ /** 已解码完成则不必再显示占位 */
20
+ blurComplete: boolean;
21
+ placeholder: string;
22
+ objectFit?: string;
23
+ objectPosition?: string;
24
+ backgroundImage: string | null;
25
+ }
26
+ /**
27
+ * 由背景图字符串得到完整的占位样式。
28
+ * 没有背景图(`placeholder="empty"` 或已解码)时返回空对象,不产生多余样式。
29
+ */
30
+ export declare function getPlaceholderStyle({ backgroundImage, objectFit, objectPosition, }: PlaceholderOptions): PlaceholderStyle;
31
+ export {};
@@ -0,0 +1,24 @@
1
+ //#region src/components/image/lib/blur.ts
2
+ var e = [
3
+ "-moz-initial",
4
+ "fill",
5
+ "none",
6
+ "scale-down",
7
+ void 0
8
+ ];
9
+ function t({ widthInt: e, heightInt: t, blurWidth: n, blurHeight: r, blurDataURL: i = "", objectFit: a }) {
10
+ let o = n ? n * 40 : e, s = r ? r * 40 : t, c = o && s ? `viewBox='0 0 ${o} ${s}'` : "";
11
+ return `%3Csvg xmlns='http://www.w3.org/2000/svg' ${c}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${c ? "none" : a === "contain" ? "xMidYMid" : a === "cover" ? "xMidYMid slice" : "none"}' style='filter: url(%23b);' href='${i}'/%3E%3C/svg%3E`;
12
+ }
13
+ function n({ backgroundImage: t, objectFit: n, objectPosition: r }) {
14
+ return t ? {
15
+ "background-size": e.includes(n) ? n === "fill" ? "100% 100%" : "cover" : n,
16
+ "background-position": r || "50% 50%",
17
+ "background-repeat": "no-repeat",
18
+ "background-image": t
19
+ } : {};
20
+ }
21
+ //#endregion
22
+ export { t as getImageBlurSvg, n as getPlaceholderStyle };
23
+
24
+ //# sourceMappingURL=blur.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blur.js","names":["INVALID_BACKGROUND_SIZE_VALUES","getImageBlurSvg","svgWidth","blurWidth","widthInt","svgHeight","blurHeight","heightInt","viewBox","objectFit","blurDataURL","getPlaceholderStyle","backgroundImage","objectPosition"],"sources":["../../../../src/components/image/lib/blur.ts"],"sourcesContent":["/**\n * blur placeholder 的 SVG 生成与背景样式计算。\n *\n * 单一职责:把 blur 数据与目标尺寸转换成可直接写进 `style` 的 CSS 值。\n */\n\nimport type { PlaceholderStyle } from \"../Image.types\";\n\n/** `object-fit` 里不能直接当 `background-size` 用的值 */\nconst INVALID_BACKGROUND_SIZE_VALUES = [\n \"-moz-initial\",\n \"fill\",\n \"none\",\n \"scale-down\",\n undefined,\n];\n\ninterface BlurSvgOptions {\n widthInt?: number;\n heightInt?: number;\n blurWidth?: number;\n blurHeight?: number;\n /** 省略时按空串处理(生产构建跳过开发期校验时可能出现没有 blurDataURL 的情况) */\n blurDataURL?: string;\n objectFit?: string;\n}\n\n/**\n * 生成内联的 blur SVG(URL 编码为 data URL 的 payload)。\n *\n * 采用与 next/image 相同的手法:把原图按放大 40 倍绘制,再叠加高斯模糊滤镜,\n * 得到\"低分辨率占位图\"的观感,而不必真的生成缩略图。\n */\nexport function getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth,\n blurHeight,\n blurDataURL = \"\",\n objectFit,\n}: BlurSvgOptions): string {\n const std = 20;\n const svgWidth = blurWidth ? blurWidth * 40 : widthInt;\n const svgHeight = blurHeight ? blurHeight * 40 : heightInt;\n\n const viewBox =\n svgWidth && svgHeight ? `viewBox='0 0 ${svgWidth} ${svgHeight}'` : \"\";\n const preserveAspectRatio = viewBox\n ? \"none\"\n : objectFit === \"contain\"\n ? \"xMidYMid\"\n : objectFit === \"cover\"\n ? \"xMidYMid slice\"\n : \"none\";\n\n return `%3Csvg xmlns='http://www.w3.org/2000/svg' ${viewBox}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${preserveAspectRatio}' style='filter: url(%23b);' href='${blurDataURL}'/%3E%3C/svg%3E`;\n}\n\ninterface PlaceholderOptions {\n /** 已解码完成则不必再显示占位 */\n blurComplete: boolean;\n placeholder: string;\n objectFit?: string;\n objectPosition?: string;\n backgroundImage: string | null;\n}\n\n/**\n * 由背景图字符串得到完整的占位样式。\n * 没有背景图(`placeholder=\"empty\"` 或已解码)时返回空对象,不产生多余样式。\n */\nexport function getPlaceholderStyle({\n backgroundImage,\n objectFit,\n objectPosition,\n}: PlaceholderOptions): PlaceholderStyle {\n if (!backgroundImage) return {};\n\n const backgroundSize = !INVALID_BACKGROUND_SIZE_VALUES.includes(objectFit)\n ? objectFit\n : objectFit === \"fill\"\n ? \"100% 100%\" // `fill` 在 background-size 下的等价写法\n : \"cover\";\n\n return {\n \"background-size\": backgroundSize,\n \"background-position\": objectPosition || \"50% 50%\",\n \"background-repeat\": \"no-repeat\",\n \"background-image\": backgroundImage,\n };\n}\n"],"mappings":";AASA,IAAMA,IAAiC;CACrC;CACA;CACA;CACA;CACA,KAAA;AACF;AAkBA,SAAgBC,EAAgB,EAC9B,aACA,cACA,cACA,eACA,iBAAc,IACd,gBACyB;CACzB,IACMC,IAAWC,IAAYA,IAAY,KAAKC,GACxCC,IAAYC,IAAaA,IAAa,KAAKC,GAE3CC,IACJN,KAAYG,IAAY,gBAAgBH,EAAS,GAAGG,EAAU,KAAK;CASrE,OAAO,6CAA6CG,EAAQ,ybARhCA,IACxB,SACAC,MAAc,YACZ,aACAA,MAAc,UACZ,mBACA,OAEygB,qCAAqCC,EAAY;AACpkB;AAeA,SAAgBC,EAAoB,EAClC,oBACA,cACA,qBACuC;CASvC,OARKC,IAQE;EACL,mBAPsBZ,EAA+B,SAASS,CAAS,IAErEA,MAAc,SACZ,cACA,UAHFA;EAOF,uBAAuBI,KAAkB;EACzC,qBAAqB;EACrB,oBAAoBD;CACtB,IAb6B,CAAC;AAchC"}
@@ -0,0 +1,52 @@
1
+ import { ImageConfig, ImageLoaderWithConfig, ImageProps } from '../Image.types';
2
+ /** `loading` 的合法取值(含"未传",表示交给 `isLazy` 决定) */
3
+ export declare const VALID_LOADING_VALUES: readonly ["lazy", "eager", undefined];
4
+ export type ValidLoadingValue = (typeof VALID_LOADING_VALUES)[number];
5
+ /** 是否是可用的 loading 值 */
6
+ export declare function isValidLoading(value: unknown): value is ValidLoadingValue;
7
+ interface DevCheckContext {
8
+ /** 已解析出的最终 src(可能是空串) */
9
+ src: string;
10
+ config: ImageConfig;
11
+ loader: ImageLoaderWithConfig;
12
+ fill: boolean;
13
+ /** 解析后的宽高(`NaN` 表示非法) */
14
+ widthInt: number | undefined;
15
+ heightInt: number | undefined;
16
+ qualityInt: number | undefined;
17
+ /** `unoptimized` 的当前值,可能会被本函数改写 */
18
+ unoptimized: boolean;
19
+ /** 生效后的内联样式(用于检测与 `fill` 冲突的宽高) */
20
+ style: ImageProps["style"];
21
+ /** 用户在 placeholder / loading / priority / preload / 旧属性上的原始输入 */
22
+ props: {
23
+ width?: unknown;
24
+ height?: unknown;
25
+ loading?: unknown;
26
+ priority?: boolean;
27
+ preload?: boolean;
28
+ placeholder: string;
29
+ blurDataURL?: string;
30
+ };
31
+ /** 未被子组件消费的剩余属性名(用于探测 `ref` 之类不支持的用法) */
32
+ otherKeys: string[];
33
+ /** next 13 之前的旧属性(有值就发 codemod 提示) */
34
+ legacyProps: Record<string, unknown>;
35
+ }
36
+ /**
37
+ * 入口:执行全部开发期校验。
38
+ * 返回可能被改写的 `unoptimized`(`src` 为空时会强制为 true)。
39
+ */
40
+ export declare function runDevChecks(ctx: DevCheckContext): boolean;
41
+ /**
42
+ * 记录本次渲染的图片,并(首次)注册 LCP 观察器。
43
+ * 目的是在开发环境提示"首屏最大的那张图用了 lazy"。
44
+ */
45
+ export declare function trackImageForLcp(entry: {
46
+ src: string;
47
+ loading: ValidLoadingValue;
48
+ placeholder: string;
49
+ }): void;
50
+ /** 仅供测试:重置模块级状态(观察器与已记录图片) */
51
+ export declare function resetLcpTracking(): void;
52
+ export {};
@@ -0,0 +1,13 @@
1
+ import { OnLoad, OnLoadingComplete, PlaceholderValue } from '../Image.types';
2
+ /** 用于追踪每个 img 节点已处理的 src,避免重复触发 */
3
+ type ImgWithDataProp = HTMLImageElement & {
4
+ "data-loaded-src"?: string;
5
+ };
6
+ /**
7
+ * 在图片加载/hydrate 后调用。
8
+ * - 使用 img.decode() 确保像素已解码再触发回调
9
+ * - 清除 blur placeholder
10
+ * - 开发环境下输出 fill / sizes 相关警告
11
+ */
12
+ export declare function handleLoading(img: ImgWithDataProp, placeholder: PlaceholderValue, onLoad: OnLoad | undefined, onLoadingComplete: OnLoadingComplete | undefined, setBlurComplete: (v: boolean) => void, unoptimized: boolean, sizesInput: string | undefined): void;
13
+ export {};
@@ -0,0 +1,20 @@
1
+ //#region src/components/image/lib/handle-loading.ts
2
+ function e(e, t, n, r, i, a, o) {
3
+ let s = e?.src;
4
+ e && e["data-loaded-src"] !== s && (e["data-loaded-src"] = s, ("decode" in e ? e.decode() : Promise.resolve()).catch(() => {}).then(() => {
5
+ if (e.parentElement && e.isConnected) {
6
+ if (t !== "empty" && i(!0), n) {
7
+ let t = new Event("load");
8
+ Object.defineProperty(t, "target", {
9
+ writable: !1,
10
+ value: e
11
+ }), n(t);
12
+ }
13
+ r && r(e);
14
+ }
15
+ }));
16
+ }
17
+ //#endregion
18
+ export { e as handleLoading };
19
+
20
+ //# sourceMappingURL=handle-loading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-loading.js","names":["handleLoading","src","img","placeholder","setBlurComplete","onLoad","event","onLoadingComplete"],"sources":["../../../../src/components/image/lib/handle-loading.ts"],"sourcesContent":["/**\n * 图片加载完成后的副作用。\n *\n * 单一职责:decode 完成后触发回调、清除 blur 占位、在开发环境输出\n * fill / sizes 与宽高比相关的使用警告。纯 TypeScript,无 JSX。\n */\n\nimport type {\n OnLoad,\n OnLoadingComplete,\n PlaceholderValue,\n} from \"../Image.types\";\n\n/** 用于追踪每个 img 节点已处理的 src,避免重复触发 */\ntype ImgWithDataProp = HTMLImageElement & { \"data-loaded-src\"?: string };\n\n/**\n * 在图片加载/hydrate 后调用。\n * - 使用 img.decode() 确保像素已解码再触发回调\n * - 清除 blur placeholder\n * - 开发环境下输出 fill / sizes 相关警告\n */\nexport function handleLoading(\n img: ImgWithDataProp,\n placeholder: PlaceholderValue,\n onLoad: OnLoad | undefined,\n onLoadingComplete: OnLoadingComplete | undefined,\n setBlurComplete: (v: boolean) => void,\n unoptimized: boolean,\n sizesInput: string | undefined,\n): void {\n const src = img?.src;\n // 同一张图只处理一次\n if (!img || img[\"data-loaded-src\"] === src) return;\n img[\"data-loaded-src\"] = src;\n\n const p: Promise<void> = \"decode\" in img ? img.decode() : Promise.resolve();\n\n p.catch(() => {}).then(() => {\n // 若组件已卸载则提前退出\n if (!img.parentElement || !img.isConnected) return;\n\n if (placeholder !== \"empty\") {\n setBlurComplete(true);\n }\n\n if (onLoad) {\n const event = new Event(\"load\");\n Object.defineProperty(event, \"target\", { writable: false, value: img });\n onLoad(\n event as Event & { currentTarget: HTMLImageElement; target: Element },\n );\n }\n\n if (onLoadingComplete) {\n onLoadingComplete(img);\n }\n\n if (import.meta.env.DEV) {\n warnFillUsage(img, unoptimized, sizesInput);\n warnAspectRatioMismatch(img);\n }\n });\n}\n\n// ─── 开发警告辅助 ──────────────────────────────────────────────────────────────\n\nfunction warnFillUsage(\n img: HTMLImageElement,\n unoptimized: boolean,\n sizesInput: string | undefined,\n): void {\n if (img.getAttribute(\"data-nimg\") !== \"fill\") return;\n\n const origSrc =\n new URL(img.src, \"http://n\").searchParams.get(\"url\") || img.src;\n\n if (!unoptimized) {\n const widthViewportRatio =\n img.getBoundingClientRect().width / window.innerWidth;\n if (widthViewportRatio < 0.6) {\n if (sizesInput === \"100vw\") {\n console.warn(\n `[Image] src=\"${origSrc}\" 设置了 fill 和 sizes=\"100vw\",但实际渲染宽度不足视口宽度,请调整 sizes 以提升性能。`,\n );\n } else if (!sizesInput) {\n console.warn(\n `[Image] src=\"${origSrc}\" 设置了 fill 但缺少 sizes 属性,请添加以提升性能。`,\n );\n }\n }\n }\n\n // 走到这里说明 img.parentElement 一定存在(函数开头的 `!img.parentElement ||`\n // 已经把脱离 DOM 的情况挡掉了),因此不需要再判空\n const { position } = window.getComputedStyle(\n img.parentElement as HTMLElement,\n );\n const valid = [\"absolute\", \"fixed\", \"relative\"];\n if (!valid.includes(position)) {\n console.warn(\n `[Image] src=\"${origSrc}\" 设置了 fill,但父元素 position=\"${position}\",应为 ${valid.join(\" | \")} 之一。`,\n );\n }\n\n if (img.height === 0) {\n console.warn(\n `[Image] src=\"${origSrc}\" 设置了 fill 且高度为 0,请为父元素设置明确高度。`,\n );\n }\n}\n\nfunction warnAspectRatioMismatch(img: HTMLImageElement): void {\n const heightModified = img.height.toString() !== img.getAttribute(\"height\");\n const widthModified = img.width.toString() !== img.getAttribute(\"width\");\n if (\n (heightModified && !widthModified) ||\n (!heightModified && widthModified)\n ) {\n const origSrc =\n new URL(img.src, \"http://n\").searchParams.get(\"url\") || img.src;\n console.warn(\n `[Image] src=\"${origSrc}\" 仅修改了 width 或 height 其中之一,请同时添加 width: \"auto\" 或 height: \"auto\" 样式以保持宽高比。`,\n );\n }\n}\n"],"mappings":";AAsBA,SAAgBA,EACd,GACA,GACA,GACA,GACA,GACA,GACA,GACM;CACN,IAAMC,IAAMC,GAAK;CAEjB,AAAKA,KAAOA,EAAI,uBAAuBD,MACvC,EAAI,qBAAqBA,IAEA,YAAYC,IAAMA,EAAI,OAAO,IAAI,QAAQ,QAAQ,EAAA,CAExE,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW;EAE3B,IAAKA,EAAI,iBAAkBA,EAAI,aAM/B;OAJIC,MAAgB,WAClBC,EAAgB,EAAI,GAGlBC,GAAQ;IACV,IAAMC,IAAQ,IAAI,MAAM,MAAM;IAE9B,AADA,OAAO,eAAeA,GAAO,UAAU;KAAE,UAAU;KAAO,OAAOJ;IAAI,CAAC,GACtEG,EACEC,CACF;GACF;GAEA,AAAIC,KACFA,EAAkBL,CAAG;EAHvB;CAUF,CAAC;AACH"}
@@ -0,0 +1,39 @@
1
+ import { ImageConfig, ImageLoaderProps, ImageLoaderWithConfig } from '../Image.types';
2
+ /**
3
+ * 默认 loader。
4
+ * - 外部 URL(http/https)原样返回,不经过优化服务
5
+ * - 本地图片追加 `url` / `w` / `q` 参数,交给服务端的 `/_image` 处理
6
+ *
7
+ * 开发环境下缺失 `src` / `width` 会直接抛错,避免静默生成坏 URL。
8
+ */
9
+ export declare function defaultLoader({ src, width, quality, }: ImageLoaderProps): string;
10
+ interface ImgAttrsData {
11
+ config: ImageConfig;
12
+ src: string;
13
+ unoptimized: boolean;
14
+ loader: ImageLoaderWithConfig;
15
+ width?: number;
16
+ quality?: number;
17
+ sizes?: string;
18
+ }
19
+ interface ImgAttrsResult {
20
+ src: string;
21
+ srcSet: string | undefined;
22
+ sizes: string | undefined;
23
+ }
24
+ /**
25
+ * 生成 `src` / `srcSet` / `sizes`。
26
+ * `unoptimized` 时不做任何加工(`srcSet` 与 `sizes` 返回 `undefined`,从 DOM 上消失)。
27
+ */
28
+ export declare function generateImgAttrs({ config, src, unoptimized, width, quality, sizes, loader, }: ImgAttrsData): ImgAttrsResult;
29
+ /**
30
+ * 决定要生成哪些宽度,以及 `srcSet` 描述符用 `w` 还是 `x`:
31
+ * - 显式 `sizes`:解析其中的 `vw` 百分比,据此过滤 `deviceSizes`,用 `w`
32
+ * - 未传 `sizes` 但传了 `width`:用 `width` / `2x`,用 `x`
33
+ * - 都没有:直接用 `deviceSizes`,用 `w`
34
+ */
35
+ export declare function getWidths({ deviceSizes, allSizes }: ImageConfig, width: number | undefined, sizes: string | undefined): {
36
+ widths: number[];
37
+ kind: "w" | "x";
38
+ };
39
+ export {};
@@ -0,0 +1,57 @@
1
+ //#region src/components/image/lib/loader.ts
2
+ function e({ src: e, width: t, quality: n }) {
3
+ if (e.startsWith("http://") || e.startsWith("https://")) return e;
4
+ let r = new URLSearchParams();
5
+ return r.set("url", e), r.set("w", String(t)), n && r.set("q", String(n)), `/_image?${r.toString()}`;
6
+ }
7
+ function t({ config: e, src: t, unoptimized: r, width: i, quality: a, sizes: o, loader: s }) {
8
+ if (r) return {
9
+ src: t,
10
+ srcSet: void 0,
11
+ sizes: void 0
12
+ };
13
+ let { widths: c, kind: l } = n(e, i, o), u = c.length - 1;
14
+ return {
15
+ sizes: !o && l === "w" ? "100vw" : o,
16
+ srcSet: c.map((n, r) => `${s({
17
+ config: e,
18
+ src: t,
19
+ quality: a,
20
+ width: n
21
+ })} ${l === "w" ? n : r + 1}${l}`).join(", "),
22
+ src: s({
23
+ config: e,
24
+ src: t,
25
+ quality: a,
26
+ width: c[u]
27
+ })
28
+ };
29
+ }
30
+ function n({ deviceSizes: e, allSizes: t }, n, r) {
31
+ if (r) {
32
+ let n = /(^|\s)(1?\d?\d)vw/g, i = [];
33
+ for (let e; e = n.exec(r);) i.push(Number.parseInt(e[2], 10));
34
+ if (i.length) {
35
+ let n = Math.min(...i) * .01;
36
+ return {
37
+ widths: t.filter((t) => t >= e[0] * n),
38
+ kind: "w"
39
+ };
40
+ }
41
+ return {
42
+ widths: t,
43
+ kind: "w"
44
+ };
45
+ }
46
+ return typeof n == "number" ? {
47
+ widths: [...new Set([n, n * 2].map((e) => t.find((t) => t >= e) || t[t.length - 1]))],
48
+ kind: "x"
49
+ } : {
50
+ widths: e,
51
+ kind: "w"
52
+ };
53
+ }
54
+ //#endregion
55
+ export { e as defaultLoader, t as generateImgAttrs, n as getWidths };
56
+
57
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","names":["defaultLoader","src","params","width","quality","generateImgAttrs","unoptimized","getWidths","config","sizes","last","widths","kind","loader","w","i","viewportWidthRe","percentSizes","match","smallestRatio","allSizes","s","deviceSizes","p"],"sources":["../../../../src/components/image/lib/loader.ts"],"sourcesContent":["/**\n * 图片 URL 与 `srcSet` 生成。\n *\n * 单一职责:把「配置 + src + 宽度」变成最终的 URL / `srcSet` / `sizes` 字符串。\n * 不含 props 解析、不含校验、不含样式。\n */\n\nimport type {\n ImageConfig,\n ImageLoaderProps,\n ImageLoaderWithConfig,\n} from \"../Image.types\";\n\n/**\n * 默认 loader。\n * - 外部 URL(http/https)原样返回,不经过优化服务\n * - 本地图片追加 `url` / `w` / `q` 参数,交给服务端的 `/_image` 处理\n *\n * 开发环境下缺失 `src` / `width` 会直接抛错,避免静默生成坏 URL。\n */\nexport function defaultLoader({\n src,\n width,\n quality,\n}: ImageLoaderProps): string {\n if (import.meta.env.DEV) {\n const missingValues: string[] = [];\n if (!src) missingValues.push(\"src\");\n if (!width) missingValues.push(\"width\");\n if (missingValues.length > 0) {\n throw new Error(\n `[defaultLoader] 缺少必要属性:${missingValues.join(\", \")}。` +\n `请确认调用方式正确,或提供自定义 loader。`,\n );\n }\n }\n\n if (src.startsWith(\"http://\") || src.startsWith(\"https://\")) {\n return src;\n }\n\n const params = new URLSearchParams();\n params.set(\"url\", src);\n params.set(\"w\", String(width));\n if (quality) params.set(\"q\", String(quality));\n return `/_image?${params.toString()}`;\n}\n\ninterface ImgAttrsData {\n config: ImageConfig;\n src: string;\n unoptimized: boolean;\n loader: ImageLoaderWithConfig;\n width?: number;\n quality?: number;\n sizes?: string;\n}\n\ninterface ImgAttrsResult {\n src: string;\n srcSet: string | undefined;\n sizes: string | undefined;\n}\n\n/**\n * 生成 `src` / `srcSet` / `sizes`。\n * `unoptimized` 时不做任何加工(`srcSet` 与 `sizes` 返回 `undefined`,从 DOM 上消失)。\n */\nexport function generateImgAttrs({\n config,\n src,\n unoptimized,\n width,\n quality,\n sizes,\n loader,\n}: ImgAttrsData): ImgAttrsResult {\n if (unoptimized) {\n return { src, srcSet: undefined, sizes: undefined };\n }\n\n const { widths, kind } = getWidths(config, width, sizes);\n const last = widths.length - 1;\n\n return {\n sizes: !sizes && kind === \"w\" ? \"100vw\" : sizes,\n srcSet: widths\n .map(\n (w, i) =>\n `${loader({ config, src, quality, width: w })} ${\n kind === \"w\" ? w : i + 1\n }${kind}`,\n )\n .join(\", \"),\n\n // `src` 刻意放在最后:浏览器(尤其 Safari)会按属性出现顺序立即发起请求,\n // 若 `src` 在 `srcSet`/`sizes` 之前,会先请求一次再被替换,造成多余请求。\n src: loader({ config, src, quality, width: widths[last] }),\n };\n}\n\n/**\n * 决定要生成哪些宽度,以及 `srcSet` 描述符用 `w` 还是 `x`:\n * - 显式 `sizes`:解析其中的 `vw` 百分比,据此过滤 `deviceSizes`,用 `w`\n * - 未传 `sizes` 但传了 `width`:用 `width` / `2x`,用 `x`\n * - 都没有:直接用 `deviceSizes`,用 `w`\n */\nexport function getWidths(\n { deviceSizes, allSizes }: ImageConfig,\n width: number | undefined,\n sizes: string | undefined,\n): { widths: number[]; kind: \"w\" | \"x\" } {\n if (sizes) {\n const viewportWidthRe = /(^|\\s)(1?\\d?\\d)vw/g;\n const percentSizes = [];\n for (\n let match: RegExpExecArray | null;\n // biome-ignore lint/suspicious/noAssignInExpressions: 上游 next 的实现,保持逐字移植\n (match = viewportWidthRe.exec(sizes));\n match\n ) {\n percentSizes.push(Number.parseInt(match[2], 10));\n }\n if (percentSizes.length) {\n const smallestRatio = Math.min(...percentSizes) * 0.01;\n return {\n widths: allSizes.filter((s) => s >= deviceSizes[0] * smallestRatio),\n kind: \"w\",\n };\n }\n return { widths: allSizes, kind: \"w\" };\n }\n if (typeof width !== \"number\") {\n return { widths: deviceSizes, kind: \"w\" };\n }\n\n const widths = [\n ...new Set(\n // 3x 屏不给 3x 图:多数标称 3x 的 OLED 屏实际只有绿色子像素是 3x,\n // 渲染上与 2x 无差别却显著增加流量。\n // https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html\n [width, width * 2].map(\n (w) => allSizes.find((p) => p >= w) || allSizes[allSizes.length - 1],\n ),\n ),\n ];\n return { widths, kind: \"x\" };\n}\n"],"mappings":";AAoBA,SAAgBA,EAAc,EAC5B,QACA,UACA,cAC2B;CAa3B,IAAIC,EAAI,WAAW,SAAS,KAAKA,EAAI,WAAW,UAAU,GACxD,OAAOA;CAGT,IAAMC,IAAS,IAAI,gBAAgB;CAInC,OAHAA,EAAO,IAAI,OAAOD,CAAG,GACrBC,EAAO,IAAI,KAAK,OAAOC,CAAK,CAAC,GACzBC,KAASF,EAAO,IAAI,KAAK,OAAOE,CAAO,CAAC,GACrC,WAAWF,EAAO,SAAS;AACpC;AAsBA,SAAgBG,EAAiB,EAC/B,WACA,QACA,gBACA,UACA,YACA,UACA,aAC+B;CAC/B,IAAIC,GACF,OAAO;EAAE;EAAK,QAAQ,KAAA;EAAW,OAAO,KAAA;CAAU;CAGpD,IAAM,EAAE,WAAQ,YAASC,EAAUC,GAAQL,GAAOM,CAAK,GACjDC,IAAOC,EAAO,SAAS;CAE7B,OAAO;EACL,OAAO,CAACF,KAASG,MAAS,MAAM,UAAUH;EAC1C,QAAQE,EACL,KACE,GAAG,MACF,GAAGE,EAAO;GAAE;GAAQ;GAAK;GAAS,OAAOC;EAAE,CAAC,EAAE,GAC5CF,MAAS,MAAME,IAAIC,IAAI,IACtBH,GACP,CAAC,CACA,KAAK,IAAI;EAIZ,KAAKC,EAAO;GAAE;GAAQ;GAAK;GAAS,OAAOF,EAAOD;EAAM,CAAC;CAC3D;AACF;AAQA,SAAgBH,EACd,EAAE,gBAAa,eACf,GACA,GACuC;CACvC,IAAIE,GAAO;EACT,IAAMO,IAAkB,sBAClBC,IAAe,CAAC;EACtB,KACE,IAAIC,GAEH,IAAQF,EAAgB,KAAKP,CAAK,IAGnC,EAAa,KAAK,OAAO,SAASS,EAAM,IAAI,EAAE,CAAC;EAEjD,IAAID,EAAa,QAAQ;GACvB,IAAME,IAAgB,KAAK,IAAI,GAAGF,CAAY,IAAI;GAClD,OAAO;IACL,QAAQG,EAAS,QAAQ,MAAMC,KAAKC,EAAY,KAAKH,CAAa;IAClE,MAAM;GACR;EACF;EACA,OAAO;GAAE,QAAQC;GAAU,MAAM;EAAI;CACvC;CAeA,OAdI,OAAOjB,KAAU,WAcd;EAAE,QAAA,CATP,GAAG,IAAI,IAIL,CAACA,GAAOA,IAAQ,CAAC,CAAC,CAAC,KAChB,MAAMiB,EAAS,MAAM,MAAMG,KAAKT,CAAC,KAAKM,EAASA,EAAS,SAAS,EACpE,CACF,CAEO;EAAQ,MAAM;CAAI,IAblB;EAAE,QAAQE;EAAa,MAAM;CAAI;AAc5C"}
@@ -0,0 +1,14 @@
1
+ import { StaticImageData, StaticImport, StaticRequire } from '../Image.types';
2
+ /**
3
+ * 把 `width` / `height` / `quality` 这类既可传数字也可传数字字符串的输入解析成数字。
4
+ * - `undefined` 原样返回(表示"未提供",与 `NaN` 表示"非法"区分开)
5
+ * - 纯数字字符串按十进制解析
6
+ * - 其它一律返回 `NaN`,由调用方决定是否抛错
7
+ */
8
+ export declare function getInt(x: unknown): number | undefined;
9
+ /** 是否是 webpack 的 `require().default` 形态 */
10
+ export declare function isStaticRequire(src: StaticRequire | StaticImageData): src is StaticRequire;
11
+ /** 是否已是 StaticImageData(自带 src/width/height) */
12
+ export declare function isStaticImageData(src: StaticRequire | StaticImageData): src is StaticImageData;
13
+ /** 是否是任何一种静态导入对象(`require()` 或 `import` 的结果) */
14
+ export declare function isStaticImport(src: string | StaticImport): src is StaticImport;
@@ -0,0 +1,17 @@
1
+ //#region src/components/image/lib/static-import.ts
2
+ function e(e) {
3
+ return e === void 0 ? e : typeof e == "number" ? Number.isFinite(e) ? e : NaN : typeof e == "string" && /^[0-9]+$/.test(e) ? Number.parseInt(e, 10) : NaN;
4
+ }
5
+ function t(e) {
6
+ return e.default !== void 0;
7
+ }
8
+ function n(e) {
9
+ return e.src !== void 0;
10
+ }
11
+ function r(e) {
12
+ return !!e && typeof e == "object" && (t(e) || n(e));
13
+ }
14
+ //#endregion
15
+ export { e as getInt, n as isStaticImageData, r as isStaticImport, t as isStaticRequire };
16
+
17
+ //# sourceMappingURL=static-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-import.js","names":["getInt","x","isStaticRequire","src","isStaticImageData","isStaticImport"],"sources":["../../../../src/components/image/lib/static-import.ts"],"sourcesContent":["/**\n * 静态图片导入的识别与数值解析。\n *\n * 单一职责:只处理「src 到底是字符串还是静态导入对象」以及「宽高/quality 这类\n * 松散输入怎么解析成数字」。不涉及 loader、样式或校验。\n */\n\nimport type {\n StaticImageData,\n StaticImport,\n StaticRequire,\n} from \"../Image.types\";\n\n/**\n * 把 `width` / `height` / `quality` 这类既可传数字也可传数字字符串的输入解析成数字。\n * - `undefined` 原样返回(表示\"未提供\",与 `NaN` 表示\"非法\"区分开)\n * - 纯数字字符串按十进制解析\n * - 其它一律返回 `NaN`,由调用方决定是否抛错\n */\nexport function getInt(x: unknown): number | undefined {\n if (typeof x === \"undefined\") {\n return x;\n }\n if (typeof x === \"number\") {\n return Number.isFinite(x) ? x : Number.NaN;\n }\n if (typeof x === \"string\" && /^[0-9]+$/.test(x)) {\n return Number.parseInt(x, 10);\n }\n return Number.NaN;\n}\n\n/** 是否是 webpack 的 `require().default` 形态 */\nexport function isStaticRequire(\n src: StaticRequire | StaticImageData,\n): src is StaticRequire {\n return (src as StaticRequire).default !== undefined;\n}\n\n/** 是否已是 StaticImageData(自带 src/width/height) */\nexport function isStaticImageData(\n src: StaticRequire | StaticImageData,\n): src is StaticImageData {\n return (src as StaticImageData).src !== undefined;\n}\n\n/** 是否是任何一种静态导入对象(`require()` 或 `import` 的结果) */\nexport function isStaticImport(\n src: string | StaticImport,\n): src is StaticImport {\n return (\n !!src &&\n typeof src === \"object\" &&\n (isStaticRequire(src as StaticImport) ||\n isStaticImageData(src as StaticImport))\n );\n}\n"],"mappings":";AAmBA,SAAgBA,EAAO,GAAgC;CAUrD,OATWC,MAAM,SACRA,IAEL,OAAOA,KAAM,WACR,OAAO,SAASA,CAAC,IAAIA,IAAI,MAE9B,OAAOA,KAAM,YAAY,WAAW,KAAKA,CAAC,IACrC,OAAO,SAASA,GAAG,EAAE,IAEvB;AACT;AAGA,SAAgBC,EACd,GACsB;CACtB,OAAQC,EAAsB,YAAY,KAAA;AAC5C;AAGA,SAAgBC,EACd,GACwB;CACxB,OAAQD,EAAwB,QAAQ,KAAA;AAC1C;AAGA,SAAgBE,EACd,GACqB;CACrB,OACE,CAAC,CAACF,KACF,OAAOA,KAAQ,aACdD,EAAgBC,CAAmB,KAClCC,EAAkBD,CAAmB;AAE3C"}