@tinacms/vercel-previews
Version:
⚠️ You must be a Vercel Enterprise customer for Visual Editing ⚠️
124 lines (103 loc) • 3.83 kB
Markdown
## Getting started
⚠️ You must be a Vercel Enterprise customer for Visual Editing ⚠️
> For a quick start, use [the starter](https://github.com/tinacms/vercel-edit-demo)
To use Vercel's [visual editing](https://vercel.com/blog/visual-editing) features with Tina your site should already be configured to work with Tina's `useTina` hook. Refer to this guide to get started with [Tina's visual edting](https://tina.io/docs/contextual-editing/overview/).
Vercel's visual editing mode works by adding metadata to your page about where the content comes from. To get started, add the preview package:
```
npm install /vercel-previews
```
There are two ways to indicate that a field is editable, **automatically** by enabling string-encoding and **manually** by adding data attributes to editable elements on your page.
### Enabling string-encoding
```tsx
// pages/[slug].tsx
import { useTina } from 'tinacms/dist/react'
import { useVisualEditing } from '/vercel-previews'
export const Post = (props) => {
const { data: tinaData } = useTina(props)
const data = useVisualEditing({
data: tinaData,
// metadata is derived from the query and variables
query: props.query,
variables: props.variables,
// When clicking on an editable element for the first time, redirect to the TinaCMS app
redirect: '/admin',
// Only enable visual editing on preview deploys
enabled: props.visualEditingEnabled
// stringEncoding automatically adds metadata to strings
stringEncoding: true,
// Alternatively, you can skip some strings from being encoded
stringEncoding: {
skipPaths: (path) => {
if ('page.blocks.0.image' === path) {
return true
}
return false
}
}
})
return (
<div>
<h1>
{data.title}
</h1>
</div>
)
}
```
### Manually adding data attributes
String-encoding can break things like links or images. If you decide to turn string-encoding off you can still enable
visual editing with the `[data-vercel-edit-info]` attribute.
If an element has a `[data-vercel-edit-info]` attribute on it, it will be considered editable.
Tina provides a helper function to add the necessary metadata to your element:
#### The `vercelEditInfo` helper
```tsx
// pages/[slug].tsx
import { useTina } from 'tinacms/dist/react'
import { vercelEditInfo, useVisualEditing } from '/vercel-previews'
export const Post = (props) => {
const { data: tinaData } = useTina(props)
const data = useVisualEditing({
data: tinaData,
// metadata is derived from the query and variables
query: props.query,
variables: props.variables,
// When clicking on an editable element for the first time, redirect to the TinaCMS app
redirect: '/admin',
// Only enable visual editing on preview deploys
enabled: props.visualEditingEnabled
// stringEncoding automatically adds metadata to strings
stringEncoding: false
})
return (
<div>
<h1 data-vercel-edit-info={vercelEditInfo(data, 'title')}>
{data.title}
</h1>
</div>
)
}
```
For deeper objects, the API is the same, notice in this example we can also mark the
`div` wrapping the "actions" in a selectable field
```jsx
export const NewsletterBlock = (props) => {
return (
<div>
<p data-vercel-edit-info={vercelEditInfo(props, 'message')}>
{props.message}
</p>
<div data-vercel-edit-info={vercelEditInfo(props, 'actions')}>
{props.actions.map((action) => {
return (
<button
// notice here that the first value is the action object
data-vercel-edit-info={vercelEditInfo(action, 'message')}
{...action}
/>
)
})}
</div>
</div>
)
}
```