From 7ea7ef1b3cfd15e1fdd095c4b5534d0a792a4330 Mon Sep 17 00:00:00 2001 From: FORIFOR Date: Mon, 19 Oct 2026 00:16:21 +0900 Subject: [PATCH 1/3] fix: readable header, shorter product pages, and corrected Noa/Genie facts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Header turns into a solid bar once the page scrolls, slides away while reading down and returns on scroll up or keyboard focus, so section text no longer runs through the navigation. - Product pages lead with the product's own try link and the film; the older long-form sections are folded behind one "くわしく見る" row (deep links open it). Oathra keeps them open because its film links in. - Repeated scope/proof notes and the "公開情報の確認日" lines are shown once or removed. - Noa: product card no longer claims a public GitHub record; /about/ says every project except Noa publishes its code; English pages say "Noa". - Genie orbit copy no longer implies Genie produced the planet HTML (the final version was made with Codex). - Contact: Noa is selectable under the general topic; Launchloom gets a "自分の製品で使いたい" entry with its own message template. - Home film poster is now a product frame instead of the hero headline. - Film caption no longer overflows the right edge. - ui-capture: shots for the scrolled header, the fold and the Launchloom hero. Co-Authored-By: Claude Opus 5.5 --- public/assets/inquiry-context.mjs | 11 +++++++++-- public/assets/redesign.mjs | 17 +++++++++++++++++ public/media/films/manifest.json | 6 +++--- public/media/films/reachmade-15s.jpg | Bin 35149 -> 25902 bytes scripts/build-core.mjs | 17 ++++++++++------- scripts/ui-capture.mjs | 12 ++++++++++++ src/genie-lp.mjs | 2 +- src/home-flagship.mjs | 2 +- src/home-v4-copy.mjs | 4 ++-- src/inquiry-page.mjs | 2 +- src/outcome-first.mjs | 6 +++--- src/owned-guides.mjs | 2 +- src/product-landings.mjs | 8 ++++---- src/redesign-copy.mjs | 12 ++++++------ src/redesign.mjs | 11 +++++++---- src/redesign/redesign.css | 25 ++++++++++++++++++++++++- src/showcase.mjs | 4 ++-- src/site-content.mjs | 2 +- tests/home-v4.test.mjs | 5 ++--- tests/noa.test.mjs | 2 +- tests/product-landings.test.mjs | 2 +- 21 files changed, 108 insertions(+), 44 deletions(-) diff --git a/public/assets/inquiry-context.mjs b/public/assets/inquiry-context.mjs index e9a8a89..121bf24 100644 --- a/public/assets/inquiry-context.mjs +++ b/public/assets/inquiry-context.mjs @@ -8,20 +8,27 @@ const services = Object.freeze({ 'ai-character': ['AIキャラクターの実現性検証','AI character feasibility'], }); -export const inquiryContextIds = Object.freeze([...Object.keys(products).map(id=>`product-${id}`), ...Object.keys(services).map(id=>`service-${id}`)]); +// Visitors who want to use a product themselves, rather than commission work. +const uses = Object.freeze({launchloom:['Launchloom','launchloom']}); + +export const inquiryContextIds = Object.freeze([...Object.keys(products).map(id=>`product-${id}`), ...Object.keys(services).map(id=>`service-${id}`), ...Object.keys(uses).map(id=>`use-${id}`)]); export function inquiryContext(hash = '', search = '', language = 'ja') { if (!['ja','en'].includes(language)) throw new TypeError('Unsupported inquiry language'); const ja = language === 'ja', params = new URLSearchParams(search); // Exact allowlisted fragments only. Unknown fragments never import URL text. // Older product/service query links remain usable, without adding new query links. - const fragment = /^#(product|service)-([a-z0-9-]+)$/.exec(hash); + const fragment = /^#(product|service|use)-([a-z0-9-]+)$/.exec(hash); const kind = fragment?.[1] || (params.has('product') ? 'product' : 'service'); const id = fragment?.[2] || params.get(kind); if (kind === 'product' && Object.hasOwn(products, id)) { const [name, useCase] = products[id]; return {id:`product-${id}`, useCase, label:ja?`${name}を見ての開発相談`:`A project inspired by ${name}`, message:ja?`${name}の技術を活かした開発について相談したいです。\n\n対象の業務・試したいこと:\n現在の状況:`:`I would like to discuss a project using the technology behind ${name}.\n\nWorkflow or experience to try:\nCurrent situation:`}; } + if (kind === 'use' && Object.hasOwn(uses, id)) { + const [name, useCase] = uses[id]; + return {id:`use-${id}`, useCase, label:ja?`${name}を自分の製品で使いたい`:`Using ${name} for my product`, message:ja?`${name}を自分の製品で使いたいです。\n\n紹介したい製品:\n欲しい素材(横動画・縦動画・LP・投稿案):`:`I would like to use ${name} for my own product.\n\nProduct to introduce:\nAssets I need (landscape film, vertical film, landing page, posts):`}; + } if (kind === 'service' && Object.hasOwn(services, id)) { const label = services[id][ja ? 0 : 1]; return {id:`service-${id}`, useCase:'custom', label, message:ja?`相談テーマ:${label}\n\n試したい場面:\nAIに任せたいこと:\n人が確認すること:\n時期・現在の状況(任意):`:`Topic: ${label}\n\nScenario to try:\nWhat AI should handle:\nWhat a person should review:\nTiming / current situation (optional):`}; diff --git a/public/assets/redesign.mjs b/public/assets/redesign.mjs index 4d8dd26..8a0fede 100644 --- a/public/assets/redesign.mjs +++ b/public/assets/redesign.mjs @@ -13,9 +13,16 @@ if (root?.dataset.rd) { const bar = document.querySelector('.rd-progress'); const reels = $$('[data-rd-reel]').map(section => ({section, frame: section.querySelector('[data-rd-frame]'), from: Number(section.dataset.rdFilmScale || .5)})); const scaleOn = () => !reduced && matchMedia('(min-width:760px)').matches; + const header = document.querySelector('[data-rd-header]'); + let lastY = doc.scrollTop; let ticking = false; const onScroll = () => { ticking = false; + const y = doc.scrollTop; + if (header) { + header.toggleAttribute('data-rd-scrolled', y > 24); + if (Math.abs(y - lastY) > 6) { header.toggleAttribute('data-rd-hidden', y > lastY && y > innerHeight * .6); lastY = y; } + } const h = doc.scrollHeight - doc.clientHeight; if (bar) bar.style.transform = `scaleX(${h > 0 ? Math.min(1, doc.scrollTop / h) : 0})`; for (const {section, frame, from} of reels) { @@ -33,6 +40,16 @@ if (root?.dataset.rd) { addEventListener('resize', requestScroll); onScroll(); + /* A link into a folded section opens it first, so the browser can scroll to the target. */ + const unfold = () => { + const id = decodeURIComponent(location.hash.slice(1)); + const target = id ? document.getElementById(id) : null; + const fold = target?.closest('details:not([open])'); + if (fold) { fold.open = true; target.scrollIntoView({block: 'start'}); } + }; + addEventListener('hashchange', unfold); + unfold(); + /* Tokyo clock (home) */ const clock = document.querySelector('[data-rd-clock]'); if (clock) { diff --git a/public/media/films/manifest.json b/public/media/films/manifest.json index 064dc3b..f618d4d 100644 --- a/public/media/films/manifest.json +++ b/public/media/films/manifest.json @@ -13,11 +13,11 @@ }, { "path": "/media/films/reachmade-15s.jpg", - "bytes": 35149, - "sha256": "e47a3277d38ef1faf603911bfed7aa7a9e1dbad89e87e263558233fd7fa524ae", + "bytes": 25902, + "sha256": "5f8ee66c42afd6d4ff6554cbc56f5a33ebb87296baa9b3ec0934945095cc2ca4", "source": "/media/films/reachmade-15s.mp4", "sourceSha256": "3235a87ff28db57b8c8256f73793bde1c90c27accca6a2cbebdcfb1b62bdfd24", - "render": "ffmpeg -ss 3.2 -frames:v 1 -vf scale=1280:-1 -q:v 3" + "render": "ffmpeg -ss 4.6 -frames:v 1 -vf scale=1280:-1 -q:v 3" }, { "path": "/media/films/oathra-15s.mp4", diff --git a/public/media/films/reachmade-15s.jpg b/public/media/films/reachmade-15s.jpg index 57153c7e389b0bd315c7f785979af528d19c9287..f04587e7be0a28c6d45229528f30e3bcdd28862a 100644 GIT binary patch literal 25902 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 z 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 literal 35149 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 iLHh4G|3={72>cs?e String(s).replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); +const nameIn = (p, lang) => lang === 'en' && p.id === 'noa' ? 'Noa' : p.name; const productTotal = String(products.length).padStart(2, '0'); const strip = s => String(s).replace(//g,' ').replace(/<[^>]*>/g,''); const pageKeys = ['home','products','services','work','about','contact','privacy']; @@ -82,19 +83,19 @@ function pageIntro(label,title,lead,extra='') { function productIllustration(p,lang) { const t=p[lang]; if (p.preview) { - return `

${e(t.previewLabel)}
${lang==='ja'?'実際の画面記録':'Recorded product screen'}${lang==='ja'?'GitHub公開記録から':'From a public GitHub record'}
`; + return `
${e(t.previewLabel)}
${p.closedSource?`${lang==='ja'?'紹介映像':'Introduction film'}${lang==='ja'?'画面は再現':'Recreated screens'}`:`${lang==='ja'?'実際の画面記録':'Recorded product screen'}${lang==='ja'?'GitHub公開記録から':'From a public GitHub record'}`}
`; } const sub=lang==='ja'?'公開資料に基づく、設計の要約':'Design summary from the public documentation'; const parts=t.outcome.split(' → '); - return `
${p.discipline}${p.index} / ${productTotal}
${icon(p.id)}${p.name}
${parts.map((s,i)=>`${e(s)}${i':''}`).join('')}
${sub}
`; + return `
${p.discipline}${p.index} / ${productTotal}
${icon(p.id)}${nameIn(p,lang)}
${parts.map((s,i)=>`${e(s)}${i
${sub}
`; } function productRow(p,lang,full=false) { const c=copy[lang],t=p[lang],n=productNavigation(p,lang); - return `
${productIllustration(p,lang)}
${p.index} — ${p.name}${t.status}
${t.headline}

${t.description}

${p.labSite?link(n.site,c.productSite,'button button-outline'):''}${link(n.demo,n.demoLabel,'button button-outline')}${link(p.repo,'GitHub','text-link')}

${t.scope}

${full?`
${lang==='ja'?'検証・導入条件を確認する':'Evidence & reuse conditions'}

${c.proof}

${t.proof}

${lang==='ja'?'再利用の条件':'Reuse conditions'}

${t.license}

${lang==='ja'?'この技術を活かせる相談':'Potential project scope'}

${t.consult}

`:''}
`; + return `
${productIllustration(p,lang)}
${p.index} — ${nameIn(p,lang)}${t.status}
${t.headline}

${t.description}

${p.labSite?link(n.site,c.productSite,'button button-outline'):''}${link(n.demo,n.demoLabel,'button button-outline')}${link(p.repo,'GitHub','text-link')}

${t.scope}

${full?`
${lang==='ja'?'検証・導入条件を確認する':'Evidence & reuse conditions'}

${c.proof}

${t.proof}

${lang==='ja'?'再利用の条件':'Reuse conditions'}

${t.license}

${lang==='ja'?'この技術を活かせる相談':'Potential project scope'}

${t.consult}

`:''}
`; } function compactProduct(p,lang) { const c=copy[lang],t=p[lang]; - return `
${p.index} — ${e(p.name)}${e(t.status)}

${e(t.short)}

${e(t.description)}

${p.labSite?link(productNavigation(p,lang).site,c.productSite):''}${link(p.repo,'GitHub')}
`; + return `
${p.index} — ${e(nameIn(p,lang))}${e(t.status)}

${e(t.short)}

${e(t.description)}

${p.labSite?link(productNavigation(p,lang).site,c.productSite):''}${link(p.repo,'GitHub')}
`; } function home(lang,config) { const c=copy[lang]; @@ -119,12 +120,14 @@ function services(lang) { } function work(lang,config) { const c=copy[lang]; - return `${pageIntro('WORK NOTES',c.workTitle,c.workLead)}${caseStudies(products,lang)}

${c.workNote}
${lang==='ja'?'資料確認日':'Source review date'}: ${config.checkedAt}

${products.map(p=>``).join('')}
${contactCTA(lang,true)}`; + return `${pageIntro('WORK NOTES',c.workTitle,c.workLead)}${caseStudies(products,lang)}

${c.workNote}
${lang==='ja'?'資料確認日':'Source review date'}: ${config.checkedAt}

${products.map(p=>``).join('')}
${contactCTA(lang,true)}`; } function about(lang,config) { const c=copy[lang]; - const projectNames=products.map(p=>e(p.name)).join(lang==='ja'?'、':' · '); - const projectTrail=lang==='ja'?`${c.ownerText}${projectNames}。コードや設計、検証記録をGitHubで公開しています。`:`${c.ownerText}${projectNames}. Code, design notes, and evaluation records are published on GitHub.`; + const projectNames=products.map(p=>e(nameIn(p,lang))).join(lang==='ja'?'、':' · '); + const closed=products.filter(p=>p.closedSource).map(p=>e(nameIn(p,lang))); + const openTrail=closed.length?(lang==='ja'?`${closed.join('、')}以外は、コードと検証記録をGitHubで公開しています。`:`Code and evaluation records for all but ${closed.join(' and ')} are on GitHub.`):(lang==='ja'?'コードや設計、検証記録をGitHubで公開しています。':'Code, design notes, and evaluation records are published on GitHub.'); + const projectTrail=lang==='ja'?`${c.ownerText}${projectNames}。${openTrail}`:`${c.ownerText}${projectNames}. ${openTrail}`; return `${pageIntro('ABOUT REACHMADE',c.aboutTitle,c.aboutLead)}

${c.aboutBody}

${c.aboutBody2}

Reach / made

${c.identity}

THE PERSON BEHIND THE WORK

${e(config.owner)}

${c.ownerRole}

${projectTrail}

${link(config.github,lang==='ja'?'FORIFORのGitHubを見る':'Explore FORIFOR on GitHub','button button-outline')}

${c.aboutNotice}

${profileProof(lang)}

HOW WE BUILD

${c.philosophy}

${c.principles.map((x,i)=>`
0${i+1}

${x[0]}

${x[1]}

`).join('')}
${contactCTA(lang,true)}`; } function contact(lang,config) { diff --git a/scripts/ui-capture.mjs b/scripts/ui-capture.mjs index 225fd79..346f014 100644 --- a/scripts/ui-capture.mjs +++ b/scripts/ui-capture.mjs @@ -160,6 +160,16 @@ export const SHOTS = Object.freeze([ // renders too small to read, so the bands that carry the proof get their own frames. // Phone widths below the fold, because home-mobile-tall.png is unreadable as one image. // The fifteen-second film band (Japanese home only), desktop and phone. + // 2026-10-18: once scrolled, the header is a solid bar (it slid away on the way down and returns on the way up). + { file: 'header-solid-desktop.png', route: '/', width: 1440, height: 1000, scrollTo: '#products', scrollBack: 240, state: 'home, scrolled down then up 240px: solid header over the product list, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'header-solid-mobile.png', route: '/products/launchloom/', width: 390, height: 844, scrollTo: '#film', scrollBack: 240, state: 'phone, Launchloom scrolled down then up 240px: solid header, reduced motion, real time', reducedMotion: true, realtime: true }, + // Product long-form sections folded behind one summary row, closed and opened. + { file: 'product-fold-mobile.png', route: '/products/launchloom/', width: 390, height: 844, scrollTo: '.rd-kept--fold', state: 'phone, Launchloom folded detail row, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'product-fold-open.png', route: '/products/launchloom/', width: 1440, height: 1000, openDetails: '.rd-kept--fold', scrollTo: '.rd-kept--fold', state: 'Launchloom detail row opened by a click, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'product-consult-launchloom-mobile.png', route: '/products/launchloom/', width: 390, height: 844, scrollTo: '#consult', state: 'phone, Launchloom consult band with the use-it entry, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'product-launchloom-top.png', route: '/products/launchloom/', width: 1440, height: 1000, state: 'Launchloom hero: try link + film link, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'product-launchloom-top-mobile.png', route: '/products/launchloom/', width: 390, height: 844, state: 'phone, Launchloom hero: try link + film link, reduced motion, real time', reducedMotion: true, realtime: true }, + { file: 'products-index-noa.png', route: '/products/', width: 1440, height: 1000, scrollTo: '#noa', state: 'product index, Noa card caption, reduced motion, real time', reducedMotion: true, realtime: true }, ]); function candidates() { @@ -310,6 +320,8 @@ async function captureRealtime(binary, shots, results = []) { const found = await evaluate(`(() => { const e = document.querySelector(${JSON.stringify(shot.scrollTo)}); if (!e) return false; e.scrollIntoView({ block: 'start', behavior: 'instant' }); return true; })()`); if (!found) throw new Error(`Real-time capture: ${shot.file} has no ${shot.scrollTo}`); await sleep(1600); + // A short upward scroll, as a reader does, brings back the header that slid away. + if (shot.scrollBack) { await evaluate(`scrollBy({ top: -${Number(shot.scrollBack)}, behavior: 'instant' })`); await sleep(900); } } if (shot.assertVisible) { const visible = await evaluate(`(() => { const e = document.querySelector(${JSON.stringify(shot.assertVisible)}); if (!e) return false; const r = e.getBoundingClientRect(), s = getComputedStyle(e); return r.width > 0 && r.height > 0 && r.top < innerHeight && r.bottom > 0 && s.visibility !== 'hidden' && s.display !== 'none' && Number(s.opacity) > 0; })()`); diff --git a/src/genie-lp.mjs b/src/genie-lp.mjs index b28ff91..1ea4566 100644 --- a/src/genie-lp.mjs +++ b/src/genie-lp.mjs @@ -99,7 +99,7 @@ function demosSection() { } function artifactsSection() { - return `

03 · WHAT STAYS

答えは、
ファイルで持ち帰る。

Markdownを開き直す。小さなHTMLを動かす。実演でできたファイルを、ここから実際に開けます。

Genie-Next-Steps.mdMARKDOWN · 保存済み

この数字から、改善の優先順位を3つ教えて

  1. 初回行動への誘導:登録1,872人のうち初回行動は374人、到達率20.0%。次の一手:登録後のどの操作で離脱するか調べ、案内を改善する。
  2. 登録導線:訪問12,480人のうち登録は15.0%。次の一手:登録開始から完了までの離脱を測り、フォームや訴求を見直す。
  3. 集客の質:訪問は+24% this week。次の一手:流入元別に初回行動の到達率を比較し、成果につながる流入を増やす。

これは暫定順位です。離脱原因や各施策の改善効果は、この数字だけでは分かりません。

デモ用の架空データから作成Markdownを開く

orbit.htmlHTML · 操作できる作例

${img(FRAMES.orbit, 'glp-shot')}

「小さな宇宙にして」から生成 · 別タブで開きます${ext(`${O}orbit.html`, 'できたものを動かす')}

`; + return `

03 · WHAT STAYS

答えは、
ファイルで持ち帰る。

Markdownを開き直す。小さなHTMLを動かす。実演のファイルを、ここから開けます。

Genie-Next-Steps.mdMARKDOWN · 保存済み

この数字から、改善の優先順位を3つ教えて

  1. 初回行動への誘導:登録1,872人のうち初回行動は374人、到達率20.0%。次の一手:登録後のどの操作で離脱するか調べ、案内を改善する。
  2. 登録導線:訪問12,480人のうち登録は15.0%。次の一手:登録開始から完了までの離脱を測り、フォームや訴求を見直す。
  3. 集客の質:訪問は+24% this week。次の一手:流入元別に初回行動の到達率を比較し、成果につながる流入を増やす。

これは暫定順位です。離脱原因や各施策の改善効果は、この数字だけでは分かりません。

デモ用の架空データから作成Markdownを開く

orbit.htmlHTML · 操作できる作例

${img(FRAMES.orbit, 'glp-shot')}

完成版はCodexで作成 · 別タブで開きます${ext(`${O}orbit.html`, '動かしてみる')}

`; } function trustSection(p) { diff --git a/src/home-flagship.mjs b/src/home-flagship.mjs index 0d11485..e923569 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 `${esc(p.index)}${esc(p.name)}${esc(c.outcome)}${esc(c.status)}${esc(c.license)}${t('詳しく見る', 'Open')} ${arrow}`; }).join(''); - return `

ACCESS AT A GLANCE

${t('「試せるのか」に、
先に答える。', 'Can you actually
try it? Yes — here.')}

${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.')}

${heads.map(h => ``).join('')}${rows}
${t('プロダクトごとの状態・ライセンス・入口の一覧', 'Stage, license and entry point for each product')}
${esc(h)}

${t('公開情報の確認日は2026年9月15日です。各製品の動作条件・未検証の範囲は、製品ページと検証資料に記載しています。実運用の性能や安全性を保証するものではありません。', 'Public sources were checked on 15 September 2026. 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.')}

`; + return `

ACCESS AT A GLANCE

${t('「試せるのか」に、
先に答える。', 'Can you actually
try it? Yes — here.')}

${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.')}

${heads.map(h => ``).join('')}${rows}
${t('プロダクトごとの状態・ライセンス・入口の一覧', 'Stage, license and entry point for each product')}
${esc(h)}

${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.')}

`; } const QUESTIONS = { diff --git a/src/home-v4-copy.mjs b/src/home-v4-copy.mjs index 64561b0..2d50dd9 100644 --- a/src/home-v4-copy.mjs +++ b/src/home-v4-copy.mjs @@ -35,7 +35,7 @@ export const homeV4Copy = { ['新しいAIプロダクトの試作','まだ言葉だけのアイデアを、操作できる試作へ。使い勝手と成立条件を確かめ、次に作る範囲を整理します。','関連 — 複数プロダクトの自主開発経験'] ], productsKicker: '自主開発プロダクト', productsTitle: 'あなたの仕事に、
つながるものを。', productsLead: 'できることから選んで、実物を確かめる。
試せる範囲と、必要な準備も一緒に。', - sourceNote: date => `公開情報の確認日 ${date}。各製品は独立しており、自動連携しません。最新の利用条件は製品ページをご確認ください。`, + sourceNote: () => '各製品は独立しており、自動連携しません。', principlesKicker: 'REACHMADEのつくり方', principlesTitle: 'つくるだけでなく、
確かめるところまで。', principlesLead: '自主開発で得た知見を、次の開発へ。
コード、実物、検証記録を公開しています。', about: 'ラボ・開発者について', work: '開発・検証記録を見る', principles: [ @@ -80,7 +80,7 @@ export const homeV4Copy = { ['New AI product prototypes','Turn a spoken idea into something you can operate. Test how it works and what it requires, then decide what to build next.','Related — experience building independent products'] ], productsKicker: 'INDEPENDENT PRODUCTS', productsTitle: 'Find a tool
for your work.', productsLead: 'Choose by what it does, then inspect the real work.
See what you can try and what you need to prepare.', - sourceNote: date => `Public sources checked ${date}. Each product is independent; they do not connect automatically. Check the product pages for current requirements.`, + sourceNote: () => 'Each product is independent; they do not connect automatically.', principlesKicker: 'HOW REACHMADE BUILDS', principlesTitle: 'Build it.
Then check it.', principlesLead: 'What we learn from our own products informs the next project.
We share code, working examples and verification records.', about: 'About the lab and developer', work: 'Read the development records', principles: [ diff --git a/src/inquiry-page.mjs b/src/inquiry-page.mjs index 95ff98b..852546c 100644 --- a/src/inquiry-page.mjs +++ b/src/inquiry-page.mjs @@ -7,7 +7,7 @@ export function renderInquiry(language) { const t=(a,b)=>ja?a:b; return `

LET’S MAKE SOMETHING

${t('どんな仕事を、変えたいですか。','What would you like to change?')}

${t('まだ仕様がなくても大丈夫です。課題や試してみたいことから、相談してください。','Start with the problem or an experience you would like to try. A finished specification is not required.')}

-
${inquiryContextIds.map(id=>``).join('')}
${t('ご相談の内容','Inquiry details')}

${t('送信ボタンを押すまで、入力内容は送信しません。受付後は運営者が対応のために確認します。自動返信メールは送信されません。','Your input is not transmitted until you press Send. The operator reviews accepted inquiries for follow-up. No automatic confirmation email is sent.')} ${t('情報の取り扱い','Privacy information')}

${t('受付への接続を確認しています。','Checking the inquiry connection.')}

`; +
${inquiryContextIds.map(id=>``).join('')}
${t('ご相談の内容','Inquiry details')}

${t('送信ボタンを押すまで、入力内容は送信しません。受付後は運営者が対応のために確認します。自動返信メールは送信されません。','Your input is not transmitted until you press Send. The operator reviews accepted inquiries for follow-up. No automatic confirmation email is sent.')} ${t('情報の取り扱い','Privacy information')}

${t('受付への接続を確認しています。','Checking the inquiry connection.')}

`; } export async function writeInquiryPages(dist) { for (const language of ['ja','en']) { diff --git a/src/outcome-first.mjs b/src/outcome-first.mjs index e42607e..7800c0b 100644 --- a/src/outcome-first.mjs +++ b/src/outcome-first.mjs @@ -14,7 +14,7 @@ export function renderRecordedResult(lang, video=true){ // frame with its caption localized (scripts/make-poster-en.py); the recording itself // is untouched, so the scope line below says so instead of hiding it. const poster=ja?`${prefix}genie-orbit-poster.jpg`:'/media/derived/genie/orbit-poster-en.jpg'; - const visual=video?``:`${t('Genieの実演で作った惑星のHTML作例','The interactive planet artifact from the Genie demonstration')}`; + const visual=video?``:`${t('実演に登場する惑星のHTML作例。完成版はCodexで作成','The planet HTML shown in the Genie demonstration; the final version was made with Codex')}`; return `
GENIE / FROM REQUEST TO ARTIFACT${t('実演と、保存した結果','A recording. A saved result.')}
${visual}

FROM A SKETCH TO A LITTLE UNIVERSE

${t('この落書き、動きます。','That sketch? It moves.')}

${t('作成の流れを見て、できたHTMLをそのまま操作。','Watch how it was made. Open the HTML and explore it.')}

${t('実アプリの公開実演と、その保存済み作例です。架空の入力を使用し、待ち時間・操作を編集しています。ここで新しいAI生成は行いません。','An original published app demonstration and its saved example. Fictional inputs; actions and waiting are edited. This page does not run a new AI generation. The recording is in Japanese — English captions are on by default, and the saved artifact is Japanese too.')}

`; } export function renderOutcomeHero(lang){ @@ -33,7 +33,7 @@ const subtitles={ noa:['星藍ノア / ゲームも会話も楽しむAIキャラクター','Meet Noa, an AI gamer and streaming character'] }; export const DIRECT_STARTS=Object.freeze({ - genie:{url:'/media/originals/genie/orbit.html',enUrl:'/media/originals/genie/orbit.html',ja:['実演で作ったものを動かす','保存済みのHTMLを開きます。新しいAI実行ではありません。'],en:['Open the recorded artifact','Opens the saved Japanese HTML example, not a new AI run.']}, + genie:{url:'/media/originals/genie/orbit.html',enUrl:'/media/originals/genie/orbit.html',ja:['実演のHTMLを動かす','保存済みのHTMLを開きます。'],en:['Open the demo HTML','Opens the saved Japanese HTML example.']}, 'ai-meeting':{url:'https://ai-meeting.web.app/#tasks',ja:['登録なしでタスクを試す','文字入力のタスク画面。音声体験は別条件です。'],en:['Try a task without signing up','Japanese text task UI. Voice has separate access conditions.']}, oathra:{url:'https://forifor.github.io/oathra/check.html',ja:['サンプルの根拠を照合する','公開サンプルの検証。電話は発信しません。'],en:['Inspect a sample transcript','Public sample verification. No phone call is placed.']}, aisecure:{url:'https://forifor.github.io/AISecure/try.html',ja:['合成ログの調査を試す','合成データのデモ。実環境の監視・遮断は行いません。'],en:['Investigate a synthetic case','Synthetic-data demo. No monitoring or enforcement.']}, @@ -71,7 +71,7 @@ export function enhanceOutcomePage(html,id,lang){ if(id==='genie'){ const marker='