${esc(title)}
${esc(body)}
diff --git a/scripts/ui-capture.mjs b/scripts/ui-capture.mjs index a204183..6eef18c 100644 --- a/scripts/ui-capture.mjs +++ b/scripts/ui-capture.mjs @@ -48,21 +48,21 @@ export const SHOTS = Object.freeze([ { file: 'home-mobile-tall.png', route: '/', width: 390, height: 844, state: 'whole page after scrolling through, reduced motion, real time', reducedMotion: true, realtime: true, fullPage: true }, { file: 'home-band-reel.png', route: '/', width: 1440, height: 1000, scrollTo: '[data-rd-reel]', assertVisible: '[data-rd-reel] .rd-reel-cap', state: 'reel with its native player and staged-film caption, reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'home-band-chapter-genie.png', route: '/', width: 1440, height: 1000, scrollTo: '#products', assertVisible: 'a.rd-row[href="/products/genie/"]', state: 'product list (redesign; replaces the v4 Genie card), real time', realtime: true }, - { file: 'home-band-chapter-oathra.png', route: '/', width: 1440, height: 1000, scrollTo: '.rd-records', assertVisible: '.rd-records a[href="/products/oathra/#film15-oathra-title"]', state: 'records and films row under the product list (redesign; replaces the v4 Oathra card), real time', realtime: true }, + { file: 'home-band-chapter-oathra.png', route: '/', width: 1440, height: 1000, openDetails: '.rd-kept--fold', scrollTo: '.rd-records', assertVisible: '.rd-records a[href="/products/oathra/#film15-oathra-title"]', state: 'records and films row under the product list (redesign; replaces the v4 Oathra card), real time', realtime: true }, { file: 'home-band-chapter-launchloom.png', route: '/', width: 1440, height: 1000, scrollTo: 'a.rd-row[href="/products/launchloom/"]', assertVisible: 'a.rd-row[href="/products/launchloom/"]', state: 'Launchloom row in the product list (redesign), real time', realtime: true }, { file: 'home-band-principles.png', route: '/', width: 1440, height: 1000, scrollTo: '#principles', state: 'principles, reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'home-band-services.png', route: '/', width: 1440, height: 1000, scrollTo: '#services', state: 'services band, reduced motion, real time', reducedMotion: true, realtime: true }, - { file: 'home-band-access.png', route: '/', width: 1440, height: 1000, openDetails: '#access > details', scrollTo: '#access', assertVisible: '#access details[open] .rm-access-table', state: 'open access table, reduced motion, real time', reducedMotion: true, realtime: true }, - { file: 'home-band-close.png', route: '/', width: 1440, height: 1000, scrollTo: '#faq', state: 'FAQ and contact, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'home-band-access.png', route: '/', width: 1440, height: 1000, openDetails: ['.rd-kept--fold', '#access > details'], scrollTo: '#access', assertVisible: '#access details[open] .rm-access-table', state: 'open access table, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'home-band-close.png', route: '/', width: 1440, height: 1000, openDetails: '.rd-kept--fold', scrollTo: '#faq', state: 'FAQ and contact, reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'home-m-reel.png', route: '/', width: 390, height: 844, scrollTo: '[data-rd-reel]', assertVisible: '[data-rd-reel] .rd-reel-cap', state: 'phone, reel with native player and caption, reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'home-m-chapter.png', route: '/', width: 390, height: 844, scrollTo: '#products', assertVisible: 'a.rd-row[href="/products/ai-meeting/"]', state: 'phone, product list (redesign), real time', realtime: true }, // The two home clips cut from illustrative films (2026-09-30): their label and the caption under the video. - { file: 'home-m-chapter-oathra.png', route: '/', width: 390, height: 1100, scrollTo: '.rd-records', assertVisible: '.rd-records a[href="/work/#oathra"]', state: 'phone, records and films row (redesign), reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'home-m-chapter-oathra.png', route: '/', width: 390, height: 1100, openDetails: '.rd-kept--fold', scrollTo: '.rd-records', assertVisible: '.rd-records a[href="/work/#oathra"]', state: 'phone, records and films row (redesign), reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'home-m-chapter-agent-team.png', route: '/', width: 390, height: 1100, scrollTo: 'a.rd-row[data-rd-film]', assertVisible: 'a.rd-row[data-rd-film]', state: 'phone, Agent Team row carrying the labelled design film (redesign), reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'home-m-services.png', route: '/', width: 390, height: 844, scrollTo: '#services', state: 'phone, services band, reduced motion, real time', reducedMotion: true, realtime: true }, - { file: 'home-m-access.png', route: '/', width: 390, height: 844, openDetails: '#access > details', scrollTo: '#access', assertVisible: '#access details[open] .rm-access-table', state: 'phone, open access table, reduced motion, real time', reducedMotion: true, realtime: true }, - { file: 'home-en-m-access.png', route: '/en/', width: 390, height: 844, openDetails: '#access > details', scrollTo: '#access', assertVisible: '#access details[open] .rm-access-table', state: 'phone, English open access table, reduced motion, real time', reducedMotion: true, realtime: true }, - { file: 'home-narrow-access.png', route: '/', width: 320, height: 900, openDetails: '#access > details', scrollTo: '#access', assertVisible: '#access details[open] .rm-access-table', state: 'narrow phone, open access table, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'home-m-access.png', route: '/', width: 390, height: 844, openDetails: ['.rd-kept--fold', '#access > details'], scrollTo: '#access', assertVisible: '#access details[open] .rm-access-table', state: 'phone, open access table, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'home-en-m-access.png', route: '/en/', width: 390, height: 844, openDetails: ['.rd-kept--fold', '#access > details'], scrollTo: '#access', assertVisible: '#access details[open] .rm-access-table', state: 'phone, English open access table, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'home-narrow-access.png', route: '/', width: 320, height: 900, openDetails: ['.rd-kept--fold', '#access > details'], scrollTo: '#access', assertVisible: '#access details[open] .rm-access-table', state: 'narrow phone, open access table, reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'noa-hero-ja-desktop.png', route: '/products/noa/', width: 1440, height: 1200, scrollTo: '.rd-phero', assertVisible: '.rd-phero', state: 'Noa ja public viewing hero, desktop, reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'noa-hero-ja-mobile.png', route: '/products/noa/', width: 390, height: 1400, scrollTo: '.rd-phero', assertVisible: '.rd-phero', state: 'Noa ja public viewing hero, mobile, reduced motion, real time', reducedMotion: true, realtime: true }, { file: 'noa-viewing-ja-desktop.png', route: '/products/noa/', width: 1440, height: 1200, scrollTo: '#noa-viewing', assertVisible: '#noa-viewing', state: 'Noa ja public viewing viewing, desktop, reduced motion, real time', reducedMotion: true, realtime: true }, @@ -317,7 +317,8 @@ async function captureRealtime(binary, shots, results = []) { for (let i = 0; i < 150 && !loaded; i++) await sleep(100); if (!loaded) throw new Error(`Real-time capture: ${shot.file} did not finish loading`); await sleep(1200); - if (shot.openDetails) await openDetails(shot.openDetails); + // A disclosure nested in a folded one is opened after its parent: pass the selectors outermost first. + for (const selector of [].concat(shot.openDetails || [])) await openDetails(selector); if (shot.fullPage) { await evaluate(`(async () => { const h = document.documentElement.scrollHeight; for (let y = 0; y < h; y += innerHeight / 2) { scrollTo({ top: y, behavior: 'instant' }); await new Promise(r => setTimeout(r, 120)); } scrollTo({ top: 0, behavior: 'instant' }); })()`); await sleep(800); diff --git a/scripts/verify-conversion-path.py b/scripts/verify-conversion-path.py index 7579b17..21045fe 100644 --- a/scripts/verify-conversion-path.py +++ b/scripts/verify-conversion-path.py @@ -47,9 +47,11 @@ def handle(route): page=context.new_page();page.on('pageerror',lambda error:errors.append(str(error))) page.set_default_timeout(7000) try: - # Actual home -> record -> scoped offer -> contextual inquiry. + # Actual home -> record -> scoped offer -> contextual inquiry. The records sit in the home fold, + # so the visitor opens it first, as they would. page.goto(BASE+prefix+'/',wait_until='networkidle') - page.locator(f'a[href="{prefix}/work/#noa"]').click() + page.locator('details.rd-kept--home > summary').click() + page.locator(f'.rd-records a[href="{prefix}/work/#noa"]').click() expect(page.locator('#noa .work-consult')).to_be_visible() page.screenshot(path=str(OUT/f'work-{language}-{width}.png'),full_page=False) page.locator(f'#noa a[href="{prefix}/services/#ai-character"]').click() diff --git a/scripts/verify_home_v4.py b/scripts/verify_home_v4.py index ce5a427..c4516d1 100644 --- a/scripts/verify_home_v4.py +++ b/scripts/verify_home_v4.py @@ -296,7 +296,12 @@ def assert_home_v4(page, *, interactive=True): expect(page.locator('[data-rd-clock]')).to_be_hidden() expect(page.locator('#main-nav')).to_be_visible() expect(reel).to_be_visible() + # Access, FAQ and records sit in one native disclosure (2026-10-19): it opens without script. + fold = page.locator('details.rd-kept--fold > summary') + expect(fold).to_be_visible() + fold.click() expect(page.locator('#access details summary')).to_be_visible() + expect(page.locator('#faq')).to_be_visible() return {'products': checked, 'javascript': False, 'native_reel': True, 'network': _home_requests(page), 'geometry': no_overflow(page)} diff --git a/src/home-flagship.mjs b/src/home-flagship.mjs index e923569..99d614b 100644 --- a/src/home-flagship.mjs +++ b/src/home-flagship.mjs @@ -87,7 +87,7 @@ export function renderAccess(products, lang) { const c = p[lang]; return `
ACCESS AT A GLANCE
${t('7つとも自主開発です。今の状態、成果物、ライセンス、入口を、ひとつの表に。
言えないことは、ここにも書きません。', 'All seven are built here. Stage, result, license and entry point in one table.
What has not been verified is not claimed here either.')}
| ${esc(h)} | `).join('')}
|---|
${t('各製品の動作条件・未検証の範囲は、製品ページと検証資料に記載しています。実運用の性能や安全性を保証するものではありません。', 'Setup requirements and unverified scope are stated on each product page and in its evidence. This is not a guarantee of production performance or safety.')}
ACCESS AT A GLANCE
${t('状態・成果物・ライセンス・入口を、ひとつの表に。', 'Stage, result, license and entry point in one table.')}
| ${esc(h)} | `).join('')}
|---|
${t('各製品の動作条件・未検証の範囲は、製品ページと検証資料に記載しています。実運用の性能や安全性を保証するものではありません。', 'Setup requirements and unverified scope are stated on each product page and in its evidence. This is not a guarantee of production performance or safety.')}
${esc(a)}
BEFORE YOU ASK
${t('答えにくいものほど、先に書いておきます。
もっと具体的な話は、相談から。', 'The awkward ones first.
Anything more specific: start a conversation.')}
BEFORE YOU ASK
${t('もっと具体的な話は、相談から。', 'Anything more specific: start a conversation.')}
${t('開発を相談する', 'Start a conversation')} ${arrow}${esc(body)}
${esc(body)}
${c.lead}
${esc(r.productsKicker)}
${c.productsLead}
${esc(c.sourceNote(sourcesCheckedAt))}
${esc(r.keptKicker)}
${kept.join('')}${esc(r.productsKicker)}
${c.productsLead}
${esc(c.sourceNote(sourcesCheckedAt))}
${esc(r.servicesKicker)}
${esc(c.servicesLead)}
${esc(r.contactKicker)}
${c.contactLead}