@neut/ui 0.0.8 → 0.0.10

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 (581) hide show
  1. package/README.md +83 -56
  2. package/README.zh-CN.md +137 -0
  3. package/dist/components/accordion/Accordion/Accordion.context.js.map +1 -1
  4. package/dist/components/accordion/Accordion/Accordion.js +21 -20
  5. package/dist/components/accordion/Accordion/Accordion.js.map +1 -1
  6. package/dist/components/accordion/Accordion/Accordion.styles.d.ts +2 -0
  7. package/dist/components/accordion/Accordion/Accordion.styles.js +7 -0
  8. package/dist/components/accordion/Accordion/Accordion.styles.js.map +1 -0
  9. package/dist/components/accordion/Accordion/useAccordion.js +1 -3
  10. package/dist/components/accordion/Accordion/useAccordion.js.map +1 -1
  11. package/dist/components/accordion/AccordionContent/AccordionContent.js +25 -21
  12. package/dist/components/accordion/AccordionContent/AccordionContent.js.map +1 -1
  13. package/dist/components/accordion/AccordionContent/AccordionContent.styles.d.ts +5 -0
  14. package/dist/components/accordion/AccordionContent/AccordionContent.styles.js +9 -0
  15. package/dist/components/accordion/AccordionContent/AccordionContent.styles.js.map +1 -0
  16. package/dist/components/accordion/AccordionContent/index.d.ts +1 -0
  17. package/dist/components/accordion/AccordionItem/AccordionItem.context.js.map +1 -1
  18. package/dist/components/accordion/AccordionItem/AccordionItem.js +19 -18
  19. package/dist/components/accordion/AccordionItem/AccordionItem.js.map +1 -1
  20. package/dist/components/accordion/AccordionItem/AccordionItem.styles.d.ts +2 -0
  21. package/dist/components/accordion/AccordionItem/AccordionItem.styles.js +6 -0
  22. package/dist/components/accordion/AccordionItem/AccordionItem.styles.js.map +1 -0
  23. package/dist/components/accordion/AccordionItem/index.d.ts +1 -0
  24. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js +26 -18
  25. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.js.map +1 -1
  26. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.styles.d.ts +6 -0
  27. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.styles.js +10 -0
  28. package/dist/components/accordion/AccordionTrigger/AccordionTrigger.styles.js.map +1 -0
  29. package/dist/components/accordion/AccordionTrigger/index.d.ts +1 -0
  30. package/dist/components/accordion/index.d.ts +4 -4
  31. package/dist/components/accordion/index.js +6 -5
  32. package/dist/components/alert/Alert/Alert.js +1 -1
  33. package/dist/components/alert/Alert/Alert.js.map +1 -1
  34. package/dist/components/alert/Alert/Alert.styles.js +3 -3
  35. package/dist/components/alert/Alert/Alert.styles.js.map +1 -1
  36. package/dist/components/alert/AlertAction/AlertAction.js +2 -2
  37. package/dist/components/alert/AlertAction/AlertAction.js.map +1 -1
  38. package/dist/components/alert/AlertAction/AlertAction.styles.d.ts +2 -1
  39. package/dist/components/alert/AlertAction/AlertAction.styles.js +1 -1
  40. package/dist/components/alert/AlertAction/AlertAction.styles.js.map +1 -1
  41. package/dist/components/alert/AlertDescription/AlertDescription.js +2 -2
  42. package/dist/components/alert/AlertDescription/AlertDescription.js.map +1 -1
  43. package/dist/components/alert/AlertDescription/AlertDescription.styles.d.ts +2 -1
  44. package/dist/components/alert/AlertDescription/AlertDescription.styles.js +2 -2
  45. package/dist/components/alert/AlertDescription/AlertDescription.styles.js.map +1 -1
  46. package/dist/components/alert/AlertTitle/AlertTitle.js +2 -2
  47. package/dist/components/alert/AlertTitle/AlertTitle.js.map +1 -1
  48. package/dist/components/alert/AlertTitle/AlertTitle.styles.d.ts +2 -1
  49. package/dist/components/alert/AlertTitle/AlertTitle.styles.js +2 -2
  50. package/dist/components/alert/AlertTitle/AlertTitle.styles.js.map +1 -1
  51. package/dist/components/alert-dialog/AlertDialog/AlertDialog.context.js.map +1 -1
  52. package/dist/components/alert-dialog/AlertDialog/AlertDialog.js +1 -1
  53. package/dist/components/alert-dialog/AlertDialog/AlertDialog.js.map +1 -1
  54. package/dist/components/alert-dialog/AlertDialogAction/AlertDialogAction.js.map +1 -1
  55. package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js +3 -3
  56. package/dist/components/alert-dialog/AlertDialogCancel/AlertDialogCancel.js.map +1 -1
  57. package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.context.js.map +1 -1
  58. package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.js +11 -11
  59. package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.js.map +1 -1
  60. package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.styles.d.ts +2 -1
  61. package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.styles.js +2 -2
  62. package/dist/components/alert-dialog/AlertDialogContent/AlertDialogContent.styles.js.map +1 -1
  63. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js +2 -2
  64. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.js.map +1 -1
  65. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.styles.d.ts +2 -1
  66. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.styles.js +2 -2
  67. package/dist/components/alert-dialog/AlertDialogDescription/AlertDialogDescription.styles.js.map +1 -1
  68. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js +2 -2
  69. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.js.map +1 -1
  70. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.styles.d.ts +2 -1
  71. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.styles.js +2 -2
  72. package/dist/components/alert-dialog/AlertDialogFooter/AlertDialogFooter.styles.js.map +1 -1
  73. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js +2 -2
  74. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.js.map +1 -1
  75. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.styles.d.ts +2 -1
  76. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.styles.js +2 -2
  77. package/dist/components/alert-dialog/AlertDialogHeader/AlertDialogHeader.styles.js.map +1 -1
  78. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js +2 -2
  79. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.js.map +1 -1
  80. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.styles.d.ts +2 -1
  81. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.styles.js +2 -2
  82. package/dist/components/alert-dialog/AlertDialogMedia/AlertDialogMedia.styles.js.map +1 -1
  83. package/dist/components/alert-dialog/AlertDialogOverlay/AlertDialogOverlay.js +2 -2
  84. package/dist/components/alert-dialog/AlertDialogOverlay/AlertDialogOverlay.js.map +1 -1
  85. package/dist/components/alert-dialog/AlertDialogOverlay/AlertDialogOverlay.styles.d.ts +2 -1
  86. package/dist/components/alert-dialog/AlertDialogOverlay/AlertDialogOverlay.styles.js +2 -2
  87. package/dist/components/alert-dialog/AlertDialogOverlay/AlertDialogOverlay.styles.js.map +1 -1
  88. package/dist/components/alert-dialog/AlertDialogPortal/AlertDialogPortal.js +1 -1
  89. package/dist/components/alert-dialog/AlertDialogPortal/AlertDialogPortal.js.map +1 -1
  90. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js +2 -2
  91. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.js.map +1 -1
  92. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.styles.d.ts +2 -1
  93. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.styles.js +2 -2
  94. package/dist/components/alert-dialog/AlertDialogTitle/AlertDialogTitle.styles.js.map +1 -1
  95. package/dist/components/alert-dialog/AlertDialogTrigger/AlertDialogTrigger.js.map +1 -1
  96. package/dist/components/alert-dialog/AlertDialogTrigger/useAlertDialogTrigger.js.map +1 -1
  97. package/dist/components/aspect-ratio/AspectRatio.js +1 -1
  98. package/dist/components/aspect-ratio/AspectRatio.js.map +1 -1
  99. package/dist/components/aspect-ratio/AspectRatio.styles.js.map +1 -1
  100. package/dist/components/avatar/Avatar/Avatar.context.js.map +1 -1
  101. package/dist/components/avatar/Avatar/Avatar.js +9 -9
  102. package/dist/components/avatar/Avatar/Avatar.js.map +1 -1
  103. package/dist/components/avatar/AvatarBadge/AvatarBadge.js +1 -1
  104. package/dist/components/avatar/AvatarBadge/AvatarBadge.js.map +1 -1
  105. package/dist/components/avatar/AvatarFallback/AvatarFallback.js +1 -1
  106. package/dist/components/avatar/AvatarFallback/AvatarFallback.js.map +1 -1
  107. package/dist/components/avatar/AvatarGroup/AvatarGroup.js +1 -1
  108. package/dist/components/avatar/AvatarGroup/AvatarGroup.js.map +1 -1
  109. package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js +1 -1
  110. package/dist/components/avatar/AvatarGroupCount/AvatarGroupCount.js.map +1 -1
  111. package/dist/components/avatar/AvatarImage/AvatarImage.js +1 -1
  112. package/dist/components/avatar/AvatarImage/AvatarImage.js.map +1 -1
  113. package/dist/components/badge/Badge.js +1 -1
  114. package/dist/components/badge/Badge.js.map +1 -1
  115. package/dist/components/badge/Badge.styles.js +9 -10
  116. package/dist/components/badge/Badge.styles.js.map +1 -1
  117. package/dist/components/breadcrumb/Breadcrumb/Breadcrumb.js +1 -1
  118. package/dist/components/breadcrumb/Breadcrumb/Breadcrumb.js.map +1 -1
  119. package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js +1 -1
  120. package/dist/components/breadcrumb/BreadcrumbEllipsis/BreadcrumbEllipsis.js.map +1 -1
  121. package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js +1 -1
  122. package/dist/components/breadcrumb/BreadcrumbItem/BreadcrumbItem.js.map +1 -1
  123. package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js +6 -6
  124. package/dist/components/breadcrumb/BreadcrumbLink/BreadcrumbLink.js.map +1 -1
  125. package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js +1 -1
  126. package/dist/components/breadcrumb/BreadcrumbList/BreadcrumbList.js.map +1 -1
  127. package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js +1 -1
  128. package/dist/components/breadcrumb/BreadcrumbPage/BreadcrumbPage.js.map +1 -1
  129. package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js +1 -1
  130. package/dist/components/breadcrumb/BreadcrumbSeparator/BreadcrumbSeparator.js.map +1 -1
  131. package/dist/components/button/Button.js +34 -31
  132. package/dist/components/button/Button.js.map +1 -1
  133. package/dist/components/button/Button.styles.d.ts +1 -1
  134. package/dist/components/button/Button.styles.js +10 -10
  135. package/dist/components/button/Button.styles.js.map +1 -1
  136. package/dist/components/button/Button.types.d.ts +4 -30
  137. package/dist/components/button-group/ButtonGroup/ButtonGroup.js +1 -1
  138. package/dist/components/button-group/ButtonGroup/ButtonGroup.js.map +1 -1
  139. package/dist/components/button-group/ButtonGroup/ButtonGroup.styles.js.map +1 -1
  140. package/dist/components/button-group/ButtonGroupSeparator/ButtonGroupSeparator.js +1 -1
  141. package/dist/components/button-group/ButtonGroupSeparator/ButtonGroupSeparator.js.map +1 -1
  142. package/dist/components/button-group/ButtonGroupSeparator/ButtonGroupSeparator.styles.d.ts +2 -1
  143. package/dist/components/button-group/ButtonGroupSeparator/ButtonGroupSeparator.styles.js +2 -3
  144. package/dist/components/button-group/ButtonGroupSeparator/ButtonGroupSeparator.styles.js.map +1 -1
  145. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js +2 -2
  146. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.js.map +1 -1
  147. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.styles.d.ts +2 -1
  148. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.styles.js +2 -3
  149. package/dist/components/button-group/ButtonGroupText/ButtonGroupText.styles.js.map +1 -1
  150. package/dist/components/card/Card/Card.js +6 -6
  151. package/dist/components/card/Card/Card.js.map +1 -1
  152. package/dist/components/card/Card/Card.styles.d.ts +2 -1
  153. package/dist/components/card/Card/Card.styles.js +2 -2
  154. package/dist/components/card/Card/Card.styles.js.map +1 -1
  155. package/dist/components/card/CardAction/CardAction.js +2 -2
  156. package/dist/components/card/CardAction/CardAction.js.map +1 -1
  157. package/dist/components/card/CardAction/CardAction.styles.d.ts +2 -1
  158. package/dist/components/card/CardAction/CardAction.styles.js +1 -1
  159. package/dist/components/card/CardAction/CardAction.styles.js.map +1 -1
  160. package/dist/components/card/CardContent/CardContent.js +2 -2
  161. package/dist/components/card/CardContent/CardContent.js.map +1 -1
  162. package/dist/components/card/CardContent/CardContent.styles.d.ts +2 -1
  163. package/dist/components/card/CardContent/CardContent.styles.js +2 -2
  164. package/dist/components/card/CardContent/CardContent.styles.js.map +1 -1
  165. package/dist/components/card/CardDescription/CardDescription.js +2 -2
  166. package/dist/components/card/CardDescription/CardDescription.js.map +1 -1
  167. package/dist/components/card/CardDescription/CardDescription.styles.d.ts +2 -1
  168. package/dist/components/card/CardDescription/CardDescription.styles.js +2 -2
  169. package/dist/components/card/CardDescription/CardDescription.styles.js.map +1 -1
  170. package/dist/components/card/CardFooter/CardFooter.js +2 -2
  171. package/dist/components/card/CardFooter/CardFooter.js.map +1 -1
  172. package/dist/components/card/CardFooter/CardFooter.styles.d.ts +2 -1
  173. package/dist/components/card/CardFooter/CardFooter.styles.js +2 -2
  174. package/dist/components/card/CardFooter/CardFooter.styles.js.map +1 -1
  175. package/dist/components/card/CardHeader/CardHeader.js +2 -2
  176. package/dist/components/card/CardHeader/CardHeader.js.map +1 -1
  177. package/dist/components/card/CardHeader/CardHeader.styles.d.ts +2 -1
  178. package/dist/components/card/CardHeader/CardHeader.styles.js +2 -2
  179. package/dist/components/card/CardHeader/CardHeader.styles.js.map +1 -1
  180. package/dist/components/card/CardTitle/CardTitle.js +2 -2
  181. package/dist/components/card/CardTitle/CardTitle.js.map +1 -1
  182. package/dist/components/card/CardTitle/CardTitle.styles.d.ts +2 -1
  183. package/dist/components/card/CardTitle/CardTitle.styles.js +1 -1
  184. package/dist/components/card/CardTitle/CardTitle.styles.js.map +1 -1
  185. package/dist/components/carousel/Carousel/Carousel.context.js.map +1 -1
  186. package/dist/components/carousel/Carousel/Carousel.js +14 -13
  187. package/dist/components/carousel/Carousel/Carousel.js.map +1 -1
  188. package/dist/components/carousel/Carousel/Carousel.styles.d.ts +2 -0
  189. package/dist/components/carousel/Carousel/Carousel.styles.js +6 -0
  190. package/dist/components/carousel/Carousel/Carousel.styles.js.map +1 -0
  191. package/dist/components/carousel/Carousel/useAutoPlay.js.map +1 -1
  192. package/dist/components/carousel/Carousel/useCarousel.js.map +1 -1
  193. package/dist/components/carousel/Carousel/useKeyboardNavigation.js.map +1 -1
  194. package/dist/components/carousel/CarouselContent/CarouselContent.js +1 -1
  195. package/dist/components/carousel/CarouselContent/CarouselContent.js.map +1 -1
  196. package/dist/components/carousel/CarouselContent/useItemSizeMeasure.js.map +1 -1
  197. package/dist/components/carousel/CarouselDots/CarouselDots.js +1 -1
  198. package/dist/components/carousel/CarouselDots/CarouselDots.js.map +1 -1
  199. package/dist/components/carousel/CarouselItem/CarouselItem.js +4 -3
  200. package/dist/components/carousel/CarouselItem/CarouselItem.js.map +1 -1
  201. package/dist/components/carousel/CarouselNext/CarouselNext.js +4 -4
  202. package/dist/components/carousel/CarouselNext/CarouselNext.js.map +1 -1
  203. package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js +4 -4
  204. package/dist/components/carousel/CarouselPrevious/CarouselPrevious.js.map +1 -1
  205. package/dist/components/checkbox/Checkbox/Checkbox.js +18 -18
  206. package/dist/components/checkbox/Checkbox/Checkbox.js.map +1 -1
  207. package/dist/components/checkbox/Checkbox/Checkbox.styles.js.map +1 -1
  208. package/dist/components/checkbox/CheckboxIndicator/CheckboxIndicator.js +1 -1
  209. package/dist/components/checkbox/CheckboxIndicator/CheckboxIndicator.js.map +1 -1
  210. package/dist/components/collapsible/Collapsible/Collapsible.context.js.map +1 -1
  211. package/dist/components/collapsible/Collapsible/Collapsible.js +1 -1
  212. package/dist/components/collapsible/Collapsible/Collapsible.js.map +1 -1
  213. package/dist/components/collapsible/CollapsibleContent/CollapsibleContent.js +1 -1
  214. package/dist/components/collapsible/CollapsibleContent/CollapsibleContent.js.map +1 -1
  215. package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js +1 -1
  216. package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.js.map +1 -1
  217. package/dist/components/collapsible/CollapsibleTrigger/CollapsibleTrigger.types.d.ts +1 -1
  218. package/dist/components/dialog/Dialog/Dialog.context.js.map +1 -1
  219. package/dist/components/dialog/Dialog/Dialog.js +1 -1
  220. package/dist/components/dialog/Dialog/Dialog.js.map +1 -1
  221. package/dist/components/dialog/DialogClose/DialogClose.js +4 -6
  222. package/dist/components/dialog/DialogClose/DialogClose.js.map +1 -1
  223. package/dist/components/dialog/DialogClose/DialogClose.types.d.ts +2 -2
  224. package/dist/components/dialog/DialogContent/DialogContent.context.js.map +1 -1
  225. package/dist/components/dialog/DialogContent/DialogContent.js +10 -10
  226. package/dist/components/dialog/DialogContent/DialogContent.js.map +1 -1
  227. package/dist/components/dialog/DialogDescription/DialogDescription.js +1 -1
  228. package/dist/components/dialog/DialogDescription/DialogDescription.js.map +1 -1
  229. package/dist/components/dialog/DialogFooter/DialogFooter.js +1 -1
  230. package/dist/components/dialog/DialogFooter/DialogFooter.js.map +1 -1
  231. package/dist/components/dialog/DialogHeader/DialogHeader.js +1 -1
  232. package/dist/components/dialog/DialogHeader/DialogHeader.js.map +1 -1
  233. package/dist/components/dialog/DialogOverlay/DialogOverlay.js +1 -1
  234. package/dist/components/dialog/DialogOverlay/DialogOverlay.js.map +1 -1
  235. package/dist/components/dialog/DialogPortal/DialogPortal.js +1 -1
  236. package/dist/components/dialog/DialogPortal/DialogPortal.js.map +1 -1
  237. package/dist/components/dialog/DialogTitle/DialogTitle.js +1 -1
  238. package/dist/components/dialog/DialogTitle/DialogTitle.js.map +1 -1
  239. package/dist/components/dialog/DialogTrigger/DialogTrigger.js.map +1 -1
  240. package/dist/components/dialog/DialogTrigger/useDialogTrigger.js.map +1 -1
  241. package/dist/components/field/Field/Field.js +5 -5
  242. package/dist/components/field/Field/Field.js.map +1 -1
  243. package/dist/components/field/Field/Field.styles.js +1 -1
  244. package/dist/components/field/Field/Field.styles.js.map +1 -1
  245. package/dist/components/field/FieldContent/FieldContent.js +1 -1
  246. package/dist/components/field/FieldContent/FieldContent.js.map +1 -1
  247. package/dist/components/field/FieldDescription/FieldDescription.js +2 -2
  248. package/dist/components/field/FieldDescription/FieldDescription.js.map +1 -1
  249. package/dist/components/field/FieldError/FieldError.js +2 -2
  250. package/dist/components/field/FieldError/FieldError.js.map +1 -1
  251. package/dist/components/field/FieldGroup/FieldGroup.js +1 -1
  252. package/dist/components/field/FieldGroup/FieldGroup.js.map +1 -1
  253. package/dist/components/field/FieldLabel/FieldLabel.js +1 -1
  254. package/dist/components/field/FieldLabel/FieldLabel.js.map +1 -1
  255. package/dist/components/field/FieldLegend/FieldLegend.js +5 -5
  256. package/dist/components/field/FieldLegend/FieldLegend.js.map +1 -1
  257. package/dist/components/field/FieldSeparator/FieldSeparator.js +14 -14
  258. package/dist/components/field/FieldSeparator/FieldSeparator.js.map +1 -1
  259. package/dist/components/field/FieldSet/FieldSet.js +1 -1
  260. package/dist/components/field/FieldSet/FieldSet.js.map +1 -1
  261. package/dist/components/field/FieldTitle/FieldTitle.js +1 -1
  262. package/dist/components/field/FieldTitle/FieldTitle.js.map +1 -1
  263. package/dist/components/image/Image.config.js +1 -1
  264. package/dist/components/image/Image.config.js.map +1 -1
  265. package/dist/components/image/Image.js +13 -13
  266. package/dist/components/image/Image.js.map +1 -1
  267. package/dist/components/image/Image.utils.js +67 -67
  268. package/dist/components/image/Image.utils.js.map +1 -1
  269. package/dist/components/image/ImageElement.js +19 -19
  270. package/dist/components/image/ImageElement.js.map +1 -1
  271. package/dist/components/image/ImagePreload.js +1 -1
  272. package/dist/components/image/ImagePreload.js.map +1 -1
  273. package/dist/components/input/Input.js +13 -13
  274. package/dist/components/input/Input.js.map +1 -1
  275. package/dist/components/input-group/InputGroup/InputGroup.js +2 -2
  276. package/dist/components/input-group/InputGroup/InputGroup.js.map +1 -1
  277. package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js +5 -5
  278. package/dist/components/input-group/InputGroupAddon/InputGroupAddon.js.map +1 -1
  279. package/dist/components/input-group/InputGroupAddon/InputGroupAddon.styles.js +1 -1
  280. package/dist/components/input-group/InputGroupAddon/InputGroupAddon.styles.js.map +1 -1
  281. package/dist/components/input-group/InputGroupButton/InputGroupButton.js +9 -9
  282. package/dist/components/input-group/InputGroupButton/InputGroupButton.js.map +1 -1
  283. package/dist/components/input-group/InputGroupButton/InputGroupButton.styles.js.map +1 -1
  284. package/dist/components/input-group/InputGroupButton/InputGroupButton.types.d.ts +2 -3
  285. package/dist/components/input-group/InputGroupInput/InputGroupInput.js.map +1 -1
  286. package/dist/components/input-group/InputGroupText/InputGroupText.js +2 -2
  287. package/dist/components/input-group/InputGroupText/InputGroupText.js.map +1 -1
  288. package/dist/components/input-group/InputGroupTextarea/InputGroupTextarea.js.map +1 -1
  289. package/dist/components/item/Item/Item.js +9 -9
  290. package/dist/components/item/Item/Item.js.map +1 -1
  291. package/dist/components/item/Item/Item.styles.js +3 -3
  292. package/dist/components/item/Item/Item.styles.js.map +1 -1
  293. package/dist/components/item/ItemActions/ItemActions.js +1 -1
  294. package/dist/components/item/ItemActions/ItemActions.js.map +1 -1
  295. package/dist/components/item/ItemContent/ItemContent.js +1 -1
  296. package/dist/components/item/ItemContent/ItemContent.js.map +1 -1
  297. package/dist/components/item/ItemDescription/ItemDescription.js +2 -2
  298. package/dist/components/item/ItemDescription/ItemDescription.js.map +1 -1
  299. package/dist/components/item/ItemFooter/ItemFooter.js +1 -1
  300. package/dist/components/item/ItemFooter/ItemFooter.js.map +1 -1
  301. package/dist/components/item/ItemGroup/ItemGroup.js +1 -1
  302. package/dist/components/item/ItemGroup/ItemGroup.js.map +1 -1
  303. package/dist/components/item/ItemHeader/ItemHeader.js +1 -1
  304. package/dist/components/item/ItemHeader/ItemHeader.js.map +1 -1
  305. package/dist/components/item/ItemMedia/ItemMedia.js +5 -5
  306. package/dist/components/item/ItemMedia/ItemMedia.js.map +1 -1
  307. package/dist/components/item/ItemMedia/ItemMedia.styles.js.map +1 -1
  308. package/dist/components/item/ItemSeparator/ItemSeparator.js.map +1 -1
  309. package/dist/components/item/ItemTitle/ItemTitle.js +1 -1
  310. package/dist/components/item/ItemTitle/ItemTitle.js.map +1 -1
  311. package/dist/components/kbd/Kbd.js +2 -2
  312. package/dist/components/kbd/Kbd.js.map +1 -1
  313. package/dist/components/label/Label.js +1 -1
  314. package/dist/components/label/Label.js.map +1 -1
  315. package/dist/components/pagination/Pagination/Pagination.js +1 -1
  316. package/dist/components/pagination/Pagination/Pagination.js.map +1 -1
  317. package/dist/components/pagination/PaginationContent/PaginationContent.js +1 -1
  318. package/dist/components/pagination/PaginationContent/PaginationContent.js.map +1 -1
  319. package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js +1 -1
  320. package/dist/components/pagination/PaginationEllipsis/PaginationEllipsis.js.map +1 -1
  321. package/dist/components/pagination/PaginationItem/PaginationItem.js +1 -1
  322. package/dist/components/pagination/PaginationItem/PaginationItem.js.map +1 -1
  323. package/dist/components/pagination/PaginationLink/PaginationLink.js +13 -10
  324. package/dist/components/pagination/PaginationLink/PaginationLink.js.map +1 -1
  325. package/dist/components/pagination/PaginationNext/PaginationNext.js +5 -5
  326. package/dist/components/pagination/PaginationNext/PaginationNext.js.map +1 -1
  327. package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js +5 -5
  328. package/dist/components/pagination/PaginationPrevious/PaginationPrevious.js.map +1 -1
  329. package/dist/components/progress/Progress/Progress.context.js.map +1 -1
  330. package/dist/components/progress/Progress/Progress.js +1 -1
  331. package/dist/components/progress/Progress/Progress.js.map +1 -1
  332. package/dist/components/progress/ProgressIndicator/ProgressIndicator.js +1 -1
  333. package/dist/components/progress/ProgressIndicator/ProgressIndicator.js.map +1 -1
  334. package/dist/components/progress/ProgressIndicator/ProgressIndicator.styles.d.ts +1 -1
  335. package/dist/components/progress/ProgressIndicator/ProgressIndicator.styles.js +1 -1
  336. package/dist/components/progress/ProgressIndicator/ProgressIndicator.styles.js.map +1 -1
  337. package/dist/components/progress/ProgressLabel/ProgressLabel.js +1 -1
  338. package/dist/components/progress/ProgressLabel/ProgressLabel.js.map +1 -1
  339. package/dist/components/progress/ProgressTrack/ProgressTrack.js +1 -1
  340. package/dist/components/progress/ProgressTrack/ProgressTrack.js.map +1 -1
  341. package/dist/components/progress/ProgressTrack/ProgressTrack.styles.d.ts +1 -1
  342. package/dist/components/progress/ProgressTrack/ProgressTrack.styles.js +1 -1
  343. package/dist/components/progress/ProgressTrack/ProgressTrack.styles.js.map +1 -1
  344. package/dist/components/progress/ProgressValue/ProgressValue.js +1 -1
  345. package/dist/components/progress/ProgressValue/ProgressValue.js.map +1 -1
  346. package/dist/components/progress/ProgressValue/ProgressValue.styles.d.ts +1 -1
  347. package/dist/components/progress/ProgressValue/ProgressValue.styles.js +1 -1
  348. package/dist/components/progress/ProgressValue/ProgressValue.styles.js.map +1 -1
  349. package/dist/components/scroll-area/ScrollArea/ScrollArea.context.js.map +1 -1
  350. package/dist/components/scroll-area/ScrollArea/ScrollArea.js +2 -2
  351. package/dist/components/scroll-area/ScrollArea/ScrollArea.js.map +1 -1
  352. package/dist/components/scroll-area/ScrollArea/ScrollArea.utils.js.map +1 -1
  353. package/dist/components/scroll-area/ScrollBar/ScrollBar.js +26 -26
  354. package/dist/components/scroll-area/ScrollBar/ScrollBar.js.map +1 -1
  355. package/dist/components/separator/Separator.js +7 -7
  356. package/dist/components/separator/Separator.js.map +1 -1
  357. package/dist/components/separator/Separator.styles.js +1 -1
  358. package/dist/components/separator/Separator.styles.js.map +1 -1
  359. package/dist/components/sidebar/Sidebar/Sidebar.js +10 -10
  360. package/dist/components/sidebar/Sidebar/Sidebar.js.map +1 -1
  361. package/dist/components/sidebar/Sidebar/index.d.ts +1 -0
  362. package/dist/components/sidebar/SidebarContent/SidebarContent.js +1 -1
  363. package/dist/components/sidebar/SidebarContent/SidebarContent.js.map +1 -1
  364. package/dist/components/sidebar/SidebarContent/index.d.ts +1 -0
  365. package/dist/components/sidebar/SidebarFooter/SidebarFooter.js +1 -1
  366. package/dist/components/sidebar/SidebarFooter/SidebarFooter.js.map +1 -1
  367. package/dist/components/sidebar/SidebarFooter/index.d.ts +1 -0
  368. package/dist/components/sidebar/SidebarGroup/SidebarGroup.js +1 -1
  369. package/dist/components/sidebar/SidebarGroup/SidebarGroup.js.map +1 -1
  370. package/dist/components/sidebar/SidebarGroup/index.d.ts +1 -0
  371. package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js +5 -5
  372. package/dist/components/sidebar/SidebarGroupAction/SidebarGroupAction.js.map +1 -1
  373. package/dist/components/sidebar/SidebarGroupAction/index.d.ts +1 -0
  374. package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js +1 -1
  375. package/dist/components/sidebar/SidebarGroupContent/SidebarGroupContent.js.map +1 -1
  376. package/dist/components/sidebar/SidebarGroupContent/index.d.ts +1 -0
  377. package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js +5 -5
  378. package/dist/components/sidebar/SidebarGroupLabel/SidebarGroupLabel.js.map +1 -1
  379. package/dist/components/sidebar/SidebarGroupLabel/index.d.ts +1 -0
  380. package/dist/components/sidebar/SidebarHeader/SidebarHeader.js +1 -1
  381. package/dist/components/sidebar/SidebarHeader/SidebarHeader.js.map +1 -1
  382. package/dist/components/sidebar/SidebarHeader/index.d.ts +1 -0
  383. package/dist/components/sidebar/SidebarInput/SidebarInput.js +1 -1
  384. package/dist/components/sidebar/SidebarInput/SidebarInput.js.map +1 -1
  385. package/dist/components/sidebar/SidebarInput/index.d.ts +1 -0
  386. package/dist/components/sidebar/SidebarInset/SidebarInset.js +2 -2
  387. package/dist/components/sidebar/SidebarInset/SidebarInset.js.map +1 -1
  388. package/dist/components/sidebar/SidebarInset/index.d.ts +1 -0
  389. package/dist/components/sidebar/SidebarMenu/SidebarMenu.js +1 -1
  390. package/dist/components/sidebar/SidebarMenu/SidebarMenu.js.map +1 -1
  391. package/dist/components/sidebar/SidebarMenu/index.d.ts +1 -0
  392. package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js +2 -2
  393. package/dist/components/sidebar/SidebarMenuBadge/SidebarMenuBadge.js.map +1 -1
  394. package/dist/components/sidebar/SidebarMenuBadge/index.d.ts +1 -0
  395. package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js +47 -31
  396. package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.js.map +1 -1
  397. package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.styles.js +5 -6
  398. package/dist/components/sidebar/SidebarMenuButton/SidebarMenuButton.styles.js.map +1 -1
  399. package/dist/components/sidebar/SidebarMenuButton/index.d.ts +1 -0
  400. package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js +1 -1
  401. package/dist/components/sidebar/SidebarMenuItem/SidebarMenuItem.js.map +1 -1
  402. package/dist/components/sidebar/SidebarMenuItem/index.d.ts +1 -0
  403. package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js +7 -7
  404. package/dist/components/sidebar/SidebarMenuSkeleton/SidebarMenuSkeleton.js.map +1 -1
  405. package/dist/components/sidebar/SidebarMenuSkeleton/index.d.ts +1 -0
  406. package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js +2 -2
  407. package/dist/components/sidebar/SidebarMenuSub/SidebarMenuSub.js.map +1 -1
  408. package/dist/components/sidebar/SidebarMenuSub/index.d.ts +1 -0
  409. package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js +9 -9
  410. package/dist/components/sidebar/SidebarMenuSubButton/SidebarMenuSubButton.js.map +1 -1
  411. package/dist/components/sidebar/SidebarMenuSubButton/index.d.ts +1 -0
  412. package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js +1 -1
  413. package/dist/components/sidebar/SidebarMenuSubItem/SidebarMenuSubItem.js.map +1 -1
  414. package/dist/components/sidebar/SidebarMenuSubItem/index.d.ts +1 -0
  415. package/dist/components/sidebar/SidebarProvider/SidebarProvider.consts.js +1 -1
  416. package/dist/components/sidebar/SidebarProvider/SidebarProvider.consts.js.map +1 -1
  417. package/dist/components/sidebar/SidebarProvider/SidebarProvider.context.js.map +1 -1
  418. package/dist/components/sidebar/SidebarProvider/SidebarProvider.js +17 -17
  419. package/dist/components/sidebar/SidebarProvider/SidebarProvider.js.map +1 -1
  420. package/dist/components/sidebar/SidebarRail/SidebarRail.js +2 -2
  421. package/dist/components/sidebar/SidebarRail/SidebarRail.js.map +1 -1
  422. package/dist/components/sidebar/SidebarRail/index.d.ts +1 -0
  423. package/dist/components/sidebar/SidebarSeparator/SidebarSeparator.js.map +1 -1
  424. package/dist/components/sidebar/SidebarSeparator/index.d.ts +1 -0
  425. package/dist/components/sidebar/SidebarTrigger/SidebarTrigger.js.map +1 -1
  426. package/dist/components/sidebar/SidebarTrigger/index.d.ts +1 -0
  427. package/dist/components/sidebar/index.d.ts +21 -21
  428. package/dist/components/skeleton/Skeleton.js +2 -2
  429. package/dist/components/skeleton/Skeleton.js.map +1 -1
  430. package/dist/components/slider/Slider/Slider.context.js.map +1 -1
  431. package/dist/components/slider/Slider/Slider.js +10 -10
  432. package/dist/components/slider/Slider/Slider.js.map +1 -1
  433. package/dist/components/slider/Slider/useSlider.js.map +1 -1
  434. package/dist/components/slider/SliderControl/SliderControl.js +1 -1
  435. package/dist/components/slider/SliderControl/SliderControl.js.map +1 -1
  436. package/dist/components/slider/SliderControl/useSliderControl.js.map +1 -1
  437. package/dist/components/slider/SliderIndicator/SliderIndicator.js +1 -1
  438. package/dist/components/slider/SliderIndicator/SliderIndicator.js.map +1 -1
  439. package/dist/components/slider/SliderIndicator/SliderIndicator.styles.js +1 -1
  440. package/dist/components/slider/SliderIndicator/SliderIndicator.styles.js.map +1 -1
  441. package/dist/components/slider/SliderIndicator/useSliderIndicator.js.map +1 -1
  442. package/dist/components/slider/SliderThumb/SliderThumb.js +1 -1
  443. package/dist/components/slider/SliderThumb/SliderThumb.js.map +1 -1
  444. package/dist/components/slider/SliderThumb/SliderThumb.styles.js +1 -1
  445. package/dist/components/slider/SliderThumb/SliderThumb.styles.js.map +1 -1
  446. package/dist/components/slider/SliderThumb/useSliderThumb.js.map +1 -1
  447. package/dist/components/slider/SliderTrack/SliderTrack.js +1 -1
  448. package/dist/components/slider/SliderTrack/SliderTrack.js.map +1 -1
  449. package/dist/components/slider/SliderTrack/SliderTrack.styles.d.ts +1 -1
  450. package/dist/components/slider/SliderTrack/SliderTrack.styles.js +1 -1
  451. package/dist/components/slider/SliderTrack/SliderTrack.styles.js.map +1 -1
  452. package/dist/components/spinner/Spinner.js.map +1 -1
  453. package/dist/components/spinner/Spinner.styles.js.map +1 -1
  454. package/dist/components/switch/Switch.js +19 -19
  455. package/dist/components/switch/Switch.js.map +1 -1
  456. package/dist/components/switch/Switch.styles.js +2 -2
  457. package/dist/components/switch/Switch.styles.js.map +1 -1
  458. package/dist/components/textarea/Textarea.js +2 -2
  459. package/dist/components/textarea/Textarea.js.map +1 -1
  460. package/dist/components/toast/components/Assets.js +1 -1
  461. package/dist/components/toast/components/Assets.js.map +1 -1
  462. package/dist/components/toast/components/Toast.js +2 -5
  463. package/dist/components/toast/components/Toast.js.map +1 -1
  464. package/dist/components/toast/components/ToastActions.js +1 -1
  465. package/dist/components/toast/components/ToastActions.js.map +1 -1
  466. package/dist/components/toast/components/ToastContent.js +1 -1
  467. package/dist/components/toast/components/ToastContent.js.map +1 -1
  468. package/dist/components/toast/components/ToastIcon.js +1 -1
  469. package/dist/components/toast/components/ToastIcon.js.map +1 -1
  470. package/dist/components/toast/components/Toaster.js +1 -1
  471. package/dist/components/toast/components/Toaster.js.map +1 -1
  472. package/dist/components/toast/hooks/useSwipe.js.map +1 -1
  473. package/dist/components/toast/hooks/useTheme.js.map +1 -1
  474. package/dist/components/toast/hooks/useToastHeight.js.map +1 -1
  475. package/dist/components/toast/hooks/useToastSubscription.js +3 -2
  476. package/dist/components/toast/hooks/useToastSubscription.js.map +1 -1
  477. package/dist/components/toast/hooks/useToastTimer.js.map +1 -1
  478. package/dist/components/toast/hooks/useToasterKeyboard.js.map +1 -1
  479. package/dist/components/toast/hooks.js +3 -2
  480. package/dist/components/toast/hooks.js.map +1 -1
  481. package/dist/components/toast/state.js +5 -5
  482. package/dist/components/toast/state.js.map +1 -1
  483. package/dist/components/toast/utils.js.map +1 -1
  484. package/dist/components/tooltip/Tooltip/Tooltip.context.d.ts +2 -11
  485. package/dist/components/tooltip/Tooltip/Tooltip.context.js +4 -4
  486. package/dist/components/tooltip/Tooltip/Tooltip.context.js.map +1 -1
  487. package/dist/components/tooltip/Tooltip/Tooltip.d.ts +21 -5
  488. package/dist/components/tooltip/Tooltip/Tooltip.js +60 -23
  489. package/dist/components/tooltip/Tooltip/Tooltip.js.map +1 -1
  490. package/dist/components/tooltip/Tooltip/Tooltip.types.d.ts +58 -0
  491. package/dist/components/tooltip/Tooltip/index.d.ts +2 -0
  492. package/dist/components/tooltip/TooltipArrow/TooltipArrow.d.ts +34 -1
  493. package/dist/components/tooltip/TooltipArrow/TooltipArrow.js +48 -12
  494. package/dist/components/tooltip/TooltipArrow/TooltipArrow.js.map +1 -1
  495. package/dist/components/tooltip/TooltipArrow/index.d.ts +1 -0
  496. package/dist/components/tooltip/TooltipContent/TooltipContent.context.d.ts +19 -5
  497. package/dist/components/tooltip/TooltipContent/TooltipContent.context.js +4 -4
  498. package/dist/components/tooltip/TooltipContent/TooltipContent.context.js.map +1 -1
  499. package/dist/components/tooltip/TooltipContent/TooltipContent.d.ts +10 -1
  500. package/dist/components/tooltip/TooltipContent/TooltipContent.js +60 -46
  501. package/dist/components/tooltip/TooltipContent/TooltipContent.js.map +1 -1
  502. package/dist/components/tooltip/TooltipContent/TooltipContent.types.d.ts +13 -3
  503. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.d.ts +57 -6
  504. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js +34 -58
  505. package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js.map +1 -1
  506. package/dist/components/tooltip/TooltipContent/index.d.ts +7 -0
  507. package/dist/components/tooltip/TooltipContent/useTooltipContent.d.ts +45 -8
  508. package/dist/components/tooltip/TooltipContent/useTooltipContent.js +70 -41
  509. package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
  510. package/dist/components/tooltip/TooltipGroup/TooltipGroup.context.d.ts +29 -0
  511. package/dist/components/tooltip/TooltipGroup/TooltipGroup.context.js +10 -0
  512. package/dist/components/tooltip/TooltipGroup/TooltipGroup.context.js.map +1 -0
  513. package/dist/components/tooltip/TooltipGroup/TooltipGroup.d.ts +2 -0
  514. package/dist/components/tooltip/TooltipGroup/TooltipGroup.js +25 -0
  515. package/dist/components/tooltip/TooltipGroup/TooltipGroup.js.map +1 -0
  516. package/dist/components/tooltip/TooltipGroup/TooltipGroup.types.d.ts +10 -0
  517. package/dist/components/tooltip/TooltipGroup/index.d.ts +4 -0
  518. package/dist/components/tooltip/TooltipTrigger/TooltipTrigger.d.ts +4 -2
  519. package/dist/components/tooltip/TooltipTrigger/TooltipTrigger.js +26 -6
  520. package/dist/components/tooltip/TooltipTrigger/TooltipTrigger.js.map +1 -1
  521. package/dist/components/tooltip/TooltipTrigger/TooltipTrigger.types.d.ts +3 -0
  522. package/dist/components/tooltip/TooltipTrigger/index.d.ts +3 -0
  523. package/dist/components/tooltip/TooltipTrigger/useTooltipTrigger.d.ts +29 -2
  524. package/dist/components/tooltip/TooltipTrigger/useTooltipTrigger.js +27 -27
  525. package/dist/components/tooltip/TooltipTrigger/useTooltipTrigger.js.map +1 -1
  526. package/dist/components/tooltip/index.d.ts +6 -0
  527. package/dist/components/tooltip/index.js +2 -1
  528. package/dist/hooks/useFontLoader.js +1 -1
  529. package/dist/hooks/useFontLoader.js.map +1 -1
  530. package/dist/index.js +155 -152
  531. package/dist/lib/index.d.ts +1 -0
  532. package/dist/lib/positioner/auto-update.d.ts +19 -0
  533. package/dist/lib/positioner/auto-update.js +20 -0
  534. package/dist/lib/positioner/auto-update.js.map +1 -0
  535. package/dist/lib/positioner/core/compute-position.d.ts +9 -0
  536. package/dist/lib/positioner/core/compute-position.js +47 -0
  537. package/dist/lib/positioner/core/compute-position.js.map +1 -0
  538. package/dist/lib/positioner/core/placement.d.ts +14 -0
  539. package/dist/lib/positioner/core/placement.js +45 -0
  540. package/dist/lib/positioner/core/placement.js.map +1 -0
  541. package/dist/lib/positioner/create-positioner.d.ts +63 -0
  542. package/dist/lib/positioner/create-positioner.js +51 -0
  543. package/dist/lib/positioner/create-positioner.js.map +1 -0
  544. package/dist/lib/positioner/index.d.ts +11 -0
  545. package/dist/lib/positioner/middleware/arrow.d.ts +23 -0
  546. package/dist/lib/positioner/middleware/arrow.js +23 -0
  547. package/dist/lib/positioner/middleware/arrow.js.map +1 -0
  548. package/dist/lib/positioner/middleware/containing-block-offset.d.ts +27 -0
  549. package/dist/lib/positioner/middleware/containing-block-offset.js +46 -0
  550. package/dist/lib/positioner/middleware/containing-block-offset.js.map +1 -0
  551. package/dist/lib/positioner/middleware/flip.d.ts +9 -0
  552. package/dist/lib/positioner/middleware/flip.js +54 -0
  553. package/dist/lib/positioner/middleware/flip.js.map +1 -0
  554. package/dist/lib/positioner/middleware/hide.d.ts +22 -0
  555. package/dist/lib/positioner/middleware/hide.js +19 -0
  556. package/dist/lib/positioner/middleware/hide.js.map +1 -0
  557. package/dist/lib/positioner/middleware/index.d.ts +13 -0
  558. package/dist/lib/positioner/middleware/offset.d.ts +10 -0
  559. package/dist/lib/positioner/middleware/offset.js +21 -0
  560. package/dist/lib/positioner/middleware/offset.js.map +1 -0
  561. package/dist/lib/positioner/middleware/shift.d.ts +13 -0
  562. package/dist/lib/positioner/middleware/shift.js +30 -0
  563. package/dist/lib/positioner/middleware/shift.js.map +1 -0
  564. package/dist/lib/positioner/middleware/size.d.ts +13 -0
  565. package/dist/lib/positioner/types.d.ts +74 -0
  566. package/dist/lib/positioner/utils/dom.d.ts +16 -0
  567. package/dist/lib/positioner/utils/dom.js +43 -0
  568. package/dist/lib/positioner/utils/dom.js.map +1 -0
  569. package/dist/lib/positioner/virtual-element.d.ts +21 -0
  570. package/dist/types/props.types.d.ts +10 -9
  571. package/dist/ui.css +2 -2
  572. package/dist/utils/clsx.js.map +1 -1
  573. package/dist/utils/index.d.ts +1 -0
  574. package/dist/utils/index.js +3 -2
  575. package/dist/utils/logger.d.ts +73 -0
  576. package/dist/utils/logger.js +37 -0
  577. package/dist/utils/logger.js.map +1 -0
  578. package/dist/utils/warn-once.js.map +1 -1
  579. package/package.json +13 -12
  580. package/dist/components/alert-dialog/AlertDialog/AlertDialog.styles.d.ts +0 -0
  581. package/dist/components/carousel/CarouselContent/CarouselContent.styles.d.ts +0 -0
@@ -50,6 +50,6 @@ function a(e, t) {
50
50
  };
51
51
  }
52
52
  //#endregion
53
- export { n as imageConfigDefault, a as resolveConfig, i as useImageConfig };
53
+ export { r as ImageConfigContext, n as imageConfigDefault, a as resolveConfig, i as useImageConfig };
54
54
 
55
55
  //# sourceMappingURL=Image.config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.config.js","names":[],"sources":["../../../src/components/image/Image.config.ts"],"sourcesContent":["/**\n * image-config.ts\n * 单一职责:提供图片配置的默认值,以及通过 SolidJS Context 向下传递配置的机制。\n * 不包含任何渲染逻辑。\n */\n\nimport { createContext, useContext } from \"solid-js\";\nimport type { ImageConfigComplete } from \"./Image.types\";\n\n// ─── 默认配置 ─────────────────────────────────────────────────────────────────\n\nexport const imageConfigDefault: ImageConfigComplete = {\n deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],\n imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],\n loader: \"default\",\n path: \"/_next/image\",\n loaderFile: \"\",\n domains: [],\n disableStaticImages: false,\n minimumCacheTTL: 60,\n formats: [\"image/webp\"],\n dangerouslyAllowSVG: false,\n contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`,\n contentDispositionType: \"attachment\",\n remotePatterns: [],\n unoptimized: false,\n};\n\n// ─── SolidJS Context ──────────────────────────────────────────────────────────\n\n/**\n * 向子树提供自定义图片配置。\n * 用法:\n * <ImageConfigProvider value={myConfig}>\n * <App />\n * </ImageConfigProvider>\n */\nexport const ImageConfigContext =\n createContext<ImageConfigComplete>(imageConfigDefault);\n\nexport function useImageConfig(): ImageConfigComplete {\n return useContext(ImageConfigContext);\n}\n\n// ─── 配置合并工具 ──────────────────────────────────────────────────────────────\n\n/**\n * 将上下文配置与运行时注入的配置合并,\n * 并预计算派生字段(allSizes、排序后的 deviceSizes / qualities)。\n */\nexport function resolveConfig(\n contextConfig: ImageConfigComplete,\n envConfig?: Partial<ImageConfigComplete>,\n): ImageConfigComplete {\n const c: ImageConfigComplete = { ...contextConfig, ...(envConfig ?? {}) };\n\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\n ? [...c.qualities].sort((a, b) => a - b)\n : undefined;\n\n return { ...c, allSizes, deviceSizes, qualities };\n}\n"],"mappings":";;AAWA,IAAa,IAA0C;CACrD,aAAa;EAAC;EAAK;EAAK;EAAK;EAAM;EAAM;EAAM;EAAM;EAAK;CAC1D,YAAY;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAK;EAAK;EAAI;CAC/C,QAAQ;CACR,MAAM;CACN,YAAY;CACZ,SAAS,EAAE;CACX,qBAAqB;CACrB,iBAAiB;CACjB,SAAS,CAAC,aAAa;CACvB,qBAAqB;CACrB,uBAAuB;CACvB,wBAAwB;CACxB,gBAAgB,EAAE;CAClB,aAAa;CACd,EAWY,IACX,EAAmC,EAAmB;AAExD,SAAgB,IAAsC;AACpD,QAAO,EAAW,EAAmB;;AASvC,SAAgB,EACd,GACA,GACqB;CACrB,IAAM,IAAyB;EAAE,GAAG;EAAe,GAAI,KAAa,EAAE;EAAG,EAEnE,IAAW,CAAC,GAAG,EAAE,aAAa,GAAG,EAAE,WAAW,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,EACpE,IAAc,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,EACtD,IAAY,EAAE,YAChB,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,GACtC,KAAA;AAEJ,QAAO;EAAE,GAAG;EAAG;EAAU;EAAa;EAAW"}
1
+ {"version":3,"file":"Image.config.js","names":[],"sources":["../../../src/components/image/Image.config.ts"],"sourcesContent":["/**\n * image-config.ts\n * 单一职责:提供图片配置的默认值,以及通过 SolidJS Context 向下传递配置的机制。\n * 不包含任何渲染逻辑。\n */\n\nimport { createContext, useContext } from \"solid-js\";\nimport type { ImageConfigComplete } from \"./Image.types\";\n\n// ─── 默认配置 ─────────────────────────────────────────────────────────────────\n\nexport const imageConfigDefault: ImageConfigComplete = {\n deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],\n imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],\n loader: \"default\",\n path: \"/_next/image\",\n loaderFile: \"\",\n domains: [],\n disableStaticImages: false,\n minimumCacheTTL: 60,\n formats: [\"image/webp\"],\n dangerouslyAllowSVG: false,\n contentSecurityPolicy: `script-src 'none'; frame-src 'none'; sandbox;`,\n contentDispositionType: \"attachment\",\n remotePatterns: [],\n unoptimized: false,\n};\n\n// ─── SolidJS Context ──────────────────────────────────────────────────────────\n\n/**\n * 向子树提供自定义图片配置。\n * 用法:\n * <ImageConfigProvider value={myConfig}>\n * <App />\n * </ImageConfigProvider>\n */\nexport const ImageConfigContext =\n createContext<ImageConfigComplete>(imageConfigDefault);\n\nexport function useImageConfig(): ImageConfigComplete {\n return useContext(ImageConfigContext);\n}\n\n// ─── 配置合并工具 ──────────────────────────────────────────────────────────────\n\n/**\n * 将上下文配置与运行时注入的配置合并,\n * 并预计算派生字段(allSizes、排序后的 deviceSizes / qualities)。\n */\nexport function resolveConfig(\n contextConfig: ImageConfigComplete,\n envConfig?: Partial<ImageConfigComplete>,\n): ImageConfigComplete {\n const c: ImageConfigComplete = { ...contextConfig, ...(envConfig ?? {}) };\n\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\n ? [...c.qualities].sort((a, b) => a - b)\n : undefined;\n\n return { ...c, allSizes, deviceSizes, qualities };\n}\n"],"mappings":";;AAWA,IAAa,IAA0C;CACrD,aAAa;EAAC;EAAK;EAAK;EAAK;EAAM;EAAM;EAAM;EAAM;CAAI;CACzD,YAAY;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI;EAAK;EAAK;CAAG;CAC9C,QAAQ;CACR,MAAM;CACN,YAAY;CACZ,SAAS,CAAC;CACV,qBAAqB;CACrB,iBAAiB;CACjB,SAAS,CAAC,YAAY;CACtB,qBAAqB;CACrB,uBAAuB;CACvB,wBAAwB;CACxB,gBAAgB,CAAC;CACjB,aAAa;AACf,GAWa,IACX,EAAmC,CAAkB;AAEvD,SAAgB,IAAsC;CACpD,OAAO,EAAW,CAAkB;AACtC;AAQA,SAAgB,EACd,GACA,GACqB;CACrB,IAAM,IAAyB;EAAE,GAAG;EAAe,GAAI,KAAa,CAAC;CAAG,GAElE,IAAW,CAAC,GAAG,EAAE,aAAa,GAAG,EAAE,UAAU,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,GACnE,IAAc,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,GACrD,IAAY,EAAE,YAChB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,IACrC,KAAA;CAEJ,OAAO;EAAE,GAAG;EAAG;EAAU;EAAa;CAAU;AAClD"}
@@ -6,20 +6,20 @@ import { createComponent as a, mergeProps as o } from "solid-js/web";
6
6
  import { Show as s, createMemo as c, createSignal as l } from "solid-js";
7
7
  //#region src/components/image/Image.tsx
8
8
  var u = (u) => {
9
- let d = e(t()), [f, p] = l(!1), [m, h] = l(!1), g = c(() => n(u, {
10
- imgConf: d,
11
- blurComplete: f(),
12
- showAltText: m()
13
- })), _ = () => g().props, v = () => g().meta;
14
- return [a(r, o(_, {
9
+ let d = t(), f = e(d), [p, m] = l(!1), [h, g] = l(!1), _ = c(() => n(u, {
10
+ imgConf: f,
11
+ blurComplete: p(),
12
+ showAltText: h()
13
+ })), v = () => _().props, y = () => _().meta;
14
+ return [a(r, o(v, {
15
15
  get unoptimized() {
16
- return v().unoptimized;
16
+ return y().unoptimized;
17
17
  },
18
18
  get placeholder() {
19
- return v().placeholder;
19
+ return y().placeholder;
20
20
  },
21
21
  get fill() {
22
- return v().fill;
22
+ return y().fill;
23
23
  },
24
24
  get onLoad() {
25
25
  return u.onLoad;
@@ -27,18 +27,18 @@ var u = (u) => {
27
27
  get onLoadingComplete() {
28
28
  return u.onLoadingComplete;
29
29
  },
30
- setBlurComplete: p,
31
- setShowAltText: h,
30
+ setBlurComplete: m,
31
+ setShowAltText: g,
32
32
  get sizesInput() {
33
33
  return u.sizes;
34
34
  }
35
35
  })), a(s, {
36
36
  get when() {
37
- return v().preload;
37
+ return y().preload;
38
38
  },
39
39
  get children() {
40
40
  return a(i, { get imgAttributes() {
41
- return _();
41
+ return v();
42
42
  } });
43
43
  }
44
44
  })];
@@ -1 +1 @@
1
- {"version":3,"file":"Image.js","names":["Component","createMemo","createSignal","Show","resolveConfig","useImageConfig","ImageProps","ImgPropsResult","PlaceholderValue","getImgProps","ImageElement","ImagePreload","Image","props","contextConfig","config","blurComplete","setBlurComplete","showAltText","setShowAltText","result","imgConf","imgAttributes","imgMeta","meta","_$createComponent","_$mergeProps","unoptimized","placeholder","fill","onLoad","onLoadingComplete","sizesInput","sizes","when","preload","children"],"sources":["../../../src/components/image/Image.tsx"],"sourcesContent":["/**\n * Image.tsx\n * 单一职责:组合层——解析 props、管理 blur/showAltText 状态、\n * 合并配置,然后将职责委托给 ImageElement 和 ImagePreload。\n * 不包含任何加载逻辑或 DOM 操作。\n */\n\nimport { type Component, createMemo, createSignal, Show } from \"solid-js\";\nimport { resolveConfig, useImageConfig } from \"./Image.config\";\nimport type {\n ImageProps,\n ImgPropsResult,\n PlaceholderValue,\n} from \"./Image.types\";\nimport { getImgProps } from \"./Image.utils\";\nimport ImageElement from \"./ImageElement\";\nimport ImagePreload from \"./ImagePreload\";\n\n// ─── 组件 ─────────────────────────────────────────────────────────────────────\n\n/**\n * <Image> 组件\n *\n * 与 Next.js Image 功能对等:\n * - 自动 srcSet 生成\n * - blur placeholder 支持\n * - fill 模式\n * - priority preload\n * - 开发环境警告\n */\nexport const Image: Component<ImageProps> = (props) => {\n const contextConfig = useImageConfig();\n\n // 合并并预计算配置(memoized via SolidJS 细粒度响应式)\n const config = resolveConfig(contextConfig);\n\n // ── 本地状态 ──────────────────────────────────────────────────────────────\n const [blurComplete, setBlurComplete] = createSignal(false);\n const [showAltText, setShowAltText] = createSignal(false);\n\n // ── 派生属性 ──────────────────────────────────────────────────────────────\n // getImgProps 将 ImageProps 转换为原生 img 可接受的属性集\n const result = createMemo(\n (): ImgPropsResult =>\n getImgProps(props, {\n imgConf: config,\n blurComplete: blurComplete(),\n showAltText: showAltText(),\n }),\n );\n\n const imgAttributes = () => result().props;\n const imgMeta = () => result().meta;\n\n return (\n <>\n <ImageElement\n {...imgAttributes()}\n unoptimized={imgMeta().unoptimized}\n placeholder={imgMeta().placeholder as PlaceholderValue}\n fill={imgMeta().fill}\n onLoad={props.onLoad}\n onLoadingComplete={props.onLoadingComplete}\n setBlurComplete={setBlurComplete}\n setShowAltText={setShowAltText}\n sizesInput={props.sizes}\n />\n\n <Show when={imgMeta().preload}>\n <ImagePreload imgAttributes={imgAttributes()} />\n </Show>\n </>\n );\n};\n"],"mappings":";;;;;;;AA8BA,IAAaY,KAAgCC,MAAU;CAIrD,IAAME,IAASX,EAHOC,GAAgB,CAGK,EAGrC,CAACW,GAAcC,KAAmBf,EAAa,GAAM,EACrD,CAACgB,GAAaC,KAAkBjB,EAAa,GAAM,EAInDkB,IAASnB,QAEXQ,EAAYI,GAAO;EACjBQ,SAASN;EACTC,cAAcA,GAAc;EAC5BE,aAAaA,GAAY;EAC1B,CACL,CAAC,EAEKI,UAAsBF,GAAQ,CAACP,OAC/BU,UAAgBH,GAAQ,CAACI;AAE/B,QAAA,CAAAC,EAEKf,GAAYgB,EACPJ,GAAa;EAAA,IACjBK,cAAW;AAAA,UAAEJ,GAAS,CAACI;;EAAW,IAClCC,cAAW;AAAA,UAAEL,GAAS,CAACK;;EAA+B,IACtDC,OAAI;AAAA,UAAEN,GAAS,CAACM;;EAAI,IACpBC,SAAM;AAAA,UAAEjB,EAAMiB;;EAAM,IACpBC,oBAAiB;AAAA,UAAElB,EAAMkB;;EACRd;EACDE;EAAc,IAC9Ba,aAAU;AAAA,UAAEnB,EAAMoB;;EAAK,CAAA,CAAA,EAAAR,EAGxBtB,GAAI;EAAA,IAAC+B,OAAI;AAAA,UAAEX,GAAS,CAACY;;EAAO,IAAAC,WAAA;AAAA,UAAAX,EAC1Bd,GAAY,EAAA,IAACW,gBAAa;AAAA,WAAEA,GAAe;MAAA,CAAA;;EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Image.js","names":["Component","createMemo","createSignal","Show","resolveConfig","useImageConfig","ImageProps","ImgPropsResult","PlaceholderValue","getImgProps","ImageElement","ImagePreload","Image","props","contextConfig","config","blurComplete","setBlurComplete","showAltText","setShowAltText","result","imgConf","imgAttributes","imgMeta","meta","_$createComponent","_$mergeProps","unoptimized","placeholder","fill","onLoad","onLoadingComplete","sizesInput","sizes","when","preload","children"],"sources":["../../../src/components/image/Image.tsx"],"sourcesContent":["/**\n * Image.tsx\n * 单一职责:组合层——解析 props、管理 blur/showAltText 状态、\n * 合并配置,然后将职责委托给 ImageElement 和 ImagePreload。\n * 不包含任何加载逻辑或 DOM 操作。\n */\n\nimport { type Component, createMemo, createSignal, Show } from \"solid-js\";\nimport { resolveConfig, useImageConfig } from \"./Image.config\";\nimport type {\n ImageProps,\n ImgPropsResult,\n PlaceholderValue,\n} from \"./Image.types\";\nimport { getImgProps } from \"./Image.utils\";\nimport ImageElement from \"./ImageElement\";\nimport ImagePreload from \"./ImagePreload\";\n\n// ─── 组件 ─────────────────────────────────────────────────────────────────────\n\n/**\n * <Image> 组件\n *\n * 与 Next.js Image 功能对等:\n * - 自动 srcSet 生成\n * - blur placeholder 支持\n * - fill 模式\n * - priority preload\n * - 开发环境警告\n */\nexport const Image: Component<ImageProps> = (props) => {\n const contextConfig = useImageConfig();\n\n // 合并并预计算配置(memoized via SolidJS 细粒度响应式)\n const config = resolveConfig(contextConfig);\n\n // ── 本地状态 ──────────────────────────────────────────────────────────────\n const [blurComplete, setBlurComplete] = createSignal(false);\n const [showAltText, setShowAltText] = createSignal(false);\n\n // ── 派生属性 ──────────────────────────────────────────────────────────────\n // getImgProps 将 ImageProps 转换为原生 img 可接受的属性集\n const result = createMemo(\n (): ImgPropsResult =>\n getImgProps(props, {\n imgConf: config,\n blurComplete: blurComplete(),\n showAltText: showAltText(),\n }),\n );\n\n const imgAttributes = () => result().props;\n const imgMeta = () => result().meta;\n\n return (\n <>\n <ImageElement\n {...imgAttributes()}\n unoptimized={imgMeta().unoptimized}\n placeholder={imgMeta().placeholder as PlaceholderValue}\n fill={imgMeta().fill}\n onLoad={props.onLoad}\n onLoadingComplete={props.onLoadingComplete}\n setBlurComplete={setBlurComplete}\n setShowAltText={setShowAltText}\n sizesInput={props.sizes}\n />\n\n <Show when={imgMeta().preload}>\n <ImagePreload imgAttributes={imgAttributes()} />\n </Show>\n </>\n );\n};\n"],"mappings":";;;;;;;AA8BA,IAAaY,KAAgCC,MAAU;CACrD,IAAMC,IAAgBT,EAAe,GAG/BU,IAASX,EAAcU,CAAa,GAGpC,CAACE,GAAcC,KAAmBf,EAAa,EAAK,GACpD,CAACgB,GAAaC,KAAkBjB,EAAa,EAAK,GAIlDkB,IAASnB,QAEXQ,EAAYI,GAAO;EACjBQ,SAASN;EACTC,cAAcA,EAAa;EAC3BE,aAAaA,EAAY;CAC3B,CAAC,CACL,GAEMI,UAAsBF,EAAO,CAAC,CAACP,OAC/BU,UAAgBH,EAAO,CAAC,CAACI;CAE/B,OAAA,CAAAC,EAEKf,GAAYgB,EACPJ,GAAa;EAAA,IACjBK,cAAW;GAAA,OAAEJ,EAAQ,CAAC,CAACI;EAAW;EAAA,IAClCC,cAAW;GAAA,OAAEL,EAAQ,CAAC,CAACK;EAA+B;EAAA,IACtDC,OAAI;GAAA,OAAEN,EAAQ,CAAC,CAACM;EAAI;EAAA,IACpBC,SAAM;GAAA,OAAEjB,EAAMiB;EAAM;EAAA,IACpBC,oBAAiB;GAAA,OAAElB,EAAMkB;EAAiB;EACzBd;EACDE;EAAc,IAC9Ba,aAAU;GAAA,OAAEnB,EAAMoB;EAAK;CAAA,CAAA,CAAA,GAAAR,EAGxBtB,GAAI;EAAA,IAAC+B,OAAI;GAAA,OAAEX,EAAQ,CAAC,CAACY;EAAO;EAAA,IAAAC,WAAA;GAAA,OAAAX,EAC1Bd,GAAY,EAAA,IAACW,gBAAa;IAAA,OAAEA,EAAc;GAAC,EAAA,CAAA;EAAA;CAAA,CAAA,CAAA;AAIpD"}
@@ -24,14 +24,14 @@ var i = [
24
24
  void 0
25
25
  ];
26
26
  function a(r, { imgConf: a, blurComplete: l, showAltText: p }) {
27
- let [m, h] = n(t({
27
+ let m = t({
28
28
  fill: !1,
29
29
  priority: !1,
30
30
  preload: !1,
31
31
  placeholder: "empty",
32
32
  unoptimized: a.unoptimized,
33
33
  decoding: "async"
34
- }, r), [
34
+ }, r), [h, g] = n(m, [
35
35
  "src",
36
36
  "loader",
37
37
  "quality",
@@ -57,21 +57,21 @@ function a(r, { imgConf: a, blurComplete: l, showAltText: p }) {
57
57
  "fetchpriority",
58
58
  "class",
59
59
  "decoding"
60
- ]), g, _ = a || e;
61
- if ("allSizes" in _) g = _;
60
+ ]), _, v = a || e;
61
+ if ("allSizes" in v) _ = v;
62
62
  else {
63
- let e = [..._.deviceSizes, ..._.imageSizes].sort((e, t) => e - t), t = _.deviceSizes.sort((e, t) => e - t), n = _.qualities?.sort((e, t) => e - t);
64
- g = {
65
- ..._,
63
+ let e = [...v.deviceSizes, ...v.imageSizes].sort((e, t) => e - t), t = v.deviceSizes.sort((e, t) => e - t), n = v.qualities?.sort((e, t) => e - t);
64
+ _ = {
65
+ ...v,
66
66
  allSizes: e,
67
67
  deviceSizes: t,
68
68
  qualities: n
69
69
  };
70
70
  }
71
71
  if (o === void 0) throw Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config");
72
- let v = m.style, y = m.sizes, b = m.fill, x = m.loader || o;
73
- if (m.layout) {
74
- m.layout === "fill" && (b = !0);
72
+ let y = h.style, b = h.sizes, x = h.fill, S = h.loader || o;
73
+ if (h.layout) {
74
+ h.layout === "fill" && (x = !0);
75
75
  let e = {
76
76
  intrinsic: {
77
77
  maxWidth: "100%",
@@ -84,33 +84,33 @@ function a(r, { imgConf: a, blurComplete: l, showAltText: p }) {
84
84
  }, t = {
85
85
  responsive: "100vw",
86
86
  fill: "100vw"
87
- }, n = e[m.layout];
88
- n && (v = {
89
- ...v,
87
+ }, n = e[h.layout];
88
+ n && (y = {
89
+ ...y,
90
90
  ...n
91
91
  });
92
- let r = t[m.layout];
93
- r && !y && (y = r);
92
+ let r = t[h.layout];
93
+ r && !b && (b = r);
94
94
  }
95
- let S = "", C = m.blurDataURL, w = s(m.width), T = s(m.height), E, D;
96
- if (u(m.src)) {
97
- let e = c(m.src) ? m.src.default : m.src;
95
+ let C = "", w = h.blurDataURL, T = s(h.width), E = s(h.height), D, O;
96
+ if (u(h.src)) {
97
+ let e = c(h.src) ? h.src.default : h.src;
98
98
  if (!e.src) throw Error(`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(e)}`);
99
99
  if (!e.height || !e.width) throw Error(`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(e)}`);
100
- if (E = e.blurWidth, D = e.blurHeight, C ||= e.blurDataURL, S = e.src, !b) {
101
- if (!w && !T) w = e.width, T = e.height;
102
- else if (w && !T) {
103
- let t = w / e.width;
104
- T = Math.round(e.height * t);
105
- } else if (!w && T) {
106
- let t = T / e.height;
107
- w = Math.round(e.width * t);
100
+ if (D = e.blurWidth, O = e.blurHeight, w ||= e.blurDataURL, C = e.src, !x) {
101
+ if (!T && !E) T = e.width, E = e.height;
102
+ else if (T && !E) {
103
+ let t = T / e.width;
104
+ E = Math.round(e.height * t);
105
+ } else if (!T && E) {
106
+ let t = E / e.height;
107
+ T = Math.round(e.width * t);
108
108
  }
109
109
  }
110
110
  }
111
- let O = typeof m.src == "string" ? m.src : S, k = m.unoptimized, A = !m.priority && !m.preload && (m.loading === "lazy" || m.loading === void 0);
112
- (!O || O.startsWith("data:") || O.startsWith("blob:")) && (k = !0, A = !1), g.unoptimized && (k = !0), !g.dangerouslyAllowSVG && O.split("?", 1)[0].endsWith(".svg") && (k = !0);
113
- let j = s(m.quality), M = Object.assign(b ? {
111
+ let k = typeof h.src == "string" ? h.src : C, A = h.unoptimized, j = !h.priority && !h.preload && (h.loading === "lazy" || h.loading === void 0);
112
+ (!k || k.startsWith("data:") || k.startsWith("blob:")) && (A = !0, j = !1), _.unoptimized && (A = !0), !_.dangerouslyAllowSVG && k.split("?", 1)[0].endsWith(".svg") && (A = !0);
113
+ let M = s(h.quality), N = Object.assign(x ? {
114
114
  position: "absolute",
115
115
  height: "100%",
116
116
  width: "100%",
@@ -118,51 +118,51 @@ function a(r, { imgConf: a, blurComplete: l, showAltText: p }) {
118
118
  top: 0,
119
119
  right: 0,
120
120
  bottom: 0,
121
- objectFit: m.objectFit,
122
- objectPosition: m.objectPosition
123
- } : {}, p ? {} : { color: "transparent" }, v), N = !l && m.placeholder !== "empty" ? m.placeholder === "blur" ? `url("data:image/svg+xml;charset=utf-8,${d({
124
- widthInt: w,
125
- heightInt: T,
126
- blurWidth: E,
127
- blurHeight: D,
128
- blurDataURL: C || "",
129
- objectFit: M.objectFit
130
- })}")` : `url("${m.placeholder}")` : null, P = i.includes(M.objectFit) ? M.objectFit === "fill" ? "100% 100%" : "cover" : M.objectFit, F = N ? {
131
- "background-size": P,
132
- "background-position": M.objectPosition || "50% 50%",
121
+ objectFit: h.objectFit,
122
+ objectPosition: h.objectPosition
123
+ } : {}, p ? {} : { color: "transparent" }, y), P = !l && h.placeholder !== "empty" ? h.placeholder === "blur" ? `url("data:image/svg+xml;charset=utf-8,${d({
124
+ widthInt: T,
125
+ heightInt: E,
126
+ blurWidth: D,
127
+ blurHeight: O,
128
+ blurDataURL: w || "",
129
+ objectFit: N.objectFit
130
+ })}")` : `url("${h.placeholder}")` : null, F = i.includes(N.objectFit) ? N.objectFit === "fill" ? "100% 100%" : "cover" : N.objectFit, I = P ? {
131
+ "background-size": F,
132
+ "background-position": N.objectPosition || "50% 50%",
133
133
  "background-repeat": "no-repeat",
134
- "background-image": N
135
- } : {}, I = f({
136
- config: g,
137
- src: O,
138
- unoptimized: k,
139
- width: w,
140
- quality: j,
141
- sizes: y,
142
- loader: x
143
- }), L = A ? "lazy" : m.loading;
134
+ "background-image": P
135
+ } : {}, L = f({
136
+ config: _,
137
+ src: k,
138
+ unoptimized: A,
139
+ width: T,
140
+ quality: M,
141
+ sizes: b,
142
+ loader: S
143
+ }), R = j ? "lazy" : h.loading;
144
144
  return {
145
145
  props: {
146
- ...h,
147
- loading: L,
148
- fetchpriority: m.fetchpriority,
149
- width: w,
150
- height: T,
151
- decoding: m.decoding,
152
- class: m.class,
146
+ ...g,
147
+ loading: R,
148
+ fetchpriority: h.fetchpriority,
149
+ width: T,
150
+ height: E,
151
+ decoding: h.decoding,
152
+ class: h.class,
153
153
  style: {
154
- ...M,
155
- ...F
154
+ ...N,
155
+ ...I
156
156
  },
157
- sizes: I.sizes,
158
- srcSet: I.srcSet,
159
- src: m.overrideSrc || I.src
157
+ sizes: L.sizes,
158
+ srcSet: L.srcSet,
159
+ src: h.overrideSrc || L.src
160
160
  },
161
161
  meta: {
162
- unoptimized: k,
163
- preload: m.preload || m.priority,
164
- placeholder: m.placeholder,
165
- fill: b
162
+ unoptimized: A,
163
+ preload: h.preload || h.priority,
164
+ placeholder: h.placeholder,
165
+ fill: x
166
166
  }
167
167
  };
168
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Image.utils.js","names":[],"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":[],"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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"}
@@ -2,8 +2,8 @@ import { handleLoading as e } from "./Image.utils.js";
2
2
  import { mergeProps as t, spread as n, template as r, use as i } from "solid-js/web";
3
3
  import { mergeProps as a, splitProps as o } from "solid-js";
4
4
  //#region src/components/image/ImageElement.tsx
5
- var s = /* @__PURE__ */ r("<img>", !0, !1, !1), c = (r) => {
6
- let [c, l] = o(a({ decoding: "async" }, r), [
5
+ var s = /*#__PURE__*/ r("<img>", !0, !1, !1), c = (r) => {
6
+ let c = a({ decoding: "async" }, r), [l, u] = o(c, [
7
7
  "src",
8
8
  "srcSet",
9
9
  "sizes",
@@ -27,51 +27,51 @@ var s = /* @__PURE__ */ r("<img>", !0, !1, !1), c = (r) => {
27
27
  "ref",
28
28
  "alt"
29
29
  ]);
30
- function u(t) {
31
- t && (c.onError && (t.src = t.src), t.complete && e(t, c.placeholder, c.onLoad, c.onLoadingComplete, c.setBlurComplete, c.unoptimized, c.sizesInput), c.ref?.(t));
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));
32
32
  }
33
33
  return (() => {
34
- var r = s(), a = u;
35
- return typeof a == "function" ? i(a, r) : u = r, n(r, t(l, {
34
+ var r = s(), a = d;
35
+ return typeof a == "function" ? i(a, r) : d = r, n(r, t(u, {
36
36
  get alt() {
37
- return c.alt;
37
+ return l.alt;
38
38
  },
39
39
  get loading() {
40
- return c.loading;
40
+ return l.loading;
41
41
  },
42
42
  get width() {
43
- return c.width;
43
+ return l.width;
44
44
  },
45
45
  get height() {
46
- return c.height;
46
+ return l.height;
47
47
  },
48
48
  get decoding() {
49
- return c.decoding;
49
+ return l.decoding;
50
50
  },
51
51
  get "data-nimg"() {
52
- return c.fill ? "fill" : "1";
52
+ return l.fill ? "fill" : "1";
53
53
  },
54
54
  get class() {
55
- return c.class;
55
+ return l.class;
56
56
  },
57
57
  get style() {
58
- return c.style;
58
+ return l.style;
59
59
  },
60
60
  get sizes() {
61
- return c.sizes;
61
+ return l.sizes;
62
62
  },
63
63
  get srcset() {
64
- return c.srcSet;
64
+ return l.srcSet;
65
65
  },
66
66
  get src() {
67
- return c.src;
67
+ return l.src;
68
68
  },
69
69
  onLoad: (t) => {
70
70
  let n = t.currentTarget;
71
- e(n, c.placeholder, c.onLoad, c.onLoadingComplete, c.setBlurComplete, c.unoptimized, c.sizesInput);
71
+ e(n, l.placeholder, l.onLoad, l.onLoadingComplete, l.setBlurComplete, l.unoptimized, l.sizesInput);
72
72
  },
73
73
  onError: (e) => {
74
- c.setShowAltText(!0), c.placeholder !== "empty" && c.setBlurComplete(!0), c.onError && typeof c.onError == "function" && c.onError(e);
74
+ l.setShowAltText(!0), l.placeholder !== "empty" && l.setBlurComplete(!0), l.onError && typeof l.onError == "function" && l.onError(e);
75
75
  }
76
76
  }), !1, !1), r;
77
77
  })();
@@ -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"],"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":";;;;gDAiCMoB,KAA8CC,MAAa;CAI/D,IAAM,CAACI,GAAUC,KAAYxB,EAHfD,EAAW,EAAEsB,UAAU,SAAkB,EAAEF,EAAS,EAGnB;EAC7C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAMF,SAASM,EAAUC,GAAuB;AACnCA,QAGDH,EAASI,YAEXD,EAAIE,MAAMF,EAAIE,MAaZF,EAAIY,YACNjC,EACEqB,GACAH,EAASf,aACTe,EAASV,QACTU,EAAST,mBACTS,EAASd,iBACTc,EAAShB,aACTgB,EAASX,WACV,EAIHW,EAASR,MAAMW,EAAI;;AAGrB,eAIE;EAAA,IAAAa,IAAAC,GAAA,EAAAC,IAeOhB;AA0BJ,SA1Ba,OAAAgB,KAAA,aAAAC,EAAAD,GAAAF,EAAA,GAATd,IAASc,GAAAI,EAAAJ,GAAAK,EAbVpB,GAAQ;GAAA,IAEZY,MAAG;AAAA,WAAEb,EAASa;;GAAG,IACjBS,UAAO;AAAA,WAAEtB,EAASsB;;GAAO,IACzBC,QAAK;AAAA,WAAEvB,EAASuB;;GAAK,IACrBC,SAAM;AAAA,WAAExB,EAASwB;;GAAM,IACvB1B,WAAQ;AAAA,WAAEE,EAASF;;GAAQ,IAAA,cAAA;AAAA,WAChBE,EAAS0B,OAAO,SAAS;;GAAG,IAAA,QAAA;AAAA,WAChC1B,EAAS2B;;GAAK,IACrBC,QAAK;AAAA,WAAE5B,EAAS4B;;GAAK,IACrBC,QAAK;AAAA,WAAE7B,EAAS6B;;GAAK,IACrBC,SAAM;AAAA,WAAE9B,EAAS+B;;GAAM,IACvB1B,MAAG;AAAA,WAAEL,EAASK;;GAAG,SAER2B,MAAM;IACb,IAAM7B,IAAM6B,EAAEC;AACdnD,MACEqB,GACAH,EAASf,aACTe,EAASV,QACTU,EAAST,mBACTS,EAASd,iBACTc,EAAShB,aACTgB,EAASX,WACV;;GACF,UACS2C,MAAM;AAEdhC,MAASZ,eAAe,GAAK,EACzBY,EAASf,gBAAgB,WAE3Be,EAASd,gBAAgB,GAAK,EAG3Bc,EAASI,WAEV,OAAOJ,EAASI,WAAY,cAEhCJ,EAASI,QAAQ4B,EAAE;;GACpB,CAAA,EAAA,IAAA,GAAA,EAAAhB;KAAA"}
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"],"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;EACnCA,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,IAAA,QAAA;IAAA,OAChC1B,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;GAAA,SAER2B,MAAM;IACb,IAAM7B,IAAM6B,EAAEC;IACdnD,EACEqB,GACAH,EAASf,aACTe,EAASV,QACTU,EAAST,mBACTS,EAASd,iBACTc,EAAShB,aACTgB,EAASX,UACX;GACF;GAAC,UACS2C,MAAM;IAEdhC,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,6 +1,6 @@
1
1
  import { Portal as e, createComponent as t, effect as n, setAttribute as r, template as i } from "solid-js/web";
2
2
  //#region src/components/image/ImagePreload.tsx
3
- var a = /* @__PURE__ */ i("<link rel=preload as=image>"), o = (i) => {
3
+ var a = /*#__PURE__*/ i("<link rel=preload as=image>"), o = (i) => {
4
4
  let { imgAttributes: o } = i, s = `__img-preload-${o.src}-${o.srcSet ?? ""}-${o.sizes ?? ""}`;
5
5
  return typeof document < "u" && document.head.querySelector(`link[data-img-key="${s}"]`) ? null : t(e, {
6
6
  get mount() {