# Everything You Need to Know About The Sandpack Preview Component

%%[kempo] 

[Sandpack is a lightweight code playground](https://blog.thesshguy.com/sandpack) built by the CodeSandbox team.

With Sandpack, you can compose built-in and custom React components to create unique experiences for your end users.

In this post, we're going to focus on the built-in `SandpackPreview` component.

## The Sandpack Preview Component

The Preview component is your window into Sandpack's bundling process. It shows you how your UI looks. Not only that, but it also supports live updates when you make changes in an Editor component:

<iframe src="https://kempo.io/view/eyJpZCI6ImtsX2dmMTdueHNoN3drZXRzdndyd3E2MXVnciIsIm5hbWUiOiJTYW5kcGFjayBDb21wb25lbnQgRXhhbXBsZXMiLCJjb3JlIjp7ImZpbGVzIjp7Ii9zdHlsZXMuY3NzIjp7ImNvZGUiOiJib2R5IHtcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIGZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICBmb250LXNtb290aDogYWx3YXlzO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XG59XG5cbi5idG4td3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIHdpZHRoOiAxMDAlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbiAgcGFkZGluZzogOHB4O1xufVxuIn0sIi9BcHAuanMiOnsiY29kZSI6ImltcG9ydCB7XG4gIFNhbmRwYWNrUHJvdmlkZXIsXG4gIFNhbmRwYWNrQ29kZUVkaXRvcixcbiAgU2FuZHBhY2tMYXlvdXQsXG4gIFNhbmRwYWNrUHJldmlldyxcbn0gZnJvbSBcIkBjb2Rlc2FuZGJveC9zYW5kcGFjay1yZWFjdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7XG4gIHJldHVybiAoXG4gICAgPFNhbmRwYWNrUHJvdmlkZXIgdGVtcGxhdGU9XCJyZWFjdFwiPlxuICAgICAgPFNhbmRwYWNrTGF5b3V0PlxuICAgICAgICA8U2FuZHBhY2tDb2RlRWRpdG9yIC8+XG4gICAgICAgIDxTYW5kcGFja1ByZXZpZXcgLz5cbiAgICAgIDwvU2FuZHBhY2tMYXlvdXQ+XG4gICAgPC9TYW5kcGFja1Byb3ZpZGVyPlxuICApO1xufVxuIn0sIi9pbmRleC5qcyI6eyJjb2RlIjoiaW1wb3J0IFJlYWN0LCB7IFN0cmljdE1vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZVJvb3QgfSBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiO1xuaW1wb3J0IFwiLi9zdHlsZXMuY3NzXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4vQXBwXCI7XG5cbmNvbnN0IHJvb3QgPSBjcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdFwiKSk7XG5yb290LnJlbmRlcihcbiAgPFN0cmljdE1vZGU+XG4gICAgPEFwcCAvPlxuICA8L1N0cmljdE1vZGU+XG4pOyJ9LCIvcHVibGljL2luZGV4Lmh0bWwiOnsiY29kZSI6IjwhRE9DVFlQRSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCI+XG4gICAgPHRpdGxlPkRvY3VtZW50PC90aXRsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8ZGl2IGlkPVwicm9vdFwiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+In0sIi9wYWNrYWdlLmpzb24iOnsiY29kZSI6IntcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwicmVhY3RcIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1kb21cIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1zY3JpcHRzXCI6IFwiXjUuMC4wXCIsXG4gICAgXCJAY29kZXNhbmRib3gvc2FuZHBhY2stcmVhY3RcIjogXCIyLjE0LjBcIixcbiAgICBcIkBjb2Rlc2FuZGJveC9zYW5kcGFjay10aGVtZXNcIjogXCIyLjAuMjFcIlxuICB9LFxuICBcIm1haW5cIjogXCIvaW5kZXguanNcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge31cbn0ifX0sInRlbXBsYXRlIjoicmVhY3QifSwiZGlzcGxheSI6eyJjb21wb25lbnRzIjp7IkVkaXRvciI6eyJ0eXBlIjoiZWRpdG9yIiwiZGF0YSI6eyJzaG93VGFicyI6dHJ1ZSwic2hvd0xpbmVOdW1iZXJzIjp0cnVlLCJzaG93SW5saW5lRXJyb3JzIjpmYWxzZSwic2hvd1J1bkJ1dHRvbiI6dHJ1ZSwid3JhcENvbnRlbnQiOnRydWUsImNsb3NhYmxlVGFicyI6dHJ1ZSwicmVhZE9ubHkiOmZhbHNlLCJzaG93UmVhZE9ubHkiOmZhbHNlfX0sIlByZXZpZXciOnsidHlwZSI6InByZXZpZXciLCJkYXRhIjp7InNob3dOYXZpZ2F0b3IiOmZhbHNlLCJzaG93T3BlbkluQ29kZVNhbmRib3giOmZhbHNlLCJzaG93UmVmcmVzaEJ1dHRvbiI6dHJ1ZSwic2hvd1NhbmRwYWNrRXJyb3JPdmVybGF5IjpmYWxzZX19fSwiZ2VuZXJhbCI6eyJ2aXNpYmxlRmlsZXMiOlsiL0FwcC5qcyJdLCJ0aGVtZSI6ImtlbXBvRGFyayJ9LCJsYXlvdXRzIjp7InNtYWxsIjoiJ0VkaXRvcidcbidQcmV2aWV3JyJ9fX0=" height="750px" width="100%"></iframe>

### How to support browser navigation.

Just like a regular browser, the Preview component has a search bar. You can enable it with the `showNavigator` prop. You don't *need* to use the search bar, but it can be useful when building a demo that involves routing:

<iframe src="https://kempo.io/view/eyJpZCI6ImtsX2dmMTdueHNoN3drZXRzdndyd3E2MXVnciIsIm5hbWUiOiJTYW5kcGFjayBDb21wb25lbnQgRXhhbXBsZXMiLCJjb3JlIjp7ImZpbGVzIjp7Ii9zdHlsZXMuY3NzIjp7ImNvZGUiOiJib2R5IHtcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIGZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICBmb250LXNtb290aDogYWx3YXlzO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XG59XG5cbi5idG4td3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIHdpZHRoOiAxMDAlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbiAgcGFkZGluZzogOHB4O1xufVxuIn0sIi9BcHAuanMiOnsiY29kZSI6ImltcG9ydCB7XG4gIFNhbmRwYWNrUHJvdmlkZXIsXG4gIFNhbmRwYWNrQ29kZUVkaXRvcixcbiAgU2FuZHBhY2tMYXlvdXQsXG4gIFNhbmRwYWNrUHJldmlldyxcbn0gZnJvbSBcIkBjb2Rlc2FuZGJveC9zYW5kcGFjay1yZWFjdFwiO1xuaW1wb3J0IHsgZmlsZXMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7XG4gIHJldHVybiAoXG4gICAgPFNhbmRwYWNrUHJvdmlkZXIgdGVtcGxhdGU9XCJyZWFjdFwiIGZpbGVzPXtmaWxlc30+XG4gICAgICA8U2FuZHBhY2tMYXlvdXQ+XG4gICAgICAgIDxTYW5kcGFja0NvZGVFZGl0b3IgLz5cbiAgICAgICAgPFNhbmRwYWNrUHJldmlldyBzaG93TmF2aWdhdG9yIC8+XG4gICAgICA8L1NhbmRwYWNrTGF5b3V0PlxuICAgIDwvU2FuZHBhY2tQcm92aWRlcj5cbiAgKTtcbn1cbiJ9LCIvaW5kZXguanMiOnsiY29kZSI6ImltcG9ydCBSZWFjdCwgeyBTdHJpY3RNb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIjtcbmltcG9ydCBcIi4vc3R5bGVzLmNzc1wiO1xuXG5pbXBvcnQgQXBwIGZyb20gXCIuL0FwcFwiO1xuXG5jb25zdCByb290ID0gY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RcIikpO1xucm9vdC5yZW5kZXIoXG4gIDxTdHJpY3RNb2RlPlxuICAgIDxBcHAgLz5cbiAgPC9TdHJpY3RNb2RlPlxuKTsifSwiL3B1YmxpYy9pbmRleC5odG1sIjp7ImNvZGUiOiI8IURPQ1RZUEUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiPlxuICAgIDx0aXRsZT5Eb2N1bWVudDwvdGl0bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPGRpdiBpZD1cInJvb3RcIj48L2Rpdj5cbiAgPC9ib2R5PlxuPC9odG1sPiJ9LCIvcGFja2FnZS5qc29uIjp7ImNvZGUiOiJ7XG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInJlYWN0XCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3QtZG9tXCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3Qtc2NyaXB0c1wiOiBcIl41LjAuMFwiLFxuICAgIFwiQGNvZGVzYW5kYm94L3NhbmRwYWNrLXJlYWN0XCI6IFwiMi4xNC4wXCIsXG4gICAgXCJAY29kZXNhbmRib3gvc2FuZHBhY2stdGhlbWVzXCI6IFwiMi4wLjIxXCJcbiAgfSxcbiAgXCJtYWluXCI6IFwiL2luZGV4LmpzXCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHt9XG59In0sIi91dGlscy50cyI6eyJjb2RlIjoiZXhwb3J0IGNvbnN0IGZpbGVzID0ge1xuICBcIi9wYWNrYWdlLmpzb25cIjogYFxue1xuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJyZWFjdFwiOiBcIl4xOC4wLjBcIixcbiAgICBcInJlYWN0LWRvbVwiOiBcIl4xOC4wLjBcIixcbiAgICBcInJlYWN0LXNjcmlwdHNcIjogXCJeNS4wLjBcIixcbiAgICBcInJlYWN0LXJvdXRlci1kb21cIjogXCI2LjIzLjFcIlxuICB9LFxuICBcIm1haW5cIjogXCIvaW5kZXguanNcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge31cbn1cbiAgYCxcbiAgXCIvQXBwLmpzXCI6IGBcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJSb3V0ZXIsIFJvdXRlclByb3ZpZGVyIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSdcblxuY29uc3Qgcm91dGVyID0gY3JlYXRlQnJvd3NlclJvdXRlcihbXG4gIHsgcGF0aDogXCIvXCIsIGVsZW1lbnQ6IDxkaXY+SGVsbG8gd29ybGQhPC9kaXY+IH0sXG4gIHsgcGF0aDogXCIvc2VjcmV0XCIsIGVsZW1lbnQ6IDxkaXY+SGVsbG8gU2VjcmV0ITwvZGl2PiB9LFxuXSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkge1xuICByZXR1cm4gPFJvdXRlclByb3ZpZGVyIHJvdXRlcj17cm91dGVyfSAvPlxufVxuICBgLnRyaW0oKSxcbn07XG4ifX0sInRlbXBsYXRlIjoicmVhY3QifSwiZGlzcGxheSI6eyJjb21wb25lbnRzIjp7IkVkaXRvciI6eyJ0eXBlIjoiZWRpdG9yIiwiZGF0YSI6eyJzaG93VGFicyI6dHJ1ZSwic2hvd0xpbmVOdW1iZXJzIjp0cnVlLCJzaG93SW5saW5lRXJyb3JzIjpmYWxzZSwic2hvd1J1bkJ1dHRvbiI6dHJ1ZSwid3JhcENvbnRlbnQiOnRydWUsImNsb3NhYmxlVGFicyI6dHJ1ZSwicmVhZE9ubHkiOmZhbHNlLCJzaG93UmVhZE9ubHkiOmZhbHNlfX0sIlByZXZpZXciOnsidHlwZSI6InByZXZpZXciLCJkYXRhIjp7InNob3dOYXZpZ2F0b3IiOmZhbHNlLCJzaG93T3BlbkluQ29kZVNhbmRib3giOmZhbHNlLCJzaG93UmVmcmVzaEJ1dHRvbiI6dHJ1ZSwic2hvd1NhbmRwYWNrRXJyb3JPdmVybGF5IjpmYWxzZX19fSwiZ2VuZXJhbCI6eyJ2aXNpYmxlRmlsZXMiOlsiL0FwcC5qcyJdLCJ0aGVtZSI6ImtlbXBvRGFyayJ9LCJsYXlvdXRzIjp7InNtYWxsIjoiJ0VkaXRvcidcbidQcmV2aWV3JyJ9fX0=" height="750px" width="100%"></iframe>

In the example above, we're using React Router. We've defined a root route at `/` and another route at `/secret`. By default, the app is on the `/` route which shows a page with the text "**Hello world!**".

Try using the search bar to navigate to the `/secret` route. The page should update and show the text "**Hello Secret!**" now!

Great! But what if we want the app to *start* on the `/secret` route instead of the `/` route?

Well, that's easy too!

You can use the `startRoute` prop like below:

<iframe src="https://kempo.io/view/eyJpZCI6ImtsX2dmMTdueHNoN3drZXRzdndyd3E2MXVnciIsIm5hbWUiOiJTYW5kcGFjayBDb21wb25lbnQgRXhhbXBsZXMiLCJjb3JlIjp7ImZpbGVzIjp7Ii9zdHlsZXMuY3NzIjp7ImNvZGUiOiJib2R5IHtcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIGZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICBmb250LXNtb290aDogYWx3YXlzO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XG59XG5cbi5idG4td3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIHdpZHRoOiAxMDAlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbiAgcGFkZGluZzogOHB4O1xufVxuIn0sIi9BcHAuanMiOnsiY29kZSI6ImltcG9ydCB7XG4gIFNhbmRwYWNrUHJvdmlkZXIsXG4gIFNhbmRwYWNrQ29kZUVkaXRvcixcbiAgU2FuZHBhY2tMYXlvdXQsXG4gIFNhbmRwYWNrUHJldmlldyxcbn0gZnJvbSBcIkBjb2Rlc2FuZGJveC9zYW5kcGFjay1yZWFjdFwiO1xuaW1wb3J0IHsgZmlsZXMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7XG4gIHJldHVybiAoXG4gICAgPFNhbmRwYWNrUHJvdmlkZXIgdGVtcGxhdGU9XCJyZWFjdFwiIGZpbGVzPXtmaWxlc30+XG4gICAgICA8U2FuZHBhY2tMYXlvdXQ+XG4gICAgICAgIDxTYW5kcGFja0NvZGVFZGl0b3IgLz5cbiAgICAgICAgPFNhbmRwYWNrUHJldmlldyBzaG93TmF2aWdhdG9yIHN0YXJ0Um91dGU9XCIvc2VjcmV0XCIgLz5cbiAgICAgIDwvU2FuZHBhY2tMYXlvdXQ+XG4gICAgPC9TYW5kcGFja1Byb3ZpZGVyPlxuICApO1xufVxuIn0sIi9pbmRleC5qcyI6eyJjb2RlIjoiaW1wb3J0IFJlYWN0LCB7IFN0cmljdE1vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZVJvb3QgfSBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiO1xuaW1wb3J0IFwiLi9zdHlsZXMuY3NzXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4vQXBwXCI7XG5cbmNvbnN0IHJvb3QgPSBjcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdFwiKSk7XG5yb290LnJlbmRlcihcbiAgPFN0cmljdE1vZGU+XG4gICAgPEFwcCAvPlxuICA8L1N0cmljdE1vZGU+XG4pOyJ9LCIvcHVibGljL2luZGV4Lmh0bWwiOnsiY29kZSI6IjwhRE9DVFlQRSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCI+XG4gICAgPHRpdGxlPkRvY3VtZW50PC90aXRsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8ZGl2IGlkPVwicm9vdFwiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+In0sIi9wYWNrYWdlLmpzb24iOnsiY29kZSI6IntcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwicmVhY3RcIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1kb21cIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1zY3JpcHRzXCI6IFwiXjUuMC4wXCIsXG4gICAgXCJAY29kZXNhbmRib3gvc2FuZHBhY2stcmVhY3RcIjogXCIyLjE0LjBcIixcbiAgICBcIkBjb2Rlc2FuZGJveC9zYW5kcGFjay10aGVtZXNcIjogXCIyLjAuMjFcIlxuICB9LFxuICBcIm1haW5cIjogXCIvaW5kZXguanNcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge31cbn0ifSwiL3V0aWxzLnRzIjp7ImNvZGUiOiJleHBvcnQgY29uc3QgZmlsZXMgPSB7XG4gIFwiL3BhY2thZ2UuanNvblwiOiBgXG57XG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInJlYWN0XCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3QtZG9tXCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3Qtc2NyaXB0c1wiOiBcIl41LjAuMFwiLFxuICAgIFwicmVhY3Qtcm91dGVyLWRvbVwiOiBcIjYuMjMuMVwiXG4gIH0sXG4gIFwibWFpblwiOiBcIi9pbmRleC5qc1wiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7fVxufVxuICBgLFxuICBcIi9BcHAuanNcIjogYFxuaW1wb3J0IHsgY3JlYXRlQnJvd3NlclJvdXRlciwgUm91dGVyUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJ1xuXG5jb25zdCByb3V0ZXIgPSBjcmVhdGVCcm93c2VyUm91dGVyKFtcbiAgeyBwYXRoOiBcIi9cIiwgZWxlbWVudDogPGRpdj5IZWxsbyB3b3JsZCE8L2Rpdj4gfSxcbiAgeyBwYXRoOiBcIi9zZWNyZXRcIiwgZWxlbWVudDogPGRpdj5IZWxsbyBTZWNyZXQhPC9kaXY+IH0sXG5dKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7XG4gIHJldHVybiA8Um91dGVyUHJvdmlkZXIgcm91dGVyPXtyb3V0ZXJ9IC8+XG59XG4gIGAudHJpbSgpLFxufTtcbiJ9fSwidGVtcGxhdGUiOiJyZWFjdCJ9LCJkaXNwbGF5Ijp7ImNvbXBvbmVudHMiOnsiRWRpdG9yIjp7InR5cGUiOiJlZGl0b3IiLCJkYXRhIjp7InNob3dUYWJzIjp0cnVlLCJzaG93TGluZU51bWJlcnMiOnRydWUsInNob3dJbmxpbmVFcnJvcnMiOmZhbHNlLCJzaG93UnVuQnV0dG9uIjp0cnVlLCJ3cmFwQ29udGVudCI6dHJ1ZSwiY2xvc2FibGVUYWJzIjp0cnVlLCJyZWFkT25seSI6ZmFsc2UsInNob3dSZWFkT25seSI6ZmFsc2V9fSwiUHJldmlldyI6eyJ0eXBlIjoicHJldmlldyIsImRhdGEiOnsic2hvd05hdmlnYXRvciI6ZmFsc2UsInNob3dPcGVuSW5Db2RlU2FuZGJveCI6ZmFsc2UsInNob3dSZWZyZXNoQnV0dG9uIjp0cnVlLCJzaG93U2FuZHBhY2tFcnJvck92ZXJsYXkiOmZhbHNlfX19LCJnZW5lcmFsIjp7InZpc2libGVGaWxlcyI6WyIvQXBwLmpzIl0sInRoZW1lIjoia2VtcG9EYXJrIn0sImxheW91dHMiOnsic21hbGwiOiInRWRpdG9yJ1xuJ1ByZXZpZXcnIn19fQ==" height="750px" width="100%"></iframe>

### You can add custom actions to your Preview component.

The Preview component supports custom actions. The idea is that you can use a custom action to provide additional functionality to your playground. Let's say I wanted a way to toggle the search bar in the previous example.

We can combine React state with a basic toggle button to accomplish this:

<iframe src="https://kempo.io/view/eyJpZCI6ImtsX2dmMTdueHNoN3drZXRzdndyd3E2MXVnciIsIm5hbWUiOiJTYW5kcGFjayBDb21wb25lbnQgRXhhbXBsZXMiLCJjb3JlIjp7ImZpbGVzIjp7Ii9zdHlsZXMuY3NzIjp7ImNvZGUiOiJib2R5IHtcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIGZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICBmb250LXNtb290aDogYWx3YXlzO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XG59XG4ifSwiL0FwcC5qcyI6eyJjb2RlIjoiaW1wb3J0IHtcbiAgU2FuZHBhY2tQcm92aWRlcixcbiAgU2FuZHBhY2tDb2RlRWRpdG9yLFxuICBTYW5kcGFja0xheW91dCxcbiAgU2FuZHBhY2tQcmV2aWV3LFxufSBmcm9tIFwiQGNvZGVzYW5kYm94L3NhbmRwYWNrLXJlYWN0XCI7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgZmlsZXMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7XG4gIGNvbnN0IFtzaG93TmF2aWdhdG9yLCBzZXRTaG93TmF2aWdhdG9yXSA9IHVzZVN0YXRlKHRydWUpO1xuXG4gIHJldHVybiAoXG4gICAgPFNhbmRwYWNrUHJvdmlkZXIgdGVtcGxhdGU9XCJyZWFjdFwiIGZpbGVzPXtmaWxlc30+XG4gICAgICA8U2FuZHBhY2tMYXlvdXQ+XG4gICAgICAgIDxTYW5kcGFja0NvZGVFZGl0b3IgLz5cbiAgICAgICAgPFNhbmRwYWNrUHJldmlld1xuICAgICAgICAgIHNob3dOYXZpZ2F0b3I9e3Nob3dOYXZpZ2F0b3J9XG4gICAgICAgICAgc3RhcnRSb3V0ZT1cIi9zZWNyZXRcIlxuICAgICAgICAgIGFjdGlvbnNDaGlsZHJlbj17XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldFNob3dOYXZpZ2F0b3IoIXNob3dOYXZpZ2F0b3IpfT5cbiAgICAgICAgICAgICAgVG9nZ2xlIFNlYXJjaCBCYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvU2FuZHBhY2tMYXlvdXQ+XG4gICAgPC9TYW5kcGFja1Byb3ZpZGVyPlxuICApO1xufVxuIn0sIi9pbmRleC5qcyI6eyJjb2RlIjoiaW1wb3J0IFJlYWN0LCB7IFN0cmljdE1vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZVJvb3QgfSBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiO1xuaW1wb3J0IFwiLi9zdHlsZXMuY3NzXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4vQXBwXCI7XG5cbmNvbnN0IHJvb3QgPSBjcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdFwiKSk7XG5yb290LnJlbmRlcihcbiAgPFN0cmljdE1vZGU+XG4gICAgPEFwcCAvPlxuICA8L1N0cmljdE1vZGU+XG4pOyJ9LCIvcHVibGljL2luZGV4Lmh0bWwiOnsiY29kZSI6IjwhRE9DVFlQRSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCI+XG4gICAgPHRpdGxlPkRvY3VtZW50PC90aXRsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8ZGl2IGlkPVwicm9vdFwiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+In0sIi9wYWNrYWdlLmpzb24iOnsiY29kZSI6IntcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwicmVhY3RcIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1kb21cIjogXCJeMTguMC4wXCIsXG4gICAgXCJyZWFjdC1zY3JpcHRzXCI6IFwiXjUuMC4wXCIsXG4gICAgXCJAY29kZXNhbmRib3gvc2FuZHBhY2stcmVhY3RcIjogXCIyLjE0LjBcIixcbiAgICBcIkBjb2Rlc2FuZGJveC9zYW5kcGFjay10aGVtZXNcIjogXCIyLjAuMjFcIlxuICB9LFxuICBcIm1haW5cIjogXCIvaW5kZXguanNcIixcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge31cbn0ifSwiL3V0aWxzLnRzIjp7ImNvZGUiOiJleHBvcnQgY29uc3QgZmlsZXMgPSB7XG4gIFwiL3BhY2thZ2UuanNvblwiOiBgXG57XG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInJlYWN0XCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3QtZG9tXCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3Qtc2NyaXB0c1wiOiBcIl41LjAuMFwiLFxuICAgIFwicmVhY3Qtcm91dGVyLWRvbVwiOiBcIjYuMjMuMVwiXG4gIH0sXG4gIFwibWFpblwiOiBcIi9pbmRleC5qc1wiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7fVxufVxuICBgLFxuICBcIi9BcHAuanNcIjogYFxuaW1wb3J0IHsgY3JlYXRlQnJvd3NlclJvdXRlciwgUm91dGVyUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJ1xuXG5jb25zdCByb3V0ZXIgPSBjcmVhdGVCcm93c2VyUm91dGVyKFtcbiAgeyBwYXRoOiBcIi9cIiwgZWxlbWVudDogPGRpdj5IZWxsbyB3b3JsZCE8L2Rpdj4gfSxcbiAgeyBwYXRoOiBcIi9zZWNyZXRcIiwgZWxlbWVudDogPGRpdj5IZWxsbyBTZWNyZXQhPC9kaXY+IH0sXG5dKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBcHAoKSB7XG4gIHJldHVybiA8Um91dGVyUHJvdmlkZXIgcm91dGVyPXtyb3V0ZXJ9IC8+XG59XG4gIGAudHJpbSgpLFxufTtcbiJ9fSwidGVtcGxhdGUiOiJyZWFjdCJ9LCJkaXNwbGF5Ijp7ImNvbXBvbmVudHMiOnsiRWRpdG9yIjp7InR5cGUiOiJlZGl0b3IiLCJkYXRhIjp7InNob3dUYWJzIjp0cnVlLCJzaG93TGluZU51bWJlcnMiOnRydWUsInNob3dJbmxpbmVFcnJvcnMiOmZhbHNlLCJzaG93UnVuQnV0dG9uIjp0cnVlLCJ3cmFwQ29udGVudCI6dHJ1ZSwiY2xvc2FibGVUYWJzIjp0cnVlLCJyZWFkT25seSI6ZmFsc2UsInNob3dSZWFkT25seSI6ZmFsc2V9fSwiUHJldmlldyI6eyJ0eXBlIjoicHJldmlldyIsImRhdGEiOnsic2hvd05hdmlnYXRvciI6ZmFsc2UsInNob3dPcGVuSW5Db2RlU2FuZGJveCI6ZmFsc2UsInNob3dSZWZyZXNoQnV0dG9uIjp0cnVlLCJzaG93U2FuZHBhY2tFcnJvck92ZXJsYXkiOmZhbHNlfX19LCJnZW5lcmFsIjp7InZpc2libGVGaWxlcyI6WyIvQXBwLmpzIl0sInRoZW1lIjoia2VtcG9EYXJrIn0sImxheW91dHMiOnsic21hbGwiOiInRWRpdG9yJ1xuJ1ByZXZpZXcnIn19fQ==" height="750px" width="100%"></iframe>

### You can use refs to interact with the Sandpack client.

Let's say I'm building a demo to showcase Tailwind CSS.

I want to include a button to add or remove Tailwind from the page. This will make it easier to compare the UI with and without Tailwind. An easy way to add Tailwind to a Sandpack instance is to [pass the CDN to Sandpack as an external resource](https://sandpack.codesandbox.io/docs/getting-started/usage#static-external-resources).

But how do you update the external resources?

We can't do this with just a custom action. Instead, we can pass a React ref to the Preview component. The Preview component uses React's [useImperativeHandle](https://react.dev/reference/react/useImperativeHandle) hook to attach a handler function that returns the underlying Sandpack client to the ref.

We can use the Sandpack client to update the external resources and refresh the Preview:

<iframe src="https://kempo.io/view/eyJpZCI6ImtsX2dmMTdueHNoN3drZXRzdndyd3E2MXVnciIsIm5hbWUiOiJTYW5kcGFjayBDb21wb25lbnQgRXhhbXBsZXMiLCJjb3JlIjp7ImZpbGVzIjp7Ii9zdHlsZXMuY3NzIjp7ImNvZGUiOiJib2R5IHtcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otZm9udC1zbW9vdGhpbmc6IGF1dG87XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIGZvbnQtc21vb3RoaW5nOiBhdXRvO1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICBmb250LXNtb290aDogYWx3YXlzO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XG59XG4ifSwiL0FwcC5qcyI6eyJjb2RlIjoiaW1wb3J0IHtcbiAgU2FuZHBhY2tQcm92aWRlcixcbiAgU2FuZHBhY2tDb2RlRWRpdG9yLFxuICBTYW5kcGFja0xheW91dCxcbiAgU2FuZHBhY2tQcmV2aWV3LFxufSBmcm9tIFwiQGNvZGVzYW5kYm94L3NhbmRwYWNrLXJlYWN0XCI7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBmaWxlcyB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCgpIHtcbiAgY29uc3QgcHJldmlld1JlZiA9IHVzZVJlZihudWxsKTtcblxuICByZXR1cm4gKFxuICAgIDxTYW5kcGFja1Byb3ZpZGVyIHRlbXBsYXRlPVwicmVhY3RcIiBmaWxlcz17ZmlsZXN9PlxuICAgICAgPFNhbmRwYWNrTGF5b3V0PlxuICAgICAgICA8U2FuZHBhY2tDb2RlRWRpdG9yIC8+XG4gICAgICAgIDxTYW5kcGFja1ByZXZpZXdcbiAgICAgICAgICByZWY9e3ByZXZpZXdSZWZ9XG4gICAgICAgICAgYWN0aW9uc0NoaWxkcmVuPXtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudCA9IHByZXZpZXdSZWYuY3VycmVudD8uZ2V0Q2xpZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGllbnQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhaWx3aW5kQ2RuID0gXCJodHRwczovL2Nkbi50YWlsd2luZGNzcy5jb21cIjtcbiAgICAgICAgICAgICAgICBjb25zdCBleHRlcm5hbFJlc291cmNlcyA9XG4gICAgICAgICAgICAgICAgICBjbGllbnQub3B0aW9ucy5leHRlcm5hbFJlc291cmNlcz8uaW5jbHVkZXModGFpbHdpbmRDZG4pXG4gICAgICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICAgICAgOiBbXCJodHRwczovL2Nkbi50YWlsd2luZGNzcy5jb21cIl07XG5cbiAgICAgICAgICAgICAgICBjbGllbnQudXBkYXRlT3B0aW9ucyh7IC4uLmNsaWVudC5vcHRpb25zLCBleHRlcm5hbFJlc291cmNlcyB9KTtcbiAgICAgICAgICAgICAgICBjbGllbnQuZGlzcGF0Y2goeyB0eXBlOiBcInJlZnJlc2hcIiB9KTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgVG9nZ2xlIFRhaWx3aW5kXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L1NhbmRwYWNrTGF5b3V0PlxuICAgIDwvU2FuZHBhY2tQcm92aWRlcj5cbiAgKTtcbn1cbiJ9LCIvaW5kZXguanMiOnsiY29kZSI6ImltcG9ydCBSZWFjdCwgeyBTdHJpY3RNb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIjtcbmltcG9ydCBcIi4vc3R5bGVzLmNzc1wiO1xuXG5pbXBvcnQgQXBwIGZyb20gXCIuL0FwcFwiO1xuXG5jb25zdCByb290ID0gY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RcIikpO1xucm9vdC5yZW5kZXIoXG4gIDxTdHJpY3RNb2RlPlxuICAgIDxBcHAgLz5cbiAgPC9TdHJpY3RNb2RlPlxuKTsifSwiL3B1YmxpYy9pbmRleC5odG1sIjp7ImNvZGUiOiI8IURPQ1RZUEUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiPlxuICAgIDx0aXRsZT5Eb2N1bWVudDwvdGl0bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPGRpdiBpZD1cInJvb3RcIj48L2Rpdj5cbiAgPC9ib2R5PlxuPC9odG1sPiJ9LCIvcGFja2FnZS5qc29uIjp7ImNvZGUiOiJ7XG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInJlYWN0XCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3QtZG9tXCI6IFwiXjE4LjAuMFwiLFxuICAgIFwicmVhY3Qtc2NyaXB0c1wiOiBcIl41LjAuMFwiLFxuICAgIFwiQGNvZGVzYW5kYm94L3NhbmRwYWNrLXJlYWN0XCI6IFwiMi4xNC4wXCIsXG4gICAgXCJAY29kZXNhbmRib3gvc2FuZHBhY2stdGhlbWVzXCI6IFwiMi4wLjIxXCJcbiAgfSxcbiAgXCJtYWluXCI6IFwiL2luZGV4LmpzXCIsXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHt9XG59In0sIi91dGlscy50cyI6eyJjb2RlIjoiZXhwb3J0IGNvbnN0IGZpbGVzID0ge1xuICBcIi9BcHAuanNcIjogYFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGwgdGV4dC1za3ktNjAwIHRleHQtY2VudGVyXCJcbiAgICA+XG4gICAgICBIZWxsbyBXb3JsZCFcbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgYC50cmltKCksXG59O1xuIn19LCJ0ZW1wbGF0ZSI6InJlYWN0In0sImRpc3BsYXkiOnsiY29tcG9uZW50cyI6eyJFZGl0b3IiOnsidHlwZSI6ImVkaXRvciIsImRhdGEiOnsic2hvd1RhYnMiOnRydWUsInNob3dMaW5lTnVtYmVycyI6dHJ1ZSwic2hvd0lubGluZUVycm9ycyI6ZmFsc2UsInNob3dSdW5CdXR0b24iOnRydWUsIndyYXBDb250ZW50Ijp0cnVlLCJjbG9zYWJsZVRhYnMiOnRydWUsInJlYWRPbmx5IjpmYWxzZSwic2hvd1JlYWRPbmx5IjpmYWxzZX19LCJQcmV2aWV3Ijp7InR5cGUiOiJwcmV2aWV3IiwiZGF0YSI6eyJzaG93TmF2aWdhdG9yIjpmYWxzZSwic2hvd09wZW5JbkNvZGVTYW5kYm94IjpmYWxzZSwic2hvd1JlZnJlc2hCdXR0b24iOnRydWUsInNob3dTYW5kcGFja0Vycm9yT3ZlcmxheSI6ZmFsc2V9fX0sImdlbmVyYWwiOnsidmlzaWJsZUZpbGVzIjpbIi9BcHAuanMiXSwidGhlbWUiOiJrZW1wb0RhcmsifSwibGF5b3V0cyI6eyJzbWFsbCI6IidFZGl0b3InXG4nUHJldmlldycifX19" height="750px" width="100%"></iframe>

This pattern is useful because it automatically refreshes the Preview with the new resource.

In fact, this is a pattern I follow in [Kempo](https://kempo.io):

![A video showing how to add external resources in Kempo which is a web applicate to configure Sandpack instances.](https://cdn.hashnode.com/res/hashnode/image/upload/v1717912693421/6f0d469c-129b-4678-9f34-648e05ffb17e.gif align="center")

> Note: [Kempo lets you build embeddable Sandpack instances.](https://hashnode.com/post/clw6s792g000n0al02sqahcy4)

And that's it!

Hopefully, this helps you use Sandpack's Preview component more effectively!
