diff --git a/static/img/mobile-contact-vector.svg b/static/img/mobile-contact-vector.svg
new file mode 100644
index 0000000..5dfc163
--- /dev/null
+++ b/static/img/mobile-contact-vector.svg
@@ -0,0 +1,3 @@
+
diff --git a/tests/mobile-homepage.spec.js b/tests/mobile-homepage.spec.js
index fba893a..a18fc36 100644
--- a/tests/mobile-homepage.spec.js
+++ b/tests/mobile-homepage.spec.js
@@ -350,7 +350,7 @@ test("mobile contact card matches the 402px reference geometry", async ({
const heading = await getBox(cardLocator.locator(".contact-block__text"));
const cta = await getBox(cardLocator.locator(".contact-block__cta"));
const linework = await getBox(
- cardLocator.locator(".contact-block__linework"),
+ cardLocator.locator(".contact-block__linework--mobile"),
);
const backgroundImage = cardLocator.locator(".contact-block__bg-image");
const bandHeight = await cardLocator.evaluate((element) =>
@@ -366,9 +366,9 @@ test("mobile contact card matches the 402px reference geometry", async ({
expectNear(cta.x - card.x, 33, 3);
expectNear(cta.y - card.y, 219, 5);
expectNear(cta.width, 173, 4);
- expectNear(linework.y - card.y, 300, 5);
- expectNear(linework.height, 186, 5);
- expect(linework.x).toBeLessThanOrEqual(card.x);
+ expectNear(linework.y - card.y, 299, 5);
+ expectNear(linework.height, 188, 5);
+ expectNear(linework.width, card.width, 3);
await expect(backgroundImage).toHaveCSS("object-fit", "cover");
const overlay = await cardLocator
.locator(".contact-block__media")
@@ -385,7 +385,9 @@ test("mobile contact card matches the 402px reference geometry", async ({
const media = clone.querySelector(".contact-block__media");
const content = clone.querySelector(".contact-block__content");
- const linework = clone.querySelector(".contact-block__linework");
+ const linework = clone.querySelector(
+ ".contact-block__linework--mobile",
+ );
const lineworkBox = linework.getBoundingClientRect();
const styles = {
borderRadius: getComputedStyle(clone).borderRadius,
@@ -401,7 +403,7 @@ test("mobile contact card matches the 402px reference geometry", async ({
expect(reusableStyles.borderRadius).toBe("12px 12px 0px 0px");
expect(reusableStyles.contentPaddingLeft).toBe("24px");
- expectNear(reusableStyles.lineworkRatio, 628 / 282, 0.03);
+ expectNear(reusableStyles.lineworkRatio, 342 / 187, 0.03);
expect(reusableStyles.maskImage).toContain("linear-gradient");
expect(reusableStyles.overlay).toBe("none");
});
@@ -471,30 +473,27 @@ test("mobile Our Work uses its dedicated linework composition", async ({
await page.goto(homepage);
const mobileVector = page.locator(".our-work__vector-mobile");
- const clip = mobileVector.locator(".our-work__vector-mobile-clip");
- const composition = await mobileVector.evaluate((element) => {
- const clipElement = element.querySelector(
- ".our-work__vector-mobile-clip",
- );
- const upper = getComputedStyle(clipElement, "::before");
- const lower = getComputedStyle(element, "::after");
-
- return {
- lowerBackground: lower.backgroundImage,
- lowerWidth: Number.parseFloat(lower.width),
- upperBackground: upper.backgroundImage,
- upperWidth: Number.parseFloat(upper.width),
- };
- });
+ const mobileImage = mobileVector.locator("img");
await expect(mobileVector).toBeVisible();
- await expect(clip).toBeVisible();
+ await expect(mobileImage).toBeVisible();
await expect(page.locator(".our-work__vector-desktop")).toBeHidden();
- await expect(mobileVector.locator("img")).toHaveCount(0);
- expect(composition.upperBackground).toContain("our-work-vector.svg");
- expect(composition.lowerBackground).toContain("our-work-vector.svg");
- expectNear(composition.upperWidth, 960, 4);
- expectNear(composition.lowerWidth, 960, 4);
+ await mobileImage.evaluate(
+ (image) =>
+ /** @type {HTMLImageElement} */ (image).complete ||
+ new Promise((resolve) => {
+ /** @type {HTMLImageElement} */ (image).addEventListener(
+ "load",
+ () => resolve(undefined),
+ { once: true },
+ );
+ }),
+ );
+ expect(
+ await mobileImage.evaluate(
+ (image) => /** @type {HTMLImageElement} */ (image).currentSrc,
+ ),
+ ).toContain("mobile-work-vector.svg");
});
test("mobile Our Work reserves reference height only for both images", async ({
@@ -609,32 +608,19 @@ test("mobile Our Work remains contained at responsive endpoints", async ({
expectNear(primary.y, secondary.y, 2);
expect(left.y).toBeLessThan(bottom.y);
- const vectorScale = await page
- .locator(".our-work__vector-mobile")
- .evaluate((element) => {
- const clip = element.querySelector(
- ".our-work__vector-mobile-clip",
- );
- const upper = getComputedStyle(clip, "::before");
- const lower = getComputedStyle(element, "::after");
-
- return {
- lowerLeft: Number.parseFloat(lower.left),
- lowerTop: Number.parseFloat(lower.top),
- lowerWidth: Number.parseFloat(lower.width),
- upperLeft: Number.parseFloat(upper.left),
- upperTop: Number.parseFloat(upper.top),
- upperWidth: Number.parseFloat(upper.width),
- };
- });
- const scale = width / 402;
-
- expectNear(vectorScale.upperWidth, 960 * scale, 4);
- expectNear(vectorScale.lowerWidth, 960 * scale, 4);
- expectNear(vectorScale.upperLeft, 100 * scale, 3);
- expectNear(vectorScale.upperTop, 240 * scale, 3);
- expectNear(vectorScale.lowerLeft, -430 * scale, 4);
- expectNear(vectorScale.lowerTop, 490 * scale, 4);
+ const mobileImage = page.locator(".our-work__vector-mobile img");
+ await expect(mobileImage).toBeVisible();
+ await mobileImage.evaluate(
+ (image) =>
+ /** @type {HTMLImageElement} */ (image).complete ||
+ new Promise((resolve) => {
+ /** @type {HTMLImageElement} */ (image).addEventListener(
+ "load",
+ () => resolve(undefined),
+ { once: true },
+ );
+ }),
+ );
}
});
diff --git a/tests/mobile-homepage.spec.js-snapshots/contact-card-render-chromium.png b/tests/mobile-homepage.spec.js-snapshots/contact-card-render-chromium.png
index 955596f..3db68d5 100644
Binary files a/tests/mobile-homepage.spec.js-snapshots/contact-card-render-chromium.png and b/tests/mobile-homepage.spec.js-snapshots/contact-card-render-chromium.png differ
diff --git a/views/blocks/contact-block/contact-block.css b/views/blocks/contact-block/contact-block.css
index b8e9f89..4f6fcfd 100644
--- a/views/blocks/contact-block/contact-block.css
+++ b/views/blocks/contact-block/contact-block.css
@@ -37,6 +37,10 @@
width: auto;
}
+ .contact-block__linework--mobile {
+ display: none;
+ }
+
.contact-block__content {
padding-inline: 1rem;
}
@@ -75,7 +79,12 @@
}
.contact-block .contact-block__linework {
+ display: none;
+ }
+
+ .contact-block .contact-block__linework--mobile {
bottom: 0.75rem;
+ display: block;
height: auto;
max-width: 112%;
right: -32%;
@@ -141,13 +150,18 @@
}
.contact-block.home-contact .contact-block__linework {
+ display: none;
+ }
+
+ .contact-block.home-contact .contact-block__linework--mobile {
bottom: 0;
+ display: block;
height: auto;
- left: calc(100% * -113 / 343);
+ left: 0;
max-width: none;
overflow: visible;
right: auto;
- width: calc(100% * 414 / 343);
+ width: 100%;
z-index: 2;
}
diff --git a/views/blocks/contact-block/contact-block.php b/views/blocks/contact-block/contact-block.php
index 566d9c2..e0c659e 100644
--- a/views/blocks/contact-block/contact-block.php
+++ b/views/blocks/contact-block/contact-block.php
@@ -31,6 +31,8 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview );
+
+