github sanity-io/sanity v3.0.0-dev-preview.21

latest releases: v3.42.1, v3.42.0, v3.41.2...
pre-release19 months ago

✨ Highlights

At-a-glance

This version introduces several breaking changes that we are really excited to share with everyone:

  • Improved Components API
  • Consolidated sanity package and exports
  • React 18 as new baseline version
  • Removing the Schema namespace

These changes will make the Studio's customization API easier to discover and will vastly improve DX when implementing plugins and customizations moving forward.

NOTE: This release vastly reduces the number of breaking changes that will be introduced as we are getting closer to the first official stable v3 release.

Components API

We have made changes to the new Components API that allows a lot more flexibility in terms of wrapping, replacing, and modifying components in the Studio.

These components are now available for customization:

  • Studio components: the general components of the studio. In this iteration, the components that can be customized are navbar, tool menu, layout and logo.
  • Form components: field, input, item and preview.

Example:

import {createConfig} from 'sanity'

export default createConfig({
  // ...,

  form: {
    components: {
      field: MyField,
      input: MyInput,
      item: MyItem,
      preview: MyPreview,
    },
  },

  studio: {
    components: {
      layout: MyLayout,
      logo: MyLogo,
      navbar: MyNavbar,
      toolMenu: MyToolMenu,
    },
  },
})

The components available in this API are rendered using a middleware pattern. This means that plugin customizations are applied in a chain. Each plugin may call props.renderDefault(props) to defer to default rendering (this API was next(props) in 3.0.0-dev-preview.20).

What is renderDefault?

The props for each component available in the API includes a callback function called renderDefault. As the name implies, renderDefault renders the default component. When you call renderDefault, you also pass the props needed to render the default component, and these props can be modified. In the example below, we create a custom tool menu plugin that filters out the vision tool when the studio is running in non-development mode:

import {useMemo} from 'react'
import {
  ToolMenuProps,
  createConfig,
  createPlugin,
  isDev,
} from 'sanity'

// Plugin's `ToolMenu` component
function MyToolMenu(props: ToolMenuProps) {
  const {renderDefault, tools} = props
    
  const filteredTools = useMemo(() => {
    return isDev ? tools : tools.filter((t) => t.name !== 'vision')
  }, [isDev, tools])

  return renderDefault({
    ...props,
    tools: filteredTools, // Pass the custom array of tools
  })
}

// Plugin
const toolPlugin = createPlugin({
  name: 'tool-plugin',
  studio: {
    components: {
      toolMenu: MyToolMenu,
    },
  },
})

// Config
export default createConfig({
  ...,
  name: 'studio-config',
  plugins: [toolPlugin()],
})

If yet another plugin makes customizations of toolMenu – then the props received in that plugin will be the result of the previous customization (that is, no vision tool in non-development mode).

NOTE: If renderDefault is not called, the middleware chain stops and the next plugin will have no effect.

Using renderDefault in schema

The renderDefault function may also be used directly in a schema definition to render a default component. In the example below, we create a component that renders the default string input with a character counter, directly in the schema:

import {Stack, Text} from '@sanity/ui'
import {defineField, StringInputProps} from 'sanity'

function StringInputCharacterCount(props: StringInputProps) {
  return (
    <Stack space={2}>
      {/* Render the default string input */}
      {props.renderDefault(props)}

      <Text align="right" size={1}>
        Characters: <strong>{props.value?.length || 0}</strong>
      </Text>
    </Stack>
  )
}

export const myDocument = defineField({
  type: 'document',
  name: 'myDocument',
  fields: [
    {
      name: 'title',
      type: 'string',
      title: 'Title',
      components: {
        input: StringInputCharacterCount,
      },
    },
  ],
})

Result:
Screen Shot 2022-10-03 at 11 16 42

Consolidated sanity package and exports

Breaking changes to export bundles

The sanity package is now split up into these export bundles:

  • sanity
  • sanity/cli
  • sanity/desk
  • sanity/router

There have been necessary changes made in order to make the exports clean and independent bundles: no API member is now exported twice (as was the case before). And there are no longer cyclic dependencies between exports.

Export Change
sanity unchanged
sanity/_internal unchanged
sanity/_unstable ➡️ merged into sanity
sanity/cli unchanged
sanity/desk unchanged
sanity/form ➡️ merged into sanity
sanity/router ⤵️ separated from sanity

Why? These changes are mainly introduced to prevent API confusion.

// Before: this is not great
import {Chunk} from 'sanity'
import {Chunk} from 'sanity/desk'
import {Chunk} from 'sanity/form'

// Now: an API member is only available in one of the exports
import {Chunk} from 'sanity'

This also means we have removed duplicate code in the export bundles, which could cause issues with React contexts and bundle size.

API release tags

All the API members in the sanity package now have API release tags. These are TSDoc release tags that are understood by Intellisense and can be seen in your IDE.

Example:
image

How to reason about the various tags:

Tag Description
@internal Internal API. Use at your own risk.
@alpha Early stage API. Will likely change or even be removed. Use at your own risk.
@beta Early stage API. Will likely change. Use at your own risk.
@public Stable API. Safe to use.

React 18

The Studio internals are upgraded to React 18 and use the new concurrent renderer. Support for React v17 is dropped and v18 is the new baseline in order to make full use of the new features and performance improvements.

Why we're doing this now

Structured content creation should be a delightful and exceptional experience. Everything should feel responsive. That means the UI needs to keep up with your interactions no matter what. If 300 people are editing the same document as you are and your phone's CPU just can't keep up that's ok. Everyone else's changes can wait for a second or two before they show up. As long as you can type as fast as you want without ever feeling held back by a sluggish text field that struggles to keep up with your thoughts. The edits of your peers have time to render whenever you stop to gather your thoughts. It's more important for you to stay in the zone, and for the studio to prioritize responding to your interactions.

With new APIs like startTransition, useTransition, useDeferredValue and Suspense we can start moving towards making this vision a reality.

While it is possible to do this in a way that gives theoretical support for both react v17 and v18, we ultimately decided against it after a thorough evaluation with the goal of maintaining compatibility with v17. It came down to which option allow us to deliver the highest quality product, and unless everything is tested on both versions of react for every release we'll either:

  • Have good v17 support but unable to adopt v18 features that can't be shimmed on v17. Such as startTransition, useTransition and useDeferredValue.
  • Great v18 support but the v17 becomes increasingly buggy and slow as devs become used to how v18 behaves. For example v18 automatically batches state updates while v17 does not. A component that in v18 have few re-renders might have a ton of re-renders in v17 if the component author isn't aware of this difference and there's great v17 testing routines in place.

Upgrade info

Official guide: https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#updates-to-client-rendering-apis
If you're on react v17 today and don't see any warnings in your console when running your studio locally then upgrading is pretty much just a matter of bumping react, react-dom and react-is to ^18 in your package.json.

Read the official upgrade guide to get a sense of what components you might need to give a little refactor.
While migrating studio internals we found that if there's a problem in a component it's usually related to one of these factors:

  • A class component that is using lifecycle method with a UNSAFE_ prefix, for example UNSAFE_componentWillMount or UNSAFE_componentWillReceiveProps. Detailed guide.
  • The component had useEffect logic that assumed that useEffect(() => () => teardown(), []) the teardown() is only called once, and on unmount. Get a refresher on how useEffect works to make it easier to find and resolve these bugs.
  • Incorrect dependency arrays in hooks like useEffect, useMemo, useCallback and such either because they were suppressed in the linter due to // eslint-disable or custom hooks and layers of abstractions made the linter unable to detect them.
  • If you're on TypeScript and are seeing a lot of typing errors you can try the automated migration script. Or hold off on upgrading @types/react until you have the bandwidth to fix the problems that the stricter typings uncover in your code.

@sanity/ui

If you have a dependency on @sanity/ui and use it in your project make sure to bump it to v1 as it's upgraded to support the new concurrent renderer.

Other changes

renderStudio now returns a function for unmounting it, to make it easier to use in other libraries such as vue, svelte, solid, angular, jqueryui, mootools, whatever floats your boat. How about as a Web Component? ⛵

<script type="module">
import {createConfig, renderStudio} from 'sanity'
import {deskTool} from 'sanity/desk'

customElements.define(
  'sanity-studio',
  class extends HTMLElement {
    connectedCallback() {
      const config = createConfig({
        projectId: this.getAttribute("projectId"),
        dataset: this.getAttribute("dataset"),
        plugins: [deskTool()],
        schema: {
          types: []
        }
      })

      this.unmount = renderStudio(this, config)
    }

    disconnectedCallback() {
      this.unmount?.()
    }
  }
)
</script>

<sanity-studio projectId="pnkijp0b" dataset="codesandbox"></sanity-studio>

See Codesandbox with example using Sanity Studio v3 in a web component.

React Strict Mode

You can opt-in to React's Strict Mode checks for your custom studio components in these ways:

  • Add reactStrictMode: true to your sanity.cli.ts file.
  • Create a .env.development file and add SANITY_STUDIO_REACT_STRICT_MODE=true to it.
  • Set the env var while starting sanity: SANITY_STUDIO_REACT_STRICT_MODE=true sanity start

We strongly suggest you opt-in to better prepare your custom studio for the future of React. This only affects development mode, production mode or sanity build is unaffected by this setting.

Schema namespace removed

The Schema namespace has been removed. The same types can now be accessed as regular imports from the sanity package.

// Before
import {Schema} from 'sanity'

const stringDef: Schema.StringDefinition = {...}

// Now
import {StringDefinition} from 'sanity'

const stringDef: StringDefinition = {...}

With this change it is now be possible to augment definition interfaces using declaration merging. This allows us to improve typesafety and intellisense in defineType schema helpers for plugins moving forward.

See TSDoc on defineType for examples on this.

Other features

Slug functions context

Slug options source and slugify are now passed a context parameter as the last argument. It contains getClient, schema and currentUser.

🐛 Notable bugfixes

  • The Studio now includes global CSS with font-family, and will no longer use serif in cases where you don't use <Text> from @sanity/ui.
  • Various minor bug fixes in the Portable Text Editor.

📓 Full changelog

Author Message Commit
Marius Lundgård build: use @sanity/pkg-utils 2778e0c
Marius Lundgård chore: alphabetize package.json scripts 8090909
Marius Lundgård fix(deps): fix dependency configurations 4677879
Marius Lundgård fix: remove asterix imports of react a60dc16
Marius Lundgård chore: disable tsdoc syntax in jest configuration files 4180f00
Marius Lundgård chore(cli): do not bundle get-it 0f3ff01
Marius Lundgård chore(deps): add @types/babel__traverse dependency 3ee5ada
Marius Lundgård chore: set TS target 12de8f7
Marius Lundgård ci: remove exports-check action aae8c5e
Marius Lundgård chore(cli): do not bundle @babel/traverse 0395767
Espen Hovlandsdal chore: normalize dependencies 801d336
Herman Wikner refactor(sanity): rename ToolMenu to StudioToolMenu, update API and add test id:s 501a56d
Herman Wikner feat(sanity): rename Navbar to StudioNavbar + implement Logo and ToolMenu from studio.components 2cea78a
Herman Wikner feat(sanity): add StudioLogo component a80fc64
Herman Wikner feat(sanity): implement ToolMenu from studio.components in NavDrawer 6b0887d
Herman Wikner feat(sanity): implement Navbar from studio.components in StudioLayout 8aa9393
Herman Wikner feat(sanity): implement Layout from components.studio in Studio 9a75c81
Herman Wikner feat(sanity): add studio components API 1283603
Herman Wikner refactor(sanity): spread rest props on CollapseMenu to enable adding test id 451ce02
Herman Wikner feat(sanity): update exports 9294ada
Herman Wikner test(sanity): add components API test 889e8c1
Herman Wikner test(test-studio): update custom ToolMenu 89d682e
Herman Wikner test(sanity): update NavbarStory e5d8ccd
Herman Wikner feat(sanity): remove logo from config type 7bfe3b1
Espen Hovlandsdal feat(form): future-proof patch types b84b844
Espen Hovlandsdal feat(desk)!: drop preserveInstance option on custom user panes 1d17b61
Espen Hovlandsdal feat(desk)!: drop urlParams on custom user panes 13b4567
Per-Kristian Nordnes feature(form): improve focus handling for PT-input c0afe6c
Per-Kristian Nordnes chore(form): remove unused imports f7a817d
Per-Kristian Nordnes fix(portable-text-editor): don't memoize isEmpty, lookup directly in decorator fn. fb9fbe2
Per-Kristian Nordnes refactor(portable-text-editor): improve placeholder block handling 1c5e976
Per-Kristian Nordnes test(portable-text-editor): add undo/redo test fn. 37ef240
Per-Kristian Nordnes fix(portable-text-editor): improve validation error message d20ec24
Per-Kristian Nordnes test(portable-text-editor): add test for clearing document 438032d
Per-Kristian Nordnes fix(form): improve error message 8b53398
Per-Kristian Nordnes refactor(portable-text-editor): rename fn. to make more sense 2d2d48b
Per-Kristian Nordnes fix(portable-text-editor): ensure correct selection being emitted 8acf960
Per-Kristian Nordnes test(portable-text-editor): adjust snapshot after selection fix a6318cd
Per-Kristian Nordnes chore(portable-text-editor): remove unused import 1e191be
Per-Kristian Nordnes refactor(form): reconcile PT member validation 6d2f18e
Per-Kristian Nordnes refactor(form): memoize PT markers 247d6bb
Per-Kristian Nordnes test(form): debug render util. for PT-input 40c319c
Per-Kristian Nordnes refactor(form): refactor tooltip enabling for PT block object a17efef
Per-Kristian Nordnes fix(portable-text-editor): don't sync if empty patches 96771df
Per-Kristian Nordnes fix(portable-text-editor): fix potential re-rendering issue f542cd2
Per-Kristian Nordnes test(portable-text-editor): add own test ts-config fc9ef8c
Per-Kristian Nordnes fix(form): optimize AnnotationToolbarPopover 11b3a6e
Per-Kristian Nordnes test(portable-text-editor): add button to test toggling readOnly state 0b477a4
Per-Kristian Nordnes refactor(portable-text-editor): inherit readOnly status from PortableTextEditor in Editable 5897465
Per-Kristian Nordnes refactor(portable-text-editor): make it possible to re-initialize the plugin chain 0b88fac
Per-Kristian Nordnes test(portable-text-editor): update tests to match the latest changes 7368d43
Per-Kristian Nordnes wip: ensure up to date PortableTextSelection + fix issues with undo/redo + tests 80bd1f5
Per-Kristian Nordnes test(form): turn off PT-input render debugging d020ed1
Per-Kristian Nordnes fix(portable-text-editor): run empty check directly into decorate fn. 9fcbc5c
Per-Kristian Nordnes test(portable-text-editor): disable unstable test for now 13674f9
Per-Kristian Nordnes fix(portable-text-editor): emit PT selections also in readOnly version bd1fc33
Per-Kristian Nordnes refactor(portable-text-editor): simplify plugin options + make sure editableAPI plugin is always present d9546db
Per-Kristian Nordnes fix(form): support patch symbols for PT-input PTE patches f120f6d
Bjørge Næss refactor(base): clean up document operation typings 534fb50
Bjørge Næss refactor(base): replace commit handler with stream of commit requests 44e2f1b
Bjørge Næss refactor: handle latency better during document publish 93a38c1
Bjørge Næss fix(desk-tool): add useCondionalToast hook as workaround for missing @sanity/ui feature 57ad2ae
Bjørge Næss fix(base): improve correctness of error check b21196e
Per-Kristian Nordnes fix(form-builder): workaround weird Chrome bug related to flex and spellchecking 2f6d160
Bjørge Næss perf(desk-tool): optimize useTimeAgo aa31b7d
Per-Kristian Nordnes feature(react-hooks): add low priority modality to useEditState hook dcaad24
Bjørge Næss test(validation): drop test asserting eager execution of nested validation checks 9044965
Bjørge Næss fix(validation): add requestIdleCallback shim for Safari 6cd45cb
Bjørge Næss perf(validation): refactor validation to be based on observables instead of promises, run in idle callback 8b32bf9
Bjørge Næss deps(base): upgrade to latest rxjs-exhaustmap-with-trailing 2567e1a
Bjørge Næss refactor(base): optimize validation scheduling 581df88
Bjørge Næss test(base): tweak tests after validation schedule optimizations 0e90d2c
Bjørge Næss fix(base): keep reference existence listener alive between document versions 091820c
Bjørge Næss fix(base): inline getDocumentExists and make it look up already existing info 1569526
Bjørge Næss chore: cleanup & simplify preview observer code 44adf9c
Bjørge Næss fix(desk-tool): make sure validation result is about current revision before publishing 6d38e04
Bjørge Næss fix(sanity): fix preview issue 9fa5aff
Espen Hovlandsdal fix(cli): stub css files when mocking browser environment c306d0b
Marius Lundgård fix(portable-text-editor): fix cyclic dependency d15e484
Marius Lundgård build: upgrade @sanity/pkg-utils e2f2c4e
Marius Lundgård build(sanity): use correct file extensions when replacing version strings b47ea65
Marius Lundgård ci: remove type-check and verify_format actions f2f04ed
Marius Lundgård chore: add check:format script eedd513
Marius Lundgård ci: add format checking to test action 3ea485a
Marius Lundgård test(portable-text-editor): move constant to allow testing without building b5590e3
Marius Lundgård test(portable-text-editor): fix tsconfig 597bbef
Marius Lundgård chore(deps): upgrade typescript 1b7d6a3
Marius Lundgård chore: add alias for @sanity/util/fs 9f22a14
Marius Lundgård chore(portable-text-editor): add missing dependency 292415c
Snorre Eskeland Brekke chore: fix broken type-tests 34a9b60
Marius Lundgård chore: rename files to *.cjs 92fdc2d
Marius Lundgård chore: configure eslint 8debf98
Marius Lundgård chore(sanity): fix eslint errors b9db377
Marius Lundgård chore: update .cjs files 536b2d9
Marius Lundgård chore: improve jest config 3a71e15
Per-Kristian Nordnes fix(form): respect enableHiddenCheck condition in formState 7f20cca
Bjørge Næss test(block-tools): use snapshots instead of fixture imports b55cea0
RitaDias refactor(sanity): rename StudioFormBuilderProvider and related (#3675) 6cca17e
Cody Olsen chore(typings): prepare for react 18 by using stricter typings (#3693) 0d13e12
Per-Kristian Nordnes feature(form): improve readOnly mode for PT-input with v2 parity a7b2f81
Per-Kristian Nordnes fix(form): fix layering issue with PT-input aa8561c
Per-Kristian Nordnes fix(form): fix issue with PT-input open close state for modals 32e302b
Espen Hovlandsdal fix(cli): use same process when executing scripts e640b72
Espen Hovlandsdal fix(cli): correct worker strategy for new bundling 881fd5e
Cody Olsen feat: move to react 18 (#3612) 45e485b
Bjørge Næss perf(desk-tool): optimize useTimeAgo 44a922e
Marius Lundgård chore(deps): align versions ba99e74
Marius Lundgård refactor(sanity): remove unused code fe7d861
Cody Olsen chore: fix deps versions for react 18 (#3696) 3874af7
Marius Lundgård build(sanity): remove unused paths config 5d6d411
Marius Lundgård chore(deps): remove duplicate dependency 97ebb40
Per-Kristian Nordnes fix(form): Fix React 18 issue with PT-input 193fe7e
Marius Lundgård chore: upgrade @sanity/pkg-utils febf7a6
Marius Lundgård fix(cli): add missing exports 3d95732
Marius Lundgård chore(deps): add missing deps f2e32f3
Marius Lundgård chore(block-tools): add missing TS references 36844ea
Marius Lundgård chore(cypress): fix lint errors f3dc853
Marius Lundgård chore(deps): add missing dependencies 39df6f7
Marius Lundgård chore: simplify scripts 9f354de
Marius Lundgård ci: update GitHub actions 603de03
Snorre Eskeland Brekke fix: added context with client and schema to slugify and source options (#3711) 8d0f1a4
Cody Olsen fix: migrate class components to functions+hooks (#3701) 829e5ec
Cody Olsen chore(ci): reduce PR builds (#3716) 841121a
Snorre Eskeland Brekke feature!: replaced Schema namespace with plain exports for schema-definitions (#3699) 05068d8
Marius Lundgård build(sanity): configure API linting rules cae59f1
Marius Lundgård chore(sanity): ignore etc/*.json files b32e4f5
Marius Lundgård refactor(sanity): simplify asset source resolution bc6e17e
Marius Lundgård refactor(sanity): fix lint errors 5608c26
Marius Lundgård test(sanity): convert to TypeScript 91dd6e1
Marius Lundgård test(sanity): move tests to src/ 3e9e685
Marius Lundgård refactor(sanity): remove underscore prefix on internal members a4092b2
Marius Lundgård refactor(sanity): remove NodePresence since it's a copy of FormFieldPresence cc10714
Marius Lundgård refactor(sanity): clean up react-track-elements 129b270
Marius Lundgård build(sanity): move to root exports directory 7382ae1
Marius Lundgård fix(sanity): remove duplicate exports 3464a00
Marius Lundgård refactor(sanity): group source code by export boundaries 71ec8b3
Marius Lundgård refactor(sanity): move router to separate export e68e742
Marius Lundgård refactor(sanity): add Route* prefix e267849
Marius Lundgård refactor(vision): use sanity/router import aba0fe0
Marius Lundgård refactor(sanity): merge sanity/_unstable into sanity e04434a
Marius Lundgård refactor(sanity): clean up 12d35c8
Marius Lundgård docs(sanity): convert comment to TSDoc 1b9aa9a
Marius Lundgård refactor(sanity): add missing return types c5e663b
Marius Lundgård feat(sanity): export file and image inputs 06b03ce
Marius Lundgård refactor(sanity): convert to function 981751c
Marius Lundgård refactor(sanity): use self-referencing imports between export boundaries 2ddf5bd
Marius Lundgård refactor(sanity): move hookCollection to sanity 5f0944b
Marius Lundgård refactor(sanity): move asset sources to files ac825dd
Marius Lundgård refactor(sanity): rename asset source directory 1036d41
Marius Lundgård feat(sanity): export used ResourceCacheProviderProps interface 0cdd0fd
Marius Lundgård refactor(sanity): move document actions/badges to core 7b27a15
Marius Lundgård refactor(sanity): move datastores to store/_legacy 27510e7
Marius Lundgård refactor(sanity): merge sanity/form into sanity d33af51
Marius Lundgård refactor(sanity): remove duplicate PreviewCard component b751525
Marius Lundgård refactor(sanity): simplify IntentButton prop types f8ed855
Marius Lundgård refactor(sanity): do not export styled components 82c70dc
Marius Lundgård refactor(sanity): move helpers to separate file e775bbc
Marius Lundgård fix(sanity): add missing exports 96bdc11
Marius Lundgård refactor(sanity): remove duplicate PreviewCard e0e3899
Marius Lundgård refactor(sanity): rename FileInput to BaseFileInput f5aed74
Marius Lundgård refactor(sanity): rename ImageInput to BaseImageInput d43a03b
Marius Lundgård refactor(sanity): workaround to fix TS error 5d0b591
Marius Lundgård refactor(sanity): add missing exports 97fda78
Marius Lundgård refactor(sanity): refer to exports by name 1b8194f
Marius Lundgård chore(sanity): add sanity to depcheck ignore list 8422752
Marius Lundgård chore(sanity): configure eslint boundaries 3d0adf7
Marius Lundgård refactor(sanity): move FormInput to components directory 9632978
Marius Lundgård docs(sanity): fix typo 10b4172
Marius Lundgård docs(sanity): add missing TSDoc release tags ec5b530
Marius Lundgård refactor(sanity): move changeIndicators out of components 1e17d76
Marius Lundgård refactor(sanity): remove exports from components which causes test failure c3883a5
Marius Lundgård fix(sanity): avoid complex TS features to make @microsoft/api-extractor build d751a05
Marius Lundgård chore(diff): fix lint errors 33942cb
Marius Lundgård refactor(cli): update imports db3ba90
Marius Lundgård chore(types): ignore etc/*.json files 9de4268
Marius Lundgård refactor(types): export ambient members 8785639
Marius Lundgård docs(types): add missing TSDoc release tags 72c4676
Marius Lundgård build(types): require TSDoc release tags f31798a
Marius Lundgård build: configure package.json and tsconfig.json a0d539e
Marius Lundgård refactor(test-studio): update imports e9d5ad4
Marius Lundgård refactor(ecommerce-studio): update imports 3c030e3
Marius Lundgård refactor(sanity): export all structure members 70186c4
Marius Lundgård refactor(sanity): remove duplicate PatchOperations interface 2af022e
Marius Lundgård feat(types): add merge property to PatchOperations 8bb8a03
Marius Lundgård refactor: rename NodeValidation => FormNodeValidation 2c2b85f
Marius Lundgård refactor: rename FormFieldValidation => FormNodePresence 9111c44
Marius Lundgård fix(sanity): use ref prop 7aff925
Cody Olsen feature(cli): add reactStrictMode option (#3721) 5ecbbd9
Marius Lundgård build(util): configure build 6d3c53a
Marius Lundgård feat(sanity): render global font and background color 27d5085
Espen Hovlandsdal test(cli): provide full cli tests for both v2 and v3 5412ca8
Espen Hovlandsdal fix(cli): print job completition message on successful dataset copy 6da4556
Espen Hovlandsdal ci: expose cli token secret as env var cd3de5d
Espen Hovlandsdal ci: build cli prior to running tests bb354b6
Espen Hovlandsdal ci: use node version from strategy matrix 401ba42
Espen Hovlandsdal ci: print node + npm version prior to build/test 15b2855
Espen Hovlandsdal chore: drop empty exclude from tsconfig 316a2ff
Espen Hovlandsdal test(cli): work around jest not respecting test timeout 0b7070b
Espen Hovlandsdal chore(cli): alphabetize jest config properties b313869
Espen Hovlandsdal test(cli): test for contents of tarball instead of size 79e6c1e
Espen Hovlandsdal chore(cli): address a few lint issues in tests b76846b
Espen Hovlandsdal chore(cli): remove unnecessary tsconfig ignore 5b68365
Espen Hovlandsdal fix(cli): reject with an error when trying to reach dev server 2450e56
Snorre Eskeland Brekke * fix: form state now correctly updates members when hidden state changes (#3719) ea48fa3
Herman Wikner feat(sanity): add components API e9b09b4
Herman Wikner feat(sanity): update input, field, item and preview types with renderDefault 865c27e
Herman Wikner refactor(sanity): remove schemaType from RenderPreviewCallback type (added to PreviewProps) 9f5ec39
Herman Wikner feat(sanity): use middleware components in StudioNavbar 4b37654
Herman Wikner feat(sanity): use middleware components in NavDrawer c22906f
Herman Wikner feat(sanity): use middleware components in StudioLayout db3751e
Herman Wikner feat(sanity): use middleware components in Studio 36ddbc5
Herman Wikner feat(sanity): use middleware components in FormProvider 99e89d0
Herman Wikner refactor(sanity): omit renderDefault from components 0455b03
Herman Wikner feat(sanity): add renderItem to ArrayInput 0f27c41
Herman Wikner feat(sanity): add renderItem to ArrayOfPrimitivesInput 037cc28
Herman Wikner feat(sanity): improve SanityPreview to work with the components API 00ad73a
Herman Wikner refactor(sanity): add test id:s to form components 60aa893
Herman Wikner test(sanity): pass noop renderDefault to form input tests 279ce8d
Herman Wikner test(sanity): add components API tests 6f41653
Herman Wikner dev(sanity): update workshop stories with components API 287b20d
Herman Wikner refactor(types): update components typings 85a8f10
Herman Wikner dev(test-studio): add components API schema and plugins + update sanity.config 0a7ce76
Herman Wikner test(sanity): update FormBuilder test 088612e
Herman Wikner refactor(sanity): update form and config typings to work with components API e885e44
Fred Carlsen fix(sanity): fix controls for custom block components preview (#3722) 0cfd150

Don't miss a new sanity release

NewReleases is sending notifications on new releases.