К основному содержанию
скилл CX Codex

portable-text-serialization — скилл для Claude Code: рендер Portable

Скилл подсказывает агенту, как рендерить и сериализовать Portable Text в React, Svelte, Vue, Astro, HTML, Markdown и чистый текст.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add sanity-io/agent-toolkit --skill portable-text-serialization -a claude-code
Открыть на GitHub

Что делает portable-text-serialization

Portable Text — массив блоков из Sanity: у каждого блока есть _type, стиль, children со спанами, markDefs, а у списков ещё listItem и level. Скилл объясняет агенту эту структуру и то, как её разбирать. Дальше он ведёт по семейству библиотек @portabletext/* — у всех один и тот же приём: вы передаёте объект components, который сопоставляет типы узлов с рендерерами конкретного фреймворка.

Внутри лежат отдельные файлы-правила под каждый таргет: rules/react.md для React и Next.js, rules/svelte.md, rules/vue.md, rules/astro.md, плюс серверные rules/html.md, rules/markdown.md и rules/plain-text.md. Ключи объекта components общие для всех: types для кастомных блоков вроде изображения или кода, marks для декораторов и аннотаций, block, list, listItem, hardBreak.

Главная засада — кастомные типы. Рендереры по умолчанию разбирают только стандартные блоки, поэтому image, code или callToAction без явного сопоставления просто не появятся. Ещё в React и Vue объект components стоит выносить за пределы функции рендера или мемоизировать: пересоздание на каждом рендере тянет лишние перерисовки. Для неизвестных типов все библиотеки принимают onMissingComponent — можно заглушить предупреждения или отправить их в лог.

Какие задачи решает

  • отрендерить тело статьи из Sanity в React или Next.js
  • собрать HTML-строку из Portable Text на сервере
  • перевести Portable Text в Markdown
  • вытащить чистый текст без разметки
  • написать сериализатор для кастомного блока вроде изображения или кода

Примеры запросов агенту

  • Отрендери этот Portable Text в React, ссылки из markDefs сделай через next/link
  • Сконвертируй документ в Markdown для экспорта
  • Достань из этого блока только текст, без marks и ссылок

Как установить portable-text-serialization

1Через Skills CLI (Vercel)

npx skills add sanity-io/agent-toolkit --skill portable-text-serialization -a claude-code

2Вручную: положить файлы

~/.claude/skills/portable-text-serialization/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/portable-text-serialization/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о portable-text-serialization

Как установить portable-text-serialization в Claude?

Выполните npx skills add sanity-io/agent-toolkit --skill portable-text-serialization -a claude-code. Скилл появится по пути ~/.claude/skills/portable-text-serialization/SKILL.md.

Что делает portable-text-serialization?

Учит агента рендерить и сериализовать Portable Text: он разбирает структуру блоков, спанов и markDefs и подбирает нужную библиотеку @portabletext/* под ваш фреймворк.

Почему кастомные блоки не отображаются?

Рендереры обрабатывают только стандартные блоки. Для image, code и других своих типов нужно явно прописать компонент в ключе types объекта components.

Исходный текст

SKILL.md · MIT
---
name: portable-text-serialization
description: Render and serialize Portable Text to React, Svelte, Vue, Astro, HTML, Markdown, and plain text. Use when implementing Portable Text rendering in any frontend framework, building custom serializers for non-standard block types, converting Portable Text to HTML strings server-side, converting Portable Text to Markdown, extracting plain text from Portable Text, or troubleshooting rendering issues with marks, blocks, lists, or custom types.
license: MIT
metadata:
  author: sanity
  version: "1.0.0"
---

# Portable Text Serialization

Render Portable Text content across frameworks using the `@portabletext/*` library family. Each library follows the same component-mapping pattern: you provide a `components` object that maps PT node types to framework-specific renderers.

## Portable Text Structure (Quick Reference)

PT is an array of blocks. Each block has `_type`, optional `style`, `children` (spans), `markDefs`, `listItem`, and `level`.

```
Root array
├── block (_type: "block")
│   ├── style: "normal" | "h1" | "h2" | "blockquote" | ...
│   ├── children: [span, span, ...]
│   │   └── span: { _type: "span", text: "...", marks: ["strong", "<markDefKey>"] }
│   ├── markDefs: [{ _key, _type: "link", href: "..." }, ...]
│   ├── listItem: "bullet" | "number" (optional)
│   └── level: 1, 2, 3... (optional, for nested lists)
├── custom block (_type: "image" | "code" | any custom type)
└── ...more blocks
```

**Marks** come in two forms:
- **Decorators**: string values in `marks[]` like `"strong"`, `"em"`, `"underline"`, `"code"`
- **Annotations**: keys in `marks[]` referencing entries in `markDefs[]` (e.g., links, internal references)

## Component Mapping Pattern (All Frameworks)

Every `@portabletext/*` library accepts a `components` object with these keys:

| Key | Renders | Props/Data |
|-----|---------|------------|
| `types` | Custom block/inline types (image, code, CTA) | `value` (the block data) |
| `marks` | Decorators + annotations | `children` + `value` (mark data) |
| `block` | Block styles (h1, normal, blockquote) | `children` |
| `list` | List wrappers (ul, ol) | `children` |
| `listItem` | List items | `children` |
| `hardBreak` | Line breaks within a block | — |

## Framework-Specific Rules

Read the rule file matching your framework:

- **React / Next.js**: `rules/react.md` — `@portabletext/react` or `next-sanity`
- **Svelte / SvelteKit**: `rules/svelte.md` — `@portabletext/svelte`
- **Vue / Nuxt**: `rules/vue.md` — `@portabletext/vue`
- **Astro**: `rules/astro.md` — `astro-portabletext`
- **HTML (server-side)**: `rules/html.md` — `@portabletext/to-html`
- **Markdown**: `rules/markdown.md` — `@portabletext/markdown`
- **Plain text extraction**: `rules/plain-text.md` — `@portabletext/toolkit`

### Additional Community Serializers

These are listed on [portabletext.org](https://www.portabletext.org/integrations/serializers/) but don't have dedicated rule files:

| Target | Package |
|--------|---------|
| React Native | `@portabletext/react-native-portabletext` |
| React PDF | `@portabletext/react-pdf-portabletext` |
| Solid | `solid-portabletext` |
| Qwik | `portabletext-qwik` |
| Shopify Liquid | `portable-text-to-liquid` |
| PHP | `sanity-php` (SanityBlockContent class) |
| Python | `portabletext-html` |
| C# / .NET | `dotnet-portable-text` |
| Dart / Flutter | `flutter_sanity_portable_text` |

## Common Patterns (All Frameworks)

### Custom Types Need Explicit Components

PT renderers only handle standard blocks by default. Custom types (`image`, `code`, `callToAction`, etc.) require explicit component mappings — they won't render otherwise.

### Keep Components Object Stable

In React/Vue, define `components` outside the render function or memoize it. Recreating on every render causes unnecessary re-renders.

### Handle Missing Components Gracefully

All libraries accept `onMissingComponent` to control behavior when encountering unknown types:
- `false` — suppress warnings
- Custom function — log or report

### Querying PT with GROQ

Always expand references inside custom blocks:

```groq
body[]{
  ...,
  _type == "image" => {
    ...,
    asset->
  },
  markDefs[]{
    ...,
    _type == "internalLink" => {
      ...,
      "slug": @.reference->slug.current
    }
  }
}
```

© sanity · MIT · sanity-io/agent-toolkit

Похожие скиллы

Всё по теме «Фронтенд и UI» →
flutter-implement-json-serialization flutter Скилл учит агента создавать Dart-модели с методами fromJson и toJson через библиотеку dart:convert. Пригодится при ручном разборе простых структур данных в Flutter. CX Codex +1 37 400установок ue-serialization-savegames quodsoler Помогает проектировать сохранение и загрузку игры в Unreal Engine 5.8 на C++, от работы со слотами до бинарной сериализации. Пригодится при настройке USaveGame и снимков акторов. CX Codex +1 1 100установок serialization Aaronontheweb Помогает агенту выбрать формат сериализации для .NET: схему вместо рефлексии, System.Text.Json с генераторами для JSON. Пригодится при проектировании API, обмена сообщениями и хранения событий. CX Codex +1 569установок system-text-json-net11 dotnet Скилл подсказывает агенту, как применять три новых API System.Text.Json из .NET 11, и не даёт писать обходные пути вместо них. CX Codex +1 3 100установок text-comparison-validator davila7 Субагент сверяет извлечённый текст с готовым markdown-файлом строка за строкой. Находит пропущенные слова, опечатки, расхождения в разметке и структуре абзацев, а потом выдаёт отчёт с номерами строк. 545установок building-emdash-site emdash-cms Скилл для сборки клиентской части проекта EmDash CMS на Astro: схема, сиды, запросы к контенту, меню и деплой. CX Codex +1 756установок

Из того же набора9

sanity-best-practices Набор правил разработки на Sanity для ИИ-агента: схемы, GROQ, TypeGen, визуальный редактор, миграции и подключение к фронтенд-фреймворкам. Нужен, когда агент правит код проекта на Sanity. CX Codex +1 31 800установок sanity-migration Проектирует и выполняет перенос контента из других CMS в Sanity. Помогает настроить выгрузку, конвертацию в Portable Text, перенос медиафайлов и редиректы. CX Codex +1 22 200установок seo-aeo-best-practices Скилл с правилами SEO и AEO: метаданные, Open Graph, sitemap, robots.txt, hreflang, JSON-LD и EEAT. Пригодится, когда верстаешь страницы и хочешь, чтобы их подхватили поисковики и ИИ-ответы. CX Codex +1 7 300установок content-modeling-best-practices Помогает проектировать типы контента в headless CMS: что вынести в ссылки, что встроить, как не дублировать данные. CX Codex +1 4 800установок content-experimentation-best-practices Скилл помогает спланировать контентный A/B-тест, выбрать метрики и разобрать результаты. Пригодится при работе с вариантами в CMS или фронтенде. CX Codex +1 3 800установок portable-text-conversion Переводит HTML и Markdown в блоки Portable Text для Sanity. Нужен при переносе контента из старой CMS и сборке пайплайнов импорта. CX Codex +1 2 700установок sanity-studio-upgrade Скилл читает ваш репозиторий и выдаёт список ломающих изменений, которые касаются именно вашего проекта. Полезен, когда Studio отстал на несколько мажоров. CX Codex +1 524установок Sanity Даёт агенту доступ к контенту, датасетам, релизам и схемам вашего Sanity-проекта. Пригодится, когда правки в CMS идут через чат, а не через Studio. CX Codex +1 ★ 194звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой