Skip to content

Replace dashboard demo videos with a coverflow image carousel#1333

Open
IEvangelist wants to merge 2 commits into
mainfrom
dapine/dashboard-carousel
Open

Replace dashboard demo videos with a coverflow image carousel#1333
IEvangelist wants to merge 2 commits into
mainfrom
dapine/dashboard-carousel

Conversation

@IEvangelist

@IEvangelist IEvangelist commented Jul 6, 2026

Copy link
Copy Markdown
Member

Summary

Prototype replacing the landing page's dashboard demo videos with a zero‑dependency, theme‑aware coverflow image carousel.

The two dashboard-demo-{dark,light}.mp4 files (~93 MB combined) are heavy, hard to maintain, and go stale as the dashboard evolves. This swaps them for seven high‑quality dashboard screenshots — each with a light and dark variant rendered through the existing ThemeImage component.

What's included

  • New DashboardCarousel.astro — a self‑contained CSS 3D coverflow with a tiny inline controller. No new runtime dependencies; it borrows only the motion idea from Motion's Vue coverflow example.
    • Per‑distance scale / rotation / blur / opacity for the coverflow depth effect, with a soft edge mask on the far slides.
    • Gentle autoplay that pauses on hover, focus, reduced‑motion, hidden tab, and while an image is zoomed.
    • Click a side slide to center it, keyboard arrows, dot pagination, and image zoom.
    • Mobile finger‑swipe with intent detection (horizontal swipe changes slides; vertical scroll still passes through to the page).
    • Honors prefers-reduced-motion.
  • 7 dashboard views × 2 themes = 14 PNGs (~2.3 MB total) captured from a live aspire-shop run: resources graph, resources table, console logs, structured logs, traces, trace detail, metrics.
  • Migrated every localized landing page (index.mdx across all locales) from <LoopingVideo> to <DashboardCarousel />.
  • Deleted the now‑unused dashboard-demo-dark.mp4 and dashboard-demo-light.mp4 (~93 MB removed).

LoopingVideo.astro is retained — it's still used by the AI coding agents page.

Demo

aspire.dev.landing-dashboard.rewrite.mp4

Validation

  • prettier ✓, astro sync ✓, eslint . ✓ (0 errors), component vitest suite ✓ (69 passed).
  • Verified visually in astro dev in both light and dark themes, including swipe, zoom, and coverflow depth.
  • No pnpm build run locally (left to CI).

Notes

Opening as a draft for UX feedback on the interaction and image set before finalizing.

Swap the heavy, hard-to-maintain dashboard demo MP4s (~93 MB) for a zero-dependency, theme-aware coverflow carousel of seven dashboard screenshots (resources graph, resources table, console logs, structured logs, traces, trace detail, metrics), each with light and dark variants via ThemeImage.

The carousel borrows just the coverflow motion from Motion's Vue example (no runtime dependency): 3D per-distance scale/rotation/blur/opacity, autoplay that pauses on hover/focus/zoom, click-to-center, keyboard arrows, touch/pointer swipe with vertical-scroll passthrough, image zoom, and a soft edge mask.

Migrate every localized landing page from <LoopingVideo> to <DashboardCarousel /> and delete the now-unused dashboard-demo MP4s.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Frontend HTML artifact ready

The latest frontend build uploaded the frontend-dist artifact for PR #1333. Use the VS Code button below to open this PR with GitHub Artifacts Explorer and browse the built HTML locally.

VS Code: Open PR #1333 artifacts

This comment updates automatically when a new frontend build artifact is uploaded.

The active view label used --aspire-color-secondary (#b9aaee), a light purple that only clears WCAG AA against the dark page background (~7.8:1). On the light theme's white background it dropped to ~2.1:1, failing the axe color-contrast rule and breaking the homepage WCAG AA e2e audit across all viewports.

Keep the light-purple accent on dark and switch to the deeper brand purple --aspire-color-primary (#7455dd, ~5.1:1 on white) under html[data-theme='light'].

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@IEvangelist IEvangelist marked this pull request as ready for review July 7, 2026 14:04
Copilot AI review requested due to automatic review settings July 7, 2026 14:04

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR prototypes replacing the landing page’s heavy dashboard demo videos with a new, zero-dependency DashboardCarousel component and updates all localized landing pages to use it.

Changes:

  • Added DashboardCarousel.astro implementing a theme-aware coverflow screenshot carousel with autoplay, swipe, keyboard controls, and zoom integration.
  • Replaced LoopingVideo usage with <DashboardCarousel /> across the landing page in all locales.
  • (Per PR description) removes the two large dashboard-demo-*.mp4 assets in favor of themed PNG screenshots.

Reviewed changes

Copilot reviewed 16 out of 32 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/frontend/src/components/DashboardCarousel.astro Introduces the new coverflow carousel component and its client-side controller.
src/frontend/src/content/docs/index.mdx Switches the English landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/da/index.mdx Switches the Danish landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/de/index.mdx Switches the German landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/es/index.mdx Switches the Spanish landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/fr/index.mdx Switches the French landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/hi/index.mdx Switches the Hindi landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/id/index.mdx Switches the Indonesian landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/it/index.mdx Switches the Italian landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/ja/index.mdx Switches the Japanese landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/ko/index.mdx Switches the Korean landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/pt-br/index.mdx Switches the Portuguese (Brazil) landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/ru/index.mdx Switches the Russian landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/tr/index.mdx Switches the Turkish landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/uk/index.mdx Switches the Ukrainian landing page from LoopingVideo to DashboardCarousel.
src/frontend/src/content/docs/zh-cn/index.mdx Switches the Chinese (Simplified) landing page from LoopingVideo to DashboardCarousel.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +94 to +99
data-slide
data-index={i}
role="group"
aria-roledescription="slide"
aria-label={`${i + 1} of ${slides.length}: ${s.label}`}
>
Comment on lines +164 to +167
// Cache each slide's caption once (derived from its aria-label).
const labels = slides.map(
(s) => (s.getAttribute('aria-label') || '').split(': ').pop() || ''
);
Comment on lines +118 to +129
<div class="dots" role="tablist" aria-label="Choose a dashboard view">
{
slides.map((s, i) => (
<button
type="button"
class="dot"
data-dot
data-index={i}
role="tab"
aria-label={s.label}
aria-selected={i === 0 ? 'true' : 'false'}
/>
slide.removeAttribute('aria-current');
}
}
dots.forEach((d, i) => d.setAttribute('aria-selected', i === active ? 'true' : 'false'));
Comment on lines +362 to +386
root.addEventListener('pointerenter', stopAuto);
root.addEventListener('pointerleave', startAuto);
root.addEventListener('focusin', stopAuto);
root.addEventListener('focusout', startAuto);
document.addEventListener('visibilitychange', () =>
document.hidden ? stopAuto() : startAuto()
);

// Pause autoplay while an image is zoomed open. starlight-image-zoom adds
// the `starlight-image-zoom-opened` class to <body> for the duration.
const body = document.body;
const zoomObserver = new MutationObserver(() => {
const open = body.classList.contains('starlight-image-zoom-opened');
if (open === zoomOpen) return;
zoomOpen = open;
if (open) {
stopAuto();
} else {
startAuto();
}
});
zoomObserver.observe(body, { attributes: true, attributeFilter: ['class'] });

window.addEventListener('resize', measure);

},
]}
/>
<DashboardCarousel />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants