nextjs-slides 0.1.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -13
- package/dist/slide-deck.d.ts +1 -1
- package/dist/slide-deck.js +15 -1
- package/dist/slide-deck.js.map +1 -1
- package/dist/slides.css +25 -7
- package/dist/types.d.ts +2 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ A minimal demo app lives in `examples/demo`. From the repo root:
|
|
|
22
22
|
npm run build && cd examples/demo && npm install && npm run dev
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
Open http://localhost:3000
|
|
25
|
+
Open http://localhost:3000 — choose "Geist deck" or "Alternate deck" (Playfair + Dracula theme).
|
|
26
26
|
|
|
27
27
|
Peer dependencies: `next >=15`, `react >=19`, `tailwindcss >=4`.
|
|
28
28
|
|
|
@@ -129,14 +129,15 @@ That's it. Navigate to `/slides` and you have a full slide deck.
|
|
|
129
129
|
|
|
130
130
|
## `<SlideDeck>` Props
|
|
131
131
|
|
|
132
|
-
| Prop | Type | Default | Description
|
|
133
|
-
| -------------- | ----------------- | ------------ |
|
|
134
|
-
| `slides` | `ReactNode[]` | **required** | Your slides array
|
|
135
|
-
| `basePath` | `string` | `"/slides"` | URL prefix for slide routes
|
|
136
|
-
| `
|
|
137
|
-
| `
|
|
138
|
-
| `
|
|
139
|
-
| `
|
|
132
|
+
| Prop | Type | Default | Description |
|
|
133
|
+
| -------------- | ----------------- | ------------ | ------------------------------------------------------- |
|
|
134
|
+
| `slides` | `ReactNode[]` | **required** | Your slides array |
|
|
135
|
+
| `basePath` | `string` | `"/slides"` | URL prefix for slide routes |
|
|
136
|
+
| `exitUrl` | `string` | — | URL for exit button (×). Shows in top-right when set. |
|
|
137
|
+
| `showProgress` | `boolean` | `true` | Show dot progress indicator |
|
|
138
|
+
| `showCounter` | `boolean` | `true` | Show "3 / 10" counter |
|
|
139
|
+
| `className` | `string` | — | Additional class for the deck container |
|
|
140
|
+
| `children` | `React.ReactNode` | **required** | Route content (from Next.js) |
|
|
140
141
|
|
|
141
142
|
## Primitives
|
|
142
143
|
|
|
@@ -179,17 +180,17 @@ That's it. Navigate to `/slides` and you have a full slide deck.
|
|
|
179
180
|
|
|
180
181
|
Keyboard events are ignored inside `<SlideDemo>`, inputs, and textareas so you can interact without advancing slides.
|
|
181
182
|
|
|
182
|
-
## Custom Base Path
|
|
183
|
+
## Custom Base Path & Multiple Decks
|
|
183
184
|
|
|
184
|
-
|
|
185
|
+
Use `basePath` for a different URL, `exitUrl` for an exit button (×), and `className` for scoped font/syntax overrides:
|
|
185
186
|
|
|
186
187
|
```tsx
|
|
187
|
-
<SlideDeck slides={slides} basePath="/deck">
|
|
188
|
+
<SlideDeck slides={slides} basePath="/slides-alt" exitUrl="/" className="slides-alt-deck">
|
|
188
189
|
{children}
|
|
189
190
|
</SlideDeck>
|
|
190
191
|
```
|
|
191
192
|
|
|
192
|
-
|
|
193
|
+
Route at `/slides-alt/[page]/page.tsx`. Keep `SlideDeck` as the direct layout child (no wrapper div) so the exit animation works.
|
|
193
194
|
|
|
194
195
|
## Breakout Pages
|
|
195
196
|
|
|
@@ -250,6 +251,8 @@ Slide transitions use the React 19 `<ViewTransition>` component with `addTransit
|
|
|
250
251
|
|
|
251
252
|
**`@source` path not found** — The `@source "../node_modules/nextjs-slides/dist"` path is relative to your CSS file. If your `globals.css` lives in `app/`, use `../node_modules/...`. If it lives in the project root, use `./node_modules/nextjs-slides/dist`.
|
|
252
253
|
|
|
254
|
+
**Exit animation (deck-unveil) not running** — Ensure `SlideDeck` is the direct child of the layout. Wrapping it in a `<div>` can prevent the ViewTransition exit from firing. Use the `className` prop for scoped styling instead.
|
|
255
|
+
|
|
253
256
|
## For maintainers
|
|
254
257
|
|
|
255
258
|
See [DEPLOYMENT.md](DEPLOYMENT.md) for Vercel deployment and release workflow.
|
package/dist/slide-deck.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { SlideDeckConfig } from './types.js';
|
|
3
3
|
|
|
4
|
-
declare function SlideDeck({ children, slides, basePath, showProgress, showCounter, className, }: SlideDeckConfig & {
|
|
4
|
+
declare function SlideDeck({ children, slides, basePath, exitUrl, showProgress, showCounter, className, }: SlideDeckConfig & {
|
|
5
5
|
children: React.ReactNode;
|
|
6
6
|
}): react_jsx_runtime.JSX.Element;
|
|
7
7
|
|
package/dist/slide-deck.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "next/link";
|
|
3
4
|
import { usePathname, useRouter } from "next/navigation";
|
|
4
5
|
import { addTransitionType, useCallback, useEffect, useTransition, ViewTransition } from "react";
|
|
5
6
|
import { cn } from "./cn";
|
|
@@ -7,6 +8,7 @@ function SlideDeck({
|
|
|
7
8
|
children,
|
|
8
9
|
slides,
|
|
9
10
|
basePath = "/slides",
|
|
11
|
+
exitUrl,
|
|
10
12
|
showProgress = true,
|
|
11
13
|
showCounter = true,
|
|
12
14
|
className
|
|
@@ -111,7 +113,19 @@ function SlideDeck({
|
|
|
111
113
|
current + 1,
|
|
112
114
|
" / ",
|
|
113
115
|
total
|
|
114
|
-
] })
|
|
116
|
+
] }),
|
|
117
|
+
isSlideRoute && exitUrl && /* @__PURE__ */ jsx(
|
|
118
|
+
Link,
|
|
119
|
+
{
|
|
120
|
+
href: exitUrl,
|
|
121
|
+
className: "text-foreground/50 hover:text-foreground fixed top-6 right-8 z-50 flex h-10 w-10 items-center justify-center rounded-md transition-colors hover:bg-foreground/10",
|
|
122
|
+
"aria-label": "Exit presentation",
|
|
123
|
+
children: /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
124
|
+
/* @__PURE__ */ jsx("path", { d: "M18 6 6 18" }),
|
|
125
|
+
/* @__PURE__ */ jsx("path", { d: "m6 6 12 12" })
|
|
126
|
+
] })
|
|
127
|
+
}
|
|
128
|
+
)
|
|
115
129
|
]
|
|
116
130
|
}
|
|
117
131
|
) });
|
package/dist/slide-deck.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/slide-deck.tsx"],"sourcesContent":["'use client';\n\nimport { usePathname, useRouter } from 'next/navigation';\nimport { addTransitionType, useCallback, useEffect, useTransition, ViewTransition } from 'react';\nimport { cn } from './cn';\nimport type { SlideDeckConfig } from './types';\n\nexport function SlideDeck({\n children,\n slides,\n basePath = '/slides',\n showProgress = true,\n showCounter = true,\n className,\n}: SlideDeckConfig & { children: React.ReactNode }) {\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n const total = slides.length;\n const slideRoutePattern = new RegExp(`^${basePath}/(\\\\d+)$`);\n const isSlideRoute = slideRoutePattern.test(pathname);\n const current = (() => {\n const match = pathname.match(slideRoutePattern);\n return match ? Number(match[1]) - 1 : 0;\n })();\n\n const goTo = useCallback(\n (index: number) => {\n const clamped = Math.max(0, Math.min(index, total - 1));\n if (clamped === current) return;\n startTransition(() => {\n addTransitionType(clamped > current ? 'slide-forward' : 'slide-back');\n router.push(`${basePath}/${clamped + 1}`);\n });\n },\n [basePath, current, router, startTransition, total],\n );\n\n useEffect(() => {\n if (!isSlideRoute) return;\n if (current > 0) router.prefetch(`${basePath}/${current}`);\n if (current < total - 1) router.prefetch(`${basePath}/${current + 2}`);\n }, [basePath, current, isSlideRoute, router, total]);\n\n useEffect(() => {\n if (!isSlideRoute) return;\n function onKeyDown(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n if (\n target.closest('[data-slide-interactive]') ||\n target.matches('input, textarea, select, [contenteditable=\"true\"]')\n ) {\n return;\n }\n if (e.key === 'ArrowRight' || e.key === ' ') {\n e.preventDefault();\n goTo(current + 1);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n goTo(current - 1);\n }\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [current, goTo, isSlideRoute]);\n\n useEffect(() => {\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = prev;\n };\n }, []);\n\n return (\n <ViewTransition default=\"none\" exit=\"deck-unveil\">\n <div\n id=\"slide-deck\"\n className={cn(\n 'bg-background text-foreground fixed inset-0 z-50 overflow-hidden font-sans select-none',\n className,\n )}\n data-pending={isPending ? '' : undefined}\n >\n <ViewTransition\n key={pathname}\n default=\"none\"\n enter={{\n default: 'slide-from-right',\n 'slide-back': 'slide-from-left',\n 'slide-forward': 'slide-from-right',\n }}\n exit={{\n default: 'slide-to-left',\n 'slide-back': 'slide-to-right',\n 'slide-forward': 'slide-to-left',\n }}\n >\n <div>{children}</div>\n </ViewTransition>\n\n {isSlideRoute && showProgress && (\n <div\n className=\"fixed bottom-8 left-1/2 z-50 flex -translate-x-1/2 items-center gap-1.5\"\n aria-label=\"Slide progress\"\n >\n {Array.from({ length: total }).map((_, i) => (\n <div\n key={i}\n className={cn(\n 'h-1 transition-all duration-300',\n i === current ? 'bg-foreground w-6' : 'bg-foreground/20 w-1',\n )}\n />\n ))}\n </div>\n )}\n\n {isSlideRoute && showCounter && (\n <div className=\"text-foreground/30 fixed right-8 bottom-8 z-50 font-mono text-xs tracking-wider\">\n {current + 1} / {total}\n </div>\n )}\n </div>\n </ViewTransition>\n );\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../src/slide-deck.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { usePathname, useRouter } from 'next/navigation';\nimport { addTransitionType, useCallback, useEffect, useTransition, ViewTransition } from 'react';\nimport { cn } from './cn';\nimport type { SlideDeckConfig } from './types';\n\nexport function SlideDeck({\n children,\n slides,\n basePath = '/slides',\n exitUrl,\n showProgress = true,\n showCounter = true,\n className,\n}: SlideDeckConfig & { children: React.ReactNode }) {\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n const total = slides.length;\n const slideRoutePattern = new RegExp(`^${basePath}/(\\\\d+)$`);\n const isSlideRoute = slideRoutePattern.test(pathname);\n const current = (() => {\n const match = pathname.match(slideRoutePattern);\n return match ? Number(match[1]) - 1 : 0;\n })();\n\n const goTo = useCallback(\n (index: number) => {\n const clamped = Math.max(0, Math.min(index, total - 1));\n if (clamped === current) return;\n startTransition(() => {\n addTransitionType(clamped > current ? 'slide-forward' : 'slide-back');\n router.push(`${basePath}/${clamped + 1}`);\n });\n },\n [basePath, current, router, startTransition, total],\n );\n\n useEffect(() => {\n if (!isSlideRoute) return;\n if (current > 0) router.prefetch(`${basePath}/${current}`);\n if (current < total - 1) router.prefetch(`${basePath}/${current + 2}`);\n }, [basePath, current, isSlideRoute, router, total]);\n\n useEffect(() => {\n if (!isSlideRoute) return;\n function onKeyDown(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n if (\n target.closest('[data-slide-interactive]') ||\n target.matches('input, textarea, select, [contenteditable=\"true\"]')\n ) {\n return;\n }\n if (e.key === 'ArrowRight' || e.key === ' ') {\n e.preventDefault();\n goTo(current + 1);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n goTo(current - 1);\n }\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [current, goTo, isSlideRoute]);\n\n useEffect(() => {\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = prev;\n };\n }, []);\n\n return (\n <ViewTransition default=\"none\" exit=\"deck-unveil\">\n <div\n id=\"slide-deck\"\n className={cn(\n 'bg-background text-foreground fixed inset-0 z-50 overflow-hidden font-sans select-none',\n className,\n )}\n data-pending={isPending ? '' : undefined}\n >\n <ViewTransition\n key={pathname}\n default=\"none\"\n enter={{\n default: 'slide-from-right',\n 'slide-back': 'slide-from-left',\n 'slide-forward': 'slide-from-right',\n }}\n exit={{\n default: 'slide-to-left',\n 'slide-back': 'slide-to-right',\n 'slide-forward': 'slide-to-left',\n }}\n >\n <div>{children}</div>\n </ViewTransition>\n\n {isSlideRoute && showProgress && (\n <div\n className=\"fixed bottom-8 left-1/2 z-50 flex -translate-x-1/2 items-center gap-1.5\"\n aria-label=\"Slide progress\"\n >\n {Array.from({ length: total }).map((_, i) => (\n <div\n key={i}\n className={cn(\n 'h-1 transition-all duration-300',\n i === current ? 'bg-foreground w-6' : 'bg-foreground/20 w-1',\n )}\n />\n ))}\n </div>\n )}\n\n {isSlideRoute && showCounter && (\n <div className=\"text-foreground/30 fixed right-8 bottom-8 z-50 font-mono text-xs tracking-wider\">\n {current + 1} / {total}\n </div>\n )}\n\n {isSlideRoute && exitUrl && (\n <Link\n href={exitUrl}\n className=\"text-foreground/50 hover:text-foreground fixed top-6 right-8 z-50 flex h-10 w-10 items-center justify-center rounded-md transition-colors hover:bg-foreground/10\"\n aria-label=\"Exit presentation\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </Link>\n )}\n </div>\n </ViewTransition>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/slides.css
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* nextjs-slides — Slide transition animations and code theme tokens */
|
|
2
2
|
|
|
3
|
-
/*
|
|
3
|
+
/* Default code theme — override --sh-* and --nxs-code-* in :root or .dark */
|
|
4
4
|
:root {
|
|
5
5
|
--nxs-code-bg: #ffffff;
|
|
6
6
|
--nxs-code-border: #eaeaea;
|
|
@@ -17,20 +17,38 @@
|
|
|
17
17
|
--sh-sign: #24292e;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
@media (prefers-color-scheme: dark) {
|
|
21
|
+
:root {
|
|
22
|
+
--nxs-code-bg: #0a0a0a;
|
|
23
|
+
--nxs-code-border: #262626;
|
|
24
|
+
--nxs-code-text: #ededed;
|
|
25
|
+
--sh-keyword: #ff7b72;
|
|
26
|
+
--sh-string: #a5d6ff;
|
|
27
|
+
--sh-property: #79c0ff;
|
|
28
|
+
--sh-class: #d2a8ff;
|
|
29
|
+
--sh-entity: #d2a8ff;
|
|
30
|
+
--sh-tag: #7ee787;
|
|
31
|
+
--sh-identifier: #ededed;
|
|
32
|
+
--sh-literal: #79c0ff;
|
|
33
|
+
--sh-comment: #7a7a7a;
|
|
34
|
+
--sh-sign: #ededed;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
20
38
|
.dark {
|
|
21
|
-
--nxs-code-bg: #
|
|
22
|
-
--nxs-code-border: #
|
|
23
|
-
--nxs-code-text: #
|
|
39
|
+
--nxs-code-bg: #0a0a0a;
|
|
40
|
+
--nxs-code-border: #262626;
|
|
41
|
+
--nxs-code-text: #ededed;
|
|
24
42
|
--sh-keyword: #ff7b72;
|
|
25
43
|
--sh-string: #a5d6ff;
|
|
26
44
|
--sh-property: #79c0ff;
|
|
27
45
|
--sh-class: #d2a8ff;
|
|
28
46
|
--sh-entity: #d2a8ff;
|
|
29
47
|
--sh-tag: #7ee787;
|
|
30
|
-
--sh-identifier: #
|
|
48
|
+
--sh-identifier: #ededed;
|
|
31
49
|
--sh-literal: #79c0ff;
|
|
32
|
-
--sh-comment: #
|
|
33
|
-
--sh-sign: #
|
|
50
|
+
--sh-comment: #7a7a7a;
|
|
51
|
+
--sh-sign: #ededed;
|
|
34
52
|
}
|
|
35
53
|
|
|
36
54
|
/* Map highlight.js to theme variables (all overwritable via --sh-*) */
|
package/dist/types.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ interface SlideDeckConfig {
|
|
|
4
4
|
slides: React.ReactNode[];
|
|
5
5
|
/** Base path for slide URLs. Defaults to "/slides" */
|
|
6
6
|
basePath?: string;
|
|
7
|
+
/** URL to navigate to when exiting the deck. When set, shows an exit button. */
|
|
8
|
+
exitUrl?: string;
|
|
7
9
|
/** Show progress dots at the bottom. Defaults to true */
|
|
8
10
|
showProgress?: boolean;
|
|
9
11
|
/** Show slide counter (e.g. "3 / 10"). Defaults to true */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nextjs-slides",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Composable slide deck primitives for Next.js — powered by React 19 ViewTransitions, Tailwind CSS, and highlight.js syntax highlighting.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|