Issues with rendering standard text in Svelte PortableText v2 component
16 replies
Last updated: Mar 8, 2023
E
I hope somebody can point me in the right direction, I’ve been banging my head against the keyboard for to long now! It’s really 3 issues, but I think they’re related.
I’m using
svelte-portabletext v2 to render my Sanity portabletext. I’ve got few custom components, which outputs ok, but the non-custom, standard text is having issues.1. In the console I get the following error:
2. In the rendered HTML page everything is there, but if I include a link in a paragraf, the whole paragraf disappears! (I wonder if it’s because I had to make a custom Block from another error asking me to add one?)
3. And most odd, the wrapping div with id=svelte
disappears when I reload the page, or enter it directly via URL, but the ``%sveltekit.body%`` still loads. But if I navigate from another page, the wrapping div#svelte is there.
My kitchensink page with the PortableText component:
I’m using
svelte-portabletext v2 to render my Sanity portabletext. I’ve got few custom components, which outputs ok, but the non-custom, standard text is having issues.1. In the console I get the following error:
Unknown list item style "normal", specify a component for it in the `components.listItem` prop
3. And most odd, the wrapping div with id=svelte
<div _id_="svelte">%sveltekit.body%</div>
My kitchensink page with the PortableText component:
<script>
import { imageUrlFor } from '$lib/utils/_sanity';
import { PortableText } from '@portabletext/svelte';
import Cta from '$lib/utils/serializers/cta.svelte';
import Link from '$lib/utils/serializers/link.svelte';
import Code from '$lib/utils/serializers/code.svelte';
import ImageBlock from '$lib/utils/serializers/imageBlock.svelte';
import AuthorBlock from '$lib/utils/serializers/authorBlock.svelte';
import Button from '$lib/utils/serializers/button.svelte';
import Vimeo from '$lib/utils/serializers/vimeo.svelte';
import EmbedHTML from '$lib/utils/serializers/embedHTML.svelte';
import Block from '$lib/utils/serializers/block.svelte';
import ListItem from '$lib/utils/serializers/listItem.svelte';
</script>
<PortableText
value={post.body}
components={{
marks: {
link: Link,
},
types: {
cta: Cta,
code: Code,
image: ImageBlock,
authorReference: AuthorBlock,
button: Button,
vimeo: Vimeo,
embedHTML: EmbedHTML,
block: Block,
listItem: {
bullet: ListItem,
number: ListItem,
normal: ListItem
}
}
}}
/>Feb 27, 2023, 9:55 AM
J
Found this gh issue that might help: https://github.com/portabletext/svelte-portabletext/issues/9
Mar 8, 2023, 3:31 PM
E
jedi move! I was just looking at this right now, again
Mar 8, 2023, 3:31 PM
E
I’ve narrowed it down to coming from my custom Block element now.
However, when this is in use I get
// block.svelte
<script>
export let portableText
$: ({value} = portableText)
$: style = value.style || 'normal'
</script>
{#if style === 'normal'}
<p>{value}</p>
{:else}
{value}
{/if}[object object]. So I’m close, but I can’t figure out why I’m getting object and not the contents?
Mar 8, 2023, 3:38 PM
E
hi! I’m getting
undefinedHmm 🤔
Mar 8, 2023, 4:32 PM
J
figures, log portableText and see what’s actually getting passed there
Mar 8, 2023, 4:33 PM
E
using
{@debug value} I getObject {
value: Object { _key: "09334c0068b5", _type: "block", style: "normal", … }}Mar 8, 2023, 4:33 PM
E
Logging portableText:
Mar 8, 2023, 4:36 PM
E
Output from
JSON.stringify(value, 0, 2), so it’s there, I think?
{
"_key": "a916b44a5f35",
"_type": "block",
"children": [
{
"_key": "57e89ed06f2f",
"_type": "span",
"marks": [
"05cf5d422daf"
],
"text": "reMarkable"
},
{
"_key": "451370a506d0",
"_type": "span",
"marks": [],
"text": " is on a quest to help more people think better through technology. "
}
],
"markDefs": [
{
"blank": null,
"class": null,
"href": "<http://example.com|example.com>"
}
],
"style": "normal"
}Mar 8, 2023, 4:43 PM
E
But shouldn’t the
markDefshave a reference to the
_key? Or say it’s of type
link?
Mar 8, 2023, 4:44 PM
E
nah. no good. I’m starting to feel pretty dumb . have waisted so much time on this now
Mar 8, 2023, 5:51 PM
E
user Q
would you mind enlightening me on why it figures that I get undefinedwhen I log out
value?
Mar 8, 2023, 5:56 PM
But shouldn’t theIndeed, those are notmarkDefshave a reference to the_key? Or say it’s of typelink?
markDefsproperties I’ve seen before.
would you mind enlightening me on why it figures that I getWhere are you seeing undefined?undefinedwhen I log outvalue?
Mar 8, 2023, 7:05 PM
E
user A
omg thank you! You led me on the right track with those markDefs!
A while back I tried creating some custom fields for links, to select opening in new tab or adding a class. So my groq looked like this:
markDefs[]{
_type == 'link' => {
blank,
href,
class[0]
}
}…however, I get everything working!
markDefs[]{
_type == 'link' => {
...
}
}Mar 8, 2023, 8:22 PM
Great! Thanks for following up to let us know. Glad to hear you figured it out. 😀
Mar 8, 2023, 8:23 PM
E
I do not want to know how many hours that cost me 😭
Mar 8, 2023, 8:24 PM
Sanity – Build the way you think, not the way your CMS thinks
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.
