@madebywild/sanity-richtext-field 0.1.25 → 0.1.27

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.cjs CHANGED
@@ -21,13 +21,13 @@ const presets = {
21
21
  basic: {
22
22
  size: "sm",
23
23
  initiallyActive: !0,
24
- whitelist: ["wild.richtext.decorator.em", "wild.richtext.decorator.strong", "wild.richtext.annotation.link"]
24
+ allowedParts: ["wild.richtext.decorator.em", "wild.richtext.decorator.strong", "wild.richtext.annotation.link"]
25
25
  },
26
26
  full: {
27
27
  size: "lg",
28
28
  initiallyActive: !1,
29
29
  // Empty blacklist means "enable all".
30
- blacklist: []
30
+ disallowedParts: []
31
31
  }
32
32
  };
33
33
  function handleListKind(entry, findNeedle) {
@@ -71,12 +71,12 @@ function RichtextInput({
71
71
  ...mainOptions
72
72
  } = schemaOptions ?? {};
73
73
  return tsDeepmerge.merge(presetOptions, mainOptions);
74
- }, [schemaOptions, presetOptions]), initiallyActive = options?.initiallyActive ?? !1, height = options?.size && options.size in sizeToHeightMap ? sizeToHeightMap[options.size] : options?.size, whitelist = options?.whitelist, blacklist = options?.blacklist;
75
- whitelist && blacklist && console.warn("Wild Sanity Rich Text Field: Both whitelist and blacklist are set. Whitelist will take precedence.");
74
+ }, [schemaOptions, presetOptions]), initiallyActive = options?.initiallyActive ?? !1, height = options?.size && options.size in sizeToHeightMap ? sizeToHeightMap[options.size] : options?.size, allowedParts = options?.allowedParts, disallowedParts = options?.disallowedParts;
75
+ allowedParts && disallowedParts && console.warn("Wild Sanity Rich Text Field: Both `allowedParts` and `disallowedParts` are set. `allowedParts` will take precedence.");
76
76
  const filterPartsBy = React__namespace.useCallback((parts2, findNeedle) => parts2?.filter((b) => {
77
77
  const needle = findNeedle(b);
78
- return needle ? whitelist ? whitelist.includes(needle) : blacklist ? !blacklist.includes(needle) : !1 : !0;
79
- }), [whitelist, blacklist]), enabledParts = React__namespace.useMemo(() => {
78
+ return needle ? allowedParts ? allowedParts.includes(needle) : disallowedParts ? !disallowedParts.includes(needle) : !1 : !0;
79
+ }), [allowedParts, disallowedParts]), enabledParts = React__namespace.useMemo(() => {
80
80
  const blocks2 = filterPartsBy(richtextConfig.blocks, (s) => s.name), spans2 = filterPartsBy(richtextConfig.spans, (s_0) => s_0.name), lists2 = filterPartsBy(richtextConfig.lists, (s_1) => s_1.value), annotations2 = filterPartsBy(richtextConfig.annotations, (s_2) => s_2.name), decorators2 = filterPartsBy(richtextConfig.decorators, (s_3) => s_3.value), styles2 = filterPartsBy(richtextConfig.styles, (s_4) => s_4.value), normalizedStyles = [{
81
81
  value: "normal",
82
82
  title: "Normal"
@@ -229,7 +229,6 @@ const typeName = "wild.richtext", ColorText = styledComponents.styled.span`
229
229
  title: "Link",
230
230
  icon: icons.LinkIcon,
231
231
  options: {
232
- noCustomText: !0,
233
232
  collapsed: !1,
234
233
  collapsible: !1
235
234
  }
@@ -251,7 +250,7 @@ const typeName = "wild.richtext", ColorText = styledComponents.styled.span`
251
250
  name: "appMedia",
252
251
  type: "wild.media",
253
252
  options: {
254
- features: ["customOptions", "customRatio"]
253
+ extensions: ["customOptions", "customRatio"]
255
254
  }
256
255
  }), sanity.defineField({
257
256
  name: "caption",
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/presets.tsx","../src/input.tsx","../src/types.tsx","../src/parts/annotations/color.tsx","../src/parts/annotations/link.tsx","../src/parts/annotations/index.tsx","../src/parts/blocks/media-block.tsx","../src/parts/blocks/index.tsx","../src/parts/decorators/index.tsx","../src/parts/lists/index.tsx","../src/parts/spans/icon.tsx","../src/parts/spans/media.tsx","../src/parts/spans/index.tsx","../src/parts/styles/index.tsx","../src/parts/index.tsx","../src/index.tsx"],"sourcesContent":["import type { Presets } from \"./types\";\n\n// Presets are predefined configurations for the rich text field.\n// They allow users to quickly set up the field with common settings.\n// Users can still override these presets with custom options.\nexport const presets = {\n basic: {\n size: \"sm\",\n initiallyActive: true,\n whitelist: [\"wild.richtext.decorator.em\", \"wild.richtext.decorator.strong\", \"wild.richtext.annotation.link\"],\n } as const,\n full: {\n size: \"lg\",\n initiallyActive: false,\n // Empty blacklist means \"enable all\".\n blacklist: [],\n } as const,\n} as const satisfies Presets;\n","import * as React from \"react\";\nimport type {\n ArrayOfObjectsInputProps,\n ArraySchemaType,\n BlockMarksDefinition,\n ObjectField,\n ObjectSchemaType,\n SchemaType,\n} from \"sanity\";\nimport { merge } from \"ts-deepmerge\";\nimport type { Part } from \"./parts\";\nimport { presets } from \"./presets\";\nimport type { FieldOptions, RichtextConfig, Size } from \"./types\";\n\nfunction handleListKind<E extends ObjectField<ArraySchemaType>>(entry: E, findNeedle: (needle: string) => boolean) {\n const list = entry.type?.options?.list;\n if (!list) return entry;\n const filteredList = list.filter((s) => findNeedle((s as { value: string }).value));\n return { ...entry, type: { ...entry.type, options: { ...entry.type.options, list: filteredList } } };\n}\n\nfunction handleOfKind<E extends ObjectField<ArraySchemaType>>(entry: E, findNeedle: (needle: string) => boolean) {\n const list = entry.type?.of;\n if (!list) return entry;\n const filteredOf = list.filter((a: { name: string }) => findNeedle(a.name));\n return { ...entry, type: { ...entry.type, of: filteredOf } };\n}\n\nconst sizeToHeightMap = {\n sm: \"10rem\",\n lg: \"50vh\",\n} as const satisfies Record<Size, string>;\n\nfunction RichtextInput({\n richtextConfig,\n ...props\n}: ArrayOfObjectsInputProps & {\n richtextConfig: RichtextConfig;\n}) {\n const schemaOptions = props.schemaType.options as FieldOptions | undefined;\n const presetOptions = schemaOptions?.preset ? presets[schemaOptions.preset] : {};\n\n const options = React.useMemo(() => {\n // The preset option is only used to fetch the preset options.\n // We can exclude it from the main options.\n const { preset: _, ...mainOptions } = schemaOptions ?? {};\n return merge(presetOptions, mainOptions);\n }, [schemaOptions, presetOptions]);\n\n const initiallyActive = options?.initiallyActive ?? false;\n\n // Height can either be a predefined size or a custom string value.\n // In the case of a custom string value, we use it as is.\n const height =\n options?.size && options.size in sizeToHeightMap\n ? sizeToHeightMap[options.size as keyof typeof sizeToHeightMap]\n : options?.size;\n\n const whitelist = options?.whitelist;\n const blacklist = options?.blacklist;\n if (whitelist && blacklist) {\n console.warn(\"Wild Sanity Rich Text Field: Both whitelist and blacklist are set. Whitelist will take precedence.\");\n }\n\n const filterPartsBy = React.useCallback(\n <P extends unknown[]>(parts: P | undefined, findNeedle: (s: P[number]) => string | undefined) => {\n const filtered = parts?.filter((b) => {\n const needle = findNeedle(b) as Part | undefined;\n // This is undefined behavior. To not break user expectations, we keep the item.\n if (!needle) return true;\n if (whitelist) return whitelist.includes(needle);\n if (blacklist) return !blacklist.includes(needle);\n // By default the rich text field is a minimal as possible.\n return false;\n });\n\n return filtered as P;\n },\n [whitelist, blacklist]\n );\n\n const enabledParts = React.useMemo(() => {\n const blocks = filterPartsBy(richtextConfig.blocks, (s) => s.name);\n const spans = filterPartsBy(richtextConfig.spans, (s) => s.name);\n const lists = filterPartsBy(richtextConfig.lists, (s) => s.value);\n const annotations = filterPartsBy(richtextConfig.annotations, (s) => s.name);\n const decorators = filterPartsBy(richtextConfig.decorators, (s) => s.value);\n const styles = filterPartsBy(richtextConfig.styles, (s) => s.value);\n\n // Always include the \"Normal\" style. It acts as a way for the users to reset the style.\n const normalizedStyles = [{ value: \"normal\", title: \"Normal\" }, ...styles];\n\n return { blocks, spans, lists, annotations, decorators, styles: normalizedStyles };\n }, [filterPartsBy]);\n\n const reshapeSchemaTypes = React.useCallback(\n (schema: ObjectSchemaType) => {\n // We only reshape the built-in block type children.\n if (schema.name !== \"block\") return schema;\n\n return {\n ...schema,\n fields: schema.fields?.map((f) => {\n const field = f as ObjectField<ArraySchemaType>;\n\n switch (field.name) {\n // Headings, Normal, Quote, etc.\n case \"style\":\n return handleListKind(field, (_) => enabledParts.styles.some((b) => b.value === _));\n // Ul, Ol, etc.\n case \"listItem\":\n return handleListKind(field, (_) => enabledParts.lists.some((b) => b.value === _));\n // Links, Colors, etc.\n case \"markDefs\":\n return handleOfKind(field, (_) => enabledParts.annotations.some((b) => b.name === _));\n // Text content.\n case \"children\": {\n // Always enable span type for text content.\n const spans = [...enabledParts.spans, { name: \"span\" }];\n const filtered = handleOfKind(field, (_) => spans.some((b) => b.name === _));\n\n return {\n ...filtered,\n type: {\n ...filtered.type,\n // Inline markers within the text content.\n of: filtered.type.of?.map((t: SchemaType) => {\n // Span is a reserved name in Sanity for text spans.\n // If the type is not a span, it means its a custom object type, so we return it as is.\n if (t.name !== \"span\") return t;\n\n const span = t as Partial<BlockMarksDefinition>;\n const annotations = span.annotations?.filter((a) => enabledParts.annotations.some((b) => b.name === a.name));\n const decorators = span.decorators?.filter((d) => enabledParts.decorators.some((b) => b.value === d.value));\n return { ...t, annotations, decorators };\n }),\n },\n };\n }\n default:\n return field;\n }\n }),\n };\n },\n [enabledParts]\n );\n\n const patchedSchemaType = React.useMemo(() => {\n const of = props.schemaType?.of;\n if (!Array.isArray(of)) return props.schemaType;\n\n // Just in case the reshaping fails, we return the original schema type.\n try {\n const filtered = of.filter((s) => {\n // A valid portabletext field must always contain the built-in block type.\n // Any other item is a custom block and must be explicitly enabled.\n return s.name === \"block\" || enabledParts.blocks.some((b) => b.name === s.name);\n });\n\n return {\n ...props.schemaType,\n of: filtered.map((s) => reshapeSchemaTypes(s as ObjectSchemaType)),\n };\n } catch (e) {\n console.error(\"Wild Sanity Rich Text Field: Error while reshaping schema types.\", e);\n return props.schemaType;\n }\n }, [props.schemaType, enabledParts.blocks, reshapeSchemaTypes]);\n\n const enabledPartsCount = React.useMemo(() => {\n return Object.values(enabledParts).reduce((acc, curr) => acc + curr.length, 0);\n }, [enabledParts]);\n\n return (\n <>\n <style>{`\n [data-wild-richtext-field] [data-testid=\"pt-editor\"][data-fullscreen=\"false\"] {\n height: var(--pt-editor-height, initial);\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.bullet\"] [data-list-prefix] > span::before,\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.number\"] [data-list-prefix] > span::before {\n font-size: 1.0em;\n display: inline-block;\n padding-top: 2px;\n color: inherit;\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.bullet\"] [data-list-prefix] > span::before {\n content: \"•\";\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.number\"] [data-list-prefix] > span::before {\n content: counter(list-level-1) \". \";\n }\n `}</style>\n <div data-wild-richtext-field style={{ \"--pt-editor-height\": height ?? sizeToHeightMap.sm } as React.CSSProperties}>\n {props.renderDefault({\n ...props,\n initialActive: initiallyActive,\n displayInlineChanges: false,\n // If the only enabled part is a style part, its the default \"Normal\" style. No need to show the toolbar.\n hideToolbar: enabledPartsCount === 0 || (enabledPartsCount === 1 && enabledParts.styles.length === 1),\n // @ts-expect-error: schemaType.of is too narrow. The runtime type is valid.\n schemaType: patchedSchemaType,\n })}\n </div>\n </>\n );\n}\n\nexport { RichtextInput };\n","import type {\n ArrayDefinition,\n ArrayOfType,\n ArrayOptions,\n BlockDecoratorDefinition,\n BlockListDefinition,\n BlockStyleDefinition,\n} from \"sanity\";\nimport type { Part } from \"./parts\";\n\n/** @public */\nexport const typeName = \"wild.richtext\" as const;\n\nexport type RichtextConfig = {\n blocks?: ArrayOfType<\"object\">[];\n spans?: ArrayOfType<\"object\">[];\n styles?: BlockStyleDefinition[];\n lists?: BlockListDefinition[];\n annotations?: ArrayOfType<\"object\">[];\n decorators?: BlockDecoratorDefinition[];\n};\n\n/** @public */\nexport type PluginConfig = RichtextConfig & {\n spellCheck?: boolean;\n};\n\n// Presets are collections of commonly used field options.\n// They allow to quickly set up the richtext field with a predefined set of options.\n// Users can still override individual options when using a preset.\ntype Preset = Omit<FieldOptions, keyof ArrayOptions | \"preset\">;\nexport type Presets = Record<\"basic\" | \"full\", Preset>;\n\nexport type Size = \"sm\" | \"lg\";\n\n/** @public */\nexport type FieldOptions = ArrayOptions & {\n // The user can provide custom sizes as strings, so we need to allow for that.\n // But we also want to provide type safety for the known sizes.\n size?: Size | (string & {});\n preset?: keyof Presets;\n initiallyActive?: boolean;\n // The user can provide custom parts as strings, so we need to allow for that.\n // But we also want to provide type safety for the known parts.\n whitelist?: (Part | (string & {}))[];\n blacklist?: (Part | (string & {}))[];\n};\n\n// Add the custom field definition to Sanity's intrinsic definitions\n// so that type checking works correctly when using this field type.\ndeclare module \"sanity\" {\n export interface IntrinsicDefinitions {\n [typeName]: Omit<ArrayDefinition, \"type\" | \"of\" | \"options\"> & {\n type: typeof typeName;\n options?: FieldOptions;\n };\n }\n}\n","import { defineField } from \"sanity\";\nimport { styled } from \"styled-components\";\nimport { typeName } from \"../../types\";\n\nconst ColorText = styled.span<{ color?: string }>`\n & > span {\n background-color: inherit;\n border-bottom: unset;\n color: ${({ color = \"inherit\" }) => color};\n }\n`;\n\nexport const textColor = defineField({\n type: \"object\",\n name: `${typeName}.annotation.textColor`,\n title: \"Text Color\",\n icon: () => <>🖋</>,\n fields: [defineField({ name: \"color\", type: \"wild.color\" })],\n components: {\n annotation: (props) => {\n // @ts-expect-error: Sanity types are not aware of the color field structure.\n const color = props.value?.color?.value as string;\n return <ColorText color={color}>{props.renderDefault(props)}</ColorText>;\n },\n },\n});\n\nconst ColorBg = styled.span<{ color?: string }>`\n & > span {\n background-color: ${({ color = \"inherit\" }) => color};\n border-bottom: unset;\n color: inherit;\n }\n`;\n\nexport const highlightColor = defineField({\n type: \"object\",\n name: `${typeName}.annotation.highlightColor`,\n title: \"Highlight Color\",\n icon: () => <>🖍</>,\n fields: [defineField({ name: \"color\", type: \"wild.color\" })],\n components: {\n annotation: (props) => {\n // @ts-expect-error: Sanity types are not aware of the color field structure.\n const color = props.value?.color?.value as string;\n return <ColorBg color={color}>{props.renderDefault(props)}</ColorBg>;\n },\n },\n});\n","import { LinkIcon } from \"@sanity/icons\";\nimport { defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const link = defineField({\n type: \"wild.link\",\n name: `${typeName}.annotation.link`,\n title: \"Link\",\n icon: LinkIcon,\n options: {\n noCustomText: true,\n collapsed: false,\n collapsible: false,\n },\n});\n","import { highlightColor, textColor } from \"./color\";\nimport { link } from \"./link\";\n\nexport const annotations = {\n link,\n textColor,\n highlightColor,\n} as const;\n","import { prepareMediaPreview, selectMediaPreview } from \"@madebywild/sanity-media-field\";\nimport { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const media = defineArrayMember({\n name: `${typeName}.block.media`,\n type: \"object\",\n title: \"Media Block\",\n description: \"Embed block video or image content.\",\n icon: () => <>🖼️</>,\n fields: [\n defineField({\n title: \"Wrap\",\n name: \"wrapping\",\n type: \"wild.wrapping\",\n }),\n defineField({\n name: \"appMedia\",\n type: \"wild.media\",\n options: {\n features: [\"customOptions\", \"customRatio\"],\n },\n }),\n defineField({\n name: \"caption\",\n type: \"text\",\n rows: 2,\n description: \"Add a caption for the media.\",\n }),\n ],\n preview: {\n select: selectMediaPreview(\"appMedia\"),\n prepare: (props) => prepareMediaPreview(props),\n },\n});\n","import { media } from \"./media-block\";\n\nexport const blocks = {\n media,\n} as const;\n","import { BoldIcon, CodeIcon, ItalicIcon } from \"@sanity/icons\";\nimport type { BlockDecoratorDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst strong = {\n title: \"Strong\",\n value: `${typeName}.decorator.strong`,\n icon: BoldIcon,\n component: ({ children }) => <strong>{children}</strong>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst em = {\n title: \"Emphasis\",\n value: `${typeName}.decorator.em`,\n icon: ItalicIcon,\n component: ({ children }) => <em>{children}</em>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst code = {\n title: \"Code\",\n value: `${typeName}.decorator.code`,\n icon: CodeIcon,\n component: ({ children }) => <code>{children}</code>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst sup = {\n title: \"Sup\",\n value: `${typeName}.decorator.sup`,\n icon: () => <sup>[1]</sup>,\n component: ({ children }) => <sup style={{ verticalAlign: \"super\" }}>{children}</sup>,\n} as const satisfies BlockDecoratorDefinition;\n\nexport const decorators = {\n strong,\n em,\n code,\n sup,\n} as const;\n","import { OlistIcon, UlistIcon } from \"@sanity/icons\";\nimport type { BlockListDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst bullet = {\n title: \"Bullet\",\n value: `${typeName}.list.bullet`,\n icon: UlistIcon,\n} as const satisfies BlockListDefinition;\n\nconst number = {\n title: \"Number\",\n value: `${typeName}.list.number`,\n icon: OlistIcon,\n} as const satisfies BlockListDefinition;\n\nexport const lists = {\n bullet,\n number,\n} as const;\n","import * as React from \"react\";\nimport { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const icon = defineArrayMember({\n name: `${typeName}.span.icon`,\n type: \"object\",\n title: \"Icon\",\n description: \"Insert an icon.\",\n icon: () => <>🧿</>,\n fields: [defineField({ name: \"icon\", type: \"wild.icon\" })],\n components: {\n // This is the inline-preview in the PortableText editor.\n // It gets its props from the prepare function below.\n preview: (props) => {\n return React.isValidElement(props.media) ? props.media : props.fallbackTitle;\n },\n },\n preview: {\n select: {\n icon: \"icon\",\n },\n prepare({ icon }) {\n return {\n media: (\n <span role=\"img\" className=\"inline-block size-[1em] shrink-0 text-current\" title={icon ?? \"Icon\"}>\n 🧿\n </span>\n ),\n };\n },\n },\n});\n","import { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const media = defineArrayMember({\n name: `${typeName}.span.media`,\n type: \"object\",\n title: \"Inline Media\",\n description: \"Embed inline video or image content.\",\n icon: () => <>🫧</>,\n fields: [\n defineField({\n name: \"media\",\n type: \"wild.media\",\n }),\n ],\n components: {\n // This is the inline-preview in the PortableText editor.\n preview: (props) => {\n const icons = {\n video: <>🎥</>,\n image: <>🖼️</>,\n lottie: <>🌀</>,\n rive: <>🍭</>,\n };\n\n // @ts-expect-error: It gets its props from the prepare function below.\n return icons[props.type as keyof typeof icons] || <>🖼️</>;\n },\n },\n preview: {\n select: {\n type: \"media.type\",\n },\n },\n});\n","import { icon } from \"./icon\";\nimport { media } from \"./media\";\n\nexport const spans = {\n icon,\n media,\n} as const;\n","import type { BlockStyleDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst h2 = {\n title: \"Heading 2\",\n value: `${typeName}.style.h2`,\n component: ({ children }) => (\n <h2\n style={{\n fontSize: \"2.0625rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(41 / 33)\",\n }}\n >\n {children}\n </h2>\n ),\n} as const satisfies BlockStyleDefinition;\n\nconst h3 = {\n title: \"Heading 3\",\n value: `${typeName}.style.h3`,\n component: ({ children }) => (\n <h3\n style={{\n fontSize: \"1.6875rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(35 / 27)\",\n }}\n >\n {children}\n </h3>\n ),\n} as const satisfies BlockStyleDefinition;\n\nconst h4 = {\n title: \"Heading 4\",\n value: `${typeName}.style.h4`,\n component: ({ children }) => (\n <h4\n style={{\n fontSize: \"1.3125rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(29 / 21)\",\n }}\n >\n {children}\n </h4>\n ),\n} as const satisfies BlockStyleDefinition;\n\nexport const styles = {\n h2,\n h3,\n h4,\n} as const;\n","import { annotations } from \"./annotations\";\nimport { blocks } from \"./blocks\";\nimport { decorators } from \"./decorators\";\nimport { lists } from \"./lists\";\nimport { spans } from \"./spans\";\nimport { styles } from \"./styles\";\n\nconst parts = {\n annotations,\n blocks,\n decorators,\n lists,\n spans,\n styles,\n} as const;\n\ntype Parts = typeof parts;\ntype Part =\n | Parts[\"annotations\"][keyof Parts[\"annotations\"]][\"name\"]\n | Parts[\"blocks\"][keyof Parts[\"blocks\"]][\"name\"]\n | Parts[\"decorators\"][keyof Parts[\"decorators\"]][\"value\"]\n | Parts[\"lists\"][keyof Parts[\"lists\"]][\"value\"]\n | Parts[\"spans\"][keyof Parts[\"spans\"]][\"name\"]\n | Parts[\"styles\"][keyof Parts[\"styles\"]][\"value\"];\n\nexport { parts, type Part };\n","import type { ArrayOfObjectsInputProps } from \"sanity\";\nimport { defineArrayMember, definePlugin, defineType } from \"sanity\";\nimport { RichtextInput } from \"./input\";\nimport { parts } from \"./parts\";\nimport { type FieldOptions, type PluginConfig, typeName } from \"./types\";\n\n/** @public */\nconst wildSanityRichtextFieldPlugin = definePlugin<PluginConfig>((config) => {\n const userSpans = config?.spans ?? [];\n const userLists = config?.lists ?? [];\n const userBlocks = config?.blocks ?? [];\n const userStyles = config?.styles ?? [];\n const userDecorators = config?.decorators ?? [];\n const userAnnotations = config?.annotations ?? [];\n\n const richtextConfig = {\n blocks: [...userBlocks, ...Object.values(parts.blocks)],\n spans: [...userSpans, ...Object.values(parts.spans)],\n lists: [...userLists, ...Object.values(parts.lists)],\n styles: [...userStyles, ...Object.values(parts.styles)],\n decorators: [...userDecorators, ...Object.values(parts.decorators)],\n annotations: [...userAnnotations, ...Object.values(parts.annotations)],\n };\n\n return {\n name: \"@madebywild/sanity-richtext-field\",\n schema: {\n types: [\n defineType({\n name: typeName,\n type: \"array\",\n title: \"Rich Text\",\n description: \"Rich text content with formatting options.\",\n icon: () => <>⌨️</>,\n components: {\n input: (props: ArrayOfObjectsInputProps) => <RichtextInput richtextConfig={richtextConfig} {...props} />,\n },\n of: [\n ...richtextConfig.blocks,\n defineArrayMember({\n type: \"block\",\n options: {\n spellCheck: config?.spellCheck ?? true,\n unstable_whitespaceOnPasteMode: \"normalize\",\n },\n of: richtextConfig.spans,\n styles: richtextConfig.styles,\n lists: richtextConfig.lists,\n marks: {\n annotations: richtextConfig.annotations,\n decorators: richtextConfig.decorators,\n },\n }),\n ],\n }),\n ],\n },\n };\n});\n\nexport { wildSanityRichtextFieldPlugin, typeName, type PluginConfig, type FieldOptions };\n"],"names":["presets","basic","size","initiallyActive","whitelist","full","blacklist","handleListKind","entry","findNeedle","list","type","options","filteredList","filter","s","value","handleOfKind","of","filteredOf","a","name","sizeToHeightMap","sm","lg","RichtextInput","richtextConfig","props","schemaOptions","schemaType","presetOptions","preset","React","useMemo","_","mainOptions","merge","height","console","warn","filterPartsBy","useCallback","parts","b","needle","includes","enabledParts","blocks","spans","lists","annotations","decorators","styles","normalizedStyles","title","reshapeSchemaTypes","schema","fields","map","f","field","some","filtered","t","span","d","patchedSchemaType","Array","isArray","e","error","enabledPartsCount","Object","values","reduce","acc","curr","length","jsxs","Fragment","jsx","renderDefault","initialActive","displayInlineChanges","hideToolbar","typeName","ColorText","styled","color","textColor","defineField","icon","components","annotation","ColorBg","highlightColor","link","LinkIcon","noCustomText","collapsed","collapsible","media","defineArrayMember","description","features","rows","preview","select","selectMediaPreview","prepare","prepareMediaPreview","strong","BoldIcon","component","children","em","ItalicIcon","code","CodeIcon","sup","verticalAlign","bullet","UlistIcon","number","OlistIcon","isValidElement","fallbackTitle","video","image","lottie","rive","h2","fontSize","fontWeight","lineHeight","h3","h4","wildSanityRichtextFieldPlugin","definePlugin","config","userSpans","userLists","userBlocks","userStyles","userDecorators","userAnnotations","types","defineType","input","spellCheck","unstable_whitespaceOnPasteMode","marks"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/presets.tsx","../src/input.tsx","../src/types.tsx","../src/parts/annotations/color.tsx","../src/parts/annotations/link.tsx","../src/parts/annotations/index.tsx","../src/parts/blocks/media-block.tsx","../src/parts/blocks/index.tsx","../src/parts/decorators/index.tsx","../src/parts/lists/index.tsx","../src/parts/spans/icon.tsx","../src/parts/spans/media.tsx","../src/parts/spans/index.tsx","../src/parts/styles/index.tsx","../src/parts/index.tsx","../src/index.tsx"],"sourcesContent":["import type { Presets } from \"./types\";\n\n// Presets are predefined configurations for the rich text field.\n// They allow users to quickly set up the field with common settings.\n// Users can still override these presets with custom options.\nexport const presets = {\n basic: {\n size: \"sm\",\n initiallyActive: true,\n allowedParts: [\"wild.richtext.decorator.em\", \"wild.richtext.decorator.strong\", \"wild.richtext.annotation.link\"],\n } as const,\n full: {\n size: \"lg\",\n initiallyActive: false,\n // Empty blacklist means \"enable all\".\n disallowedParts: [],\n } as const,\n} as const satisfies Presets;\n","import * as React from \"react\";\nimport type {\n ArrayOfObjectsInputProps,\n ArraySchemaType,\n BlockMarksDefinition,\n ObjectField,\n ObjectSchemaType,\n SchemaType,\n} from \"sanity\";\nimport { merge } from \"ts-deepmerge\";\nimport type { Part } from \"./parts\";\nimport { presets } from \"./presets\";\nimport type { FieldOptions, RichtextConfig, Size } from \"./types\";\n\nfunction handleListKind<E extends ObjectField<ArraySchemaType>>(entry: E, findNeedle: (needle: string) => boolean) {\n const list = entry.type?.options?.list;\n if (!list) return entry;\n const filteredList = list.filter((s) => findNeedle((s as { value: string }).value));\n return { ...entry, type: { ...entry.type, options: { ...entry.type.options, list: filteredList } } };\n}\n\nfunction handleOfKind<E extends ObjectField<ArraySchemaType>>(entry: E, findNeedle: (needle: string) => boolean) {\n const list = entry.type?.of;\n if (!list) return entry;\n const filteredOf = list.filter((a: { name: string }) => findNeedle(a.name));\n return { ...entry, type: { ...entry.type, of: filteredOf } };\n}\n\nconst sizeToHeightMap = {\n sm: \"10rem\",\n lg: \"50vh\",\n} as const satisfies Record<Size, string>;\n\nfunction RichtextInput({\n richtextConfig,\n ...props\n}: ArrayOfObjectsInputProps & {\n richtextConfig: RichtextConfig;\n}) {\n const schemaOptions = props.schemaType.options as FieldOptions | undefined;\n const presetOptions = schemaOptions?.preset ? presets[schemaOptions.preset] : {};\n\n const options = React.useMemo(() => {\n // The preset option is only used to fetch the preset options.\n // We can exclude it from the main options.\n const { preset: _, ...mainOptions } = schemaOptions ?? {};\n return merge(presetOptions, mainOptions);\n }, [schemaOptions, presetOptions]);\n\n const initiallyActive = options?.initiallyActive ?? false;\n\n // Height can either be a predefined size or a custom string value.\n // In the case of a custom string value, we use it as is.\n const height =\n options?.size && options.size in sizeToHeightMap\n ? sizeToHeightMap[options.size as keyof typeof sizeToHeightMap]\n : options?.size;\n\n const allowedParts = options?.allowedParts;\n const disallowedParts = options?.disallowedParts;\n if (allowedParts && disallowedParts) {\n console.warn(\n \"Wild Sanity Rich Text Field: Both `allowedParts` and `disallowedParts` are set. `allowedParts` will take precedence.\"\n );\n }\n\n const filterPartsBy = React.useCallback(\n <P extends unknown[]>(parts: P | undefined, findNeedle: (s: P[number]) => string | undefined) => {\n const filtered = parts?.filter((b) => {\n const needle = findNeedle(b) as Part | undefined;\n // This is undefined behavior. To not break user expectations, we keep the item.\n if (!needle) return true;\n if (allowedParts) return allowedParts.includes(needle);\n if (disallowedParts) return !disallowedParts.includes(needle);\n // By default the rich text field is a minimal as possible.\n return false;\n });\n\n return filtered as P;\n },\n [allowedParts, disallowedParts]\n );\n\n const enabledParts = React.useMemo(() => {\n const blocks = filterPartsBy(richtextConfig.blocks, (s) => s.name);\n const spans = filterPartsBy(richtextConfig.spans, (s) => s.name);\n const lists = filterPartsBy(richtextConfig.lists, (s) => s.value);\n const annotations = filterPartsBy(richtextConfig.annotations, (s) => s.name);\n const decorators = filterPartsBy(richtextConfig.decorators, (s) => s.value);\n const styles = filterPartsBy(richtextConfig.styles, (s) => s.value);\n\n // Always include the \"Normal\" style. It acts as a way for the users to reset the style.\n const normalizedStyles = [{ value: \"normal\", title: \"Normal\" }, ...styles];\n\n return { blocks, spans, lists, annotations, decorators, styles: normalizedStyles };\n }, [filterPartsBy]);\n\n const reshapeSchemaTypes = React.useCallback(\n (schema: ObjectSchemaType) => {\n // We only reshape the built-in block type children.\n if (schema.name !== \"block\") return schema;\n\n return {\n ...schema,\n fields: schema.fields?.map((f) => {\n const field = f as ObjectField<ArraySchemaType>;\n\n switch (field.name) {\n // Headings, Normal, Quote, etc.\n case \"style\":\n return handleListKind(field, (_) => enabledParts.styles.some((b) => b.value === _));\n // Ul, Ol, etc.\n case \"listItem\":\n return handleListKind(field, (_) => enabledParts.lists.some((b) => b.value === _));\n // Links, Colors, etc.\n case \"markDefs\":\n return handleOfKind(field, (_) => enabledParts.annotations.some((b) => b.name === _));\n // Text content.\n case \"children\": {\n // Always enable span type for text content.\n const spans = [...enabledParts.spans, { name: \"span\" }];\n const filtered = handleOfKind(field, (_) => spans.some((b) => b.name === _));\n\n return {\n ...filtered,\n type: {\n ...filtered.type,\n // Inline markers within the text content.\n of: filtered.type.of?.map((t: SchemaType) => {\n // Span is a reserved name in Sanity for text spans.\n // If the type is not a span, it means its a custom object type, so we return it as is.\n if (t.name !== \"span\") return t;\n\n const span = t as Partial<BlockMarksDefinition>;\n const annotations = span.annotations?.filter((a) => enabledParts.annotations.some((b) => b.name === a.name));\n const decorators = span.decorators?.filter((d) => enabledParts.decorators.some((b) => b.value === d.value));\n return { ...t, annotations, decorators };\n }),\n },\n };\n }\n default:\n return field;\n }\n }),\n };\n },\n [enabledParts]\n );\n\n const patchedSchemaType = React.useMemo(() => {\n const of = props.schemaType?.of;\n if (!Array.isArray(of)) return props.schemaType;\n\n // Just in case the reshaping fails, we return the original schema type.\n try {\n const filtered = of.filter((s) => {\n // A valid portabletext field must always contain the built-in block type.\n // Any other item is a custom block and must be explicitly enabled.\n return s.name === \"block\" || enabledParts.blocks.some((b) => b.name === s.name);\n });\n\n return {\n ...props.schemaType,\n of: filtered.map((s) => reshapeSchemaTypes(s as ObjectSchemaType)),\n };\n } catch (e) {\n console.error(\"Wild Sanity Rich Text Field: Error while reshaping schema types.\", e);\n return props.schemaType;\n }\n }, [props.schemaType, enabledParts.blocks, reshapeSchemaTypes]);\n\n const enabledPartsCount = React.useMemo(() => {\n return Object.values(enabledParts).reduce((acc, curr) => acc + curr.length, 0);\n }, [enabledParts]);\n\n return (\n <>\n <style>{`\n [data-wild-richtext-field] [data-testid=\"pt-editor\"][data-fullscreen=\"false\"] {\n height: var(--pt-editor-height, initial);\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.bullet\"] [data-list-prefix] > span::before,\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.number\"] [data-list-prefix] > span::before {\n font-size: 1.0em;\n display: inline-block;\n padding-top: 2px;\n color: inherit;\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.bullet\"] [data-list-prefix] > span::before {\n content: \"•\";\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.number\"] [data-list-prefix] > span::before {\n content: counter(list-level-1) \". \";\n }\n `}</style>\n <div data-wild-richtext-field style={{ \"--pt-editor-height\": height ?? sizeToHeightMap.sm } as React.CSSProperties}>\n {props.renderDefault({\n ...props,\n initialActive: initiallyActive,\n displayInlineChanges: false,\n // If the only enabled part is a style part, its the default \"Normal\" style. No need to show the toolbar.\n hideToolbar: enabledPartsCount === 0 || (enabledPartsCount === 1 && enabledParts.styles.length === 1),\n // @ts-expect-error: schemaType.of is too narrow. The runtime type is valid.\n schemaType: patchedSchemaType,\n })}\n </div>\n </>\n );\n}\n\nexport { RichtextInput };\n","import type {\n ArrayDefinition,\n ArrayOfType,\n ArrayOptions,\n BlockDecoratorDefinition,\n BlockListDefinition,\n BlockStyleDefinition,\n} from \"sanity\";\nimport type { Part } from \"./parts\";\n\n/** @public */\nexport const typeName = \"wild.richtext\" as const;\n\nexport type RichtextConfig = {\n blocks?: ArrayOfType<\"object\">[];\n spans?: ArrayOfType<\"object\">[];\n styles?: BlockStyleDefinition[];\n lists?: BlockListDefinition[];\n annotations?: ArrayOfType<\"object\">[];\n decorators?: BlockDecoratorDefinition[];\n};\n\n/** @public */\nexport type PluginConfig = RichtextConfig & {\n spellCheck?: boolean;\n};\n\n// Presets are collections of commonly used field options.\n// They allow to quickly set up the richtext field with a predefined set of options.\n// Users can still override individual options when using a preset.\ntype Preset = Omit<FieldOptions, keyof ArrayOptions | \"preset\">;\nexport type Presets = Record<\"basic\" | \"full\", Preset>;\n\nexport type Size = \"sm\" | \"lg\";\n\n// The user can provide custom parts as strings, so we need to allow for that.\n// But we also want to provide type safety for the known parts.\ntype MaybePart = Part | (string & {});\n\n/** @public */\nexport type FieldOptions = ArrayOptions & {\n // The user can provide custom sizes as strings, so we need to allow for that.\n // But we also want to provide type safety for the known sizes.\n size?: Size | (string & {});\n preset?: keyof Presets;\n initiallyActive?: boolean;\n allowedParts?: MaybePart[];\n disallowedParts?: MaybePart[];\n};\n\n// Add the custom field definition to Sanity's intrinsic definitions\n// so that type checking works correctly when using this field type.\ndeclare module \"sanity\" {\n export interface IntrinsicDefinitions {\n [typeName]: Omit<ArrayDefinition, \"type\" | \"of\" | \"options\"> & {\n type: typeof typeName;\n options?: FieldOptions;\n };\n }\n}\n","import { defineField } from \"sanity\";\nimport { styled } from \"styled-components\";\nimport { typeName } from \"../../types\";\n\nconst ColorText = styled.span<{ color?: string }>`\n & > span {\n background-color: inherit;\n border-bottom: unset;\n color: ${({ color = \"inherit\" }) => color};\n }\n`;\n\nexport const textColor = defineField({\n type: \"object\",\n name: `${typeName}.annotation.textColor`,\n title: \"Text Color\",\n icon: () => <>🖋</>,\n fields: [defineField({ name: \"color\", type: \"wild.color\" })],\n components: {\n annotation: (props) => {\n // @ts-expect-error: Sanity types are not aware of the color field structure.\n const color = props.value?.color?.value as string;\n return <ColorText color={color}>{props.renderDefault(props)}</ColorText>;\n },\n },\n});\n\nconst ColorBg = styled.span<{ color?: string }>`\n & > span {\n background-color: ${({ color = \"inherit\" }) => color};\n border-bottom: unset;\n color: inherit;\n }\n`;\n\nexport const highlightColor = defineField({\n type: \"object\",\n name: `${typeName}.annotation.highlightColor`,\n title: \"Highlight Color\",\n icon: () => <>🖍</>,\n fields: [defineField({ name: \"color\", type: \"wild.color\" })],\n components: {\n annotation: (props) => {\n // @ts-expect-error: Sanity types are not aware of the color field structure.\n const color = props.value?.color?.value as string;\n return <ColorBg color={color}>{props.renderDefault(props)}</ColorBg>;\n },\n },\n});\n","import { LinkIcon } from \"@sanity/icons\";\nimport { defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const link = defineField({\n type: \"wild.link\",\n name: `${typeName}.annotation.link`,\n title: \"Link\",\n icon: LinkIcon,\n options: {\n collapsed: false,\n collapsible: false,\n },\n});\n","import { highlightColor, textColor } from \"./color\";\nimport { link } from \"./link\";\n\nexport const annotations = {\n link,\n textColor,\n highlightColor,\n} as const;\n","import { prepareMediaPreview, selectMediaPreview } from \"@madebywild/sanity-media-field\";\nimport { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const media = defineArrayMember({\n name: `${typeName}.block.media`,\n type: \"object\",\n title: \"Media Block\",\n description: \"Embed block video or image content.\",\n icon: () => <>🖼️</>,\n fields: [\n defineField({\n title: \"Wrap\",\n name: \"wrapping\",\n type: \"wild.wrapping\",\n }),\n defineField({\n name: \"appMedia\",\n type: \"wild.media\",\n options: {\n extensions: [\"customOptions\", \"customRatio\"],\n },\n }),\n defineField({\n name: \"caption\",\n type: \"text\",\n rows: 2,\n description: \"Add a caption for the media.\",\n }),\n ],\n preview: {\n select: selectMediaPreview(\"appMedia\"),\n prepare: (props) => prepareMediaPreview(props),\n },\n});\n","import { media } from \"./media-block\";\n\nexport const blocks = {\n media,\n} as const;\n","import { BoldIcon, CodeIcon, ItalicIcon } from \"@sanity/icons\";\nimport type { BlockDecoratorDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst strong = {\n title: \"Strong\",\n value: `${typeName}.decorator.strong`,\n icon: BoldIcon,\n component: ({ children }) => <strong>{children}</strong>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst em = {\n title: \"Emphasis\",\n value: `${typeName}.decorator.em`,\n icon: ItalicIcon,\n component: ({ children }) => <em>{children}</em>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst code = {\n title: \"Code\",\n value: `${typeName}.decorator.code`,\n icon: CodeIcon,\n component: ({ children }) => <code>{children}</code>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst sup = {\n title: \"Sup\",\n value: `${typeName}.decorator.sup`,\n icon: () => <sup>[1]</sup>,\n component: ({ children }) => <sup style={{ verticalAlign: \"super\" }}>{children}</sup>,\n} as const satisfies BlockDecoratorDefinition;\n\nexport const decorators = {\n strong,\n em,\n code,\n sup,\n} as const;\n","import { OlistIcon, UlistIcon } from \"@sanity/icons\";\nimport type { BlockListDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst bullet = {\n title: \"Bullet\",\n value: `${typeName}.list.bullet`,\n icon: UlistIcon,\n} as const satisfies BlockListDefinition;\n\nconst number = {\n title: \"Number\",\n value: `${typeName}.list.number`,\n icon: OlistIcon,\n} as const satisfies BlockListDefinition;\n\nexport const lists = {\n bullet,\n number,\n} as const;\n","import * as React from \"react\";\nimport { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const icon = defineArrayMember({\n name: `${typeName}.span.icon`,\n type: \"object\",\n title: \"Icon\",\n description: \"Insert an icon.\",\n icon: () => <>🧿</>,\n fields: [defineField({ name: \"icon\", type: \"wild.icon\" })],\n components: {\n // This is the inline-preview in the PortableText editor.\n // It gets its props from the prepare function below.\n preview: (props) => {\n return React.isValidElement(props.media) ? props.media : props.fallbackTitle;\n },\n },\n preview: {\n select: {\n icon: \"icon\",\n },\n prepare({ icon }) {\n return {\n media: (\n <span role=\"img\" className=\"inline-block size-[1em] shrink-0 text-current\" title={icon ?? \"Icon\"}>\n 🧿\n </span>\n ),\n };\n },\n },\n});\n","import { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const media = defineArrayMember({\n name: `${typeName}.span.media`,\n type: \"object\",\n title: \"Inline Media\",\n description: \"Embed inline video or image content.\",\n icon: () => <>🫧</>,\n fields: [\n defineField({\n name: \"media\",\n type: \"wild.media\",\n }),\n ],\n components: {\n // This is the inline-preview in the PortableText editor.\n preview: (props) => {\n const icons = {\n video: <>🎥</>,\n image: <>🖼️</>,\n lottie: <>🌀</>,\n rive: <>🍭</>,\n };\n\n // @ts-expect-error: It gets its props from the prepare function below.\n return icons[props.type as keyof typeof icons] || <>🖼️</>;\n },\n },\n preview: {\n select: {\n type: \"media.type\",\n },\n },\n});\n","import { icon } from \"./icon\";\nimport { media } from \"./media\";\n\nexport const spans = {\n icon,\n media,\n} as const;\n","import type { BlockStyleDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst h2 = {\n title: \"Heading 2\",\n value: `${typeName}.style.h2`,\n component: ({ children }) => (\n <h2\n style={{\n fontSize: \"2.0625rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(41 / 33)\",\n }}\n >\n {children}\n </h2>\n ),\n} as const satisfies BlockStyleDefinition;\n\nconst h3 = {\n title: \"Heading 3\",\n value: `${typeName}.style.h3`,\n component: ({ children }) => (\n <h3\n style={{\n fontSize: \"1.6875rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(35 / 27)\",\n }}\n >\n {children}\n </h3>\n ),\n} as const satisfies BlockStyleDefinition;\n\nconst h4 = {\n title: \"Heading 4\",\n value: `${typeName}.style.h4`,\n component: ({ children }) => (\n <h4\n style={{\n fontSize: \"1.3125rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(29 / 21)\",\n }}\n >\n {children}\n </h4>\n ),\n} as const satisfies BlockStyleDefinition;\n\nexport const styles = {\n h2,\n h3,\n h4,\n} as const;\n","import { annotations } from \"./annotations\";\nimport { blocks } from \"./blocks\";\nimport { decorators } from \"./decorators\";\nimport { lists } from \"./lists\";\nimport { spans } from \"./spans\";\nimport { styles } from \"./styles\";\n\nconst parts = {\n annotations,\n blocks,\n decorators,\n lists,\n spans,\n styles,\n} as const;\n\ntype Parts = typeof parts;\ntype Part =\n | Parts[\"annotations\"][keyof Parts[\"annotations\"]][\"name\"]\n | Parts[\"blocks\"][keyof Parts[\"blocks\"]][\"name\"]\n | Parts[\"decorators\"][keyof Parts[\"decorators\"]][\"value\"]\n | Parts[\"lists\"][keyof Parts[\"lists\"]][\"value\"]\n | Parts[\"spans\"][keyof Parts[\"spans\"]][\"name\"]\n | Parts[\"styles\"][keyof Parts[\"styles\"]][\"value\"];\n\nexport { parts, type Part };\n","import type { ArrayOfObjectsInputProps } from \"sanity\";\nimport { defineArrayMember, definePlugin, defineType } from \"sanity\";\nimport { RichtextInput } from \"./input\";\nimport { parts } from \"./parts\";\nimport { type FieldOptions, type PluginConfig, typeName } from \"./types\";\n\n/** @public */\nconst wildSanityRichtextFieldPlugin = definePlugin<PluginConfig>((config) => {\n const userSpans = config?.spans ?? [];\n const userLists = config?.lists ?? [];\n const userBlocks = config?.blocks ?? [];\n const userStyles = config?.styles ?? [];\n const userDecorators = config?.decorators ?? [];\n const userAnnotations = config?.annotations ?? [];\n\n const richtextConfig = {\n blocks: [...userBlocks, ...Object.values(parts.blocks)],\n spans: [...userSpans, ...Object.values(parts.spans)],\n lists: [...userLists, ...Object.values(parts.lists)],\n styles: [...userStyles, ...Object.values(parts.styles)],\n decorators: [...userDecorators, ...Object.values(parts.decorators)],\n annotations: [...userAnnotations, ...Object.values(parts.annotations)],\n };\n\n return {\n name: \"@madebywild/sanity-richtext-field\",\n schema: {\n types: [\n defineType({\n name: typeName,\n type: \"array\",\n title: \"Rich Text\",\n description: \"Rich text content with formatting options.\",\n icon: () => <>⌨️</>,\n components: {\n input: (props: ArrayOfObjectsInputProps) => <RichtextInput richtextConfig={richtextConfig} {...props} />,\n },\n of: [\n ...richtextConfig.blocks,\n defineArrayMember({\n type: \"block\",\n options: {\n spellCheck: config?.spellCheck ?? true,\n unstable_whitespaceOnPasteMode: \"normalize\",\n },\n of: richtextConfig.spans,\n styles: richtextConfig.styles,\n lists: richtextConfig.lists,\n marks: {\n annotations: richtextConfig.annotations,\n decorators: richtextConfig.decorators,\n },\n }),\n ],\n }),\n ],\n },\n };\n});\n\nexport { wildSanityRichtextFieldPlugin, typeName, type PluginConfig, type FieldOptions };\n"],"names":["presets","basic","size","initiallyActive","allowedParts","full","disallowedParts","handleListKind","entry","findNeedle","list","type","options","filteredList","filter","s","value","handleOfKind","of","filteredOf","a","name","sizeToHeightMap","sm","lg","RichtextInput","richtextConfig","props","schemaOptions","schemaType","presetOptions","preset","React","useMemo","_","mainOptions","merge","height","console","warn","filterPartsBy","useCallback","parts","b","needle","includes","enabledParts","blocks","spans","lists","annotations","decorators","styles","normalizedStyles","title","reshapeSchemaTypes","schema","fields","map","f","field","some","filtered","t","span","d","patchedSchemaType","Array","isArray","e","error","enabledPartsCount","Object","values","reduce","acc","curr","length","jsxs","Fragment","jsx","renderDefault","initialActive","displayInlineChanges","hideToolbar","typeName","ColorText","styled","color","textColor","defineField","icon","components","annotation","ColorBg","highlightColor","link","LinkIcon","collapsed","collapsible","media","defineArrayMember","description","extensions","rows","preview","select","selectMediaPreview","prepare","prepareMediaPreview","strong","BoldIcon","component","children","em","ItalicIcon","code","CodeIcon","sup","verticalAlign","bullet","UlistIcon","number","OlistIcon","isValidElement","fallbackTitle","video","image","lottie","rive","h2","fontSize","fontWeight","lineHeight","h3","h4","wildSanityRichtextFieldPlugin","definePlugin","config","userSpans","userLists","userBlocks","userStyles","userDecorators","userAnnotations","types","defineType","input","spellCheck","unstable_whitespaceOnPasteMode","marks"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -142,13 +142,14 @@ type PluginConfig = RichtextConfig & {
142
142
  type Preset = Omit<FieldOptions, keyof ArrayOptions | "preset">;
143
143
  type Presets = Record<"basic" | "full", Preset>;
144
144
  type Size = "sm" | "lg";
145
+ type MaybePart = Part | (string & {});
145
146
  /** @public */
146
147
  type FieldOptions = ArrayOptions & {
147
148
  size?: Size | (string & {});
148
149
  preset?: keyof Presets;
149
150
  initiallyActive?: boolean;
150
- whitelist?: (Part | (string & {}))[];
151
- blacklist?: (Part | (string & {}))[];
151
+ allowedParts?: MaybePart[];
152
+ disallowedParts?: MaybePart[];
152
153
  };
153
154
  declare module "sanity" {
154
155
  interface IntrinsicDefinitions {
package/dist/index.d.ts CHANGED
@@ -142,13 +142,14 @@ type PluginConfig = RichtextConfig & {
142
142
  type Preset = Omit<FieldOptions, keyof ArrayOptions | "preset">;
143
143
  type Presets = Record<"basic" | "full", Preset>;
144
144
  type Size = "sm" | "lg";
145
+ type MaybePart = Part | (string & {});
145
146
  /** @public */
146
147
  type FieldOptions = ArrayOptions & {
147
148
  size?: Size | (string & {});
148
149
  preset?: keyof Presets;
149
150
  initiallyActive?: boolean;
150
- whitelist?: (Part | (string & {}))[];
151
- blacklist?: (Part | (string & {}))[];
151
+ allowedParts?: MaybePart[];
152
+ disallowedParts?: MaybePart[];
152
153
  };
153
154
  declare module "sanity" {
154
155
  interface IntrinsicDefinitions {
package/dist/index.js CHANGED
@@ -9,13 +9,13 @@ const presets = {
9
9
  basic: {
10
10
  size: "sm",
11
11
  initiallyActive: !0,
12
- whitelist: ["wild.richtext.decorator.em", "wild.richtext.decorator.strong", "wild.richtext.annotation.link"]
12
+ allowedParts: ["wild.richtext.decorator.em", "wild.richtext.decorator.strong", "wild.richtext.annotation.link"]
13
13
  },
14
14
  full: {
15
15
  size: "lg",
16
16
  initiallyActive: !1,
17
17
  // Empty blacklist means "enable all".
18
- blacklist: []
18
+ disallowedParts: []
19
19
  }
20
20
  };
21
21
  function handleListKind(entry, findNeedle) {
@@ -59,12 +59,12 @@ function RichtextInput({
59
59
  ...mainOptions
60
60
  } = schemaOptions ?? {};
61
61
  return merge(presetOptions, mainOptions);
62
- }, [schemaOptions, presetOptions]), initiallyActive = options?.initiallyActive ?? !1, height = options?.size && options.size in sizeToHeightMap ? sizeToHeightMap[options.size] : options?.size, whitelist = options?.whitelist, blacklist = options?.blacklist;
63
- whitelist && blacklist && console.warn("Wild Sanity Rich Text Field: Both whitelist and blacklist are set. Whitelist will take precedence.");
62
+ }, [schemaOptions, presetOptions]), initiallyActive = options?.initiallyActive ?? !1, height = options?.size && options.size in sizeToHeightMap ? sizeToHeightMap[options.size] : options?.size, allowedParts = options?.allowedParts, disallowedParts = options?.disallowedParts;
63
+ allowedParts && disallowedParts && console.warn("Wild Sanity Rich Text Field: Both `allowedParts` and `disallowedParts` are set. `allowedParts` will take precedence.");
64
64
  const filterPartsBy = React.useCallback((parts2, findNeedle) => parts2?.filter((b) => {
65
65
  const needle = findNeedle(b);
66
- return needle ? whitelist ? whitelist.includes(needle) : blacklist ? !blacklist.includes(needle) : !1 : !0;
67
- }), [whitelist, blacklist]), enabledParts = React.useMemo(() => {
66
+ return needle ? allowedParts ? allowedParts.includes(needle) : disallowedParts ? !disallowedParts.includes(needle) : !1 : !0;
67
+ }), [allowedParts, disallowedParts]), enabledParts = React.useMemo(() => {
68
68
  const blocks2 = filterPartsBy(richtextConfig.blocks, (s) => s.name), spans2 = filterPartsBy(richtextConfig.spans, (s_0) => s_0.name), lists2 = filterPartsBy(richtextConfig.lists, (s_1) => s_1.value), annotations2 = filterPartsBy(richtextConfig.annotations, (s_2) => s_2.name), decorators2 = filterPartsBy(richtextConfig.decorators, (s_3) => s_3.value), styles2 = filterPartsBy(richtextConfig.styles, (s_4) => s_4.value), normalizedStyles = [{
69
69
  value: "normal",
70
70
  title: "Normal"
@@ -217,7 +217,6 @@ const typeName = "wild.richtext", ColorText = styled.span`
217
217
  title: "Link",
218
218
  icon: LinkIcon,
219
219
  options: {
220
- noCustomText: !0,
221
220
  collapsed: !1,
222
221
  collapsible: !1
223
222
  }
@@ -239,7 +238,7 @@ const typeName = "wild.richtext", ColorText = styled.span`
239
238
  name: "appMedia",
240
239
  type: "wild.media",
241
240
  options: {
242
- features: ["customOptions", "customRatio"]
241
+ extensions: ["customOptions", "customRatio"]
243
242
  }
244
243
  }), defineField({
245
244
  name: "caption",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/presets.tsx","../src/input.tsx","../src/types.tsx","../src/parts/annotations/color.tsx","../src/parts/annotations/link.tsx","../src/parts/annotations/index.tsx","../src/parts/blocks/media-block.tsx","../src/parts/blocks/index.tsx","../src/parts/decorators/index.tsx","../src/parts/lists/index.tsx","../src/parts/spans/icon.tsx","../src/parts/spans/media.tsx","../src/parts/spans/index.tsx","../src/parts/styles/index.tsx","../src/parts/index.tsx","../src/index.tsx"],"sourcesContent":["import type { Presets } from \"./types\";\n\n// Presets are predefined configurations for the rich text field.\n// They allow users to quickly set up the field with common settings.\n// Users can still override these presets with custom options.\nexport const presets = {\n basic: {\n size: \"sm\",\n initiallyActive: true,\n whitelist: [\"wild.richtext.decorator.em\", \"wild.richtext.decorator.strong\", \"wild.richtext.annotation.link\"],\n } as const,\n full: {\n size: \"lg\",\n initiallyActive: false,\n // Empty blacklist means \"enable all\".\n blacklist: [],\n } as const,\n} as const satisfies Presets;\n","import * as React from \"react\";\nimport type {\n ArrayOfObjectsInputProps,\n ArraySchemaType,\n BlockMarksDefinition,\n ObjectField,\n ObjectSchemaType,\n SchemaType,\n} from \"sanity\";\nimport { merge } from \"ts-deepmerge\";\nimport type { Part } from \"./parts\";\nimport { presets } from \"./presets\";\nimport type { FieldOptions, RichtextConfig, Size } from \"./types\";\n\nfunction handleListKind<E extends ObjectField<ArraySchemaType>>(entry: E, findNeedle: (needle: string) => boolean) {\n const list = entry.type?.options?.list;\n if (!list) return entry;\n const filteredList = list.filter((s) => findNeedle((s as { value: string }).value));\n return { ...entry, type: { ...entry.type, options: { ...entry.type.options, list: filteredList } } };\n}\n\nfunction handleOfKind<E extends ObjectField<ArraySchemaType>>(entry: E, findNeedle: (needle: string) => boolean) {\n const list = entry.type?.of;\n if (!list) return entry;\n const filteredOf = list.filter((a: { name: string }) => findNeedle(a.name));\n return { ...entry, type: { ...entry.type, of: filteredOf } };\n}\n\nconst sizeToHeightMap = {\n sm: \"10rem\",\n lg: \"50vh\",\n} as const satisfies Record<Size, string>;\n\nfunction RichtextInput({\n richtextConfig,\n ...props\n}: ArrayOfObjectsInputProps & {\n richtextConfig: RichtextConfig;\n}) {\n const schemaOptions = props.schemaType.options as FieldOptions | undefined;\n const presetOptions = schemaOptions?.preset ? presets[schemaOptions.preset] : {};\n\n const options = React.useMemo(() => {\n // The preset option is only used to fetch the preset options.\n // We can exclude it from the main options.\n const { preset: _, ...mainOptions } = schemaOptions ?? {};\n return merge(presetOptions, mainOptions);\n }, [schemaOptions, presetOptions]);\n\n const initiallyActive = options?.initiallyActive ?? false;\n\n // Height can either be a predefined size or a custom string value.\n // In the case of a custom string value, we use it as is.\n const height =\n options?.size && options.size in sizeToHeightMap\n ? sizeToHeightMap[options.size as keyof typeof sizeToHeightMap]\n : options?.size;\n\n const whitelist = options?.whitelist;\n const blacklist = options?.blacklist;\n if (whitelist && blacklist) {\n console.warn(\"Wild Sanity Rich Text Field: Both whitelist and blacklist are set. Whitelist will take precedence.\");\n }\n\n const filterPartsBy = React.useCallback(\n <P extends unknown[]>(parts: P | undefined, findNeedle: (s: P[number]) => string | undefined) => {\n const filtered = parts?.filter((b) => {\n const needle = findNeedle(b) as Part | undefined;\n // This is undefined behavior. To not break user expectations, we keep the item.\n if (!needle) return true;\n if (whitelist) return whitelist.includes(needle);\n if (blacklist) return !blacklist.includes(needle);\n // By default the rich text field is a minimal as possible.\n return false;\n });\n\n return filtered as P;\n },\n [whitelist, blacklist]\n );\n\n const enabledParts = React.useMemo(() => {\n const blocks = filterPartsBy(richtextConfig.blocks, (s) => s.name);\n const spans = filterPartsBy(richtextConfig.spans, (s) => s.name);\n const lists = filterPartsBy(richtextConfig.lists, (s) => s.value);\n const annotations = filterPartsBy(richtextConfig.annotations, (s) => s.name);\n const decorators = filterPartsBy(richtextConfig.decorators, (s) => s.value);\n const styles = filterPartsBy(richtextConfig.styles, (s) => s.value);\n\n // Always include the \"Normal\" style. It acts as a way for the users to reset the style.\n const normalizedStyles = [{ value: \"normal\", title: \"Normal\" }, ...styles];\n\n return { blocks, spans, lists, annotations, decorators, styles: normalizedStyles };\n }, [filterPartsBy]);\n\n const reshapeSchemaTypes = React.useCallback(\n (schema: ObjectSchemaType) => {\n // We only reshape the built-in block type children.\n if (schema.name !== \"block\") return schema;\n\n return {\n ...schema,\n fields: schema.fields?.map((f) => {\n const field = f as ObjectField<ArraySchemaType>;\n\n switch (field.name) {\n // Headings, Normal, Quote, etc.\n case \"style\":\n return handleListKind(field, (_) => enabledParts.styles.some((b) => b.value === _));\n // Ul, Ol, etc.\n case \"listItem\":\n return handleListKind(field, (_) => enabledParts.lists.some((b) => b.value === _));\n // Links, Colors, etc.\n case \"markDefs\":\n return handleOfKind(field, (_) => enabledParts.annotations.some((b) => b.name === _));\n // Text content.\n case \"children\": {\n // Always enable span type for text content.\n const spans = [...enabledParts.spans, { name: \"span\" }];\n const filtered = handleOfKind(field, (_) => spans.some((b) => b.name === _));\n\n return {\n ...filtered,\n type: {\n ...filtered.type,\n // Inline markers within the text content.\n of: filtered.type.of?.map((t: SchemaType) => {\n // Span is a reserved name in Sanity for text spans.\n // If the type is not a span, it means its a custom object type, so we return it as is.\n if (t.name !== \"span\") return t;\n\n const span = t as Partial<BlockMarksDefinition>;\n const annotations = span.annotations?.filter((a) => enabledParts.annotations.some((b) => b.name === a.name));\n const decorators = span.decorators?.filter((d) => enabledParts.decorators.some((b) => b.value === d.value));\n return { ...t, annotations, decorators };\n }),\n },\n };\n }\n default:\n return field;\n }\n }),\n };\n },\n [enabledParts]\n );\n\n const patchedSchemaType = React.useMemo(() => {\n const of = props.schemaType?.of;\n if (!Array.isArray(of)) return props.schemaType;\n\n // Just in case the reshaping fails, we return the original schema type.\n try {\n const filtered = of.filter((s) => {\n // A valid portabletext field must always contain the built-in block type.\n // Any other item is a custom block and must be explicitly enabled.\n return s.name === \"block\" || enabledParts.blocks.some((b) => b.name === s.name);\n });\n\n return {\n ...props.schemaType,\n of: filtered.map((s) => reshapeSchemaTypes(s as ObjectSchemaType)),\n };\n } catch (e) {\n console.error(\"Wild Sanity Rich Text Field: Error while reshaping schema types.\", e);\n return props.schemaType;\n }\n }, [props.schemaType, enabledParts.blocks, reshapeSchemaTypes]);\n\n const enabledPartsCount = React.useMemo(() => {\n return Object.values(enabledParts).reduce((acc, curr) => acc + curr.length, 0);\n }, [enabledParts]);\n\n return (\n <>\n <style>{`\n [data-wild-richtext-field] [data-testid=\"pt-editor\"][data-fullscreen=\"false\"] {\n height: var(--pt-editor-height, initial);\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.bullet\"] [data-list-prefix] > span::before,\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.number\"] [data-list-prefix] > span::before {\n font-size: 1.0em;\n display: inline-block;\n padding-top: 2px;\n color: inherit;\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.bullet\"] [data-list-prefix] > span::before {\n content: \"•\";\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.number\"] [data-list-prefix] > span::before {\n content: counter(list-level-1) \". \";\n }\n `}</style>\n <div data-wild-richtext-field style={{ \"--pt-editor-height\": height ?? sizeToHeightMap.sm } as React.CSSProperties}>\n {props.renderDefault({\n ...props,\n initialActive: initiallyActive,\n displayInlineChanges: false,\n // If the only enabled part is a style part, its the default \"Normal\" style. No need to show the toolbar.\n hideToolbar: enabledPartsCount === 0 || (enabledPartsCount === 1 && enabledParts.styles.length === 1),\n // @ts-expect-error: schemaType.of is too narrow. The runtime type is valid.\n schemaType: patchedSchemaType,\n })}\n </div>\n </>\n );\n}\n\nexport { RichtextInput };\n","import type {\n ArrayDefinition,\n ArrayOfType,\n ArrayOptions,\n BlockDecoratorDefinition,\n BlockListDefinition,\n BlockStyleDefinition,\n} from \"sanity\";\nimport type { Part } from \"./parts\";\n\n/** @public */\nexport const typeName = \"wild.richtext\" as const;\n\nexport type RichtextConfig = {\n blocks?: ArrayOfType<\"object\">[];\n spans?: ArrayOfType<\"object\">[];\n styles?: BlockStyleDefinition[];\n lists?: BlockListDefinition[];\n annotations?: ArrayOfType<\"object\">[];\n decorators?: BlockDecoratorDefinition[];\n};\n\n/** @public */\nexport type PluginConfig = RichtextConfig & {\n spellCheck?: boolean;\n};\n\n// Presets are collections of commonly used field options.\n// They allow to quickly set up the richtext field with a predefined set of options.\n// Users can still override individual options when using a preset.\ntype Preset = Omit<FieldOptions, keyof ArrayOptions | \"preset\">;\nexport type Presets = Record<\"basic\" | \"full\", Preset>;\n\nexport type Size = \"sm\" | \"lg\";\n\n/** @public */\nexport type FieldOptions = ArrayOptions & {\n // The user can provide custom sizes as strings, so we need to allow for that.\n // But we also want to provide type safety for the known sizes.\n size?: Size | (string & {});\n preset?: keyof Presets;\n initiallyActive?: boolean;\n // The user can provide custom parts as strings, so we need to allow for that.\n // But we also want to provide type safety for the known parts.\n whitelist?: (Part | (string & {}))[];\n blacklist?: (Part | (string & {}))[];\n};\n\n// Add the custom field definition to Sanity's intrinsic definitions\n// so that type checking works correctly when using this field type.\ndeclare module \"sanity\" {\n export interface IntrinsicDefinitions {\n [typeName]: Omit<ArrayDefinition, \"type\" | \"of\" | \"options\"> & {\n type: typeof typeName;\n options?: FieldOptions;\n };\n }\n}\n","import { defineField } from \"sanity\";\nimport { styled } from \"styled-components\";\nimport { typeName } from \"../../types\";\n\nconst ColorText = styled.span<{ color?: string }>`\n & > span {\n background-color: inherit;\n border-bottom: unset;\n color: ${({ color = \"inherit\" }) => color};\n }\n`;\n\nexport const textColor = defineField({\n type: \"object\",\n name: `${typeName}.annotation.textColor`,\n title: \"Text Color\",\n icon: () => <>🖋</>,\n fields: [defineField({ name: \"color\", type: \"wild.color\" })],\n components: {\n annotation: (props) => {\n // @ts-expect-error: Sanity types are not aware of the color field structure.\n const color = props.value?.color?.value as string;\n return <ColorText color={color}>{props.renderDefault(props)}</ColorText>;\n },\n },\n});\n\nconst ColorBg = styled.span<{ color?: string }>`\n & > span {\n background-color: ${({ color = \"inherit\" }) => color};\n border-bottom: unset;\n color: inherit;\n }\n`;\n\nexport const highlightColor = defineField({\n type: \"object\",\n name: `${typeName}.annotation.highlightColor`,\n title: \"Highlight Color\",\n icon: () => <>🖍</>,\n fields: [defineField({ name: \"color\", type: \"wild.color\" })],\n components: {\n annotation: (props) => {\n // @ts-expect-error: Sanity types are not aware of the color field structure.\n const color = props.value?.color?.value as string;\n return <ColorBg color={color}>{props.renderDefault(props)}</ColorBg>;\n },\n },\n});\n","import { LinkIcon } from \"@sanity/icons\";\nimport { defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const link = defineField({\n type: \"wild.link\",\n name: `${typeName}.annotation.link`,\n title: \"Link\",\n icon: LinkIcon,\n options: {\n noCustomText: true,\n collapsed: false,\n collapsible: false,\n },\n});\n","import { highlightColor, textColor } from \"./color\";\nimport { link } from \"./link\";\n\nexport const annotations = {\n link,\n textColor,\n highlightColor,\n} as const;\n","import { prepareMediaPreview, selectMediaPreview } from \"@madebywild/sanity-media-field\";\nimport { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const media = defineArrayMember({\n name: `${typeName}.block.media`,\n type: \"object\",\n title: \"Media Block\",\n description: \"Embed block video or image content.\",\n icon: () => <>🖼️</>,\n fields: [\n defineField({\n title: \"Wrap\",\n name: \"wrapping\",\n type: \"wild.wrapping\",\n }),\n defineField({\n name: \"appMedia\",\n type: \"wild.media\",\n options: {\n features: [\"customOptions\", \"customRatio\"],\n },\n }),\n defineField({\n name: \"caption\",\n type: \"text\",\n rows: 2,\n description: \"Add a caption for the media.\",\n }),\n ],\n preview: {\n select: selectMediaPreview(\"appMedia\"),\n prepare: (props) => prepareMediaPreview(props),\n },\n});\n","import { media } from \"./media-block\";\n\nexport const blocks = {\n media,\n} as const;\n","import { BoldIcon, CodeIcon, ItalicIcon } from \"@sanity/icons\";\nimport type { BlockDecoratorDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst strong = {\n title: \"Strong\",\n value: `${typeName}.decorator.strong`,\n icon: BoldIcon,\n component: ({ children }) => <strong>{children}</strong>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst em = {\n title: \"Emphasis\",\n value: `${typeName}.decorator.em`,\n icon: ItalicIcon,\n component: ({ children }) => <em>{children}</em>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst code = {\n title: \"Code\",\n value: `${typeName}.decorator.code`,\n icon: CodeIcon,\n component: ({ children }) => <code>{children}</code>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst sup = {\n title: \"Sup\",\n value: `${typeName}.decorator.sup`,\n icon: () => <sup>[1]</sup>,\n component: ({ children }) => <sup style={{ verticalAlign: \"super\" }}>{children}</sup>,\n} as const satisfies BlockDecoratorDefinition;\n\nexport const decorators = {\n strong,\n em,\n code,\n sup,\n} as const;\n","import { OlistIcon, UlistIcon } from \"@sanity/icons\";\nimport type { BlockListDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst bullet = {\n title: \"Bullet\",\n value: `${typeName}.list.bullet`,\n icon: UlistIcon,\n} as const satisfies BlockListDefinition;\n\nconst number = {\n title: \"Number\",\n value: `${typeName}.list.number`,\n icon: OlistIcon,\n} as const satisfies BlockListDefinition;\n\nexport const lists = {\n bullet,\n number,\n} as const;\n","import * as React from \"react\";\nimport { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const icon = defineArrayMember({\n name: `${typeName}.span.icon`,\n type: \"object\",\n title: \"Icon\",\n description: \"Insert an icon.\",\n icon: () => <>🧿</>,\n fields: [defineField({ name: \"icon\", type: \"wild.icon\" })],\n components: {\n // This is the inline-preview in the PortableText editor.\n // It gets its props from the prepare function below.\n preview: (props) => {\n return React.isValidElement(props.media) ? props.media : props.fallbackTitle;\n },\n },\n preview: {\n select: {\n icon: \"icon\",\n },\n prepare({ icon }) {\n return {\n media: (\n <span role=\"img\" className=\"inline-block size-[1em] shrink-0 text-current\" title={icon ?? \"Icon\"}>\n 🧿\n </span>\n ),\n };\n },\n },\n});\n","import { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const media = defineArrayMember({\n name: `${typeName}.span.media`,\n type: \"object\",\n title: \"Inline Media\",\n description: \"Embed inline video or image content.\",\n icon: () => <>🫧</>,\n fields: [\n defineField({\n name: \"media\",\n type: \"wild.media\",\n }),\n ],\n components: {\n // This is the inline-preview in the PortableText editor.\n preview: (props) => {\n const icons = {\n video: <>🎥</>,\n image: <>🖼️</>,\n lottie: <>🌀</>,\n rive: <>🍭</>,\n };\n\n // @ts-expect-error: It gets its props from the prepare function below.\n return icons[props.type as keyof typeof icons] || <>🖼️</>;\n },\n },\n preview: {\n select: {\n type: \"media.type\",\n },\n },\n});\n","import { icon } from \"./icon\";\nimport { media } from \"./media\";\n\nexport const spans = {\n icon,\n media,\n} as const;\n","import type { BlockStyleDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst h2 = {\n title: \"Heading 2\",\n value: `${typeName}.style.h2`,\n component: ({ children }) => (\n <h2\n style={{\n fontSize: \"2.0625rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(41 / 33)\",\n }}\n >\n {children}\n </h2>\n ),\n} as const satisfies BlockStyleDefinition;\n\nconst h3 = {\n title: \"Heading 3\",\n value: `${typeName}.style.h3`,\n component: ({ children }) => (\n <h3\n style={{\n fontSize: \"1.6875rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(35 / 27)\",\n }}\n >\n {children}\n </h3>\n ),\n} as const satisfies BlockStyleDefinition;\n\nconst h4 = {\n title: \"Heading 4\",\n value: `${typeName}.style.h4`,\n component: ({ children }) => (\n <h4\n style={{\n fontSize: \"1.3125rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(29 / 21)\",\n }}\n >\n {children}\n </h4>\n ),\n} as const satisfies BlockStyleDefinition;\n\nexport const styles = {\n h2,\n h3,\n h4,\n} as const;\n","import { annotations } from \"./annotations\";\nimport { blocks } from \"./blocks\";\nimport { decorators } from \"./decorators\";\nimport { lists } from \"./lists\";\nimport { spans } from \"./spans\";\nimport { styles } from \"./styles\";\n\nconst parts = {\n annotations,\n blocks,\n decorators,\n lists,\n spans,\n styles,\n} as const;\n\ntype Parts = typeof parts;\ntype Part =\n | Parts[\"annotations\"][keyof Parts[\"annotations\"]][\"name\"]\n | Parts[\"blocks\"][keyof Parts[\"blocks\"]][\"name\"]\n | Parts[\"decorators\"][keyof Parts[\"decorators\"]][\"value\"]\n | Parts[\"lists\"][keyof Parts[\"lists\"]][\"value\"]\n | Parts[\"spans\"][keyof Parts[\"spans\"]][\"name\"]\n | Parts[\"styles\"][keyof Parts[\"styles\"]][\"value\"];\n\nexport { parts, type Part };\n","import type { ArrayOfObjectsInputProps } from \"sanity\";\nimport { defineArrayMember, definePlugin, defineType } from \"sanity\";\nimport { RichtextInput } from \"./input\";\nimport { parts } from \"./parts\";\nimport { type FieldOptions, type PluginConfig, typeName } from \"./types\";\n\n/** @public */\nconst wildSanityRichtextFieldPlugin = definePlugin<PluginConfig>((config) => {\n const userSpans = config?.spans ?? [];\n const userLists = config?.lists ?? [];\n const userBlocks = config?.blocks ?? [];\n const userStyles = config?.styles ?? [];\n const userDecorators = config?.decorators ?? [];\n const userAnnotations = config?.annotations ?? [];\n\n const richtextConfig = {\n blocks: [...userBlocks, ...Object.values(parts.blocks)],\n spans: [...userSpans, ...Object.values(parts.spans)],\n lists: [...userLists, ...Object.values(parts.lists)],\n styles: [...userStyles, ...Object.values(parts.styles)],\n decorators: [...userDecorators, ...Object.values(parts.decorators)],\n annotations: [...userAnnotations, ...Object.values(parts.annotations)],\n };\n\n return {\n name: \"@madebywild/sanity-richtext-field\",\n schema: {\n types: [\n defineType({\n name: typeName,\n type: \"array\",\n title: \"Rich Text\",\n description: \"Rich text content with formatting options.\",\n icon: () => <>⌨️</>,\n components: {\n input: (props: ArrayOfObjectsInputProps) => <RichtextInput richtextConfig={richtextConfig} {...props} />,\n },\n of: [\n ...richtextConfig.blocks,\n defineArrayMember({\n type: \"block\",\n options: {\n spellCheck: config?.spellCheck ?? true,\n unstable_whitespaceOnPasteMode: \"normalize\",\n },\n of: richtextConfig.spans,\n styles: richtextConfig.styles,\n lists: richtextConfig.lists,\n marks: {\n annotations: richtextConfig.annotations,\n decorators: richtextConfig.decorators,\n },\n }),\n ],\n }),\n ],\n },\n };\n});\n\nexport { wildSanityRichtextFieldPlugin, typeName, type PluginConfig, type FieldOptions };\n"],"names":["presets","basic","size","initiallyActive","whitelist","full","blacklist","handleListKind","entry","findNeedle","list","type","options","filteredList","filter","s","value","handleOfKind","of","filteredOf","a","name","sizeToHeightMap","sm","lg","RichtextInput","richtextConfig","props","schemaOptions","schemaType","presetOptions","preset","React","useMemo","_","mainOptions","merge","height","console","warn","filterPartsBy","useCallback","parts","b","needle","includes","enabledParts","blocks","spans","lists","annotations","decorators","styles","normalizedStyles","title","reshapeSchemaTypes","schema","fields","map","f","field","some","filtered","t","span","d","patchedSchemaType","Array","isArray","e","error","enabledPartsCount","Object","values","reduce","acc","curr","length","renderDefault","initialActive","displayInlineChanges","hideToolbar","typeName","ColorText","styled","color","textColor","defineField","icon","components","annotation","ColorBg","highlightColor","link","LinkIcon","noCustomText","collapsed","collapsible","media","defineArrayMember","description","features","rows","preview","select","selectMediaPreview","prepare","prepareMediaPreview","strong","BoldIcon","component","children","em","ItalicIcon","code","CodeIcon","sup","verticalAlign","bullet","UlistIcon","number","OlistIcon","isValidElement","fallbackTitle","video","image","lottie","rive","h2","fontSize","fontWeight","lineHeight","h3","h4","wildSanityRichtextFieldPlugin","definePlugin","config","userSpans","userLists","userBlocks","userStyles","userDecorators","userAnnotations","types","defineType","input","spellCheck","unstable_whitespaceOnPasteMode","marks"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/presets.tsx","../src/input.tsx","../src/types.tsx","../src/parts/annotations/color.tsx","../src/parts/annotations/link.tsx","../src/parts/annotations/index.tsx","../src/parts/blocks/media-block.tsx","../src/parts/blocks/index.tsx","../src/parts/decorators/index.tsx","../src/parts/lists/index.tsx","../src/parts/spans/icon.tsx","../src/parts/spans/media.tsx","../src/parts/spans/index.tsx","../src/parts/styles/index.tsx","../src/parts/index.tsx","../src/index.tsx"],"sourcesContent":["import type { Presets } from \"./types\";\n\n// Presets are predefined configurations for the rich text field.\n// They allow users to quickly set up the field with common settings.\n// Users can still override these presets with custom options.\nexport const presets = {\n basic: {\n size: \"sm\",\n initiallyActive: true,\n allowedParts: [\"wild.richtext.decorator.em\", \"wild.richtext.decorator.strong\", \"wild.richtext.annotation.link\"],\n } as const,\n full: {\n size: \"lg\",\n initiallyActive: false,\n // Empty blacklist means \"enable all\".\n disallowedParts: [],\n } as const,\n} as const satisfies Presets;\n","import * as React from \"react\";\nimport type {\n ArrayOfObjectsInputProps,\n ArraySchemaType,\n BlockMarksDefinition,\n ObjectField,\n ObjectSchemaType,\n SchemaType,\n} from \"sanity\";\nimport { merge } from \"ts-deepmerge\";\nimport type { Part } from \"./parts\";\nimport { presets } from \"./presets\";\nimport type { FieldOptions, RichtextConfig, Size } from \"./types\";\n\nfunction handleListKind<E extends ObjectField<ArraySchemaType>>(entry: E, findNeedle: (needle: string) => boolean) {\n const list = entry.type?.options?.list;\n if (!list) return entry;\n const filteredList = list.filter((s) => findNeedle((s as { value: string }).value));\n return { ...entry, type: { ...entry.type, options: { ...entry.type.options, list: filteredList } } };\n}\n\nfunction handleOfKind<E extends ObjectField<ArraySchemaType>>(entry: E, findNeedle: (needle: string) => boolean) {\n const list = entry.type?.of;\n if (!list) return entry;\n const filteredOf = list.filter((a: { name: string }) => findNeedle(a.name));\n return { ...entry, type: { ...entry.type, of: filteredOf } };\n}\n\nconst sizeToHeightMap = {\n sm: \"10rem\",\n lg: \"50vh\",\n} as const satisfies Record<Size, string>;\n\nfunction RichtextInput({\n richtextConfig,\n ...props\n}: ArrayOfObjectsInputProps & {\n richtextConfig: RichtextConfig;\n}) {\n const schemaOptions = props.schemaType.options as FieldOptions | undefined;\n const presetOptions = schemaOptions?.preset ? presets[schemaOptions.preset] : {};\n\n const options = React.useMemo(() => {\n // The preset option is only used to fetch the preset options.\n // We can exclude it from the main options.\n const { preset: _, ...mainOptions } = schemaOptions ?? {};\n return merge(presetOptions, mainOptions);\n }, [schemaOptions, presetOptions]);\n\n const initiallyActive = options?.initiallyActive ?? false;\n\n // Height can either be a predefined size or a custom string value.\n // In the case of a custom string value, we use it as is.\n const height =\n options?.size && options.size in sizeToHeightMap\n ? sizeToHeightMap[options.size as keyof typeof sizeToHeightMap]\n : options?.size;\n\n const allowedParts = options?.allowedParts;\n const disallowedParts = options?.disallowedParts;\n if (allowedParts && disallowedParts) {\n console.warn(\n \"Wild Sanity Rich Text Field: Both `allowedParts` and `disallowedParts` are set. `allowedParts` will take precedence.\"\n );\n }\n\n const filterPartsBy = React.useCallback(\n <P extends unknown[]>(parts: P | undefined, findNeedle: (s: P[number]) => string | undefined) => {\n const filtered = parts?.filter((b) => {\n const needle = findNeedle(b) as Part | undefined;\n // This is undefined behavior. To not break user expectations, we keep the item.\n if (!needle) return true;\n if (allowedParts) return allowedParts.includes(needle);\n if (disallowedParts) return !disallowedParts.includes(needle);\n // By default the rich text field is a minimal as possible.\n return false;\n });\n\n return filtered as P;\n },\n [allowedParts, disallowedParts]\n );\n\n const enabledParts = React.useMemo(() => {\n const blocks = filterPartsBy(richtextConfig.blocks, (s) => s.name);\n const spans = filterPartsBy(richtextConfig.spans, (s) => s.name);\n const lists = filterPartsBy(richtextConfig.lists, (s) => s.value);\n const annotations = filterPartsBy(richtextConfig.annotations, (s) => s.name);\n const decorators = filterPartsBy(richtextConfig.decorators, (s) => s.value);\n const styles = filterPartsBy(richtextConfig.styles, (s) => s.value);\n\n // Always include the \"Normal\" style. It acts as a way for the users to reset the style.\n const normalizedStyles = [{ value: \"normal\", title: \"Normal\" }, ...styles];\n\n return { blocks, spans, lists, annotations, decorators, styles: normalizedStyles };\n }, [filterPartsBy]);\n\n const reshapeSchemaTypes = React.useCallback(\n (schema: ObjectSchemaType) => {\n // We only reshape the built-in block type children.\n if (schema.name !== \"block\") return schema;\n\n return {\n ...schema,\n fields: schema.fields?.map((f) => {\n const field = f as ObjectField<ArraySchemaType>;\n\n switch (field.name) {\n // Headings, Normal, Quote, etc.\n case \"style\":\n return handleListKind(field, (_) => enabledParts.styles.some((b) => b.value === _));\n // Ul, Ol, etc.\n case \"listItem\":\n return handleListKind(field, (_) => enabledParts.lists.some((b) => b.value === _));\n // Links, Colors, etc.\n case \"markDefs\":\n return handleOfKind(field, (_) => enabledParts.annotations.some((b) => b.name === _));\n // Text content.\n case \"children\": {\n // Always enable span type for text content.\n const spans = [...enabledParts.spans, { name: \"span\" }];\n const filtered = handleOfKind(field, (_) => spans.some((b) => b.name === _));\n\n return {\n ...filtered,\n type: {\n ...filtered.type,\n // Inline markers within the text content.\n of: filtered.type.of?.map((t: SchemaType) => {\n // Span is a reserved name in Sanity for text spans.\n // If the type is not a span, it means its a custom object type, so we return it as is.\n if (t.name !== \"span\") return t;\n\n const span = t as Partial<BlockMarksDefinition>;\n const annotations = span.annotations?.filter((a) => enabledParts.annotations.some((b) => b.name === a.name));\n const decorators = span.decorators?.filter((d) => enabledParts.decorators.some((b) => b.value === d.value));\n return { ...t, annotations, decorators };\n }),\n },\n };\n }\n default:\n return field;\n }\n }),\n };\n },\n [enabledParts]\n );\n\n const patchedSchemaType = React.useMemo(() => {\n const of = props.schemaType?.of;\n if (!Array.isArray(of)) return props.schemaType;\n\n // Just in case the reshaping fails, we return the original schema type.\n try {\n const filtered = of.filter((s) => {\n // A valid portabletext field must always contain the built-in block type.\n // Any other item is a custom block and must be explicitly enabled.\n return s.name === \"block\" || enabledParts.blocks.some((b) => b.name === s.name);\n });\n\n return {\n ...props.schemaType,\n of: filtered.map((s) => reshapeSchemaTypes(s as ObjectSchemaType)),\n };\n } catch (e) {\n console.error(\"Wild Sanity Rich Text Field: Error while reshaping schema types.\", e);\n return props.schemaType;\n }\n }, [props.schemaType, enabledParts.blocks, reshapeSchemaTypes]);\n\n const enabledPartsCount = React.useMemo(() => {\n return Object.values(enabledParts).reduce((acc, curr) => acc + curr.length, 0);\n }, [enabledParts]);\n\n return (\n <>\n <style>{`\n [data-wild-richtext-field] [data-testid=\"pt-editor\"][data-fullscreen=\"false\"] {\n height: var(--pt-editor-height, initial);\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.bullet\"] [data-list-prefix] > span::before,\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.number\"] [data-list-prefix] > span::before {\n font-size: 1.0em;\n display: inline-block;\n padding-top: 2px;\n color: inherit;\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.bullet\"] [data-list-prefix] > span::before {\n content: \"•\";\n }\n\n [data-wild-richtext-field] .pt-list-item [data-list-item=\"wild.richtext.list.number\"] [data-list-prefix] > span::before {\n content: counter(list-level-1) \". \";\n }\n `}</style>\n <div data-wild-richtext-field style={{ \"--pt-editor-height\": height ?? sizeToHeightMap.sm } as React.CSSProperties}>\n {props.renderDefault({\n ...props,\n initialActive: initiallyActive,\n displayInlineChanges: false,\n // If the only enabled part is a style part, its the default \"Normal\" style. No need to show the toolbar.\n hideToolbar: enabledPartsCount === 0 || (enabledPartsCount === 1 && enabledParts.styles.length === 1),\n // @ts-expect-error: schemaType.of is too narrow. The runtime type is valid.\n schemaType: patchedSchemaType,\n })}\n </div>\n </>\n );\n}\n\nexport { RichtextInput };\n","import type {\n ArrayDefinition,\n ArrayOfType,\n ArrayOptions,\n BlockDecoratorDefinition,\n BlockListDefinition,\n BlockStyleDefinition,\n} from \"sanity\";\nimport type { Part } from \"./parts\";\n\n/** @public */\nexport const typeName = \"wild.richtext\" as const;\n\nexport type RichtextConfig = {\n blocks?: ArrayOfType<\"object\">[];\n spans?: ArrayOfType<\"object\">[];\n styles?: BlockStyleDefinition[];\n lists?: BlockListDefinition[];\n annotations?: ArrayOfType<\"object\">[];\n decorators?: BlockDecoratorDefinition[];\n};\n\n/** @public */\nexport type PluginConfig = RichtextConfig & {\n spellCheck?: boolean;\n};\n\n// Presets are collections of commonly used field options.\n// They allow to quickly set up the richtext field with a predefined set of options.\n// Users can still override individual options when using a preset.\ntype Preset = Omit<FieldOptions, keyof ArrayOptions | \"preset\">;\nexport type Presets = Record<\"basic\" | \"full\", Preset>;\n\nexport type Size = \"sm\" | \"lg\";\n\n// The user can provide custom parts as strings, so we need to allow for that.\n// But we also want to provide type safety for the known parts.\ntype MaybePart = Part | (string & {});\n\n/** @public */\nexport type FieldOptions = ArrayOptions & {\n // The user can provide custom sizes as strings, so we need to allow for that.\n // But we also want to provide type safety for the known sizes.\n size?: Size | (string & {});\n preset?: keyof Presets;\n initiallyActive?: boolean;\n allowedParts?: MaybePart[];\n disallowedParts?: MaybePart[];\n};\n\n// Add the custom field definition to Sanity's intrinsic definitions\n// so that type checking works correctly when using this field type.\ndeclare module \"sanity\" {\n export interface IntrinsicDefinitions {\n [typeName]: Omit<ArrayDefinition, \"type\" | \"of\" | \"options\"> & {\n type: typeof typeName;\n options?: FieldOptions;\n };\n }\n}\n","import { defineField } from \"sanity\";\nimport { styled } from \"styled-components\";\nimport { typeName } from \"../../types\";\n\nconst ColorText = styled.span<{ color?: string }>`\n & > span {\n background-color: inherit;\n border-bottom: unset;\n color: ${({ color = \"inherit\" }) => color};\n }\n`;\n\nexport const textColor = defineField({\n type: \"object\",\n name: `${typeName}.annotation.textColor`,\n title: \"Text Color\",\n icon: () => <>🖋</>,\n fields: [defineField({ name: \"color\", type: \"wild.color\" })],\n components: {\n annotation: (props) => {\n // @ts-expect-error: Sanity types are not aware of the color field structure.\n const color = props.value?.color?.value as string;\n return <ColorText color={color}>{props.renderDefault(props)}</ColorText>;\n },\n },\n});\n\nconst ColorBg = styled.span<{ color?: string }>`\n & > span {\n background-color: ${({ color = \"inherit\" }) => color};\n border-bottom: unset;\n color: inherit;\n }\n`;\n\nexport const highlightColor = defineField({\n type: \"object\",\n name: `${typeName}.annotation.highlightColor`,\n title: \"Highlight Color\",\n icon: () => <>🖍</>,\n fields: [defineField({ name: \"color\", type: \"wild.color\" })],\n components: {\n annotation: (props) => {\n // @ts-expect-error: Sanity types are not aware of the color field structure.\n const color = props.value?.color?.value as string;\n return <ColorBg color={color}>{props.renderDefault(props)}</ColorBg>;\n },\n },\n});\n","import { LinkIcon } from \"@sanity/icons\";\nimport { defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const link = defineField({\n type: \"wild.link\",\n name: `${typeName}.annotation.link`,\n title: \"Link\",\n icon: LinkIcon,\n options: {\n collapsed: false,\n collapsible: false,\n },\n});\n","import { highlightColor, textColor } from \"./color\";\nimport { link } from \"./link\";\n\nexport const annotations = {\n link,\n textColor,\n highlightColor,\n} as const;\n","import { prepareMediaPreview, selectMediaPreview } from \"@madebywild/sanity-media-field\";\nimport { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const media = defineArrayMember({\n name: `${typeName}.block.media`,\n type: \"object\",\n title: \"Media Block\",\n description: \"Embed block video or image content.\",\n icon: () => <>🖼️</>,\n fields: [\n defineField({\n title: \"Wrap\",\n name: \"wrapping\",\n type: \"wild.wrapping\",\n }),\n defineField({\n name: \"appMedia\",\n type: \"wild.media\",\n options: {\n extensions: [\"customOptions\", \"customRatio\"],\n },\n }),\n defineField({\n name: \"caption\",\n type: \"text\",\n rows: 2,\n description: \"Add a caption for the media.\",\n }),\n ],\n preview: {\n select: selectMediaPreview(\"appMedia\"),\n prepare: (props) => prepareMediaPreview(props),\n },\n});\n","import { media } from \"./media-block\";\n\nexport const blocks = {\n media,\n} as const;\n","import { BoldIcon, CodeIcon, ItalicIcon } from \"@sanity/icons\";\nimport type { BlockDecoratorDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst strong = {\n title: \"Strong\",\n value: `${typeName}.decorator.strong`,\n icon: BoldIcon,\n component: ({ children }) => <strong>{children}</strong>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst em = {\n title: \"Emphasis\",\n value: `${typeName}.decorator.em`,\n icon: ItalicIcon,\n component: ({ children }) => <em>{children}</em>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst code = {\n title: \"Code\",\n value: `${typeName}.decorator.code`,\n icon: CodeIcon,\n component: ({ children }) => <code>{children}</code>,\n} as const satisfies BlockDecoratorDefinition;\n\nconst sup = {\n title: \"Sup\",\n value: `${typeName}.decorator.sup`,\n icon: () => <sup>[1]</sup>,\n component: ({ children }) => <sup style={{ verticalAlign: \"super\" }}>{children}</sup>,\n} as const satisfies BlockDecoratorDefinition;\n\nexport const decorators = {\n strong,\n em,\n code,\n sup,\n} as const;\n","import { OlistIcon, UlistIcon } from \"@sanity/icons\";\nimport type { BlockListDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst bullet = {\n title: \"Bullet\",\n value: `${typeName}.list.bullet`,\n icon: UlistIcon,\n} as const satisfies BlockListDefinition;\n\nconst number = {\n title: \"Number\",\n value: `${typeName}.list.number`,\n icon: OlistIcon,\n} as const satisfies BlockListDefinition;\n\nexport const lists = {\n bullet,\n number,\n} as const;\n","import * as React from \"react\";\nimport { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const icon = defineArrayMember({\n name: `${typeName}.span.icon`,\n type: \"object\",\n title: \"Icon\",\n description: \"Insert an icon.\",\n icon: () => <>🧿</>,\n fields: [defineField({ name: \"icon\", type: \"wild.icon\" })],\n components: {\n // This is the inline-preview in the PortableText editor.\n // It gets its props from the prepare function below.\n preview: (props) => {\n return React.isValidElement(props.media) ? props.media : props.fallbackTitle;\n },\n },\n preview: {\n select: {\n icon: \"icon\",\n },\n prepare({ icon }) {\n return {\n media: (\n <span role=\"img\" className=\"inline-block size-[1em] shrink-0 text-current\" title={icon ?? \"Icon\"}>\n 🧿\n </span>\n ),\n };\n },\n },\n});\n","import { defineArrayMember, defineField } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nexport const media = defineArrayMember({\n name: `${typeName}.span.media`,\n type: \"object\",\n title: \"Inline Media\",\n description: \"Embed inline video or image content.\",\n icon: () => <>🫧</>,\n fields: [\n defineField({\n name: \"media\",\n type: \"wild.media\",\n }),\n ],\n components: {\n // This is the inline-preview in the PortableText editor.\n preview: (props) => {\n const icons = {\n video: <>🎥</>,\n image: <>🖼️</>,\n lottie: <>🌀</>,\n rive: <>🍭</>,\n };\n\n // @ts-expect-error: It gets its props from the prepare function below.\n return icons[props.type as keyof typeof icons] || <>🖼️</>;\n },\n },\n preview: {\n select: {\n type: \"media.type\",\n },\n },\n});\n","import { icon } from \"./icon\";\nimport { media } from \"./media\";\n\nexport const spans = {\n icon,\n media,\n} as const;\n","import type { BlockStyleDefinition } from \"sanity\";\nimport { typeName } from \"../../types\";\n\nconst h2 = {\n title: \"Heading 2\",\n value: `${typeName}.style.h2`,\n component: ({ children }) => (\n <h2\n style={{\n fontSize: \"2.0625rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(41 / 33)\",\n }}\n >\n {children}\n </h2>\n ),\n} as const satisfies BlockStyleDefinition;\n\nconst h3 = {\n title: \"Heading 3\",\n value: `${typeName}.style.h3`,\n component: ({ children }) => (\n <h3\n style={{\n fontSize: \"1.6875rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(35 / 27)\",\n }}\n >\n {children}\n </h3>\n ),\n} as const satisfies BlockStyleDefinition;\n\nconst h4 = {\n title: \"Heading 4\",\n value: `${typeName}.style.h4`,\n component: ({ children }) => (\n <h4\n style={{\n fontSize: \"1.3125rem\",\n fontWeight: \"700\",\n lineHeight: \"calc(29 / 21)\",\n }}\n >\n {children}\n </h4>\n ),\n} as const satisfies BlockStyleDefinition;\n\nexport const styles = {\n h2,\n h3,\n h4,\n} as const;\n","import { annotations } from \"./annotations\";\nimport { blocks } from \"./blocks\";\nimport { decorators } from \"./decorators\";\nimport { lists } from \"./lists\";\nimport { spans } from \"./spans\";\nimport { styles } from \"./styles\";\n\nconst parts = {\n annotations,\n blocks,\n decorators,\n lists,\n spans,\n styles,\n} as const;\n\ntype Parts = typeof parts;\ntype Part =\n | Parts[\"annotations\"][keyof Parts[\"annotations\"]][\"name\"]\n | Parts[\"blocks\"][keyof Parts[\"blocks\"]][\"name\"]\n | Parts[\"decorators\"][keyof Parts[\"decorators\"]][\"value\"]\n | Parts[\"lists\"][keyof Parts[\"lists\"]][\"value\"]\n | Parts[\"spans\"][keyof Parts[\"spans\"]][\"name\"]\n | Parts[\"styles\"][keyof Parts[\"styles\"]][\"value\"];\n\nexport { parts, type Part };\n","import type { ArrayOfObjectsInputProps } from \"sanity\";\nimport { defineArrayMember, definePlugin, defineType } from \"sanity\";\nimport { RichtextInput } from \"./input\";\nimport { parts } from \"./parts\";\nimport { type FieldOptions, type PluginConfig, typeName } from \"./types\";\n\n/** @public */\nconst wildSanityRichtextFieldPlugin = definePlugin<PluginConfig>((config) => {\n const userSpans = config?.spans ?? [];\n const userLists = config?.lists ?? [];\n const userBlocks = config?.blocks ?? [];\n const userStyles = config?.styles ?? [];\n const userDecorators = config?.decorators ?? [];\n const userAnnotations = config?.annotations ?? [];\n\n const richtextConfig = {\n blocks: [...userBlocks, ...Object.values(parts.blocks)],\n spans: [...userSpans, ...Object.values(parts.spans)],\n lists: [...userLists, ...Object.values(parts.lists)],\n styles: [...userStyles, ...Object.values(parts.styles)],\n decorators: [...userDecorators, ...Object.values(parts.decorators)],\n annotations: [...userAnnotations, ...Object.values(parts.annotations)],\n };\n\n return {\n name: \"@madebywild/sanity-richtext-field\",\n schema: {\n types: [\n defineType({\n name: typeName,\n type: \"array\",\n title: \"Rich Text\",\n description: \"Rich text content with formatting options.\",\n icon: () => <>⌨️</>,\n components: {\n input: (props: ArrayOfObjectsInputProps) => <RichtextInput richtextConfig={richtextConfig} {...props} />,\n },\n of: [\n ...richtextConfig.blocks,\n defineArrayMember({\n type: \"block\",\n options: {\n spellCheck: config?.spellCheck ?? true,\n unstable_whitespaceOnPasteMode: \"normalize\",\n },\n of: richtextConfig.spans,\n styles: richtextConfig.styles,\n lists: richtextConfig.lists,\n marks: {\n annotations: richtextConfig.annotations,\n decorators: richtextConfig.decorators,\n },\n }),\n ],\n }),\n ],\n },\n };\n});\n\nexport { wildSanityRichtextFieldPlugin, typeName, type PluginConfig, type FieldOptions };\n"],"names":["presets","basic","size","initiallyActive","allowedParts","full","disallowedParts","handleListKind","entry","findNeedle","list","type","options","filteredList","filter","s","value","handleOfKind","of","filteredOf","a","name","sizeToHeightMap","sm","lg","RichtextInput","richtextConfig","props","schemaOptions","schemaType","presetOptions","preset","React","useMemo","_","mainOptions","merge","height","console","warn","filterPartsBy","useCallback","parts","b","needle","includes","enabledParts","blocks","spans","lists","annotations","decorators","styles","normalizedStyles","title","reshapeSchemaTypes","schema","fields","map","f","field","some","filtered","t","span","d","patchedSchemaType","Array","isArray","e","error","enabledPartsCount","Object","values","reduce","acc","curr","length","renderDefault","initialActive","displayInlineChanges","hideToolbar","typeName","ColorText","styled","color","textColor","defineField","icon","components","annotation","ColorBg","highlightColor","link","LinkIcon","collapsed","collapsible","media","defineArrayMember","description","extensions","rows","preview","select","selectMediaPreview","prepare","prepareMediaPreview","strong","BoldIcon","component","children","em","ItalicIcon","code","CodeIcon","sup","verticalAlign","bullet","UlistIcon","number","OlistIcon","isValidElement","fallbackTitle","video","image","lottie","rive","h2","fontSize","fontWeight","lineHeight","h3","h4","wildSanityRichtextFieldPlugin","definePlugin","config","userSpans","userLists","userBlocks","userStyles","userDecorators","userAnnotations","types","defineType","input","spellCheck","unstable_whitespaceOnPasteMode","marks"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@madebywild/sanity-richtext-field",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "UNLICENSED",
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "ts-deepmerge": "^7.0.3",
25
- "@madebywild/sanity-media-field": "0.2.11"
25
+ "@madebywild/sanity-media-field": "0.2.13"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "@sanity/icons": "^3.7.4",
package/src/input.tsx CHANGED
@@ -56,10 +56,12 @@ function RichtextInput({
56
56
  ? sizeToHeightMap[options.size as keyof typeof sizeToHeightMap]
57
57
  : options?.size;
58
58
 
59
- const whitelist = options?.whitelist;
60
- const blacklist = options?.blacklist;
61
- if (whitelist && blacklist) {
62
- console.warn("Wild Sanity Rich Text Field: Both whitelist and blacklist are set. Whitelist will take precedence.");
59
+ const allowedParts = options?.allowedParts;
60
+ const disallowedParts = options?.disallowedParts;
61
+ if (allowedParts && disallowedParts) {
62
+ console.warn(
63
+ "Wild Sanity Rich Text Field: Both `allowedParts` and `disallowedParts` are set. `allowedParts` will take precedence."
64
+ );
63
65
  }
64
66
 
65
67
  const filterPartsBy = React.useCallback(
@@ -68,15 +70,15 @@ function RichtextInput({
68
70
  const needle = findNeedle(b) as Part | undefined;
69
71
  // This is undefined behavior. To not break user expectations, we keep the item.
70
72
  if (!needle) return true;
71
- if (whitelist) return whitelist.includes(needle);
72
- if (blacklist) return !blacklist.includes(needle);
73
+ if (allowedParts) return allowedParts.includes(needle);
74
+ if (disallowedParts) return !disallowedParts.includes(needle);
73
75
  // By default the rich text field is a minimal as possible.
74
76
  return false;
75
77
  });
76
78
 
77
79
  return filtered as P;
78
80
  },
79
- [whitelist, blacklist]
81
+ [allowedParts, disallowedParts]
80
82
  );
81
83
 
82
84
  const enabledParts = React.useMemo(() => {
@@ -8,7 +8,6 @@ export const link = defineField({
8
8
  title: "Link",
9
9
  icon: LinkIcon,
10
10
  options: {
11
- noCustomText: true,
12
11
  collapsed: false,
13
12
  collapsible: false,
14
13
  },
@@ -18,7 +18,7 @@ export const media = defineArrayMember({
18
18
  name: "appMedia",
19
19
  type: "wild.media",
20
20
  options: {
21
- features: ["customOptions", "customRatio"],
21
+ extensions: ["customOptions", "customRatio"],
22
22
  },
23
23
  }),
24
24
  defineField({
package/src/presets.tsx CHANGED
@@ -7,12 +7,12 @@ export const presets = {
7
7
  basic: {
8
8
  size: "sm",
9
9
  initiallyActive: true,
10
- whitelist: ["wild.richtext.decorator.em", "wild.richtext.decorator.strong", "wild.richtext.annotation.link"],
10
+ allowedParts: ["wild.richtext.decorator.em", "wild.richtext.decorator.strong", "wild.richtext.annotation.link"],
11
11
  } as const,
12
12
  full: {
13
13
  size: "lg",
14
14
  initiallyActive: false,
15
15
  // Empty blacklist means "enable all".
16
- blacklist: [],
16
+ disallowedParts: [],
17
17
  } as const,
18
18
  } as const satisfies Presets;
package/src/types.tsx CHANGED
@@ -33,6 +33,10 @@ export type Presets = Record<"basic" | "full", Preset>;
33
33
 
34
34
  export type Size = "sm" | "lg";
35
35
 
36
+ // The user can provide custom parts as strings, so we need to allow for that.
37
+ // But we also want to provide type safety for the known parts.
38
+ type MaybePart = Part | (string & {});
39
+
36
40
  /** @public */
37
41
  export type FieldOptions = ArrayOptions & {
38
42
  // The user can provide custom sizes as strings, so we need to allow for that.
@@ -40,10 +44,8 @@ export type FieldOptions = ArrayOptions & {
40
44
  size?: Size | (string & {});
41
45
  preset?: keyof Presets;
42
46
  initiallyActive?: boolean;
43
- // The user can provide custom parts as strings, so we need to allow for that.
44
- // But we also want to provide type safety for the known parts.
45
- whitelist?: (Part | (string & {}))[];
46
- blacklist?: (Part | (string & {}))[];
47
+ allowedParts?: MaybePart[];
48
+ disallowedParts?: MaybePart[];
47
49
  };
48
50
 
49
51
  // Add the custom field definition to Sanity's intrinsic definitions