@sanity/presets 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -165,6 +165,8 @@ definePage({
165
165
 
166
166
  Each entry in `pageBuilderBlocks` is either a string referencing a type in your schema, or an inline schema type definition - typically a preset instance such as `defineImage({name: 'imageBlock'})`. Mix both freely.
167
167
 
168
+ Rich text presets work in `pageBuilderBlocks`, both inline (`defineRichText({...})`) and by name (`'richText'`). Documents store each rich text block under `content[].content`.
169
+
168
170
  **Fields:**
169
171
 
170
172
  | Field | Type | Group | Description |
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/definePresetType.ts","../src/presets/page-type/index.ts","../src/presets/cta-type/index.ts","../src/presets/image-type/index.ts","../src/presets/link-type/index.ts","../src/presets/rich-text-type/index.ts","../src/presets/seo-type/index.ts","../src/registry.tsx"],"mappings":";KAEY,uBAAA,kBAAyC,iBAAA,IAAqB,OAAA,CACxE,gBAAA,CAAiB,QAAA,EAAU,QAAA;EAAa,OAAA,EAAS,aAAA;AAAA,KAEjD,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,QAAA;AAAA,UCIjB,eAAA;EACf,SAAA,GAAY,UAAA,UAAoB,MAAA,GAAS,MAAA,sBAA4B,eAAA;AAAA;AAAA,KAGlE,oBAAA;AAAA,KAEA,kBAAA,+DACH,kBAAA,WACS,WAAA,IACP,IAAA,CAAK,UAAA,EAAY,kBAAA,IACjB,UAAA;AAAA,KAEQ,aAAA,8BAEU,iBAAA,qFAElB,OAAA,GACF,mBAAA,IACC,WAAA,kBACG,kBAAA,CACE,uBAAA,CAAwB,WAAA,GACxB,oBAAA,GAAuB,gBAAA;EAG3B,GAAA,GAAM,WAAA,kCAEc,uBAAA,CAAwB,WAAA,MACpC,KAAA,EAAO,uBAAA,CAAwB,WAAA,EAAa,GAAA,MACzC,uBAAA,CAAwB,WAAA,EAAa,GAAA;AAAA;;;;;;KAUxC,UAAA,mCAEU,iBAAA,qFAElB,aAAA,CAAc,OAAA,EAAS,WAAA,EAAa,gBAAA;;;;;;;;;;;UAYvB,gBAAA,mCAEK,iBAAA;EAGpB,IAAA;EACA,UAAA;EACA,UAAA,GACE,MAAA,EAAQ,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,WAAA,EAAa,gBAAA;IAC/C,IAAA;EAAA,GAEF,QAAA,EAAU,eAAA,KACP,oBAAA;AAAA;;AA9DkB;;;KAwFb,mBAAA,GAAsB,gBAAA;AAAA,KC1FtB,gBAAA,aAA6B,oBAAA,GAAuB,eAAA;AAAA,UAE/C,cAAA;EACf,iBAAA,GAAoB,gBAAA;AAAA;AAAA,cAGT,QAAA,EAAQ,gBAAA,CAAA,cAAA;AAAA,cCbR,OAAA,EAsCX,gBAAA;AAAA,UCtCe,eAAA;EACf,OAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,cAGW,SAAA,EAAS,gBAAA,CAAA,eAAA;AAAA,UCNL,cAAA;EACf,aAAA;AAAA;AAAA,cAGW,QAAA,EAAQ,gBAAA,CAAA,cAAA;AAAA,UCJJ,qBAAA;EACf,IAAA;EACA,KAAA;EACA,GAAA;AAAA;AAAA,UAGe,kBAAA;ENPE;;;;;;;;;EMiBjB,OAAA,aAAoB,qBAAA;AAAA;AAAA,cAUT,YAAA,EAAY,gBAAA,CAAA,kBAAA;AAAA,cCzBZ,OAAA,EAyDX,gBAAA;AAAA,UCzCe,qBAAA;EACf,IAAA,GAAO,cAAA;EACP,KAAA,GAAQ,eAAA;EACR,IAAA,GAAO,cAAA;AAAA;AAAA,KAGJ,cAAA,gBAA8B,mBAAA,IACjC,MAAA,SAAe,gBAAA,8DAET,MAAA,EAAQ,UAAA,CAAW,OAAA,EAAS,WAAA,EAAa,gBAAA,MACtC,oBAAA,GAAuB,eAAA;AAAA,UAGjB,eAAA;EACf,UAAA,EAAY,cAAA,QAAsB,QAAA;EAClC,SAAA,EAAW,cAAA,QAAsB,OAAA;EACjC,SAAA,EAAW,cAAA,QAAsB,OAAA;EACjC,WAAA,EAAa,cAAA,QAAsB,SAAA;EACnC,UAAA,EAAY,cAAA,QAAsB,QAAA;EAClC,cAAA,EAAgB,cAAA,QAAsB,YAAA;AAAA;AAAA,iBAGxB,qBAAA,CAAsB,MAAA,GAAQ,qBAAA,GAA6B,eAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/definePresetType.ts","../src/presets/page-type/index.ts","../src/presets/cta-type/index.ts","../src/presets/image-type/index.ts","../src/presets/link-type/index.ts","../src/presets/rich-text-type/index.ts","../src/presets/seo-type/index.ts","../src/registry.tsx"],"mappings":";KAEY,uBAAA,kBAAyC,iBAAA,IAAqB,OAAA,CACxE,gBAAA,CAAiB,QAAA,EAAU,QAAA;EAAa,OAAA,EAAS,aAAA;AAAA,KAEjD,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,QAAA;AAAA,UCIjB,eAAA;EACf,SAAA,GAAY,UAAA,UAAoB,MAAA,GAAS,MAAA,sBAA4B,eAAA;AAAA;AAAA,KAGlE,oBAAA;AAAA,KAEA,kBAAA,+DACH,kBAAA,WACS,WAAA,IACP,IAAA,CAAK,UAAA,EAAY,kBAAA,IACjB,UAAA;AAAA,KAEQ,aAAA,8BAEU,iBAAA,qFAElB,OAAA,GACF,mBAAA,IACC,WAAA,kBACG,kBAAA,CACE,uBAAA,CAAwB,WAAA,GACxB,oBAAA,GAAuB,gBAAA;EAG3B,GAAA,GAAM,WAAA,kCAEc,uBAAA,CAAwB,WAAA,MACpC,KAAA,EAAO,uBAAA,CAAwB,WAAA,EAAa,GAAA,MACzC,uBAAA,CAAwB,WAAA,EAAa,GAAA;AAAA;;;;;;KAUxC,UAAA,mCAEU,iBAAA,qFAElB,aAAA,CAAc,OAAA,EAAS,WAAA,EAAa,gBAAA;;;;;;;;;;;UAYvB,gBAAA,mCAEK,iBAAA;EAGpB,IAAA;EACA,UAAA;EACA,UAAA,GACE,MAAA,EAAQ,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,WAAA,EAAa,gBAAA;IAC/C,IAAA;EAAA,GAEF,QAAA,EAAU,eAAA,KACP,oBAAA;AAAA;;AA9DkB;;;KAwFb,mBAAA,GAAsB,gBAAA;AAAA,KCzFtB,gBAAA,aAA6B,oBAAA,GAAuB,eAAA;AAAA,UAyD/C,cAAA;EACf,iBAAA,GAAoB,gBAAA;AAAA;AAAA,cA6DT,QAAA,EAAQ,gBAAA,CAAA,cAAA;AAAA,cC/HR,OAAA,EAqCX,gBAAA;AAAA,UCrCe,eAAA;EACf,OAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,cAGW,SAAA,EAAS,gBAAA,CAAA,eAAA;AAAA,UCNL,cAAA;EACf,aAAA;AAAA;AAAA,cAGW,QAAA,EAAQ,gBAAA,CAAA,cAAA;AAAA,UCJJ,qBAAA;EACf,IAAA;EACA,KAAA;EACA,GAAA;AAAA;AAAA,UAGe,kBAAA;ENPE;;;;;;;;;EMiBjB,OAAA,aAAoB,qBAAA;AAAA;AAAA,cAUT,YAAA,EAAY,gBAAA,CAAA,kBAAA;AAAA,cCzBZ,OAAA,EAwDX,gBAAA;AAAA,UC1Ce,qBAAA;EACf,IAAA,GAAO,cAAA;EACP,KAAA,GAAQ,eAAA;EACR,IAAA,GAAO,cAAA;AAAA;AAAA,KAGJ,cAAA,gBAA8B,mBAAA,IACjC,MAAA,SAAe,gBAAA,8DAET,MAAA,EAAQ,UAAA,CAAW,OAAA,EAAS,WAAA,EAAa,gBAAA,MACtC,oBAAA,GAAuB,eAAA;AAAA,UAGjB,eAAA;EACf,UAAA,EAAY,cAAA,QAAsB,QAAA;EAClC,SAAA,EAAW,cAAA,QAAsB,OAAA;EACjC,SAAA,EAAW,cAAA,QAAsB,OAAA;EACjC,WAAA,EAAa,cAAA,QAAsB,SAAA;EACnC,UAAA,EAAY,cAAA,QAAsB,QAAA;EAClC,cAAA,EAAgB,cAAA,QAAsB,YAAA;AAAA;AAAA,iBAGxB,qBAAA,CAAsB,MAAA,GAAQ,qBAAA,GAA6B,eAAA"}
package/dist/index.js CHANGED
@@ -47,7 +47,6 @@ const ctaType = {
47
47
  ...objectConfig
48
48
  } = config;
49
49
  return defineType({
50
- title: "Call to action",
51
50
  ...objectConfig,
52
51
  type: "object",
53
52
  fields: [registry.getPreset("link", {
@@ -95,7 +94,6 @@ const ctaType = {
95
94
  ...objectConfig
96
95
  } = config;
97
96
  return defineType({
98
- title: "Image",
99
97
  ...objectConfig,
100
98
  type: "object",
101
99
  fields: [defineField({
@@ -135,7 +133,6 @@ const ctaType = {
135
133
  type
136
134
  }));
137
135
  return defineType({
138
- title: "Link",
139
136
  ...objectConfig,
140
137
  type: "object",
141
138
  fields: [defineField({
@@ -201,61 +198,92 @@ const ctaType = {
201
198
  }
202
199
  });
203
200
  }
204
- }, pageType = {
205
- name: "page",
206
- identifier: "core.page",
207
- schemaType: (config, registry) => {
208
- const {
209
- pageBuilderBlocks,
210
- groups,
211
- fields,
212
- ...documentConfig
213
- } = config;
214
- return defineType({
215
- title: "Page",
216
- ...documentConfig,
217
- type: "document",
218
- groups: [{
219
- ...ALL_FIELDS_GROUP,
220
- hidden: !0
221
- }, {
222
- name: "main",
223
- title: "Main",
224
- default: !0
225
- }, {
226
- name: "metadata",
227
- title: "Metadata"
228
- }, ...groups ?? []],
229
- fields: [defineField({
230
- name: "name",
231
- title: "Name",
232
- type: "string",
233
- group: "main",
234
- validation: (rule) => rule.required()
235
- }), defineField({
236
- name: "slug",
237
- title: "Slug",
238
- type: "slug",
239
- group: "main",
240
- options: {
241
- source: "name"
242
- }
243
- }), defineField({
244
- name: "content",
245
- title: "Content",
246
- group: "main",
247
- type: "array",
248
- of: (pageBuilderBlocks ?? []).map((block) => typeof block == "string" ? defineArrayMember({
249
- type: block
250
- }) : defineArrayMember(block))
251
- }), registry.getPreset("seo", {
252
- name: "seo",
253
- title: "SEO",
254
- group: "metadata"
255
- }), ...fields ?? []]
201
+ };
202
+ function wrapArrayAsPageBuilderBlock(arraySchema) {
203
+ const components = "components" in arraySchema ? arraySchema.components : void 0;
204
+ return defineArrayMember({
205
+ name: arraySchema.name,
206
+ title: arraySchema.title,
207
+ type: "object",
208
+ fields: [defineField({
209
+ name: "content",
210
+ type: "array",
211
+ of: arraySchema.of,
212
+ components
213
+ })]
214
+ });
215
+ }
216
+ function toPageBuilderArrayMember(block, lookupArrayPreset) {
217
+ if (typeof block == "string") {
218
+ const arrayPreset = lookupArrayPreset(block);
219
+ return arrayPreset ? wrapArrayAsPageBuilderBlock(arrayPreset) : defineArrayMember({
220
+ type: block
256
221
  });
257
222
  }
258
- };
223
+ return block.type === "array" ? wrapArrayAsPageBuilderBlock(block) : defineArrayMember(block);
224
+ }
225
+ function defineLazyContentField(blocks, lookupArrayPreset) {
226
+ let cached;
227
+ return defineField({
228
+ name: "content",
229
+ title: "Content",
230
+ group: "main",
231
+ type: "array",
232
+ get of() {
233
+ return cached ??= blocks.map((block) => toPageBuilderArrayMember(block, lookupArrayPreset)), cached;
234
+ }
235
+ });
236
+ }
237
+ function createPageType({
238
+ lookupArrayPreset
239
+ }) {
240
+ return {
241
+ name: "page",
242
+ identifier: "core.page",
243
+ schemaType: (config, registry) => {
244
+ const {
245
+ pageBuilderBlocks,
246
+ groups,
247
+ fields,
248
+ ...documentConfig
249
+ } = config;
250
+ return defineType({
251
+ ...documentConfig,
252
+ type: "document",
253
+ groups: [{
254
+ ...ALL_FIELDS_GROUP,
255
+ hidden: !0
256
+ }, {
257
+ name: "main",
258
+ title: "Main",
259
+ default: !0
260
+ }, {
261
+ name: "metadata",
262
+ title: "Metadata"
263
+ }, ...groups ?? []],
264
+ fields: [defineField({
265
+ name: "name",
266
+ title: "Name",
267
+ type: "string",
268
+ group: "main",
269
+ validation: (rule) => rule.required()
270
+ }), defineField({
271
+ name: "slug",
272
+ title: "Slug",
273
+ type: "slug",
274
+ group: "main",
275
+ options: {
276
+ source: "name"
277
+ }
278
+ }), defineLazyContentField(pageBuilderBlocks ?? [], lookupArrayPreset), registry.getPreset("seo", {
279
+ name: "seo",
280
+ title: "SEO",
281
+ group: "metadata"
282
+ }), ...fields ?? []]
283
+ });
284
+ }
285
+ };
286
+ }
259
287
  function resolveObjects(objects) {
260
288
  if (objects === !1) return {
261
289
  link: !1,
@@ -308,7 +336,6 @@ const richTextType = {
308
336
  }
309
337
  });
310
338
  return defineType({
311
- title: "Rich text",
312
339
  ...arrayConfig,
313
340
  type: "array",
314
341
  of: imageMember ? [blockMember, imageMember] : [blockMember]
@@ -323,7 +350,6 @@ const richTextType = {
323
350
  ...objectConfig
324
351
  } = config;
325
352
  return defineType({
326
- title: "Web page metadata (SEO)",
327
353
  ...objectConfig,
328
354
  type: "object",
329
355
  fields: [defineField({
@@ -361,18 +387,24 @@ const richTextType = {
361
387
  }), ...fields ?? []]
362
388
  });
363
389
  }
364
- }, systemPresets = [linkType, ctaType, seoType, imageType, pageType, richTextType];
390
+ };
365
391
  function createPresetsRegistry(config = {}) {
366
392
  const registryId = uuid();
367
393
  registerRegistry(registryId);
368
- const seed = {};
369
- return systemPresets.reduce((registry, preset) => {
394
+ const seed = {}, registeredSchemas = /* @__PURE__ */ new Map(), pageTypeWithLookup = createPageType({
395
+ lookupArrayPreset: (name) => {
396
+ const registered = registeredSchemas.get(name);
397
+ return registered?.type === "array" ? registered : void 0;
398
+ }
399
+ });
400
+ return [linkType, ctaType, seoType, imageType, pageTypeWithLookup, richTextType].reduce((registry, preset) => {
370
401
  const key = getPresetKey(preset.name);
371
402
  return registry[key] = createDefiner({
372
403
  registryId,
373
404
  preset,
374
405
  config,
375
- registry
406
+ registry,
407
+ registeredSchemas
376
408
  }), registry;
377
409
  }, seed);
378
410
  }
@@ -395,7 +427,8 @@ function createDefiner({
395
427
  registryId,
396
428
  preset,
397
429
  config,
398
- registry
430
+ registry,
431
+ registeredSchemas
399
432
  }) {
400
433
  return function(userConfig = {}) {
401
434
  const name = userConfig.name;
@@ -415,7 +448,7 @@ function createDefiner({
415
448
  factoryConfig,
416
449
  registryContext
417
450
  );
418
- return applyMapHooks(addTelemetryComponent(schemaType, registryId), map);
451
+ return registeredSchemas.set(name, schemaType), applyMapHooks(addTelemetryComponent(schemaType, registryId), map);
419
452
  };
420
453
  }
421
454
  function applyMapHooks(schemaType, map) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/__telemetry__/presets.telemetry.ts","../src/telemetry.ts","../src/components/PresetsTelemetryCollector.tsx","../src/presets/cta-type/index.ts","../src/presets/image-type/index.ts","../src/presets/link-type/index.ts","../src/presets/page-type/index.ts","../src/presets/rich-text-type/index.ts","../src/presets/seo-type/index.ts","../src/registry.tsx"],"sourcesContent":["import {defineEvent} from '@sanity/telemetry'\n\ninterface PresetsAddedInfo {\n presetNames: string[]\n}\n\nexport const PresetsAdded = defineEvent<PresetsAddedInfo>({\n name: 'Presets Added',\n version: 1,\n description: 'Workspace using presets was accessed',\n})\n","import {PresetsAdded} from './__telemetry__/presets.telemetry'\n\n/**\n * Minimal interface for the subset of TelemetryLogger we need.\n * Avoids forcing callers to satisfy the full generic TelemetryLogger type.\n */\nexport interface TelemetryLog {\n log(event: unknown, data: unknown): void\n}\n\ninterface RegistryRecord {\n id: string\n presets: Set<string>\n logged: boolean\n}\n\nconst registries = new Map<string, RegistryRecord>()\n\nexport function registerRegistry(id: string): void {\n registries.set(id, {id, presets: new Set(), logged: false})\n}\n\nexport function recordPresetUsage(registryId: string, identifier: string): void {\n registries.get(registryId)?.presets.add(identifier)\n}\n\nexport function collectPresetsRegistryTelemetry(registryId: string, telemetry: TelemetryLog): void {\n const record = registries.get(registryId)\n if (!record || record.logged) return\n record.logged = true\n if (record.presets.size > 0) {\n telemetry.log(PresetsAdded, {presetNames: [...record.presets]})\n }\n}\n\n/** @internal */\nexport function resetRegistries(): void {\n registries.clear()\n}\n","import {useTelemetry} from '@sanity/telemetry/react'\nimport {useEffect, type ComponentType} from 'react'\nimport type {InputProps} from 'sanity'\n\nimport {collectPresetsRegistryTelemetry} from '../telemetry'\n\ntype Props = InputProps & {\n registryId: string\n userInput?: ComponentType<InputProps>\n}\n\n/**\n * A transparent input component wrapper that triggers telemetry collection\n * for the presets registry. Renders the user-provided input component if\n * supplied, otherwise the default input component unchanged.\n *\n * Attached to every schema type produced by a define<Type> function via\n * components.input. The first instance to render for a given registry id\n * submits the PresetsAdded telemetry event; subsequent renders are no-ops.\n */\nexport const PresetsTelemetryCollector: ComponentType<Props> = ({\n registryId,\n userInput: UserInput,\n ...props\n}) => {\n const telemetry = useTelemetry()\n\n useEffect(() => {\n collectPresetsRegistryTelemetry(registryId, telemetry)\n }, [registryId, telemetry])\n\n if (UserInput) {\n return <UserInput {...props} />\n }\n\n return props.renderDefault(props)\n}\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport const ctaType = definePresetType<{}, 'object', 'preview'>({\n name: 'cta',\n identifier: 'core.cta',\n schemaType: (config, registry) => {\n const {fields, ...objectConfig} = config\n\n return defineType({\n title: 'Call to action',\n ...objectConfig,\n type: 'object',\n fields: [\n registry.getPreset('link', {name: 'link', title: 'Link'}),\n defineField({\n name: 'level',\n title: 'Level',\n type: 'number',\n options: {\n layout: 'radio',\n list: [1, 2, 3],\n },\n }),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n linkType: 'link.linkType',\n url: 'link.url',\n referenceTitle: 'link.reference.title',\n referenceName: 'link.reference.name',\n },\n prepare({linkType, url, referenceTitle, referenceName}) {\n const referenceLabel = referenceTitle || referenceName || 'No reference'\n const title = linkType === 'external' ? url || 'No URL' : referenceLabel\n return {title, subtitle: 'Button'}\n },\n },\n })\n },\n})\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface ImageTypeConfig {\n altText?: boolean\n caption?: boolean\n hotspot?: boolean\n}\n\nexport const imageType = definePresetType<ImageTypeConfig, 'object', 'preview'>({\n name: 'image',\n identifier: 'core.image',\n schemaType: (config) => {\n const {altText = true, caption = true, hotspot = true, fields, ...objectConfig} = config\n\n return defineType({\n title: 'Image',\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'image',\n title: 'Image',\n type: 'image',\n options: {\n hotspot,\n },\n }),\n ...(altText\n ? [\n defineField({\n name: 'altText',\n title: 'Alt text',\n type: 'string',\n validation: (rule) => rule.warning('Alt text improves accessibility.'),\n }),\n ]\n : []),\n ...(caption\n ? [\n defineField({\n name: 'caption',\n title: 'Caption',\n type: 'text',\n }),\n ]\n : []),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n title: altText ? 'altText' : caption ? 'caption' : 'image.asset.originalFilename',\n media: 'image',\n },\n },\n })\n },\n})\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface LinkTypeConfig {\n internalTypes?: string[]\n}\n\nexport const linkType = definePresetType<LinkTypeConfig, 'object', 'preview'>({\n name: 'link',\n identifier: 'core.link',\n schemaType: ({internalTypes, fields, ...objectConfig}) => {\n const resolvedInternalTypes = internalTypes ?? []\n const referenceTargets = resolvedInternalTypes.map((type) => ({type}))\n\n return defineType({\n title: 'Link',\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'linkType',\n type: 'string',\n title: 'Link Type',\n initialValue: 'internal',\n options: {\n layout: 'radio',\n list: [\n {title: 'Internal', value: 'internal'},\n {title: 'External', value: 'external'},\n ],\n },\n }),\n defineField({\n name: 'reference',\n type: 'reference',\n title: 'Internal Link',\n to: referenceTargets,\n hidden: ({parent}) => parent?.linkType === 'external',\n }),\n defineField({\n name: 'url',\n type: 'url',\n title: 'URL',\n hidden: ({parent}) => parent?.linkType === 'internal',\n validation: (rule) =>\n rule.uri({\n scheme: ['http', 'https', 'mailto', 'tel'],\n }),\n }),\n defineField({\n name: 'openInNewTab',\n type: 'boolean',\n title: 'Open in New Tab',\n initialValue: false,\n hidden: ({parent}) => parent?.linkType === 'internal',\n }),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n linkType: 'linkType',\n url: 'url',\n referenceTitle: 'reference.title',\n referenceName: 'reference.name',\n },\n prepare({linkType, url, referenceTitle, referenceName}) {\n const referenceLabel = referenceTitle || referenceName || 'No reference'\n const title = linkType === 'external' ? url || 'No URL' : referenceLabel\n\n return {\n title,\n subtitle: linkType === 'external' ? 'External link' : 'Internal link',\n }\n },\n },\n })\n },\n})\n","import {\n ALL_FIELDS_GROUP,\n defineArrayMember,\n defineField,\n defineType,\n type FieldDefinition,\n type SchemaTypeDefinition,\n} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport type PageBuilderBlock = string | (SchemaTypeDefinition & FieldDefinition)\n\nexport interface PageTypeConfig {\n pageBuilderBlocks?: PageBuilderBlock[]\n}\n\nexport const pageType = definePresetType<PageTypeConfig, 'document'>({\n name: 'page',\n identifier: 'core.page',\n schemaType: (config, registry) => {\n const {pageBuilderBlocks, groups, fields, ...documentConfig} = config\n\n return defineType({\n title: 'Page',\n ...documentConfig,\n type: 'document',\n groups: [\n {\n ...ALL_FIELDS_GROUP,\n hidden: true,\n },\n {\n name: 'main',\n title: 'Main',\n default: true,\n },\n {\n name: 'metadata',\n title: 'Metadata',\n },\n ...(groups ?? []),\n ],\n fields: [\n defineField({\n name: 'name',\n title: 'Name',\n type: 'string',\n group: 'main',\n validation: (rule) => rule.required(),\n }),\n defineField({\n name: 'slug',\n title: 'Slug',\n type: 'slug',\n group: 'main',\n options: {\n source: 'name',\n },\n }),\n defineField({\n name: 'content',\n title: 'Content',\n group: 'main',\n type: 'array',\n of: (pageBuilderBlocks ?? []).map((block) =>\n typeof block === 'string' ? defineArrayMember({type: block}) : defineArrayMember(block),\n ),\n }),\n registry.getPreset('seo', {\n name: 'seo',\n title: 'SEO',\n group: 'metadata',\n }),\n ...(fields ?? []),\n ],\n })\n },\n})\n","import {defineArrayMember, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface RichTextObjectsConfig {\n link?: boolean\n image?: boolean\n cta?: boolean\n}\n\nexport interface RichTextTypeConfig {\n /**\n * Toggle the embedded objects (link annotations, image blocks, inline CTAs).\n * Defaults to all enabled. Pass `false` to disable every object, or an\n * object to toggle individual ones (e.g. `{link: false}`).\n *\n * Each object's options (link `internalTypes`, image `altText`, …) are\n * configured on `createPresetsRegistry` and cascade into every rich text\n * field. Use `map.of` for per-field structural changes.\n */\n objects?: boolean | RichTextObjectsConfig\n}\n\nfunction resolveObjects(objects: RichTextTypeConfig['objects']): Required<RichTextObjectsConfig> {\n if (objects === false) return {link: false, image: false, cta: false}\n if (objects === true || objects === undefined) return {link: true, image: true, cta: true}\n const {link = true, image = true, cta = true} = objects\n return {link, image, cta}\n}\n\nexport const richTextType = definePresetType<RichTextTypeConfig, 'array', 'of'>({\n name: 'richText',\n identifier: 'core.richText',\n schemaType: (config, registry) => {\n const {objects, ...arrayConfig} = config\n const {link, image, cta} = resolveObjects(objects)\n\n // The annotation name must be 'link' — Portable Text Editor's built-in link UI keys off this name.\n const linkAnnotation = link\n ? registry.getPreset('link', {name: 'link', title: 'Link'})\n : undefined\n const ctaInline = cta ? registry.getPreset('cta', {name: 'cta', title: 'CTA'}) : undefined\n const imageMember = image\n ? registry.getPreset('image', {name: 'richTextImage', title: 'Image'})\n : undefined\n\n const blockMember = defineArrayMember({\n type: 'block',\n marks: {annotations: linkAnnotation ? [linkAnnotation] : []},\n ...(ctaInline && {of: [ctaInline]}),\n })\n\n return defineType({\n title: 'Rich text',\n ...arrayConfig,\n type: 'array',\n of: imageMember ? [blockMember, imageMember] : [blockMember],\n })\n },\n})\n","import {getImageDimensions} from '@sanity/asset-utils'\nimport {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport const seoType = definePresetType<{}, 'object'>({\n name: 'seo',\n identifier: 'core.seo',\n schemaType: (config) => {\n const {fields, ...objectConfig} = config\n\n return defineType({\n title: 'Web page metadata (SEO)',\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'title',\n title: 'Title',\n type: 'string',\n validation: (rule) => rule.max(70).info('Search engines may truncate this title.'),\n }),\n defineField({\n name: 'description',\n title: 'Description',\n type: 'text',\n validation: (rule) => rule.max(150).info('Search engines may truncate this description.'),\n }),\n defineField({\n name: 'ogImage',\n title: 'Open Graph image',\n type: 'image',\n description: 'Landscape 1200x630 (1.91:1)',\n options: {\n hotspot: {\n previews: [\n {\n title: 'Landscape (1.91:1)',\n aspectRatio: 1.91 / 1,\n },\n ],\n },\n },\n validation: (Rule) =>\n Rule.custom((value) => {\n if (!value?.asset?._ref) {\n return true\n }\n\n const {height, width} = getImageDimensions(value.asset?._ref)\n\n if (height !== 630 || width !== 1200) {\n return 'Open Graph image must be 1200x630'\n }\n\n return true\n }),\n }),\n ...(fields ?? []),\n ],\n })\n },\n})\n","import {uuid} from '@sanity/uuid'\nimport {type ComponentType} from 'react'\nimport type {FieldDefinition, InputProps, SchemaTypeDefinition} from 'sanity'\n\nimport {PresetsTelemetryCollector} from './components/PresetsTelemetryCollector'\nimport type {\n AnyPresetDefinition,\n PresetDefinition,\n RegistryContext,\n UserConfig,\n} from './definePresetType'\nimport {ctaType} from './presets/cta-type'\nimport {imageType, type ImageTypeConfig} from './presets/image-type'\nimport {linkType, type LinkTypeConfig} from './presets/link-type'\nimport {pageType, type PageTypeConfig} from './presets/page-type'\nimport {richTextType} from './presets/rich-text-type'\nimport {seoType} from './presets/seo-type'\nimport {recordPresetUsage, registerRegistry} from './telemetry'\n\nconst systemPresets = [linkType, ctaType, seoType, imageType, pageType, richTextType] as const\n\nexport interface PresetsRegistryConfig {\n link?: LinkTypeConfig\n image?: ImageTypeConfig\n page?: PageTypeConfig\n}\n\ntype DefineFunction<Preset extends AnyPresetDefinition> =\n Preset extends PresetDefinition<infer Context, infer AliasedType, infer LockedProperties>\n ? (\n config: UserConfig<Context, AliasedType, LockedProperties>,\n ) => SchemaTypeDefinition & FieldDefinition\n : never\n\nexport interface PresetsRegistry {\n defineLink: DefineFunction<typeof linkType>\n defineCta: DefineFunction<typeof ctaType>\n defineSeo: DefineFunction<typeof seoType>\n defineImage: DefineFunction<typeof imageType>\n definePage: DefineFunction<typeof pageType>\n defineRichText: DefineFunction<typeof richTextType>\n}\n\nexport function createPresetsRegistry(config: PresetsRegistryConfig = {}): PresetsRegistry {\n const registryId = uuid()\n registerRegistry(registryId)\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- seeding reduce with an empty object that is populated by each iteration\n const seed = {} as DefinerRecord & PresetsRegistry\n\n return systemPresets.reduce((registry, preset) => {\n const key = getPresetKey(preset.name)\n registry[key] = createDefiner({registryId, preset, config, registry})\n return registry\n }, seed)\n}\n\nexport function getPresetKey(name: string): string {\n return `define${name.charAt(0).toUpperCase()}${name.slice(1)}`\n}\n\ntype Definer = (config?: Record<string, unknown>) => SchemaTypeDefinition & FieldDefinition\ntype DefinerRecord = Record<string, Definer>\n\nfunction createRegistryContext({registry}: {registry: DefinerRecord}): RegistryContext {\n return {\n getPreset: (name, presetConfig) => {\n const key = getPresetKey(name)\n const definer = registry[key]\n if (!definer) {\n throw new Error(`Cannot resolve preset \"${name}\". No such preset in this registry.`)\n }\n return definer(presetConfig)\n },\n }\n}\n\ninterface CreateDefinerOptions {\n registryId: string\n preset: AnyPresetDefinition\n config: PresetsRegistryConfig\n registry: DefinerRecord\n}\n\nfunction createDefiner({registryId, preset, config, registry}: CreateDefinerOptions): Definer {\n return function define(userConfig = {}) {\n const name = userConfig['name']\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error(\n `${getPresetKey(preset.name)}: \"name\" is required. Pass {name: \"yourTypeName\"}.`,\n )\n }\n\n recordPresetUsage(registryId, preset.identifier ?? 'unnamed')\n\n const registryContext = createRegistryContext({registry})\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- PresetsRegistryConfig is keyed by preset name; dynamic lookup is safe\n const registryDefaults = (config as Record<string, unknown>)[preset.name]\n const mergedConfig: Record<string, unknown> = {\n ...(typeof registryDefaults === 'object' && registryDefaults !== null\n ? registryDefaults\n : {}),\n ...userConfig,\n }\n\n const {map, ...factoryConfig} = mergedConfig\n\n const schemaType = preset.schemaType(\n // oxlint-disable-next-line no-unsafe-type-assertion -- factoryConfig is the merged user config (minus `map`, with `name` injected); its shape matches the factory's expected parameter at runtime\n factoryConfig as unknown as Parameters<AnyPresetDefinition['schemaType']>[0],\n registryContext,\n )\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- runtime value is a valid field definition\n return applyMapHooks(\n addTelemetryComponent(schemaType, registryId),\n map,\n ) as SchemaTypeDefinition & FieldDefinition\n }\n}\n\nfunction applyMapHooks(schemaType: SchemaTypeDefinition, map: unknown): SchemaTypeDefinition {\n if (!map || typeof map !== 'object') return schemaType\n\n const mappedSchemaType: Record<string, unknown> = {}\n\n for (const [configName, configValue] of Object.entries(map)) {\n if (typeof configValue !== 'function') {\n continue\n }\n\n mappedSchemaType[configName] = configValue(\n // oxlint-disable-next-line no-unsafe-type-assertion -- map hooks operate on arbitrary schema type properties\n schemaType[configName as keyof typeof schemaType],\n )\n }\n\n return {...schemaType, ...mappedSchemaType}\n}\n\nfunction addTelemetryComponent(\n schemaType: SchemaTypeDefinition,\n registryId: string,\n): SchemaTypeDefinition {\n const existing = 'components' in schemaType ? schemaType.components : undefined\n const existingInput =\n existing && 'input' in existing && typeof existing.input === 'function'\n ? // oxlint-disable-next-line no-unsafe-type-assertion -- presets only produce object/document schema types, whose input components are assignable to ComponentType<InputProps>\n (existing.input as ComponentType<InputProps>)\n : undefined\n // oxlint-disable-next-line no-unsafe-type-assertion -- spreading a discriminated union loses the discriminant; the runtime shape is still a valid SchemaTypeDefinition\n return {\n ...schemaType,\n components: {\n ...existing,\n input: (props: InputProps) => (\n <PresetsTelemetryCollector {...props} registryId={registryId} userInput={existingInput} />\n ),\n },\n } as SchemaTypeDefinition\n}\n\n// Re-export for consumers that previously used these types.\nexport type {PresetDefinition, AnyPresetDefinition}\n"],"names":["PresetsAdded","defineEvent","name","version","description","registries","Map","registerRegistry","id","set","presets","Set","logged","recordPresetUsage","registryId","identifier","get","add","collectPresetsRegistryTelemetry","telemetry","record","size","log","presetNames","PresetsTelemetryCollector","t0","$","_c","userInput","UserInput","props","useTelemetry","t1","t2","useEffect","renderDefault","ctaType","schemaType","config","registry","fields","objectConfig","defineType","title","type","getPreset","defineField","options","layout","list","preview","select","linkType","url","referenceTitle","referenceName","prepare","subtitle","imageType","altText","caption","hotspot","validation","rule","warning","media","internalTypes","referenceTargets","map","initialValue","value","to","hidden","parent","uri","scheme","pageType","pageBuilderBlocks","groups","documentConfig","ALL_FIELDS_GROUP","default","group","required","source","of","block","defineArrayMember","resolveObjects","objects","link","image","cta","undefined","richTextType","arrayConfig","linkAnnotation","ctaInline","imageMember","blockMember","marks","annotations","seoType","max","info","previews","aspectRatio","Rule","custom","asset","_ref","height","width","getImageDimensions","systemPresets","createPresetsRegistry","uuid","seed","reduce","preset","key","getPresetKey","createDefiner","charAt","toUpperCase","slice","createRegistryContext","presetConfig","definer","Error","userConfig","length","registryContext","registryDefaults","mergedConfig","factoryConfig","applyMapHooks","addTelemetryComponent","mappedSchemaType","configName","configValue","Object","entries","existing","components","existingInput","input"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/__telemetry__/presets.telemetry.ts","../src/telemetry.ts","../src/components/PresetsTelemetryCollector.tsx","../src/presets/cta-type/index.ts","../src/presets/image-type/index.ts","../src/presets/link-type/index.ts","../src/presets/page-type/index.ts","../src/presets/rich-text-type/index.ts","../src/presets/seo-type/index.ts","../src/registry.tsx"],"sourcesContent":["import {defineEvent} from '@sanity/telemetry'\n\ninterface PresetsAddedInfo {\n presetNames: string[]\n}\n\nexport const PresetsAdded = defineEvent<PresetsAddedInfo>({\n name: 'Presets Added',\n version: 1,\n description: 'Workspace using presets was accessed',\n})\n","import {PresetsAdded} from './__telemetry__/presets.telemetry'\n\n/**\n * Minimal interface for the subset of TelemetryLogger we need.\n * Avoids forcing callers to satisfy the full generic TelemetryLogger type.\n */\nexport interface TelemetryLog {\n log(event: unknown, data: unknown): void\n}\n\ninterface RegistryRecord {\n id: string\n presets: Set<string>\n logged: boolean\n}\n\nconst registries = new Map<string, RegistryRecord>()\n\nexport function registerRegistry(id: string): void {\n registries.set(id, {id, presets: new Set(), logged: false})\n}\n\nexport function recordPresetUsage(registryId: string, identifier: string): void {\n registries.get(registryId)?.presets.add(identifier)\n}\n\nexport function collectPresetsRegistryTelemetry(registryId: string, telemetry: TelemetryLog): void {\n const record = registries.get(registryId)\n if (!record || record.logged) return\n record.logged = true\n if (record.presets.size > 0) {\n telemetry.log(PresetsAdded, {presetNames: [...record.presets]})\n }\n}\n\n/** @internal */\nexport function resetRegistries(): void {\n registries.clear()\n}\n","import {useTelemetry} from '@sanity/telemetry/react'\nimport {useEffect, type ComponentType} from 'react'\nimport type {InputProps} from 'sanity'\n\nimport {collectPresetsRegistryTelemetry} from '../telemetry'\n\ntype Props = InputProps & {\n registryId: string\n userInput?: ComponentType<InputProps>\n}\n\n/**\n * A transparent input component wrapper that triggers telemetry collection\n * for the presets registry. Renders the user-provided input component if\n * supplied, otherwise the default input component unchanged.\n *\n * Attached to every schema type produced by a define<Type> function via\n * components.input. The first instance to render for a given registry id\n * submits the PresetsAdded telemetry event; subsequent renders are no-ops.\n */\nexport const PresetsTelemetryCollector: ComponentType<Props> = ({\n registryId,\n userInput: UserInput,\n ...props\n}) => {\n const telemetry = useTelemetry()\n\n useEffect(() => {\n collectPresetsRegistryTelemetry(registryId, telemetry)\n }, [registryId, telemetry])\n\n if (UserInput) {\n return <UserInput {...props} />\n }\n\n return props.renderDefault(props)\n}\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport const ctaType = definePresetType<{}, 'object', 'preview'>({\n name: 'cta',\n identifier: 'core.cta',\n schemaType: (config, registry) => {\n const {fields, ...objectConfig} = config\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n registry.getPreset('link', {name: 'link', title: 'Link'}),\n defineField({\n name: 'level',\n title: 'Level',\n type: 'number',\n options: {\n layout: 'radio',\n list: [1, 2, 3],\n },\n }),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n linkType: 'link.linkType',\n url: 'link.url',\n referenceTitle: 'link.reference.title',\n referenceName: 'link.reference.name',\n },\n prepare({linkType, url, referenceTitle, referenceName}) {\n const referenceLabel = referenceTitle || referenceName || 'No reference'\n const title = linkType === 'external' ? url || 'No URL' : referenceLabel\n return {title, subtitle: 'Button'}\n },\n },\n })\n },\n})\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface ImageTypeConfig {\n altText?: boolean\n caption?: boolean\n hotspot?: boolean\n}\n\nexport const imageType = definePresetType<ImageTypeConfig, 'object', 'preview'>({\n name: 'image',\n identifier: 'core.image',\n schemaType: (config) => {\n const {altText = true, caption = true, hotspot = true, fields, ...objectConfig} = config\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'image',\n title: 'Image',\n type: 'image',\n options: {\n hotspot,\n },\n }),\n ...(altText\n ? [\n defineField({\n name: 'altText',\n title: 'Alt text',\n type: 'string',\n validation: (rule) => rule.warning('Alt text improves accessibility.'),\n }),\n ]\n : []),\n ...(caption\n ? [\n defineField({\n name: 'caption',\n title: 'Caption',\n type: 'text',\n }),\n ]\n : []),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n title: altText ? 'altText' : caption ? 'caption' : 'image.asset.originalFilename',\n media: 'image',\n },\n },\n })\n },\n})\n","import {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface LinkTypeConfig {\n internalTypes?: string[]\n}\n\nexport const linkType = definePresetType<LinkTypeConfig, 'object', 'preview'>({\n name: 'link',\n identifier: 'core.link',\n schemaType: ({internalTypes, fields, ...objectConfig}) => {\n const resolvedInternalTypes = internalTypes ?? []\n const referenceTargets = resolvedInternalTypes.map((type) => ({type}))\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'linkType',\n type: 'string',\n title: 'Link Type',\n initialValue: 'internal',\n options: {\n layout: 'radio',\n list: [\n {title: 'Internal', value: 'internal'},\n {title: 'External', value: 'external'},\n ],\n },\n }),\n defineField({\n name: 'reference',\n type: 'reference',\n title: 'Internal Link',\n to: referenceTargets,\n hidden: ({parent}) => parent?.linkType === 'external',\n }),\n defineField({\n name: 'url',\n type: 'url',\n title: 'URL',\n hidden: ({parent}) => parent?.linkType === 'internal',\n validation: (rule) =>\n rule.uri({\n scheme: ['http', 'https', 'mailto', 'tel'],\n }),\n }),\n defineField({\n name: 'openInNewTab',\n type: 'boolean',\n title: 'Open in New Tab',\n initialValue: false,\n hidden: ({parent}) => parent?.linkType === 'internal',\n }),\n ...(fields ?? []),\n ],\n preview: {\n select: {\n linkType: 'linkType',\n url: 'url',\n referenceTitle: 'reference.title',\n referenceName: 'reference.name',\n },\n prepare({linkType, url, referenceTitle, referenceName}) {\n const referenceLabel = referenceTitle || referenceName || 'No reference'\n const title = linkType === 'external' ? url || 'No URL' : referenceLabel\n\n return {\n title,\n subtitle: linkType === 'external' ? 'External link' : 'Internal link',\n }\n },\n },\n })\n },\n})\n","import {\n ALL_FIELDS_GROUP,\n type ArrayDefinition,\n defineArrayMember,\n defineField,\n defineType,\n type FieldDefinition,\n type SchemaTypeDefinition,\n} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport type PageBuilderBlock = string | (SchemaTypeDefinition & FieldDefinition)\n\ntype LookupArrayPreset = (name: string) => ArrayDefinition | undefined\n\n// Sanity rejects array members whose `type` resolves to another array. Wrap\n// array presets in an object so they can serve as page-builder members.\nfunction wrapArrayAsPageBuilderBlock(arraySchema: ArrayDefinition) {\n const components = 'components' in arraySchema ? arraySchema.components : undefined\n return defineArrayMember({\n name: arraySchema.name,\n title: arraySchema.title,\n type: 'object',\n fields: [\n defineField({\n name: 'content',\n type: 'array',\n of: arraySchema.of,\n components,\n }),\n ],\n })\n}\n\nfunction toPageBuilderArrayMember(block: PageBuilderBlock, lookupArrayPreset: LookupArrayPreset) {\n if (typeof block === 'string') {\n const arrayPreset = lookupArrayPreset(block)\n if (arrayPreset) {\n return wrapArrayAsPageBuilderBlock(arrayPreset)\n }\n return defineArrayMember({type: block})\n }\n if (block.type === 'array') {\n // oxlint-disable-next-line no-unsafe-type-assertion -- discriminating on `type` does not narrow the intersected union\n return wrapArrayAsPageBuilderBlock(block as ArrayDefinition)\n }\n return defineArrayMember(block)\n}\n\n// Defer building `content.of` so by-name references resolve after every\n// `define<X>` has run. Memoised for stable array identity across reads.\nfunction defineLazyContentField(\n blocks: PageBuilderBlock[],\n lookupArrayPreset: LookupArrayPreset,\n): FieldDefinition {\n let cached: ReturnType<typeof toPageBuilderArrayMember>[] | undefined\n return defineField({\n name: 'content',\n title: 'Content',\n group: 'main',\n type: 'array',\n get of() {\n cached ??= blocks.map((block) => toPageBuilderArrayMember(block, lookupArrayPreset))\n return cached\n },\n })\n}\n\nexport interface PageTypeConfig {\n pageBuilderBlocks?: PageBuilderBlock[]\n}\n\n// `lookupArrayPreset` is closure-injected by the registry to keep it off\n// the public `RegistryContext`. The default `pageType` below uses a no-op.\nexport function createPageType({lookupArrayPreset}: {lookupArrayPreset: LookupArrayPreset}) {\n return definePresetType<PageTypeConfig, 'document'>({\n name: 'page',\n identifier: 'core.page',\n schemaType: (config, registry) => {\n const {pageBuilderBlocks, groups, fields, ...documentConfig} = config\n\n return defineType({\n ...documentConfig,\n type: 'document',\n groups: [\n {\n ...ALL_FIELDS_GROUP,\n hidden: true,\n },\n {\n name: 'main',\n title: 'Main',\n default: true,\n },\n {\n name: 'metadata',\n title: 'Metadata',\n },\n ...(groups ?? []),\n ],\n fields: [\n defineField({\n name: 'name',\n title: 'Name',\n type: 'string',\n group: 'main',\n validation: (rule) => rule.required(),\n }),\n defineField({\n name: 'slug',\n title: 'Slug',\n type: 'slug',\n group: 'main',\n options: {\n source: 'name',\n },\n }),\n defineLazyContentField(pageBuilderBlocks ?? [], lookupArrayPreset),\n registry.getPreset('seo', {\n name: 'seo',\n title: 'SEO',\n group: 'metadata',\n }),\n ...(fields ?? []),\n ],\n })\n },\n })\n}\n\nexport const pageType = createPageType({lookupArrayPreset: () => undefined})\n","import {defineArrayMember, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport interface RichTextObjectsConfig {\n link?: boolean\n image?: boolean\n cta?: boolean\n}\n\nexport interface RichTextTypeConfig {\n /**\n * Toggle the embedded objects (link annotations, image blocks, inline CTAs).\n * Defaults to all enabled. Pass `false` to disable every object, or an\n * object to toggle individual ones (e.g. `{link: false}`).\n *\n * Each object's options (link `internalTypes`, image `altText`, …) are\n * configured on `createPresetsRegistry` and cascade into every rich text\n * field. Use `map.of` for per-field structural changes.\n */\n objects?: boolean | RichTextObjectsConfig\n}\n\nfunction resolveObjects(objects: RichTextTypeConfig['objects']): Required<RichTextObjectsConfig> {\n if (objects === false) return {link: false, image: false, cta: false}\n if (objects === true || objects === undefined) return {link: true, image: true, cta: true}\n const {link = true, image = true, cta = true} = objects\n return {link, image, cta}\n}\n\nexport const richTextType = definePresetType<RichTextTypeConfig, 'array', 'of'>({\n name: 'richText',\n identifier: 'core.richText',\n schemaType: (config, registry) => {\n const {objects, ...arrayConfig} = config\n const {link, image, cta} = resolveObjects(objects)\n\n // The annotation name must be 'link' — Portable Text Editor's built-in link UI keys off this name.\n const linkAnnotation = link\n ? registry.getPreset('link', {name: 'link', title: 'Link'})\n : undefined\n const ctaInline = cta ? registry.getPreset('cta', {name: 'cta', title: 'CTA'}) : undefined\n const imageMember = image\n ? registry.getPreset('image', {name: 'richTextImage', title: 'Image'})\n : undefined\n\n const blockMember = defineArrayMember({\n type: 'block',\n marks: {annotations: linkAnnotation ? [linkAnnotation] : []},\n ...(ctaInline && {of: [ctaInline]}),\n })\n\n return defineType({\n ...arrayConfig,\n type: 'array',\n of: imageMember ? [blockMember, imageMember] : [blockMember],\n })\n },\n})\n","import {getImageDimensions} from '@sanity/asset-utils'\nimport {defineField, defineType} from 'sanity'\n\nimport {definePresetType} from '../../definePresetType'\n\nexport const seoType = definePresetType<{}, 'object'>({\n name: 'seo',\n identifier: 'core.seo',\n schemaType: (config) => {\n const {fields, ...objectConfig} = config\n\n return defineType({\n ...objectConfig,\n type: 'object',\n fields: [\n defineField({\n name: 'title',\n title: 'Title',\n type: 'string',\n validation: (rule) => rule.max(70).info('Search engines may truncate this title.'),\n }),\n defineField({\n name: 'description',\n title: 'Description',\n type: 'text',\n validation: (rule) => rule.max(150).info('Search engines may truncate this description.'),\n }),\n defineField({\n name: 'ogImage',\n title: 'Open Graph image',\n type: 'image',\n description: 'Landscape 1200x630 (1.91:1)',\n options: {\n hotspot: {\n previews: [\n {\n title: 'Landscape (1.91:1)',\n aspectRatio: 1.91 / 1,\n },\n ],\n },\n },\n validation: (Rule) =>\n Rule.custom((value) => {\n if (!value?.asset?._ref) {\n return true\n }\n\n const {height, width} = getImageDimensions(value.asset?._ref)\n\n if (height !== 630 || width !== 1200) {\n return 'Open Graph image must be 1200x630'\n }\n\n return true\n }),\n }),\n ...(fields ?? []),\n ],\n })\n },\n})\n","import {uuid} from '@sanity/uuid'\nimport {type ComponentType} from 'react'\nimport type {ArrayDefinition, FieldDefinition, InputProps, SchemaTypeDefinition} from 'sanity'\n\nimport {PresetsTelemetryCollector} from './components/PresetsTelemetryCollector'\nimport type {\n AnyPresetDefinition,\n PresetDefinition,\n RegistryContext,\n UserConfig,\n} from './definePresetType'\nimport {ctaType} from './presets/cta-type'\nimport {imageType, type ImageTypeConfig} from './presets/image-type'\nimport {linkType, type LinkTypeConfig} from './presets/link-type'\nimport {createPageType, pageType, type PageTypeConfig} from './presets/page-type'\nimport {richTextType} from './presets/rich-text-type'\nimport {seoType} from './presets/seo-type'\nimport {recordPresetUsage, registerRegistry} from './telemetry'\n\nexport interface PresetsRegistryConfig {\n link?: LinkTypeConfig\n image?: ImageTypeConfig\n page?: PageTypeConfig\n}\n\ntype DefineFunction<Preset extends AnyPresetDefinition> =\n Preset extends PresetDefinition<infer Context, infer AliasedType, infer LockedProperties>\n ? (\n config: UserConfig<Context, AliasedType, LockedProperties>,\n ) => SchemaTypeDefinition & FieldDefinition\n : never\n\nexport interface PresetsRegistry {\n defineLink: DefineFunction<typeof linkType>\n defineCta: DefineFunction<typeof ctaType>\n defineSeo: DefineFunction<typeof seoType>\n defineImage: DefineFunction<typeof imageType>\n definePage: DefineFunction<typeof pageType>\n defineRichText: DefineFunction<typeof richTextType>\n}\n\nexport function createPresetsRegistry(config: PresetsRegistryConfig = {}): PresetsRegistry {\n const registryId = uuid()\n registerRegistry(registryId)\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- seeding reduce with an empty object that is populated by each iteration\n const seed = {} as DefinerRecord & PresetsRegistry\n\n // Tracks the schema produced under each defined preset name so `pageType`\n // can resolve string references in `pageBuilderBlocks` regardless of\n // definition order, and wrap array-typed presets at the page builder\n // boundary. Closure-injected into `pageType` via `createPageType` so it\n // does not need to live on the public `RegistryContext`.\n const registeredSchemas = new Map<string, SchemaTypeDefinition>()\n const pageTypeWithLookup = createPageType({\n lookupArrayPreset: (name) => {\n const registered = registeredSchemas.get(name)\n // oxlint-disable-next-line no-unsafe-type-assertion -- discriminating on `type` does not narrow the intersected union\n return registered?.type === 'array' ? (registered as ArrayDefinition) : undefined\n },\n })\n\n const systemPresets = [\n linkType,\n ctaType,\n seoType,\n imageType,\n pageTypeWithLookup,\n richTextType,\n ] as const\n\n return systemPresets.reduce((registry, preset) => {\n const key = getPresetKey(preset.name)\n registry[key] = createDefiner({registryId, preset, config, registry, registeredSchemas})\n return registry\n }, seed)\n}\n\nexport function getPresetKey(name: string): string {\n return `define${name.charAt(0).toUpperCase()}${name.slice(1)}`\n}\n\ntype Definer = (config?: Record<string, unknown>) => SchemaTypeDefinition & FieldDefinition\ntype DefinerRecord = Record<string, Definer>\n\nfunction createRegistryContext({registry}: {registry: DefinerRecord}): RegistryContext {\n return {\n getPreset: (name, presetConfig) => {\n const key = getPresetKey(name)\n const definer = registry[key]\n if (!definer) {\n throw new Error(`Cannot resolve preset \"${name}\". No such preset in this registry.`)\n }\n return definer(presetConfig)\n },\n }\n}\n\ninterface CreateDefinerOptions {\n registryId: string\n preset: AnyPresetDefinition\n config: PresetsRegistryConfig\n registry: DefinerRecord\n registeredSchemas: Map<string, SchemaTypeDefinition>\n}\n\nfunction createDefiner({\n registryId,\n preset,\n config,\n registry,\n registeredSchemas,\n}: CreateDefinerOptions): Definer {\n return function define(userConfig = {}) {\n const name = userConfig['name']\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error(\n `${getPresetKey(preset.name)}: \"name\" is required. Pass {name: \"yourTypeName\"}.`,\n )\n }\n\n recordPresetUsage(registryId, preset.identifier ?? 'unnamed')\n\n const registryContext = createRegistryContext({registry})\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- PresetsRegistryConfig is keyed by preset name; dynamic lookup is safe\n const registryDefaults = (config as Record<string, unknown>)[preset.name]\n const mergedConfig: Record<string, unknown> = {\n ...(typeof registryDefaults === 'object' && registryDefaults !== null\n ? registryDefaults\n : {}),\n ...userConfig,\n }\n\n const {map, ...factoryConfig} = mergedConfig\n\n const schemaType = preset.schemaType(\n // oxlint-disable-next-line no-unsafe-type-assertion -- factoryConfig is the merged user config (minus `map`, with `name` injected); its shape matches the factory's expected parameter at runtime\n factoryConfig as unknown as Parameters<AnyPresetDefinition['schemaType']>[0],\n registryContext,\n )\n\n registeredSchemas.set(name, schemaType)\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- runtime value is a valid field definition\n return applyMapHooks(\n addTelemetryComponent(schemaType, registryId),\n map,\n ) as SchemaTypeDefinition & FieldDefinition\n }\n}\n\nfunction applyMapHooks(schemaType: SchemaTypeDefinition, map: unknown): SchemaTypeDefinition {\n if (!map || typeof map !== 'object') return schemaType\n\n const mappedSchemaType: Record<string, unknown> = {}\n\n for (const [configName, configValue] of Object.entries(map)) {\n if (typeof configValue !== 'function') {\n continue\n }\n\n mappedSchemaType[configName] = configValue(\n // oxlint-disable-next-line no-unsafe-type-assertion -- map hooks operate on arbitrary schema type properties\n schemaType[configName as keyof typeof schemaType],\n )\n }\n\n return {...schemaType, ...mappedSchemaType}\n}\n\nfunction addTelemetryComponent(\n schemaType: SchemaTypeDefinition,\n registryId: string,\n): SchemaTypeDefinition {\n const existing = 'components' in schemaType ? schemaType.components : undefined\n const existingInput =\n existing && 'input' in existing && typeof existing.input === 'function'\n ? // oxlint-disable-next-line no-unsafe-type-assertion -- presets only produce object/document schema types, whose input components are assignable to ComponentType<InputProps>\n (existing.input as ComponentType<InputProps>)\n : undefined\n // oxlint-disable-next-line no-unsafe-type-assertion -- spreading a discriminated union loses the discriminant; the runtime shape is still a valid SchemaTypeDefinition\n return {\n ...schemaType,\n components: {\n ...existing,\n input: (props: InputProps) => (\n <PresetsTelemetryCollector {...props} registryId={registryId} userInput={existingInput} />\n ),\n },\n } as SchemaTypeDefinition\n}\n\n// Re-export for consumers that previously used these types.\nexport type {PresetDefinition, AnyPresetDefinition}\n"],"names":["PresetsAdded","defineEvent","name","version","description","registries","Map","registerRegistry","id","set","presets","Set","logged","recordPresetUsage","registryId","identifier","get","add","collectPresetsRegistryTelemetry","telemetry","record","size","log","presetNames","PresetsTelemetryCollector","t0","$","_c","userInput","UserInput","props","useTelemetry","t1","t2","useEffect","renderDefault","ctaType","schemaType","config","registry","fields","objectConfig","defineType","type","getPreset","title","defineField","options","layout","list","preview","select","linkType","url","referenceTitle","referenceName","prepare","subtitle","imageType","altText","caption","hotspot","validation","rule","warning","media","internalTypes","referenceTargets","map","initialValue","value","to","hidden","parent","uri","scheme","wrapArrayAsPageBuilderBlock","arraySchema","components","undefined","defineArrayMember","of","toPageBuilderArrayMember","block","lookupArrayPreset","arrayPreset","defineLazyContentField","blocks","cached","group","createPageType","pageBuilderBlocks","groups","documentConfig","ALL_FIELDS_GROUP","default","required","source","resolveObjects","objects","link","image","cta","richTextType","arrayConfig","linkAnnotation","ctaInline","imageMember","blockMember","marks","annotations","seoType","max","info","previews","aspectRatio","Rule","custom","asset","_ref","height","width","getImageDimensions","createPresetsRegistry","uuid","seed","registeredSchemas","pageTypeWithLookup","registered","reduce","preset","key","getPresetKey","createDefiner","charAt","toUpperCase","slice","createRegistryContext","presetConfig","definer","Error","userConfig","length","registryContext","registryDefaults","mergedConfig","factoryConfig","applyMapHooks","addTelemetryComponent","mappedSchemaType","configName","configValue","Object","entries","existing","existingInput","input"],"mappings":";;;;;;;;AAMO,MAAMA,eAAeC,YAA8B;AAAA,EACxDC,MAAM;AAAA,EACNC,SAAS;AAAA,EACTC,aAAa;AACf,CAAC,GCMKC,iCAAiBC,IAAAA;AAEhB,SAASC,iBAAiBC,IAAkB;AACjDH,aAAWI,IAAID,IAAI;AAAA,IAACA;AAAAA,IAAIE,6BAAaC,IAAAA;AAAAA,IAAOC,QAAQ;AAAA,EAAA,CAAM;AAC5D;AAEO,SAASC,kBAAkBC,YAAoBC,YAA0B;AAC9EV,aAAWW,IAAIF,UAAU,GAAGJ,QAAQO,IAAIF,UAAU;AACpD;AAEO,SAASG,gCAAgCJ,YAAoBK,WAA+B;AACjG,QAAMC,SAASf,WAAWW,IAAIF,UAAU;AACpC,GAACM,UAAUA,OAAOR,WACtBQ,OAAOR,SAAS,IACZQ,OAAOV,QAAQW,OAAO,KACxBF,UAAUG,IAAItB,cAAc;AAAA,IAACuB,aAAa,CAAC,GAAGH,OAAOV,OAAO;AAAA,EAAA,CAAE;AAElE;ACbO,MAAMc,4BAAkDC,CAAAA,OAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAC;AAAA,IAAAb;AAAAA,IAAAc,WAAAC;AAAAA,IAAA,GAAAC;AAAAA,EAAAA,IAAAL,IAK9DN,YAAkBY,aAAAA;AAAc,MAAAC,IAAAC;AAMhC,SANgCP,EAAA,CAAA,MAAAZ,cAAAY,SAAAP,aAEtBa,KAAAA,MAAA;AACRd,oCAAgCJ,YAAYK,SAAS;AAAA,EAAC,GACrDc,KAAA,CAACnB,YAAYK,SAAS,GAACO,OAAAZ,YAAAY,OAAAP,WAAAO,OAAAM,IAAAN,OAAAO,OAAAD,KAAAN,EAAA,CAAA,GAAAO,KAAAP,EAAA,CAAA,IAF1BQ,UAAUF,IAEPC,EAAuB,GAEtBJ,gCACM,WAAA,EAAS,GAAKC,OAAK,IAGtBA,MAAKK,cAAeL,KAAK;AAAC;AC/B5B,MAAMM,UAAoD;AAAA,EAC/DlC,MAAM;AAAA,EACNa,YAAY;AAAA,EACZsB,YAAYA,CAACC,QAAQC,aAAa;AAChC,UAAM;AAAA,MAACC;AAAAA,MAAQ,GAAGC;AAAAA,IAAAA,IAAgBH;AAElC,WAAOI,WAAW;AAAA,MAChB,GAAGD;AAAAA,MACHE,MAAM;AAAA,MACNH,QAAQ,CACND,SAASK,UAAU,QAAQ;AAAA,QAAC1C,MAAM;AAAA,QAAQ2C,OAAO;AAAA,MAAA,CAAO,GACxDC,YAAY;AAAA,QACV5C,MAAM;AAAA,QACN2C,OAAO;AAAA,QACPF,MAAM;AAAA,QACNI,SAAS;AAAA,UACPC,QAAQ;AAAA,UACRC,MAAM,CAAC,GAAG,GAAG,CAAC;AAAA,QAAA;AAAA,MAChB,CACD,GACD,GAAIT,UAAU,EAAG;AAAA,MAEnBU,SAAS;AAAA,QACPC,QAAQ;AAAA,UACNC,UAAU;AAAA,UACVC,KAAK;AAAA,UACLC,gBAAgB;AAAA,UAChBC,eAAe;AAAA,QAAA;AAAA,QAEjBC,QAAQ;AAAA,UAACJ,UAAAA;AAAAA,UAAUC;AAAAA,UAAKC;AAAAA,UAAgBC;AAAAA,QAAAA,GAAgB;AAGtD,iBAAO;AAAA,YAACV,OADMO,cAAa,aAAaC,OAAO,WADxBC,kBAAkBC,iBAAiB;AAAA,YAE3CE,UAAU;AAAA,UAAA;AAAA,QAC3B;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EACH;AACF,GC/BaC,YAAmE;AAAA,EAC9ExD,MAAM;AAAA,EACNa,YAAY;AAAA,EACZsB,YAAaC,CAAAA,WAAW;AACtB,UAAM;AAAA,MAACqB,UAAU;AAAA,MAAMC,UAAU;AAAA,MAAMC,UAAU;AAAA,MAAMrB;AAAAA,MAAQ,GAAGC;AAAAA,IAAAA,IAAgBH;AAElF,WAAOI,WAAW;AAAA,MAChB,GAAGD;AAAAA,MACHE,MAAM;AAAA,MACNH,QAAQ,CACNM,YAAY;AAAA,QACV5C,MAAM;AAAA,QACN2C,OAAO;AAAA,QACPF,MAAM;AAAA,QACNI,SAAS;AAAA,UACPc;AAAAA,QAAAA;AAAAA,MACF,CACD,GACD,GAAIF,UACA,CACEb,YAAY;AAAA,QACV5C,MAAM;AAAA,QACN2C,OAAO;AAAA,QACPF,MAAM;AAAA,QACNmB,YAAaC,CAAAA,SAASA,KAAKC,QAAQ,kCAAkC;AAAA,MAAA,CACtE,CAAC,IAEJ,CAAA,GACJ,GAAIJ,UACA,CACEd,YAAY;AAAA,QACV5C,MAAM;AAAA,QACN2C,OAAO;AAAA,QACPF,MAAM;AAAA,MAAA,CACP,CAAC,IAEJ,CAAA,GACJ,GAAIH,UAAU,CAAA,CAAG;AAAA,MAEnBU,SAAS;AAAA,QACPC,QAAQ;AAAA,UACNN,OAAOc,UAAU,YAAYC,UAAU,YAAY;AAAA,UACnDK,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IACF,CACD;AAAA,EACH;AACF,GCjDab,WAAiE;AAAA,EAC5ElD,MAAM;AAAA,EACNa,YAAY;AAAA,EACZsB,YAAYA,CAAC;AAAA,IAAC6B;AAAAA,IAAe1B;AAAAA,IAAQ,GAAGC;AAAAA,EAAAA,MAAkB;AAExD,UAAM0B,oBADwBD,iBAAiB,CAAA,GACAE,IAAKzB,CAAAA,UAAU;AAAA,MAACA;AAAAA,IAAAA,EAAM;AAErE,WAAOD,WAAW;AAAA,MAChB,GAAGD;AAAAA,MACHE,MAAM;AAAA,MACNH,QAAQ,CACNM,YAAY;AAAA,QACV5C,MAAM;AAAA,QACNyC,MAAM;AAAA,QACNE,OAAO;AAAA,QACPwB,cAAc;AAAA,QACdtB,SAAS;AAAA,UACPC,QAAQ;AAAA,UACRC,MAAM,CACJ;AAAA,YAACJ,OAAO;AAAA,YAAYyB,OAAO;AAAA,UAAA,GAC3B;AAAA,YAACzB,OAAO;AAAA,YAAYyB,OAAO;AAAA,UAAA,CAAW;AAAA,QAAA;AAAA,MAE1C,CACD,GACDxB,YAAY;AAAA,QACV5C,MAAM;AAAA,QACNyC,MAAM;AAAA,QACNE,OAAO;AAAA,QACP0B,IAAIJ;AAAAA,QACJK,QAAQA,CAAC;AAAA,UAACC;AAAAA,QAAAA,MAAYA,QAAQrB,aAAa;AAAA,MAAA,CAC5C,GACDN,YAAY;AAAA,QACV5C,MAAM;AAAA,QACNyC,MAAM;AAAA,QACNE,OAAO;AAAA,QACP2B,QAAQA,CAAC;AAAA,UAACC;AAAAA,QAAAA,MAAYA,QAAQrB,aAAa;AAAA,QAC3CU,YAAaC,CAAAA,SACXA,KAAKW,IAAI;AAAA,UACPC,QAAQ,CAAC,QAAQ,SAAS,UAAU,KAAK;AAAA,QAAA,CAC1C;AAAA,MAAA,CACJ,GACD7B,YAAY;AAAA,QACV5C,MAAM;AAAA,QACNyC,MAAM;AAAA,QACNE,OAAO;AAAA,QACPwB,cAAc;AAAA,QACdG,QAAQA,CAAC;AAAA,UAACC;AAAAA,QAAAA,MAAYA,QAAQrB,aAAa;AAAA,MAAA,CAC5C,GACD,GAAIZ,UAAU,EAAG;AAAA,MAEnBU,SAAS;AAAA,QACPC,QAAQ;AAAA,UACNC,UAAU;AAAA,UACVC,KAAK;AAAA,UACLC,gBAAgB;AAAA,UAChBC,eAAe;AAAA,QAAA;AAAA,QAEjBC,QAAQ;AAAA,UAACJ,UAAAA;AAAAA,UAAUC;AAAAA,UAAKC;AAAAA,UAAgBC;AAAAA,QAAAA,GAAgB;AAItD,iBAAO;AAAA,YACLV,OAHYO,cAAa,aAAaC,OAAO,WADxBC,kBAAkBC,iBAAiB;AAAA,YAKxDE,UAAUL,cAAa,aAAa,kBAAkB;AAAA,UAAA;AAAA,QAE1D;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EACH;AACF;AC3DA,SAASwB,4BAA4BC,aAA8B;AACjE,QAAMC,aAAa,gBAAgBD,cAAcA,YAAYC,aAAaC;AAC1E,SAAOC,kBAAkB;AAAA,IACvB9E,MAAM2E,YAAY3E;AAAAA,IAClB2C,OAAOgC,YAAYhC;AAAAA,IACnBF,MAAM;AAAA,IACNH,QAAQ,CACNM,YAAY;AAAA,MACV5C,MAAM;AAAA,MACNyC,MAAM;AAAA,MACNsC,IAAIJ,YAAYI;AAAAA,MAChBH;AAAAA,IAAAA,CACD,CAAC;AAAA,EAAA,CAEL;AACH;AAEA,SAASI,yBAAyBC,OAAyBC,mBAAsC;AAC/F,MAAI,OAAOD,SAAU,UAAU;AAC7B,UAAME,cAAcD,kBAAkBD,KAAK;AAC3C,WAAIE,cACKT,4BAA4BS,WAAW,IAEzCL,kBAAkB;AAAA,MAACrC,MAAMwC;AAAAA,IAAAA,CAAM;AAAA,EACxC;AACA,SAAIA,MAAMxC,SAAS,UAEViC,4BAA4BO,KAAwB,IAEtDH,kBAAkBG,KAAK;AAChC;AAIA,SAASG,uBACPC,QACAH,mBACiB;AACjB,MAAII;AACJ,SAAO1C,YAAY;AAAA,IACjB5C,MAAM;AAAA,IACN2C,OAAO;AAAA,IACP4C,OAAO;AAAA,IACP9C,MAAM;AAAA,IACN,IAAIsC,KAAK;AACPO,aAAAA,WAAWD,OAAOnB,IAAKe,CAAAA,UAAUD,yBAAyBC,OAAOC,iBAAiB,CAAC,GAC5EI;AAAAA,IACT;AAAA,EAAA,CACD;AACH;AAQO,SAASE,eAAe;AAAA,EAACN;AAAyD,GAAG;AAC1F,SAAoD;AAAA,IAClDlF,MAAM;AAAA,IACNa,YAAY;AAAA,IACZsB,YAAYA,CAACC,QAAQC,aAAa;AAChC,YAAM;AAAA,QAACoD;AAAAA,QAAmBC;AAAAA,QAAQpD;AAAAA,QAAQ,GAAGqD;AAAAA,MAAAA,IAAkBvD;AAE/D,aAAOI,WAAW;AAAA,QAChB,GAAGmD;AAAAA,QACHlD,MAAM;AAAA,QACNiD,QAAQ,CACN;AAAA,UACE,GAAGE;AAAAA,UACHtB,QAAQ;AAAA,QAAA,GAEV;AAAA,UACEtE,MAAM;AAAA,UACN2C,OAAO;AAAA,UACPkD,SAAS;AAAA,QAAA,GAEX;AAAA,UACE7F,MAAM;AAAA,UACN2C,OAAO;AAAA,QAAA,GAET,GAAI+C,UAAU,EAAG;AAAA,QAEnBpD,QAAQ,CACNM,YAAY;AAAA,UACV5C,MAAM;AAAA,UACN2C,OAAO;AAAA,UACPF,MAAM;AAAA,UACN8C,OAAO;AAAA,UACP3B,YAAaC,CAAAA,SAASA,KAAKiC,SAAAA;AAAAA,QAAS,CACrC,GACDlD,YAAY;AAAA,UACV5C,MAAM;AAAA,UACN2C,OAAO;AAAA,UACPF,MAAM;AAAA,UACN8C,OAAO;AAAA,UACP1C,SAAS;AAAA,YACPkD,QAAQ;AAAA,UAAA;AAAA,QACV,CACD,GACDX,uBAAuBK,qBAAqB,CAAA,GAAIP,iBAAiB,GACjE7C,SAASK,UAAU,OAAO;AAAA,UACxB1C,MAAM;AAAA,UACN2C,OAAO;AAAA,UACP4C,OAAO;AAAA,QAAA,CACR,GACD,GAAIjD,UAAU,CAAA,CAAG;AAAA,MAAA,CAEpB;AAAA,IACH;AAAA,EAAA;AAEJ;AC1GA,SAAS0D,eAAeC,SAAyE;AAC/F,MAAIA,YAAY,GAAO,QAAO;AAAA,IAACC,MAAM;AAAA,IAAOC,OAAO;AAAA,IAAOC,KAAK;AAAA,EAAA;AAC/D,MAAIH,YAAY,MAAQA,YAAYpB,OAAW,QAAO;AAAA,IAACqB,MAAM;AAAA,IAAMC,OAAO;AAAA,IAAMC,KAAK;AAAA,EAAA;AACrF,QAAM;AAAA,IAACF,OAAO;AAAA,IAAMC,QAAQ;AAAA,IAAMC,MAAM;AAAA,EAAA,IAAQH;AAChD,SAAO;AAAA,IAACC;AAAAA,IAAMC;AAAAA,IAAOC;AAAAA,EAAAA;AACvB;AAEO,MAAMC,eAAmE;AAAA,EAC9ErG,MAAM;AAAA,EACNa,YAAY;AAAA,EACZsB,YAAYA,CAACC,QAAQC,aAAa;AAChC,UAAM;AAAA,MAAC4D;AAAAA,MAAS,GAAGK;AAAAA,IAAAA,IAAelE,QAC5B;AAAA,MAAC8D;AAAAA,MAAMC;AAAAA,MAAOC;AAAAA,IAAAA,IAAOJ,eAAeC,OAAO,GAG3CM,iBAAiBL,OACnB7D,SAASK,UAAU,QAAQ;AAAA,MAAC1C,MAAM;AAAA,MAAQ2C,OAAO;AAAA,IAAA,CAAO,IACxDkC,QACE2B,YAAYJ,MAAM/D,SAASK,UAAU,OAAO;AAAA,MAAC1C,MAAM;AAAA,MAAO2C,OAAO;AAAA,IAAA,CAAM,IAAIkC,QAC3E4B,cAAcN,QAChB9D,SAASK,UAAU,SAAS;AAAA,MAAC1C,MAAM;AAAA,MAAiB2C,OAAO;AAAA,IAAA,CAAQ,IACnEkC,QAEE6B,cAAc5B,kBAAkB;AAAA,MACpCrC,MAAM;AAAA,MACNkE,OAAO;AAAA,QAACC,aAAaL,iBAAiB,CAACA,cAAc,IAAI,CAAA;AAAA,MAAA;AAAA,MACzD,GAAIC,aAAa;AAAA,QAACzB,IAAI,CAACyB,SAAS;AAAA,MAAA;AAAA,IAAC,CAClC;AAED,WAAOhE,WAAW;AAAA,MAChB,GAAG8D;AAAAA,MACH7D,MAAM;AAAA,MACNsC,IAAI0B,cAAc,CAACC,aAAaD,WAAW,IAAI,CAACC,WAAW;AAAA,IAAA,CAC5D;AAAA,EACH;AACF,GCrDaG,UAAyC;AAAA,EACpD7G,MAAM;AAAA,EACNa,YAAY;AAAA,EACZsB,YAAaC,CAAAA,WAAW;AACtB,UAAM;AAAA,MAACE;AAAAA,MAAQ,GAAGC;AAAAA,IAAAA,IAAgBH;AAElC,WAAOI,WAAW;AAAA,MAChB,GAAGD;AAAAA,MACHE,MAAM;AAAA,MACNH,QAAQ,CACNM,YAAY;AAAA,QACV5C,MAAM;AAAA,QACN2C,OAAO;AAAA,QACPF,MAAM;AAAA,QACNmB,YAAaC,CAAAA,SAASA,KAAKiD,IAAI,EAAE,EAAEC,KAAK,yCAAyC;AAAA,MAAA,CAClF,GACDnE,YAAY;AAAA,QACV5C,MAAM;AAAA,QACN2C,OAAO;AAAA,QACPF,MAAM;AAAA,QACNmB,YAAaC,CAAAA,SAASA,KAAKiD,IAAI,GAAG,EAAEC,KAAK,+CAA+C;AAAA,MAAA,CACzF,GACDnE,YAAY;AAAA,QACV5C,MAAM;AAAA,QACN2C,OAAO;AAAA,QACPF,MAAM;AAAA,QACNvC,aAAa;AAAA,QACb2C,SAAS;AAAA,UACPc,SAAS;AAAA,YACPqD,UAAU,CACR;AAAA,cACErE,OAAO;AAAA,cACPsE,aAAa,OAAO;AAAA,YAAA,CACrB;AAAA,UAAA;AAAA,QAEL;AAAA,QAEFrD,YAAasD,CAAAA,SACXA,KAAKC,OAAQ/C,CAAAA,UAAU;AACrB,cAAI,CAACA,OAAOgD,OAAOC;AACjB,mBAAO;AAGT,gBAAM;AAAA,YAACC;AAAAA,YAAQC;AAAAA,UAAAA,IAASC,mBAAmBpD,MAAMgD,OAAOC,IAAI;AAE5D,iBAAIC,WAAW,OAAOC,UAAU,OACvB,sCAGF;AAAA,QACT,CAAC;AAAA,MAAA,CACJ,GACD,GAAIjF,UAAU,CAAA,CAAG;AAAA,IAAA,CAEpB;AAAA,EACH;AACF;ACpBO,SAASmF,sBAAsBrF,SAAgC,IAAqB;AACzF,QAAMxB,aAAa8G,KAAAA;AACnBrH,mBAAiBO,UAAU;AAG3B,QAAM+G,OAAO,CAAA,GAOPC,wCAAwBxH,IAAAA,GACxByH,qBAAqBrC,eAAe;AAAA,IACxCN,mBAAoBlF,CAAAA,SAAS;AAC3B,YAAM8H,aAAaF,kBAAkB9G,IAAId,IAAI;AAE7C,aAAO8H,YAAYrF,SAAS,UAAWqF,aAAiCjD;AAAAA,IAC1E;AAAA,EAAA,CACD;AAWD,SATsB,CACpB3B,UACAhB,SACA2E,SACArD,WACAqE,oBACAxB,YAAY,EAGO0B,OAAO,CAAC1F,UAAU2F,WAAW;AAChD,UAAMC,MAAMC,aAAaF,OAAOhI,IAAI;AACpCqC,WAAAA,SAAS4F,GAAG,IAAIE,cAAc;AAAA,MAACvH;AAAAA,MAAYoH;AAAAA,MAAQ5F;AAAAA,MAAQC;AAAAA,MAAUuF;AAAAA,IAAAA,CAAkB,GAChFvF;AAAAA,EACT,GAAGsF,IAAI;AACT;AAEO,SAASO,aAAalI,MAAsB;AACjD,SAAO,SAASA,KAAKoI,OAAO,CAAC,EAAEC,YAAAA,CAAa,GAAGrI,KAAKsI,MAAM,CAAC,CAAC;AAC9D;AAKA,SAASC,sBAAsB;AAAA,EAAClG;AAAmC,GAAoB;AACrF,SAAO;AAAA,IACLK,WAAWA,CAAC1C,MAAMwI,iBAAiB;AACjC,YAAMP,MAAMC,aAAalI,IAAI,GACvByI,UAAUpG,SAAS4F,GAAG;AAC5B,UAAI,CAACQ;AACH,cAAM,IAAIC,MAAM,0BAA0B1I,IAAI,qCAAqC;AAErF,aAAOyI,QAAQD,YAAY;AAAA,IAC7B;AAAA,EAAA;AAEJ;AAUA,SAASL,cAAc;AAAA,EACrBvH;AAAAA,EACAoH;AAAAA,EACA5F;AAAAA,EACAC;AAAAA,EACAuF;AACoB,GAAY;AAChC,SAAO,SAAgBe,aAAa,IAAI;AACtC,UAAM3I,OAAO2I,WAAW;AACxB,QAAI,OAAO3I,QAAS,YAAYA,KAAK4I,WAAW;AAC9C,YAAM,IAAIF,MACR,GAAGR,aAAaF,OAAOhI,IAAI,CAAC,oDAC9B;AAGFW,sBAAkBC,YAAYoH,OAAOnH,cAAc,SAAS;AAE5D,UAAMgI,kBAAkBN,sBAAsB;AAAA,MAAClG;AAAAA,IAAAA,CAAS,GAGlDyG,mBAAoB1G,OAAmC4F,OAAOhI,IAAI,GAClE+I,eAAwC;AAAA,MAC5C,GAAI,OAAOD,oBAAqB,YAAYA,qBAAqB,OAC7DA,mBACA,CAAA;AAAA,MACJ,GAAGH;AAAAA,IAAAA,GAGC;AAAA,MAACzE;AAAAA,MAAK,GAAG8E;AAAAA,IAAAA,IAAiBD,cAE1B5G,aAAa6F,OAAO7F;AAAAA;AAAAA,MAExB6G;AAAAA,MACAH;AAAAA,IAAAA;AAGFjB,WAAAA,kBAAkBrH,IAAIP,MAAMmC,UAAU,GAG/B8G,cACLC,sBAAsB/G,YAAYvB,UAAU,GAC5CsD,GACF;AAAA,EACF;AACF;AAEA,SAAS+E,cAAc9G,YAAkC+B,KAAoC;AAC3F,MAAI,CAACA,OAAO,OAAOA,OAAQ,SAAU,QAAO/B;AAE5C,QAAMgH,mBAA4C,CAAA;AAElD,aAAW,CAACC,YAAYC,WAAW,KAAKC,OAAOC,QAAQrF,GAAG;AACpD,WAAOmF,eAAgB,eAI3BF,iBAAiBC,UAAU,IAAIC;AAAAA;AAAAA,MAE7BlH,WAAWiH,UAAU;AAAA,IAAA;AAIzB,SAAO;AAAA,IAAC,GAAGjH;AAAAA,IAAY,GAAGgH;AAAAA,EAAAA;AAC5B;AAEA,SAASD,sBACP/G,YACAvB,YACsB;AACtB,QAAM4I,WAAW,gBAAgBrH,aAAaA,WAAWyC,aAAaC,QAChE4E,gBACJD,YAAY,WAAWA,YAAY,OAAOA,SAASE,SAAU;AAAA;AAAA,IAExDF,SAASE;AAAAA,MACV7E;AAEN,SAAO;AAAA,IACL,GAAG1C;AAAAA,IACHyC,YAAY;AAAA,MACV,GAAG4E;AAAAA,MACHE,OAAQ9H,WACN,oBAAC,2BAAA,EAA0B,GAAIA,OAAO,YAAwB,WAAW6H,cAAAA,CAAc;AAAA,IAAA;AAAA,EAE3F;AAEJ;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/presets",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Production ready preset patterns for Sanity Studio",
5
5
  "keywords": [
6
6
  "sanity",
@@ -35,7 +35,7 @@
35
35
  "@sanity/pkg-utils": "^10.4.18",
36
36
  "@testing-library/jest-dom": "^6.9.1",
37
37
  "@testing-library/react": "^16.3.2",
38
- "@types/node": "^24.12.2",
38
+ "@types/node": "^24.12.4",
39
39
  "@types/react": "^19.2.14",
40
40
  "@types/react-dom": "^19.2.3",
41
41
  "jsdom": "^29.0.1",