@brandlab-digital/conformance 3.13.0 → 3.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -2
- package/dist/analytics-e2e.d.ts +10 -16
- package/dist/analytics-e2e.d.ts.map +1 -1
- package/dist/analytics-e2e.js +61 -3
- package/dist/analytics-e2e.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/current-release.js +5 -5
- package/dist/current-release.js.map +1 -1
- package/dist/engineering.d.ts.map +1 -1
- package/dist/engineering.js +18 -2
- package/dist/engineering.js.map +1 -1
- package/dist/estate-snapshot.d.ts +54 -0
- package/dist/estate-snapshot.d.ts.map +1 -0
- package/dist/estate-snapshot.js +164 -0
- package/dist/estate-snapshot.js.map +1 -0
- package/dist/estate.d.ts +38 -0
- package/dist/estate.d.ts.map +1 -1
- package/dist/estate.js +71 -28
- package/dist/estate.js.map +1 -1
- package/dist/media-snapshot.d.ts +53 -0
- package/dist/media-snapshot.d.ts.map +1 -0
- package/dist/media-snapshot.js +66 -0
- package/dist/media-snapshot.js.map +1 -0
- package/dist/project.d.ts +20 -0
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +92 -2
- package/dist/project.js.map +1 -1
- package/dist/ready-cli.d.ts.map +1 -1
- package/dist/ready-cli.js +8 -3
- package/dist/ready-cli.js.map +1 -1
- package/dist/rule-registry.d.ts +5 -0
- package/dist/rule-registry.d.ts.map +1 -1
- package/dist/rule-registry.js +1 -0
- package/dist/rule-registry.js.map +1 -1
- package/dist/site-system/checks.d.ts +28 -3
- package/dist/site-system/checks.d.ts.map +1 -1
- package/dist/site-system/checks.js +5 -2
- package/dist/site-system/checks.js.map +1 -1
- package/dist/site-system/config.d.ts +13 -0
- package/dist/site-system/config.d.ts.map +1 -1
- package/dist/site-system/config.js +30 -1
- package/dist/site-system/config.js.map +1 -1
- package/dist/site-system/index.d.ts +1 -1
- package/dist/site-system/index.d.ts.map +1 -1
- package/dist/site-system/index.js +1 -1
- package/dist/site-system/index.js.map +1 -1
- package/dist/site-system/journeys/conversion.d.ts.map +1 -1
- package/dist/site-system/journeys/conversion.js +15 -2
- package/dist/site-system/journeys/conversion.js.map +1 -1
- package/dist/site-system/journeys/menu.d.ts.map +1 -1
- package/dist/site-system/journeys/menu.js +24 -1
- package/dist/site-system/journeys/menu.js.map +1 -1
- package/dist/site-system/journeys/page-helpers.d.ts.map +1 -1
- package/dist/site-system/journeys/page-helpers.js +1 -1
- package/dist/site-system/journeys/page-helpers.js.map +1 -1
- package/dist/site-system/journeys/plan.d.ts +13 -3
- package/dist/site-system/journeys/plan.d.ts.map +1 -1
- package/dist/site-system/journeys/plan.js +12 -2
- package/dist/site-system/journeys/plan.js.map +1 -1
- package/dist/site-system/journeys/shell.d.ts +1 -1
- package/dist/site-system/journeys/shell.js +2 -2
- package/dist/site-system/journeys/shell.js.map +1 -1
- package/dist/site-system/report.d.ts.map +1 -1
- package/dist/site-system/report.js +42 -8
- package/dist/site-system/report.js.map +1 -1
- package/dist/site-system/rule-modules.d.ts.map +1 -1
- package/dist/site-system/rule-modules.js +5 -0
- package/dist/site-system/rule-modules.js.map +1 -1
- package/dist/site-system/rules/delivery/h13-inbox.d.ts +23 -0
- package/dist/site-system/rules/delivery/h13-inbox.d.ts.map +1 -0
- package/dist/site-system/rules/delivery/h13-inbox.js +208 -0
- package/dist/site-system/rules/delivery/h13-inbox.js.map +1 -0
- package/dist/site-system/rules/delivery/index.d.ts +12 -0
- package/dist/site-system/rules/delivery/index.d.ts.map +1 -0
- package/dist/site-system/rules/delivery/index.js +7 -0
- package/dist/site-system/rules/delivery/index.js.map +1 -0
- package/dist/site-system/rules/form/c7-thank-you.d.ts +7 -1
- package/dist/site-system/rules/form/c7-thank-you.d.ts.map +1 -1
- package/dist/site-system/rules/form/c7-thank-you.js +26 -3
- package/dist/site-system/rules/form/c7-thank-you.js.map +1 -1
- package/dist/site-system/rules/form/index.d.ts.map +1 -1
- package/dist/site-system/rules/form/index.js +11 -1
- package/dist/site-system/rules/form/index.js.map +1 -1
- package/dist/site-system/rules/full/common.d.ts +2 -0
- package/dist/site-system/rules/full/common.d.ts.map +1 -1
- package/dist/site-system/rules/full/common.js.map +1 -1
- package/dist/site-system/rules/full/e1-pattern.d.ts +4 -0
- package/dist/site-system/rules/full/e1-pattern.d.ts.map +1 -0
- package/dist/site-system/rules/full/e1-pattern.js +47 -0
- package/dist/site-system/rules/full/e1-pattern.js.map +1 -0
- package/dist/site-system/rules/full/estate.d.ts +26 -3
- package/dist/site-system/rules/full/estate.d.ts.map +1 -1
- package/dist/site-system/rules/full/estate.js +58 -9
- package/dist/site-system/rules/full/estate.js.map +1 -1
- package/dist/site-system/rules/full/geography.d.ts +15 -2
- package/dist/site-system/rules/full/geography.d.ts.map +1 -1
- package/dist/site-system/rules/full/geography.js +15 -2
- package/dist/site-system/rules/full/geography.js.map +1 -1
- package/dist/site-system/rules/full/index.d.ts +4 -3
- package/dist/site-system/rules/full/index.d.ts.map +1 -1
- package/dist/site-system/rules/full/index.js +20 -5
- package/dist/site-system/rules/full/index.js.map +1 -1
- package/dist/site-system/rules/full/k12-slots.d.ts +4 -0
- package/dist/site-system/rules/full/k12-slots.d.ts.map +1 -0
- package/dist/site-system/rules/full/k12-slots.js +40 -0
- package/dist/site-system/rules/full/k12-slots.js.map +1 -0
- package/dist/site-system/rules/full/l10-location-copy.d.ts +1 -1
- package/dist/site-system/rules/full/l10-location-copy.d.ts.map +1 -1
- package/dist/site-system/rules/full/l10-location-copy.js +5 -2
- package/dist/site-system/rules/full/l10-location-copy.js.map +1 -1
- package/dist/site-system/rules/full/l3-neighbours.d.ts +3 -2
- package/dist/site-system/rules/full/l3-neighbours.d.ts.map +1 -1
- package/dist/site-system/rules/full/l3-neighbours.js +4 -1
- package/dist/site-system/rules/full/l3-neighbours.js.map +1 -1
- package/dist/site-system/rules/full/l4-local-copy.d.ts +2 -1
- package/dist/site-system/rules/full/l4-local-copy.d.ts.map +1 -1
- package/dist/site-system/rules/full/l4-local-copy.js +8 -3
- package/dist/site-system/rules/full/l4-local-copy.js.map +1 -1
- package/dist/site-system/rules/full/l9-data-contract.js +2 -2
- package/dist/site-system/rules/full/l9-data-contract.js.map +1 -1
- package/dist/site-system/rules/full/links.d.ts +3 -1
- package/dist/site-system/rules/full/links.d.ts.map +1 -1
- package/dist/site-system/rules/full/links.js +15 -5
- package/dist/site-system/rules/full/links.js.map +1 -1
- package/dist/site-system/rules/full/loc-index.d.ts +5 -0
- package/dist/site-system/rules/full/loc-index.d.ts.map +1 -1
- package/dist/site-system/rules/full/loc-index.js +43 -2
- package/dist/site-system/rules/full/loc-index.js.map +1 -1
- package/dist/site-system/rules/full/route-kinds.d.ts +15 -0
- package/dist/site-system/rules/full/route-kinds.d.ts.map +1 -0
- package/dist/site-system/rules/full/route-kinds.js +52 -0
- package/dist/site-system/rules/full/route-kinds.js.map +1 -0
- package/dist/site-system/rules/full/strategy.d.ts +6 -0
- package/dist/site-system/rules/full/strategy.d.ts.map +1 -1
- package/dist/site-system/rules/full/strategy.js +98 -10
- package/dist/site-system/rules/full/strategy.js.map +1 -1
- package/dist/site-system/rules/sections/k2-skin-coverage.d.ts +2 -2
- package/dist/site-system/rules/sections/k2-skin-coverage.d.ts.map +1 -1
- package/dist/site-system/rules/sections/k2-skin-coverage.js +13 -2
- package/dist/site-system/rules/sections/k2-skin-coverage.js.map +1 -1
- package/dist/site-system/rules/sections/t6-media-entries.d.ts.map +1 -1
- package/dist/site-system/rules/sections/t6-media-entries.js +69 -5
- package/dist/site-system/rules/sections/t6-media-entries.js.map +1 -1
- package/dist/site-system/runners.js +1 -1
- package/dist/site-system/runners.js.map +1 -1
- package/dist/site-system-e2e.d.ts +1 -1
- package/dist/site-system-e2e.d.ts.map +1 -1
- package/dist/site-system-e2e.js +17 -4
- package/dist/site-system-e2e.js.map +1 -1
- package/package.json +10 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/site-system/journeys/menu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * N3 to N5: the desktop menu at 1440 px. Hover opens after a short delay and survives a diagonal path; mouse-out\n * closes; nothing sticks open; clicks, Enter and outside clicks work; ARIA, Arrow keys, Escape and axe. Timings are\n * outcomes with tolerances (exact timings are package tests): a hover opens 50 to 400 ms after the pointer arrives and\n * a mouse-out closes 120 to 600 ms after it leaves; a timing outside the window is measured once more.\n */\nimport { expect, test, type Page, type TestInfo } from '@playwright/test';\nimport { isolateFromNetwork } from '../../e2e-support.js';\nimport {\n SITE_SYSTEM_AXE_TAGS,\n describeAxe,\n hiddenMenuLinks,\n hoverPoint,\n mainNavigation,\n menuDisclosures,\n note,\n openPanels,\n raiseTimeout,\n openSitePage,\n panelLocator,\n panelOpen,\n restingPoint,\n runAxe,\n seriousOrCritical,\n settle,\n siteHeader,\n waitUntil,\n type Disclosure,\n} from './browser.js';\nimport { SITE_SYSTEM_DESKTOP_VIEWPORT, siteSystemJourneyTitle as title, type SiteSystemJourneyPlan } from './plan.js';\nimport type { DisclosureWatch } from './page-helpers.js';\n\nexport const HOVER_OPEN_WINDOW_MS = Object.freeze({ min: 50, max: 400 });\nexport const MOUSE_OUT_CLOSE_WINDOW_MS = Object.freeze({ min: 120, max: 600 });\n\nconst within = (value: number, window: { min: number; max: number }) => value >= window.min && value <= window.max;\n\n/** The visible main menu and its disclosures; fails when the menu is missing or hides links without disclosures. */\nasync function prepareMenu(page: Page, plan: SiteSystemJourneyPlan, testInfo: TestInfo, path = plan.home) {\n await openSitePage(page, path, plan);\n await siteHeader(page);\n const nav = await mainNavigation(page, plan);\n expect(nav, `no navigation named \"${plan.navName}\" is visible at 1440 px on ${path}: name the header menu \"${plan.navName}\" (or pass navName)`).not.toBeNull();\n const disclosures = await menuDisclosures(nav!);\n if (disclosures.length === 0) {\n const hidden = await hiddenMenuLinks(nav!);\n expect(hidden, `the main menu hides ${hidden} link(s) in submenus but has no disclosure button (button[aria-expanded][aria-controls]) to open them`).toBe(0);\n note(testInfo, 'The main menu has no panels; the panel checks have nothing to test.');\n }\n return { nav: nav!, disclosures };\n}\n\nasync function watch(page: Page): Promise<DisclosureWatch | null> {\n return page.evaluate(() => window.__brandlabSiteSystem.watchState());\n}\n\nasync function rest(page: Page, disclosures: readonly Disclosure[]): Promise<void> {\n const point = await restingPoint(page);\n await page.mouse.move(point.x, point.y);\n await waitUntil(async () => (await openPanels(page, disclosures)).length === 0, 1_000);\n await page.waitForTimeout(100);\n}\n\n/** Milliseconds from the pointer entering the item to the panel rendering, or null when it never opened. */\nasync function measureHoverOpen(page: Page, disclosure: Disclosure, disclosures: readonly Disclosure[]): Promise<number | null> {\n await rest(page, disclosures);\n const target = await hoverPoint(disclosure);\n await disclosure.trigger.evaluate((trigger, id) => window.__brandlabSiteSystem.watchDisclosure(trigger, id), disclosure.panelId);\n const start = await page.evaluate(() => performance.now());\n await page.mouse.move(target.x, target.y);\n await waitUntil(async () => (await watch(page))?.opened != null, 1_000);\n const state = await watch(page);\n return state?.opened == null ? null : state.opened - (state.enter ?? start);\n}\n\n/** Open by hover (and confirm with a click when asked), then leave: milliseconds from leaving to the panel hiding. */\nasync function measureMouseOut(page: Page, disclosure: Disclosure, disclosures: readonly Disclosure[], confirmWithClick: boolean): Promise<{ delay: number | null; problem?: string }> {\n await rest(page, disclosures);\n const target = await hoverPoint(disclosure);\n await page.mouse.move(target.x, target.y);\n if (!(await waitUntil(() => panelOpen(page, disclosure), 1_000))) return { delay: null, problem: 'hovering did not open the panel within 1 s' };\n if (confirmWithClick) {\n await disclosure.trigger.click();\n await page.waitForTimeout(100);\n if (!(await panelOpen(page, disclosure))) return { delay: null, problem: 'a click on the button after a hover closed the panel' };\n }\n await disclosure.trigger.evaluate((trigger, id) => window.__brandlabSiteSystem.watchDisclosure(trigger, id), disclosure.panelId);\n const point = await restingPoint(page);\n const start = await page.evaluate(() => performance.now());\n await page.mouse.move(point.x, point.y);\n await waitUntil(async () => (await watch(page))?.closed != null, 1_500);\n const state = await watch(page);\n if (state?.closed == null) return { delay: null, problem: 'the panel was still open 1.5 s after the pointer left' };\n return { delay: state.closed - (state.leave ?? start) };\n}\n\nexport function defineMenuJourneys(plan: SiteSystemJourneyPlan, runs: ReadonlySet<string>): void {\n test.describe('menu at 1440 px', () => {\n test.use({ viewport: { ...SITE_SYSTEM_DESKTOP_VIEWPORT } });\n\n if (runs.has('N3')) {\n test(title('N3', 'hover opens each menu panel after a short delay'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n let delay = await measureHoverOpen(page, disclosure, disclosures);\n if (delay === null || !within(delay, HOVER_OPEN_WINDOW_MS)) {\n note(testInfo, `${disclosure.label}: first hover measured ${delay === null ? 'no opening' : `${Math.round(delay)} ms`}; measured once more`);\n delay = await measureHoverOpen(page, disclosure, disclosures);\n }\n if (delay === null) problems.push(`${disclosure.label}: hovering did not open its panel within 1 s`);\n else if (!within(delay, HOVER_OPEN_WINDOW_MS)) {\n problems.push(`${disclosure.label}: the panel opened ${Math.round(delay)} ms after the pointer arrived (expected ${HOVER_OPEN_WINDOW_MS.min} to ${HOVER_OPEN_WINDOW_MS.max} ms)`);\n } else note(testInfo, `${disclosure.label}: opened ${Math.round(delay)} ms after the pointer arrived`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N3', 'a diagonal path from the menu item into its panel keeps the panel open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n const start = await hoverPoint(disclosure);\n await page.mouse.move(start.x, start.y);\n if (!(await waitUntil(() => panelOpen(page, disclosure), 1_000))) {\n problems.push(`${disclosure.label}: hovering did not open its panel within 1 s`);\n continue;\n }\n const target = await panelLocator(page, disclosure.panelId).evaluate((panel) => {\n const links = Array.from(panel.querySelectorAll('a[href]')).filter((link) => window.__brandlabSiteSystem.isRendered(link));\n const link = links[links.length - 1];\n if (!link) return null;\n const rect = link.getBoundingClientRect();\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2, name: window.__brandlabSiteSystem.describeElement(link) };\n });\n if (!target) {\n problems.push(`${disclosure.label}: the open panel shows no link`);\n continue;\n }\n await page.mouse.move(target.x, target.y, { steps: 12 });\n await page.waitForTimeout(350);\n const reached = await page.evaluate(({ id, x, y }) => {\n const panel = document.getElementById(id);\n const hit = document.elementFromPoint(x, y);\n return Boolean(panel && hit && panel.contains(hit) && window.__brandlabSiteSystem.isRendered(panel));\n }, { id: disclosure.panelId, x: target.x, y: target.y });\n if (!reached) problems.push(`${disclosure.label}: the panel closed on the way from the menu item to ${target.name}`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N3', 'mouse-out closes the panel shortly after, even after a click'), async ({ page }, testInfo) => {\n raiseTimeout(testInfo, 180_000);\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n for (const confirmWithClick of [false, true]) {\n const how = confirmWithClick ? 'after a hover and a click' : 'after a hover';\n let result = await measureMouseOut(page, disclosure, disclosures, confirmWithClick);\n if (!result.problem && (result.delay === null || !within(result.delay, MOUSE_OUT_CLOSE_WINDOW_MS))) {\n note(testInfo, `${disclosure.label} ${how}: first mouse-out measured ${result.delay === null ? 'no closing' : `${Math.round(result.delay)} ms`}; measured once more`);\n result = await measureMouseOut(page, disclosure, disclosures, confirmWithClick);\n }\n if (result.problem) problems.push(`${disclosure.label} ${how}: ${result.problem}`);\n else if (result.delay !== null && !within(result.delay, MOUSE_OUT_CLOSE_WINDOW_MS)) {\n problems.push(`${disclosure.label} ${how}: the panel closed ${Math.round(result.delay)} ms after the pointer left (expected ${MOUSE_OUT_CLOSE_WINDOW_MS.min} to ${MOUSE_OUT_CLOSE_WINDOW_MS.max} ms)`);\n } else if (result.delay !== null) note(testInfo, `${disclosure.label} ${how}: closed ${Math.round(result.delay)} ms after the pointer left`);\n }\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N3', 'sweeping across the menu and leaving leaves no panel open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n if (disclosures.length === 0) return;\n await rest(page, disclosures);\n for (const disclosure of disclosures) {\n const point = await hoverPoint(disclosure);\n await page.mouse.move(point.x, point.y, { steps: 6 });\n await page.waitForTimeout(180);\n }\n const point = await restingPoint(page);\n await page.mouse.move(point.x, point.y, { steps: 6 });\n await page.waitForTimeout(800);\n expect(await openPanels(page, disclosures), 'panels still open 800 ms after the pointer left the menu').toEqual([]);\n });\n\n test(title('N3', 'without scripts, hovering a menu item still shows its panel'), async ({ browser, baseURL }) => {\n const context = await browser.newContext({ javaScriptEnabled: false, viewport: { ...SITE_SYSTEM_DESKTOP_VIEWPORT }, baseURL, serviceWorkers: 'block' });\n try {\n const page = await context.newPage();\n await isolateFromNetwork(page, { baseURL });\n await page.goto(plan.home, { waitUntil: 'domcontentloaded', timeout: plan.navigationTimeoutMs });\n await page.waitForLoadState('load', { timeout: plan.settleTimeoutMs }).catch(() => undefined);\n const nav = page.getByRole('navigation', { name: plan.navName, exact: true }).filter({ visible: true }).first();\n expect(await nav.count(), `no navigation named \"${plan.navName}\" in the server HTML of ${plan.home}`).toBe(1);\n const triggers = nav.locator('button[aria-expanded][aria-controls]');\n const problems: string[] = [];\n for (let index = 0; index < (await triggers.count()); index += 1) {\n const trigger = triggers.nth(index);\n const panelId = (await trigger.getAttribute('aria-controls')) ?? '';\n const label = (await trigger.getAttribute('aria-label')) ?? `menu button ${index + 1}`;\n const panel = panelLocator(page, panelId);\n if ((await panel.count()) !== 1) {\n problems.push(`${label}: its panel #${panelId} is not in the server HTML`);\n continue;\n }\n // Hover the item's own visible link (panel links are hidden at rest), else the button itself.\n const item = trigger.locator('xpath=ancestor::li[1]');\n const link = item.locator('a[href]').filter({ visible: true }).first();\n await ((await item.count()) && (await link.count()) ? link : trigger).hover();\n await page.waitForTimeout(250);\n const visible = await panel.evaluate((element) => getComputedStyle(element).visibility === 'visible' && getComputedStyle(element).display !== 'none' && element.getBoundingClientRect().height > 0);\n if (!visible) problems.push(`${label}: hovering its menu item before scripts run does not show the panel (add the CSS :hover and :focus-within fallback)`);\n }\n expect(problems).toEqual([]);\n } finally {\n await context.close();\n }\n });\n }\n\n if (runs.has('N4')) {\n test(title('N4', 'a click on the menu button after a hover keeps the panel open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n const point = await hoverPoint(disclosure);\n await page.mouse.move(point.x, point.y);\n if (!(await waitUntil(() => panelOpen(page, disclosure), 1_000))) {\n problems.push(`${disclosure.label}: hovering did not open its panel within 1 s`);\n continue;\n }\n await disclosure.trigger.click();\n await page.waitForTimeout(80);\n const afterClick = await panelOpen(page, disclosure);\n await page.waitForTimeout(300);\n const later = await panelOpen(page, disclosure);\n const expanded = await disclosure.trigger.getAttribute('aria-expanded');\n if (!afterClick || !later) problems.push(`${disclosure.label}: the first click after a hover ${afterClick ? 'let the panel close' : 'closed the panel'}`);\n else if (expanded !== 'true') problems.push(`${disclosure.label}: the panel is open but its button says aria-expanded=\"${expanded}\"`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N4', 'click, Enter and an outside click open and close the panels, one at a time'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n const state = async (disclosure: Disclosure) => ({ open: await panelOpen(page, disclosure), expanded: (await disclosure.trigger.getAttribute('aria-expanded')) === 'true' });\n const expectState = async (disclosure: Disclosure, open: boolean, what: string) => {\n await waitUntil(async () => (await state(disclosure)).open === open, 400);\n const now = await state(disclosure);\n if (now.open !== open || now.expanded !== open) {\n problems.push(`${disclosure.label}: ${what} left the panel ${now.open ? 'open' : 'closed'} with aria-expanded=\"${now.expanded}\"`);\n return false;\n }\n return true;\n };\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n await disclosure.trigger.click();\n if (!(await expectState(disclosure, true, 'a click'))) continue;\n await disclosure.trigger.click();\n if (!(await expectState(disclosure, false, 'a second click'))) continue;\n await rest(page, disclosures);\n await disclosure.trigger.focus();\n await page.keyboard.press('Enter');\n if (!(await expectState(disclosure, true, 'Enter on the button'))) continue;\n await page.keyboard.press('Enter');\n if (!(await expectState(disclosure, false, 'Enter again'))) continue;\n await page.keyboard.press('Enter');\n if (!(await expectState(disclosure, true, 'Enter on the button'))) continue;\n const outside = await restingPoint(page);\n await page.mouse.click(outside.x, outside.y);\n await expectState(disclosure, false, 'a click outside the menu');\n }\n if (disclosures.length > 1) {\n await rest(page, disclosures);\n await disclosures[0]!.trigger.click();\n await disclosures[1]!.trigger.click();\n await page.waitForTimeout(150);\n const open = await openPanels(page, disclosures);\n if (open.length !== 1 || open[0] !== disclosures[1]!.label) problems.push(`opening ${disclosures[1]!.label} after ${disclosures[0]!.label} left ${open.length} panel(s) open: ${open.join(', ') || 'none'}`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N4', 'a link click in a panel closes it and loads the page'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const disclosure = disclosures[0];\n if (!disclosure) return;\n await rest(page, disclosures);\n await disclosure.trigger.click();\n expect(await waitUntil(() => panelOpen(page, disclosure), 500), `${disclosure.label}: a click did not open the panel`).toBe(true);\n const href = await panelLocator(page, disclosure.panelId).evaluate((panel) => {\n const links = Array.from(panel.querySelectorAll<HTMLAnchorElement>('a[href]')).filter((link) => window.__brandlabSiteSystem.isRendered(link)\n && link.origin === location.origin && link.pathname !== location.pathname);\n const link = links[1] ?? links[0];\n if (!link) return null;\n window.__brandlabSiteSystem.markElement(link, 'panel-link');\n return link.pathname;\n });\n expect(href, `${disclosure.label}: the open panel has no link to another page`).not.toBeNull();\n await page.locator('[data-brandlab-journey~=\"panel-link\"]').click();\n await page.waitForURL((url) => url.pathname === href, { timeout: plan.navigationTimeoutMs });\n await settle(page, plan.settleTimeoutMs);\n const nav = await mainNavigation(page, plan);\n expect(nav, `no navigation named \"${plan.navName}\" on ${href}`).not.toBeNull();\n expect(await openPanels(page, await menuDisclosures(nav!)), `panels open after following a menu link to ${href}`).toEqual([]);\n });\n }\n\n if (runs.has('N5')) {\n test(title('N5', 'each menu button controls a panel that is hidden while closed and shown while open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n if (!disclosure.panelId || (await panelLocator(page, disclosure.panelId).count()) !== 1) {\n problems.push(`${disclosure.label}: aria-controls names #${disclosure.panelId}, which is not in the page while the panel is closed (keep panels in the HTML, hidden)`);\n continue;\n }\n await rest(page, disclosures);\n if ((await disclosure.trigger.getAttribute('aria-expanded')) !== 'false') problems.push(`${disclosure.label}: aria-expanded is not \"false\" while the panel is closed`);\n if (await panelOpen(page, disclosure)) problems.push(`${disclosure.label}: the panel shows while its button is collapsed`);\n await disclosure.trigger.click();\n await waitUntil(() => panelOpen(page, disclosure), 400);\n const expanded = await disclosure.trigger.getAttribute('aria-expanded');\n if (!(await panelOpen(page, disclosure)) || expanded !== 'true') problems.push(`${disclosure.label}: after a click the panel is ${(await panelOpen(page, disclosure)) ? 'shown' : 'hidden'} and aria-expanded is \"${expanded}\"`);\n await disclosure.trigger.click();\n await waitUntil(async () => !(await panelOpen(page, disclosure)), 400);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N5', 'the current page is marked with aria-current in the menu'), async ({ page }, testInfo) => {\n const { nav } = await prepareMenu(page, plan, testInfo);\n const target = await nav.evaluate((element) => {\n const links = Array.from(element.querySelectorAll<HTMLAnchorElement>('a[href]')).filter((link) => link.origin === location.origin && link.pathname !== location.pathname);\n const inPanel = links.filter((link) => !window.__brandlabSiteSystem.isRendered(link));\n return (inPanel[1] ?? inPanel[0] ?? links[0])?.pathname ?? null;\n });\n expect(target, 'the main menu links to no other page').not.toBeNull();\n await openSitePage(page, target!, plan);\n const current = await mainNavigation(page, plan);\n expect(current, `no navigation named \"${plan.navName}\" on ${target}`).not.toBeNull();\n const marked = await current!.evaluate((element) => Array.from(element.querySelectorAll<HTMLAnchorElement>('a[href]'))\n .filter((link) => link.origin === location.origin && link.pathname.replace(/\\/$/, '') === location.pathname.replace(/\\/$/, ''))\n .map((link) => link.getAttribute('aria-current')));\n expect(marked.length, `the menu has no link to ${target}`).toBeGreaterThan(0);\n expect(marked, `the menu link to ${target} does not carry aria-current=\"page\" on that page`).toContain('page');\n });\n\n test(title('N5', 'Arrow keys move through a panel, and Escape closes it and returns focus to its button'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n const focusInPanel = (id: string) => page.evaluate((panelId) => Boolean(document.getElementById(panelId)?.contains(document.activeElement)), id);\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n await disclosure.trigger.focus();\n await page.keyboard.press('ArrowDown');\n await waitUntil(async () => (await panelOpen(page, disclosure)) && (await focusInPanel(disclosure.panelId)), 500);\n if (!(await panelOpen(page, disclosure))) {\n problems.push(`${disclosure.label}: Arrow Down on the button did not open the panel`);\n continue;\n }\n if (!(await focusInPanel(disclosure.panelId))) {\n problems.push(`${disclosure.label}: Arrow Down did not move focus to the panel's first link`);\n } else {\n const links = await panelLocator(page, disclosure.panelId).evaluate((panel) => Array.from(panel.querySelectorAll('a[href]')).filter((link) => window.__brandlabSiteSystem.isRendered(link)).length);\n const first = await page.evaluate(() => document.activeElement?.outerHTML ?? '');\n await page.keyboard.press('ArrowDown');\n const second = await page.evaluate(() => document.activeElement?.outerHTML ?? '');\n if (links > 1 && (first === second || !(await focusInPanel(disclosure.panelId)))) problems.push(`${disclosure.label}: Arrow Down did not move to the next link in the panel`);\n }\n await page.keyboard.press('Escape');\n await waitUntil(async () => !(await panelOpen(page, disclosure)), 500);\n if (await panelOpen(page, disclosure)) problems.push(`${disclosure.label}: Escape did not close the panel`);\n else if (!(await disclosure.trigger.evaluate((element) => element === document.activeElement))) problems.push(`${disclosure.label}: Escape did not return focus to the menu button`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N5', 'axe finds no serious or critical issue in the header with the panels closed and open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const scope = ['[data-brandlab-journey~=\"header\"]', '[data-brandlab-journey~=\"nav\"]'];\n const closed = await runAxe(page, scope, { tags: SITE_SYSTEM_AXE_TAGS });\n const problems = describeAxe(seriousOrCritical(closed.violations)).map((line) => `panels closed: ${line}`);\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n await disclosure.trigger.click();\n await waitUntil(() => panelOpen(page, disclosure), 400);\n await page.waitForTimeout(250);\n await panelLocator(page, disclosure.panelId).evaluate((panel) => window.__brandlabSiteSystem.markElement(panel, 'panel'));\n const open = await runAxe(page, [...scope, '[data-brandlab-journey~=\"panel\"]'], { tags: SITE_SYSTEM_AXE_TAGS });\n problems.push(...describeAxe(seriousOrCritical(open.violations)).map((line) => `${disclosure.label} open: ${line}`));\n await disclosure.trigger.click();\n }\n expect([...new Set(problems)]).toEqual([]);\n });\n }\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/site-system/journeys/menu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * N3 to N5: the desktop menu at 1440 px. Hover opens after a short delay and survives a diagonal path; mouse-out\n * closes; nothing sticks open; clicks, Enter and outside clicks work; ARIA, Arrow keys, Escape and axe. Timings are\n * outcomes with tolerances (exact timings are package tests): a hover opens 50 to 400 ms after the pointer arrives and\n * a mouse-out closes 120 to 600 ms after it leaves; a timing outside the window is measured once more.\n */\nimport { expect, test, type Locator, type Page, type TestInfo } from '@playwright/test';\nimport { isolateFromNetwork } from '../../e2e-support.js';\nimport {\n SITE_SYSTEM_AXE_TAGS,\n describeAxe,\n hiddenMenuLinks,\n hoverPoint,\n mainNavigation,\n menuDisclosures,\n note,\n openPanels,\n raiseTimeout,\n openSitePage,\n panelLocator,\n panelOpen,\n restingPoint,\n runAxe,\n seriousOrCritical,\n settle,\n siteHeader,\n waitUntil,\n type Disclosure,\n} from './browser.js';\nimport { SITE_SYSTEM_DESKTOP_VIEWPORT, siteSystemJourneyTitle as title, type SiteSystemJourneyPlan } from './plan.js';\nimport type { DisclosureWatch } from './page-helpers.js';\n\nexport const HOVER_OPEN_WINDOW_MS = Object.freeze({ min: 50, max: 400 });\nexport const MOUSE_OUT_CLOSE_WINDOW_MS = Object.freeze({ min: 120, max: 600 });\n\nconst within = (value: number, window: { min: number; max: number }) => value >= window.min && value <= window.max;\n\n/**\n * Move the pointer onto the middle of `target` without Playwright's actionability wait. Its \"stable\" check counts\n * animation frames, and with scripts off Chromium can stop producing them (or a CSS animation keeps the box moving), so\n * `hover()` waited for the test timeout. The box is read until two reads agree (at most 1 s), then the pointer moves\n * from a resting corner, so the item's own :hover is what shows the panel.\n */\nasync function pointAt(page: Page, target: Locator): Promise<void> {\n await target.scrollIntoViewIfNeeded({ timeout: 2_000 }).catch(() => undefined);\n let box = await target.boundingBox();\n for (let reads = 0; reads < 10; reads += 1) {\n await page.waitForTimeout(100);\n const next = await target.boundingBox();\n const same = box && next && Math.abs(box.x - next.x) < 0.5 && Math.abs(box.y - next.y) < 0.5 && Math.abs(box.width - next.width) < 0.5 && Math.abs(box.height - next.height) < 0.5;\n box = next;\n if (same) break;\n }\n if (!box) throw new Error('the menu item has no box to hover');\n const viewport = page.viewportSize();\n await page.mouse.move((viewport?.width ?? 1440) - 2, (viewport?.height ?? 900) - 2);\n await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2, { steps: 4 });\n}\n\n/** The visible main menu and its disclosures; fails when the menu is missing or hides links without disclosures. */\nasync function prepareMenu(page: Page, plan: SiteSystemJourneyPlan, testInfo: TestInfo, path = plan.home) {\n await openSitePage(page, path, plan);\n await siteHeader(page);\n const nav = await mainNavigation(page, plan);\n expect(nav, `no navigation named \"${plan.navName}\" is visible at 1440 px on ${path}: name the header menu \"${plan.navName}\" (or pass navName)`).not.toBeNull();\n const disclosures = await menuDisclosures(nav!);\n if (disclosures.length === 0) {\n const hidden = await hiddenMenuLinks(nav!);\n expect(hidden, `the main menu hides ${hidden} link(s) in submenus but has no disclosure button (button[aria-expanded][aria-controls]) to open them`).toBe(0);\n note(testInfo, 'The main menu has no panels; the panel checks have nothing to test.');\n }\n return { nav: nav!, disclosures };\n}\n\nasync function watch(page: Page): Promise<DisclosureWatch | null> {\n return page.evaluate(() => window.__brandlabSiteSystem.watchState());\n}\n\nasync function rest(page: Page, disclosures: readonly Disclosure[]): Promise<void> {\n const point = await restingPoint(page);\n await page.mouse.move(point.x, point.y);\n await waitUntil(async () => (await openPanels(page, disclosures)).length === 0, 1_000);\n await page.waitForTimeout(100);\n}\n\n/** Milliseconds from the pointer entering the item to the panel rendering, or null when it never opened. */\nasync function measureHoverOpen(page: Page, disclosure: Disclosure, disclosures: readonly Disclosure[]): Promise<number | null> {\n await rest(page, disclosures);\n const target = await hoverPoint(disclosure);\n await disclosure.trigger.evaluate((trigger, id) => window.__brandlabSiteSystem.watchDisclosure(trigger, id), disclosure.panelId);\n const start = await page.evaluate(() => performance.now());\n await page.mouse.move(target.x, target.y);\n await waitUntil(async () => (await watch(page))?.opened != null, 1_000);\n const state = await watch(page);\n return state?.opened == null ? null : state.opened - (state.enter ?? start);\n}\n\n/** Open by hover (and confirm with a click when asked), then leave: milliseconds from leaving to the panel hiding. */\nasync function measureMouseOut(page: Page, disclosure: Disclosure, disclosures: readonly Disclosure[], confirmWithClick: boolean): Promise<{ delay: number | null; problem?: string }> {\n await rest(page, disclosures);\n const target = await hoverPoint(disclosure);\n await page.mouse.move(target.x, target.y);\n if (!(await waitUntil(() => panelOpen(page, disclosure), 1_000))) return { delay: null, problem: 'hovering did not open the panel within 1 s' };\n if (confirmWithClick) {\n await disclosure.trigger.click();\n await page.waitForTimeout(100);\n if (!(await panelOpen(page, disclosure))) return { delay: null, problem: 'a click on the button after a hover closed the panel' };\n }\n await disclosure.trigger.evaluate((trigger, id) => window.__brandlabSiteSystem.watchDisclosure(trigger, id), disclosure.panelId);\n const point = await restingPoint(page);\n const start = await page.evaluate(() => performance.now());\n await page.mouse.move(point.x, point.y);\n await waitUntil(async () => (await watch(page))?.closed != null, 1_500);\n const state = await watch(page);\n if (state?.closed == null) return { delay: null, problem: 'the panel was still open 1.5 s after the pointer left' };\n return { delay: state.closed - (state.leave ?? start) };\n}\n\nexport function defineMenuJourneys(plan: SiteSystemJourneyPlan, runs: ReadonlySet<string>): void {\n test.describe('menu at 1440 px', () => {\n test.use({ viewport: { ...SITE_SYSTEM_DESKTOP_VIEWPORT } });\n\n if (runs.has('N3')) {\n test(title('N3', 'hover opens each menu panel after a short delay'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n let delay = await measureHoverOpen(page, disclosure, disclosures);\n if (delay === null || !within(delay, HOVER_OPEN_WINDOW_MS)) {\n note(testInfo, `${disclosure.label}: first hover measured ${delay === null ? 'no opening' : `${Math.round(delay)} ms`}; measured once more`);\n delay = await measureHoverOpen(page, disclosure, disclosures);\n }\n if (delay === null) problems.push(`${disclosure.label}: hovering did not open its panel within 1 s`);\n else if (!within(delay, HOVER_OPEN_WINDOW_MS)) {\n problems.push(`${disclosure.label}: the panel opened ${Math.round(delay)} ms after the pointer arrived (expected ${HOVER_OPEN_WINDOW_MS.min} to ${HOVER_OPEN_WINDOW_MS.max} ms)`);\n } else note(testInfo, `${disclosure.label}: opened ${Math.round(delay)} ms after the pointer arrived`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N3', 'a diagonal path from the menu item into its panel keeps the panel open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n const start = await hoverPoint(disclosure);\n await page.mouse.move(start.x, start.y);\n if (!(await waitUntil(() => panelOpen(page, disclosure), 1_000))) {\n problems.push(`${disclosure.label}: hovering did not open its panel within 1 s`);\n continue;\n }\n const target = await panelLocator(page, disclosure.panelId).evaluate((panel) => {\n const links = Array.from(panel.querySelectorAll('a[href]')).filter((link) => window.__brandlabSiteSystem.isRendered(link));\n const link = links[links.length - 1];\n if (!link) return null;\n const rect = link.getBoundingClientRect();\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2, name: window.__brandlabSiteSystem.describeElement(link) };\n });\n if (!target) {\n problems.push(`${disclosure.label}: the open panel shows no link`);\n continue;\n }\n await page.mouse.move(target.x, target.y, { steps: 12 });\n await page.waitForTimeout(350);\n const reached = await page.evaluate(({ id, x, y }) => {\n const panel = document.getElementById(id);\n const hit = document.elementFromPoint(x, y);\n return Boolean(panel && hit && panel.contains(hit) && window.__brandlabSiteSystem.isRendered(panel));\n }, { id: disclosure.panelId, x: target.x, y: target.y });\n if (!reached) problems.push(`${disclosure.label}: the panel closed on the way from the menu item to ${target.name}`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N3', 'mouse-out closes the panel shortly after, even after a click'), async ({ page }, testInfo) => {\n raiseTimeout(testInfo, 180_000);\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n for (const confirmWithClick of [false, true]) {\n const how = confirmWithClick ? 'after a hover and a click' : 'after a hover';\n let result = await measureMouseOut(page, disclosure, disclosures, confirmWithClick);\n if (!result.problem && (result.delay === null || !within(result.delay, MOUSE_OUT_CLOSE_WINDOW_MS))) {\n note(testInfo, `${disclosure.label} ${how}: first mouse-out measured ${result.delay === null ? 'no closing' : `${Math.round(result.delay)} ms`}; measured once more`);\n result = await measureMouseOut(page, disclosure, disclosures, confirmWithClick);\n }\n if (result.problem) problems.push(`${disclosure.label} ${how}: ${result.problem}`);\n else if (result.delay !== null && !within(result.delay, MOUSE_OUT_CLOSE_WINDOW_MS)) {\n problems.push(`${disclosure.label} ${how}: the panel closed ${Math.round(result.delay)} ms after the pointer left (expected ${MOUSE_OUT_CLOSE_WINDOW_MS.min} to ${MOUSE_OUT_CLOSE_WINDOW_MS.max} ms)`);\n } else if (result.delay !== null) note(testInfo, `${disclosure.label} ${how}: closed ${Math.round(result.delay)} ms after the pointer left`);\n }\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N3', 'sweeping across the menu and leaving leaves no panel open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n if (disclosures.length === 0) return;\n await rest(page, disclosures);\n for (const disclosure of disclosures) {\n const point = await hoverPoint(disclosure);\n await page.mouse.move(point.x, point.y, { steps: 6 });\n await page.waitForTimeout(180);\n }\n const point = await restingPoint(page);\n await page.mouse.move(point.x, point.y, { steps: 6 });\n await page.waitForTimeout(800);\n expect(await openPanels(page, disclosures), 'panels still open 800 ms after the pointer left the menu').toEqual([]);\n });\n\n test(title('N3', 'without scripts, hovering a menu item still shows its panel'), async ({ browser, baseURL }) => {\n const context = await browser.newContext({ javaScriptEnabled: false, viewport: { ...SITE_SYSTEM_DESKTOP_VIEWPORT }, baseURL, serviceWorkers: 'block' });\n try {\n const page = await context.newPage();\n await isolateFromNetwork(page, { baseURL });\n await page.goto(plan.home, { waitUntil: 'domcontentloaded', timeout: plan.navigationTimeoutMs });\n await page.waitForLoadState('load', { timeout: plan.settleTimeoutMs }).catch(() => undefined);\n const nav = page.getByRole('navigation', { name: plan.navName, exact: true }).filter({ visible: true }).first();\n expect(await nav.count(), `no navigation named \"${plan.navName}\" in the server HTML of ${plan.home}`).toBe(1);\n const triggers = nav.locator('button[aria-expanded][aria-controls]');\n const problems: string[] = [];\n for (let index = 0; index < (await triggers.count()); index += 1) {\n const trigger = triggers.nth(index);\n const panelId = (await trigger.getAttribute('aria-controls')) ?? '';\n const label = (await trigger.getAttribute('aria-label')) ?? `menu button ${index + 1}`;\n const panel = panelLocator(page, panelId);\n if ((await panel.count()) !== 1) {\n problems.push(`${label}: its panel #${panelId} is not in the server HTML`);\n continue;\n }\n // Hover the item's own visible link (panel links are hidden at rest), else the button itself.\n const item = trigger.locator('xpath=ancestor::li[1]');\n const link = item.locator('a[href]').filter({ visible: true }).first();\n await pointAt(page, (await item.count()) && (await link.count()) ? link : trigger);\n await page.waitForTimeout(250);\n const visible = await panel.evaluate((element) => getComputedStyle(element).visibility === 'visible' && getComputedStyle(element).display !== 'none' && element.getBoundingClientRect().height > 0);\n if (!visible) problems.push(`${label}: hovering its menu item before scripts run does not show the panel (add the CSS :hover and :focus-within fallback)`);\n }\n expect(problems).toEqual([]);\n } finally {\n await context.close();\n }\n });\n }\n\n if (runs.has('N4')) {\n test(title('N4', 'a click on the menu button after a hover keeps the panel open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n const point = await hoverPoint(disclosure);\n await page.mouse.move(point.x, point.y);\n if (!(await waitUntil(() => panelOpen(page, disclosure), 1_000))) {\n problems.push(`${disclosure.label}: hovering did not open its panel within 1 s`);\n continue;\n }\n await disclosure.trigger.click();\n await page.waitForTimeout(80);\n const afterClick = await panelOpen(page, disclosure);\n await page.waitForTimeout(300);\n const later = await panelOpen(page, disclosure);\n const expanded = await disclosure.trigger.getAttribute('aria-expanded');\n if (!afterClick || !later) problems.push(`${disclosure.label}: the first click after a hover ${afterClick ? 'let the panel close' : 'closed the panel'}`);\n else if (expanded !== 'true') problems.push(`${disclosure.label}: the panel is open but its button says aria-expanded=\"${expanded}\"`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N4', 'click, Enter and an outside click open and close the panels, one at a time'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n const state = async (disclosure: Disclosure) => ({ open: await panelOpen(page, disclosure), expanded: (await disclosure.trigger.getAttribute('aria-expanded')) === 'true' });\n const expectState = async (disclosure: Disclosure, open: boolean, what: string) => {\n await waitUntil(async () => (await state(disclosure)).open === open, 400);\n const now = await state(disclosure);\n if (now.open !== open || now.expanded !== open) {\n problems.push(`${disclosure.label}: ${what} left the panel ${now.open ? 'open' : 'closed'} with aria-expanded=\"${now.expanded}\"`);\n return false;\n }\n return true;\n };\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n await disclosure.trigger.click();\n if (!(await expectState(disclosure, true, 'a click'))) continue;\n await disclosure.trigger.click();\n if (!(await expectState(disclosure, false, 'a second click'))) continue;\n await rest(page, disclosures);\n await disclosure.trigger.focus();\n await page.keyboard.press('Enter');\n if (!(await expectState(disclosure, true, 'Enter on the button'))) continue;\n await page.keyboard.press('Enter');\n if (!(await expectState(disclosure, false, 'Enter again'))) continue;\n await page.keyboard.press('Enter');\n if (!(await expectState(disclosure, true, 'Enter on the button'))) continue;\n const outside = await restingPoint(page);\n await page.mouse.click(outside.x, outside.y);\n await expectState(disclosure, false, 'a click outside the menu');\n }\n if (disclosures.length > 1) {\n await rest(page, disclosures);\n await disclosures[0]!.trigger.click();\n await disclosures[1]!.trigger.click();\n await page.waitForTimeout(150);\n const open = await openPanels(page, disclosures);\n if (open.length !== 1 || open[0] !== disclosures[1]!.label) problems.push(`opening ${disclosures[1]!.label} after ${disclosures[0]!.label} left ${open.length} panel(s) open: ${open.join(', ') || 'none'}`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N4', 'a link click in a panel closes it and loads the page'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const disclosure = disclosures[0];\n if (!disclosure) return;\n await rest(page, disclosures);\n await disclosure.trigger.click();\n expect(await waitUntil(() => panelOpen(page, disclosure), 500), `${disclosure.label}: a click did not open the panel`).toBe(true);\n const href = await panelLocator(page, disclosure.panelId).evaluate((panel) => {\n const links = Array.from(panel.querySelectorAll<HTMLAnchorElement>('a[href]')).filter((link) => window.__brandlabSiteSystem.isRendered(link)\n && link.origin === location.origin && link.pathname !== location.pathname);\n const link = links[1] ?? links[0];\n if (!link) return null;\n window.__brandlabSiteSystem.markElement(link, 'panel-link');\n return link.pathname;\n });\n expect(href, `${disclosure.label}: the open panel has no link to another page`).not.toBeNull();\n await page.locator('[data-brandlab-journey~=\"panel-link\"]').click();\n await page.waitForURL((url) => url.pathname === href, { timeout: plan.navigationTimeoutMs });\n await settle(page, plan.settleTimeoutMs);\n const nav = await mainNavigation(page, plan);\n expect(nav, `no navigation named \"${plan.navName}\" on ${href}`).not.toBeNull();\n expect(await openPanels(page, await menuDisclosures(nav!)), `panels open after following a menu link to ${href}`).toEqual([]);\n });\n }\n\n if (runs.has('N5')) {\n test(title('N5', 'each menu button controls a panel that is hidden while closed and shown while open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n for (const disclosure of disclosures) {\n if (!disclosure.panelId || (await panelLocator(page, disclosure.panelId).count()) !== 1) {\n problems.push(`${disclosure.label}: aria-controls names #${disclosure.panelId}, which is not in the page while the panel is closed (keep panels in the HTML, hidden)`);\n continue;\n }\n await rest(page, disclosures);\n if ((await disclosure.trigger.getAttribute('aria-expanded')) !== 'false') problems.push(`${disclosure.label}: aria-expanded is not \"false\" while the panel is closed`);\n if (await panelOpen(page, disclosure)) problems.push(`${disclosure.label}: the panel shows while its button is collapsed`);\n await disclosure.trigger.click();\n await waitUntil(() => panelOpen(page, disclosure), 400);\n const expanded = await disclosure.trigger.getAttribute('aria-expanded');\n if (!(await panelOpen(page, disclosure)) || expanded !== 'true') problems.push(`${disclosure.label}: after a click the panel is ${(await panelOpen(page, disclosure)) ? 'shown' : 'hidden'} and aria-expanded is \"${expanded}\"`);\n await disclosure.trigger.click();\n await waitUntil(async () => !(await panelOpen(page, disclosure)), 400);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N5', 'the current page is marked with aria-current in the menu'), async ({ page }, testInfo) => {\n const { nav } = await prepareMenu(page, plan, testInfo);\n const target = await nav.evaluate((element) => {\n const links = Array.from(element.querySelectorAll<HTMLAnchorElement>('a[href]')).filter((link) => link.origin === location.origin && link.pathname !== location.pathname);\n const inPanel = links.filter((link) => !window.__brandlabSiteSystem.isRendered(link));\n return (inPanel[1] ?? inPanel[0] ?? links[0])?.pathname ?? null;\n });\n expect(target, 'the main menu links to no other page').not.toBeNull();\n await openSitePage(page, target!, plan);\n const current = await mainNavigation(page, plan);\n expect(current, `no navigation named \"${plan.navName}\" on ${target}`).not.toBeNull();\n const marked = await current!.evaluate((element) => Array.from(element.querySelectorAll<HTMLAnchorElement>('a[href]'))\n .filter((link) => link.origin === location.origin && link.pathname.replace(/\\/$/, '') === location.pathname.replace(/\\/$/, ''))\n .map((link) => link.getAttribute('aria-current')));\n expect(marked.length, `the menu has no link to ${target}`).toBeGreaterThan(0);\n expect(marked, `the menu link to ${target} does not carry aria-current=\"page\" on that page`).toContain('page');\n });\n\n test(title('N5', 'Arrow keys move through a panel, and Escape closes it and returns focus to its button'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const problems: string[] = [];\n const focusInPanel = (id: string) => page.evaluate((panelId) => Boolean(document.getElementById(panelId)?.contains(document.activeElement)), id);\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n await disclosure.trigger.focus();\n await page.keyboard.press('ArrowDown');\n await waitUntil(async () => (await panelOpen(page, disclosure)) && (await focusInPanel(disclosure.panelId)), 500);\n if (!(await panelOpen(page, disclosure))) {\n problems.push(`${disclosure.label}: Arrow Down on the button did not open the panel`);\n continue;\n }\n if (!(await focusInPanel(disclosure.panelId))) {\n problems.push(`${disclosure.label}: Arrow Down did not move focus to the panel's first link`);\n } else {\n const links = await panelLocator(page, disclosure.panelId).evaluate((panel) => Array.from(panel.querySelectorAll('a[href]')).filter((link) => window.__brandlabSiteSystem.isRendered(link)).length);\n const first = await page.evaluate(() => document.activeElement?.outerHTML ?? '');\n await page.keyboard.press('ArrowDown');\n const second = await page.evaluate(() => document.activeElement?.outerHTML ?? '');\n if (links > 1 && (first === second || !(await focusInPanel(disclosure.panelId)))) problems.push(`${disclosure.label}: Arrow Down did not move to the next link in the panel`);\n }\n await page.keyboard.press('Escape');\n await waitUntil(async () => !(await panelOpen(page, disclosure)), 500);\n if (await panelOpen(page, disclosure)) problems.push(`${disclosure.label}: Escape did not close the panel`);\n else if (!(await disclosure.trigger.evaluate((element) => element === document.activeElement))) problems.push(`${disclosure.label}: Escape did not return focus to the menu button`);\n }\n expect(problems).toEqual([]);\n });\n\n test(title('N5', 'axe finds no serious or critical issue in the header with the panels closed and open'), async ({ page }, testInfo) => {\n const { disclosures } = await prepareMenu(page, plan, testInfo);\n const scope = ['[data-brandlab-journey~=\"header\"]', '[data-brandlab-journey~=\"nav\"]'];\n const closed = await runAxe(page, scope, { tags: SITE_SYSTEM_AXE_TAGS });\n const problems = describeAxe(seriousOrCritical(closed.violations)).map((line) => `panels closed: ${line}`);\n for (const disclosure of disclosures) {\n await rest(page, disclosures);\n await disclosure.trigger.click();\n await waitUntil(() => panelOpen(page, disclosure), 400);\n await page.waitForTimeout(250);\n await panelLocator(page, disclosure.panelId).evaluate((panel) => window.__brandlabSiteSystem.markElement(panel, 'panel'));\n const open = await runAxe(page, [...scope, '[data-brandlab-journey~=\"panel\"]'], { tags: SITE_SYSTEM_AXE_TAGS });\n problems.push(...describeAxe(seriousOrCritical(open.violations)).map((line) => `${disclosure.label} open: ${line}`));\n await disclosure.trigger.click();\n }\n expect([...new Set(problems)]).toEqual([]);\n });\n }\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-helpers.d.ts","sourceRoot":"","sources":["../../../src/site-system/journeys/page-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"page-helpers.d.ts","sourceRoot":"","sources":["../../../src/site-system/journeys/page-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* The placements `phone_link_click` accepts: site-next's PHONE_CALL_PLACEMENTS (conformance cannot depend on
|
|
9
9
|
* site-next; a test reads the site-next source and compares). Injected into the page with the helpers.
|
|
10
10
|
*/
|
|
11
|
-
export const SITE_SYSTEM_PHONE_PLACEMENTS = Object.freeze(['header', 'footer', 'hero', 'cta', 'fab', 'contact', 'location', 'page']);
|
|
11
|
+
export const SITE_SYSTEM_PHONE_PLACEMENTS = Object.freeze(['header', 'footer', 'hero', 'cta', 'fab', 'contact', 'location', 'page', 'emergency']);
|
|
12
12
|
/**
|
|
13
13
|
* Whether an element is rendered: connected, with a box, not `visibility: hidden`, not fully transparent and not
|
|
14
14
|
* inside a closed `<details>` (outside its summary). Chromium gives the content of a closed `<details>` a box, so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-helpers.js","sourceRoot":"","sources":["../../../src/site-system/journeys/page-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Functions the site-system journeys run inside the page under test. Each one is self-contained: it uses DOM globals\n * and the other helpers in this file only, because `pageHelpersSource()` injects their source into every document\n * (as `window.__brandlabSiteSystem`, through Playwright's init script, which a Content Security Policy does not\n * block). The pure parts (colour, contrast, placement) are unit-tested in Node.\n */\n\n/**\n * The placements `phone_link_click` accepts: site-next's PHONE_CALL_PLACEMENTS (conformance cannot depend on\n * site-next; a test reads the site-next source and compares). Injected into the page with the helpers.\n */\nexport const SITE_SYSTEM_PHONE_PLACEMENTS: readonly string[] = Object.freeze(['header', 'footer', 'hero', 'cta', 'fab', 'contact', 'location', 'page']);\n\nexport type Rgba = [number, number, number, number];\n\n/** What `watchDisclosure` has seen, in `performance.now()` milliseconds. */\nexport interface DisclosureWatch {\n enter: number | null;\n leave: number | null;\n opened: number | null;\n closed: number | null;\n open: boolean;\n}\n\n/**\n * Whether an element is rendered: connected, with a box, not `visibility: hidden`, not fully transparent and not\n * inside a closed `<details>` (outside its summary). Chromium gives the content of a closed `<details>` a box, so\n * the box alone is not enough; `checkVisibility()` settles it where the browser has it.\n */\nexport function isRendered(element: Element | null | undefined): boolean {\n if (!element || !element.isConnected) return false;\n for (let details = element.closest('details:not([open])'); details; details = details.parentElement?.closest('details:not([open])') ?? null) {\n const summary = Array.from(details.children).find((child) => child.tagName === 'SUMMARY');\n if (!summary || !summary.contains(element)) return false;\n }\n if (typeof element.checkVisibility === 'function' && !element.checkVisibility({ checkOpacity: true, checkVisibilityCSS: true })) return false;\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n if (getComputedStyle(element).visibility !== 'visible') return false;\n for (let node: Element | null = element; node; node = node.parentElement) {\n if (getComputedStyle(node).opacity === '0') return false;\n }\n return true;\n}\n\n/** A short, readable name for an element in a failure message. */\nexport function describeElement(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const label = element.getAttribute('aria-label') ?? (element as HTMLElement).innerText ?? element.textContent ?? '';\n const text = label.replace(/\\s+/g, ' ').trim().slice(0, 40);\n const href = element.getAttribute('href');\n return `${tag}${text ? ` \"${text}\"` : ''}${href ? ` (${href})` : ''}`;\n}\n\n/** The accessible name, approximately: aria-label, aria-labelledby, the rendered text, then the title. */\nexport function accessibleName(element: Element): string {\n const label = element.getAttribute('aria-label');\n if (label && label.trim()) return label.trim();\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const text = labelledBy.split(/\\s+/).map((id) => document.getElementById(id)?.textContent ?? '').join(' ').trim();\n if (text) return text.replace(/\\s+/g, ' ');\n }\n const text = ((element as HTMLElement).innerText ?? element.textContent ?? '').replace(/\\s+/g, ' ').trim();\n return text || (element.getAttribute('title') ?? '').trim();\n}\n\n/**\n * Where a telephone link reports its tap, exactly as site-next's shared listener resolves it: its own valid\n * `data-phone-location`, then a `<header>` or `<footer>` ancestor, then the nearest ancestor with a valid value,\n * otherwise `page`. `invalid` is the nearest declared value when it is not an allowed placement (the listener then\n * reports the link somewhere else, silently).\n */\nexport function phonePlacement(link: Element): { placement: string; invalid: string | null } {\n const valid = (node: Element): string | undefined => {\n const value = node.getAttribute('data-phone-location')?.trim().toLowerCase();\n return value && SITE_SYSTEM_PHONE_PLACEMENTS.includes(value) ? value : undefined;\n };\n const nearest = link.closest('[data-phone-location]');\n const invalid = nearest && !valid(nearest) ? nearest.getAttribute('data-phone-location') : null;\n const own = valid(link);\n if (own) return { placement: own, invalid };\n if (link.closest('header')) return { placement: 'header', invalid };\n if (link.closest('footer')) return { placement: 'footer', invalid };\n for (let node = link.parentElement?.closest('[data-phone-location]') ?? null; node; node = node.parentElement?.closest('[data-phone-location]') ?? null) {\n const value = valid(node);\n if (value) return { placement: value, invalid };\n }\n return { placement: 'page', invalid };\n}\n\n/** Parse a computed colour. `rgb()`/`rgba()` directly; any other syntax (oklch, lab, color()) through a canvas pixel. */\nexport function parseColour(value: string): Rgba | null {\n const text = value.trim().toLowerCase();\n if (text === 'transparent') return [0, 0, 0, 0];\n const match = /^rgba?\\(([^)]+)\\)$/.exec(text);\n if (match) {\n const parts = match[1]!.split(/[\\s,/]+/).filter(Boolean);\n if (parts.length < 3) return null;\n const channel = (part: string) => (part.endsWith('%') ? (Number.parseFloat(part) / 100) * 255 : Number.parseFloat(part));\n const alphaPart = parts[3];\n const alpha = alphaPart === undefined ? 1 : alphaPart.endsWith('%') ? Number.parseFloat(alphaPart) / 100 : Number.parseFloat(alphaPart);\n const rgba: Rgba = [channel(parts[0]!), channel(parts[1]!), channel(parts[2]!), alpha];\n return rgba.every((part) => Number.isFinite(part)) ? rgba : null;\n }\n if (typeof document === 'undefined') return null;\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const context = canvas.getContext('2d', { willReadFrequently: true });\n if (!context) return null;\n context.clearRect(0, 0, 1, 1);\n context.fillStyle = value;\n context.fillRect(0, 0, 1, 1);\n const [red = 0, green = 0, blue = 0, alpha = 0] = Array.from(context.getImageData(0, 0, 1, 1).data);\n return [red, green, blue, alpha / 255];\n}\n\n/** `top` painted over an opaque `bottom`. */\nexport function compositeColour(top: Rgba, bottom: Rgba): Rgba {\n const alpha = top[3];\n return [\n top[0] * alpha + bottom[0] * (1 - alpha),\n top[1] * alpha + bottom[1] * (1 - alpha),\n top[2] * alpha + bottom[2] * (1 - alpha),\n 1,\n ];\n}\n\n/** The WCAG contrast ratio of two opaque colours. */\nexport function contrastRatio(first: Rgba, second: Rgba): number {\n const luminance = (colour: Rgba) => {\n const [red, green, blue] = colour.slice(0, 3).map((channel) => {\n const value = channel / 255;\n return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n }) as [number, number, number];\n return 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n };\n const [light, dark] = [luminance(first), luminance(second)].sort((left, right) => right - left) as [number, number];\n return (light + 0.05) / (dark + 0.05);\n}\n\n/**\n * The opaque colour behind an element, from its own and its ancestors' background colours over a white canvas.\n * `null` when a background image (a photo or gradient) is in the way: the contrast cannot be computed there.\n */\nexport function backgroundBehind(element: Element): Rgba | null {\n const layers: Rgba[] = [];\n for (let node: Element | null = element; node; node = node.parentElement) {\n const style = getComputedStyle(node);\n if (style.backgroundImage && style.backgroundImage !== 'none') return null;\n const colour = parseColour(style.backgroundColor);\n if (colour && colour[3] > 0) {\n layers.push(colour);\n if (colour[3] >= 1) break;\n }\n }\n return layers.reverse().reduce<Rgba>((bottom, top) => compositeColour(top, bottom), [255, 255, 255, 1]);\n}\n\n/**\n * Non-text contrast (WCAG 1.4.11) of icon-only controls inside `root`: a link or button with no visible text whose\n * icon is an SVG must reach 3:1 against what is behind it. Returns one line per failure; controls over a photo are\n * counted in `unmeasured`.\n */\nexport function iconContrastProblems(root: Element): { problems: string[]; checked: number; unmeasured: number } {\n const problems: string[] = [];\n let checked = 0;\n let unmeasured = 0;\n const paintOf = (svg: SVGElement): Rgba | null => {\n for (const shape of Array.from(svg.querySelectorAll('path, circle, rect, ellipse, line, polyline, polygon, text, use'))) {\n if (!isRendered(shape)) continue;\n const style = getComputedStyle(shape);\n for (const [paint, opacity] of [[style.fill, style.fillOpacity], [style.stroke, style.strokeOpacity]] as const) {\n if (!paint || paint === 'none' || paint.startsWith('url(')) continue;\n const colour = parseColour(paint);\n const alpha = colour ? colour[3] * Number(opacity || 1) * Number(style.opacity || 1) : 0;\n if (colour && alpha > 0) return [colour[0], colour[1], colour[2], alpha];\n }\n }\n return null;\n };\n for (const control of Array.from(root.querySelectorAll('a[href], button'))) {\n if (!isRendered(control)) continue;\n if (((control as HTMLElement).innerText ?? '').trim()) continue;\n const svg = control.querySelector('svg');\n if (!svg || !isRendered(svg)) continue;\n const paint = paintOf(svg);\n if (!paint) continue;\n const background = backgroundBehind(svg);\n if (!background) {\n unmeasured += 1;\n continue;\n }\n checked += 1;\n const ratio = contrastRatio(compositeColour(paint, background), background);\n if (ratio < 3) problems.push(`${describeElement(control)}: its icon is ${ratio.toFixed(2)}:1 against its background (needs 3:1)`);\n }\n return { problems, checked, unmeasured };\n}\n\n/**\n * The phone call bar: the shared `MobileCallBar`, or any fixed or sticky element along the bottom of the screen that\n * holds a visible telephone link (outside the header and dialogs). `null` when none is on screen.\n */\nexport function findCallBar(): Element | null {\n const tagged = Array.from(document.querySelectorAll('[data-bl=\"call-bar\"], [data-bl=\"callbar\"], [data-bl=\"mobile-call-bar\"]')).find(isRendered);\n if (tagged) return tagged;\n const height = window.innerHeight;\n for (const element of Array.from(document.body.querySelectorAll('*'))) {\n const position = getComputedStyle(element).position;\n if (position !== 'fixed' && position !== 'sticky') continue;\n if (element.closest('header, dialog, [role=\"dialog\"]')) continue;\n const rect = element.getBoundingClientRect();\n if (rect.height <= 0 || rect.bottom < height - 4 || rect.top < height / 2) continue;\n if (!isRendered(element)) continue;\n if (Array.from(element.querySelectorAll('a[href^=\"tel:\"]')).some(isRendered)) return element;\n }\n return null;\n}\n\n/** Visible quote actions in `root`: links or buttons named like the quote action, or the shared quote hooks. */\nexport function quoteActions(root: Element, name: { source: string; flags: string }): Element[] {\n const pattern = new RegExp(name.source, name.flags);\n return Array.from(root.querySelectorAll('a[href], button')).filter((element) => {\n if (!isRendered(element) || element.getAttribute('href')?.startsWith('tel:')) return false;\n if (element.matches('[data-bl=\"quote-button\"], [data-bl-cta^=\"quote\"], [data-lead-cta^=\"quote\"]')) return true;\n return pattern.test(accessibleName(element));\n });\n}\n\n/** The order of the first visible phone link and quote action in `root`. */\nexport function actionOrder(root: Element, name: { source: string; flags: string }): 'phone-first' | 'quote-first' | 'incomplete' {\n const phone = Array.from(root.querySelectorAll('a[href^=\"tel:\"]')).find(isRendered);\n const quote = quoteActions(root, name)[0];\n if (!phone || !quote) return 'incomplete';\n return phone.compareDocumentPosition(quote) & Node.DOCUMENT_POSITION_FOLLOWING ? 'phone-first' : 'quote-first';\n}\n\n/**\n * The hero: the shared hero section, else the smallest block around the page's visible H1 that holds a phone link\n * and a quote action, never above the H1's own section and never `<main>` (without a section, never a block holding\n * an H2). When none holds both, the H1's section (or its parent): its order then reads \"incomplete\".\n */\nexport function heroRegion(name: { source: string; flags: string }): Element | null {\n const heading = Array.from(document.querySelectorAll('h1')).find(isRendered);\n if (!heading) return null;\n const tagged = heading.closest('[data-bl-section=\"hero\"]');\n if (tagged) return tagged;\n const section = heading.closest('section');\n const fallback = section ?? heading.parentElement;\n for (let node = heading.parentElement; node && node !== document.body && node.tagName !== 'MAIN'; node = node.parentElement) {\n if (!section && node.querySelector('h2')) break;\n if (Array.from(node.querySelectorAll('a[href^=\"tel:\"]')).some(isRendered) && quoteActions(node, name).length > 0) return node;\n if (node === section) break;\n }\n return fallback && fallback.tagName !== 'MAIN' ? fallback : heading;\n}\n\n/** A point in the page that is not on an interactive element, a menu or anything in `avoid`. */\nexport function outsidePoint(avoid: Element[]): { x: number; y: number } | null {\n const interactive = 'a[href], button, input, select, textarea, label, summary, details, iframe, video, audio, [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [tabindex], [contenteditable=\"\"], [contenteditable=\"true\"]';\n for (let row = 9; row >= 3; row -= 1) {\n for (let column = 1; column <= 9; column += 1) {\n const x = Math.round((window.innerWidth * column) / 10);\n const y = Math.round((window.innerHeight * row) / 10);\n const element = document.elementFromPoint(x, y);\n if (!element || avoid.some((region) => region.contains(element))) continue;\n if (element.closest(interactive) || element.closest('header, nav, dialog, [role=\"dialog\"]')) continue;\n return { x, y };\n }\n }\n return null;\n}\n\n/** Tag an element so Playwright and axe can find it by `[data-brandlab-journey~=\"<name>\"]`. */\nexport function markElement(element: Element, name: string): void {\n const names = new Set((element.getAttribute('data-brandlab-journey') ?? '').split(/\\s+/).filter(Boolean));\n names.add(name);\n element.setAttribute('data-brandlab-journey', [...names].join(' '));\n}\n\n/**\n * Watch one disclosure: when the pointer enters and leaves its item (and panel), and when the panel it controls\n * becomes rendered or hidden, timed with `performance.now()`. Attribute and tree changes are sampled at once; style\n * changes without a DOM change (CSS `:hover`) every animation frame.\n */\nexport function watchDisclosure(trigger: Element, panelId: string): void {\n const item = trigger.closest('li') ?? trigger.parentElement ?? trigger;\n const panel = () => document.getElementById(panelId);\n const inside = (node: EventTarget | null) => node instanceof Node && (item.contains(node) || Boolean(panel()?.contains(node)));\n const state: DisclosureWatch = { enter: null, leave: null, opened: null, closed: null, open: isRendered(panel()) };\n const sample = () => {\n const open = isRendered(panel());\n if (open === state.open) return;\n state.open = open;\n if (open && state.opened === null) state.opened = performance.now();\n if (!open && state.closed === null) state.closed = performance.now();\n };\n const onOver = (event: Event) => {\n if (state.enter === null && inside(event.target)) state.enter = performance.now();\n };\n const onOut = (event: Event) => {\n if (state.leave === null && inside(event.target) && !inside((event as PointerEvent).relatedTarget)) state.leave = performance.now();\n };\n const observer = new MutationObserver(sample);\n observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true });\n let frame = 0;\n const loop = () => {\n sample();\n frame = requestAnimationFrame(loop);\n };\n loop();\n document.addEventListener('pointerover', onOver, true);\n document.addEventListener('pointerout', onOut, true);\n const previous = (window as unknown as { __brandlabSiteSystemWatch?: { stop(): void } }).__brandlabSiteSystemWatch;\n previous?.stop();\n (window as unknown as { __brandlabSiteSystemWatch: unknown }).__brandlabSiteSystemWatch = {\n state,\n stop() {\n observer.disconnect();\n cancelAnimationFrame(frame);\n document.removeEventListener('pointerover', onOver, true);\n document.removeEventListener('pointerout', onOut, true);\n },\n };\n}\n\n/** The current state of `watchDisclosure`'s watch. */\nexport function watchState(): DisclosureWatch | null {\n const watch = (window as unknown as { __brandlabSiteSystemWatch?: { state: DisclosureWatch } }).__brandlabSiteSystemWatch;\n return watch ? { ...watch.state } : null;\n}\n\n/**\n * After a Tab press: is the focused element fully hidden under the sticky header or the call bar? Samples nine points\n * across the visible part of its box; it is hidden when the header or call bar is on top at every one. `repeat` is\n * true once focus comes back to an element it has already visited.\n */\nexport function focusStep(): { done: boolean; repeat: boolean; obscured: string | null; covered: 'header' | 'call bar' | null } {\n const element = document.activeElement;\n const store = window as unknown as { __brandlabSiteSystemFocus?: WeakSet<Element> };\n store.__brandlabSiteSystemFocus ??= new WeakSet<Element>();\n if (!element || element === document.body || element === document.documentElement) return { done: true, repeat: false, obscured: null, covered: null };\n const repeat = store.__brandlabSiteSystemFocus.has(element);\n store.__brandlabSiteSystemFocus.add(element);\n const header = document.querySelector('[data-brandlab-journey~=\"header\"]')\n ?? Array.from(document.querySelectorAll('[data-bl=\"header\"], header')).find((candidate) => isRendered(candidate) && !candidate.closest('main, article, section, aside, footer'))\n ?? null;\n const callBar = findCallBar();\n if (header?.contains(element) || callBar?.contains(element)) return { done: false, repeat, obscured: null, covered: null };\n const rect = element.getBoundingClientRect();\n const left = Math.max(rect.left, 0);\n const right = Math.min(rect.right, window.innerWidth);\n const top = Math.max(rect.top, 0);\n const bottom = Math.min(rect.bottom, window.innerHeight);\n if (right - left < 1 || bottom - top < 1) return { done: false, repeat, obscured: null, covered: null };\n let coveredBy: 'header' | 'call bar' | null = null;\n for (const fx of [0.15, 0.5, 0.85]) {\n for (const fy of [0.15, 0.5, 0.85]) {\n const hit = document.elementFromPoint(left + (right - left) * fx, top + (bottom - top) * fy);\n if (!hit || element.contains(hit)) return { done: false, repeat, obscured: null, covered: null };\n if (header?.contains(hit)) coveredBy ??= 'header';\n else if (callBar?.contains(hit)) coveredBy ??= 'call bar';\n else return { done: false, repeat, obscured: null, covered: null };\n }\n }\n return { done: false, repeat, obscured: describeElement(element), covered: coveredBy };\n}\n\n/**\n * `focusStep` one animation frame after the focus moved (capped at 50 ms, since a background page may not paint), so\n * a sticky bar that hides on its observer's next frame is measured after it moved, not mid-transition.\n */\nexport function focusStepAfterFrame(): Promise<ReturnType<typeof focusStep>> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n resolve(focusStep());\n };\n requestAnimationFrame(() => finish());\n setTimeout(finish, 50);\n });\n}\n\n/** Elements a Tab press can reach, roughly: enough to bound the K5 walk. */\nexport function tabbableCount(): number {\n const selector = 'a[href], button:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), summary, iframe, [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(document.querySelectorAll(selector)).filter(isRendered).length;\n}\n\nconst PAGE_HELPERS = {\n isRendered, describeElement, accessibleName, phonePlacement, parseColour, compositeColour, contrastRatio, backgroundBehind,\n iconContrastProblems, findCallBar, quoteActions, actionOrder, heroRegion, outsidePoint, markElement, watchDisclosure,\n watchState, focusStep, focusStepAfterFrame, tabbableCount,\n};\n\n/** `window.__brandlabSiteSystem` in a page the journeys opened. */\nexport type SiteSystemPageHelpers = typeof PAGE_HELPERS;\n\n/** The init script that defines `window.__brandlabSiteSystem` in every document of the page. */\nexport function pageHelpersSource(): string {\n const names = Object.keys(PAGE_HELPERS);\n return `(() => {\\nconst SITE_SYSTEM_PHONE_PLACEMENTS = ${JSON.stringify(SITE_SYSTEM_PHONE_PLACEMENTS)};\\n${Object.values(PAGE_HELPERS).map((helper) => helper.toString()).join('\\n')}\\nwindow.__brandlabSiteSystem = { ${names.join(', ')} };\\n})();`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"page-helpers.js","sourceRoot":"","sources":["../../../src/site-system/journeys/page-helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Functions the site-system journeys run inside the page under test. Each one is self-contained: it uses DOM globals\n * and the other helpers in this file only, because `pageHelpersSource()` injects their source into every document\n * (as `window.__brandlabSiteSystem`, through Playwright's init script, which a Content Security Policy does not\n * block). The pure parts (colour, contrast, placement) are unit-tested in Node.\n */\n\n/**\n * The placements `phone_link_click` accepts: site-next's PHONE_CALL_PLACEMENTS (conformance cannot depend on\n * site-next; a test reads the site-next source and compares). Injected into the page with the helpers.\n */\nexport const SITE_SYSTEM_PHONE_PLACEMENTS: readonly string[] = Object.freeze(['header', 'footer', 'hero', 'cta', 'fab', 'contact', 'location', 'page', 'emergency']);\n\nexport type Rgba = [number, number, number, number];\n\n/** What `watchDisclosure` has seen, in `performance.now()` milliseconds. */\nexport interface DisclosureWatch {\n enter: number | null;\n leave: number | null;\n opened: number | null;\n closed: number | null;\n open: boolean;\n}\n\n/**\n * Whether an element is rendered: connected, with a box, not `visibility: hidden`, not fully transparent and not\n * inside a closed `<details>` (outside its summary). Chromium gives the content of a closed `<details>` a box, so\n * the box alone is not enough; `checkVisibility()` settles it where the browser has it.\n */\nexport function isRendered(element: Element | null | undefined): boolean {\n if (!element || !element.isConnected) return false;\n for (let details = element.closest('details:not([open])'); details; details = details.parentElement?.closest('details:not([open])') ?? null) {\n const summary = Array.from(details.children).find((child) => child.tagName === 'SUMMARY');\n if (!summary || !summary.contains(element)) return false;\n }\n if (typeof element.checkVisibility === 'function' && !element.checkVisibility({ checkOpacity: true, checkVisibilityCSS: true })) return false;\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n if (getComputedStyle(element).visibility !== 'visible') return false;\n for (let node: Element | null = element; node; node = node.parentElement) {\n if (getComputedStyle(node).opacity === '0') return false;\n }\n return true;\n}\n\n/** A short, readable name for an element in a failure message. */\nexport function describeElement(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const label = element.getAttribute('aria-label') ?? (element as HTMLElement).innerText ?? element.textContent ?? '';\n const text = label.replace(/\\s+/g, ' ').trim().slice(0, 40);\n const href = element.getAttribute('href');\n return `${tag}${text ? ` \"${text}\"` : ''}${href ? ` (${href})` : ''}`;\n}\n\n/** The accessible name, approximately: aria-label, aria-labelledby, the rendered text, then the title. */\nexport function accessibleName(element: Element): string {\n const label = element.getAttribute('aria-label');\n if (label && label.trim()) return label.trim();\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const text = labelledBy.split(/\\s+/).map((id) => document.getElementById(id)?.textContent ?? '').join(' ').trim();\n if (text) return text.replace(/\\s+/g, ' ');\n }\n const text = ((element as HTMLElement).innerText ?? element.textContent ?? '').replace(/\\s+/g, ' ').trim();\n return text || (element.getAttribute('title') ?? '').trim();\n}\n\n/**\n * Where a telephone link reports its tap, exactly as site-next's shared listener resolves it: its own valid\n * `data-phone-location`, then a `<header>` or `<footer>` ancestor, then the nearest ancestor with a valid value,\n * otherwise `page`. `invalid` is the nearest declared value when it is not an allowed placement (the listener then\n * reports the link somewhere else, silently).\n */\nexport function phonePlacement(link: Element): { placement: string; invalid: string | null } {\n const valid = (node: Element): string | undefined => {\n const value = node.getAttribute('data-phone-location')?.trim().toLowerCase();\n return value && SITE_SYSTEM_PHONE_PLACEMENTS.includes(value) ? value : undefined;\n };\n const nearest = link.closest('[data-phone-location]');\n const invalid = nearest && !valid(nearest) ? nearest.getAttribute('data-phone-location') : null;\n const own = valid(link);\n if (own) return { placement: own, invalid };\n if (link.closest('header')) return { placement: 'header', invalid };\n if (link.closest('footer')) return { placement: 'footer', invalid };\n for (let node = link.parentElement?.closest('[data-phone-location]') ?? null; node; node = node.parentElement?.closest('[data-phone-location]') ?? null) {\n const value = valid(node);\n if (value) return { placement: value, invalid };\n }\n return { placement: 'page', invalid };\n}\n\n/** Parse a computed colour. `rgb()`/`rgba()` directly; any other syntax (oklch, lab, color()) through a canvas pixel. */\nexport function parseColour(value: string): Rgba | null {\n const text = value.trim().toLowerCase();\n if (text === 'transparent') return [0, 0, 0, 0];\n const match = /^rgba?\\(([^)]+)\\)$/.exec(text);\n if (match) {\n const parts = match[1]!.split(/[\\s,/]+/).filter(Boolean);\n if (parts.length < 3) return null;\n const channel = (part: string) => (part.endsWith('%') ? (Number.parseFloat(part) / 100) * 255 : Number.parseFloat(part));\n const alphaPart = parts[3];\n const alpha = alphaPart === undefined ? 1 : alphaPart.endsWith('%') ? Number.parseFloat(alphaPart) / 100 : Number.parseFloat(alphaPart);\n const rgba: Rgba = [channel(parts[0]!), channel(parts[1]!), channel(parts[2]!), alpha];\n return rgba.every((part) => Number.isFinite(part)) ? rgba : null;\n }\n if (typeof document === 'undefined') return null;\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const context = canvas.getContext('2d', { willReadFrequently: true });\n if (!context) return null;\n context.clearRect(0, 0, 1, 1);\n context.fillStyle = value;\n context.fillRect(0, 0, 1, 1);\n const [red = 0, green = 0, blue = 0, alpha = 0] = Array.from(context.getImageData(0, 0, 1, 1).data);\n return [red, green, blue, alpha / 255];\n}\n\n/** `top` painted over an opaque `bottom`. */\nexport function compositeColour(top: Rgba, bottom: Rgba): Rgba {\n const alpha = top[3];\n return [\n top[0] * alpha + bottom[0] * (1 - alpha),\n top[1] * alpha + bottom[1] * (1 - alpha),\n top[2] * alpha + bottom[2] * (1 - alpha),\n 1,\n ];\n}\n\n/** The WCAG contrast ratio of two opaque colours. */\nexport function contrastRatio(first: Rgba, second: Rgba): number {\n const luminance = (colour: Rgba) => {\n const [red, green, blue] = colour.slice(0, 3).map((channel) => {\n const value = channel / 255;\n return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n }) as [number, number, number];\n return 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n };\n const [light, dark] = [luminance(first), luminance(second)].sort((left, right) => right - left) as [number, number];\n return (light + 0.05) / (dark + 0.05);\n}\n\n/**\n * The opaque colour behind an element, from its own and its ancestors' background colours over a white canvas.\n * `null` when a background image (a photo or gradient) is in the way: the contrast cannot be computed there.\n */\nexport function backgroundBehind(element: Element): Rgba | null {\n const layers: Rgba[] = [];\n for (let node: Element | null = element; node; node = node.parentElement) {\n const style = getComputedStyle(node);\n if (style.backgroundImage && style.backgroundImage !== 'none') return null;\n const colour = parseColour(style.backgroundColor);\n if (colour && colour[3] > 0) {\n layers.push(colour);\n if (colour[3] >= 1) break;\n }\n }\n return layers.reverse().reduce<Rgba>((bottom, top) => compositeColour(top, bottom), [255, 255, 255, 1]);\n}\n\n/**\n * Non-text contrast (WCAG 1.4.11) of icon-only controls inside `root`: a link or button with no visible text whose\n * icon is an SVG must reach 3:1 against what is behind it. Returns one line per failure; controls over a photo are\n * counted in `unmeasured`.\n */\nexport function iconContrastProblems(root: Element): { problems: string[]; checked: number; unmeasured: number } {\n const problems: string[] = [];\n let checked = 0;\n let unmeasured = 0;\n const paintOf = (svg: SVGElement): Rgba | null => {\n for (const shape of Array.from(svg.querySelectorAll('path, circle, rect, ellipse, line, polyline, polygon, text, use'))) {\n if (!isRendered(shape)) continue;\n const style = getComputedStyle(shape);\n for (const [paint, opacity] of [[style.fill, style.fillOpacity], [style.stroke, style.strokeOpacity]] as const) {\n if (!paint || paint === 'none' || paint.startsWith('url(')) continue;\n const colour = parseColour(paint);\n const alpha = colour ? colour[3] * Number(opacity || 1) * Number(style.opacity || 1) : 0;\n if (colour && alpha > 0) return [colour[0], colour[1], colour[2], alpha];\n }\n }\n return null;\n };\n for (const control of Array.from(root.querySelectorAll('a[href], button'))) {\n if (!isRendered(control)) continue;\n if (((control as HTMLElement).innerText ?? '').trim()) continue;\n const svg = control.querySelector('svg');\n if (!svg || !isRendered(svg)) continue;\n const paint = paintOf(svg);\n if (!paint) continue;\n const background = backgroundBehind(svg);\n if (!background) {\n unmeasured += 1;\n continue;\n }\n checked += 1;\n const ratio = contrastRatio(compositeColour(paint, background), background);\n if (ratio < 3) problems.push(`${describeElement(control)}: its icon is ${ratio.toFixed(2)}:1 against its background (needs 3:1)`);\n }\n return { problems, checked, unmeasured };\n}\n\n/**\n * The phone call bar: the shared `MobileCallBar`, or any fixed or sticky element along the bottom of the screen that\n * holds a visible telephone link (outside the header and dialogs). `null` when none is on screen.\n */\nexport function findCallBar(): Element | null {\n const tagged = Array.from(document.querySelectorAll('[data-bl=\"call-bar\"], [data-bl=\"callbar\"], [data-bl=\"mobile-call-bar\"]')).find(isRendered);\n if (tagged) return tagged;\n const height = window.innerHeight;\n for (const element of Array.from(document.body.querySelectorAll('*'))) {\n const position = getComputedStyle(element).position;\n if (position !== 'fixed' && position !== 'sticky') continue;\n if (element.closest('header, dialog, [role=\"dialog\"]')) continue;\n const rect = element.getBoundingClientRect();\n if (rect.height <= 0 || rect.bottom < height - 4 || rect.top < height / 2) continue;\n if (!isRendered(element)) continue;\n if (Array.from(element.querySelectorAll('a[href^=\"tel:\"]')).some(isRendered)) return element;\n }\n return null;\n}\n\n/** Visible quote actions in `root`: links or buttons named like the quote action, or the shared quote hooks. */\nexport function quoteActions(root: Element, name: { source: string; flags: string }): Element[] {\n const pattern = new RegExp(name.source, name.flags);\n return Array.from(root.querySelectorAll('a[href], button')).filter((element) => {\n if (!isRendered(element) || element.getAttribute('href')?.startsWith('tel:')) return false;\n if (element.matches('[data-bl=\"quote-button\"], [data-bl-cta^=\"quote\"], [data-lead-cta^=\"quote\"]')) return true;\n return pattern.test(accessibleName(element));\n });\n}\n\n/** The order of the first visible phone link and quote action in `root`. */\nexport function actionOrder(root: Element, name: { source: string; flags: string }): 'phone-first' | 'quote-first' | 'incomplete' {\n const phone = Array.from(root.querySelectorAll('a[href^=\"tel:\"]')).find(isRendered);\n const quote = quoteActions(root, name)[0];\n if (!phone || !quote) return 'incomplete';\n return phone.compareDocumentPosition(quote) & Node.DOCUMENT_POSITION_FOLLOWING ? 'phone-first' : 'quote-first';\n}\n\n/**\n * The hero: the shared hero section, else the smallest block around the page's visible H1 that holds a phone link\n * and a quote action, never above the H1's own section and never `<main>` (without a section, never a block holding\n * an H2). When none holds both, the H1's section (or its parent): its order then reads \"incomplete\".\n */\nexport function heroRegion(name: { source: string; flags: string }): Element | null {\n const heading = Array.from(document.querySelectorAll('h1')).find(isRendered);\n if (!heading) return null;\n const tagged = heading.closest('[data-bl-section=\"hero\"]');\n if (tagged) return tagged;\n const section = heading.closest('section');\n const fallback = section ?? heading.parentElement;\n for (let node = heading.parentElement; node && node !== document.body && node.tagName !== 'MAIN'; node = node.parentElement) {\n if (!section && node.querySelector('h2')) break;\n if (Array.from(node.querySelectorAll('a[href^=\"tel:\"]')).some(isRendered) && quoteActions(node, name).length > 0) return node;\n if (node === section) break;\n }\n return fallback && fallback.tagName !== 'MAIN' ? fallback : heading;\n}\n\n/** A point in the page that is not on an interactive element, a menu or anything in `avoid`. */\nexport function outsidePoint(avoid: Element[]): { x: number; y: number } | null {\n const interactive = 'a[href], button, input, select, textarea, label, summary, details, iframe, video, audio, [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [tabindex], [contenteditable=\"\"], [contenteditable=\"true\"]';\n for (let row = 9; row >= 3; row -= 1) {\n for (let column = 1; column <= 9; column += 1) {\n const x = Math.round((window.innerWidth * column) / 10);\n const y = Math.round((window.innerHeight * row) / 10);\n const element = document.elementFromPoint(x, y);\n if (!element || avoid.some((region) => region.contains(element))) continue;\n if (element.closest(interactive) || element.closest('header, nav, dialog, [role=\"dialog\"]')) continue;\n return { x, y };\n }\n }\n return null;\n}\n\n/** Tag an element so Playwright and axe can find it by `[data-brandlab-journey~=\"<name>\"]`. */\nexport function markElement(element: Element, name: string): void {\n const names = new Set((element.getAttribute('data-brandlab-journey') ?? '').split(/\\s+/).filter(Boolean));\n names.add(name);\n element.setAttribute('data-brandlab-journey', [...names].join(' '));\n}\n\n/**\n * Watch one disclosure: when the pointer enters and leaves its item (and panel), and when the panel it controls\n * becomes rendered or hidden, timed with `performance.now()`. Attribute and tree changes are sampled at once; style\n * changes without a DOM change (CSS `:hover`) every animation frame.\n */\nexport function watchDisclosure(trigger: Element, panelId: string): void {\n const item = trigger.closest('li') ?? trigger.parentElement ?? trigger;\n const panel = () => document.getElementById(panelId);\n const inside = (node: EventTarget | null) => node instanceof Node && (item.contains(node) || Boolean(panel()?.contains(node)));\n const state: DisclosureWatch = { enter: null, leave: null, opened: null, closed: null, open: isRendered(panel()) };\n const sample = () => {\n const open = isRendered(panel());\n if (open === state.open) return;\n state.open = open;\n if (open && state.opened === null) state.opened = performance.now();\n if (!open && state.closed === null) state.closed = performance.now();\n };\n const onOver = (event: Event) => {\n if (state.enter === null && inside(event.target)) state.enter = performance.now();\n };\n const onOut = (event: Event) => {\n if (state.leave === null && inside(event.target) && !inside((event as PointerEvent).relatedTarget)) state.leave = performance.now();\n };\n const observer = new MutationObserver(sample);\n observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true });\n let frame = 0;\n const loop = () => {\n sample();\n frame = requestAnimationFrame(loop);\n };\n loop();\n document.addEventListener('pointerover', onOver, true);\n document.addEventListener('pointerout', onOut, true);\n const previous = (window as unknown as { __brandlabSiteSystemWatch?: { stop(): void } }).__brandlabSiteSystemWatch;\n previous?.stop();\n (window as unknown as { __brandlabSiteSystemWatch: unknown }).__brandlabSiteSystemWatch = {\n state,\n stop() {\n observer.disconnect();\n cancelAnimationFrame(frame);\n document.removeEventListener('pointerover', onOver, true);\n document.removeEventListener('pointerout', onOut, true);\n },\n };\n}\n\n/** The current state of `watchDisclosure`'s watch. */\nexport function watchState(): DisclosureWatch | null {\n const watch = (window as unknown as { __brandlabSiteSystemWatch?: { state: DisclosureWatch } }).__brandlabSiteSystemWatch;\n return watch ? { ...watch.state } : null;\n}\n\n/**\n * After a Tab press: is the focused element fully hidden under the sticky header or the call bar? Samples nine points\n * across the visible part of its box; it is hidden when the header or call bar is on top at every one. `repeat` is\n * true once focus comes back to an element it has already visited.\n */\nexport function focusStep(): { done: boolean; repeat: boolean; obscured: string | null; covered: 'header' | 'call bar' | null } {\n const element = document.activeElement;\n const store = window as unknown as { __brandlabSiteSystemFocus?: WeakSet<Element> };\n store.__brandlabSiteSystemFocus ??= new WeakSet<Element>();\n if (!element || element === document.body || element === document.documentElement) return { done: true, repeat: false, obscured: null, covered: null };\n const repeat = store.__brandlabSiteSystemFocus.has(element);\n store.__brandlabSiteSystemFocus.add(element);\n const header = document.querySelector('[data-brandlab-journey~=\"header\"]')\n ?? Array.from(document.querySelectorAll('[data-bl=\"header\"], header')).find((candidate) => isRendered(candidate) && !candidate.closest('main, article, section, aside, footer'))\n ?? null;\n const callBar = findCallBar();\n if (header?.contains(element) || callBar?.contains(element)) return { done: false, repeat, obscured: null, covered: null };\n const rect = element.getBoundingClientRect();\n const left = Math.max(rect.left, 0);\n const right = Math.min(rect.right, window.innerWidth);\n const top = Math.max(rect.top, 0);\n const bottom = Math.min(rect.bottom, window.innerHeight);\n if (right - left < 1 || bottom - top < 1) return { done: false, repeat, obscured: null, covered: null };\n let coveredBy: 'header' | 'call bar' | null = null;\n for (const fx of [0.15, 0.5, 0.85]) {\n for (const fy of [0.15, 0.5, 0.85]) {\n const hit = document.elementFromPoint(left + (right - left) * fx, top + (bottom - top) * fy);\n if (!hit || element.contains(hit)) return { done: false, repeat, obscured: null, covered: null };\n if (header?.contains(hit)) coveredBy ??= 'header';\n else if (callBar?.contains(hit)) coveredBy ??= 'call bar';\n else return { done: false, repeat, obscured: null, covered: null };\n }\n }\n return { done: false, repeat, obscured: describeElement(element), covered: coveredBy };\n}\n\n/**\n * `focusStep` one animation frame after the focus moved (capped at 50 ms, since a background page may not paint), so\n * a sticky bar that hides on its observer's next frame is measured after it moved, not mid-transition.\n */\nexport function focusStepAfterFrame(): Promise<ReturnType<typeof focusStep>> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n resolve(focusStep());\n };\n requestAnimationFrame(() => finish());\n setTimeout(finish, 50);\n });\n}\n\n/** Elements a Tab press can reach, roughly: enough to bound the K5 walk. */\nexport function tabbableCount(): number {\n const selector = 'a[href], button:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), summary, iframe, [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(document.querySelectorAll(selector)).filter(isRendered).length;\n}\n\nconst PAGE_HELPERS = {\n isRendered, describeElement, accessibleName, phonePlacement, parseColour, compositeColour, contrastRatio, backgroundBehind,\n iconContrastProblems, findCallBar, quoteActions, actionOrder, heroRegion, outsidePoint, markElement, watchDisclosure,\n watchState, focusStep, focusStepAfterFrame, tabbableCount,\n};\n\n/** `window.__brandlabSiteSystem` in a page the journeys opened. */\nexport type SiteSystemPageHelpers = typeof PAGE_HELPERS;\n\n/** The init script that defines `window.__brandlabSiteSystem` in every document of the page. */\nexport function pageHelpersSource(): string {\n const names = Object.keys(PAGE_HELPERS);\n return `(() => {\\nconst SITE_SYSTEM_PHONE_PLACEMENTS = ${JSON.stringify(SITE_SYSTEM_PHONE_PLACEMENTS)};\\n${Object.values(PAGE_HELPERS).map((helper) => helper.toString()).join('\\n')}\\nwindow.__brandlabSiteSystem = { ${names.join(', ')} };\\n})();`;\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { detectInstalledBrandlabRelease } from '../../project.js';
|
|
1
2
|
import { SITE_SYSTEM_CHECKS, type SiteSystemTier } from '../checks.js';
|
|
2
3
|
type JourneyCheck = Extract<(typeof SITE_SYSTEM_CHECKS)[number], {
|
|
3
4
|
kind: 'journey';
|
|
@@ -22,9 +23,11 @@ export interface BrandlabSiteSystemTestOptions {
|
|
|
22
23
|
/** The adoption tier from brandlab.config.ts (`siteSystem.tier`). C1 registers from `enquiry`. */
|
|
23
24
|
tier: SiteSystemTier;
|
|
24
25
|
/**
|
|
25
|
-
* The release whose journeys register
|
|
26
|
-
* release
|
|
27
|
-
*
|
|
26
|
+
* The release whose journeys register. `defineBrandlabSiteSystemTests` defaults it to the site's installed Brandlab
|
|
27
|
+
* release, read from its package.json as `brandlab-ready` reads it (one exact version, or one canary such as
|
|
28
|
+
* `3.15.0-canary.2`), else this conformance release. A journey registers only from the release that brings it, so a
|
|
29
|
+
* later journey never turns a site's e2e run red before the gate blocks on it, and a check that blocks has its
|
|
30
|
+
* journey. Name a later release to preview its journeys.
|
|
28
31
|
*/
|
|
29
32
|
release?: string;
|
|
30
33
|
/**
|
|
@@ -83,6 +86,13 @@ export declare function siteSystemJourneyTitle(id: SiteSystemJourneyId, text: st
|
|
|
83
86
|
* it (default: this conformance release).
|
|
84
87
|
*/
|
|
85
88
|
export declare function siteSystemJourneysFor(tier: SiteSystemTier, release?: string): SiteSystemJourneyId[];
|
|
89
|
+
/**
|
|
90
|
+
* The release the journeys register for on a site: its installed Brandlab release as `brandlab-ready` reads it (all
|
|
91
|
+
* four packages at one exact version, or one canary, from package.json), else this conformance release. A canary's
|
|
92
|
+
* own release manifest still names the last published release, so without this its new journeys (W2 and W9 on
|
|
93
|
+
* 3.15.0-canary.2) would not register while the gate blocks on them.
|
|
94
|
+
*/
|
|
95
|
+
export declare function siteSystemJourneyRelease(packageJson: Parameters<typeof detectInstalledBrandlabRelease>[0]): string;
|
|
86
96
|
/** Validate the options and fill the defaults. Malformed options throw, listing every problem. */
|
|
87
97
|
export declare function planBrandlabSiteSystemJourneys(options: BrandlabSiteSystemTestOptions): SiteSystemJourneyPlan;
|
|
88
98
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/site-system/journeys/plan.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAA4C,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEjH,KAAK,YAAY,GAAG,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AACtF,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AAErD,+DAA+D;AAC/D,eAAO,MAAM,uBAAuB,yFAAkJ,CAAC;AAEvL,wHAAwH;AACxH,eAAO,MAAM,0BAA0B,mBAAgD,CAAC;AACxF,eAAO,MAAM,0BAA0B;;;EAA6C,CAAC;AACrF,eAAO,MAAM,4BAA4B;;;EAA8C,CAAC;AAExF,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,QAAe,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,aAAa,CAAC;AAElE,MAAM,WAAW,6BAA6B;IAC5C,kGAAkG;IAClG,IAAI,EAAE,cAAc,CAAC;IACrB
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/site-system/journeys/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* defaults. Pure, so it is unit-tested without a browser.
|
|
4
4
|
*/
|
|
5
5
|
import { BRANDLAB_CURRENT_RUNTIME_RELEASE } from '../../current-release.js';
|
|
6
|
+
import { detectBrandlabCanaryRelease, detectInstalledBrandlabRelease } from '../../project.js';
|
|
6
7
|
import { SITE_SYSTEM_CHECKS, SITE_SYSTEM_TIERS, siteSystemReleaseRank } from '../checks.js';
|
|
7
8
|
/** Every journey check, in the order the journeys register. */
|
|
8
9
|
export const SITE_SYSTEM_JOURNEY_IDS = Object.freeze(['N3', 'N4', 'N5', 'N6', 'N8', 'K3', 'K4', 'K5', 'K6', 'C4', 'W2', 'C1', 'W9']);
|
|
@@ -30,6 +31,15 @@ export function siteSystemJourneysFor(tier, release = BRANDLAB_CURRENT_RUNTIME_R
|
|
|
30
31
|
&& siteSystemReleaseRank(check.from) <= releaseRank;
|
|
31
32
|
});
|
|
32
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* The release the journeys register for on a site: its installed Brandlab release as `brandlab-ready` reads it (all
|
|
36
|
+
* four packages at one exact version, or one canary, from package.json), else this conformance release. A canary's
|
|
37
|
+
* own release manifest still names the last published release, so without this its new journeys (W2 and W9 on
|
|
38
|
+
* 3.15.0-canary.2) would not register while the gate blocks on them.
|
|
39
|
+
*/
|
|
40
|
+
export function siteSystemJourneyRelease(packageJson) {
|
|
41
|
+
return detectInstalledBrandlabRelease(packageJson) ?? detectBrandlabCanaryRelease(packageJson)?.version ?? BRANDLAB_CURRENT_RUNTIME_RELEASE.releaseVersion;
|
|
42
|
+
}
|
|
33
43
|
function pathProblem(label, path) {
|
|
34
44
|
if (typeof path !== 'string' || !path.startsWith('/') || path.startsWith('//') || /\s/.test(path)) {
|
|
35
45
|
return `${label} must be a site path starting with "/" (got ${JSON.stringify(path)})`;
|
|
@@ -77,8 +87,8 @@ export function planBrandlabSiteSystemJourneys(options) {
|
|
|
77
87
|
if (value !== undefined && (!Number.isInteger(value) || value <= 0))
|
|
78
88
|
errors.push(`${key} must be a positive whole number (got ${value})`);
|
|
79
89
|
}
|
|
80
|
-
if (input.release !== undefined && (typeof input.release !== 'string' || !/^\d+\.\d+\.\d
|
|
81
|
-
errors.push(`release must be a version such as 3.9.0 (got ${JSON.stringify(input.release)})`);
|
|
90
|
+
if (input.release !== undefined && (typeof input.release !== 'string' || !/^\d+\.\d+\.\d+(?:-canary\.\d+)?$/.test(input.release))) {
|
|
91
|
+
errors.push(`release must be a version such as 3.9.0 or 3.15.0-canary.2 (got ${JSON.stringify(input.release)})`);
|
|
82
92
|
}
|
|
83
93
|
if (input.navName !== undefined && (typeof input.navName !== 'string' || !input.navName.trim()))
|
|
84
94
|
errors.push('navName must be a non-empty string');
|