None:
@@ -767,7 +767,7 @@ def test_pixel_food_pause_and_reduced_motion(self) -> None:
wait_for_condition(page, "before => document.querySelector('[data-pond-state]')?.dataset.fishPositions !== before", arg=positions)
x, y = find_open_water(page, pond)
before = int(pond.get_attribute("data-food-dropped-count"))
- page.mouse.click(x, y, button="right")
+ page.mouse.click(x, y)
wait_for_condition(page, "before => Number(document.querySelector('[data-pond-state]')?.dataset.foodDroppedCount) > before", arg=before)
self.assertGreater(int(pond.get_attribute("data-food-count")), 0)
page.evaluate("""() => {
@@ -1029,6 +1029,21 @@ def test_copyright_year_hydrates_when_the_visitors_clock_differs(self) -> None:
expect(page.locator("footer")).to_contain_text(expected)
self.assertEqual(issues, [])
+ def test_display_font_loads_under_the_production_security_policy(self) -> None:
+ browser = self.playwright.chromium.launch()
+ self.addCleanup(browser.close)
+ page = browser.new_page()
+ issues = []
+ page.on("console", lambda message: record_console_issue(issues, message))
+ page.goto(self.base_url, wait_until="networkidle")
+ loaded = page.evaluate("""async () => {
+ const faces = await document.fonts.load('46px "Instrument Serif"', 'Lu');
+ return faces.length === 1 && faces[0].status === 'loaded';
+ }""")
+ self.assertTrue(loaded)
+ self.assertIn('Instrument Serif', page.locator('#hero-title').evaluate('element => getComputedStyle(element).fontFamily'))
+ self.assertEqual(issues, [])
+
def test_homepage_is_responsive_and_routes_featured_work(self) -> None:
for viewport_name, viewport in (
("desktop", {"width": 1440, "height": 900}),
@@ -1046,34 +1061,18 @@ def test_homepage_is_responsive_and_routes_featured_work(self) -> None:
).is_visible()
)
expect(page.locator("#hero-title")).to_have_css("clip-path", "none")
+ cards = page.locator("#work article")
+ self.assertEqual(cards.count(), 4)
for project in ("Rakazo", "linux-sonar", "HomeBot", "ConnectorMap"):
- self.assertTrue(
- page.get_by_role("button", name=re.compile(project, re.I)).is_visible()
- )
-
- wait_for_condition(
- page,
- "document.querySelector('[data-pond-state]')?.dataset.pondState === 'running'"
- )
- impact_count = page.locator("[data-pond-state]").get_attribute(
- "data-primary-impact-count"
- )
- self.assertTrue(
- page.get_by_role("group", name="Featured projects").is_visible()
- )
- page.get_by_role("button", name=re.compile("Rakazo", re.I)).click()
- self.assertEqual(
- page.locator("[data-pond-state]").get_attribute(
- "data-primary-impact-count"
- ),
- impact_count,
- )
- proof = page.get_by_text("4 highlighted merged PRs", exact=True)
- proof.wait_for(state="visible")
- self.assertTrue(proof.is_visible())
- self.assertTrue(
- page.get_by_role("link", name="Merged work").is_visible()
- )
+ expect(cards.get_by_role("heading", name=project, exact=True)).to_be_visible()
+ wait_for_condition(page, "document.querySelector('[data-pond-state]')?.dataset.pondState === 'running'")
+ impact_count = page.locator("[data-pond-state]").get_attribute("data-primary-impact-count")
+ cards.first.scroll_into_view_if_needed()
+ cards.first.get_by_role("heading").click()
+ self.assertEqual(page.locator("[data-pond-state]").get_attribute("data-primary-impact-count"), impact_count)
+ expect(cards.first.locator("[class*=projectFigure] strong")).to_have_text("4")
+ expect(cards.first.get_by_text("highlighted merged PRs upstream", exact=True)).to_be_visible()
+ expect(cards.first.get_by_role("link", name="Merged work")).to_be_visible()
self.assertLessEqual(
page.evaluate("document.documentElement.scrollWidth"),
viewport["width"],
@@ -1087,46 +1086,28 @@ def test_homepage_is_responsive_and_routes_featured_work(self) -> None:
)
browser.close()
- def test_project_marker_is_centered_for_every_selection(self) -> None:
+ def test_project_grid_shows_every_card_without_selection(self) -> None:
browser = self.playwright.chromium.launch()
self.addCleanup(browser.close)
for width, height in ((1440, 900), (390, 844), (320, 800)):
with self.subTest(width=width):
page = browser.new_page(viewport={"width": width, "height": height})
page.goto(self.base_url, wait_until="networkidle")
- buttons = page.get_by_role("group", name="Featured projects").get_by_role("button")
- for index in range(4):
- button = buttons.nth(index)
- button.click()
- page.wait_for_timeout(400)
- self.assertEqual(button.get_attribute("aria-pressed"), "true")
- centers = button.evaluate("""async button => {
- const marker = button.querySelector('i');
- let previous = null;
- let stable = 0;
- const deadline = performance.now() + 5000;
- while (performance.now() < deadline) {
- await new Promise(requestAnimationFrame);
- const bounds = button.getBoundingClientRect();
- const dot = marker.getBoundingClientRect();
- const centers = [bounds.y + bounds.height / 2, dot.y + dot.height / 2];
- stable = previous && centers.every((value, index) => Math.abs(value - previous[index]) < 0.05) ? stable + 1 : 0;
- if (stable >= 3) return centers;
- previous = centers;
- }
- throw new Error('Project marker did not settle');
- }""")
- self.assertAlmostEqual(centers[0], centers[1], delta=0.75)
- if width <= 390:
- heading = page.locator("#work article h3")
- expect(heading).to_have_text(button.locator("strong").inner_text())
- heading.scroll_into_view_if_needed()
- self.assertTrue(heading.evaluate("""element => {
- const range = document.createRange();
- range.selectNodeContents(element);
- const lines = [...range.getClientRects()];
- return lines.length === 1 && lines[0].width <= element.clientWidth;
- }"""), f"Project heading wraps at {width}px")
+ cards = page.locator("#work article")
+ self.assertEqual(cards.count(), 4)
+ self.assertEqual(page.locator("#work [aria-pressed]").count(), 0)
+ for index, project in enumerate(("Rakazo", "linux-sonar", "HomeBot", "ConnectorMap")):
+ card = cards.nth(index)
+ heading = card.get_by_role("heading", name=project, exact=True)
+ card.scroll_into_view_if_needed()
+ expect(heading).to_be_visible()
+ expect(card.get_by_role("link", name=f"View project {project}", exact=True)).to_be_visible()
+ self.assertTrue(heading.evaluate("""element => {
+ const range = document.createRange();
+ range.selectNodeContents(element);
+ return [...range.getClientRects()].every(line => line.width <= element.clientWidth + 1);
+ }"""), f"Project heading overflows at {width}px")
+ page.screenshot(path=SCREENSHOTS / f"project-grid-{width}.png", full_page=True)
page.close()
def test_mobile_navigation_hero_viewport_and_system_color_modes(self) -> None:
@@ -1268,9 +1249,9 @@ def test_homepage_preserves_layout_and_world_state_across_viewport_matrix(self)
const heading = document.querySelector('#hero-title').getBoundingClientRect();
const header = document.querySelector('header').getBoundingClientRect();
const pond = document.querySelector('[data-renderer]').getBoundingClientRect();
- const buttons = [...document.querySelectorAll('[aria-label="Featured projects"] button')]
+ const buttons = [...document.querySelectorAll('#work article [class*="projectActions"] a:first-child')]
.map(element => element.getBoundingClientRect());
- const projectNames = [...document.querySelectorAll('[aria-label="Featured projects"] strong')];
+ const projectNames = [...document.querySelectorAll('#work article h3')];
const aboutCards = [...document.querySelectorAll('#about > article, #about > div:last-child')];
const layoutWidth = document.documentElement.clientWidth;
const fish = document.querySelector('[data-pond-state]').dataset.fishPositions
@@ -1281,11 +1262,16 @@ def test_homepage_preserves_layout_and_world_state_across_viewport_matrix(self)
headerInside: header.left >= -1 && header.right <= width + 1,
pondFits: Math.abs(pond.width - width) < 1 && Math.abs(pond.height - height) < 1,
projectTargets: buttons.length === 4 && buttons.every(button => button.width >= 44 && button.height >= 44),
- projectDistribution: width <= 430 || (buttons.length === 4 && Math.abs(buttons[3].right - document.querySelector('[aria-label="Featured projects"]').getBoundingClientRect().right) < 2),
+ projectDistribution: (() => {
+ const cards = [...document.querySelectorAll('#work article')].map(card => card.getBoundingClientRect());
+ return cards.length === 4 && (width <= 900
+ ? cards.every((card, index) => index === 0 || card.top >= cards[index - 1].bottom)
+ : Math.abs(cards[0].top - cards[1].top) < 1 && cards[1].left >= cards[0].right && cards[2].top >= cards[0].bottom);
+ })(),
projectNamesFit: width > 430 || projectNames.every(element => {
const range = document.createRange();
range.selectNodeContents(element);
- return range.getBoundingClientRect().width <= element.getBoundingClientRect().width + 1;
+ return [...range.getClientRects()].every(line => line.width <= element.getBoundingClientRect().width + 1);
}),
aboutCardsCentered: width > 430 || aboutCards.every(element => {
const bounds = element.getBoundingClientRect();
@@ -1432,7 +1418,7 @@ def test_loading_shows_skeleton_then_fades_in_the_live_ecosystem(self) -> None:
self.assertEqual(host.evaluate("element => getComputedStyle(element).opacity"), "1")
browser.close()
- def test_hero_copy_does_not_block_pointer_water_reaction(self) -> None:
+ def test_hero_copy_is_selectable_and_blocks_pond_input(self) -> None:
browser = self.playwright.chromium.launch()
page = self.pond_page(browser, viewport={"width": 1280, "height": 800})
page.goto(f"{self.base_url}/?pond-seed=e2e-hero-pointer", wait_until="networkidle")
@@ -1453,7 +1439,12 @@ def test_hero_copy_does_not_block_pointer_water_reaction(self) -> None:
box["y"] + box["height"] * vertical,
)
responsive |= pond.get_attribute("data-food-affordance") == "true"
- self.assertTrue(responsive)
+ self.assertFalse(responsive)
+ self.assertEqual(page.locator('#hero-title').evaluate('element => getComputedStyle(element).userSelect'), 'auto')
+ before_food = pond.get_attribute("data-food-dropped-count")
+ page.get_by_role("heading", name="I make stubborn software behave.").click()
+ page.wait_for_timeout(200)
+ self.assertEqual(pond.get_attribute("data-food-dropped-count"), before_food)
action = page.get_by_role("link", name="Things I’ve made").bounding_box()
page.mouse.move(
@@ -1497,12 +1488,12 @@ def test_navigation_and_bordered_controls_keep_their_visual_hierarchy(self) -> N
navigation.evaluate_all(
"elements => elements.map(element => [element.textContent.trim(), element.getAttribute('href')])"
),
- [["Work", "#work"], ["About", "#about"], ["Contact", "#contact"]],
+ [["Work", "#work"], ["More", "#about"], ["Contact", "#contact"]],
)
expect(hero.get_by_role("img", name="Lu's illustrated avatar wearing a pink cap")).to_be_visible()
expect(hero.get_by_role("heading", level=1)).to_have_text("Hi, I’m Lu.")
expect(page.locator("header a[href='#top']")).to_be_visible()
- category_labels = page.locator("[aria-label='Featured projects'] button small")
+ category_labels = page.locator("#work article [class*=projectEyebrow]")
self.assertEqual(category_labels.count(), 4)
self.assertTrue(
category_labels.evaluate_all(
@@ -1525,21 +1516,19 @@ def test_navigation_and_bordered_controls_keep_their_visual_hierarchy(self) -> N
}
def assert_homebot_image_fits(panel) -> None:
- illustration = panel.locator('svg[aria-hidden="true"]').first
+ illustration = panel.locator('[class*=projectIllustration] > svg')
expect(illustration).to_be_visible()
self.assertGreater(illustration.bounding_box()["width"], 100)
self.assertEqual(panel.locator("video, img").count(), 0)
for project, href in project_hrefs.items():
- button = page.get_by_role("button", name=re.compile(project, re.I))
- button.click()
- self.assertEqual(button.get_attribute("aria-pressed"), "true")
panel = page.locator("article").filter(
has=page.get_by_role("heading", name=project, exact=True)
)
+ panel.scroll_into_view_if_needed()
panel.wait_for(state="visible")
self.assertEqual(
- panel.get_by_role("link", name="View project", exact=True).get_attribute(
+ panel.get_by_role("link", name=f"View project {project}", exact=True).get_attribute(
"href"
),
href,
@@ -1554,18 +1543,16 @@ def assert_homebot_image_fits(panel) -> None:
)).to_be_visible()
for tag in ("Read + act", "Marked inferences", "Source links"):
expect(panel.locator("[class*='proofRow']").get_by_text(tag, exact=True)).to_be_visible()
- expect(panel.locator('svg[aria-hidden="true"]').first).to_be_visible()
- link = panel.get_by_role("link", name="View project", exact=True)
+ expect(panel.locator('[class*=projectIllustration] > svg')).to_be_visible()
+ link = panel.get_by_role("link", name=f"View project {project}", exact=True)
expect(link).to_have_attribute("target", "_blank")
expect(link).to_have_attribute("rel", "noreferrer")
page.set_viewport_size({"width": 390, "height": 844})
- homebot_button = page.get_by_role("button", name=re.compile("HomeBot", re.I))
- homebot_button.click()
- self.assertEqual(homebot_button.get_attribute("aria-pressed"), "true")
homebot_panel = page.locator("article").filter(
has=page.get_by_role("heading", name="HomeBot", exact=True)
)
+ homebot_panel.scroll_into_view_if_needed()
homebot_panel.wait_for(state="visible")
assert_homebot_image_fits(homebot_panel)
browser.close()
@@ -1586,8 +1573,9 @@ def test_pointer_stirs_the_pond(self) -> None:
self.assertEqual(
page.evaluate("getComputedStyle(document.querySelector('#top')).userSelect"),
- "none",
+ "auto",
)
+ self.assertEqual(page.locator('[data-pond-state]').evaluate('element => getComputedStyle(element).userSelect'), 'none')
self.assertEqual(page.get_by_text("Touch the water", exact=True).count(), 0)
pond = page.locator("[data-pond-state]")
@@ -1716,15 +1704,15 @@ def test_food_drop_reservation_and_feeding(self) -> None:
}, { once: true })"""
)
page.mouse.click(fish_x, fish_y, button="right")
+ self.assertEqual(page.locator("html").get_attribute("data-pond-context-prevented"), "false")
+ self.assertEqual(int(pond.get_attribute("data-food-dropped-count")), food_before)
+ page.mouse.click(fish_x, fish_y)
wait_for_condition(
page,
"initial => Number(document.querySelector('[data-pond-state]')?.dataset.foodDroppedCount) > initial",
arg=food_before,
)
- self.assertEqual(
- page.locator("html").get_attribute("data-pond-context-prevented"),
- "true",
- )
+ self.assertEqual(int(pond.get_attribute("data-food-dropped-count")), food_before + 1)
camera_x, camera_y, scale_x, scale_y = (
float(value) for value in pond.get_attribute("data-pond-camera").split(",")
)
@@ -1825,7 +1813,7 @@ def test_reduced_motion_preserves_the_ecosystem_at_low_speed(self) -> None:
for point in pond.get_attribute("data-fish-positions").split(";")
]
fish_x, fish_y = find_open_water(page, pond, fish_points)
- page.mouse.click(fish_x, fish_y, button="right")
+ page.mouse.click(fish_x, fish_y)
wait_for_condition(
page,
"Number(document.querySelector('[data-pond-state]')?.dataset.foodDroppedCount) > 0"
@@ -1852,52 +1840,14 @@ def test_mobile_touch_disturbs_the_shared_pond(self) -> None:
for point in pond.get_attribute("data-fish-positions").split(";")
]
fish_x, fish_y = find_open_water(page, pond, fish_points)
- page.evaluate("""() => {
- window.__pondTouchEvents = [];
- for (const type of ['pointerdown', 'pointerup', 'pointercancel']) {
- document.addEventListener(type, event => {
- if (event.pointerType === 'touch') window.__pondTouchEvents.push({
- type, time: performance.now(), x: event.clientX, y: event.clientY,
- target: event.target?.tagName,
- });
- }, true);
- }
- }""")
impacts_before = int(pond.get_attribute("data-primary-impact-count"))
+ food_before = int(pond.get_attribute("data-food-dropped-count"))
page.touchscreen.tap(fish_x, fish_y)
- wait_for_condition(
- page,
- "document.querySelector('[data-pond-state]')?.dataset.touchGesture === 'single-tap-impact'"
- )
- self.assertEqual(
- int(pond.get_attribute("data-primary-impact-count")),
- impacts_before + 1,
- )
+ wait_for_condition(page, "document.querySelector('[data-pond-state]')?.dataset.touchGesture === 'tap-food'")
+ wait_for_condition(page, "before => Number(document.querySelector('[data-pond-state]').dataset.foodDroppedCount) === before + 1", arg=food_before)
+ self.assertEqual(int(pond.get_attribute("data-primary-impact-count")), impacts_before + 1)
self.assertGreater(int(pond.get_attribute("data-ring-count")), 0)
- self.assertEqual(int(pond.get_attribute("data-food-dropped-count")), 0)
- impacts_before_food = int(pond.get_attribute("data-primary-impact-count"))
- touch_session = context.new_cdp_session(page)
-
- def double_tap(x, y):
- touch_session.send("Input.synthesizeTapGesture", {
- "x": x, "y": y, "duration": 100,
- "tapCount": 2, "gestureSourceType": "touch",
- })
-
- double_tap(fish_x, fish_y)
- try:
- wait_for_condition(
- page,
- "Number(document.querySelector('[data-pond-state]')?.dataset.foodDroppedCount) > 0"
- )
- except PlaywrightTimeoutError:
- detail = pond.evaluate(
- "element => ({ gesture: element.dataset.touchGesture, requested: element.dataset.foodRequestedAt, frame: element.dataset.frame, state: element.dataset.pondState })"
- )
- detail["touch_events"] = page.evaluate("window.__pondTouchEvents")
- context.close()
- browser.close()
- self.fail(f"Double-tap did not commit food: {detail}")
+ self.assertEqual(int(pond.get_attribute("data-food-dropped-count")), food_before + 1)
camera_x, camera_y, scale_x, scale_y = (
float(value) for value in pond.get_attribute("data-pond-camera").split(",")
)
@@ -1913,16 +1863,19 @@ def double_tap(x, y):
page.wait_for_timeout(500)
self.assertEqual(
int(pond.get_attribute("data-primary-impact-count")),
- impacts_before_food,
+ impacts_before + 1,
)
dropped_count = int(pond.get_attribute("data-food-dropped-count"))
- project_button = page.get_by_role("button", name=re.compile("Rakazo", re.I))
- project_button.scroll_into_view_if_needed()
- box = project_button.bounding_box()
- double_tap(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
+ project_link = page.get_by_role("link", name="Things I’ve made", exact=True)
+ project_link.scroll_into_view_if_needed()
+ box = project_link.bounding_box()
+ page.touchscreen.tap(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
page.wait_for_timeout(500)
self.assertEqual(int(pond.get_attribute("data-food-dropped-count")), dropped_count)
+ page.evaluate("window.scrollTo(0, 0)")
+ fish_x, fish_y = find_open_water(page, pond)
+
def pointer_sequence(events):
page.evaluate(
"""({ x, y, events }) => {
@@ -1970,7 +1923,7 @@ def pointer_sequence(events):
self.assertEqual(int(pond.get_attribute("data-food-dropped-count")), dropped_count)
self.assertEqual(
int(pond.get_attribute("data-primary-impact-count")),
- impacts_before_food,
+ impacts_before + 1,
)
self.assertGreaterEqual(int(pond.get_attribute("data-fish-count")), 8)
context.close()
diff --git a/tests/browser/issues_test.py b/tests/browser/issues_test.py
index c45154c..fead406 100644
--- a/tests/browser/issues_test.py
+++ b/tests/browser/issues_test.py
@@ -24,7 +24,7 @@ def test_actions_captions_privacy_and_immediate_navigation(self):
self.assertGreaterEqual(link.evaluate('e=>parseFloat(getComputedStyle(e).fontSize)'),14)
self.assertGreaterEqual(link.bounding_box()['height'],44)
expect(page.locator('footer').get_by_role('link',name='Privacy')).to_have_attribute('href','/privacy')
- for section in ('Work','About','Contact'):
+ for section in ('Work','More','Contact'):
page.get_by_role('navigation',name='Portfolio navigation').get_by_role('link',name=section,exact=True).click()
expect(page.locator('header [aria-current="location"]')).to_have_text(section)
self.assertEqual(page.locator('#contact').evaluate('e=>getComputedStyle(e).opacity'),'1')
From 5a28bc85d9918db786d7a61f12cdf96abb022d7b Mon Sep 17 00:00:00 2001
From: luinbytes <42706009+luinbytes@users.noreply.github.com>
Date: Thu, 12 Nov 2026 00:40:22 +0000
Subject: [PATCH 4/6] Revert "Restore keyboard and screen reader feeding
without the visible button"
This reverts commit 5eb53e3d214025f4d71eac80866fa6dc78dbcb41.
---
components/concepts/signal-desk/pond-input.ts | 29 +---------------
.../signal-desk/signal-desk.module.css | 33 -------------------
.../concepts/signal-desk/signal-desk.tsx | 12 +------
3 files changed, 2 insertions(+), 72 deletions(-)
diff --git a/components/concepts/signal-desk/pond-input.ts b/components/concepts/signal-desk/pond-input.ts
index 3e565b6..d4ffd2f 100644
--- a/components/concepts/signal-desk/pond-input.ts
+++ b/components/concepts/signal-desk/pond-input.ts
@@ -16,8 +16,7 @@ function isCompletedTap(touch: { moved: boolean; started: number }, now: number,
}
// A single click or tap on open water splashes and drops food. The browser's
-// context menu is never intercepted. Keyboard users feed through the
-// "pond-feed" event (see feedFromControl).
+// context menu is never intercepted.
export function installPondInput(options: PondInputOptions) {
const { interaction } = options;
@@ -102,30 +101,6 @@ export function installPondInput(options: PondInputOptions) {
if (activeTouch?.id === event.pointerId) activeTouch = null;
};
- // Keyboard and screen reader feeding. The pond surface is aria-hidden, so a
- // visually hidden "Feed fish" control dispatches a cancelable "pond-feed"
- // event here. Search a centre-out grid for open water that no page content
- // ([data-pond-obscures]) covers and drop food at the first hit. Calling
- // preventDefault tells the dispatcher that food was dropped.
- const feedCandidates = [0.5, 0.3, 0.7, 0.15, 0.85, 0.05, 0.95];
- const isObscured = (screen: PondPoint) =>
- [...document.querySelectorAll("[data-pond-obscures]")].some(element => {
- const box = element.getBoundingClientRect();
- return screen.x >= box.left && screen.x <= box.right && screen.y >= box.top && screen.y <= box.bottom;
- });
-
- const feedFromControl = (event: Event) => {
- for (const y of feedCandidates) {
- for (const x of feedCandidates) {
- const screen = { x: innerWidth * x, y: innerHeight * y };
- if (!isObscured(screen) && ownsPoint(screen) && dropFood(screen)) {
- event.preventDefault();
- return;
- }
- }
- }
- };
-
const resize = () => {
activeTouch = null;
};
@@ -134,7 +109,6 @@ export function installPondInput(options: PondInputOptions) {
interaction.addEventListener("pointerdown", press, { passive: true });
interaction.addEventListener("pointerup", release, { passive: false });
interaction.addEventListener("pointercancel", cancel, { passive: true });
- interaction.addEventListener("pond-feed", feedFromControl);
window.addEventListener("resize", resize, { passive: true });
return () => {
@@ -142,7 +116,6 @@ export function installPondInput(options: PondInputOptions) {
interaction.removeEventListener("pointerdown", press);
interaction.removeEventListener("pointerup", release);
interaction.removeEventListener("pointercancel", cancel);
- interaction.removeEventListener("pond-feed", feedFromControl);
window.removeEventListener("resize", resize);
};
}
diff --git a/components/concepts/signal-desk/signal-desk.module.css b/components/concepts/signal-desk/signal-desk.module.css
index a435c2d..fc8ea90 100644
--- a/components/concepts/signal-desk/signal-desk.module.css
+++ b/components/concepts/signal-desk/signal-desk.module.css
@@ -76,39 +76,6 @@
border:0;
}
-/* The keyboard and screen reader feed control: visually hidden like
- .srOnly until it receives keyboard focus, then it appears as a pond
- control chip (same pattern as the skip link). */
-.feedControl {
- position:absolute;
- width:1px;
- height:1px;
- padding:0;
- margin:-1px;
- overflow:hidden;
- clip:rect(0,0,0,0);
- white-space:nowrap;
- border:0;
-}
-
-.feedControl:focus-visible {
- position:static;
- width:auto;
- height:auto;
- min-height:44px;
- padding:0 11px;
- margin:0;
- overflow:visible;
- clip:auto;
- white-space:normal;
- border:1px solid var(--control-edge);
- border-radius:2px;
- background:var(--paper);
- font-family:var(--font-space-mono),monospace;
- font-size:13px;
- cursor:pointer;
-}
-
.header {
position:fixed;
z-index:30;
diff --git a/components/concepts/signal-desk/signal-desk.tsx b/components/concepts/signal-desk/signal-desk.tsx
index 7df3cc7..d2637c7 100644
--- a/components/concepts/signal-desk/signal-desk.tsx
+++ b/components/concepts/signal-desk/signal-desk.tsx
@@ -215,7 +215,6 @@ export function SignalDesk() {
return () => { window.removeEventListener("scroll", sync); window.removeEventListener("hashchange", sync); };
}, []);
const [pondStatus, setPondStatus] = useState<{ mode: string; renderer: string }>({ mode: "ascii", renderer: "loading" });
- const [feedStatus, setFeedStatus] = useState("");
const entrance = ready && !reduced;
useEffect(() => {
@@ -231,7 +230,7 @@ export function SignalDesk() {
return (
-
The decorative pond responds to pointer movement. Click or tap open water to feed the fish, or use the Feed fish button next to the pond view options to drop food with the keyboard.
+
The decorative pond responds to pointer movement. Click or tap open water to feed the fish.
- {/* Visually hidden: the pond surface is aria-hidden, so this is the
- keyboard and screen reader route to feeding. Pointer users click
- or tap the water instead. */}
- {
- const surface = pageRef.current?.querySelector("[data-pond-input]");
- const handled = surface && !surface.dispatchEvent(new Event("pond-feed", { cancelable: true }));
- setFeedStatus(handled ? "Food dropped in the pond." : "No open water visible. Return to the top and try again.");
- }}>Feed fish
{pondStatus.mode !== pondView || pondStatus.renderer === "loading"
? `Loading ${pondView === "ascii" ? "ASCII" : "Pixel"} view…`
@@ -373,7 +364,6 @@ export function SignalDesk() {
? "Pond unavailable. Try the other view."
: `Current view: ${pondView === "ascii" ? "ASCII" : "Pixel"}`}
- {feedStatus}
From 3c0d997df8b5603c2608585eda4edd54f75b12f2 Mon Sep 17 00:00:00 2001
From: luinbytes <42706009+luinbytes@users.noreply.github.com>
Date: Thu, 12 Nov 2026 00:41:09 +0000
Subject: [PATCH 5/6] Verify pointer feeding without any Feed control
---
tests/browser/issues_test.py | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/tests/browser/issues_test.py b/tests/browser/issues_test.py
index fead406..b6797b8 100644
--- a/tests/browser/issues_test.py
+++ b/tests/browser/issues_test.py
@@ -1,5 +1,5 @@
"""Behaviour checks for the ready homepage issue batch."""
-from browser_test import BrowserTestCase, expect, wait_for_condition
+from browser_test import BrowserTestCase, expect, wait_for_condition, find_open_water
class HomepageIssueTests(BrowserTestCase):
def test_skip_link_is_first_and_focuses_main(self):
@@ -35,7 +35,7 @@ def test_actions_captions_privacy_and_immediate_navigation(self):
self.assertEqual(page.locator('#contact').evaluate('e=>getComputedStyle(e).opacity'),'1')
page.close()
- def test_feed_button_keyboard_and_ascii_without_unused_rasters(self):
+ def test_pointer_feeding_without_feed_control_or_unused_ascii_rasters(self):
browser = self.playwright.chromium.launch()
self.addCleanup(browser.close)
page = self.pond_page(browser)
@@ -47,9 +47,11 @@ def test_feed_button_keyboard_and_ascii_without_unused_rasters(self):
for mode in ('ASCII','Pixel'):
page.get_by_label(mode,exact=True).check()
wait_for_condition(page, "document.querySelector('[data-pond-state]')?.dataset.pondState==='running'")
- feed=page.get_by_role('button',name='Feed fish',exact=True)
- expect(feed).to_be_enabled()
- before=int(page.locator('[data-pond-state]').get_attribute('data-food-dropped-count'))
- feed.focus();page.keyboard.press('Enter')
- wait_for_condition(page, "before=>Number(document.querySelector('[data-pond-state]').dataset.foodDroppedCount)>before",arg=before)
- expect(page.get_by_role('status',name='').filter(has_text='Food dropped')).to_be_visible()
+ self.assertEqual(page.get_by_role('button',name='Feed fish',exact=True,include_hidden=True).count(),0)
+ self.assertEqual(page.locator('[class*="feedControl"], [class*="feedButton"]').count(),0)
+ pond=page.locator('[data-pond-state]')
+ before=int(pond.get_attribute('data-food-dropped-count'))
+ x,y=find_open_water(page,pond)
+ page.mouse.click(x,y)
+ wait_for_condition(page, "before=>Number(document.querySelector('[data-pond-state]').dataset.foodDroppedCount)===before+1",arg=before)
+ self.assertEqual(int(pond.get_attribute('data-food-dropped-count')),before+1)
From cb0744df647c610ac353cbfbcd44021c7eff92eb Mon Sep 17 00:00:00 2001
From: luinbytes <42706009+luinbytes@users.noreply.github.com>
Date: Thu, 12 Nov 2026 00:51:10 +0000
Subject: [PATCH 6/6] Center the project heading before testing pointer
isolation
---
tests/browser/browser_test.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/tests/browser/browser_test.py b/tests/browser/browser_test.py
index b6550d7..74d82d8 100644
--- a/tests/browser/browser_test.py
+++ b/tests/browser/browser_test.py
@@ -1067,8 +1067,9 @@ def test_homepage_is_responsive_and_routes_featured_work(self) -> None:
expect(cards.get_by_role("heading", name=project, exact=True)).to_be_visible()
wait_for_condition(page, "document.querySelector('[data-pond-state]')?.dataset.pondState === 'running'")
impact_count = page.locator("[data-pond-state]").get_attribute("data-primary-impact-count")
- cards.first.scroll_into_view_if_needed()
- cards.first.get_by_role("heading").click()
+ heading = cards.first.get_by_role("heading")
+ heading.evaluate("element => element.scrollIntoView({ block: 'center', behavior: 'instant' })")
+ heading.click()
self.assertEqual(page.locator("[data-pond-state]").get_attribute("data-primary-impact-count"), impact_count)
expect(cards.first.locator("[class*=projectFigure] strong")).to_have_text("4")
expect(cards.first.get_by_text("highlighted merged PRs upstream", exact=True)).to_be_visible()