Skip to content

Commit 6db5769

Browse files
committed
fix(site): use the animated mascot logo in the hero
The hero played /pythinker-hero-clean-v2.mp4 through a play/pause button. That asset is gone from apps/site/public, so the site build failed outright: Rollup could not resolve the import. Render the existing PythinkerMascot component instead. It inlines the same artwork as public/pythinker_animated.svg (34 identical paths, the same blink, mouth, antenna-glow and eye-shine animations) and already carries its own scoped prefers-reduced-motion guard, so the video refs, the play/pause handlers and the mask/blend CSS all go away. Also drop four assets nothing references: the mp4, arctecture.webp, logo.png and brand/linux.svg.
1 parent ca2302a commit 6db5769

5 files changed

Lines changed: 4 additions & 73 deletions

File tree

apps/site/public/arctecture.webp

-87.4 KB
Binary file not shown.

apps/site/public/brand/linux.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

apps/site/public/logo.png

-59 KB
Binary file not shown.
-792 KB
Binary file not shown.

apps/site/src/App.vue

Lines changed: 4 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ const vscodeInstallCommand = 'code --install-extension pythoughts.pythinker-code
6161
6262
const copiedCommand = ref('');
6363
const mobileMenu = ref(null);
64-
const heroVideo = ref(null);
65-
const heroVideoPlaying = ref(false);
6664
const menuButton = ref(null);
6765
const menuOpen = ref(false);
6866
const activeTerminalDemo = ref(terminalDemos[0]);
@@ -171,30 +169,10 @@ function onDocumentKeydown(event) {
171169
if (event.key === 'Escape') closeMenu();
172170
}
173171
174-
async function playHeroVideo() {
175-
try {
176-
await heroVideo.value?.play();
177-
} catch {
178-
heroVideoPlaying.value = false;
179-
}
180-
}
181-
182-
function syncHeroMotionPreference() {
183-
if (reducedMotionQuery.matches) heroVideo.value?.pause();
184-
else void playHeroVideo();
185-
}
186-
187-
function toggleHeroVideo() {
188-
if (heroVideo.value?.paused) void playHeroVideo();
189-
else heroVideo.value?.pause();
190-
}
191-
192172
onMounted(() => {
193173
document.addEventListener('pointerdown', onDocumentPointerdown);
194174
document.addEventListener('keydown', onDocumentKeydown);
195175
reducedMotionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
196-
reducedMotionQuery.addEventListener('change', syncHeroMotionPreference);
197-
syncHeroMotionPreference();
198176
playTerminalDemo();
199177
if (reducedMotionQuery.matches) return;
200178
@@ -214,7 +192,6 @@ onUnmounted(() => {
214192
clearTimeout(menuCloseTimer);
215193
clearTerminalPlayback();
216194
revealObserver?.disconnect();
217-
reducedMotionQuery?.removeEventListener('change', syncHeroMotionPreference);
218195
document.removeEventListener('pointerdown', onDocumentPointerdown);
219196
document.removeEventListener('keydown', onDocumentKeydown);
220197
});
@@ -250,28 +227,7 @@ onUnmounted(() => {
250227
<main id="top">
251228
<header class="hero container">
252229
<div class="hero-copy">
253-
<button
254-
class="hero-mascot-video"
255-
type="button"
256-
:aria-label="heroVideoPlaying ? 'Pause mascot animation' : 'Play mascot animation'"
257-
@click="toggleHeroVideo"
258-
>
259-
<video
260-
ref="heroVideo"
261-
autoplay
262-
muted
263-
loop
264-
playsinline
265-
preload="metadata"
266-
width="1280"
267-
height="720"
268-
aria-hidden="true"
269-
@play="heroVideoPlaying = true"
270-
@pause="heroVideoPlaying = false"
271-
>
272-
<source src="/pythinker-hero-clean-v2.mp4" type="video/mp4" />
273-
</video>
274-
</button>
230+
<PythinkerMascot class="hero-mascot" :width="164" :height="205" />
275231
<h1>Pythinker Code</h1>
276232
<p class="hero-accent">Think first, then code.</p>
277233
<p class="hero-lead">An open-source AI engineering agent for your terminal. It reads your repo, edits files, runs commands, and iterates until the job is done.</p>
@@ -768,35 +724,11 @@ onUnmounted(() => {
768724
line-height: 1.38;
769725
}
770726
771-
.hero-mascot-video {
772-
position: relative;
727+
.hero-mascot {
773728
display: block;
774-
width: clamp(160px, 16vw, 200px);
729+
width: clamp(128px, 12vw, 164px);
730+
height: auto;
775731
margin-inline: auto;
776-
padding: 0;
777-
border: 0;
778-
appearance: none;
779-
aspect-ratio: 4 / 3;
780-
background: transparent;
781-
color: var(--ink);
782-
cursor: pointer;
783-
}
784-
785-
.hero-mascot-video:focus-visible {
786-
outline: 2px solid var(--accent);
787-
outline-offset: 4px;
788-
border-radius: var(--radius-sm);
789-
}
790-
791-
.hero-mascot-video video {
792-
display: block;
793-
width: 100%;
794-
height: 100%;
795-
object-fit: cover;
796-
-webkit-mask-image: radial-gradient(ellipse 50% 50% at center, black 58%, transparent 100%);
797-
mask-image: radial-gradient(ellipse 50% 50% at center, black 58%, transparent 100%);
798-
mix-blend-mode: multiply;
799-
pointer-events: none;
800732
}
801733
802734
.works-with {

0 commit comments

Comments
 (0)