feat: add static demo site at demo.snapotter.com

- New apps/demo/ that reuses apps/web components with mocked API layer
- Full UI shell: login, change password, analytics consent, dashboard, all tool pages
- Stateful mock tracks session flow (password change, analytics consent)
- Demo banner with link to GitHub repo
- Processing attempts show info message with GitHub link
- Deployed to Cloudflare Pages as static site (no backend)

Also links demo across all surfaces:
- README: "Live Demo" badge
- Landing navbar: "Try Demo" CTA button (replaces "Book a Demo")
- Landing hero: "No sign-ups. No credit card." tagline
- Docs getting-started: "Try before installing" tip box

Other changes:
- Docs: move NVIDIA GPU section above GHCR, demote GHCR to collapsed details
- Fix before-after slider checkerboard background for transparency
- Fix remove-bg preview reset when no effects applied
This commit is contained in:
SnapOtter
2026-05-17 09:25:12 +08:00
parent df2d1286d6
commit 228f70d011
20 changed files with 697 additions and 16 deletions
@@ -117,8 +117,14 @@ export function BeforeAfterSlider({
{/* After image (clipped, top layer) */}
<div
className="absolute inset-0 bg-muted/30"
style={{ clipPath: `inset(0 0 0 ${position}%)` }}
className="absolute inset-0"
style={{
clipPath: `inset(0 0 0 ${position}%)`,
backgroundImage:
"linear-gradient(45deg, #e0e0e0 25%, transparent 25%), linear-gradient(-45deg, #e0e0e0 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #e0e0e0 75%), linear-gradient(-45deg, transparent 75%, #e0e0e0 75%)",
backgroundSize: "16px 16px",
backgroundPosition: "0 0, 0 8px, 8px -8px, -8px 0px",
}}
>
<img
src={afterSrc}
@@ -618,7 +618,7 @@ export function RemoveBgSettings({ onBgPreview }: RemoveBgSettingsProps = {}) {
const shadowOpacity = (settings.shadowOpacity as number) ?? 35;
if (!blurEnabled && !shadowEnabled && bgType === "transparent") {
onBgPreview({ showCheckerboard: true });
onBgPreview(null);
return;
}