sanity-plugin-seofields 1.5.2 β†’ 1.5.4

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/dist/index.js CHANGED
@@ -758,6 +758,70 @@ function seoFieldsSchema(config = {}) {
758
758
  ]
759
759
  });
760
760
  }
761
+ function baseMeta(config = {}) {
762
+ return defineType({
763
+ name: "baseMeta",
764
+ title: "Basic Meta Settings",
765
+ type: "object",
766
+ fields: [
767
+ defineField(__spreadProps(__spreadValues({
768
+ name: "title"
769
+ }, getFieldInfo("title", config.fieldOverrides)), {
770
+ type: "string",
771
+ components: {
772
+ input: MetaTitle_default
773
+ },
774
+ hidden: getFieldHiddenFunction("title", config)
775
+ })),
776
+ defineField(__spreadProps(__spreadValues({
777
+ name: "description"
778
+ }, getFieldInfo("description", config.fieldOverrides)), {
779
+ type: "text",
780
+ rows: 3,
781
+ components: {
782
+ input: MetaDescription_default
783
+ },
784
+ hidden: getFieldHiddenFunction("description", config)
785
+ })),
786
+ defineField(__spreadProps(__spreadValues({
787
+ name: "metaImage"
788
+ }, getFieldInfo("metaImage", config.fieldOverrides)), {
789
+ type: "image",
790
+ options: {
791
+ hotspot: true
792
+ },
793
+ components: {
794
+ input: MetaImage_default
795
+ },
796
+ hidden: getFieldHiddenFunction("metaImage", config)
797
+ })),
798
+ defineField(__spreadProps(__spreadValues({
799
+ name: "keywords"
800
+ }, getFieldInfo("keywords", config.fieldOverrides)), {
801
+ title: "Keywords",
802
+ type: "array",
803
+ of: [{ type: "string" }],
804
+ description: "Add relevant keywords for this page. These keywords will be used for SEO purposes.",
805
+ hidden: getFieldHiddenFunction("keywords", config)
806
+ })),
807
+ defineField(__spreadProps(__spreadValues({
808
+ name: "canonicalUrl"
809
+ }, getFieldInfo("canonicalUrl", config.fieldOverrides)), {
810
+ title: "Canonical URL",
811
+ type: "url",
812
+ description: "Specify the canonical URL for this page. This helps prevent duplicate content issues by indicating the preferred version of a page.",
813
+ hidden: getFieldHiddenFunction("canonicalUrl", config)
814
+ })),
815
+ defineField(__spreadProps(__spreadValues({
816
+ name: "metaAttributes"
817
+ }, getFieldInfo("metaAttributes", config.fieldOverrides)), {
818
+ type: "array",
819
+ of: [{ type: "metaAttribute" }],
820
+ hidden: getFieldHiddenFunction("metaAttributes", config)
821
+ }))
822
+ ]
823
+ });
824
+ }
761
825
  var metaAttribute_default = defineType({
762
826
  name: "metaAttribute",
763
827
  title: "Meta Attribute",
@@ -858,6 +922,8 @@ function types(config = {}) {
858
922
  return [
859
923
  seoFieldsSchema(config),
860
924
  // pass config here
925
+ baseMeta(config),
926
+ // pass config here
861
927
  openGraph(config),
862
928
  // pass config here
863
929
  twitter(config),
@@ -1053,6 +1119,6 @@ function createSeoHealthPane(optionsOrS, optionsWhenS) {
1053
1119
  // src/index.ts
1054
1120
  var src_default = plugin_default;
1055
1121
 
1056
- export { types as allSchemas, createSeoHealthPane, src_default as default, metaAttribute_default as metaAttributeSchema, metaTag_default as metaTagSchema, openGraph as openGraphSchema, robots_default as robotsSchema, seoFieldsSchema, twitter as twitterSchema };
1122
+ export { types as allSchemas, baseMeta as baseMetaSchema, createSeoHealthPane, src_default as default, metaAttribute_default as metaAttributeSchema, metaTag_default as metaTagSchema, openGraph as openGraphSchema, robots_default as robotsSchema, seoFieldsSchema, twitter as twitterSchema };
1057
1123
  //# sourceMappingURL=index.js.map
1058
1124
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/meta/MetaDescription.tsx","../src/components/meta/MetaImage.tsx","../src/components/meta/MetaTitle.tsx","../src/utils/fieldsUtils.ts","../src/utils/utils.ts","../src/components/openGraph/OgDescription.tsx","../src/components/openGraph/OgImage.tsx","../src/components/openGraph/OgImageUrl.tsx","../src/components/openGraph/OgTitle.tsx","../src/schemas/types/openGraph/index.ts","../src/components/twitter/twitterDescription.tsx","../src/components/twitter/TwitterImage.tsx","../src/components/twitter/TwitterImageUrl.tsx","../src/components/twitter/twitterTitle.tsx","../src/schemas/types/twitter/index.ts","../src/schemas/index.ts","../src/schemas/types/metaAttribute/index.ts","../src/schemas/types/metaTag/index.ts","../src/schemas/types/robots/index.ts","../src/schemas/types/index.ts","../src/plugin.ts","../src/components/SeoHealthPane.tsx","../src/index.ts"],"names":["useFormValue","useMemo","jsxs","Stack","jsx","Text","defineType","defineField","React","_a"],"mappings":"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","file":"index.js","sourcesContent":["import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getMetaDescriptionValidationMessages} from '../../utils/seoUtils'\n\nconst MetaDescription = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getMetaDescriptionValidationMessages(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{width: 10, height: 10, borderRadius: '50%', backgroundColor: item.color}}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default MetaDescription\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {ObjectInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getMetaImageValidation} from '../../utils/seoUtils'\n\nconst MetaImage = (props: ObjectInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n const hasImage = !!(value as Record<string, unknown> | undefined)?.asset\n\n const feedbackItems = useMemo(\n () => getMetaImageValidation(hasImage, seoParent),\n [hasImage, seoParent],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default MetaImage\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getMetaTitleValidationMessages} from '../../utils/seoUtils'\n\nconst MetaTitle = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getMetaTitleValidationMessages(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default MetaTitle\n","import {AllFieldKeys, SeoFieldsPluginConfig, ValidHiddenFieldKeys} from '../plugin'\n\nconst DEFAULT_FIELD_INFO: Record<AllFieldKeys, {title: string; description: string}> = {\n title: {\n title: 'Meta Title',\n description:\n 'The meta title is displayed in search engine results as the clickable headline for a given result. It should be concise and accurately reflect the content of the page.',\n },\n description: {\n title: 'Meta Description',\n description:\n 'Provide a concise summary of the page content. This description may be used by search engines in search results.',\n },\n metaImage: {\n title: 'Meta Image',\n description:\n 'Upload an image that represents the content of the page. This image may be used in social media previews and search engine results.',\n },\n keywords: {\n title: 'Keywords',\n description:\n 'Add relevant keywords for this page. These keywords will be used for SEO purposes.',\n },\n canonicalUrl: {\n title: 'Canonical URL',\n description:\n 'Specify the canonical URL for this page. This helps prevent duplicate content issues by indicating the preferred version of a page.',\n },\n robots: {\n title: 'Robots Settings',\n description: 'Configure how search engine crawlers should index and follow links on this page.',\n },\n metaAttributes: {\n title: 'Additional Meta Attributes',\n description:\n 'Add custom meta attributes to the head of the document for additional SEO and social media integration.',\n },\n openGraphTitle: {\n title: 'Open Graph Title',\n description: '',\n },\n openGraphUrl: {\n title: 'Open Graph URL',\n description:\n 'The canonical URL of the page. This should be the full URL including protocol (https://).',\n },\n openGraphDescription: {\n title: 'Open Graph Description',\n description: '',\n },\n openGraphSiteName: {\n title: 'Open Graph Site Name',\n description: 'The name of your website. This is often the site title.',\n },\n openGraphType: {\n title: 'Open Graph Type',\n description: 'Select the type of content for Open Graph.',\n },\n openGraphImageType: {\n title: 'Image Type',\n description: 'Choose whether to upload an image or provide an image URL for Open Graph.',\n },\n openGraphImage: {\n title: 'Open Graph Image',\n description:\n 'Recommended size: 1200x630px (minimum 600x315px). Max file size: 5MB. Aspect ratio 1.91:1.',\n },\n openGraphImageUrl: {\n title: 'Open Graph Image URL',\n description:\n 'Enter the full URL of the image. Ensure the image is accessible and meets the recommended size of 1200x630px (minimum 600x315px).',\n },\n twitterCard: {\n title: 'X Card Type',\n description: '',\n },\n twitterSite: {\n title: 'Site X Handle',\n description: 'The X (formerly Twitter) handle of the website (e.g., @example)',\n },\n twitterCreator: {\n title: 'X Creator Handle',\n description: 'The X (formerly Twitter) handle of the content creator (e.g., @creator)',\n },\n twitterTitle: {\n title: 'X Title',\n description: 'The title of the content as it should appear on X (formerly Twitter).',\n },\n twitterDescription: {\n title: 'X Description',\n description: 'A brief description of the content for X (formerly Twitter).',\n },\n twitterImageType: {\n title: 'X Image Type',\n description:\n 'Choose whether to upload an image or provide an image URL for X (formerly Twitter).',\n },\n twitterImage: {\n title: 'X Image',\n description:\n 'An image URL which should be at least 120x120px for \"summary\" card and 280x150px for \"summary_large_image\" card.',\n },\n twitterImageUrl: {\n title: 'X Image URL',\n description:\n 'Enter the full URL of the image for X (formerly Twitter). Ensure the image is accessible and meets the recommended size.',\n },\n}\n\nexport const getFieldInfo = (\n fieldName: string,\n fieldOverrides: SeoFieldsPluginConfig['fieldOverrides'],\n): {title: string; description: string} => {\n const fieldInfo =\n (fieldOverrides && fieldOverrides[fieldName as keyof typeof fieldOverrides]) ||\n DEFAULT_FIELD_INFO[fieldName as keyof typeof DEFAULT_FIELD_INFO]\n return fieldInfo\n ? {title: fieldInfo.title || '', description: fieldInfo.description || ''}\n : {title: '', description: ''}\n}\n\n/**\n * Check if a field should be hidden based on the current document type\n */\nexport const isFieldHidden = (\n fieldName: ValidHiddenFieldKeys,\n config: SeoFieldsPluginConfig,\n documentType?: string,\n): boolean => {\n // Check if field is in default hidden fields\n if (config.defaultHiddenFields?.includes(fieldName)) {\n return true\n }\n\n // Check if field is hidden for specific post type\n if (documentType && config.fieldVisibility?.[documentType]?.hiddenFields?.includes(fieldName)) {\n return true\n }\n\n return false\n}\n\n/**\n * Get the hidden function for any field\n */\nexport const getFieldHiddenFunction = (\n fieldName: ValidHiddenFieldKeys,\n config: SeoFieldsPluginConfig,\n) => {\n return ({\n document,\n }: {\n document?: {\n _type?: string\n }\n }): boolean => {\n const documentType = document?._type\n return isFieldHidden(fieldName, config, documentType)\n }\n}\n","export const isEmpty = (value: unknown): boolean => {\n return (\n value === null ||\n value === undefined ||\n (typeof value === 'string' && value.trim() === '') ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0)\n )\n}\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getOgDescriptionValidation} from '../../utils/seoUtils'\n\nconst OgDescription = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n // Access parent object to get keywords\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getOgDescriptionValidation(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n {/* Validation */}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default OgDescription\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {ObjectInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getOgImageValidation} from '../../utils/seoUtils'\n\nconst OgImage = (props: ObjectInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n const imgValue = value as Record<string, unknown> | undefined\n const hasImage = !!imgValue?.asset\n const altText = imgValue?.alt as string | undefined\n\n const feedbackItems = useMemo(\n () => getOgImageValidation(hasImage, altText, seoParent),\n [hasImage, altText, seoParent],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default OgImage\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getOgImageUrlValidation} from '../../utils/seoUtils'\n\nconst OgImageUrl = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n\n const feedbackItems = useMemo(() => getOgImageUrlValidation(value, seoParent), [value, seoParent])\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default OgImageUrl\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getOgTitleValidation} from '../../utils/seoUtils'\n\nconst OgTitle: React.FC<StringInputProps> = (props) => {\n const {value, renderDefault, path} = props\n\n // Access parent object to get keywords\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getOgTitleValidation(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default OgTitle\n","import {defineField, defineType, SchemaTypeDefinition} from 'sanity'\n\nimport OgDescription from '../../../components/openGraph/OgDescription'\nimport OgImage from '../../../components/openGraph/OgImage'\nimport OgImageUrl from '../../../components/openGraph/OgImageUrl'\nimport OgTitle from '../../../components/openGraph/OgTitle'\nimport {SeoFieldsPluginConfig} from '../../../plugin'\nimport {getFieldHiddenFunction, getFieldInfo} from '../../../utils/fieldsUtils'\n\nexport default function openGraph(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition {\n return defineType({\n name: 'openGraph',\n title: 'Open Graph Settings',\n type: 'object',\n fields: [\n defineField({\n name: 'url',\n type: 'url',\n ...getFieldInfo('openGraphUrl', config.fieldOverrides),\n hidden: getFieldHiddenFunction('openGraphUrl', config),\n description:\n 'The canonical URL of the page. This should be the full URL including protocol (https://).',\n }),\n defineField({\n name: 'title',\n ...getFieldInfo('openGraphTitle', config.fieldOverrides),\n type: 'string',\n hidden: getFieldHiddenFunction('openGraphTitle', config),\n components: {\n input: OgTitle, // Can also wrap with a string input + preview\n },\n }),\n defineField({\n name: 'description',\n ...getFieldInfo('openGraphDescription', config.fieldOverrides),\n type: 'text',\n rows: 3,\n hidden: getFieldHiddenFunction('openGraphDescription', config),\n components: {\n input: OgDescription, // Can also wrap with a text area + preview\n },\n }),\n defineField({\n name: 'siteName',\n ...getFieldInfo('openGraphSiteName', config.fieldOverrides),\n type: 'string',\n hidden: getFieldHiddenFunction('openGraphSiteName', config),\n }),\n defineField({\n name: 'type',\n ...getFieldInfo('openGraphType', config.fieldOverrides),\n type: 'string',\n options: {\n list: [\n {title: 'Website', value: 'website'},\n {title: 'Article', value: 'article'},\n {title: 'Profile', value: 'profile'},\n {title: 'Book', value: 'book'},\n {title: 'Music', value: 'music'},\n {title: 'Video', value: 'video'},\n {title: 'Product', value: 'product'},\n ],\n // layout: 'radio', // Display as radio buttons\n },\n hidden: getFieldHiddenFunction('openGraphType', config),\n initialValue: 'website',\n }),\n defineField({\n name: 'imageType',\n ...getFieldInfo('openGraphImageType', config.fieldOverrides),\n type: 'string',\n options: {\n list: [\n {title: 'Upload Image', value: 'upload'},\n {title: 'Image URL', value: 'url'},\n ],\n },\n hidden: getFieldHiddenFunction('openGraphImage', config),\n initialValue: 'upload',\n }),\n defineField({\n name: 'image',\n ...getFieldInfo('openGraphImage', config.fieldOverrides),\n type: 'image',\n options: {\n hotspot: true,\n },\n components: {\n input: OgImage,\n },\n fields: [\n defineField({\n name: 'alt',\n title: 'Image Alt Text',\n type: 'string',\n description: 'A description of the image for accessibility purposes.',\n }),\n ],\n hidden: (context) => {\n const {parent} = context\n if (parent?.imageType !== 'upload') return true\n const hiddenFn = getFieldHiddenFunction('openGraphImage', config)\n return typeof hiddenFn === 'function' ? hiddenFn(context) : hiddenFn\n },\n }),\n defineField({\n name: 'imageUrl',\n ...getFieldInfo('openGraphImageUrl', config.fieldOverrides),\n type: 'url',\n components: {\n input: OgImageUrl,\n },\n hidden: (context) => {\n const {parent} = context\n if (parent?.imageType !== 'url') return true\n const hiddenFn = getFieldHiddenFunction('openGraphImage', config)\n return typeof hiddenFn === 'function' ? hiddenFn(context) : hiddenFn\n },\n }),\n ],\n })\n}\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getTwitterDescriptionValidation} from '../../utils/seoUtils'\n\nconst TwitterDescription = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n // Access parent object to get keywords\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getTwitterDescriptionValidation(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default TwitterDescription\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {ObjectInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getTwitterImageValidation} from '../../utils/seoUtils'\n\nconst TwitterImage = (props: ObjectInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n const imgValue = value as Record<string, unknown> | undefined\n const hasImage = !!imgValue?.asset\n const altText = imgValue?.alt as string | undefined\n\n const feedbackItems = useMemo(\n () => getTwitterImageValidation(hasImage, altText, seoParent),\n [hasImage, altText, seoParent],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default TwitterImage\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getTwitterImageUrlValidation} from '../../utils/seoUtils'\n\nconst TwitterImageUrl = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n\n const feedbackItems = useMemo(\n () => getTwitterImageUrlValidation(value, seoParent),\n [value, seoParent],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default TwitterImageUrl\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getTwitterTitleValidation} from '../../utils/seoUtils'\n\nconst TwitterTitle = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n // Access parent object to get keywords\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getTwitterTitleValidation(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default TwitterTitle\n","import {defineField, defineType, SchemaTypeDefinition} from 'sanity'\n\nimport TwitterDescription from '../../../components/twitter/twitterDescription'\nimport TwitterImage from '../../../components/twitter/TwitterImage'\nimport TwitterImageUrl from '../../../components/twitter/TwitterImageUrl'\nimport TwitterTitle from '../../../components/twitter/twitterTitle'\nimport {SeoFieldsPluginConfig} from '../../../plugin'\nimport {getFieldHiddenFunction, getFieldInfo} from '../../../utils/fieldsUtils'\n\nexport default function twitter(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition {\n return defineType({\n name: 'twitter',\n title: 'X (Formerly Twitter)',\n type: 'object',\n fields: [\n defineField({\n name: 'card',\n ...getFieldInfo('twitterCard', config.fieldOverrides),\n type: 'string',\n options: {\n list: [\n {title: 'Summary', value: 'summary'},\n {title: 'Summary with Large Image', value: 'summary_large_image'},\n {title: 'App', value: 'app'},\n {title: 'Player', value: 'player'},\n ],\n },\n hidden: getFieldHiddenFunction('twitterCard', config),\n initialValue: 'summary_large_image', // good default\n }),\n defineField({\n name: 'site',\n ...getFieldInfo('twitterSite', config.fieldOverrides),\n type: 'string',\n hidden: getFieldHiddenFunction('twitterSite', config),\n }),\n defineField({\n name: 'creator',\n type: 'string',\n ...getFieldInfo('twitterCreator', config.fieldOverrides),\n hidden: getFieldHiddenFunction('twitterCreator', config),\n }),\n defineField({\n name: 'title',\n type: 'string',\n ...getFieldInfo('twitterTitle', config.fieldOverrides),\n hidden: getFieldHiddenFunction('twitterTitle', config),\n components: {\n input: TwitterTitle,\n },\n }),\n defineField({\n name: 'description',\n type: 'text',\n rows: 3,\n ...getFieldInfo('twitterDescription', config.fieldOverrides),\n hidden: getFieldHiddenFunction('twitterDescription', config),\n components: {\n input: TwitterDescription,\n },\n }),\n defineField({\n name: 'imageType',\n ...getFieldInfo('twitterImageType', config.fieldOverrides),\n type: 'string',\n options: {\n list: [\n {title: 'Upload Image', value: 'upload'},\n {title: 'Image URL', value: 'url'},\n ],\n },\n hidden: getFieldHiddenFunction('twitterImage', config),\n initialValue: 'upload',\n }),\n defineField({\n name: 'image',\n ...getFieldInfo('twitterImage', config.fieldOverrides),\n type: 'image',\n options: {\n hotspot: true,\n },\n components: {\n input: TwitterImage,\n },\n fields: [\n defineField({\n name: 'alt',\n title: 'Image Alt Text',\n type: 'string',\n description: 'A description of the image for accessibility purposes.',\n }),\n ],\n hidden: (context) => {\n const {parent} = context\n if (parent?.imageType !== 'upload') return true\n const hiddenFn = getFieldHiddenFunction('twitterImage', config)\n return typeof hiddenFn === 'function' ? hiddenFn(context) : hiddenFn\n },\n }),\n defineField({\n name: 'imageUrl',\n ...getFieldInfo('twitterImageUrl', config.fieldOverrides),\n type: 'url',\n components: {\n input: TwitterImageUrl,\n },\n hidden: (context) => {\n const {parent} = context\n if (parent?.imageType !== 'url') return true\n const hiddenFn = getFieldHiddenFunction('twitterImage', config)\n return typeof hiddenFn === 'function' ? hiddenFn(context) : hiddenFn\n },\n }),\n ],\n })\n}\n","import React from 'react'\nimport {\n defineField,\n defineType,\n FieldDefinition,\n SchemaTypeDefinition,\n StringInputProps,\n} from 'sanity'\n\nimport MetaDescription from '../components/meta/MetaDescription'\nimport MetaImage from '../components/meta/MetaImage'\nimport MetaTitle from '../components/meta/MetaTitle'\nimport {SeoFieldsPluginConfig} from '../plugin'\nimport {getFieldHiddenFunction, getFieldInfo} from '../utils/fieldsUtils'\nimport {isEmpty} from '../utils/utils'\nimport openGraph from './types/openGraph'\nimport twitter from './types/twitter'\n\n// Lazy-load SeoPreview to avoid styled-components breaking `sanity schema extract`\nconst LazySeoPreview = React.lazy(() => import('../components/SeoPreview'))\nconst SeoPreviewWrapper = (props: StringInputProps) =>\n React.createElement(React.Suspense, {fallback: null}, React.createElement(LazySeoPreview, props))\n\nexport default function seoFieldsSchema(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition {\n return defineType({\n name: 'seoFields',\n title: 'SEO Fields',\n type: 'object',\n fields: [\n defineField({\n name: 'robots',\n title: 'Robots Settings',\n type: 'robots', // Use the separate robots type here\n hidden: getFieldHiddenFunction('robots', config),\n }),\n // πŸ‘‡ conditionally spread preview field\n ...((typeof config.seoPreview === 'boolean' && config.seoPreview) ||\n (typeof config.seoPreview === 'object' && !isEmpty(config.seoPreview))\n ? [\n defineField({\n name: 'preview',\n title: 'SEO Preview',\n type: 'string',\n components: {input: SeoPreviewWrapper},\n options: {\n baseUrl: config.baseUrl || 'https://www.example.com',\n ...(typeof config.seoPreview === 'object' &&\n config.seoPreview &&\n config.seoPreview.prefix\n ? {prefix: config.seoPreview.prefix}\n : {}),\n } as Record<string, unknown>,\n // Use a readOnly field to prevent editing\n // This field is just for preview purposes\n initialValue: '' as string, // Set an initial value\n readOnly: true,\n }),\n ]\n : []),\n\n defineField({\n name: 'title',\n ...getFieldInfo('title', config.fieldOverrides),\n // title: 'Meta Title',\n type: 'string',\n // description:\n // 'The meta title is displayed in search engine results as the clickable headline for a given result. It should be concise and accurately reflect the content of the page.',\n components: {\n input: MetaTitle,\n },\n // validation: (Rule) => Rule.max(60).warning('Meta title should be under 60 characters.'),\n hidden: getFieldHiddenFunction('title', config),\n }),\n defineField({\n name: 'description',\n ...getFieldInfo('description', config.fieldOverrides),\n // title: 'Meta Description',\n // description:\n // 'Provide a concise summary of the page content. This description may be used by search engines in search results.',\n type: 'text',\n rows: 3,\n components: {\n input: MetaDescription,\n },\n // validation: (Rule) => Rule.max(160).warning('Meta description should be under 160 characters.'),\n hidden: getFieldHiddenFunction('description', config),\n }),\n defineField({\n name: 'metaImage',\n ...getFieldInfo('metaImage', config.fieldOverrides),\n // title: 'Meta Image',\n // description:\n // 'Upload an image that represents the content of the page. This image may be used in social media previews and search engine results.',\n type: 'image',\n options: {\n hotspot: true,\n },\n components: {\n input: MetaImage,\n },\n hidden: getFieldHiddenFunction('metaImage', config),\n }),\n defineField({\n name: 'metaAttributes',\n // title: 'Additional Meta Attributes',\n ...getFieldInfo('metaAttributes', config.fieldOverrides),\n type: 'array',\n of: [{type: 'metaAttribute'}],\n // description:\n // 'Add custom meta attributes to the head of the document for additional SEO and social media integration.',\n hidden: getFieldHiddenFunction('metaAttributes', config),\n }),\n defineField({\n name: 'keywords',\n ...getFieldInfo('keywords', config.fieldOverrides),\n title: 'Keywords',\n type: 'array',\n of: [{type: 'string'}],\n description:\n 'Add relevant keywords for this page. These keywords will be used for SEO purposes.',\n hidden: getFieldHiddenFunction('keywords', config),\n }),\n defineField({\n name: 'canonicalUrl',\n ...getFieldInfo('canonicalUrl', config.fieldOverrides),\n title: 'Canonical URL',\n type: 'url',\n description:\n 'Specify the canonical URL for this page. This helps prevent duplicate content issues by indicating the preferred version of a page.',\n hidden: getFieldHiddenFunction('canonicalUrl', config),\n }),\n openGraph(config) as unknown as FieldDefinition,\n twitter(config) as unknown as FieldDefinition,\n ],\n })\n}\n","import {defineField, defineType} from 'sanity'\n\nexport default defineType({\n name: 'metaAttribute',\n title: 'Meta Attribute',\n type: 'object',\n fields: [\n defineField({\n name: 'key',\n title: 'Attribute Name',\n type: 'string',\n }),\n defineField({\n name: 'type',\n title: 'Attribute Value Type',\n type: 'string',\n options: {\n list: [\n {title: 'String', value: 'string'},\n {title: 'Image', value: 'image'},\n ],\n },\n initialValue: 'string',\n }),\n defineField({\n name: 'value',\n title: 'Attribute Value',\n type: 'string',\n hidden: ({parent}) => parent?.type === 'image',\n }),\n defineField({\n name: 'image',\n title: 'Attribute Image Value',\n type: 'image',\n hidden: ({parent}) => parent?.type === 'string',\n }),\n ],\n preview: {\n select: {\n attributeName: 'key',\n attributeValueString: 'value',\n attributeValueImage: 'image',\n },\n prepare({attributeName, attributeValueString, attributeValueImage}) {\n let subtitle = ''\n if (attributeValueString) {\n subtitle = `Value: ${attributeValueString}`\n } else if (attributeValueImage) {\n subtitle = 'Value: [Image]'\n } else {\n subtitle = 'No Attribute Value'\n }\n return {\n title: attributeName || 'No Attribute Name',\n subtitle: subtitle,\n media: attributeValueImage,\n }\n },\n },\n})\n","import {defineType} from 'sanity'\n\nexport default defineType({\n name: 'metaTag',\n title: 'Meta Tag',\n type: 'object',\n fields: [\n {\n name: 'metaAttributes',\n title: 'Meta Attributes',\n type: 'array',\n of: [{type: 'metaAttribute'}],\n description:\n 'Add custom meta attributes to the head of the document for additional SEO and social media integration.',\n },\n ],\n})\n","import {defineField, defineType} from 'sanity'\n\nexport default defineType({\n name: 'robots',\n title: 'Robots Settings',\n type: 'object',\n fields: [\n defineField({\n name: 'noIndex',\n title: 'No Index',\n type: 'boolean',\n initialValue: false,\n description:\n 'Enable this to prevent search engines from indexing this page. The page will not appear in search results.',\n }),\n defineField({\n name: 'noFollow',\n title: 'No Follow',\n type: 'boolean',\n initialValue: false,\n description:\n 'Enable this to prevent search engines from following links on this page. Links will not pass SEO value.',\n }),\n ],\n description: 'Select how search engines should index and follow links on this page.',\n})\n","import {SchemaTypeDefinition} from 'sanity'\n\nimport {SeoFieldsPluginConfig} from '../../plugin'\nimport seoFields from '..'\nimport metaAttribute from './metaAttribute'\nimport metaTag from './metaTag'\nimport openGraph from './openGraph'\nimport robots from './robots'\nimport twitter from './twitter'\n\nexport default function types(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition[] {\n return [\n seoFields(config), // pass config here\n openGraph(config), // pass config here\n twitter(config), // pass config here\n metaAttribute as SchemaTypeDefinition,\n metaTag,\n robots,\n ]\n}\n","// plugin.ts\nimport React from 'react'\nimport {definePlugin} from 'sanity'\n\nimport types from './schemas/types'\nimport type {DeprecationWarning, DocumentWithSeoHealth} from './types'\n\nexport interface SeoFieldConfig {\n title?: string\n description?: string\n}\n\nexport type SeoFieldKeys =\n | 'title'\n | 'description'\n | 'canonicalUrl'\n | 'metaImage'\n | 'keywords'\n | 'metaAttributes'\n | 'robots'\n\nexport type openGraphFieldKeys =\n | 'openGraphUrl'\n | 'openGraphTitle'\n | 'openGraphDescription'\n | 'openGraphSiteName'\n | 'openGraphType'\n | 'openGraphImageType'\n | 'openGraphImage'\n | 'openGraphImageUrl'\n\nexport type twitterFieldKeys =\n | 'twitterCard'\n | 'twitterSite'\n | 'twitterCreator'\n | 'twitterTitle'\n | 'twitterDescription'\n | 'twitterImageType'\n | 'twitterImage'\n | 'twitterImageUrl'\n\nexport type AllFieldKeys = SeoFieldKeys | openGraphFieldKeys | twitterFieldKeys\n\nexport type ValidHiddenFieldKeys = Exclude<\n AllFieldKeys,\n 'openGraphImageUrl' | 'twitterImageUrl' | 'openGraphImageType' | 'twitterImageType'\n>\n\nexport interface FieldVisibilityConfig {\n hiddenFields?: ValidHiddenFieldKeys[]\n}\n\nexport interface SeoFieldsPluginConfig {\n /**\n * Enable or configure the SEO preview feature.\n * If set to `true`, the SEO preview will be enabled with default settings.\n * If set to an object, you can provide a custom prefix function to modify the URL prefix in the preview.\n * The prefix function receives the current document as an argument and should return a string.\n * Example:\n * ```\n * seoPreview: {\n * prefix: (doc) => `/${doc.slug?.current || 'untitled'}`\n * }\n * ```\n */\n seoPreview?:\n | boolean\n | {\n prefix?: (doc: {_type?: string} & Record<string, unknown>) => string\n }\n\n /**\n * A mapping of field keys to their configuration settings.\n * This allows customization of field titles and descriptions.\n * For example, to change the title of the 'title' field:\n */\n fieldOverrides?: Partial<Record<AllFieldKeys, SeoFieldConfig>>\n /**\n * A mapping of document types to field visibility configurations.\n * This allows you to specify which fields should be hidden for specific document types.\n */\n fieldVisibility?: Record<string, FieldVisibilityConfig>\n\n /**\n * A list of fields that should be hidden by default in all document types.\n * This can be overridden by specific document type settings in `fieldVisibility`.\n */\n defaultHiddenFields?: ValidHiddenFieldKeys[]\n /**\n * The base URL of your website, used for generating full URLs in the SEO preview.\n * Defaults to 'https://www.example.com' if not provided.\n */\n baseUrl?: string\n /**\n * Enable or configure the SEO Health Dashboard tool.\n * If set to `true`, the dashboard is enabled with all defaults.\n * If set to an object, you can customise the tool and dashboard settings.\n * Defaults to `true`.\n * Example:\n * ```\n * healthDashboard: {\n * toolTitle: 'SEO Overview', // Studio nav tab label\n * content: {\n * icon: 'πŸ”', // Emoji icon shown before the page heading\n * title: 'My SEO Dashboard',// Page heading inside the tool (no emoji)\n * description: 'Track SEO across all documents', // Subtitle under the heading\n * },\n * display: {\n * typeColumn: false, // Hide the document type column (default: true)\n * documentId: false, // Hide the document ID under titles (default: true)\n * },\n * query: {\n * // Option 1 – filter by specific document types\n * types: ['post', 'page'],\n * // Option 2 – provide a full custom GROQ query (takes precedence over `types`)\n * // Must return documents with at least: _id, _type, title, seo, _updatedAt\n * groq: `*[seo != null && defined(slug.current)]{ _id, _type, title, slug, seo, _updatedAt }`,\n * },\n * }\n * ```\n */\n healthDashboard?:\n | boolean\n | {\n tool?: {\n title?: string\n name?: string\n }\n toolTitle?: string\n content?: {\n icon?: string\n title?: string\n description?: string\n /** Text shown while the license key is being verified. Defaults to \"Verifying license…\" */\n loadingLicense?: string\n /** Text shown while documents are being fetched. Defaults to \"Loading documents…\" */\n loadingDocuments?: string\n /** Text shown when the query returns zero results. Defaults to \"No documents found\" */\n noDocuments?: string\n }\n /**\n * @deprecated Use `showTypeColumn` instead. Will be removed in a future major version.\n * @see https://github.com/hardik-143/sanity-plugin-seofields/blob/main/CHANGELOG.md#132--2026-03-23\n */\n display?: {\n /** @deprecated Use top-level `showTypeColumn` instead. */\n typeColumn?: boolean\n /** @deprecated Use top-level `showDocumentId` instead. */\n documentId?: boolean\n }\n /**\n * Show or hide the document type column in the results table.\n * Replaces the deprecated `display.typeColumn`.\n * Defaults to `true`.\n */\n showTypeColumn?: boolean\n /**\n * Show or hide the Sanity document `_id` under each title.\n * Replaces the deprecated `display.documentId`.\n * Defaults to `true`.\n */\n showDocumentId?: boolean\n query?: {\n /**\n * Limit the dashboard to specific document types.\n * Example: `['post', 'page']`\n */\n types?: string[]\n /**\n * When using `types`, also require the `seo` field to be non-null.\n * Set to `false` to include documents of those types even if `seo` is missing.\n * Defaults to `true`.\n */\n requireSeo?: boolean\n /**\n * Provide a fully custom GROQ query. Takes precedence over `types`.\n * The query must return documents with at least: _id, _type, title, seo, _updatedAt\n */\n groq?: string\n }\n /**\n * The Sanity API version to use for the client (e.g. '2023-01-01').\n * Defaults to '2023-01-01'.\n */\n apiVersion?: string\n /**\n * License key for the SEO Health Dashboard pro feature.\n * Obtain a license at https://sanity-plugin-seofields.thehardik.in\n */\n licenseKey?: string\n /**\n * Map raw `_type` values to human-readable display labels.\n * Used in both the Type column and the Type filter dropdown.\n * Any type without an entry falls back to the raw `_type` string.\n *\n * @deprecated Use `typeDisplayLabels` instead. Will be removed in a future major version.\n * @see https://github.com/hardik-143/sanity-plugin-seofields/blob/main/CHANGELOG.md#132--2026-03-23\n *\n * @example\n * typeLabels: { productDrug: 'Products', singleCondition: 'Condition' }\n */\n typeLabels?: Record<string, string>\n /**\n * Map raw `_type` values to human-readable display labels.\n * Replaces the deprecated `typeLabels`.\n * Used in both the Type column and the Type filter dropdown.\n * Any type without an entry falls back to the raw `_type` string.\n *\n * @example\n * typeDisplayLabels: { productDrug: 'Products', singleCondition: 'Condition' }\n */\n typeDisplayLabels?: Record<string, string>\n /**\n * Controls how the document type is rendered in the Type column.\n * - `'badge'` (default) β€” coloured pill\n * - `'text'` β€” plain text, useful for dense layouts\n */\n typeColumnMode?: 'badge' | 'text'\n /**\n * The document field to use as the display title in the dashboard.\n *\n * - `string` β€” use this field for every document type (e.g. `'name'`)\n * - `Record<string, string>` β€” per-type mapping; unmapped types fall back to `title`\n *\n * @example\n * titleField: 'name'\n *\n * @example\n * titleField: { post: 'title', product: 'name', category: 'label' }\n */\n titleField?: string | Record<string, string>\n /**\n * Callback function to render a custom badge next to the document title.\n * Receives the full document and should return badge data or undefined.\n *\n * @deprecated Use `getDocumentBadge` instead. Will be removed in a future major version.\n * @see https://github.com/hardik-143/sanity-plugin-seofields/blob/main/CHANGELOG.md#132--2026-03-23\n *\n * @example\n * docBadge: (doc) => {\n * if (doc.services === 'NHS')\n * return { label: 'NHS', bgColor: '#e0f2fe', textColor: '#0369a1' }\n * }\n */\n docBadge?: (\n doc: DocumentWithSeoHealth & Record<string, unknown>,\n ) => {label: string; bgColor?: string; textColor?: string; fontSize?: string} | undefined\n /**\n * Callback function to render a custom badge next to the document title.\n * Replaces the deprecated `docBadge`.\n * Receives the full document and should return badge data or undefined.\n *\n * @example\n * getDocumentBadge: (doc) => {\n * if (doc.services === 'NHS')\n * return { label: 'NHS', bgColor: '#e0f2fe', textColor: '#0369a1' }\n * if (doc.services === 'Private')\n * return { label: 'Private', bgColor: '#fef3c7', textColor: '#92400e' }\n * }\n */\n getDocumentBadge?: (\n doc: DocumentWithSeoHealth & Record<string, unknown>,\n ) => {label: string; bgColor?: string; textColor?: string; fontSize?: string} | undefined\n /**\n * The `name` of the Sanity structure tool that contains the monitored documents.\n * Required when you have multiple structure tools and the documents live in a\n * non-default one. Clicking a title will navigate to\n * `/{basePath}/{structureTool}/intent/edit/…` directly.\n *\n * @example\n * structureTool: 'common'\n */\n structureTool?: string\n /**\n * Enable preview/demo mode to show dummy data.\n * Useful for testing, documentation, or showcasing the dashboard.\n * When enabled, displays realistic sample documents with various SEO scores.\n * Defaults to `false`.\n *\n * @example\n * previewMode: true\n */\n previewMode?: boolean\n /**\n * Export options for the SEO Health Dashboard.\n * Set to `true` (default) to enable both CSV and JSON export,\n * or configure per-format.\n */\n export?: boolean | {enabled?: boolean; formats?: Array<'csv' | 'json'>}\n /**\n * Show compact inline stat pills in the header row instead of the\n * full 6-card stats grid. Useful for saving vertical space.\n * Defaults to `false`.\n */\n compactStats?: boolean\n }\n}\n\nconst V132 = 'v1.3.2'\nconst CHANGELOG_V132 = `https://github.com/hardik-143/sanity-plugin-seofields/blob/main/CHANGELOG.md#132--2026-03-23`\n\ninterface ResolvedDashboardConfig {\n enabled: boolean\n toolTitle: string\n toolName: string\n icon: string | undefined\n title: string | undefined\n description: string | undefined\n showTypeColumn: boolean | undefined\n showDocumentId: boolean | undefined\n queryTypes: string[] | undefined\n queryRequireSeo: boolean | undefined\n queryGroq: string | undefined\n apiVersion: string | undefined\n licenseKey: string | undefined\n typeDisplayLabels: Record<string, string> | undefined\n typeColumnMode: 'badge' | 'text' | undefined\n titleField: string | Record<string, string> | undefined\n getDocumentBadge:\n | ((\n doc: DocumentWithSeoHealth & Record<string, unknown>,\n ) => {label: string; bgColor?: string; textColor?: string; fontSize?: string} | undefined)\n | undefined\n loadingLicense: string | undefined\n loadingDocuments: string | undefined\n noDocuments: string | undefined\n previewMode: boolean | undefined\n structureTool: string | undefined\n exportEnabled: boolean\n exportFormats: Array<'csv' | 'json'>\n compactStats: boolean\n /** @internal β€” deprecated keys detected at config-resolution time, forwarded to the UI banner */\n deprecationWarnings: DeprecationWarning[]\n}\n\nconst resolveDashboardConfig = (\n healthDashboard: SeoFieldsPluginConfig['healthDashboard'],\n): ResolvedDashboardConfig => {\n const cfg = typeof healthDashboard === 'object' ? healthDashboard : undefined\n // Detect deprecated plugin-level keys and emit console warnings with guidance on updating to the new config structure. Warnings are collected in an array and also passed to the dashboard component for display in a banner.\n const deprecationWarnings: DeprecationWarning[] = []\n\n if (cfg?.display?.typeColumn !== undefined) {\n deprecationWarnings.push({\n key: 'display.typeColumn β†’ showTypeColumn',\n version: V132,\n changelogUrl: CHANGELOG_V132,\n })\n if (cfg.showTypeColumn) {\n console.warn(\n `[sanity-plugin-seofields] Both \"healthDashboard.display.typeColumn\" and \"healthDashboard.showTypeColumn\" are set. \"showTypeColumn\" will take precedence. Please remove \"healthDashboard.display.typeColumn\". See ${CHANGELOG_V132}`,\n )\n } else {\n console.warn(\n `[sanity-plugin-seofields] \"healthDashboard.display.typeColumn\" is deprecated. Use \"healthDashboard.showTypeColumn\" instead. See ${CHANGELOG_V132}`,\n )\n }\n }\n if (cfg?.display?.documentId !== undefined) {\n deprecationWarnings.push({\n key: 'display.documentId β†’ showDocumentId',\n version: V132,\n changelogUrl: CHANGELOG_V132,\n })\n if (cfg.showDocumentId) {\n console.warn(\n `[sanity-plugin-seofields] Both \"healthDashboard.display.documentId\" and \"healthDashboard.showDocumentId\" are set. \"showDocumentId\" will take precedence. Please remove \"healthDashboard.display.documentId\". See ${CHANGELOG_V132}`,\n )\n } else {\n console.warn(\n `[sanity-plugin-seofields] \"healthDashboard.display.documentId\" is deprecated. Use \"healthDashboard.showDocumentId\" instead. See ${CHANGELOG_V132}`,\n )\n }\n }\n if (cfg?.typeLabels) {\n deprecationWarnings.push({\n key: 'typeLabels β†’ typeDisplayLabels',\n version: V132,\n changelogUrl: CHANGELOG_V132,\n })\n if (cfg.typeDisplayLabels) {\n console.warn(\n `[sanity-plugin-seofields] Both \"healthDashboard.typeLabels\" and \"healthDashboard.typeDisplayLabels\" are set. \"typeDisplayLabels\" will take precedence. Please remove \"typeLabels\". See ${CHANGELOG_V132}`,\n )\n } else {\n console.warn(\n `[sanity-plugin-seofields] \"healthDashboard.typeLabels\" is deprecated. Use \"healthDashboard.typeDisplayLabels\" instead. See ${CHANGELOG_V132}`,\n )\n }\n }\n if (cfg?.docBadge) {\n deprecationWarnings.push({\n key: 'docBadge β†’ getDocumentBadge',\n version: V132,\n changelogUrl: CHANGELOG_V132,\n })\n if (cfg?.getDocumentBadge) {\n console.warn(\n `[sanity-plugin-seofields] Both \"healthDashboard.docBadge\" and \"healthDashboard.getDocumentBadge\" are set. \"getDocumentBadge\" will take precedence. Please remove \"docBadge\". See ${CHANGELOG_V132}`,\n )\n } else {\n console.warn(\n `[sanity-plugin-seofields] \"healthDashboard.docBadge\" is deprecated. Use \"healthDashboard.getDocumentBadge\" instead. See ${CHANGELOG_V132}`,\n )\n }\n }\n\n return {\n enabled: healthDashboard !== false,\n toolTitle: cfg?.tool?.title ?? 'SEO Health',\n toolName: cfg?.tool?.name ?? 'seo-health-dashboard',\n icon: cfg?.content?.icon,\n title: cfg?.content?.title,\n description: cfg?.content?.description,\n // New flat keys take precedence; fall back to deprecated display.* for backwards compat\n showTypeColumn: cfg?.showTypeColumn ?? cfg?.display?.typeColumn,\n showDocumentId: cfg?.showDocumentId ?? cfg?.display?.documentId,\n queryTypes: cfg?.query?.types,\n queryRequireSeo: cfg?.query?.requireSeo,\n queryGroq: cfg?.query?.groq,\n apiVersion: cfg?.apiVersion,\n licenseKey: cfg?.licenseKey,\n // New key takes precedence; fall back to deprecated key for backwards compat\n typeDisplayLabels: cfg?.typeDisplayLabels ?? cfg?.typeLabels,\n typeColumnMode: cfg?.typeColumnMode,\n titleField: cfg?.titleField,\n // New key takes precedence; fall back to deprecated key for backwards compat\n getDocumentBadge: cfg?.getDocumentBadge ?? cfg?.docBadge,\n loadingLicense: cfg?.content?.loadingLicense,\n loadingDocuments: cfg?.content?.loadingDocuments,\n noDocuments: cfg?.content?.noDocuments,\n previewMode: cfg?.previewMode,\n structureTool: cfg?.structureTool,\n exportEnabled: (() => {\n const exportCfg = cfg?.export\n if (exportCfg === false) return false\n if (typeof exportCfg === 'object') return exportCfg.enabled ?? true\n return true\n })(),\n exportFormats: (() => {\n const exportCfg = cfg?.export\n if (typeof exportCfg === 'object' && exportCfg.formats) return exportCfg.formats\n return ['csv', 'json'] as Array<'csv' | 'json'>\n })(),\n compactStats: cfg?.compactStats ?? false,\n deprecationWarnings,\n }\n}\n\nconst seofields = definePlugin<SeoFieldsPluginConfig | void>((config = {}) => {\n const {healthDashboard = true} = config as SeoFieldsPluginConfig\n const dash = resolveDashboardConfig(healthDashboard)\n\n const LazySeoHealthTool = React.lazy(() => import('./components/SeoHealthTool'))\n\n const BoundSeoHealthTool = () =>\n React.createElement(\n React.Suspense,\n {fallback: null},\n React.createElement(LazySeoHealthTool, {\n icon: dash.icon,\n title: dash.title,\n description: dash.description,\n showTypeColumn: dash.showTypeColumn,\n showDocumentId: dash.showDocumentId,\n queryTypes: dash.queryTypes,\n queryRequireSeo: dash.queryRequireSeo,\n customQuery: dash.queryGroq,\n apiVersion: dash.apiVersion,\n licenseKey: dash.licenseKey,\n typeDisplayLabels: dash.typeDisplayLabels,\n typeColumnMode: dash.typeColumnMode,\n titleField: dash.titleField,\n getDocumentBadge: dash.getDocumentBadge,\n loadingLicense: dash.loadingLicense,\n loadingDocuments: dash.loadingDocuments,\n noDocuments: dash.noDocuments,\n previewMode: dash.previewMode,\n structureTool: dash.structureTool,\n exportEnabled: dash.exportEnabled,\n exportFormats: dash.exportFormats,\n compactStats: dash.compactStats,\n _deprecationWarnings: dash.deprecationWarnings,\n }),\n )\n\n return {\n name: 'sanity-plugin-seofields',\n schema: {\n types: types(config as SeoFieldsPluginConfig),\n },\n ...(dash.enabled && {\n tools: [\n {\n name: dash.toolName,\n title: dash.toolTitle,\n component: BoundSeoHealthTool,\n icon: () => 'πŸ“Š',\n },\n ],\n }),\n }\n})\n\nexport default seofields\n","import React from 'react'\nimport type {ComponentBuilder, StructureBuilder} from 'sanity/structure'\n\nimport type {SeoHealthDashboardProps} from './SeoHealthDashboard'\n\nconst LazySeoHealthDashboard = React.lazy(() => import('./SeoHealthDashboard'))\n\n/**\n * Options accepted by `createSeoHealthPane`.\n * All props from `SeoHealthDashboardProps` are supported.\n *\n * `licenseKey` is **required** β€” the dashboard will not render without it.\n */\nexport interface SeoHealthPaneOptions extends Omit<SeoHealthDashboardProps, 'customQuery'> {\n /** Required license key (format: `SEOF-XXXX-XXXX-XXXX`). */\n licenseKey: string\n /**\n * A fully custom GROQ query used to fetch documents for the dashboard.\n * The query must return documents with at least: `_id`, `_type`, `title`, `seo`, `_updatedAt`.\n *\n * Takes precedence over `queryTypes` when both are provided.\n *\n * @example\n * query: `*[_type in [\"post\",\"page\"] && defined(seo)]{ _id, _type, title, slug, seo, _updatedAt }`\n */\n query?: string\n}\n\n// function isStructureBuilder(arg: unknown): arg is StructureBuilder {\n// return (\n// arg !== null &&\n// typeof arg === 'object' &&\n// typeof (arg as StructureBuilder).component === 'function' &&\n// typeof (arg as StructureBuilder).document === 'function'\n// )\n// }\n\n/**\n * Creates a desk-structure pane for the SEO Health Dashboard.\n *\n * Returns a **`ComponentBuilder`** with a built-in `.child()` resolver so that\n * clicking any document row opens the document editor as a split pane to the right.\n *\n * Use it **directly** as the `.child()` value β€” do **not** wrap it in `S.component()`.\n *\n * ```ts\n * // sanity.config.ts\n * structure: (S) =>\n * S.list().items([\n * S.listItem()\n * .title('SEO Health')\n * .child(\n * createSeoHealthPane(S, {\n * licenseKey: 'SEOF-XXXX-XXXX-XXXX',\n * query: `*[_type == \"post\" && defined(seo)]{ _id, _type, title, slug, seo, _updatedAt }`,\n * })\n * ),\n * ])\n * ```\n */\nexport function createSeoHealthPane(\n optionsOrS: StructureBuilder,\n optionsWhenS: SeoHealthPaneOptions,\n): ComponentBuilder {\n // ── Two-arg form: structure builder passed as first arg ──────────────────\n const S = optionsOrS\n const {query, openInPane = true, title: paneTitle, ...rest} = optionsWhenS ?? {}\n\n const SeoHealthPane: React.FC = () => (\n <React.Suspense fallback={null}>\n <LazySeoHealthDashboard\n customQuery={query}\n openInPane={openInPane}\n title={paneTitle}\n {...rest}\n />\n </React.Suspense>\n )\n SeoHealthPane.displayName = 'SeoHealthPane'\n\n // Wire up the child resolver so ChildLink URLs resolve to the document editor\n return (S.component(SeoHealthPane) as ComponentBuilder)\n .title(paneTitle ?? 'SEO Health')\n .child((docId: string, {params}: {params: Record<string, string | undefined>}) => {\n const builder = S.document().documentId(docId)\n return params?.type ? builder.schemaType(params.type) : builder\n })\n}\n\nexport default createSeoHealthPane\n","// Import the plugin\nimport seofields from './plugin'\n\n// Default export the plugin\nexport default seofields\n\n// Re-export everything from plugin.ts\nexport * from './plugin'\n\n// Export schema types for external use\nexport {default as seoFieldsSchema} from './schemas'\nexport {default as allSchemas} from './schemas/types'\nexport {default as metaAttributeSchema} from './schemas/types/metaAttribute'\nexport {default as metaTagSchema} from './schemas/types/metaTag'\nexport {default as openGraphSchema} from './schemas/types/openGraph'\nexport {default as robotsSchema} from './schemas/types/robots'\nexport {default as twitterSchema} from './schemas/types/twitter'\n\n// Export dashboard factory (lazy β€” avoids styled-components at import time)\nexport type {SeoHealthPaneOptions} from './components/SeoHealthPane'\nexport {createSeoHealthPane} from './components/SeoHealthPane'\n\n// Export types\nexport type {DocumentWithSeoHealth, SeoHealthMetrics, SeoHealthStatus} from './types'\n"]}
1
+ {"version":3,"sources":["../src/components/meta/MetaDescription.tsx","../src/components/meta/MetaImage.tsx","../src/components/meta/MetaTitle.tsx","../src/utils/fieldsUtils.ts","../src/utils/utils.ts","../src/components/openGraph/OgDescription.tsx","../src/components/openGraph/OgImage.tsx","../src/components/openGraph/OgImageUrl.tsx","../src/components/openGraph/OgTitle.tsx","../src/schemas/types/openGraph/index.ts","../src/components/twitter/twitterDescription.tsx","../src/components/twitter/TwitterImage.tsx","../src/components/twitter/TwitterImageUrl.tsx","../src/components/twitter/twitterTitle.tsx","../src/schemas/types/twitter/index.ts","../src/schemas/index.ts","../src/schemas/types/baseMeta/index.ts","../src/schemas/types/metaAttribute/index.ts","../src/schemas/types/metaTag/index.ts","../src/schemas/types/robots/index.ts","../src/schemas/types/index.ts","../src/plugin.ts","../src/components/SeoHealthPane.tsx","../src/index.ts"],"names":["useFormValue","useMemo","jsxs","Stack","jsx","Text","defineType","defineField","React","_a"],"mappings":"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","file":"index.js","sourcesContent":["import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getMetaDescriptionValidationMessages} from '../../utils/seoUtils'\n\nconst MetaDescription = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getMetaDescriptionValidationMessages(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{width: 10, height: 10, borderRadius: '50%', backgroundColor: item.color}}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default MetaDescription\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {ObjectInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getMetaImageValidation} from '../../utils/seoUtils'\n\nconst MetaImage = (props: ObjectInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n const hasImage = !!(value as Record<string, unknown> | undefined)?.asset\n\n const feedbackItems = useMemo(\n () => getMetaImageValidation(hasImage, seoParent),\n [hasImage, seoParent],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default MetaImage\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getMetaTitleValidationMessages} from '../../utils/seoUtils'\n\nconst MetaTitle = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getMetaTitleValidationMessages(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default MetaTitle\n","import {AllFieldKeys, SeoFieldsPluginConfig, ValidHiddenFieldKeys} from '../plugin'\n\nconst DEFAULT_FIELD_INFO: Record<AllFieldKeys, {title: string; description: string}> = {\n title: {\n title: 'Meta Title',\n description:\n 'The meta title is displayed in search engine results as the clickable headline for a given result. It should be concise and accurately reflect the content of the page.',\n },\n description: {\n title: 'Meta Description',\n description:\n 'Provide a concise summary of the page content. This description may be used by search engines in search results.',\n },\n metaImage: {\n title: 'Meta Image',\n description:\n 'Upload an image that represents the content of the page. This image may be used in social media previews and search engine results.',\n },\n keywords: {\n title: 'Keywords',\n description:\n 'Add relevant keywords for this page. These keywords will be used for SEO purposes.',\n },\n canonicalUrl: {\n title: 'Canonical URL',\n description:\n 'Specify the canonical URL for this page. This helps prevent duplicate content issues by indicating the preferred version of a page.',\n },\n robots: {\n title: 'Robots Settings',\n description: 'Configure how search engine crawlers should index and follow links on this page.',\n },\n metaAttributes: {\n title: 'Additional Meta Attributes',\n description:\n 'Add custom meta attributes to the head of the document for additional SEO and social media integration.',\n },\n openGraphTitle: {\n title: 'Open Graph Title',\n description: '',\n },\n openGraphUrl: {\n title: 'Open Graph URL',\n description:\n 'The canonical URL of the page. This should be the full URL including protocol (https://).',\n },\n openGraphDescription: {\n title: 'Open Graph Description',\n description: '',\n },\n openGraphSiteName: {\n title: 'Open Graph Site Name',\n description: 'The name of your website. This is often the site title.',\n },\n openGraphType: {\n title: 'Open Graph Type',\n description: 'Select the type of content for Open Graph.',\n },\n openGraphImageType: {\n title: 'Image Type',\n description: 'Choose whether to upload an image or provide an image URL for Open Graph.',\n },\n openGraphImage: {\n title: 'Open Graph Image',\n description:\n 'Recommended size: 1200x630px (minimum 600x315px). Max file size: 5MB. Aspect ratio 1.91:1.',\n },\n openGraphImageUrl: {\n title: 'Open Graph Image URL',\n description:\n 'Enter the full URL of the image. Ensure the image is accessible and meets the recommended size of 1200x630px (minimum 600x315px).',\n },\n twitterCard: {\n title: 'X Card Type',\n description: '',\n },\n twitterSite: {\n title: 'Site X Handle',\n description: 'The X (formerly Twitter) handle of the website (e.g., @example)',\n },\n twitterCreator: {\n title: 'X Creator Handle',\n description: 'The X (formerly Twitter) handle of the content creator (e.g., @creator)',\n },\n twitterTitle: {\n title: 'X Title',\n description: 'The title of the content as it should appear on X (formerly Twitter).',\n },\n twitterDescription: {\n title: 'X Description',\n description: 'A brief description of the content for X (formerly Twitter).',\n },\n twitterImageType: {\n title: 'X Image Type',\n description:\n 'Choose whether to upload an image or provide an image URL for X (formerly Twitter).',\n },\n twitterImage: {\n title: 'X Image',\n description:\n 'An image URL which should be at least 120x120px for \"summary\" card and 280x150px for \"summary_large_image\" card.',\n },\n twitterImageUrl: {\n title: 'X Image URL',\n description:\n 'Enter the full URL of the image for X (formerly Twitter). Ensure the image is accessible and meets the recommended size.',\n },\n}\n\nexport const getFieldInfo = (\n fieldName: string,\n fieldOverrides: SeoFieldsPluginConfig['fieldOverrides'],\n): {title: string; description: string} => {\n const fieldInfo =\n (fieldOverrides && fieldOverrides[fieldName as keyof typeof fieldOverrides]) ||\n DEFAULT_FIELD_INFO[fieldName as keyof typeof DEFAULT_FIELD_INFO]\n return fieldInfo\n ? {title: fieldInfo.title || '', description: fieldInfo.description || ''}\n : {title: '', description: ''}\n}\n\n/**\n * Check if a field should be hidden based on the current document type\n */\nexport const isFieldHidden = (\n fieldName: ValidHiddenFieldKeys,\n config: SeoFieldsPluginConfig,\n documentType?: string,\n): boolean => {\n // Check if field is in default hidden fields\n if (config.defaultHiddenFields?.includes(fieldName)) {\n return true\n }\n\n // Check if field is hidden for specific post type\n if (documentType && config.fieldVisibility?.[documentType]?.hiddenFields?.includes(fieldName)) {\n return true\n }\n\n return false\n}\n\n/**\n * Get the hidden function for any field\n */\nexport const getFieldHiddenFunction = (\n fieldName: ValidHiddenFieldKeys,\n config: SeoFieldsPluginConfig,\n) => {\n return ({\n document,\n }: {\n document?: {\n _type?: string\n }\n }): boolean => {\n const documentType = document?._type\n return isFieldHidden(fieldName, config, documentType)\n }\n}\n","export const isEmpty = (value: unknown): boolean => {\n return (\n value === null ||\n value === undefined ||\n (typeof value === 'string' && value.trim() === '') ||\n (Array.isArray(value) && value.length === 0) ||\n (typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0)\n )\n}\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getOgDescriptionValidation} from '../../utils/seoUtils'\n\nconst OgDescription = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n // Access parent object to get keywords\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getOgDescriptionValidation(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n {/* Validation */}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default OgDescription\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {ObjectInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getOgImageValidation} from '../../utils/seoUtils'\n\nconst OgImage = (props: ObjectInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n const imgValue = value as Record<string, unknown> | undefined\n const hasImage = !!imgValue?.asset\n const altText = imgValue?.alt as string | undefined\n\n const feedbackItems = useMemo(\n () => getOgImageValidation(hasImage, altText, seoParent),\n [hasImage, altText, seoParent],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default OgImage\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getOgImageUrlValidation} from '../../utils/seoUtils'\n\nconst OgImageUrl = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n\n const feedbackItems = useMemo(() => getOgImageUrlValidation(value, seoParent), [value, seoParent])\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default OgImageUrl\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getOgTitleValidation} from '../../utils/seoUtils'\n\nconst OgTitle: React.FC<StringInputProps> = (props) => {\n const {value, renderDefault, path} = props\n\n // Access parent object to get keywords\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getOgTitleValidation(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default OgTitle\n","import {defineField, defineType, SchemaTypeDefinition} from 'sanity'\n\nimport OgDescription from '../../../components/openGraph/OgDescription'\nimport OgImage from '../../../components/openGraph/OgImage'\nimport OgImageUrl from '../../../components/openGraph/OgImageUrl'\nimport OgTitle from '../../../components/openGraph/OgTitle'\nimport {SeoFieldsPluginConfig} from '../../../plugin'\nimport {getFieldHiddenFunction, getFieldInfo} from '../../../utils/fieldsUtils'\n\nexport default function openGraph(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition {\n return defineType({\n name: 'openGraph',\n title: 'Open Graph Settings',\n type: 'object',\n fields: [\n defineField({\n name: 'url',\n type: 'url',\n ...getFieldInfo('openGraphUrl', config.fieldOverrides),\n hidden: getFieldHiddenFunction('openGraphUrl', config),\n description:\n 'The canonical URL of the page. This should be the full URL including protocol (https://).',\n }),\n defineField({\n name: 'title',\n ...getFieldInfo('openGraphTitle', config.fieldOverrides),\n type: 'string',\n hidden: getFieldHiddenFunction('openGraphTitle', config),\n components: {\n input: OgTitle, // Can also wrap with a string input + preview\n },\n }),\n defineField({\n name: 'description',\n ...getFieldInfo('openGraphDescription', config.fieldOverrides),\n type: 'text',\n rows: 3,\n hidden: getFieldHiddenFunction('openGraphDescription', config),\n components: {\n input: OgDescription, // Can also wrap with a text area + preview\n },\n }),\n defineField({\n name: 'siteName',\n ...getFieldInfo('openGraphSiteName', config.fieldOverrides),\n type: 'string',\n hidden: getFieldHiddenFunction('openGraphSiteName', config),\n }),\n defineField({\n name: 'type',\n ...getFieldInfo('openGraphType', config.fieldOverrides),\n type: 'string',\n options: {\n list: [\n {title: 'Website', value: 'website'},\n {title: 'Article', value: 'article'},\n {title: 'Profile', value: 'profile'},\n {title: 'Book', value: 'book'},\n {title: 'Music', value: 'music'},\n {title: 'Video', value: 'video'},\n {title: 'Product', value: 'product'},\n ],\n // layout: 'radio', // Display as radio buttons\n },\n hidden: getFieldHiddenFunction('openGraphType', config),\n initialValue: 'website',\n }),\n defineField({\n name: 'imageType',\n ...getFieldInfo('openGraphImageType', config.fieldOverrides),\n type: 'string',\n options: {\n list: [\n {title: 'Upload Image', value: 'upload'},\n {title: 'Image URL', value: 'url'},\n ],\n },\n hidden: getFieldHiddenFunction('openGraphImage', config),\n initialValue: 'upload',\n }),\n defineField({\n name: 'image',\n ...getFieldInfo('openGraphImage', config.fieldOverrides),\n type: 'image',\n options: {\n hotspot: true,\n },\n components: {\n input: OgImage,\n },\n fields: [\n defineField({\n name: 'alt',\n title: 'Image Alt Text',\n type: 'string',\n description: 'A description of the image for accessibility purposes.',\n }),\n ],\n hidden: (context) => {\n const {parent} = context\n if (parent?.imageType !== 'upload') return true\n const hiddenFn = getFieldHiddenFunction('openGraphImage', config)\n return typeof hiddenFn === 'function' ? hiddenFn(context) : hiddenFn\n },\n }),\n defineField({\n name: 'imageUrl',\n ...getFieldInfo('openGraphImageUrl', config.fieldOverrides),\n type: 'url',\n components: {\n input: OgImageUrl,\n },\n hidden: (context) => {\n const {parent} = context\n if (parent?.imageType !== 'url') return true\n const hiddenFn = getFieldHiddenFunction('openGraphImage', config)\n return typeof hiddenFn === 'function' ? hiddenFn(context) : hiddenFn\n },\n }),\n ],\n })\n}\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getTwitterDescriptionValidation} from '../../utils/seoUtils'\n\nconst TwitterDescription = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n // Access parent object to get keywords\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getTwitterDescriptionValidation(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default TwitterDescription\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {ObjectInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getTwitterImageValidation} from '../../utils/seoUtils'\n\nconst TwitterImage = (props: ObjectInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n const imgValue = value as Record<string, unknown> | undefined\n const hasImage = !!imgValue?.asset\n const altText = imgValue?.alt as string | undefined\n\n const feedbackItems = useMemo(\n () => getTwitterImageValidation(hasImage, altText, seoParent),\n [hasImage, altText, seoParent],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default TwitterImage\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getTwitterImageUrlValidation} from '../../utils/seoUtils'\n\nconst TwitterImageUrl = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n const seoParent = useFormValue([path[0]]) as Record<string, unknown> | null\n\n const feedbackItems = useMemo(\n () => getTwitterImageUrlValidation(value, seoParent),\n [value, seoParent],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default TwitterImageUrl\n","import {Stack, Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\nimport {StringInputProps, useFormValue} from 'sanity'\n\nimport {FeedbackType} from '../../types'\nimport {getTwitterTitleValidation} from '../../utils/seoUtils'\n\nconst TwitterTitle = (props: StringInputProps): React.ReactElement => {\n const {value, renderDefault, path} = props\n\n // Access parent object to get keywords\n const parent = useFormValue([path[0]]) as {keywords?: string[]; _type?: string}\n const isParentseoField = parent && parent?._type === 'seoFields'\n const keywords = useMemo(() => parent?.keywords || [], [parent?.keywords])\n\n const feedbackItems = useMemo(\n () => getTwitterTitleValidation(value || '', keywords, isParentseoField),\n [value, keywords, isParentseoField],\n )\n\n return (\n <Stack space={3}>\n {renderDefault(props)}\n <Stack space={2}>\n {feedbackItems.map((item: FeedbackType) => (\n <div key={item.text} style={{display: 'flex', alignItems: 'center', gap: 7}}>\n <div\n style={{\n minWidth: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: item.color,\n }}\n />\n <Text weight=\"bold\" muted size={14}>\n {item.text}\n </Text>\n </div>\n ))}\n </Stack>\n </Stack>\n )\n}\n\nexport default TwitterTitle\n","import {defineField, defineType, SchemaTypeDefinition} from 'sanity'\n\nimport TwitterDescription from '../../../components/twitter/twitterDescription'\nimport TwitterImage from '../../../components/twitter/TwitterImage'\nimport TwitterImageUrl from '../../../components/twitter/TwitterImageUrl'\nimport TwitterTitle from '../../../components/twitter/twitterTitle'\nimport {SeoFieldsPluginConfig} from '../../../plugin'\nimport {getFieldHiddenFunction, getFieldInfo} from '../../../utils/fieldsUtils'\n\nexport default function twitter(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition {\n return defineType({\n name: 'twitter',\n title: 'X (Formerly Twitter)',\n type: 'object',\n fields: [\n defineField({\n name: 'card',\n ...getFieldInfo('twitterCard', config.fieldOverrides),\n type: 'string',\n options: {\n list: [\n {title: 'Summary', value: 'summary'},\n {title: 'Summary with Large Image', value: 'summary_large_image'},\n {title: 'App', value: 'app'},\n {title: 'Player', value: 'player'},\n ],\n },\n hidden: getFieldHiddenFunction('twitterCard', config),\n initialValue: 'summary_large_image', // good default\n }),\n defineField({\n name: 'site',\n ...getFieldInfo('twitterSite', config.fieldOverrides),\n type: 'string',\n hidden: getFieldHiddenFunction('twitterSite', config),\n }),\n defineField({\n name: 'creator',\n type: 'string',\n ...getFieldInfo('twitterCreator', config.fieldOverrides),\n hidden: getFieldHiddenFunction('twitterCreator', config),\n }),\n defineField({\n name: 'title',\n type: 'string',\n ...getFieldInfo('twitterTitle', config.fieldOverrides),\n hidden: getFieldHiddenFunction('twitterTitle', config),\n components: {\n input: TwitterTitle,\n },\n }),\n defineField({\n name: 'description',\n type: 'text',\n rows: 3,\n ...getFieldInfo('twitterDescription', config.fieldOverrides),\n hidden: getFieldHiddenFunction('twitterDescription', config),\n components: {\n input: TwitterDescription,\n },\n }),\n defineField({\n name: 'imageType',\n ...getFieldInfo('twitterImageType', config.fieldOverrides),\n type: 'string',\n options: {\n list: [\n {title: 'Upload Image', value: 'upload'},\n {title: 'Image URL', value: 'url'},\n ],\n },\n hidden: getFieldHiddenFunction('twitterImage', config),\n initialValue: 'upload',\n }),\n defineField({\n name: 'image',\n ...getFieldInfo('twitterImage', config.fieldOverrides),\n type: 'image',\n options: {\n hotspot: true,\n },\n components: {\n input: TwitterImage,\n },\n fields: [\n defineField({\n name: 'alt',\n title: 'Image Alt Text',\n type: 'string',\n description: 'A description of the image for accessibility purposes.',\n }),\n ],\n hidden: (context) => {\n const {parent} = context\n if (parent?.imageType !== 'upload') return true\n const hiddenFn = getFieldHiddenFunction('twitterImage', config)\n return typeof hiddenFn === 'function' ? hiddenFn(context) : hiddenFn\n },\n }),\n defineField({\n name: 'imageUrl',\n ...getFieldInfo('twitterImageUrl', config.fieldOverrides),\n type: 'url',\n components: {\n input: TwitterImageUrl,\n },\n hidden: (context) => {\n const {parent} = context\n if (parent?.imageType !== 'url') return true\n const hiddenFn = getFieldHiddenFunction('twitterImage', config)\n return typeof hiddenFn === 'function' ? hiddenFn(context) : hiddenFn\n },\n }),\n ],\n })\n}\n","import React from 'react'\nimport {\n defineField,\n defineType,\n FieldDefinition,\n SchemaTypeDefinition,\n StringInputProps,\n} from 'sanity'\n\nimport MetaDescription from '../components/meta/MetaDescription'\nimport MetaImage from '../components/meta/MetaImage'\nimport MetaTitle from '../components/meta/MetaTitle'\nimport {SeoFieldsPluginConfig} from '../plugin'\nimport {getFieldHiddenFunction, getFieldInfo} from '../utils/fieldsUtils'\nimport {isEmpty} from '../utils/utils'\nimport openGraph from './types/openGraph'\nimport twitter from './types/twitter'\n\n// Lazy-load SeoPreview to avoid styled-components breaking `sanity schema extract`\nconst LazySeoPreview = React.lazy(() => import('../components/SeoPreview'))\nconst SeoPreviewWrapper = (props: StringInputProps) =>\n React.createElement(React.Suspense, {fallback: null}, React.createElement(LazySeoPreview, props))\n\nexport default function seoFieldsSchema(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition {\n return defineType({\n name: 'seoFields',\n title: 'SEO Fields',\n type: 'object',\n fields: [\n defineField({\n name: 'robots',\n title: 'Robots Settings',\n type: 'robots', // Use the separate robots type here\n hidden: getFieldHiddenFunction('robots', config),\n }),\n // πŸ‘‡ conditionally spread preview field\n ...((typeof config.seoPreview === 'boolean' && config.seoPreview) ||\n (typeof config.seoPreview === 'object' && !isEmpty(config.seoPreview))\n ? [\n defineField({\n name: 'preview',\n title: 'SEO Preview',\n type: 'string',\n components: {input: SeoPreviewWrapper},\n options: {\n baseUrl: config.baseUrl || 'https://www.example.com',\n ...(typeof config.seoPreview === 'object' &&\n config.seoPreview &&\n config.seoPreview.prefix\n ? {prefix: config.seoPreview.prefix}\n : {}),\n } as Record<string, unknown>,\n // Use a readOnly field to prevent editing\n // This field is just for preview purposes\n initialValue: '' as string, // Set an initial value\n readOnly: true,\n }),\n ]\n : []),\n\n defineField({\n name: 'title',\n ...getFieldInfo('title', config.fieldOverrides),\n // title: 'Meta Title',\n type: 'string',\n // description:\n // 'The meta title is displayed in search engine results as the clickable headline for a given result. It should be concise and accurately reflect the content of the page.',\n components: {\n input: MetaTitle,\n },\n // validation: (Rule) => Rule.max(60).warning('Meta title should be under 60 characters.'),\n hidden: getFieldHiddenFunction('title', config),\n }),\n defineField({\n name: 'description',\n ...getFieldInfo('description', config.fieldOverrides),\n // title: 'Meta Description',\n // description:\n // 'Provide a concise summary of the page content. This description may be used by search engines in search results.',\n type: 'text',\n rows: 3,\n components: {\n input: MetaDescription,\n },\n // validation: (Rule) => Rule.max(160).warning('Meta description should be under 160 characters.'),\n hidden: getFieldHiddenFunction('description', config),\n }),\n defineField({\n name: 'metaImage',\n ...getFieldInfo('metaImage', config.fieldOverrides),\n // title: 'Meta Image',\n // description:\n // 'Upload an image that represents the content of the page. This image may be used in social media previews and search engine results.',\n type: 'image',\n options: {\n hotspot: true,\n },\n components: {\n input: MetaImage,\n },\n hidden: getFieldHiddenFunction('metaImage', config),\n }),\n defineField({\n name: 'metaAttributes',\n // title: 'Additional Meta Attributes',\n ...getFieldInfo('metaAttributes', config.fieldOverrides),\n type: 'array',\n of: [{type: 'metaAttribute'}],\n // description:\n // 'Add custom meta attributes to the head of the document for additional SEO and social media integration.',\n hidden: getFieldHiddenFunction('metaAttributes', config),\n }),\n defineField({\n name: 'keywords',\n ...getFieldInfo('keywords', config.fieldOverrides),\n title: 'Keywords',\n type: 'array',\n of: [{type: 'string'}],\n description:\n 'Add relevant keywords for this page. These keywords will be used for SEO purposes.',\n hidden: getFieldHiddenFunction('keywords', config),\n }),\n defineField({\n name: 'canonicalUrl',\n ...getFieldInfo('canonicalUrl', config.fieldOverrides),\n title: 'Canonical URL',\n type: 'url',\n description:\n 'Specify the canonical URL for this page. This helps prevent duplicate content issues by indicating the preferred version of a page.',\n hidden: getFieldHiddenFunction('canonicalUrl', config),\n }),\n openGraph(config) as unknown as FieldDefinition,\n twitter(config) as unknown as FieldDefinition,\n ],\n })\n}\n","import {defineField, defineType, SchemaTypeDefinition} from 'sanity'\n\nimport MetaDescription from '../../../components/meta/MetaDescription'\nimport MetaImage from '../../../components/meta/MetaImage'\nimport MetaTitle from '../../../components/meta/MetaTitle'\nimport {SeoFieldsPluginConfig} from '../../../plugin'\nimport {getFieldHiddenFunction, getFieldInfo} from '../../../utils/fieldsUtils'\n\nexport default function baseMeta(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition {\n return defineType({\n name: 'baseMeta',\n title: 'Basic Meta Settings',\n type: 'object',\n fields: [\n defineField({\n name: 'title',\n ...getFieldInfo('title', config.fieldOverrides),\n type: 'string',\n components: {\n input: MetaTitle,\n },\n hidden: getFieldHiddenFunction('title', config),\n }),\n defineField({\n name: 'description',\n ...getFieldInfo('description', config.fieldOverrides),\n type: 'text',\n rows: 3,\n components: {\n input: MetaDescription,\n },\n hidden: getFieldHiddenFunction('description', config),\n }),\n defineField({\n name: 'metaImage',\n ...getFieldInfo('metaImage', config.fieldOverrides),\n type: 'image',\n options: {\n hotspot: true,\n },\n components: {\n input: MetaImage,\n },\n hidden: getFieldHiddenFunction('metaImage', config),\n }),\n defineField({\n name: 'keywords',\n ...getFieldInfo('keywords', config.fieldOverrides),\n title: 'Keywords',\n type: 'array',\n of: [{type: 'string'}],\n description:\n 'Add relevant keywords for this page. These keywords will be used for SEO purposes.',\n hidden: getFieldHiddenFunction('keywords', config),\n }),\n defineField({\n name: 'canonicalUrl',\n ...getFieldInfo('canonicalUrl', config.fieldOverrides),\n title: 'Canonical URL',\n type: 'url',\n description:\n 'Specify the canonical URL for this page. This helps prevent duplicate content issues by indicating the preferred version of a page.',\n hidden: getFieldHiddenFunction('canonicalUrl', config),\n }),\n defineField({\n name: 'metaAttributes',\n ...getFieldInfo('metaAttributes', config.fieldOverrides),\n type: 'array',\n of: [{type: 'metaAttribute'}],\n hidden: getFieldHiddenFunction('metaAttributes', config),\n }),\n ],\n })\n}\n","import {defineField, defineType} from 'sanity'\n\nexport default defineType({\n name: 'metaAttribute',\n title: 'Meta Attribute',\n type: 'object',\n fields: [\n defineField({\n name: 'key',\n title: 'Attribute Name',\n type: 'string',\n }),\n defineField({\n name: 'type',\n title: 'Attribute Value Type',\n type: 'string',\n options: {\n list: [\n {title: 'String', value: 'string'},\n {title: 'Image', value: 'image'},\n ],\n },\n initialValue: 'string',\n }),\n defineField({\n name: 'value',\n title: 'Attribute Value',\n type: 'string',\n hidden: ({parent}) => parent?.type === 'image',\n }),\n defineField({\n name: 'image',\n title: 'Attribute Image Value',\n type: 'image',\n hidden: ({parent}) => parent?.type === 'string',\n }),\n ],\n preview: {\n select: {\n attributeName: 'key',\n attributeValueString: 'value',\n attributeValueImage: 'image',\n },\n prepare({attributeName, attributeValueString, attributeValueImage}) {\n let subtitle = ''\n if (attributeValueString) {\n subtitle = `Value: ${attributeValueString}`\n } else if (attributeValueImage) {\n subtitle = 'Value: [Image]'\n } else {\n subtitle = 'No Attribute Value'\n }\n return {\n title: attributeName || 'No Attribute Name',\n subtitle: subtitle,\n media: attributeValueImage,\n }\n },\n },\n})\n","import {defineType} from 'sanity'\n\nexport default defineType({\n name: 'metaTag',\n title: 'Meta Tag',\n type: 'object',\n fields: [\n {\n name: 'metaAttributes',\n title: 'Meta Attributes',\n type: 'array',\n of: [{type: 'metaAttribute'}],\n description:\n 'Add custom meta attributes to the head of the document for additional SEO and social media integration.',\n },\n ],\n})\n","import {defineField, defineType} from 'sanity'\n\nexport default defineType({\n name: 'robots',\n title: 'Robots Settings',\n type: 'object',\n fields: [\n defineField({\n name: 'noIndex',\n title: 'No Index',\n type: 'boolean',\n initialValue: false,\n description:\n 'Enable this to prevent search engines from indexing this page. The page will not appear in search results.',\n }),\n defineField({\n name: 'noFollow',\n title: 'No Follow',\n type: 'boolean',\n initialValue: false,\n description:\n 'Enable this to prevent search engines from following links on this page. Links will not pass SEO value.',\n }),\n ],\n description: 'Select how search engines should index and follow links on this page.',\n})\n","import {SchemaTypeDefinition} from 'sanity'\n\nimport {SeoFieldsPluginConfig} from '../../plugin'\nimport seoFields from '..'\nimport baseMeta from './baseMeta'\nimport metaAttribute from './metaAttribute'\nimport metaTag from './metaTag'\nimport openGraph from './openGraph'\nimport robots from './robots'\nimport twitter from './twitter'\n\nexport default function types(config: SeoFieldsPluginConfig = {}): SchemaTypeDefinition[] {\n return [\n seoFields(config), // pass config here\n baseMeta(config), // pass config here\n openGraph(config), // pass config here\n twitter(config), // pass config here\n metaAttribute as SchemaTypeDefinition,\n metaTag,\n robots,\n ]\n}\n","// plugin.ts\nimport React from 'react'\nimport {definePlugin} from 'sanity'\n\nimport types from './schemas/types'\nimport type {DeprecationWarning, DocumentWithSeoHealth} from './types'\n\nexport interface SeoFieldConfig {\n title?: string\n description?: string\n}\n\nexport type SeoFieldKeys =\n | 'title'\n | 'description'\n | 'canonicalUrl'\n | 'metaImage'\n | 'keywords'\n | 'metaAttributes'\n | 'robots'\n\nexport type openGraphFieldKeys =\n | 'openGraphUrl'\n | 'openGraphTitle'\n | 'openGraphDescription'\n | 'openGraphSiteName'\n | 'openGraphType'\n | 'openGraphImageType'\n | 'openGraphImage'\n | 'openGraphImageUrl'\n\nexport type twitterFieldKeys =\n | 'twitterCard'\n | 'twitterSite'\n | 'twitterCreator'\n | 'twitterTitle'\n | 'twitterDescription'\n | 'twitterImageType'\n | 'twitterImage'\n | 'twitterImageUrl'\n\nexport type AllFieldKeys = SeoFieldKeys | openGraphFieldKeys | twitterFieldKeys\n\nexport type ValidHiddenFieldKeys = Exclude<\n AllFieldKeys,\n 'openGraphImageUrl' | 'twitterImageUrl' | 'openGraphImageType' | 'twitterImageType'\n>\n\nexport interface FieldVisibilityConfig {\n hiddenFields?: ValidHiddenFieldKeys[]\n}\n\nexport interface SeoFieldsPluginConfig {\n /**\n * Enable or configure the SEO preview feature.\n * If set to `true`, the SEO preview will be enabled with default settings.\n * If set to an object, you can provide a custom prefix function to modify the URL prefix in the preview.\n * The prefix function receives the current document as an argument and should return a string.\n * Example:\n * ```\n * seoPreview: {\n * prefix: (doc) => `/${doc.slug?.current || 'untitled'}`\n * }\n * ```\n */\n seoPreview?:\n | boolean\n | {\n prefix?: (doc: {_type?: string} & Record<string, unknown>) => string\n }\n\n /**\n * A mapping of field keys to their configuration settings.\n * This allows customization of field titles and descriptions.\n * For example, to change the title of the 'title' field:\n */\n fieldOverrides?: Partial<Record<AllFieldKeys, SeoFieldConfig>>\n /**\n * A mapping of document types to field visibility configurations.\n * This allows you to specify which fields should be hidden for specific document types.\n */\n fieldVisibility?: Record<string, FieldVisibilityConfig>\n\n /**\n * A list of fields that should be hidden by default in all document types.\n * This can be overridden by specific document type settings in `fieldVisibility`.\n */\n defaultHiddenFields?: ValidHiddenFieldKeys[]\n /**\n * The base URL of your website, used for generating full URLs in the SEO preview.\n * Defaults to 'https://www.example.com' if not provided.\n */\n baseUrl?: string\n /**\n * Enable or configure the SEO Health Dashboard tool.\n * If set to `true`, the dashboard is enabled with all defaults.\n * If set to an object, you can customise the tool and dashboard settings.\n * Defaults to `true`.\n * Example:\n * ```\n * healthDashboard: {\n * toolTitle: 'SEO Overview', // Studio nav tab label\n * content: {\n * icon: 'πŸ”', // Emoji icon shown before the page heading\n * title: 'My SEO Dashboard',// Page heading inside the tool (no emoji)\n * description: 'Track SEO across all documents', // Subtitle under the heading\n * },\n * display: {\n * typeColumn: false, // Hide the document type column (default: true)\n * documentId: false, // Hide the document ID under titles (default: true)\n * },\n * query: {\n * // Option 1 – filter by specific document types\n * types: ['post', 'page'],\n * // Option 2 – provide a full custom GROQ query (takes precedence over `types`)\n * // Must return documents with at least: _id, _type, title, seo, _updatedAt\n * groq: `*[seo != null && defined(slug.current)]{ _id, _type, title, slug, seo, _updatedAt }`,\n * },\n * }\n * ```\n */\n healthDashboard?:\n | boolean\n | {\n tool?: {\n title?: string\n name?: string\n }\n toolTitle?: string\n content?: {\n icon?: string\n title?: string\n description?: string\n /** Text shown while the license key is being verified. Defaults to \"Verifying license…\" */\n loadingLicense?: string\n /** Text shown while documents are being fetched. Defaults to \"Loading documents…\" */\n loadingDocuments?: string\n /** Text shown when the query returns zero results. Defaults to \"No documents found\" */\n noDocuments?: string\n }\n /**\n * @deprecated Use `showTypeColumn` instead. Will be removed in a future major version.\n * @see https://github.com/hardik-143/sanity-plugin-seofields/blob/main/CHANGELOG.md#132--2026-03-23\n */\n display?: {\n /** @deprecated Use top-level `showTypeColumn` instead. */\n typeColumn?: boolean\n /** @deprecated Use top-level `showDocumentId` instead. */\n documentId?: boolean\n }\n /**\n * Show or hide the document type column in the results table.\n * Replaces the deprecated `display.typeColumn`.\n * Defaults to `true`.\n */\n showTypeColumn?: boolean\n /**\n * Show or hide the Sanity document `_id` under each title.\n * Replaces the deprecated `display.documentId`.\n * Defaults to `true`.\n */\n showDocumentId?: boolean\n query?: {\n /**\n * Limit the dashboard to specific document types.\n * Example: `['post', 'page']`\n */\n types?: string[]\n /**\n * When using `types`, also require the `seo` field to be non-null.\n * Set to `false` to include documents of those types even if `seo` is missing.\n * Defaults to `true`.\n */\n requireSeo?: boolean\n /**\n * Provide a fully custom GROQ query. Takes precedence over `types`.\n * The query must return documents with at least: _id, _type, title, seo, _updatedAt\n */\n groq?: string\n }\n /**\n * The Sanity API version to use for the client (e.g. '2023-01-01').\n * Defaults to '2023-01-01'.\n */\n apiVersion?: string\n /**\n * License key for the SEO Health Dashboard pro feature.\n * Obtain a license at https://sanity-plugin-seofields.thehardik.in\n */\n licenseKey?: string\n /**\n * Map raw `_type` values to human-readable display labels.\n * Used in both the Type column and the Type filter dropdown.\n * Any type without an entry falls back to the raw `_type` string.\n *\n * @deprecated Use `typeDisplayLabels` instead. Will be removed in a future major version.\n * @see https://github.com/hardik-143/sanity-plugin-seofields/blob/main/CHANGELOG.md#132--2026-03-23\n *\n * @example\n * typeLabels: { productDrug: 'Products', singleCondition: 'Condition' }\n */\n typeLabels?: Record<string, string>\n /**\n * Map raw `_type` values to human-readable display labels.\n * Replaces the deprecated `typeLabels`.\n * Used in both the Type column and the Type filter dropdown.\n * Any type without an entry falls back to the raw `_type` string.\n *\n * @example\n * typeDisplayLabels: { productDrug: 'Products', singleCondition: 'Condition' }\n */\n typeDisplayLabels?: Record<string, string>\n /**\n * Controls how the document type is rendered in the Type column.\n * - `'badge'` (default) β€” coloured pill\n * - `'text'` β€” plain text, useful for dense layouts\n */\n typeColumnMode?: 'badge' | 'text'\n /**\n * The document field to use as the display title in the dashboard.\n *\n * - `string` β€” use this field for every document type (e.g. `'name'`)\n * - `Record<string, string>` β€” per-type mapping; unmapped types fall back to `title`\n *\n * @example\n * titleField: 'name'\n *\n * @example\n * titleField: { post: 'title', product: 'name', category: 'label' }\n */\n titleField?: string | Record<string, string>\n /**\n * Callback function to render a custom badge next to the document title.\n * Receives the full document and should return badge data or undefined.\n *\n * @deprecated Use `getDocumentBadge` instead. Will be removed in a future major version.\n * @see https://github.com/hardik-143/sanity-plugin-seofields/blob/main/CHANGELOG.md#132--2026-03-23\n *\n * @example\n * docBadge: (doc) => {\n * if (doc.services === 'NHS')\n * return { label: 'NHS', bgColor: '#e0f2fe', textColor: '#0369a1' }\n * }\n */\n docBadge?: (\n doc: DocumentWithSeoHealth & Record<string, unknown>,\n ) => {label: string; bgColor?: string; textColor?: string; fontSize?: string} | undefined\n /**\n * Callback function to render a custom badge next to the document title.\n * Replaces the deprecated `docBadge`.\n * Receives the full document and should return badge data or undefined.\n *\n * @example\n * getDocumentBadge: (doc) => {\n * if (doc.services === 'NHS')\n * return { label: 'NHS', bgColor: '#e0f2fe', textColor: '#0369a1' }\n * if (doc.services === 'Private')\n * return { label: 'Private', bgColor: '#fef3c7', textColor: '#92400e' }\n * }\n */\n getDocumentBadge?: (\n doc: DocumentWithSeoHealth & Record<string, unknown>,\n ) => {label: string; bgColor?: string; textColor?: string; fontSize?: string} | undefined\n /**\n * The `name` of the Sanity structure tool that contains the monitored documents.\n * Required when you have multiple structure tools and the documents live in a\n * non-default one. Clicking a title will navigate to\n * `/{basePath}/{structureTool}/intent/edit/…` directly.\n *\n * @example\n * structureTool: 'common'\n */\n structureTool?: string\n /**\n * Enable preview/demo mode to show dummy data.\n * Useful for testing, documentation, or showcasing the dashboard.\n * When enabled, displays realistic sample documents with various SEO scores.\n * Defaults to `false`.\n *\n * @example\n * previewMode: true\n */\n previewMode?: boolean\n /**\n * Export options for the SEO Health Dashboard.\n * Set to `true` (default) to enable both CSV and JSON export,\n * or configure per-format.\n */\n export?: boolean | {enabled?: boolean; formats?: Array<'csv' | 'json'>}\n /**\n * Show compact inline stat pills in the header row instead of the\n * full 6-card stats grid. Useful for saving vertical space.\n * Defaults to `false`.\n */\n compactStats?: boolean\n }\n}\n\nconst V132 = 'v1.3.2'\nconst CHANGELOG_V132 = `https://github.com/hardik-143/sanity-plugin-seofields/blob/main/CHANGELOG.md#132--2026-03-23`\n\ninterface ResolvedDashboardConfig {\n enabled: boolean\n toolTitle: string\n toolName: string\n icon: string | undefined\n title: string | undefined\n description: string | undefined\n showTypeColumn: boolean | undefined\n showDocumentId: boolean | undefined\n queryTypes: string[] | undefined\n queryRequireSeo: boolean | undefined\n queryGroq: string | undefined\n apiVersion: string | undefined\n licenseKey: string | undefined\n typeDisplayLabels: Record<string, string> | undefined\n typeColumnMode: 'badge' | 'text' | undefined\n titleField: string | Record<string, string> | undefined\n getDocumentBadge:\n | ((\n doc: DocumentWithSeoHealth & Record<string, unknown>,\n ) => {label: string; bgColor?: string; textColor?: string; fontSize?: string} | undefined)\n | undefined\n loadingLicense: string | undefined\n loadingDocuments: string | undefined\n noDocuments: string | undefined\n previewMode: boolean | undefined\n structureTool: string | undefined\n exportEnabled: boolean\n exportFormats: Array<'csv' | 'json'>\n compactStats: boolean\n /** @internal β€” deprecated keys detected at config-resolution time, forwarded to the UI banner */\n deprecationWarnings: DeprecationWarning[]\n}\n\nconst resolveDashboardConfig = (\n healthDashboard: SeoFieldsPluginConfig['healthDashboard'],\n): ResolvedDashboardConfig => {\n const cfg = typeof healthDashboard === 'object' ? healthDashboard : undefined\n // Detect deprecated plugin-level keys and emit console warnings with guidance on updating to the new config structure. Warnings are collected in an array and also passed to the dashboard component for display in a banner.\n const deprecationWarnings: DeprecationWarning[] = []\n\n if (cfg?.display?.typeColumn !== undefined) {\n deprecationWarnings.push({\n key: 'display.typeColumn β†’ showTypeColumn',\n version: V132,\n changelogUrl: CHANGELOG_V132,\n })\n if (cfg.showTypeColumn) {\n console.warn(\n `[sanity-plugin-seofields] Both \"healthDashboard.display.typeColumn\" and \"healthDashboard.showTypeColumn\" are set. \"showTypeColumn\" will take precedence. Please remove \"healthDashboard.display.typeColumn\". See ${CHANGELOG_V132}`,\n )\n } else {\n console.warn(\n `[sanity-plugin-seofields] \"healthDashboard.display.typeColumn\" is deprecated. Use \"healthDashboard.showTypeColumn\" instead. See ${CHANGELOG_V132}`,\n )\n }\n }\n if (cfg?.display?.documentId !== undefined) {\n deprecationWarnings.push({\n key: 'display.documentId β†’ showDocumentId',\n version: V132,\n changelogUrl: CHANGELOG_V132,\n })\n if (cfg.showDocumentId) {\n console.warn(\n `[sanity-plugin-seofields] Both \"healthDashboard.display.documentId\" and \"healthDashboard.showDocumentId\" are set. \"showDocumentId\" will take precedence. Please remove \"healthDashboard.display.documentId\". See ${CHANGELOG_V132}`,\n )\n } else {\n console.warn(\n `[sanity-plugin-seofields] \"healthDashboard.display.documentId\" is deprecated. Use \"healthDashboard.showDocumentId\" instead. See ${CHANGELOG_V132}`,\n )\n }\n }\n if (cfg?.typeLabels) {\n deprecationWarnings.push({\n key: 'typeLabels β†’ typeDisplayLabels',\n version: V132,\n changelogUrl: CHANGELOG_V132,\n })\n if (cfg.typeDisplayLabels) {\n console.warn(\n `[sanity-plugin-seofields] Both \"healthDashboard.typeLabels\" and \"healthDashboard.typeDisplayLabels\" are set. \"typeDisplayLabels\" will take precedence. Please remove \"typeLabels\". See ${CHANGELOG_V132}`,\n )\n } else {\n console.warn(\n `[sanity-plugin-seofields] \"healthDashboard.typeLabels\" is deprecated. Use \"healthDashboard.typeDisplayLabels\" instead. See ${CHANGELOG_V132}`,\n )\n }\n }\n if (cfg?.docBadge) {\n deprecationWarnings.push({\n key: 'docBadge β†’ getDocumentBadge',\n version: V132,\n changelogUrl: CHANGELOG_V132,\n })\n if (cfg?.getDocumentBadge) {\n console.warn(\n `[sanity-plugin-seofields] Both \"healthDashboard.docBadge\" and \"healthDashboard.getDocumentBadge\" are set. \"getDocumentBadge\" will take precedence. Please remove \"docBadge\". See ${CHANGELOG_V132}`,\n )\n } else {\n console.warn(\n `[sanity-plugin-seofields] \"healthDashboard.docBadge\" is deprecated. Use \"healthDashboard.getDocumentBadge\" instead. See ${CHANGELOG_V132}`,\n )\n }\n }\n\n return {\n enabled: healthDashboard !== false,\n toolTitle: cfg?.tool?.title ?? 'SEO Health',\n toolName: cfg?.tool?.name ?? 'seo-health-dashboard',\n icon: cfg?.content?.icon,\n title: cfg?.content?.title,\n description: cfg?.content?.description,\n // New flat keys take precedence; fall back to deprecated display.* for backwards compat\n showTypeColumn: cfg?.showTypeColumn ?? cfg?.display?.typeColumn,\n showDocumentId: cfg?.showDocumentId ?? cfg?.display?.documentId,\n queryTypes: cfg?.query?.types,\n queryRequireSeo: cfg?.query?.requireSeo,\n queryGroq: cfg?.query?.groq,\n apiVersion: cfg?.apiVersion,\n licenseKey: cfg?.licenseKey,\n // New key takes precedence; fall back to deprecated key for backwards compat\n typeDisplayLabels: cfg?.typeDisplayLabels ?? cfg?.typeLabels,\n typeColumnMode: cfg?.typeColumnMode,\n titleField: cfg?.titleField,\n // New key takes precedence; fall back to deprecated key for backwards compat\n getDocumentBadge: cfg?.getDocumentBadge ?? cfg?.docBadge,\n loadingLicense: cfg?.content?.loadingLicense,\n loadingDocuments: cfg?.content?.loadingDocuments,\n noDocuments: cfg?.content?.noDocuments,\n previewMode: cfg?.previewMode,\n structureTool: cfg?.structureTool,\n exportEnabled: (() => {\n const exportCfg = cfg?.export\n if (exportCfg === false) return false\n if (typeof exportCfg === 'object') return exportCfg.enabled ?? true\n return true\n })(),\n exportFormats: (() => {\n const exportCfg = cfg?.export\n if (typeof exportCfg === 'object' && exportCfg.formats) return exportCfg.formats\n return ['csv', 'json'] as Array<'csv' | 'json'>\n })(),\n compactStats: cfg?.compactStats ?? false,\n deprecationWarnings,\n }\n}\n\nconst seofields = definePlugin<SeoFieldsPluginConfig | void>((config = {}) => {\n const {healthDashboard = true} = config as SeoFieldsPluginConfig\n const dash = resolveDashboardConfig(healthDashboard)\n\n const LazySeoHealthTool = React.lazy(() => import('./components/SeoHealthTool'))\n\n const BoundSeoHealthTool = () =>\n React.createElement(\n React.Suspense,\n {fallback: null},\n React.createElement(LazySeoHealthTool, {\n icon: dash.icon,\n title: dash.title,\n description: dash.description,\n showTypeColumn: dash.showTypeColumn,\n showDocumentId: dash.showDocumentId,\n queryTypes: dash.queryTypes,\n queryRequireSeo: dash.queryRequireSeo,\n customQuery: dash.queryGroq,\n apiVersion: dash.apiVersion,\n licenseKey: dash.licenseKey,\n typeDisplayLabels: dash.typeDisplayLabels,\n typeColumnMode: dash.typeColumnMode,\n titleField: dash.titleField,\n getDocumentBadge: dash.getDocumentBadge,\n loadingLicense: dash.loadingLicense,\n loadingDocuments: dash.loadingDocuments,\n noDocuments: dash.noDocuments,\n previewMode: dash.previewMode,\n structureTool: dash.structureTool,\n exportEnabled: dash.exportEnabled,\n exportFormats: dash.exportFormats,\n compactStats: dash.compactStats,\n _deprecationWarnings: dash.deprecationWarnings,\n }),\n )\n\n return {\n name: 'sanity-plugin-seofields',\n schema: {\n types: types(config as SeoFieldsPluginConfig),\n },\n ...(dash.enabled && {\n tools: [\n {\n name: dash.toolName,\n title: dash.toolTitle,\n component: BoundSeoHealthTool,\n icon: () => 'πŸ“Š',\n },\n ],\n }),\n }\n})\n\nexport default seofields\n","import React from 'react'\nimport type {ComponentBuilder, StructureBuilder} from 'sanity/structure'\n\nimport type {SeoHealthDashboardProps} from './SeoHealthDashboard'\n\nconst LazySeoHealthDashboard = React.lazy(() => import('./SeoHealthDashboard'))\n\n/**\n * Options accepted by `createSeoHealthPane`.\n * All props from `SeoHealthDashboardProps` are supported.\n *\n * `licenseKey` is **required** β€” the dashboard will not render without it.\n */\nexport interface SeoHealthPaneOptions extends Omit<SeoHealthDashboardProps, 'customQuery'> {\n /** Required license key (format: `SEOF-XXXX-XXXX-XXXX`). */\n licenseKey: string\n /**\n * A fully custom GROQ query used to fetch documents for the dashboard.\n * The query must return documents with at least: `_id`, `_type`, `title`, `seo`, `_updatedAt`.\n *\n * Takes precedence over `queryTypes` when both are provided.\n *\n * @example\n * query: `*[_type in [\"post\",\"page\"] && defined(seo)]{ _id, _type, title, slug, seo, _updatedAt }`\n */\n query?: string\n}\n\n// function isStructureBuilder(arg: unknown): arg is StructureBuilder {\n// return (\n// arg !== null &&\n// typeof arg === 'object' &&\n// typeof (arg as StructureBuilder).component === 'function' &&\n// typeof (arg as StructureBuilder).document === 'function'\n// )\n// }\n\n/**\n * Creates a desk-structure pane for the SEO Health Dashboard.\n *\n * Returns a **`ComponentBuilder`** with a built-in `.child()` resolver so that\n * clicking any document row opens the document editor as a split pane to the right.\n *\n * Use it **directly** as the `.child()` value β€” do **not** wrap it in `S.component()`.\n *\n * ```ts\n * // sanity.config.ts\n * structure: (S) =>\n * S.list().items([\n * S.listItem()\n * .title('SEO Health')\n * .child(\n * createSeoHealthPane(S, {\n * licenseKey: 'SEOF-XXXX-XXXX-XXXX',\n * query: `*[_type == \"post\" && defined(seo)]{ _id, _type, title, slug, seo, _updatedAt }`,\n * })\n * ),\n * ])\n * ```\n */\nexport function createSeoHealthPane(\n optionsOrS: StructureBuilder,\n optionsWhenS: SeoHealthPaneOptions,\n): ComponentBuilder {\n // ── Two-arg form: structure builder passed as first arg ──────────────────\n const S = optionsOrS\n const {query, openInPane = true, title: paneTitle, ...rest} = optionsWhenS ?? {}\n\n const SeoHealthPane: React.FC = () => (\n <React.Suspense fallback={null}>\n <LazySeoHealthDashboard\n customQuery={query}\n openInPane={openInPane}\n title={paneTitle}\n {...rest}\n />\n </React.Suspense>\n )\n SeoHealthPane.displayName = 'SeoHealthPane'\n\n // Wire up the child resolver so ChildLink URLs resolve to the document editor\n return (S.component(SeoHealthPane) as ComponentBuilder)\n .title(paneTitle ?? 'SEO Health')\n .child((docId: string, {params}: {params: Record<string, string | undefined>}) => {\n const builder = S.document().documentId(docId)\n return params?.type ? builder.schemaType(params.type) : builder\n })\n}\n\nexport default createSeoHealthPane\n","// Import the plugin\nimport seofields from './plugin'\n\n// Default export the plugin\nexport default seofields\n\n// Re-export everything from plugin.ts\nexport * from './plugin'\n\n// Export schema types for external use\nexport {default as seoFieldsSchema} from './schemas'\nexport {default as allSchemas} from './schemas/types'\nexport {default as baseMetaSchema} from './schemas/types/baseMeta'\nexport {default as metaAttributeSchema} from './schemas/types/metaAttribute'\nexport {default as metaTagSchema} from './schemas/types/metaTag'\nexport {default as openGraphSchema} from './schemas/types/openGraph'\nexport {default as robotsSchema} from './schemas/types/robots'\nexport {default as twitterSchema} from './schemas/types/twitter'\n\n// Export dashboard factory (lazy β€” avoids styled-components at import time)\nexport type {SeoHealthPaneOptions} from './components/SeoHealthPane'\nexport {createSeoHealthPane} from './components/SeoHealthPane'\n\n// Export types\nexport type {DocumentWithSeoHealth, SeoHealthMetrics, SeoHealthStatus} from './types'\n"]}