@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 +7 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +7 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/input.tsx +9 -7
- package/src/parts/annotations/link.tsx +0 -1
- package/src/parts/blocks/media-block.tsx +1 -1
- package/src/presets.tsx +2 -2
- package/src/types.tsx +6 -4
package/dist/index.cjs
CHANGED
|
@@ -21,13 +21,13 @@ const presets = {
|
|
|
21
21
|
basic: {
|
|
22
22
|
size: "sm",
|
|
23
23
|
initiallyActive: !0,
|
|
24
|
-
|
|
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
|
-
|
|
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,
|
|
75
|
-
|
|
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 ?
|
|
79
|
-
}), [
|
|
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
|
-
|
|
253
|
+
extensions: ["customOptions", "customRatio"]
|
|
255
254
|
}
|
|
256
255
|
}), sanity.defineField({
|
|
257
256
|
name: "caption",
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
-
|
|
151
|
-
|
|
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
|
-
|
|
151
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
63
|
-
|
|
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 ?
|
|
67
|
-
}), [
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
60
|
-
const
|
|
61
|
-
if (
|
|
62
|
-
console.warn(
|
|
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 (
|
|
72
|
-
if (
|
|
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
|
-
[
|
|
81
|
+
[allowedParts, disallowedParts]
|
|
80
82
|
);
|
|
81
83
|
|
|
82
84
|
const enabledParts = React.useMemo(() => {
|
package/src/presets.tsx
CHANGED
|
@@ -7,12 +7,12 @@ export const presets = {
|
|
|
7
7
|
basic: {
|
|
8
8
|
size: "sm",
|
|
9
9
|
initiallyActive: true,
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
44
|
-
|
|
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
|