sanity-plugin-authoring

Explique e crie plugins do Sanity Studio usando as APIs públicas de plugins e ferramentas. Use ao criar plugins voltados para o usuário, adicionar ferramentas por meio de plugins, ou quando um...

npx skills add https://github.com/sanity-io/sanity --skill sanity-plugin-authoring

Sanity Plugin Authoring

What A Plugin Is

A Sanity Studio plugin is a named configuration bundle that can be added to a Studio through the plugins array. Plugin configuration accepts most workspace config properties, except workspace-owned settings such as dataset, projectId, auth, and theme.

Always give plugins a stable unique name. Prefer definePlugin() so editors expose useful types and autocomplete.

import {definePlugin} from 'sanity'

export const previewUrlPlugin = definePlugin({
  name: 'preview-url-plugin',
  document: {
    productionUrl: async (prev, {document}) => {
      const slug = document.slug?.current
      return slug ? `https://example.com/${slug}` : prev
    },
  },
})

Configurable Plugins

Use definePlugin((options) => ({...})) when callers need to configure behavior.

export const myPlugin = definePlugin<{enabled?: boolean}>((options) => ({
  name: 'my-plugin',
  tools: options.enabled === false ? [] : [myTool],
}))

Keep option namespaces extensible. Prefer object shapes such as {feature: {enabled: true}} instead of direct booleans when future settings are likely.

What Plugins Can Provide

Common plugin properties:

  • document: Document actions, badges, production URL resolvers, and new document defaults.
  • form: Form customizations, asset sources, and custom input rendering.
  • plugins: Nested plugins.
  • tools: Studio tools contributed by the plugin.
  • schema: Schema types and initial value templates.
  • studio: Studio component overrides and middleware.
  • i18n: Locale resource bundles used by plugin UI.
  • title: Human-readable plugin name.
  • onUncaughtError: Custom error handling, logging, or telemetry.

Use the smallest surface that solves the feature.

Tools In Plugins

A tool is a top-level Studio view with routing and predictable URLs. Tools commonly represent full-screen workflows such as Structure, Vision, Dashboard, or Presentation.

When adding a tool through a plugin:

  • Add it through the plugin tools property.
  • Give it a stable name, title, component, and router when needed.
  • Remember tool visual order is affected by the order tools are added, followed by tools added through plugins.
  • Use studio.components.toolMenu when the visual menu order needs custom rendering.
  • Use the top-level tools reducer pattern when changing the default opened tool, because visual menu order alone does not choose the default route.

Studio Components

studio.components can customize parts of the Studio UI. Components that receive renderDefault are middleware: call props.renderDefault(props) unless intentionally replacing the default UI.

Use this for UI wrappers, navigation changes, or tool menu ordering. Be careful not to change scroll containers or layout ownership accidentally.

Locale Resources

If a plugin renders UI text, add an i18n bundle instead of hard-coding user-facing strings. The usual file shape is:

feature/
├── i18n/
│   ├── index.ts
│   └── resources.ts
└── plugin/
    └── index.ts

In i18n/index.ts, define a namespace and default US English bundle:

import {type LocaleResourceBundle} from '../../i18n'

export const featureNamespace: 'feature' = 'feature'

export const featureUsEnglishLocaleBundle: LocaleResourceBundle = {
  locale: 'en-US',
  namespace: featureNamespace,
  resources: () => import('./resources'),
}

export type {FeatureLocaleResourceKeys} from './resources'

In i18n/resources.ts, export the default strings and key type:

const featureLocaleStrings = {
  'action.example': 'Example',
}

export type FeatureLocaleResourceKeys = keyof typeof featureLocaleStrings

export default featureLocaleStrings

Then register the bundle from the plugin:

import {featureUsEnglishLocaleBundle} from '../i18n'

export const feature = definePlugin({
  name: 'sanity/feature',
  i18n: {
    bundles: [featureUsEnglishLocaleBundle],
  },
})

Before Coding

  1. Identify whether the feature is a plugin, a tool, a schema extension, a form extension, or a document extension.
  2. Check existing plugin examples in the repo.
  3. Choose a stable plugin name.
  4. Decide whether the plugin needs options.
  5. Add focused tests for the configured behavior.

For Sanity monorepo default plugin wiring, read sanity-core-plugin after this skill.

References

Mais skills de sanity-io

tdd
sanity-io
Desenvolvimento orientado a testes com ciclo red-green-refactor. Use quando o usuário quiser construir funcionalidades ou corrigir bugs usando TDD, mencionar "red-green-refactor", quiser…
performance-optimization
sanity-io
Otimiza o desempenho da aplicação. Use quando existirem requisitos de desempenho, quando suspeitar de regressões de desempenho, ou quando os Core Web Vitals ou tempos de carregamento…
content-experimentation-best-practices
sanity-io
Orientação estruturada para projetar, executar e analisar experimentos de conteúdo visando melhorar conversão e engajamento. Abrange frameworks de hipóteses, seleção de métricas, cálculo de tamanho amostral e testes de significância estatística em experimentos A/B e multivariados. Inclui recursos detalhados sobre valores-p, intervalos de confiança, análise de poder e métodos bayesianos para interpretação de resultados. Fornece padrões de integração com CMS para gerenciar variantes no nível de campo e conectar sistemas externos...
content-modeling-best-practices
sanity-io
Orientação para modelagem de conteúdo estruturado voltada ao design de esquemas, reutilização e entrega multicanal. Aborda princípios fundamentais: tratar conteúdo como dados, e não como páginas; manter fontes únicas de verdade; projetar para canais futuros; e otimizar fluxos de trabalho editoriais. Inclui estruturas de decisão para referências versus objetos incorporados, separação de responsabilidades e padrões de reutilização de conteúdo. Oferece orientação sobre taxonomia e classificação para abordagens planas, hierárquicas e facetadas. Aplica-se a...
portable-text-conversion
sanity-io
Converta conteúdo HTML e Markdown em blocos Portable Text para Sanity. Use ao migrar conteúdo de CMSs legados, importando HTML ou Markdown para o Sanity,…
portable-text-serialization
sanity-io
Renderize e serialize Portable Text para React, Svelte, Vue, Astro, HTML, Markdown e texto simples. Use ao implementar a renderização de Portable Text em qualquer frontend…
sanity-best-practices
sanity-io
Práticas recomendadas abrangentes e guias de integração para desenvolvimento no Sanity CMS em diferentes frameworks e tópicos. Abrange mais de 10 integrações de frameworks, incluindo Next.js, Nuxt, Astro, Remix, SvelteKit e Angular, com padrões específicos de cada framework e orientações de configuração. Inclui guias de tópicos para design de esquemas, otimização de consultas GROQ, Edição Visual, Portable Text, imagens, TypeGen, localização e migrações de conteúdo. Fornece uma estrutura de referência rápida para carregar apenas guias relevantes com base no tipo de tarefa,...
sanity-migration
sanity-io
Planeja, implementa e revisa migrações de outros CMSs e sistemas de conteúdo para o Sanity. Use ao migrar ou replataformar para o Sanity a partir de AEM, Adobe Experience Manager, Contentful, Strapi, Webflow, WordPress, Payload, Drupal, arquivos Markdown/MDX/frontmatter, exportações WXR/XML, APIs de CMS, dumps de banco de dados, HTML estático, ou ao projetar fluxos de extração, transformação, conversão de Portable Text, migração de ativos, redirecionamentos, validação e cutover.
data-analysisdatabasedevelopment