@wordpress/block-library 8.19.6 → 8.19.8

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.
@@ -90,8 +90,9 @@ function handleScroll(context) {
90
90
  context.core.image.initialized = true;
91
91
  context.core.image.lastFocusedElement = window.document.activeElement;
92
92
  context.core.image.scrollDelta = 0;
93
+ context.core.image.pointerType = event.pointerType;
93
94
  context.core.image.lightboxEnabled = true;
94
- setStyles(context, event.target.previousElementSibling);
95
+ setStyles(context, context.core.image.imageRef);
95
96
  context.core.image.scrollTopReset = window.pageYOffset || document.documentElement.scrollTop;
96
97
 
97
98
  // In most cases, this value will be 0, but this is included
@@ -112,7 +113,8 @@ function handleScroll(context) {
112
113
  window.addEventListener('scroll', scrollCallback, false);
113
114
  },
114
115
  hideLightbox: async ({
115
- context
116
+ context,
117
+ event
116
118
  }) => {
117
119
  context.core.image.hideAnimationEnabled = true;
118
120
  if (context.core.image.lightboxEnabled) {
@@ -126,9 +128,16 @@ function handleScroll(context) {
126
128
  window.removeEventListener('scroll', scrollCallback);
127
129
  }, 450);
128
130
  context.core.image.lightboxEnabled = false;
129
- context.core.image.lastFocusedElement.focus({
130
- preventScroll: true
131
- });
131
+
132
+ // We want to avoid drawing attention to the button
133
+ // after the lightbox closes for mouse and touch users.
134
+ // Note that the `event.pointerType` property returns
135
+ // as an empty string if a keyboard fired the event.
136
+ if (event.pointerType === '') {
137
+ context.core.image.lastFocusedElement.focus({
138
+ preventScroll: true
139
+ });
140
+ }
132
141
  }
133
142
  },
134
143
  handleKeydown: ({
@@ -155,8 +164,9 @@ function handleScroll(context) {
155
164
  }
156
165
  }
157
166
  },
167
+ // This is fired just by lazily loaded
168
+ // images on the page, not all images.
158
169
  handleLoad: ({
159
- state,
160
170
  context,
161
171
  effects,
162
172
  ref
@@ -164,7 +174,6 @@ function handleScroll(context) {
164
174
  context.core.image.imageLoaded = true;
165
175
  context.core.image.imageCurrentSrc = ref.currentSrc;
166
176
  effects.core.image.setButtonStyles({
167
- state,
168
177
  context,
169
178
  ref
170
179
  });
@@ -232,10 +241,11 @@ function handleScroll(context) {
232
241
  effects: {
233
242
  core: {
234
243
  image: {
235
- setCurrentSrc: ({
244
+ initOriginImage: ({
236
245
  context,
237
246
  ref
238
247
  }) => {
248
+ context.core.image.imageRef = ref;
239
249
  if (ref.complete) {
240
250
  context.core.image.imageLoaded = true;
241
251
  context.core.image.imageCurrentSrc = ref.currentSrc;
@@ -245,17 +255,22 @@ function handleScroll(context) {
245
255
  context,
246
256
  ref
247
257
  }) => {
248
- context.core.image.figureRef = ref.querySelector('figure');
249
- context.core.image.imageRef = ref.querySelector('img');
250
258
  if (context.core.image.lightboxEnabled) {
251
259
  const focusableElements = ref.querySelectorAll(focusableSelectors);
252
260
  context.core.image.firstFocusableElement = focusableElements[0];
253
261
  context.core.image.lastFocusableElement = focusableElements[focusableElements.length - 1];
254
- ref.querySelector('.close-button').focus();
262
+
263
+ // We want to avoid drawing unnecessary attention to the close
264
+ // button for mouse and touch users. Note that even if opening
265
+ // the lightbox via keyboard, the event fired is of type
266
+ // `pointerEvent`, so we need to rely on the `event.pointerType`
267
+ // property, which returns an empty string for keyboard events.
268
+ if (context.core.image.pointerType === '') {
269
+ ref.querySelector('.close-button').focus();
270
+ }
255
271
  }
256
272
  },
257
273
  setButtonStyles: ({
258
- state,
259
274
  context,
260
275
  ref
261
276
  }) => {
@@ -267,43 +282,51 @@ function handleScroll(context) {
267
282
  } = ref;
268
283
 
269
284
  // If the image isn't loaded yet, we can't
270
- // calculate how big the button should be.
285
+ // calculate where the button should be.
271
286
  if (naturalWidth === 0 || naturalHeight === 0) {
272
287
  return;
273
288
  }
289
+ const figure = ref.parentElement;
290
+ const figureWidth = ref.parentElement.clientWidth;
274
291
 
275
- // Subscribe to the window dimensions so we can
276
- // recalculate the styles if the window is resized.
277
- if ((state.core.image.windowWidth || state.core.image.windowHeight) && context.core.image.scaleAttr === 'contain') {
278
- // In the case of an image with object-fit: contain, the
279
- // size of the img element can be larger than the image itself,
280
- // so we need to calculate the size of the button to match.
292
+ // We need special handling for the height because
293
+ // a caption will cause the figure to be taller than
294
+ // the image, which means we need to account for that
295
+ // when calculating the placement of the button in the
296
+ // top right corner of the image.
297
+ let figureHeight = ref.parentElement.clientHeight;
298
+ const caption = figure.querySelector('figcaption');
299
+ if (caption) {
300
+ const captionComputedStyle = window.getComputedStyle(caption);
301
+ figureHeight = figureHeight - caption.offsetHeight - parseFloat(captionComputedStyle.marginTop) - parseFloat(captionComputedStyle.marginBottom);
302
+ }
303
+ const buttonOffsetTop = figureHeight - offsetHeight;
304
+ const buttonOffsetRight = figureWidth - offsetWidth;
281
305
 
306
+ // In the case of an image with object-fit: contain, the
307
+ // size of the <img> element can be larger than the image itself,
308
+ // so we need to calculate where to place the button.
309
+ if (context.core.image.scaleAttr === 'contain') {
282
310
  // Natural ratio of the image.
283
311
  const naturalRatio = naturalWidth / naturalHeight;
284
312
  // Offset ratio of the image.
285
313
  const offsetRatio = offsetWidth / offsetHeight;
286
- if (naturalRatio > offsetRatio) {
314
+ if (naturalRatio >= offsetRatio) {
287
315
  // If it reaches the width first, keep
288
- // the width and recalculate the height.
289
- context.core.image.imageButtonWidth = offsetWidth;
290
- const buttonHeight = offsetWidth / naturalRatio;
291
- context.core.image.imageButtonHeight = buttonHeight;
292
- context.core.image.imageButtonTop = (offsetHeight - buttonHeight) / 2;
316
+ // the width and compute the height.
317
+ const referenceHeight = offsetWidth / naturalRatio;
318
+ context.core.image.imageButtonTop = (offsetHeight - referenceHeight) / 2 + buttonOffsetTop + 10;
319
+ context.core.image.imageButtonRight = buttonOffsetRight + 10;
293
320
  } else {
294
321
  // If it reaches the height first, keep
295
- // the height and recalculate the width.
296
- context.core.image.imageButtonHeight = offsetHeight;
297
- const buttonWidth = offsetHeight * naturalRatio;
298
- context.core.image.imageButtonWidth = buttonWidth;
299
- context.core.image.imageButtonLeft = (offsetWidth - buttonWidth) / 2;
322
+ // the height and compute the width.
323
+ const referenceWidth = offsetHeight * naturalRatio;
324
+ context.core.image.imageButtonTop = buttonOffsetTop + 10;
325
+ context.core.image.imageButtonRight = (offsetWidth - referenceWidth) / 2 + buttonOffsetRight + 10;
300
326
  }
301
327
  } else {
302
- // In all other cases, we can trust that the size of
303
- // the image is the right size for the button as well.
304
-
305
- context.core.image.imageButtonWidth = offsetWidth;
306
- context.core.image.imageButtonHeight = offsetHeight;
328
+ context.core.image.imageButtonTop = buttonOffsetTop + 10;
329
+ context.core.image.imageButtonRight = buttonOffsetRight + 10;
307
330
  }
308
331
  },
309
332
  setStylesOnResize: ({
@@ -1 +1 @@
1
- {"version":3,"names":["_interactivity","require","focusableSelectors","scrollCallback","isTouching","lastTouchTime","handleScroll","context","Date","now","window","scrollTo","core","image","scrollLeftReset","scrollTopReset","store","state","windowWidth","innerWidth","windowHeight","innerHeight","actions","showLightbox","event","imageLoaded","initialized","lastFocusedElement","document","activeElement","scrollDelta","lightboxEnabled","setStyles","target","previousElementSibling","pageYOffset","documentElement","scrollTop","pageXOffset","scrollLeft","bind","addEventListener","hideLightbox","hideAnimationEnabled","setTimeout","removeEventListener","focus","preventScroll","handleKeydown","key","keyCode","shiftKey","firstFocusableElement","preventDefault","lastFocusableElement","handleLoad","effects","ref","imageCurrentSrc","currentSrc","setButtonStyles","handleTouchStart","handleTouchMove","handleTouchEnd","selectors","roleAttribute","ariaModal","dialogLabel","lightboxObjectFit","enlargedImgSrc","imageUploadedSrc","setCurrentSrc","complete","initLightbox","figureRef","querySelector","imageRef","focusableElements","querySelectorAll","length","naturalWidth","naturalHeight","offsetWidth","offsetHeight","scaleAttr","naturalRatio","offsetRatio","imageButtonWidth","buttonHeight","imageButtonHeight","imageButtonTop","buttonWidth","imageButtonLeft","setStylesOnResize","afterLoad","debounce","originalWidth","originalHeight","x","screenPosX","y","screenPosY","getBoundingClientRect","originalRatio","heightWithoutSpace","widthWithoutSpace","imgMaxWidth","parseFloat","targetWidth","imgMaxHeight","targetHeight","imgRatio","containerMaxWidth","containerMaxHeight","containerWidth","containerHeight","toFixed","reducedHeight","reducedWidth","horizontalPadding","verticalPadding","targetMaxWidth","Math","min","targetMaxHeight","targetContainerRatio","containerScale","lightboxImgWidth","lightboxImgHeight","styleTag","getElementById","createElement","id","head","appendChild","innerHTML","func","wait","timeout","later","clearTimeout"],"sources":["@wordpress/block-library/src/image/view.js"],"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\n/*\n * Stores a context-bound scroll handler.\n *\n * This callback could be defined inline inside of the store\n * object but it's created externally to avoid confusion about\n * how its logic is called. This logic is not referenced directly\n * by the directives in the markup because the scroll event we\n * need to listen to is triggered on the window; so by defining it\n * outside of the store, we signal that the behavior here is different.\n * If we find a compelling reason to move it to the store, feel free.\n *\n * @type {Function}\n */\nlet scrollCallback;\n\n/*\n * Tracks whether user is touching screen; used to\n * differentiate behavior for touch and mouse input.\n *\n * @type {boolean}\n */\nlet isTouching = false;\n\n/*\n * Tracks the last time the screen was touched; used to\n * differentiate behavior for touch and mouse input.\n *\n * @type {number}\n */\nlet lastTouchTime = 0;\n\n/*\n * Lightbox page-scroll handler: prevents scrolling.\n *\n * This handler is added to prevent scrolling behaviors that\n * trigger content shift while the lightbox is open.\n *\n * It would be better to accomplish this through CSS alone, but\n * using overflow: hidden is currently the only way to do so, and\n * that causes the layout to shift and prevents the zoom animation\n * from working in some cases because we're unable to account for\n * the layout shift when doing the animation calculations. Instead,\n * here we use JavaScript to prevent and reset the scrolling\n * behavior. In the future, we may be able to use CSS or overflow: hidden\n * instead to not rely on JavaScript, but this seems to be the best approach\n * for now that provides the best visual experience.\n *\n * @param {Object} context Interactivity page context?\n */\nfunction handleScroll( context ) {\n\t// We can't override the scroll behavior on mobile devices\n\t// because doing so breaks the pinch to zoom functionality, and we\n\t// want to allow users to zoom in further on the high-res image.\n\tif ( ! isTouching && Date.now() - lastTouchTime > 450 ) {\n\t\t// We are unable to use event.preventDefault() to prevent scrolling\n\t\t// because the scroll event can't be canceled, so we reset the position instead.\n\t\twindow.scrollTo(\n\t\t\tcontext.core.image.scrollLeftReset,\n\t\t\tcontext.core.image.scrollTopReset\n\t\t);\n\t}\n}\n\nstore(\n\t{\n\t\tstate: {\n\t\t\tcore: {\n\t\t\t\timage: {\n\t\t\t\t\twindowWidth: window.innerWidth,\n\t\t\t\t\twindowHeight: window.innerHeight,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tcore: {\n\t\t\t\timage: {\n\t\t\t\t\tshowLightbox: ( { context, event } ) => {\n\t\t\t\t\t\t// We can't initialize the lightbox until the reference\n\t\t\t\t\t\t// image is loaded, otherwise the UX is broken.\n\t\t\t\t\t\tif ( ! context.core.image.imageLoaded ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontext.core.image.initialized = true;\n\t\t\t\t\t\tcontext.core.image.lastFocusedElement =\n\t\t\t\t\t\t\twindow.document.activeElement;\n\t\t\t\t\t\tcontext.core.image.scrollDelta = 0;\n\n\t\t\t\t\t\tcontext.core.image.lightboxEnabled = true;\n\t\t\t\t\t\tsetStyles(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tevent.target.previousElementSibling\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcontext.core.image.scrollTopReset =\n\t\t\t\t\t\t\twindow.pageYOffset ||\n\t\t\t\t\t\t\tdocument.documentElement.scrollTop;\n\n\t\t\t\t\t\t// In most cases, this value will be 0, but this is included\n\t\t\t\t\t\t// in case a user has created a page with horizontal scrolling.\n\t\t\t\t\t\tcontext.core.image.scrollLeftReset =\n\t\t\t\t\t\t\twindow.pageXOffset ||\n\t\t\t\t\t\t\tdocument.documentElement.scrollLeft;\n\n\t\t\t\t\t\t// We define and bind the scroll callback here so\n\t\t\t\t\t\t// that we can pass the context and as an argument.\n\t\t\t\t\t\t// We may be able to change this in the future if we\n\t\t\t\t\t\t// define the scroll callback in the store instead, but\n\t\t\t\t\t\t// this approach seems to tbe clearest for now.\n\t\t\t\t\t\tscrollCallback = handleScroll.bind( null, context );\n\n\t\t\t\t\t\t// We need to add a scroll event listener to the window\n\t\t\t\t\t\t// here because we are unable to otherwise access it via\n\t\t\t\t\t\t// the Interactivity API directives. If we add a native way\n\t\t\t\t\t\t// to access the window, we can remove this.\n\t\t\t\t\t\twindow.addEventListener(\n\t\t\t\t\t\t\t'scroll',\n\t\t\t\t\t\t\tscrollCallback,\n\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\thideLightbox: async ( { context } ) => {\n\t\t\t\t\t\tcontext.core.image.hideAnimationEnabled = true;\n\t\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t\t// We want to wait until the close animation is completed\n\t\t\t\t\t\t\t// before allowing a user to scroll again. The duration of this\n\t\t\t\t\t\t\t// animation is defined in the styles.scss and depends on if the\n\t\t\t\t\t\t\t// animation is 'zoom' or 'fade', but in any case we should wait\n\t\t\t\t\t\t\t// a few milliseconds longer than the duration, otherwise a user\n\t\t\t\t\t\t\t// may scroll too soon and cause the animation to look sloppy.\n\t\t\t\t\t\t\tsetTimeout( function () {\n\t\t\t\t\t\t\t\twindow.removeEventListener(\n\t\t\t\t\t\t\t\t\t'scroll',\n\t\t\t\t\t\t\t\t\tscrollCallback\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}, 450 );\n\n\t\t\t\t\t\t\tcontext.core.image.lightboxEnabled = false;\n\t\t\t\t\t\t\tcontext.core.image.lastFocusedElement.focus( {\n\t\t\t\t\t\t\t\tpreventScroll: true,\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\thandleKeydown: ( { context, actions, event } ) => {\n\t\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t\tif ( event.key === 'Tab' || event.keyCode === 9 ) {\n\t\t\t\t\t\t\t\t// If shift + tab it change the direction\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tevent.shiftKey &&\n\t\t\t\t\t\t\t\t\twindow.document.activeElement ===\n\t\t\t\t\t\t\t\t\t\tcontext.core.image.firstFocusableElement\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcontext.core.image.lastFocusableElement.focus();\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t! event.shiftKey &&\n\t\t\t\t\t\t\t\t\twindow.document.activeElement ===\n\t\t\t\t\t\t\t\t\t\tcontext.core.image.lastFocusableElement\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcontext.core.image.firstFocusableElement.focus();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tevent.key === 'Escape' ||\n\t\t\t\t\t\t\t\tevent.keyCode === 27\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tactions.core.image.hideLightbox( {\n\t\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\t\tevent,\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\thandleLoad: ( { state, context, effects, ref } ) => {\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\teffects.core.image.setButtonStyles( {\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tref,\n\t\t\t\t\t\t} );\n\t\t\t\t\t},\n\t\t\t\t\thandleTouchStart: () => {\n\t\t\t\t\t\tisTouching = true;\n\t\t\t\t\t},\n\t\t\t\t\thandleTouchMove: ( { context, event } ) => {\n\t\t\t\t\t\t// On mobile devices, we want to prevent triggering the\n\t\t\t\t\t\t// scroll event because otherwise the page jumps around as\n\t\t\t\t\t\t// we reset the scroll position. This also means that closing\n\t\t\t\t\t\t// the lightbox requires that a user perform a simple tap. This\n\t\t\t\t\t\t// may be changed in the future if we find a better alternative\n\t\t\t\t\t\t// to override or reset the scroll position during swipe actions.\n\t\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\thandleTouchEnd: () => {\n\t\t\t\t\t\t// We need to wait a few milliseconds before resetting\n\t\t\t\t\t\t// to ensure that pinch to zoom works consistently\n\t\t\t\t\t\t// on mobile devices when the lightbox is open.\n\t\t\t\t\t\tlastTouchTime = Date.now();\n\t\t\t\t\t\tisTouching = false;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tselectors: {\n\t\t\tcore: {\n\t\t\t\timage: {\n\t\t\t\t\troleAttribute: ( { context } ) => {\n\t\t\t\t\t\treturn context.core.image.lightboxEnabled\n\t\t\t\t\t\t\t? 'dialog'\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t},\n\t\t\t\t\tariaModal: ( { context } ) => {\n\t\t\t\t\t\treturn context.core.image.lightboxEnabled\n\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t},\n\t\t\t\t\tdialogLabel: ( { context } ) => {\n\t\t\t\t\t\treturn context.core.image.lightboxEnabled\n\t\t\t\t\t\t\t? context.core.image.dialogLabel\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t},\n\t\t\t\t\tlightboxObjectFit: ( { context } ) => {\n\t\t\t\t\t\tif ( context.core.image.initialized ) {\n\t\t\t\t\t\t\treturn 'cover';\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tenlargedImgSrc: ( { context } ) => {\n\t\t\t\t\t\treturn context.core.image.initialized\n\t\t\t\t\t\t\t? context.core.image.imageUploadedSrc\n\t\t\t\t\t\t\t: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\teffects: {\n\t\t\tcore: {\n\t\t\t\timage: {\n\t\t\t\t\tsetCurrentSrc: ( { context, ref } ) => {\n\t\t\t\t\t\tif ( ref.complete ) {\n\t\t\t\t\t\t\tcontext.core.image.imageLoaded = true;\n\t\t\t\t\t\t\tcontext.core.image.imageCurrentSrc = ref.currentSrc;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tinitLightbox: async ( { context, ref } ) => {\n\t\t\t\t\t\tcontext.core.image.figureRef =\n\t\t\t\t\t\t\tref.querySelector( 'figure' );\n\t\t\t\t\t\tcontext.core.image.imageRef =\n\t\t\t\t\t\t\tref.querySelector( 'img' );\n\t\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t\tconst focusableElements =\n\t\t\t\t\t\t\t\tref.querySelectorAll( focusableSelectors );\n\t\t\t\t\t\t\tcontext.core.image.firstFocusableElement =\n\t\t\t\t\t\t\t\tfocusableElements[ 0 ];\n\t\t\t\t\t\t\tcontext.core.image.lastFocusableElement =\n\t\t\t\t\t\t\t\tfocusableElements[\n\t\t\t\t\t\t\t\t\tfocusableElements.length - 1\n\t\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tref.querySelector( '.close-button' ).focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tsetButtonStyles: ( { state, context, ref } ) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tnaturalWidth,\n\t\t\t\t\t\t\tnaturalHeight,\n\t\t\t\t\t\t\toffsetWidth,\n\t\t\t\t\t\t\toffsetHeight,\n\t\t\t\t\t\t} = ref;\n\n\t\t\t\t\t\t// If the image isn't loaded yet, we can't\n\t\t\t\t\t\t// calculate how big the button should be.\n\t\t\t\t\t\tif ( naturalWidth === 0 || naturalHeight === 0 ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Subscribe to the window dimensions so we can\n\t\t\t\t\t\t// recalculate the styles if the window is resized.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t( state.core.image.windowWidth ||\n\t\t\t\t\t\t\t\tstate.core.image.windowHeight ) &&\n\t\t\t\t\t\t\tcontext.core.image.scaleAttr === 'contain'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// In the case of an image with object-fit: contain, the\n\t\t\t\t\t\t\t// size of the img element can be larger than the image itself,\n\t\t\t\t\t\t\t// so we need to calculate the size of the button to match.\n\n\t\t\t\t\t\t\t// Natural ratio of the image.\n\t\t\t\t\t\t\tconst naturalRatio = naturalWidth / naturalHeight;\n\t\t\t\t\t\t\t// Offset ratio of the image.\n\t\t\t\t\t\t\tconst offsetRatio = offsetWidth / offsetHeight;\n\n\t\t\t\t\t\t\tif ( naturalRatio > offsetRatio ) {\n\t\t\t\t\t\t\t\t// If it reaches the width first, keep\n\t\t\t\t\t\t\t\t// the width and recalculate the height.\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonWidth =\n\t\t\t\t\t\t\t\t\toffsetWidth;\n\t\t\t\t\t\t\t\tconst buttonHeight = offsetWidth / naturalRatio;\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonHeight =\n\t\t\t\t\t\t\t\t\tbuttonHeight;\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonTop =\n\t\t\t\t\t\t\t\t\t( offsetHeight - buttonHeight ) / 2;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// If it reaches the height first, keep\n\t\t\t\t\t\t\t\t// the height and recalculate the width.\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonHeight =\n\t\t\t\t\t\t\t\t\toffsetHeight;\n\t\t\t\t\t\t\t\tconst buttonWidth = offsetHeight * naturalRatio;\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonWidth =\n\t\t\t\t\t\t\t\t\tbuttonWidth;\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonLeft =\n\t\t\t\t\t\t\t\t\t( offsetWidth - buttonWidth ) / 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// In all other cases, we can trust that the size of\n\t\t\t\t\t\t\t// the image is the right size for the button as well.\n\n\t\t\t\t\t\t\tcontext.core.image.imageButtonWidth = offsetWidth;\n\t\t\t\t\t\t\tcontext.core.image.imageButtonHeight = offsetHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tsetStylesOnResize: ( { state, context, ref } ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcontext.core.image.lightboxEnabled &&\n\t\t\t\t\t\t\t( state.core.image.windowWidth ||\n\t\t\t\t\t\t\t\tstate.core.image.windowHeight )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tsetStyles( context, ref );\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\t{\n\t\tafterLoad: ( { state } ) => {\n\t\t\twindow.addEventListener(\n\t\t\t\t'resize',\n\t\t\t\tdebounce( () => {\n\t\t\t\t\tstate.core.image.windowWidth = window.innerWidth;\n\t\t\t\t\tstate.core.image.windowHeight = window.innerHeight;\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t}\n);\n\n/*\n * Computes styles for the lightbox and adds them to the document.\n *\n * @function\n * @param {Object} context - An Interactivity API context\n * @param {Object} event - A triggering event\n */\nfunction setStyles( context, ref ) {\n\t// The reference img element lies adjacent\n\t// to the event target button in the DOM.\n\tlet {\n\t\tnaturalWidth,\n\t\tnaturalHeight,\n\t\toffsetWidth: originalWidth,\n\t\toffsetHeight: originalHeight,\n\t} = ref;\n\tlet { x: screenPosX, y: screenPosY } = ref.getBoundingClientRect();\n\n\t// Natural ratio of the image clicked to open the lightbox.\n\tconst naturalRatio = naturalWidth / naturalHeight;\n\t// Original ratio of the image clicked to open the lightbox.\n\tlet originalRatio = originalWidth / originalHeight;\n\n\t// If it has object-fit: contain, recalculate the original sizes\n\t// and the screen position without the blank spaces.\n\tif ( context.core.image.scaleAttr === 'contain' ) {\n\t\tif ( naturalRatio > originalRatio ) {\n\t\t\tconst heightWithoutSpace = originalWidth / naturalRatio;\n\t\t\t// Recalculate screen position without the top space.\n\t\t\tscreenPosY += ( originalHeight - heightWithoutSpace ) / 2;\n\t\t\toriginalHeight = heightWithoutSpace;\n\t\t} else {\n\t\t\tconst widthWithoutSpace = originalHeight * naturalRatio;\n\t\t\t// Recalculate screen position without the left space.\n\t\t\tscreenPosX += ( originalWidth - widthWithoutSpace ) / 2;\n\t\t\toriginalWidth = widthWithoutSpace;\n\t\t}\n\t}\n\toriginalRatio = originalWidth / originalHeight;\n\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 imgMaxWidth = parseFloat(\n\t\tcontext.core.image.targetWidth !== 'none'\n\t\t\t? context.core.image.targetWidth\n\t\t\t: naturalWidth\n\t);\n\tlet imgMaxHeight = parseFloat(\n\t\tcontext.core.image.targetHeight !== 'none'\n\t\t\t? context.core.image.targetHeight\n\t\t\t: naturalHeight\n\t);\n\n\t// Ratio of the biggest image stored in the database.\n\tlet imgRatio = imgMaxWidth / imgMaxHeight;\n\tlet containerMaxWidth = imgMaxWidth;\n\tlet containerMaxHeight = imgMaxHeight;\n\tlet containerWidth = imgMaxWidth;\n\tlet containerHeight = imgMaxHeight;\n\t// Check if the target image has a different ratio than the original one (thumbnail).\n\t// Recalculate the width and height.\n\tif ( naturalRatio.toFixed( 2 ) !== imgRatio.toFixed( 2 ) ) {\n\t\tif ( naturalRatio > imgRatio ) {\n\t\t\t// If the width is reached before the height, we keep the maxWidth\n\t\t\t// and recalculate the height.\n\t\t\t// Unless the difference between the maxHeight and the reducedHeight\n\t\t\t// is higher than the maxWidth, where we keep the reducedHeight and\n\t\t\t// recalculate the width.\n\t\t\tconst reducedHeight = imgMaxWidth / naturalRatio;\n\t\t\tif ( imgMaxHeight - reducedHeight > imgMaxWidth ) {\n\t\t\t\timgMaxHeight = reducedHeight;\n\t\t\t\timgMaxWidth = reducedHeight * naturalRatio;\n\t\t\t} else {\n\t\t\t\timgMaxHeight = imgMaxWidth / naturalRatio;\n\t\t\t}\n\t\t} else {\n\t\t\t// If the height is reached before the width, we keep the maxHeight\n\t\t\t// and recalculate the width.\n\t\t\t// Unless the difference between the maxWidth and the reducedWidth\n\t\t\t// is higher than the maxHeight, where we keep the reducedWidth and\n\t\t\t// recalculate the height.\n\t\t\tconst reducedWidth = imgMaxHeight * naturalRatio;\n\t\t\tif ( imgMaxWidth - reducedWidth > imgMaxHeight ) {\n\t\t\t\timgMaxWidth = reducedWidth;\n\t\t\t\timgMaxHeight = reducedWidth / naturalRatio;\n\t\t\t} else {\n\t\t\t\timgMaxWidth = imgMaxHeight * naturalRatio;\n\t\t\t}\n\t\t}\n\t\tcontainerWidth = imgMaxWidth;\n\t\tcontainerHeight = imgMaxHeight;\n\t\timgRatio = imgMaxWidth / imgMaxHeight;\n\n\t\t// Calculate the max size of the container.\n\t\tif ( originalRatio > imgRatio ) {\n\t\t\tcontainerMaxWidth = imgMaxWidth;\n\t\t\tcontainerMaxHeight = containerMaxWidth / originalRatio;\n\t\t} else {\n\t\t\tcontainerMaxHeight = imgMaxHeight;\n\t\t\tcontainerMaxWidth = containerMaxHeight * originalRatio;\n\t\t}\n\t}\n\n\t// If the image has been pixelated on purpose, keep that size.\n\tif ( originalWidth > containerWidth || originalHeight > containerHeight ) {\n\t\tcontainerWidth = originalWidth;\n\t\tcontainerHeight = originalHeight;\n\t}\n\n\t// Calculate the final lightbox image size and the\n\t// scale factor. MaxWidth is either the window container\n\t// (accounting for padding) or the image resolution.\n\tlet horizontalPadding = 0;\n\tif ( window.innerWidth > 480 ) {\n\t\thorizontalPadding = 80;\n\t} else if ( window.innerWidth > 1920 ) {\n\t\thorizontalPadding = 160;\n\t}\n\tconst verticalPadding = 80;\n\n\tconst targetMaxWidth = Math.min(\n\t\twindow.innerWidth - horizontalPadding,\n\t\tcontainerWidth\n\t);\n\tconst targetMaxHeight = Math.min(\n\t\twindow.innerHeight - verticalPadding,\n\t\tcontainerHeight\n\t);\n\tconst targetContainerRatio = targetMaxWidth / targetMaxHeight;\n\n\tif ( originalRatio > targetContainerRatio ) {\n\t\t// If targetMaxWidth is reached before targetMaxHeight\n\t\tcontainerWidth = targetMaxWidth;\n\t\tcontainerHeight = containerWidth / originalRatio;\n\t} else {\n\t\t// If targetMaxHeight is reached before targetMaxWidth\n\t\tcontainerHeight = targetMaxHeight;\n\t\tcontainerWidth = containerHeight * originalRatio;\n\t}\n\n\tconst containerScale = originalWidth / containerWidth;\n\tconst lightboxImgWidth =\n\t\timgMaxWidth * ( containerWidth / containerMaxWidth );\n\tconst lightboxImgHeight =\n\t\timgMaxHeight * ( containerHeight / containerMaxHeight );\n\n\t// Add the CSS variables needed.\n\tlet styleTag = document.getElementById( 'wp-lightbox-styles' );\n\tif ( ! styleTag ) {\n\t\tstyleTag = document.createElement( 'style' );\n\t\tstyleTag.id = 'wp-lightbox-styles';\n\t\tdocument.head.appendChild( styleTag );\n\t}\n\n\t// As of this writing, using the calculations above will render the lightbox\n\t// with a small, erroneous whitespace on the left side of the image in iOS Safari,\n\t// perhaps due to an inconsistency in how browsers handle absolute positioning and CSS\n\t// transformation. In any case, adding 1 pixel to the container width and height solves\n\t// the problem, though this can be removed if the issue is fixed in the future.\n\tstyleTag.innerHTML = `\n\t\t:root {\n\t\t\t--wp--lightbox-initial-top-position: ${ screenPosY }px;\n\t\t\t--wp--lightbox-initial-left-position: ${ screenPosX }px;\n\t\t\t--wp--lightbox-container-width: ${ containerWidth + 1 }px;\n\t\t\t--wp--lightbox-container-height: ${ containerHeight + 1 }px;\n\t\t\t--wp--lightbox-image-width: ${ lightboxImgWidth }px;\n\t\t\t--wp--lightbox-image-height: ${ lightboxImgHeight }px;\n\t\t\t--wp--lightbox-scale: ${ containerScale };\n\t\t}\n\t`;\n}\n\n/*\n * Debounces a function call.\n *\n * @function\n * @param {Function} func - A function to be called\n * @param {number} wait - The time to wait before calling the function\n */\nfunction debounce( func, wait = 50 ) {\n\tlet timeout;\n\treturn () => {\n\t\tconst later = () => {\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tclearTimeout( timeout );\n\t\ttimeout = setTimeout( later, wait );\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_interactivity","require","focusableSelectors","scrollCallback","isTouching","lastTouchTime","handleScroll","context","Date","now","window","scrollTo","core","image","scrollLeftReset","scrollTopReset","store","state","windowWidth","innerWidth","windowHeight","innerHeight","actions","showLightbox","event","imageLoaded","initialized","lastFocusedElement","document","activeElement","scrollDelta","pointerType","lightboxEnabled","setStyles","imageRef","pageYOffset","documentElement","scrollTop","pageXOffset","scrollLeft","bind","addEventListener","hideLightbox","hideAnimationEnabled","setTimeout","removeEventListener","focus","preventScroll","handleKeydown","key","keyCode","shiftKey","firstFocusableElement","preventDefault","lastFocusableElement","handleLoad","effects","ref","imageCurrentSrc","currentSrc","setButtonStyles","handleTouchStart","handleTouchMove","handleTouchEnd","selectors","roleAttribute","ariaModal","dialogLabel","lightboxObjectFit","enlargedImgSrc","imageUploadedSrc","initOriginImage","complete","initLightbox","focusableElements","querySelectorAll","length","querySelector","naturalWidth","naturalHeight","offsetWidth","offsetHeight","figure","parentElement","figureWidth","clientWidth","figureHeight","clientHeight","caption","captionComputedStyle","getComputedStyle","parseFloat","marginTop","marginBottom","buttonOffsetTop","buttonOffsetRight","scaleAttr","naturalRatio","offsetRatio","referenceHeight","imageButtonTop","imageButtonRight","referenceWidth","setStylesOnResize","afterLoad","debounce","originalWidth","originalHeight","x","screenPosX","y","screenPosY","getBoundingClientRect","originalRatio","heightWithoutSpace","widthWithoutSpace","imgMaxWidth","targetWidth","imgMaxHeight","targetHeight","imgRatio","containerMaxWidth","containerMaxHeight","containerWidth","containerHeight","toFixed","reducedHeight","reducedWidth","horizontalPadding","verticalPadding","targetMaxWidth","Math","min","targetMaxHeight","targetContainerRatio","containerScale","lightboxImgWidth","lightboxImgHeight","styleTag","getElementById","createElement","id","head","appendChild","innerHTML","func","wait","timeout","later","clearTimeout"],"sources":["@wordpress/block-library/src/image/view.js"],"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\n/*\n * Stores a context-bound scroll handler.\n *\n * This callback could be defined inline inside of the store\n * object but it's created externally to avoid confusion about\n * how its logic is called. This logic is not referenced directly\n * by the directives in the markup because the scroll event we\n * need to listen to is triggered on the window; so by defining it\n * outside of the store, we signal that the behavior here is different.\n * If we find a compelling reason to move it to the store, feel free.\n *\n * @type {Function}\n */\nlet scrollCallback;\n\n/*\n * Tracks whether user is touching screen; used to\n * differentiate behavior for touch and mouse input.\n *\n * @type {boolean}\n */\nlet isTouching = false;\n\n/*\n * Tracks the last time the screen was touched; used to\n * differentiate behavior for touch and mouse input.\n *\n * @type {number}\n */\nlet lastTouchTime = 0;\n\n/*\n * Lightbox page-scroll handler: prevents scrolling.\n *\n * This handler is added to prevent scrolling behaviors that\n * trigger content shift while the lightbox is open.\n *\n * It would be better to accomplish this through CSS alone, but\n * using overflow: hidden is currently the only way to do so, and\n * that causes the layout to shift and prevents the zoom animation\n * from working in some cases because we're unable to account for\n * the layout shift when doing the animation calculations. Instead,\n * here we use JavaScript to prevent and reset the scrolling\n * behavior. In the future, we may be able to use CSS or overflow: hidden\n * instead to not rely on JavaScript, but this seems to be the best approach\n * for now that provides the best visual experience.\n *\n * @param {Object} context Interactivity page context?\n */\nfunction handleScroll( context ) {\n\t// We can't override the scroll behavior on mobile devices\n\t// because doing so breaks the pinch to zoom functionality, and we\n\t// want to allow users to zoom in further on the high-res image.\n\tif ( ! isTouching && Date.now() - lastTouchTime > 450 ) {\n\t\t// We are unable to use event.preventDefault() to prevent scrolling\n\t\t// because the scroll event can't be canceled, so we reset the position instead.\n\t\twindow.scrollTo(\n\t\t\tcontext.core.image.scrollLeftReset,\n\t\t\tcontext.core.image.scrollTopReset\n\t\t);\n\t}\n}\n\nstore(\n\t{\n\t\tstate: {\n\t\t\tcore: {\n\t\t\t\timage: {\n\t\t\t\t\twindowWidth: window.innerWidth,\n\t\t\t\t\twindowHeight: window.innerHeight,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tcore: {\n\t\t\t\timage: {\n\t\t\t\t\tshowLightbox: ( { context, event } ) => {\n\t\t\t\t\t\t// We can't initialize the lightbox until the reference\n\t\t\t\t\t\t// image is loaded, otherwise the UX is broken.\n\t\t\t\t\t\tif ( ! context.core.image.imageLoaded ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontext.core.image.initialized = true;\n\t\t\t\t\t\tcontext.core.image.lastFocusedElement =\n\t\t\t\t\t\t\twindow.document.activeElement;\n\t\t\t\t\t\tcontext.core.image.scrollDelta = 0;\n\t\t\t\t\t\tcontext.core.image.pointerType = event.pointerType;\n\n\t\t\t\t\t\tcontext.core.image.lightboxEnabled = true;\n\t\t\t\t\t\tsetStyles( context, context.core.image.imageRef );\n\n\t\t\t\t\t\tcontext.core.image.scrollTopReset =\n\t\t\t\t\t\t\twindow.pageYOffset ||\n\t\t\t\t\t\t\tdocument.documentElement.scrollTop;\n\n\t\t\t\t\t\t// In most cases, this value will be 0, but this is included\n\t\t\t\t\t\t// in case a user has created a page with horizontal scrolling.\n\t\t\t\t\t\tcontext.core.image.scrollLeftReset =\n\t\t\t\t\t\t\twindow.pageXOffset ||\n\t\t\t\t\t\t\tdocument.documentElement.scrollLeft;\n\n\t\t\t\t\t\t// We define and bind the scroll callback here so\n\t\t\t\t\t\t// that we can pass the context and as an argument.\n\t\t\t\t\t\t// We may be able to change this in the future if we\n\t\t\t\t\t\t// define the scroll callback in the store instead, but\n\t\t\t\t\t\t// this approach seems to tbe clearest for now.\n\t\t\t\t\t\tscrollCallback = handleScroll.bind( null, context );\n\n\t\t\t\t\t\t// We need to add a scroll event listener to the window\n\t\t\t\t\t\t// here because we are unable to otherwise access it via\n\t\t\t\t\t\t// the Interactivity API directives. If we add a native way\n\t\t\t\t\t\t// to access the window, we can remove this.\n\t\t\t\t\t\twindow.addEventListener(\n\t\t\t\t\t\t\t'scroll',\n\t\t\t\t\t\t\tscrollCallback,\n\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\thideLightbox: async ( { context, event } ) => {\n\t\t\t\t\t\tcontext.core.image.hideAnimationEnabled = true;\n\t\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t\t// We want to wait until the close animation is completed\n\t\t\t\t\t\t\t// before allowing a user to scroll again. The duration of this\n\t\t\t\t\t\t\t// animation is defined in the styles.scss and depends on if the\n\t\t\t\t\t\t\t// animation is 'zoom' or 'fade', but in any case we should wait\n\t\t\t\t\t\t\t// a few milliseconds longer than the duration, otherwise a user\n\t\t\t\t\t\t\t// may scroll too soon and cause the animation to look sloppy.\n\t\t\t\t\t\t\tsetTimeout( function () {\n\t\t\t\t\t\t\t\twindow.removeEventListener(\n\t\t\t\t\t\t\t\t\t'scroll',\n\t\t\t\t\t\t\t\t\tscrollCallback\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}, 450 );\n\n\t\t\t\t\t\t\tcontext.core.image.lightboxEnabled = false;\n\n\t\t\t\t\t\t\t// We want to avoid drawing attention to the button\n\t\t\t\t\t\t\t// after the lightbox closes for mouse and touch users.\n\t\t\t\t\t\t\t// Note that the `event.pointerType` property returns\n\t\t\t\t\t\t\t// as an empty string if a keyboard fired the event.\n\t\t\t\t\t\t\tif ( event.pointerType === '' ) {\n\t\t\t\t\t\t\t\tcontext.core.image.lastFocusedElement.focus( {\n\t\t\t\t\t\t\t\t\tpreventScroll: true,\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\thandleKeydown: ( { context, actions, event } ) => {\n\t\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t\tif ( event.key === 'Tab' || event.keyCode === 9 ) {\n\t\t\t\t\t\t\t\t// If shift + tab it change the direction\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tevent.shiftKey &&\n\t\t\t\t\t\t\t\t\twindow.document.activeElement ===\n\t\t\t\t\t\t\t\t\t\tcontext.core.image.firstFocusableElement\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcontext.core.image.lastFocusableElement.focus();\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t! event.shiftKey &&\n\t\t\t\t\t\t\t\t\twindow.document.activeElement ===\n\t\t\t\t\t\t\t\t\t\tcontext.core.image.lastFocusableElement\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tcontext.core.image.firstFocusableElement.focus();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tevent.key === 'Escape' ||\n\t\t\t\t\t\t\t\tevent.keyCode === 27\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tactions.core.image.hideLightbox( {\n\t\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\t\tevent,\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// This is fired just by lazily loaded\n\t\t\t\t\t// images on the page, not all images.\n\t\t\t\t\thandleLoad: ( { context, effects, ref } ) => {\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\teffects.core.image.setButtonStyles( {\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tref,\n\t\t\t\t\t\t} );\n\t\t\t\t\t},\n\t\t\t\t\thandleTouchStart: () => {\n\t\t\t\t\t\tisTouching = true;\n\t\t\t\t\t},\n\t\t\t\t\thandleTouchMove: ( { context, event } ) => {\n\t\t\t\t\t\t// On mobile devices, we want to prevent triggering the\n\t\t\t\t\t\t// scroll event because otherwise the page jumps around as\n\t\t\t\t\t\t// we reset the scroll position. This also means that closing\n\t\t\t\t\t\t// the lightbox requires that a user perform a simple tap. This\n\t\t\t\t\t\t// may be changed in the future if we find a better alternative\n\t\t\t\t\t\t// to override or reset the scroll position during swipe actions.\n\t\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\thandleTouchEnd: () => {\n\t\t\t\t\t\t// We need to wait a few milliseconds before resetting\n\t\t\t\t\t\t// to ensure that pinch to zoom works consistently\n\t\t\t\t\t\t// on mobile devices when the lightbox is open.\n\t\t\t\t\t\tlastTouchTime = Date.now();\n\t\t\t\t\t\tisTouching = false;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tselectors: {\n\t\t\tcore: {\n\t\t\t\timage: {\n\t\t\t\t\troleAttribute: ( { context } ) => {\n\t\t\t\t\t\treturn context.core.image.lightboxEnabled\n\t\t\t\t\t\t\t? 'dialog'\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t},\n\t\t\t\t\tariaModal: ( { context } ) => {\n\t\t\t\t\t\treturn context.core.image.lightboxEnabled\n\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t},\n\t\t\t\t\tdialogLabel: ( { context } ) => {\n\t\t\t\t\t\treturn context.core.image.lightboxEnabled\n\t\t\t\t\t\t\t? context.core.image.dialogLabel\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t},\n\t\t\t\t\tlightboxObjectFit: ( { context } ) => {\n\t\t\t\t\t\tif ( context.core.image.initialized ) {\n\t\t\t\t\t\t\treturn 'cover';\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tenlargedImgSrc: ( { context } ) => {\n\t\t\t\t\t\treturn context.core.image.initialized\n\t\t\t\t\t\t\t? context.core.image.imageUploadedSrc\n\t\t\t\t\t\t\t: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\teffects: {\n\t\t\tcore: {\n\t\t\t\timage: {\n\t\t\t\t\tinitOriginImage: ( { context, ref } ) => {\n\t\t\t\t\t\tcontext.core.image.imageRef = ref;\n\t\t\t\t\t\tif ( ref.complete ) {\n\t\t\t\t\t\t\tcontext.core.image.imageLoaded = true;\n\t\t\t\t\t\t\tcontext.core.image.imageCurrentSrc = ref.currentSrc;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tinitLightbox: async ( { context, ref } ) => {\n\t\t\t\t\t\tif ( context.core.image.lightboxEnabled ) {\n\t\t\t\t\t\t\tconst focusableElements =\n\t\t\t\t\t\t\t\tref.querySelectorAll( focusableSelectors );\n\t\t\t\t\t\t\tcontext.core.image.firstFocusableElement =\n\t\t\t\t\t\t\t\tfocusableElements[ 0 ];\n\t\t\t\t\t\t\tcontext.core.image.lastFocusableElement =\n\t\t\t\t\t\t\t\tfocusableElements[\n\t\t\t\t\t\t\t\t\tfocusableElements.length - 1\n\t\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\t// We want to avoid drawing unnecessary attention to the close\n\t\t\t\t\t\t\t// button for mouse and touch users. Note that even if opening\n\t\t\t\t\t\t\t// the lightbox via keyboard, the event fired is of type\n\t\t\t\t\t\t\t// `pointerEvent`, so we need to rely on the `event.pointerType`\n\t\t\t\t\t\t\t// property, which returns an empty string for keyboard events.\n\t\t\t\t\t\t\tif ( context.core.image.pointerType === '' ) {\n\t\t\t\t\t\t\t\tref.querySelector( '.close-button' ).focus();\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\tsetButtonStyles: ( { context, ref } ) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tnaturalWidth,\n\t\t\t\t\t\t\tnaturalHeight,\n\t\t\t\t\t\t\toffsetWidth,\n\t\t\t\t\t\t\toffsetHeight,\n\t\t\t\t\t\t} = ref;\n\n\t\t\t\t\t\t// If the image isn't loaded yet, we can't\n\t\t\t\t\t\t// calculate where the button should be.\n\t\t\t\t\t\tif ( naturalWidth === 0 || naturalHeight === 0 ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst figure = ref.parentElement;\n\t\t\t\t\t\tconst figureWidth = ref.parentElement.clientWidth;\n\n\t\t\t\t\t\t// We need special handling for the height because\n\t\t\t\t\t\t// a caption will cause the figure to be taller than\n\t\t\t\t\t\t// the image, which means we need to account for that\n\t\t\t\t\t\t// when calculating the placement of the button in the\n\t\t\t\t\t\t// top right corner of the image.\n\t\t\t\t\t\tlet figureHeight = ref.parentElement.clientHeight;\n\t\t\t\t\t\tconst caption = figure.querySelector( 'figcaption' );\n\t\t\t\t\t\tif ( caption ) {\n\t\t\t\t\t\t\tconst captionComputedStyle =\n\t\t\t\t\t\t\t\twindow.getComputedStyle( caption );\n\t\t\t\t\t\t\tfigureHeight =\n\t\t\t\t\t\t\t\tfigureHeight -\n\t\t\t\t\t\t\t\tcaption.offsetHeight -\n\t\t\t\t\t\t\t\tparseFloat( captionComputedStyle.marginTop ) -\n\t\t\t\t\t\t\t\tparseFloat( captionComputedStyle.marginBottom );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst buttonOffsetTop = figureHeight - offsetHeight;\n\t\t\t\t\t\tconst buttonOffsetRight = figureWidth - offsetWidth;\n\n\t\t\t\t\t\t// In the case of an image with object-fit: contain, the\n\t\t\t\t\t\t// size of the <img> element can be larger than the image itself,\n\t\t\t\t\t\t// so we need to calculate where to place the button.\n\t\t\t\t\t\tif ( context.core.image.scaleAttr === 'contain' ) {\n\t\t\t\t\t\t\t// Natural ratio of the image.\n\t\t\t\t\t\t\tconst naturalRatio = naturalWidth / naturalHeight;\n\t\t\t\t\t\t\t// Offset ratio of the image.\n\t\t\t\t\t\t\tconst offsetRatio = offsetWidth / offsetHeight;\n\n\t\t\t\t\t\t\tif ( naturalRatio >= offsetRatio ) {\n\t\t\t\t\t\t\t\t// If it reaches the width first, keep\n\t\t\t\t\t\t\t\t// the width and compute the height.\n\t\t\t\t\t\t\t\tconst referenceHeight =\n\t\t\t\t\t\t\t\t\toffsetWidth / naturalRatio;\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonTop =\n\t\t\t\t\t\t\t\t\t( offsetHeight - referenceHeight ) / 2 +\n\t\t\t\t\t\t\t\t\tbuttonOffsetTop +\n\t\t\t\t\t\t\t\t\t10;\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonRight =\n\t\t\t\t\t\t\t\t\tbuttonOffsetRight + 10;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// If it reaches the height first, keep\n\t\t\t\t\t\t\t\t// the height and compute the width.\n\t\t\t\t\t\t\t\tconst referenceWidth =\n\t\t\t\t\t\t\t\t\toffsetHeight * naturalRatio;\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonTop =\n\t\t\t\t\t\t\t\t\tbuttonOffsetTop + 10;\n\t\t\t\t\t\t\t\tcontext.core.image.imageButtonRight =\n\t\t\t\t\t\t\t\t\t( offsetWidth - referenceWidth ) / 2 +\n\t\t\t\t\t\t\t\t\tbuttonOffsetRight +\n\t\t\t\t\t\t\t\t\t10;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.core.image.imageButtonTop =\n\t\t\t\t\t\t\t\tbuttonOffsetTop + 10;\n\t\t\t\t\t\t\tcontext.core.image.imageButtonRight =\n\t\t\t\t\t\t\t\tbuttonOffsetRight + 10;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tsetStylesOnResize: ( { state, context, ref } ) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcontext.core.image.lightboxEnabled &&\n\t\t\t\t\t\t\t( state.core.image.windowWidth ||\n\t\t\t\t\t\t\t\tstate.core.image.windowHeight )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tsetStyles( context, ref );\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\t{\n\t\tafterLoad: ( { state } ) => {\n\t\t\twindow.addEventListener(\n\t\t\t\t'resize',\n\t\t\t\tdebounce( () => {\n\t\t\t\t\tstate.core.image.windowWidth = window.innerWidth;\n\t\t\t\t\tstate.core.image.windowHeight = window.innerHeight;\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t}\n);\n\n/*\n * Computes styles for the lightbox and adds them to the document.\n *\n * @function\n * @param {Object} context - An Interactivity API context\n * @param {Object} event - A triggering event\n */\nfunction setStyles( context, ref ) {\n\t// The reference img element lies adjacent\n\t// to the event target button in the DOM.\n\tlet {\n\t\tnaturalWidth,\n\t\tnaturalHeight,\n\t\toffsetWidth: originalWidth,\n\t\toffsetHeight: originalHeight,\n\t} = ref;\n\tlet { x: screenPosX, y: screenPosY } = ref.getBoundingClientRect();\n\n\t// Natural ratio of the image clicked to open the lightbox.\n\tconst naturalRatio = naturalWidth / naturalHeight;\n\t// Original ratio of the image clicked to open the lightbox.\n\tlet originalRatio = originalWidth / originalHeight;\n\n\t// If it has object-fit: contain, recalculate the original sizes\n\t// and the screen position without the blank spaces.\n\tif ( context.core.image.scaleAttr === 'contain' ) {\n\t\tif ( naturalRatio > originalRatio ) {\n\t\t\tconst heightWithoutSpace = originalWidth / naturalRatio;\n\t\t\t// Recalculate screen position without the top space.\n\t\t\tscreenPosY += ( originalHeight - heightWithoutSpace ) / 2;\n\t\t\toriginalHeight = heightWithoutSpace;\n\t\t} else {\n\t\t\tconst widthWithoutSpace = originalHeight * naturalRatio;\n\t\t\t// Recalculate screen position without the left space.\n\t\t\tscreenPosX += ( originalWidth - widthWithoutSpace ) / 2;\n\t\t\toriginalWidth = widthWithoutSpace;\n\t\t}\n\t}\n\toriginalRatio = originalWidth / originalHeight;\n\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 imgMaxWidth = parseFloat(\n\t\tcontext.core.image.targetWidth !== 'none'\n\t\t\t? context.core.image.targetWidth\n\t\t\t: naturalWidth\n\t);\n\tlet imgMaxHeight = parseFloat(\n\t\tcontext.core.image.targetHeight !== 'none'\n\t\t\t? context.core.image.targetHeight\n\t\t\t: naturalHeight\n\t);\n\n\t// Ratio of the biggest image stored in the database.\n\tlet imgRatio = imgMaxWidth / imgMaxHeight;\n\tlet containerMaxWidth = imgMaxWidth;\n\tlet containerMaxHeight = imgMaxHeight;\n\tlet containerWidth = imgMaxWidth;\n\tlet containerHeight = imgMaxHeight;\n\t// Check if the target image has a different ratio than the original one (thumbnail).\n\t// Recalculate the width and height.\n\tif ( naturalRatio.toFixed( 2 ) !== imgRatio.toFixed( 2 ) ) {\n\t\tif ( naturalRatio > imgRatio ) {\n\t\t\t// If the width is reached before the height, we keep the maxWidth\n\t\t\t// and recalculate the height.\n\t\t\t// Unless the difference between the maxHeight and the reducedHeight\n\t\t\t// is higher than the maxWidth, where we keep the reducedHeight and\n\t\t\t// recalculate the width.\n\t\t\tconst reducedHeight = imgMaxWidth / naturalRatio;\n\t\t\tif ( imgMaxHeight - reducedHeight > imgMaxWidth ) {\n\t\t\t\timgMaxHeight = reducedHeight;\n\t\t\t\timgMaxWidth = reducedHeight * naturalRatio;\n\t\t\t} else {\n\t\t\t\timgMaxHeight = imgMaxWidth / naturalRatio;\n\t\t\t}\n\t\t} else {\n\t\t\t// If the height is reached before the width, we keep the maxHeight\n\t\t\t// and recalculate the width.\n\t\t\t// Unless the difference between the maxWidth and the reducedWidth\n\t\t\t// is higher than the maxHeight, where we keep the reducedWidth and\n\t\t\t// recalculate the height.\n\t\t\tconst reducedWidth = imgMaxHeight * naturalRatio;\n\t\t\tif ( imgMaxWidth - reducedWidth > imgMaxHeight ) {\n\t\t\t\timgMaxWidth = reducedWidth;\n\t\t\t\timgMaxHeight = reducedWidth / naturalRatio;\n\t\t\t} else {\n\t\t\t\timgMaxWidth = imgMaxHeight * naturalRatio;\n\t\t\t}\n\t\t}\n\t\tcontainerWidth = imgMaxWidth;\n\t\tcontainerHeight = imgMaxHeight;\n\t\timgRatio = imgMaxWidth / imgMaxHeight;\n\n\t\t// Calculate the max size of the container.\n\t\tif ( originalRatio > imgRatio ) {\n\t\t\tcontainerMaxWidth = imgMaxWidth;\n\t\t\tcontainerMaxHeight = containerMaxWidth / originalRatio;\n\t\t} else {\n\t\t\tcontainerMaxHeight = imgMaxHeight;\n\t\t\tcontainerMaxWidth = containerMaxHeight * originalRatio;\n\t\t}\n\t}\n\n\t// If the image has been pixelated on purpose, keep that size.\n\tif ( originalWidth > containerWidth || originalHeight > containerHeight ) {\n\t\tcontainerWidth = originalWidth;\n\t\tcontainerHeight = originalHeight;\n\t}\n\n\t// Calculate the final lightbox image size and the\n\t// scale factor. MaxWidth is either the window container\n\t// (accounting for padding) or the image resolution.\n\tlet horizontalPadding = 0;\n\tif ( window.innerWidth > 480 ) {\n\t\thorizontalPadding = 80;\n\t} else if ( window.innerWidth > 1920 ) {\n\t\thorizontalPadding = 160;\n\t}\n\tconst verticalPadding = 80;\n\n\tconst targetMaxWidth = Math.min(\n\t\twindow.innerWidth - horizontalPadding,\n\t\tcontainerWidth\n\t);\n\tconst targetMaxHeight = Math.min(\n\t\twindow.innerHeight - verticalPadding,\n\t\tcontainerHeight\n\t);\n\tconst targetContainerRatio = targetMaxWidth / targetMaxHeight;\n\n\tif ( originalRatio > targetContainerRatio ) {\n\t\t// If targetMaxWidth is reached before targetMaxHeight\n\t\tcontainerWidth = targetMaxWidth;\n\t\tcontainerHeight = containerWidth / originalRatio;\n\t} else {\n\t\t// If targetMaxHeight is reached before targetMaxWidth\n\t\tcontainerHeight = targetMaxHeight;\n\t\tcontainerWidth = containerHeight * originalRatio;\n\t}\n\n\tconst containerScale = originalWidth / containerWidth;\n\tconst lightboxImgWidth =\n\t\timgMaxWidth * ( containerWidth / containerMaxWidth );\n\tconst lightboxImgHeight =\n\t\timgMaxHeight * ( containerHeight / containerMaxHeight );\n\n\t// Add the CSS variables needed.\n\tlet styleTag = document.getElementById( 'wp-lightbox-styles' );\n\tif ( ! styleTag ) {\n\t\tstyleTag = document.createElement( 'style' );\n\t\tstyleTag.id = 'wp-lightbox-styles';\n\t\tdocument.head.appendChild( styleTag );\n\t}\n\n\t// As of this writing, using the calculations above will render the lightbox\n\t// with a small, erroneous whitespace on the left side of the image in iOS Safari,\n\t// perhaps due to an inconsistency in how browsers handle absolute positioning and CSS\n\t// transformation. In any case, adding 1 pixel to the container width and height solves\n\t// the problem, though this can be removed if the issue is fixed in the future.\n\tstyleTag.innerHTML = `\n\t\t:root {\n\t\t\t--wp--lightbox-initial-top-position: ${ screenPosY }px;\n\t\t\t--wp--lightbox-initial-left-position: ${ screenPosX }px;\n\t\t\t--wp--lightbox-container-width: ${ containerWidth + 1 }px;\n\t\t\t--wp--lightbox-container-height: ${ containerHeight + 1 }px;\n\t\t\t--wp--lightbox-image-width: ${ lightboxImgWidth }px;\n\t\t\t--wp--lightbox-image-height: ${ lightboxImgHeight }px;\n\t\t\t--wp--lightbox-scale: ${ containerScale };\n\t\t}\n\t`;\n}\n\n/*\n * Debounces a function call.\n *\n * @function\n * @param {Function} func - A function to be called\n * @param {number} wait - The time to wait before calling the function\n */\nfunction debounce( func, wait = 50 ) {\n\tlet timeout;\n\treturn () => {\n\t\tconst later = () => {\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tclearTimeout( timeout );\n\t\ttimeout = setTimeout( later, wait );\n\t};\n}\n"],"mappings":"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"}
@@ -87,8 +87,9 @@ store({
87
87
  context.core.image.initialized = true;
88
88
  context.core.image.lastFocusedElement = window.document.activeElement;
89
89
  context.core.image.scrollDelta = 0;
90
+ context.core.image.pointerType = event.pointerType;
90
91
  context.core.image.lightboxEnabled = true;
91
- setStyles(context, event.target.previousElementSibling);
92
+ setStyles(context, context.core.image.imageRef);
92
93
  context.core.image.scrollTopReset = window.pageYOffset || document.documentElement.scrollTop;
93
94
 
94
95
  // In most cases, this value will be 0, but this is included
@@ -109,7 +110,8 @@ store({
109
110
  window.addEventListener('scroll', scrollCallback, false);
110
111
  },
111
112
  hideLightbox: async ({
112
- context
113
+ context,
114
+ event
113
115
  }) => {
114
116
  context.core.image.hideAnimationEnabled = true;
115
117
  if (context.core.image.lightboxEnabled) {
@@ -123,9 +125,16 @@ store({
123
125
  window.removeEventListener('scroll', scrollCallback);
124
126
  }, 450);
125
127
  context.core.image.lightboxEnabled = false;
126
- context.core.image.lastFocusedElement.focus({
127
- preventScroll: true
128
- });
128
+
129
+ // We want to avoid drawing attention to the button
130
+ // after the lightbox closes for mouse and touch users.
131
+ // Note that the `event.pointerType` property returns
132
+ // as an empty string if a keyboard fired the event.
133
+ if (event.pointerType === '') {
134
+ context.core.image.lastFocusedElement.focus({
135
+ preventScroll: true
136
+ });
137
+ }
129
138
  }
130
139
  },
131
140
  handleKeydown: ({
@@ -152,8 +161,9 @@ store({
152
161
  }
153
162
  }
154
163
  },
164
+ // This is fired just by lazily loaded
165
+ // images on the page, not all images.
155
166
  handleLoad: ({
156
- state,
157
167
  context,
158
168
  effects,
159
169
  ref
@@ -161,7 +171,6 @@ store({
161
171
  context.core.image.imageLoaded = true;
162
172
  context.core.image.imageCurrentSrc = ref.currentSrc;
163
173
  effects.core.image.setButtonStyles({
164
- state,
165
174
  context,
166
175
  ref
167
176
  });
@@ -229,10 +238,11 @@ store({
229
238
  effects: {
230
239
  core: {
231
240
  image: {
232
- setCurrentSrc: ({
241
+ initOriginImage: ({
233
242
  context,
234
243
  ref
235
244
  }) => {
245
+ context.core.image.imageRef = ref;
236
246
  if (ref.complete) {
237
247
  context.core.image.imageLoaded = true;
238
248
  context.core.image.imageCurrentSrc = ref.currentSrc;
@@ -242,17 +252,22 @@ store({
242
252
  context,
243
253
  ref
244
254
  }) => {
245
- context.core.image.figureRef = ref.querySelector('figure');
246
- context.core.image.imageRef = ref.querySelector('img');
247
255
  if (context.core.image.lightboxEnabled) {
248
256
  const focusableElements = ref.querySelectorAll(focusableSelectors);
249
257
  context.core.image.firstFocusableElement = focusableElements[0];
250
258
  context.core.image.lastFocusableElement = focusableElements[focusableElements.length - 1];
251
- ref.querySelector('.close-button').focus();
259
+
260
+ // We want to avoid drawing unnecessary attention to the close
261
+ // button for mouse and touch users. Note that even if opening
262
+ // the lightbox via keyboard, the event fired is of type
263
+ // `pointerEvent`, so we need to rely on the `event.pointerType`
264
+ // property, which returns an empty string for keyboard events.
265
+ if (context.core.image.pointerType === '') {
266
+ ref.querySelector('.close-button').focus();
267
+ }
252
268
  }
253
269
  },
254
270
  setButtonStyles: ({
255
- state,
256
271
  context,
257
272
  ref
258
273
  }) => {
@@ -264,43 +279,51 @@ store({
264
279
  } = ref;
265
280
 
266
281
  // If the image isn't loaded yet, we can't
267
- // calculate how big the button should be.
282
+ // calculate where the button should be.
268
283
  if (naturalWidth === 0 || naturalHeight === 0) {
269
284
  return;
270
285
  }
286
+ const figure = ref.parentElement;
287
+ const figureWidth = ref.parentElement.clientWidth;
271
288
 
272
- // Subscribe to the window dimensions so we can
273
- // recalculate the styles if the window is resized.
274
- if ((state.core.image.windowWidth || state.core.image.windowHeight) && context.core.image.scaleAttr === 'contain') {
275
- // In the case of an image with object-fit: contain, the
276
- // size of the img element can be larger than the image itself,
277
- // so we need to calculate the size of the button to match.
289
+ // We need special handling for the height because
290
+ // a caption will cause the figure to be taller than
291
+ // the image, which means we need to account for that
292
+ // when calculating the placement of the button in the
293
+ // top right corner of the image.
294
+ let figureHeight = ref.parentElement.clientHeight;
295
+ const caption = figure.querySelector('figcaption');
296
+ if (caption) {
297
+ const captionComputedStyle = window.getComputedStyle(caption);
298
+ figureHeight = figureHeight - caption.offsetHeight - parseFloat(captionComputedStyle.marginTop) - parseFloat(captionComputedStyle.marginBottom);
299
+ }
300
+ const buttonOffsetTop = figureHeight - offsetHeight;
301
+ const buttonOffsetRight = figureWidth - offsetWidth;
278
302
 
303
+ // In the case of an image with object-fit: contain, the
304
+ // size of the <img> element can be larger than the image itself,
305
+ // so we need to calculate where to place the button.
306
+ if (context.core.image.scaleAttr === 'contain') {
279
307
  // Natural ratio of the image.
280
308
  const naturalRatio = naturalWidth / naturalHeight;
281
309
  // Offset ratio of the image.
282
310
  const offsetRatio = offsetWidth / offsetHeight;
283
- if (naturalRatio > offsetRatio) {
311
+ if (naturalRatio >= offsetRatio) {
284
312
  // If it reaches the width first, keep
285
- // the width and recalculate the height.
286
- context.core.image.imageButtonWidth = offsetWidth;
287
- const buttonHeight = offsetWidth / naturalRatio;
288
- context.core.image.imageButtonHeight = buttonHeight;
289
- context.core.image.imageButtonTop = (offsetHeight - buttonHeight) / 2;
313
+ // the width and compute the height.
314
+ const referenceHeight = offsetWidth / naturalRatio;
315
+ context.core.image.imageButtonTop = (offsetHeight - referenceHeight) / 2 + buttonOffsetTop + 10;
316
+ context.core.image.imageButtonRight = buttonOffsetRight + 10;
290
317
  } else {
291
318
  // If it reaches the height first, keep
292
- // the height and recalculate the width.
293
- context.core.image.imageButtonHeight = offsetHeight;
294
- const buttonWidth = offsetHeight * naturalRatio;
295
- context.core.image.imageButtonWidth = buttonWidth;
296
- context.core.image.imageButtonLeft = (offsetWidth - buttonWidth) / 2;
319
+ // the height and compute the width.
320
+ const referenceWidth = offsetHeight * naturalRatio;
321
+ context.core.image.imageButtonTop = buttonOffsetTop + 10;
322
+ context.core.image.imageButtonRight = (offsetWidth - referenceWidth) / 2 + buttonOffsetRight + 10;
297
323
  }
298
324
  } else {
299
- // In all other cases, we can trust that the size of
300
- // the image is the right size for the button as well.
301
-
302
- context.core.image.imageButtonWidth = offsetWidth;
303
- context.core.image.imageButtonHeight = offsetHeight;
325
+ context.core.image.imageButtonTop = buttonOffsetTop + 10;
326
+ context.core.image.imageButtonRight = buttonOffsetRight + 10;
304
327
  }
305
328
  },
306
329
  setStylesOnResize: ({