@wordpress/block-library 8.13.0 → 8.14.0

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 (366) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/archives/index.js +5 -1
  3. package/build/archives/index.js.map +1 -1
  4. package/build/audio/index.js +5 -1
  5. package/build/audio/index.js.map +1 -1
  6. package/build/avatar/index.js +1 -1
  7. package/build/block/edit.js +1 -1
  8. package/build/block/edit.js.map +1 -1
  9. package/build/block/edit.native.js +6 -9
  10. package/build/block/edit.native.js.map +1 -1
  11. package/build/buttons/edit.js +5 -1
  12. package/build/buttons/edit.js.map +1 -1
  13. package/build/categories/index.js +5 -1
  14. package/build/categories/index.js.map +1 -1
  15. package/build/code/index.js +5 -1
  16. package/build/code/index.js.map +1 -1
  17. package/build/column/index.js +1 -0
  18. package/build/column/index.js.map +1 -1
  19. package/build/comments/index.js +1 -0
  20. package/build/comments/index.js.map +1 -1
  21. package/build/cover/edit/inspector-controls.js +2 -1
  22. package/build/cover/edit/inspector-controls.js.map +1 -1
  23. package/build/cover/index.js +1 -0
  24. package/build/cover/index.js.map +1 -1
  25. package/build/details/index.js +5 -1
  26. package/build/details/index.js.map +1 -1
  27. package/build/embed/util.js +9 -8
  28. package/build/embed/util.js.map +1 -1
  29. package/build/file/index.js +2 -1
  30. package/build/file/index.js.map +1 -1
  31. package/build/file/view.js +15 -1
  32. package/build/file/view.js.map +1 -1
  33. package/build/gallery/index.js +3 -1
  34. package/build/gallery/index.js.map +1 -1
  35. package/build/group/index.js +1 -0
  36. package/build/group/index.js.map +1 -1
  37. package/build/heading/index.js +5 -1
  38. package/build/heading/index.js.map +1 -1
  39. package/build/heading/transforms.js +5 -1
  40. package/build/heading/transforms.js.map +1 -1
  41. package/build/image/deprecated.js +453 -175
  42. package/build/image/deprecated.js.map +1 -1
  43. package/build/image/edit.js +0 -4
  44. package/build/image/edit.js.map +1 -1
  45. package/build/image/image.js +96 -43
  46. package/build/image/image.js.map +1 -1
  47. package/build/image/index.js +6 -0
  48. package/build/image/index.js.map +1 -1
  49. package/build/image/save.js +8 -1
  50. package/build/image/save.js.map +1 -1
  51. package/build/image/utils.js +18 -0
  52. package/build/image/utils.js.map +1 -1
  53. package/build/image/{interactivity.js → view-interactivity.js} +86 -44
  54. package/build/image/view-interactivity.js.map +1 -0
  55. package/build/index.js +12 -3
  56. package/build/index.js.map +1 -1
  57. package/build/list/index.js +5 -1
  58. package/build/list/index.js.map +1 -1
  59. package/build/list-item/utils.js +6 -1
  60. package/build/list-item/utils.js.map +1 -1
  61. package/build/media-text/index.js +1 -0
  62. package/build/media-text/index.js.map +1 -1
  63. package/build/missing/edit.js +22 -8
  64. package/build/missing/edit.js.map +1 -1
  65. package/build/navigation/edit/index.js +1 -1
  66. package/build/navigation/edit/index.js.map +1 -1
  67. package/build/navigation/edit/menu-inspector-controls.js +0 -1
  68. package/build/navigation/edit/menu-inspector-controls.js.map +1 -1
  69. package/build/navigation/index.js +3 -2
  70. package/build/navigation/index.js.map +1 -1
  71. package/build/navigation/view.js +174 -50
  72. package/build/navigation/view.js.map +1 -1
  73. package/build/navigation-link/edit.js +0 -11
  74. package/build/navigation-link/edit.js.map +1 -1
  75. package/build/navigation-link/link-ui.js +12 -2
  76. package/build/navigation-link/link-ui.js.map +1 -1
  77. package/build/page-list/convert-to-links-modal.js +3 -3
  78. package/build/page-list/convert-to-links-modal.js.map +1 -1
  79. package/build/page-list/edit.js +34 -39
  80. package/build/page-list/edit.js.map +1 -1
  81. package/build/page-list/use-convert-to-navigation-links.js +2 -15
  82. package/build/page-list/use-convert-to-navigation-links.js.map +1 -1
  83. package/build/paragraph/index.js +1 -0
  84. package/build/paragraph/index.js.map +1 -1
  85. package/build/paragraph/transforms.js +1 -0
  86. package/build/paragraph/transforms.js.map +1 -1
  87. package/build/post-comments-form/index.js +1 -0
  88. package/build/post-comments-form/index.js.map +1 -1
  89. package/build/post-navigation-link/index.js +1 -0
  90. package/build/post-navigation-link/index.js.map +1 -1
  91. package/build/post-time-to-read/index.js +5 -1
  92. package/build/post-time-to-read/index.js.map +1 -1
  93. package/build/query-pagination-numbers/index.js +1 -1
  94. package/build/quote/index.js +1 -0
  95. package/build/quote/index.js.map +1 -1
  96. package/build/site-logo/index.js +5 -1
  97. package/build/site-logo/index.js.map +1 -1
  98. package/build/site-tagline/icon.js +1 -1
  99. package/build/site-tagline/icon.js.map +1 -1
  100. package/build/site-tagline/index.js +5 -1
  101. package/build/site-tagline/index.js.map +1 -1
  102. package/build/site-title/index.js +5 -1
  103. package/build/site-title/index.js.map +1 -1
  104. package/build/social-links/index.js +3 -1
  105. package/build/social-links/index.js.map +1 -1
  106. package/build/table/index.js +5 -1
  107. package/build/table/index.js.map +1 -1
  108. package/build/term-description/index.js +1 -0
  109. package/build/term-description/index.js.map +1 -1
  110. package/build/verse/index.js +5 -1
  111. package/build/verse/index.js.map +1 -1
  112. package/build/video/deprecated.js +5 -1
  113. package/build/video/deprecated.js.map +1 -1
  114. package/build/video/index.js +5 -1
  115. package/build/video/index.js.map +1 -1
  116. package/build-module/archives/index.js +5 -1
  117. package/build-module/archives/index.js.map +1 -1
  118. package/build-module/audio/index.js +5 -1
  119. package/build-module/audio/index.js.map +1 -1
  120. package/build-module/avatar/index.js +1 -1
  121. package/build-module/block/edit.js +1 -1
  122. package/build-module/block/edit.js.map +1 -1
  123. package/build-module/block/edit.native.js +7 -9
  124. package/build-module/block/edit.native.js.map +1 -1
  125. package/build-module/buttons/edit.js +5 -1
  126. package/build-module/buttons/edit.js.map +1 -1
  127. package/build-module/categories/index.js +5 -1
  128. package/build-module/categories/index.js.map +1 -1
  129. package/build-module/code/index.js +5 -1
  130. package/build-module/code/index.js.map +1 -1
  131. package/build-module/column/index.js +1 -0
  132. package/build-module/column/index.js.map +1 -1
  133. package/build-module/comments/index.js +1 -0
  134. package/build-module/comments/index.js.map +1 -1
  135. package/build-module/cover/edit/inspector-controls.js +2 -1
  136. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  137. package/build-module/cover/index.js +1 -0
  138. package/build-module/cover/index.js.map +1 -1
  139. package/build-module/details/index.js +5 -1
  140. package/build-module/details/index.js.map +1 -1
  141. package/build-module/embed/util.js +6 -6
  142. package/build-module/embed/util.js.map +1 -1
  143. package/build-module/file/index.js +2 -1
  144. package/build-module/file/index.js.map +1 -1
  145. package/build-module/file/view.js +15 -2
  146. package/build-module/file/view.js.map +1 -1
  147. package/build-module/gallery/index.js +3 -1
  148. package/build-module/gallery/index.js.map +1 -1
  149. package/build-module/group/index.js +1 -0
  150. package/build-module/group/index.js.map +1 -1
  151. package/build-module/heading/index.js +5 -1
  152. package/build-module/heading/index.js.map +1 -1
  153. package/build-module/heading/transforms.js +5 -1
  154. package/build-module/heading/transforms.js.map +1 -1
  155. package/build-module/image/deprecated.js +454 -176
  156. package/build-module/image/deprecated.js.map +1 -1
  157. package/build-module/image/edit.js +0 -4
  158. package/build-module/image/edit.js.map +1 -1
  159. package/build-module/image/image.js +96 -46
  160. package/build-module/image/image.js.map +1 -1
  161. package/build-module/image/index.js +6 -0
  162. package/build-module/image/index.js.map +1 -1
  163. package/build-module/image/save.js +8 -1
  164. package/build-module/image/save.js.map +1 -1
  165. package/build-module/image/utils.js +16 -0
  166. package/build-module/image/utils.js.map +1 -1
  167. package/build-module/image/{interactivity.js → view-interactivity.js} +86 -44
  168. package/build-module/image/view-interactivity.js.map +1 -0
  169. package/build-module/index.js +12 -3
  170. package/build-module/index.js.map +1 -1
  171. package/build-module/list/index.js +5 -1
  172. package/build-module/list/index.js.map +1 -1
  173. package/build-module/list-item/utils.js +6 -1
  174. package/build-module/list-item/utils.js.map +1 -1
  175. package/build-module/media-text/index.js +1 -0
  176. package/build-module/media-text/index.js.map +1 -1
  177. package/build-module/missing/edit.js +22 -8
  178. package/build-module/missing/edit.js.map +1 -1
  179. package/build-module/navigation/edit/index.js +1 -1
  180. package/build-module/navigation/edit/index.js.map +1 -1
  181. package/build-module/navigation/edit/menu-inspector-controls.js +0 -1
  182. package/build-module/navigation/edit/menu-inspector-controls.js.map +1 -1
  183. package/build-module/navigation/index.js +3 -2
  184. package/build-module/navigation/index.js.map +1 -1
  185. package/build-module/navigation/view.js +173 -50
  186. package/build-module/navigation/view.js.map +1 -1
  187. package/build-module/navigation-link/edit.js +1 -12
  188. package/build-module/navigation-link/edit.js.map +1 -1
  189. package/build-module/navigation-link/link-ui.js +13 -3
  190. package/build-module/navigation-link/link-ui.js.map +1 -1
  191. package/build-module/page-list/convert-to-links-modal.js +3 -3
  192. package/build-module/page-list/convert-to-links-modal.js.map +1 -1
  193. package/build-module/page-list/edit.js +34 -39
  194. package/build-module/page-list/edit.js.map +1 -1
  195. package/build-module/page-list/use-convert-to-navigation-links.js +3 -16
  196. package/build-module/page-list/use-convert-to-navigation-links.js.map +1 -1
  197. package/build-module/paragraph/index.js +1 -0
  198. package/build-module/paragraph/index.js.map +1 -1
  199. package/build-module/paragraph/transforms.js +1 -0
  200. package/build-module/paragraph/transforms.js.map +1 -1
  201. package/build-module/post-comments-form/index.js +1 -0
  202. package/build-module/post-comments-form/index.js.map +1 -1
  203. package/build-module/post-navigation-link/index.js +1 -0
  204. package/build-module/post-navigation-link/index.js.map +1 -1
  205. package/build-module/post-time-to-read/index.js +5 -1
  206. package/build-module/post-time-to-read/index.js.map +1 -1
  207. package/build-module/query-pagination-numbers/index.js +1 -1
  208. package/build-module/quote/index.js +1 -0
  209. package/build-module/quote/index.js.map +1 -1
  210. package/build-module/site-logo/index.js +5 -1
  211. package/build-module/site-logo/index.js.map +1 -1
  212. package/build-module/site-tagline/icon.js +1 -1
  213. package/build-module/site-tagline/icon.js.map +1 -1
  214. package/build-module/site-tagline/index.js +5 -1
  215. package/build-module/site-tagline/index.js.map +1 -1
  216. package/build-module/site-title/index.js +5 -1
  217. package/build-module/site-title/index.js.map +1 -1
  218. package/build-module/social-links/index.js +3 -1
  219. package/build-module/social-links/index.js.map +1 -1
  220. package/build-module/table/index.js +5 -1
  221. package/build-module/table/index.js.map +1 -1
  222. package/build-module/term-description/index.js +1 -0
  223. package/build-module/term-description/index.js.map +1 -1
  224. package/build-module/verse/index.js +5 -1
  225. package/build-module/verse/index.js.map +1 -1
  226. package/build-module/video/deprecated.js +5 -1
  227. package/build-module/video/deprecated.js.map +1 -1
  228. package/build-module/video/index.js +5 -1
  229. package/build-module/video/index.js.map +1 -1
  230. package/build-style/footnotes/style-rtl.css +2 -2
  231. package/build-style/footnotes/style.css +2 -2
  232. package/build-style/image/style-rtl.css +16 -2
  233. package/build-style/image/style.css +16 -2
  234. package/build-style/style-rtl.css +18 -4
  235. package/build-style/style.css +18 -4
  236. package/package.json +33 -38
  237. package/src/archives/block.json +5 -1
  238. package/src/audio/block.json +5 -1
  239. package/src/avatar/block.json +1 -1
  240. package/src/block/edit.js +2 -2
  241. package/src/block/edit.native.js +8 -12
  242. package/src/block/test/edit.native.js +4 -4
  243. package/src/buttons/edit.js +2 -2
  244. package/src/categories/block.json +5 -1
  245. package/src/code/block.json +5 -1
  246. package/src/column/block.json +1 -0
  247. package/src/comments/block.json +1 -0
  248. package/src/cover/block.json +1 -0
  249. package/src/cover/edit/inspector-controls.js +1 -0
  250. package/src/details/block.json +5 -1
  251. package/src/embed/util.js +4 -6
  252. package/src/file/block.json +2 -1
  253. package/src/file/index.php +0 -17
  254. package/src/file/view.js +14 -5
  255. package/src/footnotes/index.php +11 -9
  256. package/src/footnotes/style.scss +2 -2
  257. package/src/gallery/block.json +3 -1
  258. package/src/group/block.json +1 -0
  259. package/src/heading/block.json +5 -1
  260. package/src/heading/test/index.native.js +18 -0
  261. package/src/image/block.json +6 -0
  262. package/src/image/deprecated.js +597 -320
  263. package/src/image/edit.js +0 -4
  264. package/src/image/image.js +131 -62
  265. package/src/image/save.js +9 -1
  266. package/src/image/style.scss +15 -2
  267. package/src/image/utils.js +16 -0
  268. package/src/image/{interactivity.js → view-interactivity.js} +99 -50
  269. package/src/index.js +18 -1
  270. package/src/latest-posts/index.php +1 -1
  271. package/src/list/block.json +5 -1
  272. package/src/media-text/block.json +1 -0
  273. package/src/missing/edit.js +31 -11
  274. package/src/navigation/block.json +3 -2
  275. package/src/navigation/edit/index.js +1 -2
  276. package/src/navigation/edit/menu-inspector-controls.js +0 -1
  277. package/src/navigation/index.php +39 -30
  278. package/src/navigation/view.js +189 -67
  279. package/src/navigation-link/edit.js +1 -15
  280. package/src/navigation-link/link-ui.js +14 -2
  281. package/src/navigation-submenu/index.php +2 -12
  282. package/src/page-list/convert-to-links-modal.js +3 -3
  283. package/src/page-list/edit.js +65 -62
  284. package/src/page-list/use-convert-to-navigation-links.js +3 -20
  285. package/src/paragraph/block.json +1 -0
  286. package/src/post-comments-form/block.json +1 -0
  287. package/src/post-navigation-link/block.json +1 -0
  288. package/src/post-time-to-read/block.json +5 -1
  289. package/src/query-pagination-numbers/block.json +1 -1
  290. package/src/quote/block.json +1 -0
  291. package/src/site-logo/block.json +5 -1
  292. package/src/site-tagline/block.json +5 -1
  293. package/src/site-tagline/icon.js +1 -1
  294. package/src/site-title/block.json +5 -1
  295. package/src/social-links/block.json +3 -1
  296. package/src/table/block.json +5 -1
  297. package/src/term-description/block.json +1 -0
  298. package/src/verse/block.json +5 -1
  299. package/src/video/block.json +5 -1
  300. package/build/file/interactivity.js +0 -19
  301. package/build/file/interactivity.js.map +0 -1
  302. package/build/heading/heading-level-icon.js +0 -61
  303. package/build/heading/heading-level-icon.js.map +0 -1
  304. package/build/image/interactivity.js.map +0 -1
  305. package/build/navigation/interactivity.js +0 -167
  306. package/build/navigation/interactivity.js.map +0 -1
  307. package/build/navigation/view-modal.js +0 -64
  308. package/build/navigation/view-modal.js.map +0 -1
  309. package/build/utils/interactivity/constants.js +0 -9
  310. package/build/utils/interactivity/constants.js.map +0 -1
  311. package/build/utils/interactivity/directives.js +0 -222
  312. package/build/utils/interactivity/directives.js.map +0 -1
  313. package/build/utils/interactivity/hooks.js +0 -159
  314. package/build/utils/interactivity/hooks.js.map +0 -1
  315. package/build/utils/interactivity/hydration.js +0 -34
  316. package/build/utils/interactivity/hydration.js.map +0 -1
  317. package/build/utils/interactivity/index.js +0 -32
  318. package/build/utils/interactivity/index.js.map +0 -1
  319. package/build/utils/interactivity/portals.js +0 -108
  320. package/build/utils/interactivity/portals.js.map +0 -1
  321. package/build/utils/interactivity/store.js +0 -66
  322. package/build/utils/interactivity/store.js.map +0 -1
  323. package/build/utils/interactivity/utils.js +0 -87
  324. package/build/utils/interactivity/utils.js.map +0 -1
  325. package/build/utils/interactivity/vdom.js +0 -119
  326. package/build/utils/interactivity/vdom.js.map +0 -1
  327. package/build-module/file/interactivity.js +0 -15
  328. package/build-module/file/interactivity.js.map +0 -1
  329. package/build-module/heading/heading-level-icon.js +0 -53
  330. package/build-module/heading/heading-level-icon.js.map +0 -1
  331. package/build-module/image/interactivity.js.map +0 -1
  332. package/build-module/navigation/interactivity.js +0 -164
  333. package/build-module/navigation/interactivity.js.map +0 -1
  334. package/build-module/navigation/view-modal.js +0 -58
  335. package/build-module/navigation/view-modal.js.map +0 -1
  336. package/build-module/utils/interactivity/constants.js +0 -2
  337. package/build-module/utils/interactivity/constants.js.map +0 -1
  338. package/build-module/utils/interactivity/directives.js +0 -209
  339. package/build-module/utils/interactivity/directives.js.map +0 -1
  340. package/build-module/utils/interactivity/hooks.js +0 -145
  341. package/build-module/utils/interactivity/hooks.js.map +0 -1
  342. package/build-module/utils/interactivity/hydration.js +0 -21
  343. package/build-module/utils/interactivity/hydration.js.map +0 -1
  344. package/build-module/utils/interactivity/index.js +0 -15
  345. package/build-module/utils/interactivity/index.js.map +0 -1
  346. package/build-module/utils/interactivity/portals.js +0 -100
  347. package/build-module/utils/interactivity/portals.js.map +0 -1
  348. package/build-module/utils/interactivity/store.js +0 -55
  349. package/build-module/utils/interactivity/store.js.map +0 -1
  350. package/build-module/utils/interactivity/utils.js +0 -75
  351. package/build-module/utils/interactivity/utils.js.map +0 -1
  352. package/build-module/utils/interactivity/vdom.js +0 -107
  353. package/build-module/utils/interactivity/vdom.js.map +0 -1
  354. package/src/file/interactivity.js +0 -15
  355. package/src/heading/heading-level-icon.js +0 -48
  356. package/src/navigation/interactivity.js +0 -169
  357. package/src/navigation/view-modal.js +0 -78
  358. package/src/utils/interactivity/constants.js +0 -1
  359. package/src/utils/interactivity/directives.js +0 -200
  360. package/src/utils/interactivity/hooks.js +0 -145
  361. package/src/utils/interactivity/hydration.js +0 -22
  362. package/src/utils/interactivity/index.js +0 -15
  363. package/src/utils/interactivity/portals.js +0 -98
  364. package/src/utils/interactivity/store.js +0 -45
  365. package/src/utils/interactivity/utils.js +0 -66
  366. package/src/utils/interactivity/vdom.js +0 -111
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/image/image.js"],"names":["isBlobURL","ExternalLink","PanelBody","ResizableBox","Spinner","TextareaControl","TextControl","ToolbarButton","ToolbarGroup","useViewportMatch","usePrevious","useSelect","useDispatch","BlockControls","InspectorControls","RichText","__experimentalImageSizeControl","ImageSizeControl","__experimentalImageURLInputUI","ImageURLInputUI","MediaReplaceFlow","store","blockEditorStore","BlockAlignmentControl","__experimentalImageEditor","ImageEditor","__experimentalGetElementClassName","__experimentalUseBorderProps","useBorderProps","useEffect","useMemo","useState","useRef","useCallback","__","sprintf","isRTL","getFilename","createBlock","getDefaultBlockName","switchToBlockType","crop","overlayText","upload","caption","captionIcon","noticesStore","coreStore","createUpgradedEmbedBlock","useClientWidth","isExternalImage","MIN_SIZE","ALLOWED_MEDIA_TYPES","Image","temporaryURL","attributes","setAttributes","isSelected","insertBlocksAfter","onReplace","onSelectImage","onSelectURL","onUploadError","containerRef","context","clientId","blockEditingMode","url","alt","align","id","href","rel","linkClass","linkDestination","title","width","height","linkTarget","sizeSlug","imageRef","prevCaption","showCaption","setShowCaption","allowResize","getBlock","image","multiImageSelection","select","getMedia","getMultiSelectedBlockClientIds","getBlockName","multiSelectedClientIds","length","every","_clientId","canInsertCover","imageEditing","imageSizes","maxWidth","mediaUpload","getBlockRootClientId","getSettings","canInsertBlockType","rootClientId","settings","replaceBlocks","toggleSelection","createErrorNotice","createSuccessNotice","isLargeViewport","isWideAligned","includes","loadedNaturalWidth","loadedNaturalHeight","setLoadedNaturalSize","isEditingImage","setIsEditingImage","externalBlob","setExternalBlob","clientWidth","hasNonContentControls","isResizable","imageSizeOptions","filter","slug","media_details","sizes","source_url","map","name","value","label","canUploadMedia","window","fetch","then","response","blob","catch","captionRef","node","focus","naturalWidth","naturalHeight","current","undefined","complete","onResizeStart","onResizeStop","onImageError","embedBlock","onSetHref","props","onSetTitle","updateAlt","newAlt","updateImage","newSizeSlug","newUrl","uploadExternal","filesList","onFileChange","img","type","allowedTypes","onError","message","updateAlignment","nextAlign","extraUpdatedAttributes","canEditImage","allowCrop","switchToCover","controls","link","filename","defaultedAlt","borderProps","isRounded","className","hasCustomBorder","style","Object","keys","event","target","imageWidthWithinContainer","imageHeightWithinContainer","exceedMaxWidth","ratio","fallbackClientWidth","imageAttributes","currentWidth","currentHeight","minWidth","minHeight","maxWidthBuffer","showRightHandle","showLeftHandle","top","right","bottom","left","direction","elt","delta","parseInt","isEmpty"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { isBlobURL } from '@wordpress/blob';\nimport {\n\tExternalLink,\n\tPanelBody,\n\tResizableBox,\n\tSpinner,\n\tTextareaControl,\n\tTextControl,\n\tToolbarButton,\n\tToolbarGroup,\n} from '@wordpress/components';\nimport { useViewportMatch, usePrevious } from '@wordpress/compose';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport {\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n\t__experimentalImageSizeControl as ImageSizeControl,\n\t__experimentalImageURLInputUI as ImageURLInputUI,\n\tMediaReplaceFlow,\n\tstore as blockEditorStore,\n\tBlockAlignmentControl,\n\t__experimentalImageEditor as ImageEditor,\n\t__experimentalGetElementClassName,\n\t__experimentalUseBorderProps as useBorderProps,\n} from '@wordpress/block-editor';\nimport {\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseRef,\n\tuseCallback,\n} from '@wordpress/element';\nimport { __, sprintf, isRTL } from '@wordpress/i18n';\nimport { getFilename } from '@wordpress/url';\nimport {\n\tcreateBlock,\n\tgetDefaultBlockName,\n\tswitchToBlockType,\n} from '@wordpress/blocks';\nimport {\n\tcrop,\n\toverlayText,\n\tupload,\n\tcaption as captionIcon,\n} from '@wordpress/icons';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { createUpgradedEmbedBlock } from '../embed/util';\nimport useClientWidth from './use-client-width';\nimport { isExternalImage } from './edit';\n\n/**\n * Module constants\n */\nimport { MIN_SIZE, ALLOWED_MEDIA_TYPES } from './constants';\n\nexport default function Image( {\n\ttemporaryURL,\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tinsertBlocksAfter,\n\tonReplace,\n\tonSelectImage,\n\tonSelectURL,\n\tonUploadError,\n\tcontainerRef,\n\tcontext,\n\tclientId,\n\tblockEditingMode,\n} ) {\n\tconst {\n\t\turl = '',\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\tid,\n\t\thref,\n\t\trel,\n\t\tlinkClass,\n\t\tlinkDestination,\n\t\ttitle,\n\t\twidth,\n\t\theight,\n\t\tlinkTarget,\n\t\tsizeSlug,\n\t} = attributes;\n\tconst imageRef = useRef();\n\tconst prevCaption = usePrevious( caption );\n\tconst [ showCaption, setShowCaption ] = useState( !! caption );\n\tconst { allowResize = true } = context;\n\tconst { getBlock } = useSelect( blockEditorStore );\n\n\tconst { image, multiImageSelection } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getMedia } = select( coreStore );\n\t\t\tconst { getMultiSelectedBlockClientIds, getBlockName } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst multiSelectedClientIds = getMultiSelectedBlockClientIds();\n\t\t\treturn {\n\t\t\t\timage:\n\t\t\t\t\tid && isSelected\n\t\t\t\t\t\t? getMedia( id, { context: 'view' } )\n\t\t\t\t\t\t: null,\n\t\t\t\tmultiImageSelection:\n\t\t\t\t\tmultiSelectedClientIds.length &&\n\t\t\t\t\tmultiSelectedClientIds.every(\n\t\t\t\t\t\t( _clientId ) =>\n\t\t\t\t\t\t\tgetBlockName( _clientId ) === 'core/image'\n\t\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ id, isSelected ]\n\t);\n\tconst { canInsertCover, imageEditing, imageSizes, maxWidth, mediaUpload } =\n\t\tuseSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetBlockRootClientId,\n\t\t\t\t\tgetSettings,\n\t\t\t\t\tcanInsertBlockType,\n\t\t\t\t} = select( blockEditorStore );\n\n\t\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\t\tconst settings = getSettings();\n\n\t\t\t\treturn {\n\t\t\t\t\timageEditing: settings.imageEditing,\n\t\t\t\t\timageSizes: settings.imageSizes,\n\t\t\t\t\tmaxWidth: settings.maxWidth,\n\t\t\t\t\tmediaUpload: settings.mediaUpload,\n\t\t\t\t\tcanInsertCover: canInsertBlockType(\n\t\t\t\t\t\t'core/cover',\n\t\t\t\t\t\trootClientId\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\tconst { replaceBlocks, toggleSelection } = useDispatch( blockEditorStore );\n\tconst { createErrorNotice, createSuccessNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst isLargeViewport = useViewportMatch( 'medium' );\n\tconst isWideAligned = [ 'wide', 'full' ].includes( align );\n\tconst [\n\t\t{ loadedNaturalWidth, loadedNaturalHeight },\n\t\tsetLoadedNaturalSize,\n\t] = useState( {} );\n\tconst [ isEditingImage, setIsEditingImage ] = useState( false );\n\tconst [ externalBlob, setExternalBlob ] = useState();\n\tconst clientWidth = useClientWidth( containerRef, [ align ] );\n\tconst hasNonContentControls = blockEditingMode === 'default';\n\tconst isResizable =\n\t\tallowResize &&\n\t\thasNonContentControls &&\n\t\t! ( isWideAligned && isLargeViewport );\n\tconst imageSizeOptions = imageSizes\n\t\t.filter(\n\t\t\t( { slug } ) => image?.media_details?.sizes?.[ slug ]?.source_url\n\t\t)\n\t\t.map( ( { name, slug } ) => ( { value: slug, label: name } ) );\n\tconst canUploadMedia = !! mediaUpload;\n\n\t// If an image is externally hosted, try to fetch the image data. This may\n\t// fail if the image host doesn't allow CORS with the domain. If it works,\n\t// we can enable a button in the toolbar to upload the image.\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! isExternalImage( id, url ) ||\n\t\t\t! isSelected ||\n\t\t\t! canUploadMedia\n\t\t) {\n\t\t\tsetExternalBlob();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( externalBlob ) return;\n\n\t\twindow\n\t\t\t// Avoid cache, which seems to help avoid CORS problems.\n\t\t\t.fetch( url.includes( '?' ) ? url : url + '?' )\n\t\t\t.then( ( response ) => response.blob() )\n\t\t\t.then( ( blob ) => setExternalBlob( blob ) )\n\t\t\t// Do nothing, cannot upload.\n\t\t\t.catch( () => {} );\n\t}, [ id, url, isSelected, externalBlob, canUploadMedia ] );\n\n\t// We need to show the caption when changes come from\n\t// history navigation(undo/redo).\n\tuseEffect( () => {\n\t\tif ( caption && ! prevCaption ) {\n\t\t\tsetShowCaption( true );\n\t\t}\n\t}, [ caption, prevCaption ] );\n\n\t// Focus the caption when we click to add one.\n\tconst captionRef = useCallback(\n\t\t( node ) => {\n\t\t\tif ( node && ! caption ) {\n\t\t\t\tnode.focus();\n\t\t\t}\n\t\t},\n\t\t[ caption ]\n\t);\n\n\t// Get naturalWidth and naturalHeight from image ref, and fall back to loaded natural\n\t// width and height. This resolves an issue in Safari where the loaded natural\n\t// width and height is otherwise lost when switching between alignments.\n\t// See: https://github.com/WordPress/gutenberg/pull/37210.\n\tconst { naturalWidth, naturalHeight } = useMemo( () => {\n\t\treturn {\n\t\t\tnaturalWidth:\n\t\t\t\timageRef.current?.naturalWidth ||\n\t\t\t\tloadedNaturalWidth ||\n\t\t\t\tundefined,\n\t\t\tnaturalHeight:\n\t\t\t\timageRef.current?.naturalHeight ||\n\t\t\t\tloadedNaturalHeight ||\n\t\t\t\tundefined,\n\t\t};\n\t}, [\n\t\tloadedNaturalWidth,\n\t\tloadedNaturalHeight,\n\t\timageRef.current?.complete,\n\t] );\n\n\tfunction onResizeStart() {\n\t\ttoggleSelection( false );\n\t}\n\n\tfunction onResizeStop() {\n\t\ttoggleSelection( true );\n\t}\n\n\tfunction onImageError() {\n\t\t// Check if there's an embed block that handles this URL, e.g., instagram URL.\n\t\t// See: https://github.com/WordPress/gutenberg/pull/11472\n\t\tconst embedBlock = createUpgradedEmbedBlock( { attributes: { url } } );\n\n\t\tif ( undefined !== embedBlock ) {\n\t\t\tonReplace( embedBlock );\n\t\t}\n\t}\n\n\tfunction onSetHref( props ) {\n\t\tsetAttributes( props );\n\t}\n\n\tfunction onSetTitle( value ) {\n\t\t// This is the HTML title attribute, separate from the media object\n\t\t// title.\n\t\tsetAttributes( { title: value } );\n\t}\n\n\tfunction updateAlt( newAlt ) {\n\t\tsetAttributes( { alt: newAlt } );\n\t}\n\n\tfunction updateImage( newSizeSlug ) {\n\t\tconst newUrl = image?.media_details?.sizes?.[ newSizeSlug ]?.source_url;\n\t\tif ( ! newUrl ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tsetAttributes( {\n\t\t\turl: newUrl,\n\t\t\twidth: undefined,\n\t\t\theight: undefined,\n\t\t\tsizeSlug: newSizeSlug,\n\t\t} );\n\t}\n\n\tfunction uploadExternal() {\n\t\tmediaUpload( {\n\t\t\tfilesList: [ externalBlob ],\n\t\t\tonFileChange( [ img ] ) {\n\t\t\t\tonSelectImage( img );\n\n\t\t\t\tif ( isBlobURL( img.url ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetExternalBlob();\n\t\t\t\tcreateSuccessNotice( __( 'Image uploaded.' ), {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t} );\n\t\t\t},\n\t\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\t\tonError( message ) {\n\t\t\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t\t\t},\n\t\t} );\n\t}\n\n\tfunction updateAlignment( nextAlign ) {\n\t\tconst extraUpdatedAttributes = [ 'wide', 'full' ].includes( nextAlign )\n\t\t\t? { width: undefined, height: undefined }\n\t\t\t: {};\n\t\tsetAttributes( {\n\t\t\t...extraUpdatedAttributes,\n\t\t\talign: nextAlign,\n\t\t} );\n\t}\n\n\tuseEffect( () => {\n\t\tif ( ! isSelected ) {\n\t\t\tsetIsEditingImage( false );\n\t\t\tif ( ! caption ) {\n\t\t\t\tsetShowCaption( false );\n\t\t\t}\n\t\t}\n\t}, [ isSelected, caption ] );\n\n\tconst canEditImage = id && naturalWidth && naturalHeight && imageEditing;\n\tconst allowCrop = ! multiImageSelection && canEditImage && ! isEditingImage;\n\n\tfunction switchToCover() {\n\t\treplaceBlocks(\n\t\t\tclientId,\n\t\t\tswitchToBlockType( getBlock( clientId ), 'core/cover' )\n\t\t);\n\t}\n\n\tconst controls = (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<BlockAlignmentControl\n\t\t\t\t\t\tvalue={ align }\n\t\t\t\t\t\tonChange={ updateAlignment }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tsetShowCaption( ! showCaption );\n\t\t\t\t\t\t\tif ( showCaption && caption ) {\n\t\t\t\t\t\t\t\tsetAttributes( { caption: undefined } );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} }\n\t\t\t\t\t\ticon={ captionIcon }\n\t\t\t\t\t\tisPressed={ showCaption }\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\tshowCaption\n\t\t\t\t\t\t\t\t? __( 'Remove caption' )\n\t\t\t\t\t\t\t\t: __( 'Add caption' )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t\t<ImageURLInputUI\n\t\t\t\t\t\turl={ href || '' }\n\t\t\t\t\t\tonChangeUrl={ onSetHref }\n\t\t\t\t\t\tlinkDestination={ linkDestination }\n\t\t\t\t\t\tmediaUrl={ ( image && image.source_url ) || url }\n\t\t\t\t\t\tmediaLink={ image && image.link }\n\t\t\t\t\t\tlinkTarget={ linkTarget }\n\t\t\t\t\t\tlinkClass={ linkClass }\n\t\t\t\t\t\trel={ rel }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ allowCrop && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => setIsEditingImage( true ) }\n\t\t\t\t\t\ticon={ crop }\n\t\t\t\t\t\tlabel={ __( 'Crop' ) }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && canInsertCover && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\ticon={ overlayText }\n\t\t\t\t\t\tlabel={ __( 'Add text over image' ) }\n\t\t\t\t\t\tonClick={ switchToCover }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</BlockControls>\n\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t<BlockControls group=\"other\">\n\t\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\t\tmediaId={ id }\n\t\t\t\t\t\tmediaURL={ url }\n\t\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\t\tonSelect={ onSelectImage }\n\t\t\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ ! multiImageSelection && externalBlob && (\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ uploadExternal }\n\t\t\t\t\t\t\ticon={ upload }\n\t\t\t\t\t\t\tlabel={ __( 'Upload external image' ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t<InspectorControls>\n\t\t\t\t<PanelBody title={ __( 'Settings' ) }>\n\t\t\t\t\t{ ! multiImageSelection && (\n\t\t\t\t\t\t<TextareaControl\n\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\tvalue={ alt }\n\t\t\t\t\t\t\tonChange={ updateAlt }\n\t\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/WAI/tutorials/images/decision-tree\">\n\t\t\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t\t\t'Describe the purpose of the image.'\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t{ __( 'Leave empty if decorative.' ) }\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t\t<ImageSizeControl\n\t\t\t\t\t\tonChangeImage={ updateImage }\n\t\t\t\t\t\tonChange={ ( value ) => setAttributes( value ) }\n\t\t\t\t\t\tslug={ sizeSlug }\n\t\t\t\t\t\twidth={ width }\n\t\t\t\t\t\theight={ height }\n\t\t\t\t\t\timageSizeOptions={ imageSizeOptions }\n\t\t\t\t\t\tisResizable={ isResizable }\n\t\t\t\t\t\timageWidth={ naturalWidth }\n\t\t\t\t\t\timageHeight={ naturalHeight }\n\t\t\t\t\t\timageSizeHelp={ __(\n\t\t\t\t\t\t\t'Select the size of the source image.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t/>\n\t\t\t\t</PanelBody>\n\t\t\t</InspectorControls>\n\t\t\t<InspectorControls group=\"advanced\">\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Title attribute' ) }\n\t\t\t\t\tvalue={ title || '' }\n\t\t\t\t\tonChange={ onSetTitle }\n\t\t\t\t\thelp={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Describe the role of this image on the page.'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/TR/html52/dom.html#the-title-attribute\">\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'(Note: many devices and browsers do not display this text.)'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</InspectorControls>\n\t\t</>\n\t);\n\n\tconst filename = getFilename( url );\n\tlet defaultedAlt;\n\n\tif ( alt ) {\n\t\tdefaultedAlt = alt;\n\t} else if ( filename ) {\n\t\tdefaultedAlt = sprintf(\n\t\t\t/* translators: %s: file name */\n\t\t\t__( 'This image has an empty alt attribute; its file name is %s' ),\n\t\t\tfilename\n\t\t);\n\t} else {\n\t\tdefaultedAlt = __( 'This image has an empty alt attribute' );\n\t}\n\n\tconst borderProps = useBorderProps( attributes );\n\tconst isRounded = attributes.className?.includes( 'is-style-rounded' );\n\tconst hasCustomBorder =\n\t\t!! borderProps.className ||\n\t\t( borderProps.style && Object.keys( borderProps.style ).length > 0 );\n\n\tlet img = (\n\t\t// Disable reason: Image itself is not meant to be interactive, but\n\t\t// should direct focus to block.\n\t\t/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t\t<>\n\t\t\t<img\n\t\t\t\tsrc={ temporaryURL || url }\n\t\t\t\talt={ defaultedAlt }\n\t\t\t\tonError={ () => onImageError() }\n\t\t\t\tonLoad={ ( event ) => {\n\t\t\t\t\tsetLoadedNaturalSize( {\n\t\t\t\t\t\tloadedNaturalWidth: event.target?.naturalWidth,\n\t\t\t\t\t\tloadedNaturalHeight: event.target?.naturalHeight,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tref={ imageRef }\n\t\t\t\tclassName={ borderProps.className }\n\t\t\t\tstyle={ borderProps.style }\n\t\t\t/>\n\t\t\t{ temporaryURL && <Spinner /> }\n\t\t</>\n\t\t/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t);\n\n\tlet imageWidthWithinContainer;\n\tlet imageHeightWithinContainer;\n\n\tif ( clientWidth && naturalWidth && naturalHeight ) {\n\t\tconst exceedMaxWidth = naturalWidth > clientWidth;\n\t\tconst ratio = naturalHeight / naturalWidth;\n\t\timageWidthWithinContainer = exceedMaxWidth ? clientWidth : naturalWidth;\n\t\timageHeightWithinContainer = exceedMaxWidth\n\t\t\t? clientWidth * ratio\n\t\t\t: naturalHeight;\n\t}\n\n\t// clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0\n\t// So we try using the imageRef width first and fallback to clientWidth.\n\tconst fallbackClientWidth = imageRef.current?.width || clientWidth;\n\n\tif ( canEditImage && isEditingImage ) {\n\t\timg = (\n\t\t\t<ImageEditor\n\t\t\t\tid={ id }\n\t\t\t\turl={ url }\n\t\t\t\twidth={ width }\n\t\t\t\theight={ height }\n\t\t\t\tclientWidth={ fallbackClientWidth }\n\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t\tonSaveImage={ ( imageAttributes ) =>\n\t\t\t\t\tsetAttributes( imageAttributes )\n\t\t\t\t}\n\t\t\t\tonFinishEditing={ () => {\n\t\t\t\t\tsetIsEditingImage( false );\n\t\t\t\t} }\n\t\t\t\tborderProps={ isRounded ? undefined : borderProps }\n\t\t\t/>\n\t\t);\n\t} else if ( ! isResizable || ! imageWidthWithinContainer ) {\n\t\timg = <div style={ { width, height } }>{ img }</div>;\n\t} else {\n\t\tconst currentWidth = width || imageWidthWithinContainer;\n\t\tconst currentHeight = height || imageHeightWithinContainer;\n\n\t\tconst ratio = naturalWidth / naturalHeight;\n\t\tconst minWidth =\n\t\t\tnaturalWidth < naturalHeight ? MIN_SIZE : MIN_SIZE * ratio;\n\t\tconst minHeight =\n\t\t\tnaturalHeight < naturalWidth ? MIN_SIZE : MIN_SIZE / ratio;\n\n\t\t// With the current implementation of ResizableBox, an image needs an\n\t\t// explicit pixel value for the max-width. In absence of being able to\n\t\t// set the content-width, this max-width is currently dictated by the\n\t\t// vanilla editor style. The following variable adds a buffer to this\n\t\t// vanilla style, so 3rd party themes have some wiggleroom. This does,\n\t\t// in most cases, allow you to scale the image beyond the width of the\n\t\t// main column, though not infinitely.\n\t\t// @todo It would be good to revisit this once a content-width variable\n\t\t// becomes available.\n\t\tconst maxWidthBuffer = maxWidth * 2.5;\n\n\t\tlet showRightHandle = false;\n\t\tlet showLeftHandle = false;\n\n\t\t/* eslint-disable no-lonely-if */\n\t\t// See https://github.com/WordPress/gutenberg/issues/7584.\n\t\tif ( align === 'center' ) {\n\t\t\t// When the image is centered, show both handles.\n\t\t\tshowRightHandle = true;\n\t\t\tshowLeftHandle = true;\n\t\t} else if ( isRTL() ) {\n\t\t\t// In RTL mode the image is on the right by default.\n\t\t\t// Show the right handle and hide the left handle only when it is\n\t\t\t// aligned left. Otherwise always show the left handle.\n\t\t\tif ( align === 'left' ) {\n\t\t\t\tshowRightHandle = true;\n\t\t\t} else {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// Show the left handle and hide the right handle only when the\n\t\t\t// image is aligned right. Otherwise always show the right handle.\n\t\t\tif ( align === 'right' ) {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t} else {\n\t\t\t\tshowRightHandle = true;\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-lonely-if */\n\n\t\timg = (\n\t\t\t<ResizableBox\n\t\t\t\tsize={ {\n\t\t\t\t\twidth: width ?? 'auto',\n\t\t\t\t\theight: height && ! hasCustomBorder ? height : 'auto',\n\t\t\t\t} }\n\t\t\t\tshowHandle={ isSelected }\n\t\t\t\tminWidth={ minWidth }\n\t\t\t\tmaxWidth={ maxWidthBuffer }\n\t\t\t\tminHeight={ minHeight }\n\t\t\t\tmaxHeight={ maxWidthBuffer / ratio }\n\t\t\t\tlockAspectRatio\n\t\t\t\tenable={ {\n\t\t\t\t\ttop: false,\n\t\t\t\t\tright: showRightHandle,\n\t\t\t\t\tbottom: true,\n\t\t\t\t\tleft: showLeftHandle,\n\t\t\t\t} }\n\t\t\t\tonResizeStart={ onResizeStart }\n\t\t\t\tonResizeStop={ ( event, direction, elt, delta ) => {\n\t\t\t\t\tonResizeStop();\n\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\twidth: parseInt( currentWidth + delta.width, 10 ),\n\t\t\t\t\t\theight: parseInt( currentHeight + delta.height, 10 ),\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tresizeRatio={ align === 'center' ? 2 : 1 }\n\t\t\t>\n\t\t\t\t{ img }\n\t\t\t</ResizableBox>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ /* Hide controls during upload to avoid component remount,\n\t\t\t\twhich causes duplicated image upload. */ }\n\t\t\t{ ! temporaryURL && controls }\n\t\t\t{ img }\n\t\t\t{ showCaption &&\n\t\t\t\t( ! RichText.isEmpty( caption ) || isSelected ) && (\n\t\t\t\t\t<RichText\n\t\t\t\t\t\tidentifier=\"caption\"\n\t\t\t\t\t\tclassName={ __experimentalGetElementClassName(\n\t\t\t\t\t\t\t'caption'\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tref={ captionRef }\n\t\t\t\t\t\ttagName=\"figcaption\"\n\t\t\t\t\t\taria-label={ __( 'Image caption text' ) }\n\t\t\t\t\t\tplaceholder={ __( 'Add caption' ) }\n\t\t\t\t\t\tvalue={ caption }\n\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\tsetAttributes( { caption: value } )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinlineToolbar\n\t\t\t\t\t\t__unstableOnSplitAtEnd={ () =>\n\t\t\t\t\t\t\tinsertBlocksAfter(\n\t\t\t\t\t\t\t\tcreateBlock( getDefaultBlockName() )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/image/image.js"],"names":["isBlobURL","ExternalLink","ResizableBox","Spinner","TextareaControl","TextControl","ToolbarButton","ToolbarGroup","__experimentalToolsPanel","ToolsPanel","__experimentalToolsPanelItem","ToolsPanelItem","__experimentalUseCustomUnits","useCustomUnits","useViewportMatch","usePrevious","useSelect","useDispatch","BlockControls","InspectorControls","RichText","__experimentalImageURLInputUI","ImageURLInputUI","MediaReplaceFlow","store","blockEditorStore","BlockAlignmentControl","__experimentalImageEditor","ImageEditor","__experimentalGetElementClassName","__experimentalUseBorderProps","useBorderProps","privateApis","blockEditorPrivateApis","useEffect","useMemo","useState","useRef","useCallback","__","_x","sprintf","isRTL","getFilename","createBlock","getDefaultBlockName","switchToBlockType","crop","overlayText","upload","caption","captionIcon","noticesStore","coreStore","unlock","createUpgradedEmbedBlock","useClientWidth","isExternalImage","MIN_SIZE","ALLOWED_MEDIA_TYPES","evalAspectRatio","DimensionsTool","ResolutionTool","scaleOptions","value","label","help","Image","temporaryURL","attributes","setAttributes","isSelected","insertBlocksAfter","onReplace","onSelectImage","onSelectURL","onUploadError","containerRef","context","clientId","blockEditingMode","url","alt","align","id","href","rel","linkClass","linkDestination","title","width","height","aspectRatio","scale","linkTarget","sizeSlug","imageRef","prevCaption","showCaption","setShowCaption","allowResize","getBlock","image","multiImageSelection","select","getMedia","getMultiSelectedBlockClientIds","getBlockName","multiSelectedClientIds","length","every","_clientId","canInsertCover","imageEditing","imageSizes","maxWidth","mediaUpload","getBlockRootClientId","getSettings","canInsertBlockType","rootClientId","settings","replaceBlocks","toggleSelection","createErrorNotice","createSuccessNotice","isLargeViewport","isWideAligned","includes","loadedNaturalWidth","loadedNaturalHeight","setLoadedNaturalSize","isEditingImage","setIsEditingImage","externalBlob","setExternalBlob","clientWidth","hasNonContentControls","isResizable","imageSizeOptions","filter","slug","media_details","sizes","source_url","map","name","canUploadMedia","window","fetch","then","response","blob","catch","captionRef","node","focus","naturalWidth","naturalHeight","current","undefined","complete","onResizeStart","onResizeStop","onImageError","embedBlock","onSetHref","props","onSetTitle","updateAlt","newAlt","updateImage","newSizeSlug","newUrl","uploadExternal","filesList","onFileChange","img","type","allowedTypes","onError","message","updateAlignment","nextAlign","extraUpdatedAttributes","canEditImage","allowCrop","switchToCover","dimensionsUnitsOptions","availableUnits","controls","link","newValue","parseInt","filename","defaultedAlt","borderProps","isRounded","className","event","target","objectFit","style","fallbackClientWidth","imageAttributes","ratio","currentWidth","currentHeight","minWidth","minHeight","maxWidthBuffer","showRightHandle","showLeftHandle","display","top","right","bottom","left","direction","elt","offsetWidth","offsetHeight","isEmpty"],"mappings":"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","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { isBlobURL } from '@wordpress/blob';\nimport {\n\tExternalLink,\n\tResizableBox,\n\tSpinner,\n\tTextareaControl,\n\tTextControl,\n\tToolbarButton,\n\tToolbarGroup,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\t__experimentalUseCustomUnits as useCustomUnits,\n} from '@wordpress/components';\nimport { useViewportMatch, usePrevious } from '@wordpress/compose';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport {\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n\t__experimentalImageURLInputUI as ImageURLInputUI,\n\tMediaReplaceFlow,\n\tstore as blockEditorStore,\n\tBlockAlignmentControl,\n\t__experimentalImageEditor as ImageEditor,\n\t__experimentalGetElementClassName,\n\t__experimentalUseBorderProps as useBorderProps,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\nimport {\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseRef,\n\tuseCallback,\n} from '@wordpress/element';\nimport { __, _x, sprintf, isRTL } from '@wordpress/i18n';\nimport { getFilename } from '@wordpress/url';\nimport {\n\tcreateBlock,\n\tgetDefaultBlockName,\n\tswitchToBlockType,\n} from '@wordpress/blocks';\nimport {\n\tcrop,\n\toverlayText,\n\tupload,\n\tcaption as captionIcon,\n} from '@wordpress/icons';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\nimport { createUpgradedEmbedBlock } from '../embed/util';\nimport useClientWidth from './use-client-width';\nimport { isExternalImage } from './edit';\n\n/**\n * Module constants\n */\nimport { MIN_SIZE, ALLOWED_MEDIA_TYPES } from './constants';\nimport { evalAspectRatio } from './utils';\n\nconst { DimensionsTool, ResolutionTool } = unlock( blockEditorPrivateApis );\n\nconst scaleOptions = [\n\t{\n\t\tvalue: 'cover',\n\t\tlabel: _x( 'Cover', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Image covers the space evenly.' ),\n\t},\n\t{\n\t\tvalue: 'contain',\n\t\tlabel: _x( 'Contain', 'Scale option for dimensions control' ),\n\t\thelp: __( 'Image is contained without distortion.' ),\n\t},\n];\n\nexport default function Image( {\n\ttemporaryURL,\n\tattributes,\n\tsetAttributes,\n\tisSelected,\n\tinsertBlocksAfter,\n\tonReplace,\n\tonSelectImage,\n\tonSelectURL,\n\tonUploadError,\n\tcontainerRef,\n\tcontext,\n\tclientId,\n\tblockEditingMode,\n} ) {\n\tconst {\n\t\turl = '',\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\tid,\n\t\thref,\n\t\trel,\n\t\tlinkClass,\n\t\tlinkDestination,\n\t\ttitle,\n\t\twidth,\n\t\theight,\n\t\taspectRatio,\n\t\tscale,\n\t\tlinkTarget,\n\t\tsizeSlug,\n\t} = attributes;\n\tconst imageRef = useRef();\n\tconst prevCaption = usePrevious( caption );\n\tconst [ showCaption, setShowCaption ] = useState( !! caption );\n\tconst { allowResize = true } = context;\n\tconst { getBlock } = useSelect( blockEditorStore );\n\n\tconst { image, multiImageSelection } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getMedia } = select( coreStore );\n\t\t\tconst { getMultiSelectedBlockClientIds, getBlockName } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst multiSelectedClientIds = getMultiSelectedBlockClientIds();\n\t\t\treturn {\n\t\t\t\timage:\n\t\t\t\t\tid && isSelected\n\t\t\t\t\t\t? getMedia( id, { context: 'view' } )\n\t\t\t\t\t\t: null,\n\t\t\t\tmultiImageSelection:\n\t\t\t\t\tmultiSelectedClientIds.length &&\n\t\t\t\t\tmultiSelectedClientIds.every(\n\t\t\t\t\t\t( _clientId ) =>\n\t\t\t\t\t\t\tgetBlockName( _clientId ) === 'core/image'\n\t\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ id, isSelected ]\n\t);\n\tconst { canInsertCover, imageEditing, imageSizes, maxWidth, mediaUpload } =\n\t\tuseSelect(\n\t\t\t( select ) => {\n\t\t\t\tconst {\n\t\t\t\t\tgetBlockRootClientId,\n\t\t\t\t\tgetSettings,\n\t\t\t\t\tcanInsertBlockType,\n\t\t\t\t} = select( blockEditorStore );\n\n\t\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\t\t\t\tconst settings = getSettings();\n\n\t\t\t\treturn {\n\t\t\t\t\timageEditing: settings.imageEditing,\n\t\t\t\t\timageSizes: settings.imageSizes,\n\t\t\t\t\tmaxWidth: settings.maxWidth,\n\t\t\t\t\tmediaUpload: settings.mediaUpload,\n\t\t\t\t\tcanInsertCover: canInsertBlockType(\n\t\t\t\t\t\t'core/cover',\n\t\t\t\t\t\trootClientId\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t},\n\t\t\t[ clientId ]\n\t\t);\n\tconst { replaceBlocks, toggleSelection } = useDispatch( blockEditorStore );\n\tconst { createErrorNotice, createSuccessNotice } =\n\t\tuseDispatch( noticesStore );\n\tconst isLargeViewport = useViewportMatch( 'medium' );\n\tconst isWideAligned = [ 'wide', 'full' ].includes( align );\n\tconst [\n\t\t{ loadedNaturalWidth, loadedNaturalHeight },\n\t\tsetLoadedNaturalSize,\n\t] = useState( {} );\n\tconst [ isEditingImage, setIsEditingImage ] = useState( false );\n\tconst [ externalBlob, setExternalBlob ] = useState();\n\tconst clientWidth = useClientWidth( containerRef, [ align ] );\n\tconst hasNonContentControls = blockEditingMode === 'default';\n\tconst isResizable =\n\t\tallowResize &&\n\t\thasNonContentControls &&\n\t\t! ( isWideAligned && isLargeViewport );\n\tconst imageSizeOptions = imageSizes\n\t\t.filter(\n\t\t\t( { slug } ) => image?.media_details?.sizes?.[ slug ]?.source_url\n\t\t)\n\t\t.map( ( { name, slug } ) => ( { value: slug, label: name } ) );\n\tconst canUploadMedia = !! mediaUpload;\n\n\t// If an image is externally hosted, try to fetch the image data. This may\n\t// fail if the image host doesn't allow CORS with the domain. If it works,\n\t// we can enable a button in the toolbar to upload the image.\n\tuseEffect( () => {\n\t\tif (\n\t\t\t! isExternalImage( id, url ) ||\n\t\t\t! isSelected ||\n\t\t\t! canUploadMedia\n\t\t) {\n\t\t\tsetExternalBlob();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( externalBlob ) return;\n\n\t\twindow\n\t\t\t// Avoid cache, which seems to help avoid CORS problems.\n\t\t\t.fetch( url.includes( '?' ) ? url : url + '?' )\n\t\t\t.then( ( response ) => response.blob() )\n\t\t\t.then( ( blob ) => setExternalBlob( blob ) )\n\t\t\t// Do nothing, cannot upload.\n\t\t\t.catch( () => {} );\n\t}, [ id, url, isSelected, externalBlob, canUploadMedia ] );\n\n\t// We need to show the caption when changes come from\n\t// history navigation(undo/redo).\n\tuseEffect( () => {\n\t\tif ( caption && ! prevCaption ) {\n\t\t\tsetShowCaption( true );\n\t\t}\n\t}, [ caption, prevCaption ] );\n\n\t// Focus the caption when we click to add one.\n\tconst captionRef = useCallback(\n\t\t( node ) => {\n\t\t\tif ( node && ! caption ) {\n\t\t\t\tnode.focus();\n\t\t\t}\n\t\t},\n\t\t[ caption ]\n\t);\n\n\t// Get naturalWidth and naturalHeight from image ref, and fall back to loaded natural\n\t// width and height. This resolves an issue in Safari where the loaded natural\n\t// width and height is otherwise lost when switching between alignments.\n\t// See: https://github.com/WordPress/gutenberg/pull/37210.\n\tconst { naturalWidth, naturalHeight } = useMemo( () => {\n\t\treturn {\n\t\t\tnaturalWidth:\n\t\t\t\timageRef.current?.naturalWidth ||\n\t\t\t\tloadedNaturalWidth ||\n\t\t\t\tundefined,\n\t\t\tnaturalHeight:\n\t\t\t\timageRef.current?.naturalHeight ||\n\t\t\t\tloadedNaturalHeight ||\n\t\t\t\tundefined,\n\t\t};\n\t}, [\n\t\tloadedNaturalWidth,\n\t\tloadedNaturalHeight,\n\t\timageRef.current?.complete,\n\t] );\n\n\tfunction onResizeStart() {\n\t\ttoggleSelection( false );\n\t}\n\n\tfunction onResizeStop() {\n\t\ttoggleSelection( true );\n\t}\n\n\tfunction onImageError() {\n\t\t// Check if there's an embed block that handles this URL, e.g., instagram URL.\n\t\t// See: https://github.com/WordPress/gutenberg/pull/11472\n\t\tconst embedBlock = createUpgradedEmbedBlock( { attributes: { url } } );\n\n\t\tif ( undefined !== embedBlock ) {\n\t\t\tonReplace( embedBlock );\n\t\t}\n\t}\n\n\tfunction onSetHref( props ) {\n\t\tsetAttributes( props );\n\t}\n\n\tfunction onSetTitle( value ) {\n\t\t// This is the HTML title attribute, separate from the media object\n\t\t// title.\n\t\tsetAttributes( { title: value } );\n\t}\n\n\tfunction updateAlt( newAlt ) {\n\t\tsetAttributes( { alt: newAlt } );\n\t}\n\n\tfunction updateImage( newSizeSlug ) {\n\t\tconst newUrl = image?.media_details?.sizes?.[ newSizeSlug ]?.source_url;\n\t\tif ( ! newUrl ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tsetAttributes( {\n\t\t\turl: newUrl,\n\t\t\tsizeSlug: newSizeSlug,\n\t\t} );\n\t}\n\n\tfunction uploadExternal() {\n\t\tmediaUpload( {\n\t\t\tfilesList: [ externalBlob ],\n\t\t\tonFileChange( [ img ] ) {\n\t\t\t\tonSelectImage( img );\n\n\t\t\t\tif ( isBlobURL( img.url ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetExternalBlob();\n\t\t\t\tcreateSuccessNotice( __( 'Image uploaded.' ), {\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t} );\n\t\t\t},\n\t\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\t\tonError( message ) {\n\t\t\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t\t\t},\n\t\t} );\n\t}\n\n\tfunction updateAlignment( nextAlign ) {\n\t\tconst extraUpdatedAttributes = [ 'wide', 'full' ].includes( nextAlign )\n\t\t\t? { width: undefined, height: undefined }\n\t\t\t: {};\n\t\tsetAttributes( {\n\t\t\t...extraUpdatedAttributes,\n\t\t\talign: nextAlign,\n\t\t} );\n\t}\n\n\tuseEffect( () => {\n\t\tif ( ! isSelected ) {\n\t\t\tsetIsEditingImage( false );\n\t\t\tif ( ! caption ) {\n\t\t\t\tsetShowCaption( false );\n\t\t\t}\n\t\t}\n\t}, [ isSelected, caption ] );\n\n\tconst canEditImage = id && naturalWidth && naturalHeight && imageEditing;\n\tconst allowCrop = ! multiImageSelection && canEditImage && ! isEditingImage;\n\n\tfunction switchToCover() {\n\t\treplaceBlocks(\n\t\t\tclientId,\n\t\t\tswitchToBlockType( getBlock( clientId ), 'core/cover' )\n\t\t);\n\t}\n\n\t// TODO: Can allow more units after figuring out how they should interact\n\t// with the ResizableBox and ImageEditor components. Calculations later on\n\t// for those components are currently assuming px units.\n\tconst dimensionsUnitsOptions = useCustomUnits( {\n\t\tavailableUnits: [ 'px' ],\n\t} );\n\n\tconst controls = (\n\t\t<>\n\t\t\t<BlockControls group=\"block\">\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<BlockAlignmentControl\n\t\t\t\t\t\tvalue={ align }\n\t\t\t\t\t\tonChange={ updateAlignment }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ hasNonContentControls && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tsetShowCaption( ! showCaption );\n\t\t\t\t\t\t\tif ( showCaption && caption ) {\n\t\t\t\t\t\t\t\tsetAttributes( { caption: undefined } );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} }\n\t\t\t\t\t\ticon={ captionIcon }\n\t\t\t\t\t\tisPressed={ showCaption }\n\t\t\t\t\t\tlabel={\n\t\t\t\t\t\t\tshowCaption\n\t\t\t\t\t\t\t\t? __( 'Remove caption' )\n\t\t\t\t\t\t\t\t: __( 'Add caption' )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t\t<ImageURLInputUI\n\t\t\t\t\t\turl={ href || '' }\n\t\t\t\t\t\tonChangeUrl={ onSetHref }\n\t\t\t\t\t\tlinkDestination={ linkDestination }\n\t\t\t\t\t\tmediaUrl={ ( image && image.source_url ) || url }\n\t\t\t\t\t\tmediaLink={ image && image.link }\n\t\t\t\t\t\tlinkTarget={ linkTarget }\n\t\t\t\t\t\tlinkClass={ linkClass }\n\t\t\t\t\t\trel={ rel }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ allowCrop && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\tonClick={ () => setIsEditingImage( true ) }\n\t\t\t\t\t\ticon={ crop }\n\t\t\t\t\t\tlabel={ __( 'Crop' ) }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t\t{ ! multiImageSelection && canInsertCover && (\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\ticon={ overlayText }\n\t\t\t\t\t\tlabel={ __( 'Add text over image' ) }\n\t\t\t\t\t\tonClick={ switchToCover }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</BlockControls>\n\t\t\t{ ! multiImageSelection && ! isEditingImage && (\n\t\t\t\t<BlockControls group=\"other\">\n\t\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\t\tmediaId={ id }\n\t\t\t\t\t\tmediaURL={ url }\n\t\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\t\tonSelect={ onSelectImage }\n\t\t\t\t\t\tonSelectURL={ onSelectURL }\n\t\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t\t/>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t{ ! multiImageSelection && externalBlob && (\n\t\t\t\t<BlockControls>\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ uploadExternal }\n\t\t\t\t\t\t\ticon={ upload }\n\t\t\t\t\t\t\tlabel={ __( 'Upload external image' ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t</BlockControls>\n\t\t\t) }\n\t\t\t<InspectorControls>\n\t\t\t\t<ToolsPanel\n\t\t\t\t\tlabel={ __( 'Settings' ) }\n\t\t\t\t\tresetAll={ () =>\n\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\twidth: undefined,\n\t\t\t\t\t\t\theight: undefined,\n\t\t\t\t\t\t\tscale: undefined,\n\t\t\t\t\t\t\taspectRatio: undefined,\n\t\t\t\t\t\t} )\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{ ! multiImageSelection && (\n\t\t\t\t\t\t<ToolsPanelItem\n\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\tisShownByDefault={ true }\n\t\t\t\t\t\t\thasValue={ () => alt !== '' }\n\t\t\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\t\t\tsetAttributes( { alt: undefined } )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<TextareaControl\n\t\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\t\tvalue={ alt }\n\t\t\t\t\t\t\t\tonChange={ updateAlt }\n\t\t\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/WAI/tutorials/images/decision-tree\">\n\t\t\t\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t\t\t\t'Describe the purpose of the image.'\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t{ __( 'Leave empty if decorative.' ) }\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</ToolsPanelItem>\n\t\t\t\t\t) }\n\t\t\t\t\t<DimensionsTool\n\t\t\t\t\t\tvalue={ {\n\t\t\t\t\t\t\twidth: width && `${ width }px`,\n\t\t\t\t\t\t\theight: height && `${ height }px`,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\taspectRatio,\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonChange={ ( newValue ) => {\n\t\t\t\t\t\t\t// Rebuilding the object forces setting `undefined`\n\t\t\t\t\t\t\t// for values that are removed since setAttributes\n\t\t\t\t\t\t\t// doesn't do anything with keys that aren't set.\n\t\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\t\twidth:\n\t\t\t\t\t\t\t\t\tnewValue.width &&\n\t\t\t\t\t\t\t\t\tparseInt( newValue.width, 10 ),\n\t\t\t\t\t\t\t\theight:\n\t\t\t\t\t\t\t\t\tnewValue.height &&\n\t\t\t\t\t\t\t\t\tparseInt( newValue.height, 10 ),\n\t\t\t\t\t\t\t\tscale: newValue.scale,\n\t\t\t\t\t\t\t\taspectRatio: newValue.aspectRatio,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tdefaultScale=\"cover\"\n\t\t\t\t\t\tdefaultAspectRatio=\"auto\"\n\t\t\t\t\t\tscaleOptions={ scaleOptions }\n\t\t\t\t\t\tunitsOptions={ dimensionsUnitsOptions }\n\t\t\t\t\t/>\n\t\t\t\t\t<ResolutionTool\n\t\t\t\t\t\tvalue={ sizeSlug }\n\t\t\t\t\t\tonChange={ updateImage }\n\t\t\t\t\t\toptions={ imageSizeOptions }\n\t\t\t\t\t/>\n\t\t\t\t</ToolsPanel>\n\t\t\t</InspectorControls>\n\t\t\t<InspectorControls group=\"advanced\">\n\t\t\t\t<TextControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Title attribute' ) }\n\t\t\t\t\tvalue={ title || '' }\n\t\t\t\t\tonChange={ onSetTitle }\n\t\t\t\t\thelp={\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Describe the role of this image on the page.'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t<ExternalLink href=\"https://www.w3.org/TR/html52/dom.html#the-title-attribute\">\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'(Note: many devices and browsers do not display this text.)'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</ExternalLink>\n\t\t\t\t\t\t</>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</InspectorControls>\n\t\t</>\n\t);\n\n\tconst filename = getFilename( url );\n\tlet defaultedAlt;\n\n\tif ( alt ) {\n\t\tdefaultedAlt = alt;\n\t} else if ( filename ) {\n\t\tdefaultedAlt = sprintf(\n\t\t\t/* translators: %s: file name */\n\t\t\t__( 'This image has an empty alt attribute; its file name is %s' ),\n\t\t\tfilename\n\t\t);\n\t} else {\n\t\tdefaultedAlt = __( 'This image has an empty alt attribute' );\n\t}\n\n\tconst borderProps = useBorderProps( attributes );\n\tconst isRounded = attributes.className?.includes( 'is-style-rounded' );\n\n\tlet img = (\n\t\t// Disable reason: Image itself is not meant to be interactive, but\n\t\t// should direct focus to block.\n\t\t/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t\t<>\n\t\t\t<img\n\t\t\t\tsrc={ temporaryURL || url }\n\t\t\t\talt={ defaultedAlt }\n\t\t\t\tonError={ () => onImageError() }\n\t\t\t\tonLoad={ ( event ) => {\n\t\t\t\t\tsetLoadedNaturalSize( {\n\t\t\t\t\t\tloadedNaturalWidth: event.target?.naturalWidth,\n\t\t\t\t\t\tloadedNaturalHeight: event.target?.naturalHeight,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tref={ imageRef }\n\t\t\t\tclassName={ borderProps.className }\n\t\t\t\tstyle={ {\n\t\t\t\t\twidth:\n\t\t\t\t\t\t( width && height ) || aspectRatio ? '100%' : 'inherit',\n\t\t\t\t\theight:\n\t\t\t\t\t\t( width && height ) || aspectRatio ? '100%' : 'inherit',\n\t\t\t\t\tobjectFit: scale,\n\t\t\t\t\t...borderProps.style,\n\t\t\t\t} }\n\t\t\t/>\n\t\t\t{ temporaryURL && <Spinner /> }\n\t\t</>\n\t\t/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */\n\t);\n\n\t// clientWidth needs to be a number for the image Cropper to work, but sometimes it's 0\n\t// So we try using the imageRef width first and fallback to clientWidth.\n\tconst fallbackClientWidth = imageRef.current?.width || clientWidth;\n\n\tif ( canEditImage && isEditingImage ) {\n\t\timg = (\n\t\t\t<ImageEditor\n\t\t\t\tid={ id }\n\t\t\t\turl={ url }\n\t\t\t\twidth={ width }\n\t\t\t\theight={ height }\n\t\t\t\tclientWidth={ fallbackClientWidth }\n\t\t\t\tnaturalHeight={ naturalHeight }\n\t\t\t\tnaturalWidth={ naturalWidth }\n\t\t\t\tonSaveImage={ ( imageAttributes ) =>\n\t\t\t\t\tsetAttributes( imageAttributes )\n\t\t\t\t}\n\t\t\t\tonFinishEditing={ () => {\n\t\t\t\t\tsetIsEditingImage( false );\n\t\t\t\t} }\n\t\t\t\tborderProps={ isRounded ? undefined : borderProps }\n\t\t\t/>\n\t\t);\n\t} else if ( ! isResizable ) {\n\t\timg = <div style={ { width, height, aspectRatio } }>{ img }</div>;\n\t} else {\n\t\tconst ratio =\n\t\t\t( aspectRatio && evalAspectRatio( aspectRatio ) ) ||\n\t\t\t( width && height && width / height ) ||\n\t\t\tnaturalWidth / naturalHeight ||\n\t\t\t1;\n\n\t\tconst currentWidth = ! width && height ? height * ratio : width;\n\t\tconst currentHeight = ! height && width ? width / ratio : height;\n\n\t\tconst minWidth =\n\t\t\tnaturalWidth < naturalHeight ? MIN_SIZE : MIN_SIZE * ratio;\n\t\tconst minHeight =\n\t\t\tnaturalHeight < naturalWidth ? MIN_SIZE : MIN_SIZE / ratio;\n\n\t\t// With the current implementation of ResizableBox, an image needs an\n\t\t// explicit pixel value for the max-width. In absence of being able to\n\t\t// set the content-width, this max-width is currently dictated by the\n\t\t// vanilla editor style. The following variable adds a buffer to this\n\t\t// vanilla style, so 3rd party themes have some wiggleroom. This does,\n\t\t// in most cases, allow you to scale the image beyond the width of the\n\t\t// main column, though not infinitely.\n\t\t// @todo It would be good to revisit this once a content-width variable\n\t\t// becomes available.\n\t\tconst maxWidthBuffer = maxWidth * 2.5;\n\n\t\tlet showRightHandle = false;\n\t\tlet showLeftHandle = false;\n\n\t\t/* eslint-disable no-lonely-if */\n\t\t// See https://github.com/WordPress/gutenberg/issues/7584.\n\t\tif ( align === 'center' ) {\n\t\t\t// When the image is centered, show both handles.\n\t\t\tshowRightHandle = true;\n\t\t\tshowLeftHandle = true;\n\t\t} else if ( isRTL() ) {\n\t\t\t// In RTL mode the image is on the right by default.\n\t\t\t// Show the right handle and hide the left handle only when it is\n\t\t\t// aligned left. Otherwise always show the left handle.\n\t\t\tif ( align === 'left' ) {\n\t\t\t\tshowRightHandle = true;\n\t\t\t} else {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t}\n\t\t} else {\n\t\t\t// Show the left handle and hide the right handle only when the\n\t\t\t// image is aligned right. Otherwise always show the right handle.\n\t\t\tif ( align === 'right' ) {\n\t\t\t\tshowLeftHandle = true;\n\t\t\t} else {\n\t\t\t\tshowRightHandle = true;\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-lonely-if */\n\n\t\timg = (\n\t\t\t<ResizableBox\n\t\t\t\tstyle={ {\n\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\tobjectFit: scale,\n\t\t\t\t\taspectRatio:\n\t\t\t\t\t\t! width && ! height && aspectRatio\n\t\t\t\t\t\t\t? aspectRatio\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t} }\n\t\t\t\tsize={ {\n\t\t\t\t\twidth: currentWidth ?? 'auto',\n\t\t\t\t\theight: currentHeight ?? 'auto',\n\t\t\t\t} }\n\t\t\t\tshowHandle={ isSelected }\n\t\t\t\tminWidth={ minWidth }\n\t\t\t\tmaxWidth={ maxWidthBuffer }\n\t\t\t\tminHeight={ minHeight }\n\t\t\t\tmaxHeight={ maxWidthBuffer / ratio }\n\t\t\t\tlockAspectRatio={ ratio }\n\t\t\t\tenable={ {\n\t\t\t\t\ttop: false,\n\t\t\t\t\tright: showRightHandle,\n\t\t\t\t\tbottom: true,\n\t\t\t\t\tleft: showLeftHandle,\n\t\t\t\t} }\n\t\t\t\tonResizeStart={ onResizeStart }\n\t\t\t\tonResizeStop={ ( event, direction, elt ) => {\n\t\t\t\t\tonResizeStop();\n\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\twidth: elt.offsetWidth,\n\t\t\t\t\t\theight: elt.offsetHeight,\n\t\t\t\t\t\taspectRatio: undefined,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tresizeRatio={ align === 'center' ? 2 : 1 }\n\t\t\t>\n\t\t\t\t{ img }\n\t\t\t</ResizableBox>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{ /* Hide controls during upload to avoid component remount,\n\t\t\t\twhich causes duplicated image upload. */ }\n\t\t\t{ ! temporaryURL && controls }\n\t\t\t{ img }\n\t\t\t{ showCaption &&\n\t\t\t\t( ! RichText.isEmpty( caption ) || isSelected ) && (\n\t\t\t\t\t<RichText\n\t\t\t\t\t\tidentifier=\"caption\"\n\t\t\t\t\t\tclassName={ __experimentalGetElementClassName(\n\t\t\t\t\t\t\t'caption'\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tref={ captionRef }\n\t\t\t\t\t\ttagName=\"figcaption\"\n\t\t\t\t\t\taria-label={ __( 'Image caption text' ) }\n\t\t\t\t\t\tplaceholder={ __( 'Add caption' ) }\n\t\t\t\t\t\tvalue={ caption }\n\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\tsetAttributes( { caption: value } )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinlineToolbar\n\t\t\t\t\t\t__unstableOnSplitAtEnd={ () =>\n\t\t\t\t\t\t\tinsertBlocksAfter(\n\t\t\t\t\t\t\t\tcreateBlock( getDefaultBlockName() )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t</>\n\t);\n}\n"]}
@@ -81,6 +81,12 @@ const metadata = {
81
81
  height: {
82
82
  type: "number"
83
83
  },
84
+ aspectRatio: {
85
+ type: "string"
86
+ },
87
+ scale: {
88
+ type: "string"
89
+ },
84
90
  sizeSlug: {
85
91
  type: "string"
86
92
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/image/index.js"],"names":["__","image","icon","initBlock","deprecated","edit","save","transforms","name","metadata","settings","example","attributes","sizeSlug","url","caption","__experimentalLabel","context","alt","getEditWrapperProps","align","init"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,EAAT,QAAmB,iBAAnB;AACA,SAASC,KAAK,IAAIC,IAAlB,QAA8B,kBAA9B;AAEA;AACA;AACA;;AACA,OAAOC,SAAP,MAAsB,qBAAtB;AACA,OAAOC,UAAP,MAAuB,cAAvB;AACA,OAAOC,IAAP,MAAiB,QAAjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,OAAOC,IAAP,MAAiB,QAAjB;AACA,OAAOC,UAAP,MAAuB,cAAvB;AAEA,MAAM;AAAEC,EAAAA;AAAF,IAAWC,QAAjB;AAEA,SAASA,QAAT,EAAmBD,IAAnB;AAEA,OAAO,MAAME,QAAQ,GAAG;AACvBR,EAAAA,IADuB;AAEvBS,EAAAA,OAAO,EAAE;AACRC,IAAAA,UAAU,EAAE;AACXC,MAAAA,QAAQ,EAAE,OADC;AAEXC,MAAAA,GAAG,EAAE,8CAFM;AAGX;AACAC,MAAAA,OAAO,EAAEf,EAAE,CAAE,8CAAF;AAJA;AADJ,GAFc;;AAUvBgB,EAAAA,mBAAmB,CAAEJ,UAAF,EAAc;AAAEK,IAAAA;AAAF,GAAd,EAA4B;AAC9C,QAAKA,OAAO,KAAK,eAAjB,EAAmC;AAClC,YAAM;AAAEF,QAAAA,OAAF;AAAWG,QAAAA,GAAX;AAAgBJ,QAAAA;AAAhB,UAAwBF,UAA9B;;AAEA,UAAK,CAAEE,GAAP,EAAa;AACZ,eAAOd,EAAE,CAAE,OAAF,CAAT;AACA;;AAED,UAAK,CAAEkB,GAAP,EAAa;AACZ,eAAOH,OAAO,IAAI,EAAlB;AACA,OATiC,CAWlC;AACA;;;AACA,aAAOG,GAAG,IAAKH,OAAO,GAAG,OAAOA,OAAV,GAAoB,EAAhC,CAAV;AACA;AACD,GA1BsB;;AA2BvBI,EAAAA,mBAAmB,CAAEP,UAAF,EAAe;AACjC,WAAO;AACN,oBAAcA,UAAU,CAACQ;AADnB,KAAP;AAGA,GA/BsB;;AAgCvBb,EAAAA,UAhCuB;AAiCvBF,EAAAA,IAjCuB;AAkCvBC,EAAAA,IAlCuB;AAmCvBF,EAAAA;AAnCuB,CAAjB;AAsCP,OAAO,MAAMiB,IAAI,GAAG,MAAMlB,SAAS,CAAE;AAAEK,EAAAA,IAAF;AAAQC,EAAAA,QAAR;AAAkBC,EAAAA;AAAlB,CAAF,CAA5B","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { image as icon } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport deprecated from './deprecated';\nimport edit from './edit';\nimport metadata from './block.json';\nimport save from './save';\nimport transforms from './transforms';\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon,\n\texample: {\n\t\tattributes: {\n\t\t\tsizeSlug: 'large',\n\t\t\turl: 'https://s.w.org/images/core/5.3/MtBlanc1.jpg',\n\t\t\t// translators: Caption accompanying an image of the Mont Blanc, which serves as an example for the Image block.\n\t\t\tcaption: __( 'Mont Blanc appears—still, snowy, and serene.' ),\n\t\t},\n\t},\n\t__experimentalLabel( attributes, { context } ) {\n\t\tif ( context === 'accessibility' ) {\n\t\t\tconst { caption, alt, url } = attributes;\n\n\t\t\tif ( ! url ) {\n\t\t\t\treturn __( 'Empty' );\n\t\t\t}\n\n\t\t\tif ( ! alt ) {\n\t\t\t\treturn caption || '';\n\t\t\t}\n\n\t\t\t// This is intended to be read by a screen reader.\n\t\t\t// A period simply means a pause, no need to translate it.\n\t\t\treturn alt + ( caption ? '. ' + caption : '' );\n\t\t}\n\t},\n\tgetEditWrapperProps( attributes ) {\n\t\treturn {\n\t\t\t'data-align': attributes.align,\n\t\t};\n\t},\n\ttransforms,\n\tedit,\n\tsave,\n\tdeprecated,\n};\n\nexport const init = () => initBlock( { name, metadata, settings } );\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/image/index.js"],"names":["__","image","icon","initBlock","deprecated","edit","save","transforms","name","metadata","settings","example","attributes","sizeSlug","url","caption","__experimentalLabel","context","alt","getEditWrapperProps","align","init"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,EAAT,QAAmB,iBAAnB;AACA,SAASC,KAAK,IAAIC,IAAlB,QAA8B,kBAA9B;AAEA;AACA;AACA;;AACA,OAAOC,SAAP,MAAsB,qBAAtB;AACA,OAAOC,UAAP,MAAuB,cAAvB;AACA,OAAOC,IAAP,MAAiB,QAAjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,OAAOC,IAAP,MAAiB,QAAjB;AACA,OAAOC,UAAP,MAAuB,cAAvB;AAEA,MAAM;AAAEC,EAAAA;AAAF,IAAWC,QAAjB;AAEA,SAASA,QAAT,EAAmBD,IAAnB;AAEA,OAAO,MAAME,QAAQ,GAAG;AACvBR,EAAAA,IADuB;AAEvBS,EAAAA,OAAO,EAAE;AACRC,IAAAA,UAAU,EAAE;AACXC,MAAAA,QAAQ,EAAE,OADC;AAEXC,MAAAA,GAAG,EAAE,8CAFM;AAGX;AACAC,MAAAA,OAAO,EAAEf,EAAE,CAAE,8CAAF;AAJA;AADJ,GAFc;;AAUvBgB,EAAAA,mBAAmB,CAAEJ,UAAF,EAAc;AAAEK,IAAAA;AAAF,GAAd,EAA4B;AAC9C,QAAKA,OAAO,KAAK,eAAjB,EAAmC;AAClC,YAAM;AAAEF,QAAAA,OAAF;AAAWG,QAAAA,GAAX;AAAgBJ,QAAAA;AAAhB,UAAwBF,UAA9B;;AAEA,UAAK,CAAEE,GAAP,EAAa;AACZ,eAAOd,EAAE,CAAE,OAAF,CAAT;AACA;;AAED,UAAK,CAAEkB,GAAP,EAAa;AACZ,eAAOH,OAAO,IAAI,EAAlB;AACA,OATiC,CAWlC;AACA;;;AACA,aAAOG,GAAG,IAAKH,OAAO,GAAG,OAAOA,OAAV,GAAoB,EAAhC,CAAV;AACA;AACD,GA1BsB;;AA2BvBI,EAAAA,mBAAmB,CAAEP,UAAF,EAAe;AACjC,WAAO;AACN,oBAAcA,UAAU,CAACQ;AADnB,KAAP;AAGA,GA/BsB;;AAgCvBb,EAAAA,UAhCuB;AAiCvBF,EAAAA,IAjCuB;AAkCvBC,EAAAA,IAlCuB;AAmCvBF,EAAAA;AAnCuB,CAAjB;AAsCP,OAAO,MAAMiB,IAAI,GAAG,MAAMlB,SAAS,CAAE;AAAEK,EAAAA,IAAF;AAAQC,EAAAA,QAAR;AAAkBC,EAAAA;AAAlB,CAAF,CAA5B","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { image as icon } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport initBlock from '../utils/init-block';\nimport deprecated from './deprecated';\nimport edit from './edit';\nimport metadata from './block.json';\nimport save from './save';\nimport transforms from './transforms';\n\nconst { name } = metadata;\n\nexport { metadata, name };\n\nexport const settings = {\n\ticon,\n\texample: {\n\t\tattributes: {\n\t\t\tsizeSlug: 'large',\n\t\t\turl: 'https://s.w.org/images/core/5.3/MtBlanc1.jpg',\n\t\t\t// translators: Caption accompanying an image of the Mont Blanc, which serves as an example for the Image block.\n\t\t\tcaption: __( 'Mont Blanc appears—still, snowy, and serene.' ),\n\t\t},\n\t},\n\t__experimentalLabel( attributes, { context } ) {\n\t\tif ( context === 'accessibility' ) {\n\t\t\tconst { caption, alt, url } = attributes;\n\n\t\t\tif ( ! url ) {\n\t\t\t\treturn __( 'Empty' );\n\t\t\t}\n\n\t\t\tif ( ! alt ) {\n\t\t\t\treturn caption || '';\n\t\t\t}\n\n\t\t\t// This is intended to be read by a screen reader.\n\t\t\t// A period simply means a pause, no need to translate it.\n\t\t\treturn alt + ( caption ? '. ' + caption : '' );\n\t\t}\n\t},\n\tgetEditWrapperProps( attributes ) {\n\t\treturn {\n\t\t\t'data-align': attributes.align,\n\t\t};\n\t},\n\ttransforms,\n\tedit,\n\tsave,\n\tdeprecated,\n};\n\nexport const init = () => initBlock( { name, metadata, settings } );\n"]}
@@ -22,6 +22,8 @@ export default function save({
22
22
  linkClass,
23
23
  width,
24
24
  height,
25
+ aspectRatio,
26
+ scale,
25
27
  id,
26
28
  linkTarget,
27
29
  sizeSlug,
@@ -42,7 +44,12 @@ export default function save({
42
44
  src: url,
43
45
  alt: alt,
44
46
  className: imageClasses || undefined,
45
- style: borderProps.style,
47
+ style: { ...borderProps.style,
48
+ aspectRatio,
49
+ objectFit: scale,
50
+ width,
51
+ height
52
+ },
46
53
  width: width,
47
54
  height: height,
48
55
  title: title
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/image/save.js"],"names":["classnames","RichText","useBlockProps","__experimentalGetElementClassName","__experimentalGetBorderClassesAndStyles","getBorderClassesAndStyles","save","attributes","url","alt","caption","align","href","rel","linkClass","width","height","id","linkTarget","sizeSlug","title","newRel","undefined","borderProps","classes","className","style","Object","keys","length","imageClasses","image","figure","isEmpty"],"mappings":";;AAAA;AACA;AACA;AACA,OAAOA,UAAP,MAAuB,YAAvB;AAEA;AACA;AACA;;AACA,SACCC,QADD,EAECC,aAFD,EAGCC,iCAHD,EAICC,uCAAuC,IAAIC,yBAJ5C,QAKO,yBALP;AAOA,eAAe,SAASC,IAAT,CAAe;AAAEC,EAAAA;AAAF,CAAf,EAAgC;AAC9C,QAAM;AACLC,IAAAA,GADK;AAELC,IAAAA,GAFK;AAGLC,IAAAA,OAHK;AAILC,IAAAA,KAJK;AAKLC,IAAAA,IALK;AAMLC,IAAAA,GANK;AAOLC,IAAAA,SAPK;AAQLC,IAAAA,KARK;AASLC,IAAAA,MATK;AAULC,IAAAA,EAVK;AAWLC,IAAAA,UAXK;AAYLC,IAAAA,QAZK;AAaLC,IAAAA;AAbK,MAcFb,UAdJ;AAgBA,QAAMc,MAAM,GAAG,CAAER,GAAF,GAAQS,SAAR,GAAoBT,GAAnC;AACA,QAAMU,WAAW,GAAGlB,yBAAyB,CAAEE,UAAF,CAA7C;AAEA,QAAMiB,OAAO,GAAGxB,UAAU,CAAE;AAC3B,KAAG,QAAQW,KAAO,EAAlB,GAAuBA,KADI;AAE3B,KAAG,QAAQQ,QAAU,EAArB,GAA0BA,QAFC;AAG3B,kBAAcJ,KAAK,IAAIC,MAHI;AAI3B,yBACC,CAAC,CAAEO,WAAW,CAACE,SAAf,IACEF,WAAW,CAACG,KAAZ,IACDC,MAAM,CAACC,IAAP,CAAaL,WAAW,CAACG,KAAzB,EAAiCG,MAAjC,GAA0C;AAPjB,GAAF,CAA1B;AAUA,QAAMC,YAAY,GAAG9B,UAAU,CAAEuB,WAAW,CAACE,SAAd,EAAyB;AACvD,KAAG,YAAYR,EAAI,EAAnB,GAAwB,CAAC,CAAEA;AAD4B,GAAzB,CAA/B;AAIA,QAAMc,KAAK,GACV;AACC,IAAA,GAAG,EAAGvB,GADP;AAEC,IAAA,GAAG,EAAGC,GAFP;AAGC,IAAA,SAAS,EAAGqB,YAAY,IAAIR,SAH7B;AAIC,IAAA,KAAK,EAAGC,WAAW,CAACG,KAJrB;AAKC,IAAA,KAAK,EAAGX,KALT;AAMC,IAAA,MAAM,EAAGC,MANV;AAOC,IAAA,KAAK,EAAGI;AAPT,IADD;AAYA,QAAMY,MAAM,GACX,8BACGpB,IAAI,GACL;AACC,IAAA,SAAS,EAAGE,SADb;AAEC,IAAA,IAAI,EAAGF,IAFR;AAGC,IAAA,MAAM,EAAGM,UAHV;AAIC,IAAA,GAAG,EAAGG;AAJP,KAMGU,KANH,CADK,GAULA,KAXF,EAaG,CAAE9B,QAAQ,CAACgC,OAAT,CAAkBvB,OAAlB,CAAF,IACD,cAAC,QAAD,CAAU,OAAV;AACC,IAAA,SAAS,EAAGP,iCAAiC,CAAE,SAAF,CAD9C;AAEC,IAAA,OAAO,EAAC,YAFT;AAGC,IAAA,KAAK,EAAGO;AAHT,IAdF,CADD;AAwBA,SACC,6BAAaR,aAAa,CAACI,IAAd,CAAoB;AAAEmB,MAAAA,SAAS,EAAED;AAAb,KAApB;AAAb,KACGQ,MADH,CADD;AAKA","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tRichText,\n\tuseBlockProps,\n\t__experimentalGetElementClassName,\n\t__experimentalGetBorderClassesAndStyles as getBorderClassesAndStyles,\n} from '@wordpress/block-editor';\n\nexport default function save( { attributes } ) {\n\tconst {\n\t\turl,\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\thref,\n\t\trel,\n\t\tlinkClass,\n\t\twidth,\n\t\theight,\n\t\tid,\n\t\tlinkTarget,\n\t\tsizeSlug,\n\t\ttitle,\n\t} = attributes;\n\n\tconst newRel = ! rel ? undefined : rel;\n\tconst borderProps = getBorderClassesAndStyles( attributes );\n\n\tconst classes = classnames( {\n\t\t[ `align${ align }` ]: align,\n\t\t[ `size-${ sizeSlug }` ]: sizeSlug,\n\t\t'is-resized': width || height,\n\t\t'has-custom-border':\n\t\t\t!! borderProps.className ||\n\t\t\t( borderProps.style &&\n\t\t\t\tObject.keys( borderProps.style ).length > 0 ),\n\t} );\n\n\tconst imageClasses = classnames( borderProps.className, {\n\t\t[ `wp-image-${ id }` ]: !! id,\n\t} );\n\n\tconst image = (\n\t\t<img\n\t\t\tsrc={ url }\n\t\t\talt={ alt }\n\t\t\tclassName={ imageClasses || undefined }\n\t\t\tstyle={ borderProps.style }\n\t\t\twidth={ width }\n\t\t\theight={ height }\n\t\t\ttitle={ title }\n\t\t/>\n\t);\n\n\tconst figure = (\n\t\t<>\n\t\t\t{ href ? (\n\t\t\t\t<a\n\t\t\t\t\tclassName={ linkClass }\n\t\t\t\t\thref={ href }\n\t\t\t\t\ttarget={ linkTarget }\n\t\t\t\t\trel={ newRel }\n\t\t\t\t>\n\t\t\t\t\t{ image }\n\t\t\t\t</a>\n\t\t\t) : (\n\t\t\t\timage\n\t\t\t) }\n\t\t\t{ ! RichText.isEmpty( caption ) && (\n\t\t\t\t<RichText.Content\n\t\t\t\t\tclassName={ __experimentalGetElementClassName( 'caption' ) }\n\t\t\t\t\ttagName=\"figcaption\"\n\t\t\t\t\tvalue={ caption }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n\n\treturn (\n\t\t<figure { ...useBlockProps.save( { className: classes } ) }>\n\t\t\t{ figure }\n\t\t</figure>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/image/save.js"],"names":["classnames","RichText","useBlockProps","__experimentalGetElementClassName","__experimentalGetBorderClassesAndStyles","getBorderClassesAndStyles","save","attributes","url","alt","caption","align","href","rel","linkClass","width","height","aspectRatio","scale","id","linkTarget","sizeSlug","title","newRel","undefined","borderProps","classes","className","style","Object","keys","length","imageClasses","image","objectFit","figure","isEmpty"],"mappings":";;AAAA;AACA;AACA;AACA,OAAOA,UAAP,MAAuB,YAAvB;AAEA;AACA;AACA;;AACA,SACCC,QADD,EAECC,aAFD,EAGCC,iCAHD,EAICC,uCAAuC,IAAIC,yBAJ5C,QAKO,yBALP;AAOA,eAAe,SAASC,IAAT,CAAe;AAAEC,EAAAA;AAAF,CAAf,EAAgC;AAC9C,QAAM;AACLC,IAAAA,GADK;AAELC,IAAAA,GAFK;AAGLC,IAAAA,OAHK;AAILC,IAAAA,KAJK;AAKLC,IAAAA,IALK;AAMLC,IAAAA,GANK;AAOLC,IAAAA,SAPK;AAQLC,IAAAA,KARK;AASLC,IAAAA,MATK;AAULC,IAAAA,WAVK;AAWLC,IAAAA,KAXK;AAYLC,IAAAA,EAZK;AAaLC,IAAAA,UAbK;AAcLC,IAAAA,QAdK;AAeLC,IAAAA;AAfK,MAgBFf,UAhBJ;AAkBA,QAAMgB,MAAM,GAAG,CAAEV,GAAF,GAAQW,SAAR,GAAoBX,GAAnC;AACA,QAAMY,WAAW,GAAGpB,yBAAyB,CAAEE,UAAF,CAA7C;AAEA,QAAMmB,OAAO,GAAG1B,UAAU,CAAE;AAC3B,KAAG,QAAQW,KAAO,EAAlB,GAAuBA,KADI;AAE3B,KAAG,QAAQU,QAAU,EAArB,GAA0BA,QAFC;AAG3B,kBAAcN,KAAK,IAAIC,MAHI;AAI3B,yBACC,CAAC,CAAES,WAAW,CAACE,SAAf,IACEF,WAAW,CAACG,KAAZ,IACDC,MAAM,CAACC,IAAP,CAAaL,WAAW,CAACG,KAAzB,EAAiCG,MAAjC,GAA0C;AAPjB,GAAF,CAA1B;AAUA,QAAMC,YAAY,GAAGhC,UAAU,CAAEyB,WAAW,CAACE,SAAd,EAAyB;AACvD,KAAG,YAAYR,EAAI,EAAnB,GAAwB,CAAC,CAAEA;AAD4B,GAAzB,CAA/B;AAIA,QAAMc,KAAK,GACV;AACC,IAAA,GAAG,EAAGzB,GADP;AAEC,IAAA,GAAG,EAAGC,GAFP;AAGC,IAAA,SAAS,EAAGuB,YAAY,IAAIR,SAH7B;AAIC,IAAA,KAAK,EAAG,EACP,GAAGC,WAAW,CAACG,KADR;AAEPX,MAAAA,WAFO;AAGPiB,MAAAA,SAAS,EAAEhB,KAHJ;AAIPH,MAAAA,KAJO;AAKPC,MAAAA;AALO,KAJT;AAWC,IAAA,KAAK,EAAGD,KAXT;AAYC,IAAA,MAAM,EAAGC,MAZV;AAaC,IAAA,KAAK,EAAGM;AAbT,IADD;AAkBA,QAAMa,MAAM,GACX,8BACGvB,IAAI,GACL;AACC,IAAA,SAAS,EAAGE,SADb;AAEC,IAAA,IAAI,EAAGF,IAFR;AAGC,IAAA,MAAM,EAAGQ,UAHV;AAIC,IAAA,GAAG,EAAGG;AAJP,KAMGU,KANH,CADK,GAULA,KAXF,EAaG,CAAEhC,QAAQ,CAACmC,OAAT,CAAkB1B,OAAlB,CAAF,IACD,cAAC,QAAD,CAAU,OAAV;AACC,IAAA,SAAS,EAAGP,iCAAiC,CAAE,SAAF,CAD9C;AAEC,IAAA,OAAO,EAAC,YAFT;AAGC,IAAA,KAAK,EAAGO;AAHT,IAdF,CADD;AAwBA,SACC,6BAAaR,aAAa,CAACI,IAAd,CAAoB;AAAEqB,MAAAA,SAAS,EAAED;AAAb,KAApB;AAAb,KACGS,MADH,CADD;AAKA","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tRichText,\n\tuseBlockProps,\n\t__experimentalGetElementClassName,\n\t__experimentalGetBorderClassesAndStyles as getBorderClassesAndStyles,\n} from '@wordpress/block-editor';\n\nexport default function save( { attributes } ) {\n\tconst {\n\t\turl,\n\t\talt,\n\t\tcaption,\n\t\talign,\n\t\thref,\n\t\trel,\n\t\tlinkClass,\n\t\twidth,\n\t\theight,\n\t\taspectRatio,\n\t\tscale,\n\t\tid,\n\t\tlinkTarget,\n\t\tsizeSlug,\n\t\ttitle,\n\t} = attributes;\n\n\tconst newRel = ! rel ? undefined : rel;\n\tconst borderProps = getBorderClassesAndStyles( attributes );\n\n\tconst classes = classnames( {\n\t\t[ `align${ align }` ]: align,\n\t\t[ `size-${ sizeSlug }` ]: sizeSlug,\n\t\t'is-resized': width || height,\n\t\t'has-custom-border':\n\t\t\t!! borderProps.className ||\n\t\t\t( borderProps.style &&\n\t\t\t\tObject.keys( borderProps.style ).length > 0 ),\n\t} );\n\n\tconst imageClasses = classnames( borderProps.className, {\n\t\t[ `wp-image-${ id }` ]: !! id,\n\t} );\n\n\tconst image = (\n\t\t<img\n\t\t\tsrc={ url }\n\t\t\talt={ alt }\n\t\t\tclassName={ imageClasses || undefined }\n\t\t\tstyle={ {\n\t\t\t\t...borderProps.style,\n\t\t\t\taspectRatio,\n\t\t\t\tobjectFit: scale,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t} }\n\t\t\twidth={ width }\n\t\t\theight={ height }\n\t\t\ttitle={ title }\n\t\t/>\n\t);\n\n\tconst figure = (\n\t\t<>\n\t\t\t{ href ? (\n\t\t\t\t<a\n\t\t\t\t\tclassName={ linkClass }\n\t\t\t\t\thref={ href }\n\t\t\t\t\ttarget={ linkTarget }\n\t\t\t\t\trel={ newRel }\n\t\t\t\t>\n\t\t\t\t\t{ image }\n\t\t\t\t</a>\n\t\t\t) : (\n\t\t\t\timage\n\t\t\t) }\n\t\t\t{ ! RichText.isEmpty( caption ) && (\n\t\t\t\t<RichText.Content\n\t\t\t\t\tclassName={ __experimentalGetElementClassName( 'caption' ) }\n\t\t\t\t\ttagName=\"figcaption\"\n\t\t\t\t\tvalue={ caption }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n\n\treturn (\n\t\t<figure { ...useBlockProps.save( { className: classes } ) }>\n\t\t\t{ figure }\n\t\t</figure>\n\t);\n}\n"]}
@@ -2,6 +2,22 @@
2
2
  * Internal dependencies
3
3
  */
4
4
  import { NEW_TAB_REL } from './constants';
5
+ /**
6
+ * Evaluates a CSS aspect-ratio property value as a number.
7
+ *
8
+ * Degenerate or invalid ratios behave as 'auto'. And 'auto' ratios return NaN.
9
+ *
10
+ * @see https://drafts.csswg.org/css-sizing-4/#aspect-ratio
11
+ *
12
+ * @param {string} value CSS aspect-ratio property value.
13
+ * @return {number} Numerical aspect ratio or NaN if invalid.
14
+ */
15
+
16
+ export function evalAspectRatio(value) {
17
+ const [width, height = 1] = value.split('/').map(Number);
18
+ const aspectRatio = width / height;
19
+ return aspectRatio === Infinity || aspectRatio === 0 ? NaN : aspectRatio;
20
+ }
5
21
  export function removeNewTabRel(currentRel) {
6
22
  let newRel = currentRel;
7
23
 
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-library/src/image/utils.js"],"names":["NEW_TAB_REL","removeNewTabRel","currentRel","newRel","undefined","forEach","relVal","regExp","RegExp","replace","trim","getUpdatedLinkTargetSettings","value","rel","linkTarget","updatedRel","getImageSizeAttributes","image","size","url","media_details","sizes","source_url","width","height","sizeSlug"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAT,QAA4B,aAA5B;AAEA,OAAO,SAASC,eAAT,CAA0BC,UAA1B,EAAuC;AAC7C,MAAIC,MAAM,GAAGD,UAAb;;AAEA,MAAKA,UAAU,KAAKE,SAAf,IAA4BD,MAAjC,EAA0C;AACzCH,IAAAA,WAAW,CAACK,OAAZ,CAAuBC,MAAF,IAAc;AAClC,YAAMC,MAAM,GAAG,IAAIC,MAAJ,CAAY,QAAQF,MAAR,GAAiB,KAA7B,EAAoC,IAApC,CAAf;AACAH,MAAAA,MAAM,GAAGA,MAAM,CAACM,OAAP,CAAgBF,MAAhB,EAAwB,EAAxB,CAAT;AACA,KAHD,EADyC,CAMzC;;AACA,QAAKJ,MAAM,KAAKD,UAAhB,EAA6B;AAC5BC,MAAAA,MAAM,GAAGA,MAAM,CAACO,IAAP,EAAT;AACA;;AAED,QAAK,CAAEP,MAAP,EAAgB;AACfA,MAAAA,MAAM,GAAGC,SAAT;AACA;AACD;;AAED,SAAOD,MAAP;AACA;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASQ,4BAAT,CAAuCC,KAAvC,EAA8C;AAAEC,EAAAA;AAAF,CAA9C,EAAwD;AAC9D,QAAMC,UAAU,GAAGF,KAAK,GAAG,QAAH,GAAcR,SAAtC;AAEA,MAAIW,UAAJ;;AACA,MAAK,CAAED,UAAF,IAAgB,CAAED,GAAvB,EAA6B;AAC5BE,IAAAA,UAAU,GAAGX,SAAb;AACA,GAFD,MAEO;AACNW,IAAAA,UAAU,GAAGd,eAAe,CAAEY,GAAF,CAA5B;AACA;;AAED,SAAO;AACNC,IAAAA,UADM;AAEND,IAAAA,GAAG,EAAEE;AAFC,GAAP;AAIA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASC,sBAAT,CAAiCC,KAAjC,EAAwCC,IAAxC,EAA+C;AACrD,QAAMC,GAAG,GAAGF,KAAK,EAAEG,aAAP,EAAsBC,KAAtB,GAA+BH,IAA/B,GAAuCI,UAAnD;;AAEA,MAAKH,GAAL,EAAW;AACV,WAAO;AAAEA,MAAAA,GAAF;AAAOI,MAAAA,KAAK,EAAEnB,SAAd;AAAyBoB,MAAAA,MAAM,EAAEpB,SAAjC;AAA4CqB,MAAAA,QAAQ,EAAEP;AAAtD,KAAP;AACA;;AAED,SAAO,EAAP;AACA","sourcesContent":["/**\n * Internal dependencies\n */\nimport { NEW_TAB_REL } from './constants';\n\nexport function removeNewTabRel( currentRel ) {\n\tlet newRel = currentRel;\n\n\tif ( currentRel !== undefined && newRel ) {\n\t\tNEW_TAB_REL.forEach( ( relVal ) => {\n\t\t\tconst regExp = new RegExp( '\\\\b' + relVal + '\\\\b', 'gi' );\n\t\t\tnewRel = newRel.replace( regExp, '' );\n\t\t} );\n\n\t\t// Only trim if NEW_TAB_REL values was replaced.\n\t\tif ( newRel !== currentRel ) {\n\t\t\tnewRel = newRel.trim();\n\t\t}\n\n\t\tif ( ! newRel ) {\n\t\t\tnewRel = undefined;\n\t\t}\n\t}\n\n\treturn newRel;\n}\n\n/**\n * Helper to get the link target settings to be stored.\n *\n * @param {boolean} value The new link target value.\n * @param {Object} attributes Block attributes.\n * @param {Object} attributes.rel Image block's rel attribute.\n *\n * @return {Object} Updated link target settings.\n */\nexport function getUpdatedLinkTargetSettings( value, { rel } ) {\n\tconst linkTarget = value ? '_blank' : undefined;\n\n\tlet updatedRel;\n\tif ( ! linkTarget && ! rel ) {\n\t\tupdatedRel = undefined;\n\t} else {\n\t\tupdatedRel = removeNewTabRel( rel );\n\t}\n\n\treturn {\n\t\tlinkTarget,\n\t\trel: updatedRel,\n\t};\n}\n\n/**\n * Determines new Image block attributes size selection.\n *\n * @param {Object} image Media file object for gallery image.\n * @param {string} size Selected size slug to apply.\n */\nexport function getImageSizeAttributes( image, size ) {\n\tconst url = image?.media_details?.sizes?.[ size ]?.source_url;\n\n\tif ( url ) {\n\t\treturn { url, width: undefined, height: undefined, sizeSlug: size };\n\t}\n\n\treturn {};\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-library/src/image/utils.js"],"names":["NEW_TAB_REL","evalAspectRatio","value","width","height","split","map","Number","aspectRatio","Infinity","NaN","removeNewTabRel","currentRel","newRel","undefined","forEach","relVal","regExp","RegExp","replace","trim","getUpdatedLinkTargetSettings","rel","linkTarget","updatedRel","getImageSizeAttributes","image","size","url","media_details","sizes","source_url","sizeSlug"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAT,QAA4B,aAA5B;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASC,eAAT,CAA0BC,KAA1B,EAAkC;AACxC,QAAM,CAAEC,KAAF,EAASC,MAAM,GAAG,CAAlB,IAAwBF,KAAK,CAACG,KAAN,CAAa,GAAb,EAAmBC,GAAnB,CAAwBC,MAAxB,CAA9B;AACA,QAAMC,WAAW,GAAGL,KAAK,GAAGC,MAA5B;AACA,SAAOI,WAAW,KAAKC,QAAhB,IAA4BD,WAAW,KAAK,CAA5C,GAAgDE,GAAhD,GAAsDF,WAA7D;AACA;AAED,OAAO,SAASG,eAAT,CAA0BC,UAA1B,EAAuC;AAC7C,MAAIC,MAAM,GAAGD,UAAb;;AAEA,MAAKA,UAAU,KAAKE,SAAf,IAA4BD,MAAjC,EAA0C;AACzCb,IAAAA,WAAW,CAACe,OAAZ,CAAuBC,MAAF,IAAc;AAClC,YAAMC,MAAM,GAAG,IAAIC,MAAJ,CAAY,QAAQF,MAAR,GAAiB,KAA7B,EAAoC,IAApC,CAAf;AACAH,MAAAA,MAAM,GAAGA,MAAM,CAACM,OAAP,CAAgBF,MAAhB,EAAwB,EAAxB,CAAT;AACA,KAHD,EADyC,CAMzC;;AACA,QAAKJ,MAAM,KAAKD,UAAhB,EAA6B;AAC5BC,MAAAA,MAAM,GAAGA,MAAM,CAACO,IAAP,EAAT;AACA;;AAED,QAAK,CAAEP,MAAP,EAAgB;AACfA,MAAAA,MAAM,GAAGC,SAAT;AACA;AACD;;AAED,SAAOD,MAAP;AACA;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASQ,4BAAT,CAAuCnB,KAAvC,EAA8C;AAAEoB,EAAAA;AAAF,CAA9C,EAAwD;AAC9D,QAAMC,UAAU,GAAGrB,KAAK,GAAG,QAAH,GAAcY,SAAtC;AAEA,MAAIU,UAAJ;;AACA,MAAK,CAAED,UAAF,IAAgB,CAAED,GAAvB,EAA6B;AAC5BE,IAAAA,UAAU,GAAGV,SAAb;AACA,GAFD,MAEO;AACNU,IAAAA,UAAU,GAAGb,eAAe,CAAEW,GAAF,CAA5B;AACA;;AAED,SAAO;AACNC,IAAAA,UADM;AAEND,IAAAA,GAAG,EAAEE;AAFC,GAAP;AAIA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASC,sBAAT,CAAiCC,KAAjC,EAAwCC,IAAxC,EAA+C;AACrD,QAAMC,GAAG,GAAGF,KAAK,EAAEG,aAAP,EAAsBC,KAAtB,GAA+BH,IAA/B,GAAuCI,UAAnD;;AAEA,MAAKH,GAAL,EAAW;AACV,WAAO;AAAEA,MAAAA,GAAF;AAAOzB,MAAAA,KAAK,EAAEW,SAAd;AAAyBV,MAAAA,MAAM,EAAEU,SAAjC;AAA4CkB,MAAAA,QAAQ,EAAEL;AAAtD,KAAP;AACA;;AAED,SAAO,EAAP;AACA","sourcesContent":["/**\n * Internal dependencies\n */\nimport { NEW_TAB_REL } from './constants';\n\n/**\n * Evaluates a CSS aspect-ratio property value as a number.\n *\n * Degenerate or invalid ratios behave as 'auto'. And 'auto' ratios return NaN.\n *\n * @see https://drafts.csswg.org/css-sizing-4/#aspect-ratio\n *\n * @param {string} value CSS aspect-ratio property value.\n * @return {number} Numerical aspect ratio or NaN if invalid.\n */\nexport function evalAspectRatio( value ) {\n\tconst [ width, height = 1 ] = value.split( '/' ).map( Number );\n\tconst aspectRatio = width / height;\n\treturn aspectRatio === Infinity || aspectRatio === 0 ? NaN : aspectRatio;\n}\n\nexport function removeNewTabRel( currentRel ) {\n\tlet newRel = currentRel;\n\n\tif ( currentRel !== undefined && newRel ) {\n\t\tNEW_TAB_REL.forEach( ( relVal ) => {\n\t\t\tconst regExp = new RegExp( '\\\\b' + relVal + '\\\\b', 'gi' );\n\t\t\tnewRel = newRel.replace( regExp, '' );\n\t\t} );\n\n\t\t// Only trim if NEW_TAB_REL values was replaced.\n\t\tif ( newRel !== currentRel ) {\n\t\t\tnewRel = newRel.trim();\n\t\t}\n\n\t\tif ( ! newRel ) {\n\t\t\tnewRel = undefined;\n\t\t}\n\t}\n\n\treturn newRel;\n}\n\n/**\n * Helper to get the link target settings to be stored.\n *\n * @param {boolean} value The new link target value.\n * @param {Object} attributes Block attributes.\n * @param {Object} attributes.rel Image block's rel attribute.\n *\n * @return {Object} Updated link target settings.\n */\nexport function getUpdatedLinkTargetSettings( value, { rel } ) {\n\tconst linkTarget = value ? '_blank' : undefined;\n\n\tlet updatedRel;\n\tif ( ! linkTarget && ! rel ) {\n\t\tupdatedRel = undefined;\n\t} else {\n\t\tupdatedRel = removeNewTabRel( rel );\n\t}\n\n\treturn {\n\t\tlinkTarget,\n\t\trel: updatedRel,\n\t};\n}\n\n/**\n * Determines new Image block attributes size selection.\n *\n * @param {Object} image Media file object for gallery image.\n * @param {string} size Selected size slug to apply.\n */\nexport function getImageSizeAttributes( image, size ) {\n\tconst url = image?.media_details?.sizes?.[ size ]?.source_url;\n\n\tif ( url ) {\n\t\treturn { url, width: undefined, height: undefined, sizeSlug: size };\n\t}\n\n\treturn {};\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Internal dependencies
2
+ * WordPress dependencies
3
3
  */
4
- import { store } from '../utils/interactivity';
4
+ import { store } from '@wordpress/interactivity';
5
5
  const focusableSelectors = ['a[href]', 'area[href]', 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex^="-"])'];
6
6
  store({
7
7
  actions: {
@@ -11,30 +11,36 @@ store({
11
11
  context,
12
12
  event
13
13
  }) => {
14
+ // We can't initialize the lightbox until the reference
15
+ // image is loaded, otherwise the UX is broken.
16
+ if (!context.core.image.imageLoaded) {
17
+ return;
18
+ }
19
+
14
20
  context.core.image.initialized = true;
15
21
  context.core.image.lastFocusedElement = window.document.activeElement;
16
- context.core.image.scrollDelta = 0; // Since the img is hidden and its src not loaded until
22
+ context.core.image.scrollDelta = 0;
23
+ context.core.image.lightboxEnabled = true;
24
+
25
+ if (context.core.image.lightboxAnimation === 'zoom') {
26
+ setZoomStyles(event.target.nextElementSibling, context, event);
27
+ } // Hide overflow only when the animation is in progress,
28
+ // otherwise the removal of the scrollbars will draw attention
29
+ // to itself and look like an error
30
+
31
+
32
+ document.documentElement.classList.add('has-lightbox-open'); // Since the img is hidden and its src not loaded until
17
33
  // the lightbox is opened, let's create an img element on the fly
18
34
  // so we can get the dimensions we need to calculate the styles
19
35
 
36
+ context.core.image.preloadInitialized = true;
20
37
  const imgDom = document.createElement('img');
21
38
 
22
39
  imgDom.onload = function () {
23
- // Enable the lightbox only after the image
24
- // is loaded to prevent flashing of unstyled content
25
- context.core.image.lightboxEnabled = true;
26
-
27
- if (context.core.image.lightboxAnimation === 'zoom') {
28
- setZoomStyles(imgDom, context, event);
29
- } // Hide overflow only when the animation is in progress,
30
- // otherwise the removal of the scrollbars will draw attention
31
- // to itself and look like an error
32
-
33
-
34
- document.documentElement.classList.add('has-lightbox-open');
40
+ context.core.image.activateLargeImage = true;
35
41
  };
36
42
 
37
- imgDom.setAttribute('src', context.core.image.imageSrc);
43
+ imgDom.setAttribute('src', context.core.image.imageUploadedSrc);
38
44
  },
39
45
  hideLightbox: async ({
40
46
  context,
@@ -95,6 +101,15 @@ store({
95
101
  });
96
102
  }
97
103
  }
104
+ },
105
+ preloadLightboxImage: ({
106
+ context
107
+ }) => {
108
+ if (!context.core.image.preloadInitialized) {
109
+ context.core.image.preloadInitialized = true;
110
+ const imgDom = document.createElement('img');
111
+ imgDom.setAttribute('src', context.core.image.imageUploadedSrc);
112
+ }
98
113
  }
99
114
  }
100
115
  }
@@ -107,10 +122,15 @@ store({
107
122
  }) => {
108
123
  return context.core.image.lightboxEnabled ? 'dialog' : '';
109
124
  },
110
- imageSrc: ({
125
+ responsiveImgSrc: ({
111
126
  context
112
127
  }) => {
113
- return context.core.image.initialized ? context.core.image.imageSrc : '';
128
+ return context.core.image.activateLargeImage && context.core.image.hideAnimationEnabled ? '' : context.core.image.imageCurrentSrc;
129
+ },
130
+ enlargedImgSrc: ({
131
+ context
132
+ }) => {
133
+ return context.core.image.initialized ? context.core.image.imageUploadedSrc : '';
114
134
  }
115
135
  }
116
136
  }
@@ -118,6 +138,20 @@ store({
118
138
  effects: {
119
139
  core: {
120
140
  image: {
141
+ setCurrentSrc: ({
142
+ context,
143
+ ref
144
+ }) => {
145
+ if (ref.complete) {
146
+ context.core.image.imageLoaded = true;
147
+ context.core.image.imageCurrentSrc = ref.currentSrc;
148
+ } else {
149
+ ref.addEventListener('load', function () {
150
+ context.core.image.imageLoaded = true;
151
+ context.core.image.imageCurrentSrc = this.currentSrc;
152
+ });
153
+ }
154
+ },
121
155
  initLightbox: async ({
122
156
  context,
123
157
  ref
@@ -138,37 +172,45 @@ store({
138
172
  });
139
173
 
140
174
  function setZoomStyles(imgDom, context, event) {
141
- let targetWidth = imgDom.naturalWidth;
142
- let targetHeight = imgDom.naturalHeight;
143
- const verticalPadding = 40; // As per the design, let's allow the image to stretch
144
- // to the full width of its containing figure, but for the height,
145
- // constrain it with a fixed padding
146
-
147
- const containerWidth = context.core.image.figureRef.clientWidth; // The lightbox image has `positione:absolute` and
148
- // ignores its parent's padding, so let's set the padding here,
149
- // to be used when calculating the image width and positioning
150
-
175
+ // Typically, we use the image's full-sized dimensions. If those
176
+ // dimensions have not been set (i.e. an external image with only one size),
177
+ // the image's dimensions in the lightbox are the same
178
+ // as those of the image in the content.
179
+ let targetWidth = context.core.image.targetWidth !== 'none' ? context.core.image.targetWidth : event.target.nextElementSibling.naturalWidth;
180
+ let targetHeight = context.core.image.targetHeight !== 'none' ? context.core.image.targetHeight : event.target.nextElementSibling.naturalHeight; // Since the lightbox image has `position:absolute`, it
181
+ // ignores its parent's padding, so we need to set padding here
182
+ // to calculate dimensions and positioning.
183
+ // As per the design, let's constrain the height with fixed padding
184
+
185
+ const containerOuterHeight = window.innerHeight;
186
+ const verticalPadding = 40;
187
+ const containerInnerHeight = containerOuterHeight - verticalPadding * 2; // Let's set a variable horizontal padding based on the container width
188
+
189
+ const containerOuterWidth = window.innerWidth;
151
190
  let horizontalPadding = 0;
152
191
 
153
- if (containerWidth > 480) {
192
+ if (containerOuterWidth > 480) {
154
193
  horizontalPadding = 40;
155
- } else if (containerWidth > 1920) {
194
+ } else if (containerOuterWidth > 1920) {
156
195
  horizontalPadding = 80;
157
196
  }
158
197
 
159
- const containerHeight = context.core.image.figureRef.clientHeight - verticalPadding * 2; // Check difference between the image and figure dimensions
198
+ const containerInnerWidth = containerOuterWidth - horizontalPadding * 2; // Check difference between the image and figure dimensions
160
199
 
161
- const widthOverflow = Math.abs(Math.min(containerWidth - targetWidth, 0));
162
- const heightOverflow = Math.abs(Math.min(containerHeight - targetHeight, 0)); // If image is larger than its container any dimension, resize along its largest axis.
163
- // For vertically oriented devices, always maximize the width.
200
+ const widthOverflow = Math.abs(Math.min(containerInnerWidth - targetWidth, 0));
201
+ const heightOverflow = Math.abs(Math.min(containerInnerHeight - targetHeight, 0)); // If the image is larger than the container, let's resize
202
+ // it along the greater axis relative to the container
164
203
 
165
204
  if (widthOverflow > 0 || heightOverflow > 0) {
166
- if (widthOverflow >= heightOverflow || containerHeight >= containerWidth) {
167
- targetWidth = containerWidth - horizontalPadding * 2;
168
- targetHeight = imgDom.naturalHeight * (targetWidth / imgDom.naturalWidth);
205
+ const containerInnerAspectRatio = containerInnerWidth / containerInnerHeight;
206
+ const imageAspectRatio = targetWidth / targetHeight;
207
+
208
+ if (imageAspectRatio > containerInnerAspectRatio) {
209
+ targetWidth = containerInnerWidth;
210
+ targetHeight = targetWidth * imgDom.naturalHeight / imgDom.naturalWidth;
169
211
  } else {
170
- targetHeight = containerHeight;
171
- targetWidth = imgDom.naturalWidth * (targetHeight / imgDom.naturalHeight);
212
+ targetHeight = containerInnerHeight;
213
+ targetWidth = targetHeight * imgDom.naturalWidth / imgDom.naturalHeight;
172
214
  }
173
215
  } // The reference img element lies adjacent to the event target button in the DOM
174
216
 
@@ -182,18 +224,18 @@ function setZoomStyles(imgDom, context, event) {
182
224
 
183
225
  let targetLeft = 0;
184
226
 
185
- if (targetWidth >= containerWidth) {
227
+ if (targetWidth >= containerInnerWidth) {
186
228
  targetLeft = horizontalPadding;
187
229
  } else {
188
- targetLeft = (containerWidth - targetWidth) / 2;
230
+ targetLeft = (containerOuterWidth - targetWidth) / 2;
189
231
  }
190
232
 
191
233
  let targetTop = 0;
192
234
 
193
- if (targetHeight >= containerHeight) {
235
+ if (targetHeight >= containerInnerHeight) {
194
236
  targetTop = verticalPadding;
195
237
  } else {
196
- targetTop = (containerHeight - targetHeight) / 2 + verticalPadding;
238
+ targetTop = (containerOuterHeight - targetHeight) / 2;
197
239
  }
198
240
 
199
241
  const root = document.documentElement;
@@ -206,4 +248,4 @@ function setZoomStyles(imgDom, context, event) {
206
248
  root.style.setProperty('--lightbox-target-left-position', targetLeft + 'px');
207
249
  root.style.setProperty('--lightbox-target-top-position', targetTop + 'px');
208
250
  }
209
- //# sourceMappingURL=interactivity.js.map
251
+ //# sourceMappingURL=view-interactivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-library/src/image/view-interactivity.js"],"names":["store","focusableSelectors","actions","core","image","showLightbox","context","event","imageLoaded","initialized","lastFocusedElement","window","document","activeElement","scrollDelta","lightboxEnabled","lightboxAnimation","setZoomStyles","target","nextElementSibling","documentElement","classList","add","preloadInitialized","imgDom","createElement","onload","activateLargeImage","setAttribute","imageUploadedSrc","hideLightbox","hideAnimationEnabled","deltaY","type","Math","abs","scrollY","scrollTop","pageYOffset","scrollLeft","pageXOffset","onscroll","scrollTo","setTimeout","remove","focus","handleKeydown","key","keyCode","shiftKey","firstFocusableElement","preventDefault","lastFocusableElement","preloadLightboxImage","selectors","roleAttribute","responsiveImgSrc","imageCurrentSrc","enlargedImgSrc","effects","setCurrentSrc","ref","complete","currentSrc","addEventListener","initLightbox","figureRef","querySelector","imageRef","focusableElements","querySelectorAll","length","targetWidth","naturalWidth","targetHeight","naturalHeight","containerOuterHeight","innerHeight","verticalPadding","containerInnerHeight","containerOuterWidth","innerWidth","horizontalPadding","containerInnerWidth","widthOverflow","min","heightOverflow","containerInnerAspectRatio","imageAspectRatio","x","originLeft","y","originTop","getBoundingClientRect","scaleWidth","offsetWidth","scaleHeight","offsetHeight","targetLeft","targetTop","root","style","setProperty"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,KAAT,QAAsB,0BAAtB;AAEA,MAAMC,kBAAkB,GAAG,CAC1B,SAD0B,EAE1B,YAF0B,EAG1B,+DAH0B,EAI1B,2CAJ0B,EAK1B,6CAL0B,EAM1B,2CAN0B,EAO1B,QAP0B,EAQ1B,QAR0B,EAS1B,OAT0B,EAU1B,mBAV0B,EAW1B,iCAX0B,CAA3B;AAcAD,KAAK,CAAE;AACNE,EAAAA,OAAO,EAAE;AACRC,IAAAA,IAAI,EAAE;AACLC,MAAAA,KAAK,EAAE;AACNC,QAAAA,YAAY,EAAE,CAAE;AAAEC,UAAAA,OAAF;AAAWC,UAAAA;AAAX,SAAF,KAA0B;AACvC;AACA;AACA,cAAK,CAAED,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBI,WAA1B,EAAwC;AACvC;AACA;;AACDF,UAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBK,WAAnB,GAAiC,IAAjC;AACAH,UAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBM,kBAAnB,GACCC,MAAM,CAACC,QAAP,CAAgBC,aADjB;AAEAP,UAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBU,WAAnB,GAAiC,CAAjC;AAEAR,UAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBW,eAAnB,GAAqC,IAArC;;AACA,cAAKT,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBY,iBAAnB,KAAyC,MAA9C,EAAuD;AACtDC,YAAAA,aAAa,CACZV,KAAK,CAACW,MAAN,CAAaC,kBADD,EAEZb,OAFY,EAGZC,KAHY,CAAb;AAKA,WAlBsC,CAmBvC;AACA;AACA;;;AACAK,UAAAA,QAAQ,CAACQ,eAAT,CAAyBC,SAAzB,CAAmCC,GAAnC,CACC,mBADD,EAtBuC,CA0BvC;AACA;AACA;;AACAhB,UAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBmB,kBAAnB,GAAwC,IAAxC;AACA,gBAAMC,MAAM,GAAGZ,QAAQ,CAACa,aAAT,CAAwB,KAAxB,CAAf;;AACAD,UAAAA,MAAM,CAACE,MAAP,GAAgB,YAAY;AAC3BpB,YAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBuB,kBAAnB,GAAwC,IAAxC;AACA,WAFD;;AAGAH,UAAAA,MAAM,CAACI,YAAP,CACC,KADD,EAECtB,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmByB,gBAFpB;AAIA,SAvCK;AAwCNC,QAAAA,YAAY,EAAE,OAAQ;AAAExB,UAAAA,OAAF;AAAWC,UAAAA;AAAX,SAAR,KAAgC;AAC7CD,UAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmB2B,oBAAnB,GAA0C,IAA1C;;AACA,cAAKzB,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBW,eAAxB,EAA0C;AACzC;AACA,gBAAKT,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBY,iBAAnB,KAAyC,MAA9C,EAAuD;AACtDV,cAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBU,WAAnB,IAAkCP,KAAK,CAACyB,MAAxC;;AACA,kBACCzB,KAAK,CAAC0B,IAAN,KAAe,YAAf,IACAC,IAAI,CAACC,GAAL,CACCxB,MAAM,CAACyB,OAAP,GACC9B,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBU,WAFrB,IAGI,EALL,EAME;AACD;AACA;AACD,aAXD,MAWO,IACNR,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBY,iBAAnB,KAAyC,MADnC,EAEL;AACD;AACA;AACA,oBAAMqB,SAAS,GACd1B,MAAM,CAAC2B,WAAP,IACA1B,QAAQ,CAACQ,eAAT,CAAyBiB,SAF1B;AAGA,oBAAME,UAAU,GACf5B,MAAM,CAAC6B,WAAP,IACA5B,QAAQ,CAACQ,eAAT,CAAyBmB,UAF1B,CANC,CASD;;AACA5B,cAAAA,MAAM,CAAC8B,QAAP,GAAkB,YAAY;AAC7B9B,gBAAAA,MAAM,CAAC+B,QAAP,CAAiBH,UAAjB,EAA6BF,SAA7B;AACA,eAFD,CAVC,CAaD;;;AACAM,cAAAA,UAAU,CAAE,YAAY;AACvBhC,gBAAAA,MAAM,CAAC8B,QAAP,GAAkB,YAAY,CAAE,CAAhC;AACA,eAFS,EAEP,GAFO,CAAV;AAGA;;AAED7B,YAAAA,QAAQ,CAACQ,eAAT,CAAyBC,SAAzB,CAAmCuB,MAAnC,CACC,mBADD;AAIAtC,YAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBW,eAAnB,GAAqC,KAArC;AACAT,YAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBM,kBAAnB,CAAsCmC,KAAtC;AACA;AACD,SAnFK;AAoFNC,QAAAA,aAAa,EAAE,CAAE;AAAExC,UAAAA,OAAF;AAAWJ,UAAAA,OAAX;AAAoBK,UAAAA;AAApB,SAAF,KAAmC;AACjD,cAAKD,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBW,eAAxB,EAA0C;AACzC,gBAAKR,KAAK,CAACwC,GAAN,KAAc,KAAd,IAAuBxC,KAAK,CAACyC,OAAN,KAAkB,CAA9C,EAAkD;AACjD;AACA,kBACCzC,KAAK,CAAC0C,QAAN,IACAtC,MAAM,CAACC,QAAP,CAAgBC,aAAhB,KACCP,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmB8C,qBAHrB,EAIE;AACD3C,gBAAAA,KAAK,CAAC4C,cAAN;AACA7C,gBAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBgD,oBAAnB,CAAwCP,KAAxC;AACA,eAPD,MAOO,IACN,CAAEtC,KAAK,CAAC0C,QAAR,IACAtC,MAAM,CAACC,QAAP,CAAgBC,aAAhB,KACCP,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBgD,oBAHd,EAIL;AACD7C,gBAAAA,KAAK,CAAC4C,cAAN;AACA7C,gBAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmB8C,qBAAnB,CAAyCL,KAAzC;AACA;AACD;;AAED,gBAAKtC,KAAK,CAACwC,GAAN,KAAc,QAAd,IAA0BxC,KAAK,CAACyC,OAAN,KAAkB,EAAjD,EAAsD;AACrD9C,cAAAA,OAAO,CAACC,IAAR,CAAaC,KAAb,CAAmB0B,YAAnB,CAAiC;AAChCxB,gBAAAA,OADgC;AAEhCC,gBAAAA;AAFgC,eAAjC;AAIA;AACD;AACD,SAhHK;AAiHN8C,QAAAA,oBAAoB,EAAE,CAAE;AAAE/C,UAAAA;AAAF,SAAF,KAAmB;AACxC,cAAK,CAAEA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBmB,kBAA1B,EAA+C;AAC9CjB,YAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBmB,kBAAnB,GAAwC,IAAxC;AACA,kBAAMC,MAAM,GAAGZ,QAAQ,CAACa,aAAT,CAAwB,KAAxB,CAAf;AACAD,YAAAA,MAAM,CAACI,YAAP,CACC,KADD,EAECtB,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmByB,gBAFpB;AAIA;AACD;AA1HK;AADF;AADE,GADH;AAiINyB,EAAAA,SAAS,EAAE;AACVnD,IAAAA,IAAI,EAAE;AACLC,MAAAA,KAAK,EAAE;AACNmD,QAAAA,aAAa,EAAE,CAAE;AAAEjD,UAAAA;AAAF,SAAF,KAAmB;AACjC,iBAAOA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBW,eAAnB,GAAqC,QAArC,GAAgD,EAAvD;AACA,SAHK;AAINyC,QAAAA,gBAAgB,EAAE,CAAE;AAAElD,UAAAA;AAAF,SAAF,KAAmB;AACpC,iBAAOA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBuB,kBAAnB,IACNrB,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmB2B,oBADb,GAEJ,EAFI,GAGJzB,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBqD,eAHtB;AAIA,SATK;AAUNC,QAAAA,cAAc,EAAE,CAAE;AAAEpD,UAAAA;AAAF,SAAF,KAAmB;AAClC,iBAAOA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBK,WAAnB,GACJH,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmByB,gBADf,GAEJ,EAFH;AAGA;AAdK;AADF;AADI,GAjIL;AAqJN8B,EAAAA,OAAO,EAAE;AACRxD,IAAAA,IAAI,EAAE;AACLC,MAAAA,KAAK,EAAE;AACNwD,QAAAA,aAAa,EAAE,CAAE;AAAEtD,UAAAA,OAAF;AAAWuD,UAAAA;AAAX,SAAF,KAAwB;AACtC,cAAKA,GAAG,CAACC,QAAT,EAAoB;AACnBxD,YAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBI,WAAnB,GAAiC,IAAjC;AACAF,YAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBqD,eAAnB,GAAqCI,GAAG,CAACE,UAAzC;AACA,WAHD,MAGO;AACNF,YAAAA,GAAG,CAACG,gBAAJ,CAAsB,MAAtB,EAA8B,YAAY;AACzC1D,cAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBI,WAAnB,GAAiC,IAAjC;AACAF,cAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBqD,eAAnB,GACC,KAAKM,UADN;AAEA,aAJD;AAKA;AACD,SAZK;AAaNE,QAAAA,YAAY,EAAE,OAAQ;AAAE3D,UAAAA,OAAF;AAAWuD,UAAAA;AAAX,SAAR,KAA8B;AAC3CvD,UAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmB8D,SAAnB,GACCL,GAAG,CAACM,aAAJ,CAAmB,QAAnB,CADD;AAEA7D,UAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBgE,QAAnB,GAA8BP,GAAG,CAACM,aAAJ,CAAmB,KAAnB,CAA9B;;AACA,cAAK7D,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBW,eAAxB,EAA0C;AACzC,kBAAMsD,iBAAiB,GACtBR,GAAG,CAACS,gBAAJ,CAAsBrE,kBAAtB,CADD;AAEAK,YAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmB8C,qBAAnB,GACCmB,iBAAiB,CAAE,CAAF,CADlB;AAEA/D,YAAAA,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBgD,oBAAnB,GACCiB,iBAAiB,CAAEA,iBAAiB,CAACE,MAAlB,GAA2B,CAA7B,CADlB;AAGAV,YAAAA,GAAG,CAACM,aAAJ,CAAmB,eAAnB,EAAqCtB,KAArC;AACA;AACD;AA3BK;AADF;AADE;AArJH,CAAF,CAAL;;AAwLA,SAAS5B,aAAT,CAAwBO,MAAxB,EAAgClB,OAAhC,EAAyCC,KAAzC,EAAiD;AAChD;AACA;AACA;AACA;AACA,MAAIiE,WAAW,GACdlE,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBoE,WAAnB,KAAmC,MAAnC,GACGlE,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBoE,WADtB,GAEGjE,KAAK,CAACW,MAAN,CAAaC,kBAAb,CAAgCsD,YAHpC;AAIA,MAAIC,YAAY,GACfpE,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBsE,YAAnB,KAAoC,MAApC,GACGpE,OAAO,CAACH,IAAR,CAAaC,KAAb,CAAmBsE,YADtB,GAEGnE,KAAK,CAACW,MAAN,CAAaC,kBAAb,CAAgCwD,aAHpC,CATgD,CAchD;AACA;AACA;AAEA;;AACA,QAAMC,oBAAoB,GAAGjE,MAAM,CAACkE,WAApC;AACA,QAAMC,eAAe,GAAG,EAAxB;AACA,QAAMC,oBAAoB,GAAGH,oBAAoB,GAAGE,eAAe,GAAG,CAAtE,CArBgD,CAuBhD;;AACA,QAAME,mBAAmB,GAAGrE,MAAM,CAACsE,UAAnC;AACA,MAAIC,iBAAiB,GAAG,CAAxB;;AACA,MAAKF,mBAAmB,GAAG,GAA3B,EAAiC;AAChCE,IAAAA,iBAAiB,GAAG,EAApB;AACA,GAFD,MAEO,IAAKF,mBAAmB,GAAG,IAA3B,EAAkC;AACxCE,IAAAA,iBAAiB,GAAG,EAApB;AACA;;AACD,QAAMC,mBAAmB,GAAGH,mBAAmB,GAAGE,iBAAiB,GAAG,CAAtE,CA/BgD,CAiChD;;AACA,QAAME,aAAa,GAAGlD,IAAI,CAACC,GAAL,CACrBD,IAAI,CAACmD,GAAL,CAAUF,mBAAmB,GAAGX,WAAhC,EAA6C,CAA7C,CADqB,CAAtB;AAGA,QAAMc,cAAc,GAAGpD,IAAI,CAACC,GAAL,CACtBD,IAAI,CAACmD,GAAL,CAAUN,oBAAoB,GAAGL,YAAjC,EAA+C,CAA/C,CADsB,CAAvB,CArCgD,CAyChD;AACA;;AACA,MAAKU,aAAa,GAAG,CAAhB,IAAqBE,cAAc,GAAG,CAA3C,EAA+C;AAC9C,UAAMC,yBAAyB,GAC9BJ,mBAAmB,GAAGJ,oBADvB;AAEA,UAAMS,gBAAgB,GAAGhB,WAAW,GAAGE,YAAvC;;AAEA,QAAKc,gBAAgB,GAAGD,yBAAxB,EAAoD;AACnDf,MAAAA,WAAW,GAAGW,mBAAd;AACAT,MAAAA,YAAY,GACTF,WAAW,GAAGhD,MAAM,CAACmD,aAAvB,GAAyCnD,MAAM,CAACiD,YADjD;AAEA,KAJD,MAIO;AACNC,MAAAA,YAAY,GAAGK,oBAAf;AACAP,MAAAA,WAAW,GACRE,YAAY,GAAGlD,MAAM,CAACiD,YAAxB,GAAyCjD,MAAM,CAACmD,aADjD;AAEA;AACD,GAzD+C,CA2DhD;;;AACA,QAAM;AAAEc,IAAAA,CAAC,EAAEC,UAAL;AAAiBC,IAAAA,CAAC,EAAEC;AAApB,MACLrF,KAAK,CAACW,MAAN,CAAaC,kBAAb,CAAgC0E,qBAAhC,EADD;AAEA,QAAMC,UAAU,GACfvF,KAAK,CAACW,MAAN,CAAaC,kBAAb,CAAgC4E,WAAhC,GAA8CvB,WAD/C;AAEA,QAAMwB,WAAW,GAChBzF,KAAK,CAACW,MAAN,CAAaC,kBAAb,CAAgC8E,YAAhC,GAA+CvB,YADhD,CAhEgD,CAmEhD;;AACA,MAAIwB,UAAU,GAAG,CAAjB;;AACA,MAAK1B,WAAW,IAAIW,mBAApB,EAA0C;AACzCe,IAAAA,UAAU,GAAGhB,iBAAb;AACA,GAFD,MAEO;AACNgB,IAAAA,UAAU,GAAG,CAAElB,mBAAmB,GAAGR,WAAxB,IAAwC,CAArD;AACA;;AACD,MAAI2B,SAAS,GAAG,CAAhB;;AACA,MAAKzB,YAAY,IAAIK,oBAArB,EAA4C;AAC3CoB,IAAAA,SAAS,GAAGrB,eAAZ;AACA,GAFD,MAEO;AACNqB,IAAAA,SAAS,GAAG,CAAEvB,oBAAoB,GAAGF,YAAzB,IAA0C,CAAtD;AACA;;AAED,QAAM0B,IAAI,GAAGxF,QAAQ,CAACQ,eAAtB;AACAgF,EAAAA,IAAI,CAACC,KAAL,CAAWC,WAAX,CAAwB,wBAAxB,EAAkDR,UAAlD;AACAM,EAAAA,IAAI,CAACC,KAAL,CAAWC,WAAX,CAAwB,yBAAxB,EAAmDN,WAAnD;AACAI,EAAAA,IAAI,CAACC,KAAL,CAAWC,WAAX,CAAwB,4BAAxB,EAAsD9B,WAAW,GAAG,IAApE;AACA4B,EAAAA,IAAI,CAACC,KAAL,CAAWC,WAAX,CACC,6BADD,EAEC5B,YAAY,GAAG,IAFhB;AAIA0B,EAAAA,IAAI,CAACC,KAAL,CAAWC,WAAX,CACC,kCADD,EAECZ,UAAU,GAAG,IAFd;AAIAU,EAAAA,IAAI,CAACC,KAAL,CAAWC,WAAX,CACC,iCADD,EAECV,SAAS,GAAG,IAFb;AAIAQ,EAAAA,IAAI,CAACC,KAAL,CAAWC,WAAX,CACC,iCADD,EAECJ,UAAU,GAAG,IAFd;AAIAE,EAAAA,IAAI,CAACC,KAAL,CAAWC,WAAX,CACC,gCADD,EAECH,SAAS,GAAG,IAFb;AAIA","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { store } from '@wordpress/interactivity';\n\nconst focusableSelectors = [\n\t'a[href]',\n\t'area[href]',\n\t'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])',\n\t'select:not([disabled]):not([aria-hidden])',\n\t'textarea:not([disabled]):not([aria-hidden])',\n\t'button:not([disabled]):not([aria-hidden])',\n\t'iframe',\n\t'object',\n\t'embed',\n\t'[contenteditable]',\n\t'[tabindex]:not([tabindex^=\"-\"])',\n];\n\nstore( {\n\tactions: {\n\t\tcore: {\n\t\t\timage: {\n\t\t\t\tshowLightbox: ( { context, event } ) => {\n\t\t\t\t\t// We can't initialize the lightbox until the reference\n\t\t\t\t\t// image is loaded, otherwise the UX is broken.\n\t\t\t\t\tif ( ! context.core.image.imageLoaded ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcontext.core.image.initialized = true;\n\t\t\t\t\tcontext.core.image.lastFocusedElement =\n\t\t\t\t\t\twindow.document.activeElement;\n\t\t\t\t\tcontext.core.image.scrollDelta = 0;\n\n\t\t\t\t\tcontext.core.image.lightboxEnabled = true;\n\t\t\t\t\tif ( context.core.image.lightboxAnimation === 'zoom' ) {\n\t\t\t\t\t\tsetZoomStyles(\n\t\t\t\t\t\t\tevent.target.nextElementSibling,\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tevent\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Hide overflow only when the animation is in progress,\n\t\t\t\t\t// otherwise the removal of the scrollbars will draw attention\n\t\t\t\t\t// to itself and look like an error\n\t\t\t\t\tdocument.documentElement.classList.add(\n\t\t\t\t\t\t'has-lightbox-open'\n\t\t\t\t\t);\n\n\t\t\t\t\t// Since the img is hidden and its src not loaded until\n\t\t\t\t\t// the lightbox is opened, let's create an img element on the fly\n\t\t\t\t\t// so we can get the dimensions we need to calculate the styles\n\t\t\t\t\tcontext.core.image.preloadInitialized = true;\n\t\t\t\t\tconst imgDom = document.createElement( 'img' );\n\t\t\t\t\timgDom.onload = function () {\n\t\t\t\t\t\tcontext.core.image.activateLargeImage = true;\n\t\t\t\t\t};\n\t\t\t\t\timgDom.setAttribute(\n\t\t\t\t\t\t'src',\n\t\t\t\t\t\tcontext.core.image.imageUploadedSrc\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\thideLightbox: async ( { context, event } ) => {\n\t\t\t\t\tcontext.core.image.hideAnimationEnabled = true;\n\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t// If scrolling, wait a moment before closing the lightbox.\n\t\t\t\t\t\tif ( context.core.image.lightboxAnimation === 'fade' ) {\n\t\t\t\t\t\t\tcontext.core.image.scrollDelta += event.deltaY;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tevent.type === 'mousewheel' &&\n\t\t\t\t\t\t\t\tMath.abs(\n\t\t\t\t\t\t\t\t\twindow.scrollY -\n\t\t\t\t\t\t\t\t\t\tcontext.core.image.scrollDelta\n\t\t\t\t\t\t\t\t) < 10\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tcontext.core.image.lightboxAnimation === 'zoom'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Disable scroll until the zoom animation ends.\n\t\t\t\t\t\t\t// Get the current page scroll position\n\t\t\t\t\t\t\tconst scrollTop =\n\t\t\t\t\t\t\t\twindow.pageYOffset ||\n\t\t\t\t\t\t\t\tdocument.documentElement.scrollTop;\n\t\t\t\t\t\t\tconst scrollLeft =\n\t\t\t\t\t\t\t\twindow.pageXOffset ||\n\t\t\t\t\t\t\t\tdocument.documentElement.scrollLeft;\n\t\t\t\t\t\t\t// if any scroll is attempted, set this to the previous value.\n\t\t\t\t\t\t\twindow.onscroll = function () {\n\t\t\t\t\t\t\t\twindow.scrollTo( scrollLeft, scrollTop );\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t// Enable scrolling after the animation finishes\n\t\t\t\t\t\t\tsetTimeout( function () {\n\t\t\t\t\t\t\t\twindow.onscroll = function () {};\n\t\t\t\t\t\t\t}, 400 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdocument.documentElement.classList.remove(\n\t\t\t\t\t\t\t'has-lightbox-open'\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcontext.core.image.lightboxEnabled = false;\n\t\t\t\t\t\tcontext.core.image.lastFocusedElement.focus();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\thandleKeydown: ( { context, actions, event } ) => {\n\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\tif ( event.key === 'Tab' || event.keyCode === 9 ) {\n\t\t\t\t\t\t\t// If shift + tab it change the direction\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tevent.shiftKey &&\n\t\t\t\t\t\t\t\twindow.document.activeElement ===\n\t\t\t\t\t\t\t\t\tcontext.core.image.firstFocusableElement\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tcontext.core.image.lastFocusableElement.focus();\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t! event.shiftKey &&\n\t\t\t\t\t\t\t\twindow.document.activeElement ===\n\t\t\t\t\t\t\t\t\tcontext.core.image.lastFocusableElement\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tcontext.core.image.firstFocusableElement.focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( event.key === 'Escape' || event.keyCode === 27 ) {\n\t\t\t\t\t\t\tactions.core.image.hideLightbox( {\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tpreloadLightboxImage: ( { context } ) => {\n\t\t\t\t\tif ( ! context.core.image.preloadInitialized ) {\n\t\t\t\t\t\tcontext.core.image.preloadInitialized = true;\n\t\t\t\t\t\tconst imgDom = document.createElement( 'img' );\n\t\t\t\t\t\timgDom.setAttribute(\n\t\t\t\t\t\t\t'src',\n\t\t\t\t\t\t\tcontext.core.image.imageUploadedSrc\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\tselectors: {\n\t\tcore: {\n\t\t\timage: {\n\t\t\t\troleAttribute: ( { context } ) => {\n\t\t\t\t\treturn context.core.image.lightboxEnabled ? 'dialog' : '';\n\t\t\t\t},\n\t\t\t\tresponsiveImgSrc: ( { context } ) => {\n\t\t\t\t\treturn context.core.image.activateLargeImage &&\n\t\t\t\t\t\tcontext.core.image.hideAnimationEnabled\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: context.core.image.imageCurrentSrc;\n\t\t\t\t},\n\t\t\t\tenlargedImgSrc: ( { context } ) => {\n\t\t\t\t\treturn context.core.image.initialized\n\t\t\t\t\t\t? context.core.image.imageUploadedSrc\n\t\t\t\t\t\t: '';\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\teffects: {\n\t\tcore: {\n\t\t\timage: {\n\t\t\t\tsetCurrentSrc: ( { context, ref } ) => {\n\t\t\t\t\tif ( ref.complete ) {\n\t\t\t\t\t\tcontext.core.image.imageLoaded = true;\n\t\t\t\t\t\tcontext.core.image.imageCurrentSrc = ref.currentSrc;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tref.addEventListener( 'load', function () {\n\t\t\t\t\t\t\tcontext.core.image.imageLoaded = true;\n\t\t\t\t\t\t\tcontext.core.image.imageCurrentSrc =\n\t\t\t\t\t\t\t\tthis.currentSrc;\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tinitLightbox: async ( { context, ref } ) => {\n\t\t\t\t\tcontext.core.image.figureRef =\n\t\t\t\t\t\tref.querySelector( 'figure' );\n\t\t\t\t\tcontext.core.image.imageRef = ref.querySelector( 'img' );\n\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\tconst focusableElements =\n\t\t\t\t\t\t\tref.querySelectorAll( focusableSelectors );\n\t\t\t\t\t\tcontext.core.image.firstFocusableElement =\n\t\t\t\t\t\t\tfocusableElements[ 0 ];\n\t\t\t\t\t\tcontext.core.image.lastFocusableElement =\n\t\t\t\t\t\t\tfocusableElements[ focusableElements.length - 1 ];\n\n\t\t\t\t\t\tref.querySelector( '.close-button' ).focus();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n} );\n\nfunction setZoomStyles( imgDom, context, event ) {\n\t// Typically, we use the image's full-sized dimensions. If those\n\t// dimensions have not been set (i.e. an external image with only one size),\n\t// the image's dimensions in the lightbox are the same\n\t// as those of the image in the content.\n\tlet targetWidth =\n\t\tcontext.core.image.targetWidth !== 'none'\n\t\t\t? context.core.image.targetWidth\n\t\t\t: event.target.nextElementSibling.naturalWidth;\n\tlet targetHeight =\n\t\tcontext.core.image.targetHeight !== 'none'\n\t\t\t? context.core.image.targetHeight\n\t\t\t: event.target.nextElementSibling.naturalHeight;\n\n\t// Since the lightbox image has `position:absolute`, it\n\t// ignores its parent's padding, so we need to set padding here\n\t// to calculate dimensions and positioning.\n\n\t// As per the design, let's constrain the height with fixed padding\n\tconst containerOuterHeight = window.innerHeight;\n\tconst verticalPadding = 40;\n\tconst containerInnerHeight = containerOuterHeight - verticalPadding * 2;\n\n\t// Let's set a variable horizontal padding based on the container width\n\tconst containerOuterWidth = window.innerWidth;\n\tlet horizontalPadding = 0;\n\tif ( containerOuterWidth > 480 ) {\n\t\thorizontalPadding = 40;\n\t} else if ( containerOuterWidth > 1920 ) {\n\t\thorizontalPadding = 80;\n\t}\n\tconst containerInnerWidth = containerOuterWidth - horizontalPadding * 2;\n\n\t// Check difference between the image and figure dimensions\n\tconst widthOverflow = Math.abs(\n\t\tMath.min( containerInnerWidth - targetWidth, 0 )\n\t);\n\tconst heightOverflow = Math.abs(\n\t\tMath.min( containerInnerHeight - targetHeight, 0 )\n\t);\n\n\t// If the image is larger than the container, let's resize\n\t// it along the greater axis relative to the container\n\tif ( widthOverflow > 0 || heightOverflow > 0 ) {\n\t\tconst containerInnerAspectRatio =\n\t\t\tcontainerInnerWidth / containerInnerHeight;\n\t\tconst imageAspectRatio = targetWidth / targetHeight;\n\n\t\tif ( imageAspectRatio > containerInnerAspectRatio ) {\n\t\t\ttargetWidth = containerInnerWidth;\n\t\t\ttargetHeight =\n\t\t\t\t( targetWidth * imgDom.naturalHeight ) / imgDom.naturalWidth;\n\t\t} else {\n\t\t\ttargetHeight = containerInnerHeight;\n\t\t\ttargetWidth =\n\t\t\t\t( targetHeight * imgDom.naturalWidth ) / imgDom.naturalHeight;\n\t\t}\n\t}\n\n\t// The reference img element lies adjacent to the event target button in the DOM\n\tconst { x: originLeft, y: originTop } =\n\t\tevent.target.nextElementSibling.getBoundingClientRect();\n\tconst scaleWidth =\n\t\tevent.target.nextElementSibling.offsetWidth / targetWidth;\n\tconst scaleHeight =\n\t\tevent.target.nextElementSibling.offsetHeight / targetHeight;\n\n\t// Get values used to center the image\n\tlet targetLeft = 0;\n\tif ( targetWidth >= containerInnerWidth ) {\n\t\ttargetLeft = horizontalPadding;\n\t} else {\n\t\ttargetLeft = ( containerOuterWidth - targetWidth ) / 2;\n\t}\n\tlet targetTop = 0;\n\tif ( targetHeight >= containerInnerHeight ) {\n\t\ttargetTop = verticalPadding;\n\t} else {\n\t\ttargetTop = ( containerOuterHeight - targetHeight ) / 2;\n\t}\n\n\tconst root = document.documentElement;\n\troot.style.setProperty( '--lightbox-scale-width', scaleWidth );\n\troot.style.setProperty( '--lightbox-scale-height', scaleHeight );\n\troot.style.setProperty( '--lightbox-image-max-width', targetWidth + 'px' );\n\troot.style.setProperty(\n\t\t'--lightbox-image-max-height',\n\t\ttargetHeight + 'px'\n\t);\n\troot.style.setProperty(\n\t\t'--lightbox-initial-left-position',\n\t\toriginLeft + 'px'\n\t);\n\troot.style.setProperty(\n\t\t'--lightbox-initial-top-position',\n\t\toriginTop + 'px'\n\t);\n\troot.style.setProperty(\n\t\t'--lightbox-target-left-position',\n\t\ttargetLeft + 'px'\n\t);\n\troot.style.setProperty(\n\t\t'--lightbox-target-top-position',\n\t\ttargetTop + 'px'\n\t);\n}\n"]}