feat: evolve portfolio into an authored midnight grand tour

This commit is contained in:
2026-09-05 03:55:18 +03:00
parent 642f5b583d
commit c9ac36e249
41 changed files with 812 additions and 65 deletions

View File

@@ -77,14 +77,16 @@ const posterUrl = computed(() => {
:allow-automatic="allowAutomaticVideo"
/>
<figure v-else class="project-media project-media--image" data-project-media>
<img
:src="primaryUrl"
:alt="presentation.alt"
:width="imageAsset.width!"
:height="imageAsset.height!"
loading="lazy"
decoding="async"
/>
<a :href="primaryUrl" target="_blank" rel="noopener noreferrer" :aria-label="presentation.alt">
<img
:src="primaryUrl"
:alt="presentation.alt"
:width="imageAsset.width!"
:height="imageAsset.height!"
loading="lazy"
decoding="async"
/>
</a>
<figcaption v-if="presentation.caption">{{ presentation.caption }}</figcaption>
<p v-if="presentation.longDescription" class="media-description" data-testid="media-long-description">
{{ presentation.longDescription }}

View File

@@ -4,6 +4,8 @@ import { useSceneController, type SceneHostState } from '@/composables/useSceneC
import type { JourneySnapshot } from '@/journey/types';
import type { MotionPolicy, QualityTier } from '@/journey/motion-policy';
import { isTestFault, recordTestFaultEvent } from '@/testing/fault-hooks';
import posterUrl from '@/assets/hero-evolution.jpg';
import mobilePosterUrl from '@/assets/hero-evolution-mobile.jpg';
declare const __PORTFOLIO_TEST_BUILD__: boolean;
const TEST_BUILD = typeof __PORTFOLIO_TEST_BUILD__ !== 'undefined' && __PORTFOLIO_TEST_BUILD__;
@@ -53,16 +55,10 @@ if (posterFailed.value) recordTestFaultEvent('poster-failure');
:data-static-fallback="!showCanvas"
:data-poster-failed="posterFailed"
>
<img v-if="!posterFailed" class="journey-poster" alt="" width="1600" height="900" @error="posterFailed = true">
<div v-if="!posterFailed" class="journey-poster-composition">
<span class="journey-poster__stars" />
<span class="journey-poster__sun" />
<span class="journey-poster__terrain" />
<span class="journey-poster__road" />
<span class="journey-poster__rail journey-poster__rail--left" />
<span class="journey-poster__rail journey-poster__rail--right" />
<span class="journey-poster__car" />
</div>
<picture v-if="!posterFailed">
<source media="(max-width: 767px)" :srcset="mobilePosterUrl">
<img :src="posterUrl" class="journey-poster" alt="" width="1600" height="900" @error="posterFailed = true">
</picture>
<canvas v-if="showCanvas" ref="canvas" class="journey-canvas" aria-hidden="true" />
</div>
<slot />