Unify HyperTwist public release reference surfaces
This commit is contained in:
parent
0c895c7890
commit
5021f030ca
8 changed files with 310 additions and 77 deletions
|
|
@ -760,3 +760,56 @@ Latest website and dependency hardening follow-up later on `2026-06-23`:
|
|||
- current package and auth-server posture is more explicit
|
||||
- unresolved third-party dependency residue is documented honestly instead
|
||||
of being silently ignored
|
||||
|
||||
Latest shared-release-bundle follow-up on `2026-06-25`:
|
||||
|
||||
- the public website now carries a reusable shared release-reference bundle
|
||||
across the full operator-facing public route family:
|
||||
- homepage
|
||||
- about
|
||||
- features
|
||||
- resources
|
||||
- docs
|
||||
- support
|
||||
- changelog
|
||||
- pricing
|
||||
- download
|
||||
- open-source notices
|
||||
- privacy
|
||||
- terms
|
||||
- shipping/payment
|
||||
- that shared bundle keeps public docs, release notes, corresponding source,
|
||||
public repo/notices reference, and support contact visible together instead
|
||||
of requiring operators to reconstruct the release follow-through path from
|
||||
scattered footer or page-local fragments
|
||||
- the same follow-up also removed duplicated public release-manifest
|
||||
resolution logic from `PricingPage` and `DownloadPage` by routing both
|
||||
through the shared `usePublicReleaseManifestView()` helper already used by
|
||||
the rest of the public route family
|
||||
- focused validation for that continuation stayed green under:
|
||||
- `npm --prefix website test -- --run src/__tests__/public-marketing-pages.test.tsx`
|
||||
- `1` file passed
|
||||
- `12` tests passed
|
||||
- the broader owned website/runtime/server umbrella then also stayed green
|
||||
again under:
|
||||
- `scripts/run-hypertwist-web-surface-validation.sh`
|
||||
- focused website route/auth/release validation: `12` files, `64` tests
|
||||
passed
|
||||
- `npm --prefix website run build`
|
||||
- `npm --prefix website/server run type-check`
|
||||
- `npm --prefix website/server test -- --run`
|
||||
- `10` website/server files passed, `36` tests passed
|
||||
- `npm --prefix Content/Browser run verify:shell`
|
||||
- `npm --prefix Content/Browser run build`
|
||||
- `website/` and `Content/Browser/` production audits: `found 0
|
||||
vulnerabilities`
|
||||
- `website/server` again retained only the already-documented upstream
|
||||
`supertokens-node -> nodemailer` residual advisory
|
||||
- the HyperTwist-owned structural loop remained clean on the same packet:
|
||||
- `scripts/run-hypertwist-sentrux-source-only.sh`
|
||||
- `Quality: 6210`
|
||||
- all `7` rules pass
|
||||
- `scripts/run-hypertwist-gitnexus-analyze.sh`
|
||||
- `16,253` nodes, `38,116` edges, `665` clusters, `300` flows
|
||||
- `scripts/run-hypertwist-gitnexus-status.sh`
|
||||
- bounded mirror `Status: up-to-date`
|
||||
|
|
|
|||
|
|
@ -797,3 +797,54 @@ Current audit note:
|
|||
|
||||
- `C:\HyperTwist\docs\ops\HYPERTWIST_UNREAL_INPUT_AND_XR_COMPLETENESS_AUDIT_2026-06-22.md`
|
||||
- `C:\HyperTwist\docs\ops\HYPERTWIST_NATIVE_XR_HOST_AND_PLUGIN_DECISION_PACKET_2026-06-24.md`
|
||||
|
||||
## Latest public/manual follow-up (`2026-06-25`)
|
||||
|
||||
- the public website now carries one shared release-reference bundle across the
|
||||
major operator-facing public routes:
|
||||
- homepage
|
||||
- about
|
||||
- features
|
||||
- resources
|
||||
- docs
|
||||
- support
|
||||
- changelog
|
||||
- pricing
|
||||
- download
|
||||
- open-source notices
|
||||
- privacy
|
||||
- terms
|
||||
- shipping/payment
|
||||
- that shared bundle keeps public docs, release notes, corresponding source,
|
||||
public repo/notices reference, and support contact visible as one coherent
|
||||
launch surface instead of fragmenting release follow-through by page
|
||||
- `PricingPage` and `DownloadPage` now also consume the shared
|
||||
`usePublicReleaseManifestView()` helper rather than duplicating public
|
||||
release-manifest resolution logic locally
|
||||
- focused public/manual validation stayed green under:
|
||||
- `npm --prefix website test -- --run src/__tests__/public-marketing-pages.test.tsx`
|
||||
- `1` test file passed
|
||||
- `12` tests passed
|
||||
- the owned umbrella gate stayed green again under:
|
||||
- `scripts/run-hypertwist-web-surface-validation.sh`
|
||||
- focused website route/auth/release validation: `12` files, `64` tests
|
||||
passed
|
||||
- `npm --prefix website run build`
|
||||
- `npm --prefix website/server run type-check`
|
||||
- `npm --prefix website/server test -- --run`
|
||||
- `10` website/server files passed, `36` tests passed
|
||||
- `npm --prefix Content/Browser run verify:shell`
|
||||
- `npm --prefix Content/Browser run build`
|
||||
- `website/` and `Content/Browser/` production audits: `found 0
|
||||
vulnerabilities`
|
||||
- `website/server` retained only the already-documented upstream
|
||||
`supertokens-node -> nodemailer` residual advisory
|
||||
- the HyperTwist-owned structural loop also stayed healthy after that same
|
||||
packet:
|
||||
- `scripts/run-hypertwist-sentrux-source-only.sh`
|
||||
- `Quality: 6210`
|
||||
- all `7` rules pass
|
||||
- `scripts/run-hypertwist-gitnexus-analyze.sh`
|
||||
- `16,253` nodes, `38,116` edges, `665` clusters, `300` flows
|
||||
- `scripts/run-hypertwist-gitnexus-status.sh`
|
||||
- bounded mirror `Status: up-to-date`
|
||||
|
|
|
|||
|
|
@ -251,6 +251,9 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText('Protected entitlement handoff')).toBeTruthy()
|
||||
expect(screen.getByText('Distribution doctrine')).toBeTruthy()
|
||||
expect(screen.getByText('Public pages are distribution surfaces')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy()
|
||||
expect(screen.getByText('Pair desktop access to the browser account')).toBeTruthy()
|
||||
expect(await screen.findByText('Version: 1.0.0')).toBeTruthy()
|
||||
expect(screen.getByText('SHA-256: abc123')).toBeTruthy()
|
||||
|
|
@ -416,6 +419,8 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getAllByText(/public auth runtime posture/i).length).toBeGreaterThan(0)
|
||||
expect(screen.getByText('Current packaged desktop proof')).toBeTruthy()
|
||||
expect(screen.getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy()
|
||||
expect(screen.getByText('How a real first session flows')).toBeTruthy()
|
||||
expect(screen.getByText('Choose the right HyperTwist surface')).toBeTruthy()
|
||||
expect(screen.getByText('Move into the protected dashboard')).toBeTruthy()
|
||||
|
|
@ -540,6 +545,8 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText('About-page launch and release posture')).toBeTruthy()
|
||||
expect(screen.getByText('Current packaged desktop proof')).toBeTruthy()
|
||||
expect(screen.getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy()
|
||||
})
|
||||
|
||||
it('renders the public feature atlas with capability tiers and route-aware metadata', async () => {
|
||||
|
|
@ -653,6 +660,8 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText('Public feature and launch posture')).toBeTruthy()
|
||||
expect(screen.getByText('Current packaged desktop proof')).toBeTruthy()
|
||||
expect(screen.getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy()
|
||||
expect(document.title).toBe('HyperTwist features | HyperTwist')
|
||||
expect(document.head.querySelector('meta[property="og:url"]')?.getAttribute('content')).toBe('https://hypertwist.app/features')
|
||||
})
|
||||
|
|
@ -833,6 +842,9 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText('Owns recognition, replay, coaching, and packaged training behavior')).toBeTruthy()
|
||||
expect(screen.getByText('Commercial distribution doctrine')).toBeTruthy()
|
||||
expect(screen.getByText('Public pages are distribution surfaces')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy()
|
||||
expect(screen.getByText('Terms of access in practice')).toBeTruthy()
|
||||
expect(screen.getByText('Access model')).toBeTruthy()
|
||||
const checkoutLinks = screen.getAllByRole('link', { name: /open paddle checkout/i })
|
||||
|
|
@ -927,6 +939,8 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText('Current support-facing launch posture')).toBeTruthy()
|
||||
expect(screen.getByText('Current packaged desktop proof')).toBeTruthy()
|
||||
expect(screen.getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy()
|
||||
expect(screen.getByText('Digital delivery workflow')).toBeTruthy()
|
||||
expect(screen.getByText('Post-install operator workflow')).toBeTruthy()
|
||||
expect(screen.getByText('Privacy and compliance boundary')).toBeTruthy()
|
||||
|
|
@ -1052,6 +1066,8 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText('Deployment readiness snapshot')).toBeTruthy()
|
||||
expect(screen.getAllByText('XR groundwork exists, but the full VR lane is not finished').length).toBeGreaterThan(0)
|
||||
expect(screen.getByText('Higher-dimensional runtime ownership')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy()
|
||||
})
|
||||
|
||||
it('renders the public operator manual on the docs page', async () => {
|
||||
|
|
@ -1142,6 +1158,8 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText('If the desktop app is primary, why keep the web version?')).toBeTruthy()
|
||||
expect(screen.getByText(/intentionally narrower than the simulator for training and device\/runtime work/i)).toBeTruthy()
|
||||
expect(screen.getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy()
|
||||
expect(await screen.findByRole('link', { name: /open public docs portal/i })).toBeTruthy()
|
||||
})
|
||||
|
||||
|
|
@ -1251,6 +1269,8 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText(/Pair the release note with the current packaged-validation summary/i)).toBeTruthy()
|
||||
expect(screen.getByText('Current packaged desktop proof')).toBeTruthy()
|
||||
expect(screen.getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(screen.getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy()
|
||||
expect(await screen.findByRole('link', { name: /open release feed/i })).toBeTruthy()
|
||||
expect(document.title).toBe('HyperTwist release notes | HyperTwist')
|
||||
expect(document.head.querySelector('meta[property=\"og:url\"]')?.getAttribute('content')).toBe('https://hypertwist.app/changelog')
|
||||
|
|
@ -1353,6 +1373,9 @@ describe('public marketing pages', () => {
|
|||
const noticesView = renderWithProviders(<OpenSourceNoticesPage />, ['/open-source-notices'])
|
||||
expect(within(noticesView.container).getByText('Distribution doctrine')).toBeTruthy()
|
||||
expect(within(noticesView.container).getByText('Public pages are distribution surfaces')).toBeTruthy()
|
||||
expect(within(noticesView.container).getByText('Release and source references')).toBeTruthy()
|
||||
expect((await within(noticesView.container).findAllByRole('link', { name: 'https://hypertwist.app/open-source/source.zip' })).length).toBeGreaterThan(0)
|
||||
expect((await within(noticesView.container).findAllByRole('link', { name: 'https://github.com/hypertwist/hypertwist' })).length).toBeGreaterThan(0)
|
||||
expect(within(noticesView.container).getByText('Choose the right HyperTwist surface')).toBeTruthy()
|
||||
expect(within(noticesView.container).getByText('Current packaged desktop proof')).toBeTruthy()
|
||||
expect(within(noticesView.container).getByText('Packaged validation passed')).toBeTruthy()
|
||||
|
|
@ -1366,6 +1389,8 @@ describe('public marketing pages', () => {
|
|||
expect(within(privacyView.container).getByText('Support-safe escalation boundary')).toBeTruthy()
|
||||
expect(within(privacyView.container).getByText('Current packaged desktop proof')).toBeTruthy()
|
||||
expect(within(privacyView.container).getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(within(privacyView.container).getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(within(privacyView.container).getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy()
|
||||
|
||||
const termsView = renderWithProviders(<TermsPage />, ['/terms'])
|
||||
expect(within(termsView.container).getByText('Terms in practice')).toBeTruthy()
|
||||
|
|
@ -1376,12 +1401,16 @@ describe('public marketing pages', () => {
|
|||
expect(within(termsView.container).getByText('Release and redistribution checklist')).toBeTruthy()
|
||||
expect(within(termsView.container).getByText('Current packaged desktop proof')).toBeTruthy()
|
||||
expect(within(termsView.container).getByText('Packaged validation passed')).toBeTruthy()
|
||||
expect(within(termsView.container).getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(within(termsView.container).getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy()
|
||||
|
||||
const shippingPaymentView = renderWithProviders(<ShippingPaymentPage />, ['/shipping-payment'])
|
||||
expect(within(shippingPaymentView.container).getByText('Digital delivery workflow')).toBeTruthy()
|
||||
expect(within(shippingPaymentView.container).getByText('Protected entitlement handoff')).toBeTruthy()
|
||||
expect(within(shippingPaymentView.container).getByText('What happens after access is granted')).toBeTruthy()
|
||||
expect(within(shippingPaymentView.container).getByText('Choose the right HyperTwist surface')).toBeTruthy()
|
||||
expect(within(shippingPaymentView.container).getByText('Release references and source availability')).toBeTruthy()
|
||||
expect(within(shippingPaymentView.container).getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy()
|
||||
expect(within(shippingPaymentView.container).getByText('Terms of access in practice')).toBeTruthy()
|
||||
expect(within(shippingPaymentView.container).getByText('Distribution doctrine')).toBeTruthy()
|
||||
expect(within(shippingPaymentView.container).getByText('Release and redistribution checklist')).toBeTruthy()
|
||||
|
|
|
|||
|
|
@ -322,6 +322,94 @@ export function PublicPackagedDesktopProofSection({
|
|||
)
|
||||
}
|
||||
|
||||
export function ReleaseAuthorityBundleSection({
|
||||
releaseManifest,
|
||||
title = 'Release references and source availability',
|
||||
description = 'Treat public docs, release notes, corresponding source, notices repository, and operator contact as one launch bundle so distribution-critical pages do not fragment the release story.',
|
||||
}: {
|
||||
releaseManifest: ReturnType<typeof resolveReleaseManifestView>
|
||||
title?: string
|
||||
description?: string
|
||||
}) {
|
||||
const references = [
|
||||
{
|
||||
title: 'Public manual',
|
||||
description:
|
||||
'The public docs portal is the product-safe manual for browser-versus-desktop boundaries, rollout posture, and simulator truth.',
|
||||
href: releaseManifest.public_docs_url,
|
||||
configuredLabel: 'Configured',
|
||||
missingLabel: 'Configure public docs URL before external launch',
|
||||
linkLabel: releaseManifest.public_docs_url || 'Configure public docs URL before external launch',
|
||||
},
|
||||
{
|
||||
title: 'Release notes feed',
|
||||
description:
|
||||
'Release notes keep public launch pages anchored to real browser, package, control-boundary, and distribution changes.',
|
||||
href: releaseManifest.release_notes_url,
|
||||
configuredLabel: 'Configured',
|
||||
missingLabel: 'Configure release notes URL before external launch',
|
||||
linkLabel: releaseManifest.release_notes_url || 'Configure release notes URL before external launch',
|
||||
},
|
||||
{
|
||||
title: 'Corresponding source',
|
||||
description:
|
||||
'Any MPL-covered shipped build needs a stable corresponding-source location for the exact distributed material.',
|
||||
href: releaseManifest.corresponding_source_url,
|
||||
configuredLabel: 'Configured',
|
||||
missingLabel: 'Configure corresponding-source URL before external launch',
|
||||
linkLabel:
|
||||
releaseManifest.corresponding_source_url || 'Configure corresponding-source URL before external launch',
|
||||
},
|
||||
{
|
||||
title: 'Open-source repo and notices reference',
|
||||
description:
|
||||
'The public repository and notices reference keeps release, legal, and redistribution follow-through visible outside the simulator.',
|
||||
href: releaseManifest.open_source_repo_url,
|
||||
configuredLabel: 'Configured',
|
||||
missingLabel: 'Configure public repo/notices URL before external launch',
|
||||
linkLabel: releaseManifest.open_source_repo_url || 'Configure public repo/notices URL before external launch',
|
||||
},
|
||||
{
|
||||
title: 'Operator support contact',
|
||||
description:
|
||||
'Support contact belongs in the same bundle so release, entitlement, notice, and rollout questions do not force operators to improvise escalation paths.',
|
||||
href: releaseManifest.support_email ? `mailto:${releaseManifest.support_email}` : null,
|
||||
configuredLabel: 'Ready',
|
||||
missingLabel: 'Configure support email before external launch',
|
||||
linkLabel: releaseManifest.support_email || 'Configure support email before external launch',
|
||||
},
|
||||
] as const
|
||||
|
||||
return (
|
||||
<Section title={title} description={description}>
|
||||
<div className="card-grid">
|
||||
{references.map((reference) => {
|
||||
const configured = Boolean(reference.href)
|
||||
|
||||
return (
|
||||
<article key={reference.title} className="card">
|
||||
<p className={`status-pill ${configured ? '' : 'status-pill--warn'}`}>
|
||||
{configured ? reference.configuredLabel : 'Pending'}
|
||||
</p>
|
||||
<h3>{reference.title}</h3>
|
||||
<p>{reference.description}</p>
|
||||
<p className="top-gap">
|
||||
{reference.href ? (
|
||||
<a href={reference.href} target="_blank" rel="noreferrer">
|
||||
{reference.linkLabel}
|
||||
</a>
|
||||
) : (
|
||||
reference.missingLabel
|
||||
)}
|
||||
</p>
|
||||
</article>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</Section>
|
||||
)
|
||||
}
|
||||
|
||||
export function PlanActionLink({ href, label }: { href: string; label: string }) {
|
||||
if (isExternalHref(href)) {
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
import { useMemo } from 'react'
|
||||
import { useQuery } from '@tanstack/react-query'
|
||||
import { Link } from 'react-router-dom'
|
||||
import { getReleaseManifest } from '../auth/auth-api'
|
||||
import { MarketingShell } from '../components/layout/MarketingShell'
|
||||
import { SiteMetadata } from '../components/seo/SiteMetadata'
|
||||
import { OperationalStatusCallout } from '../components/ui/OperationalStatusCallout'
|
||||
|
|
@ -9,11 +7,7 @@ import { ProductSurfaceMatrix } from '../components/ui/ProductSurfaceMatrix'
|
|||
import { PublicLaunchStatus } from '../components/ui/PublicLaunchStatus'
|
||||
import { ReleaseValidationSummary } from '../components/ui/ReleaseValidationSummary'
|
||||
import { paddleReadyDescription } from '../site-config'
|
||||
import {
|
||||
buildReleaseMetadataItems,
|
||||
resolveReleaseCommerceView,
|
||||
resolveReleaseManifestView,
|
||||
} from '../release-manifest'
|
||||
import { buildReleaseMetadataItems, resolveReleaseCommerceView } from '../release-manifest'
|
||||
import { buildLoginPath, buildProtectedDownloadPath, buildSupportPath } from '../site-routes'
|
||||
import {
|
||||
desktopFirstLaunchCards,
|
||||
|
|
@ -31,12 +25,12 @@ import {
|
|||
} from '../site-data'
|
||||
import {
|
||||
BrowserDesktopRealitySection,
|
||||
buildPublicReleaseManifestFallback,
|
||||
DeliverySurfaceResponsibilitiesGrid,
|
||||
explorerFallbackPlan,
|
||||
operatorFallbackPlan,
|
||||
PlanActionLink,
|
||||
PublicPackagedDesktopProofSection,
|
||||
ReleaseAuthorityBundleSection,
|
||||
releaseCommerceFallback,
|
||||
Section,
|
||||
studioFallbackPlan,
|
||||
|
|
@ -45,23 +39,11 @@ import {
|
|||
} from './public-page-helpers'
|
||||
|
||||
export function PricingPage() {
|
||||
const releaseManifestQuery = useQuery({
|
||||
queryKey: ['release-manifest', 'public'],
|
||||
queryFn: getReleaseManifest,
|
||||
retry: false,
|
||||
})
|
||||
const releaseManifest = useMemo(
|
||||
() => resolveReleaseManifestView(releaseManifestQuery.data?.manifest, buildPublicReleaseManifestFallback()),
|
||||
[releaseManifestQuery.data?.manifest],
|
||||
)
|
||||
const { releaseManifestQuery, releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-pricing')
|
||||
const releaseCommerce = useMemo(
|
||||
() => resolveReleaseCommerceView(releaseManifestQuery.data?.manifest, releaseCommerceFallback),
|
||||
[releaseManifestQuery.data?.manifest],
|
||||
)
|
||||
const windowsValidationPlatform = useMemo(
|
||||
() => releaseManifest.platforms.find((platform) => platform.platform_key === 'windows') || null,
|
||||
[releaseManifest.platforms],
|
||||
)
|
||||
const runtimePlanCatalog = useMemo(() => ([
|
||||
explorerFallbackPlan,
|
||||
{
|
||||
|
|
@ -120,6 +102,11 @@ export function PricingPage() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="Pricing is a distribution surface, so its launch truth should carry the same docs, release, source, and escalation bundle as the rest of the public release lane."
|
||||
/>
|
||||
|
||||
<Section
|
||||
title="What happens after access is granted"
|
||||
description="Pricing only stays professional when it explains the real path from browser entitlement into the packaged simulator instead of stopping at the checkout button."
|
||||
|
|
@ -202,20 +189,7 @@ export function PricingPage() {
|
|||
}
|
||||
|
||||
export function DownloadPage() {
|
||||
const releaseManifestQuery = useQuery({
|
||||
queryKey: ['release-manifest', 'public'],
|
||||
queryFn: getReleaseManifest,
|
||||
retry: false,
|
||||
})
|
||||
|
||||
const releaseManifest = useMemo(
|
||||
() => resolveReleaseManifestView(releaseManifestQuery.data?.manifest, buildPublicReleaseManifestFallback()),
|
||||
[releaseManifestQuery.data?.manifest],
|
||||
)
|
||||
const windowsValidationPlatform = useMemo(
|
||||
() => releaseManifest.platforms.find((platform) => platform.platform_key === 'windows') || null,
|
||||
[releaseManifest.platforms],
|
||||
)
|
||||
const { releaseManifestQuery, releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-download')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -407,44 +381,14 @@ export function DownloadPage() {
|
|||
<p>{signal.description}</p>
|
||||
</article>
|
||||
))}
|
||||
<article className="card">
|
||||
<h3>Operator rollout references</h3>
|
||||
<ul className="list">
|
||||
{releaseManifest.public_docs_url ? (
|
||||
<li>
|
||||
Public docs:{' '}
|
||||
<a href={releaseManifest.public_docs_url} target="_blank" rel="noreferrer">
|
||||
{releaseManifest.public_docs_url}
|
||||
</a>
|
||||
</li>
|
||||
) : (
|
||||
<li>Public docs URL not configured yet.</li>
|
||||
)}
|
||||
{releaseManifest.release_notes_url ? (
|
||||
<li>
|
||||
Release notes:{' '}
|
||||
<a href={releaseManifest.release_notes_url} target="_blank" rel="noreferrer">
|
||||
{releaseManifest.release_notes_url}
|
||||
</a>
|
||||
</li>
|
||||
) : (
|
||||
<li>Release notes URL not configured yet.</li>
|
||||
)}
|
||||
<li>
|
||||
Notices and source posture:{' '}
|
||||
{releaseManifest.corresponding_source_url ? (
|
||||
<a href={releaseManifest.corresponding_source_url} target="_blank" rel="noreferrer">
|
||||
Corresponding source
|
||||
</a>
|
||||
) : (
|
||||
'configure the corresponding-source URL before external launch'
|
||||
)}
|
||||
</li>
|
||||
</ul>
|
||||
</article>
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="Download posture is more trustworthy when docs, release notes, corresponding source, notices repository, and operator escalation remain visible as one coherent release bundle."
|
||||
/>
|
||||
|
||||
<Section title="Why this page does not expose raw download URLs">
|
||||
<article className="callout">
|
||||
<p>
|
||||
|
|
@ -536,6 +480,12 @@ export function OpenSourceNoticesPage() {
|
|||
</div>
|
||||
</Section>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
title="Release and source references"
|
||||
description="The notices lane is stronger when corresponding source, release notes, docs, repo/notices references, and operator escalation stay visible together instead of being scattered across separate public pages."
|
||||
/>
|
||||
|
||||
<Section title="Distribution readiness">
|
||||
<PublicLaunchStatus title="Notices and corresponding-source readiness" />
|
||||
</Section>
|
||||
|
|
@ -592,7 +542,7 @@ export function OpenSourceNoticesPage() {
|
|||
}
|
||||
|
||||
export function PrivacyPage() {
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-privacy')
|
||||
const { releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-privacy')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -659,6 +609,11 @@ export function PrivacyPage() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="Privacy posture remains more actionable when docs, release notes, corresponding source, notices repository, and operator support stay reachable from the same public boundary page."
|
||||
/>
|
||||
|
||||
<Section
|
||||
title="Support-safe escalation boundary"
|
||||
description="When privacy or access concerns show up during rollout, support should keep account, runtime, and compliance questions separated instead of flattening them together."
|
||||
|
|
@ -683,7 +638,7 @@ export function PrivacyPage() {
|
|||
}
|
||||
|
||||
export function TermsPage() {
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-terms')
|
||||
const { releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-terms')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -750,6 +705,11 @@ export function TermsPage() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="Terms and access language are easier to trust when they keep public docs, release notes, corresponding source, notices references, and support follow-through in one visible release bundle."
|
||||
/>
|
||||
|
||||
<Section
|
||||
title="Release and redistribution checklist"
|
||||
description="Terms become materially more trustworthy when they stay attached to release proof, download gating, and legal follow-through."
|
||||
|
|
@ -773,7 +733,7 @@ export function TermsPage() {
|
|||
}
|
||||
|
||||
export function ShippingPaymentPage() {
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-shipping-payment')
|
||||
const { releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-shipping-payment')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -853,6 +813,11 @@ export function ShippingPaymentPage() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="Shipping and payment posture should carry the same docs, release, source, notices, and support bundle as the rest of the public desktop-distribution lane."
|
||||
/>
|
||||
|
||||
<Section
|
||||
title="Terms of access in practice"
|
||||
description="The shipping/payment page should still tell operators what they are actually buying access to and what remains outside the current browser scope."
|
||||
|
|
|
|||
|
|
@ -17,13 +17,14 @@ import {
|
|||
import {
|
||||
BrowserDesktopRealitySection,
|
||||
PublicPackagedDesktopProofSection,
|
||||
ReleaseAuthorityBundleSection,
|
||||
Section,
|
||||
SurfaceChoiceGuideSection,
|
||||
usePublicReleaseManifestView,
|
||||
} from './public-page-helpers'
|
||||
|
||||
export function FeaturesPage() {
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-features')
|
||||
const { releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-features')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -187,6 +188,11 @@ export function FeaturesPage() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="The feature atlas is part of the rollout story too, so it should keep docs, release notes, source, notices, and support references attached to the capability map."
|
||||
/>
|
||||
|
||||
<Section
|
||||
title="Explicit boundaries"
|
||||
description="These are the product claims HyperTwist refuses to blur. Keeping them visible is part of the product quality bar."
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ import {
|
|||
BrowserDesktopRealitySection,
|
||||
DeliverySurfaceResponsibilitiesGrid,
|
||||
PublicPackagedDesktopProofSection,
|
||||
ReleaseAuthorityBundleSection,
|
||||
Section,
|
||||
SurfaceChoiceGuideSection,
|
||||
supportTopicDirectory,
|
||||
|
|
@ -255,7 +256,7 @@ function SupportTopicDirectorySection({
|
|||
}
|
||||
|
||||
export function HomeLanding() {
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-home')
|
||||
const { releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-home')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -401,6 +402,11 @@ export function HomeLanding() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="The homepage is part of the real release lane, so it keeps docs, release notes, source, notices, and operator support references bundled instead of scattering them behind later pages."
|
||||
/>
|
||||
|
||||
<Section
|
||||
title="How a real first session flows"
|
||||
description="This is the public-facing operator path from curiosity into the actual simulator lane, without pretending the browser already replaced the desktop runtime."
|
||||
|
|
@ -434,7 +440,7 @@ export function HomeLanding() {
|
|||
}
|
||||
|
||||
export function AboutPage() {
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-about')
|
||||
const { releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-about')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -576,6 +582,11 @@ export function AboutPage() {
|
|||
{ to: '/docs', label: 'Open public manual' },
|
||||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="The about page should keep its product narrative tied to the same docs, release, source, notices, and support references that govern real rollout decisions."
|
||||
/>
|
||||
</MarketingShell>
|
||||
</>
|
||||
)
|
||||
|
|
@ -805,6 +816,11 @@ export function ResourcesPage() {
|
|||
{ to: '/app', label: 'Open operator dashboard' },
|
||||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="The resources portal is stronger when docs, release notes, corresponding source, notices, and support contact remain visible as part of the same operator reference bundle."
|
||||
/>
|
||||
</MarketingShell>
|
||||
</>
|
||||
)
|
||||
|
|
@ -913,6 +929,11 @@ export function DocsPage() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="The public manual stays more useful when it ends with the same docs, release, source, notices, and support bundle operators need for real rollout follow-through."
|
||||
/>
|
||||
|
||||
<FaqCardSection
|
||||
title="Common operator questions"
|
||||
description="These answers keep the public manual direct about the current browser shell, downloadable runtime, and bounded XR/settings truth."
|
||||
|
|
@ -936,7 +957,7 @@ export function SupportPage() {
|
|||
const supportTopic = searchParams.get('topic')
|
||||
const selectedSupportTopicKey = supportTopic && supportTopicGuidance[supportTopic] ? supportTopic : null
|
||||
const selectedSupportTopic = selectedSupportTopicKey ? supportTopicGuidance[selectedSupportTopicKey] : null
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-support')
|
||||
const { releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-support')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -983,6 +1004,11 @@ export function SupportPage() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="Support conversations move faster when docs, release notes, source, notices, and operator contact stay visible beside the launch and package evidence."
|
||||
/>
|
||||
|
||||
<Section title="Contact">
|
||||
<article className="card">
|
||||
<p>
|
||||
|
|
@ -1180,6 +1206,11 @@ export function ChangelogPage() {
|
|||
]}
|
||||
/>
|
||||
|
||||
<ReleaseAuthorityBundleSection
|
||||
releaseManifest={releaseManifest}
|
||||
description="Release notes are operationally stronger when the feed also carries the same docs, source, notices, and support references needed to act on a change safely."
|
||||
/>
|
||||
|
||||
{releaseManifest.release_notes_url ? (
|
||||
<Section title="External release notes">
|
||||
<a className="button button--ghost" href={releaseManifest.release_notes_url} target="_blank" rel="noreferrer">
|
||||
|
|
|
|||
|
|
@ -821,6 +821,16 @@ export const resourceCollections = [
|
|||
] as const
|
||||
|
||||
export const changelogEntries = [
|
||||
{
|
||||
date: 'June 25, 2026',
|
||||
title: 'Public pages now carry one shared release-reference bundle end to end',
|
||||
details: 'Home, About, Features, Resources, Docs, Support, Changelog, Privacy, Terms, Pricing, Download, Notices, and Shipping/Payment now all keep the same direct docs, release-notes, corresponding-source, public-repository/notices, and operator-support references visible instead of fragmenting release follow-through by route.',
|
||||
},
|
||||
{
|
||||
date: 'June 25, 2026',
|
||||
title: 'Public commerce pages now use the shared release-manifest view',
|
||||
details: 'Pricing and Download now consume the same public release-manifest helper used across the rest of the site, removing duplicated manifest-resolution logic while keeping platform proof, fallback posture, and operator handoff behavior unchanged.',
|
||||
},
|
||||
{
|
||||
date: 'June 24, 2026',
|
||||
title: 'Feature atlas and support now carry the full browser-versus-desktop reality section too',
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue