Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
node_modules
.DS_Store
.next
todo.md
current.md
Expand Down
111 changes: 111 additions & 0 deletions packages/mdx/dev/content/slideshow-autofocus.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# Slideshow with controls autofocus

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel fringilla est ullamcorper eget. At imperdiet dui accumsan sit amet nulla facilities morbi tempus. Praesent elementum facilisis leo vel fringilla. Congue mauris rhoncus aenean vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies.

<CH.Slideshow preset="https://codesandbox.io/s/w5wfe" autoFocus={true}>

Lorem ipsum dolor sit amet, consectetur adipiscing something about points, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

```jsx src/App.js
import { motion } from "framer-motion"

const transition = { duration: 1 }

export default function App() {
const bg = "hsl(20, 100%, 50%)"
return (
<div className="container">
<motion.div
className="swatch"
animate={{
backgroundColor: bg,
}}
transition={transition}
/>
</div>
)
}
```

---

## Step 2

Velit euismod in pellentesque massa placerat. Mi bibendum neque egestas congue quisque egestas diam in arcu. Nisi lacus sed viverra tellus in.

```jsx src/App.js focus=1,6,9:15
import { motion } from "framer-motion"

const transition = { duration: 1 }

export default function App() {
const bg = "hsl(110, 100%, 50%)"
return (
<div className="container">
<motion.div
className="swatch"
animate={{
backgroundColor: bg,
}}
transition={transition}
/>
</div>
)
}
```

---

## Step 3

Id aliquet risus feugiat in ante metus dictum at tempor. Sed blandit libero volutpat sed cras.

```jsx src/App.js focus=1,6,9:15
import { motion } from "framer-motion"

const transition = { duration: 1 }

export default function App() {
const bg = "hsl(200, 100%, 50%)"
return (
<div className="container">
<motion.div
className="swatch"
animate={{
backgroundColor: bg,
}}
transition={transition}
/>
</div>
)
}
```

---

## Step 4

Velit euismod in pellentesque massa placerat. Mi bibendum neque egestas congue quisque egestas diam in arcu.

```jsx src/App.js focus=1,6,9:15
import { motion } from "framer-motion"

const transition = { duration: 1 }

export default function App() {
const bg = "hsl(290, 100%, 50%)"
return (
<div className="container">
<motion.div
className="swatch"
animate={{
backgroundColor: bg,
}}
transition={transition}
/>
</div>
)
}
```

</CH.Slideshow>
33 changes: 22 additions & 11 deletions packages/mdx/src/mdx-client/slideshow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,33 @@ import { extractPreviewSteps } from "./steps"

export function Slideshow({
children,
editorSteps,
className,
code,
codeConfig,
editorSteps,
autoFocus,
hasPreviewSteps,
presetConfig,
code,
className,
style,
hasPreviewSteps,
...rest
}: {
children: React.ReactNode
editorSteps: EditorStep[]
className?: string
code?: EditorProps["codeConfig"]
codeConfig: EditorProps["codeConfig"]
editorSteps: EditorStep[]
hasPreviewSteps?: boolean
autoFocus?: boolean
presetConfig?: PresetConfig
code?: EditorProps["codeConfig"]
className?: string
style?: React.CSSProperties
hasPreviewSteps?: boolean
}) {
const controlsRef = React.useRef(null)

React.useEffect(() => {
// Only set focus on controls input if we have configured to do so
autoFocus && controlsRef.current.focus()
}, [])

const { stepsChildren, previewChildren } =
extractPreviewSteps(children, hasPreviewSteps)
const withPreview = presetConfig || hasPreviewSteps
Expand Down Expand Up @@ -98,17 +107,19 @@ export function Slideshow({
Prev
</button>
<input
type="range"
min={0}
max={editorSteps.length - 1}
value={state.stepIndex}
min={0}
ref={controlsRef}
step={1}
type="range"
value={state.stepIndex}
onChange={e =>
setState({
stepIndex: +e.target.value,
step: editorSteps[+e.target.value],
})
}
autoFocus={autoFocus}
/>
<button
onClick={() =>
Expand Down