{"id":50470629,"url":"https://github.com/thebuilder/next-slideshow-template","last_synced_at":"2026-06-01T10:30:45.819Z","repository":{"id":351418642,"uuid":"1210890982","full_name":"thebuilder/next-slideshow-template","owner":"thebuilder","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-14T22:38:17.000Z","size":158,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-15T00:27:26.599Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://next-slideshow-template.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thebuilder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-14T21:30:57.000Z","updated_at":"2026-04-14T22:38:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thebuilder/next-slideshow-template","commit_stats":null,"previous_names":["thebuilder/next-slideshow-template"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/thebuilder/next-slideshow-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thebuilder%2Fnext-slideshow-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thebuilder%2Fnext-slideshow-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thebuilder%2Fnext-slideshow-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thebuilder%2Fnext-slideshow-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thebuilder","download_url":"https://codeload.github.com/thebuilder/next-slideshow-template/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thebuilder%2Fnext-slideshow-template/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33771627,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-01T10:30:44.095Z","updated_at":"2026-06-01T10:30:45.808Z","avatar_url":"https://github.com/thebuilder.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Slideshow Base (Next.js)\n\nReusable slideshow template built with Next.js, React, Tailwind, and shadcn/ui.\n\n## Screenshots\n\n### Landing page\n\n![Landing page](assets/landingpage.png)\n\n### Presenter view\n\n![Presenter view](assets/presenter-view.png)\n\n## What this template includes\n\n- Route-per-slide presentation flow (`/slides/[slug]`)\n- Keyboard navigation (`Arrow`, `PageUp/PageDown`, `Space`)\n- Step reveals with `stepCount` + `SlideStep`\n- Click-to-advance reveal area for stepped slides\n- Command center (`Cmd/Ctrl + K`) for quick jump\n- Presenter popout window with `BroadcastChannel` sync\n- Presenter notes per slide via `notes` in `app/slides.tsx`\n- Presenter timer + 24h current-time clock\n- Presenter next-step preview (aware of reveal steps)\n- Presenter flow window (previous 2 + current + next 5 slide titles)\n- Presenter notes font-size controls\n- Light/dark theme toggle\n- Slide-level layout/background/header controls\n- Typed image slide support\n- PDF export pipeline for static handout rendering\n\n## Quick start\n\n```bash\npnpm install\npnpm dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000).\n\n## Project structure\n\n- `app/slides.tsx`: slide definitions only\n- `types/slides.ts`: slide model/types\n- `app/slideshow-config.ts`: global slideshow config (title, description, header defaults)\n- `app/slides/blocks/*`: deck-authoring building blocks (layout, typography, collections, media)\n- `components/slideshow/slide-shell.tsx`: slideshow chrome (header, navigation, frame)\n- `components/slideshow/slide-background.tsx`: shared background variants\n\n## Slide model\n\n`SlideDefinition` supports:\n\n- Core: `slug`, `title`, `body`\n- Optional flow: `stepCount`, `notes`\n- Optional chrome/layout: `header`, `footer`, `layout`, `background`\n\nSlide primitives can read the current slide `title` from context, so template\nblocks only need an explicit `title` prop when you want to override the slide\ntitle text inside the layout.\n\n### Header behavior\n\n`header` can be:\n\n- `\"visible\"`: always render header\n- `\"hidden\"`: never render header\n- `\"auto\"`: render in default layout, hide in fullscreen layout\n\nGlobal default is configured in `app/slideshow-config.ts`.\n\n### Footer behavior\n\n`footer` can be:\n\n- `\"visible\"`: full previous/next controls + counter\n- `\"counter\"`: counter only (`Slide x of y`)\n- `\"hidden\"`: no footer\n\n## Adding slides\n\nAdd entries to `app/slides.tsx`.\n\nExample content slide:\n\n```tsx\n{\n  slug: \"my-slide\",\n  title: \"My Slide\",\n  body: \u003cMySlideComponent /\u003e,\n  background: \"spotlight\",\n}\n```\n\nPresenter notes example:\n\n```tsx\n{\n  slug: \"my-slide\",\n  title: \"My Slide\",\n  notes: \"Speaker-only context and reminders shown in /presenter.\",\n  body: \u003cMySlideComponent /\u003e,\n}\n```\n\nExample image slide:\n\n```tsx\n{\n  slug: \"diagram\",\n  title: \"Architecture Diagram\",\n  body: (\n    \u003cImageShowcaseSlide\n      image={{ src: diagramImage, alt: \"System architecture\", placeholder: \"blur\" }}\n    /\u003e\n  ),\n  layout: \"fullscreen\",\n  header: \"hidden\",\n}\n```\n\nExample fullscreen video slide with autoplay:\n\n```tsx\n{\n  slug: \"launch-video\",\n  title: \"Launch Video\",\n  body: (\n    \u003cFullscreenMediaSlide\n      media={{ kind: \"video\", src: \"/videos/launch.mp4\", autoplay: true }}\n    /\u003e\n  ),\n  layout: \"fullscreen\",\n  header: \"hidden\",\n  footer: \"hidden\",\n}\n```\n\n`FullscreenMediaSlide` options:\n\n- `variant: \"framed\" | \"background\"` (`background` is edge-to-edge)\n- `overlay: \"none\" | \"subtle\" | \"medium\" | \"strong\"` for text readability over media\n- `media.fit: \"cover\" | \"contain\"` (defaults to `\"cover\"`)\n\n## Presenter preview context\n\nPresenter previews render slide routes with `?presenterPreview=1`, and slides\ncan detect that mode with `useIsPresenterPreview()` from\n`components/slideshow/slide-context.tsx`.\n\nUse that hook in custom client components to skip autoplay, audio, canvas, or\nother expensive interactive rendering inside the presenter preview iframe.\n\nThe built-in video slide primitives already suppress autoplay in presenter\npreview.\n\n## Background variants\n\n`background` supports:\n\n- `\"default\"`\n- `\"spotlight\"`\n- `\"grid\"`\n- `\"none\"`\n\nAdd custom variants in `components/slideshow/slide-background.tsx`.\n\n## PDF export\n\nUse Playwright + PDF-lib export:\n\n```bash\npnpm exec playwright install chromium\npnpm export:pdf\n```\n\nDark export theme:\n\n```bash\npnpm export:pdf -- --dark\n```\n\nThis runs a production build in `NEXT_PUBLIC_PDF_EXPORT=1` mode and writes:\n\n- `out/slides.pdf`\n\nSlide routes are discovered from `app/sitemap.ts` (`/sitemap.xml`) so export\nstays aligned with your actual published slideshow paths.\n\nExport mode behavior:\n\n- fixed viewport (default `1920x1080`)\n- animations/transitions disabled\n- slideshow header/footer hidden\n\nOptional env vars:\n\n- `PDF_EXPORT_WIDTH` (default `1920`)\n- `PDF_EXPORT_HEIGHT` (default `1080`)\n- `PDF_EXPORT_PORT` (default `3410`)\n- `PDF_EXPORT_OUTPUT` (default `out/slides.pdf`)\n\nSkip build (reuse existing `.next` build):\n\n```bash\npnpm export:pdf -- --skip-build\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthebuilder%2Fnext-slideshow-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthebuilder%2Fnext-slideshow-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthebuilder%2Fnext-slideshow-template/lists"}