@pixerate/editor 0.4.1 → 0.4.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/extensions/gradient-text.ts","../../src/grammar/tokens.ts","../../src/extensions/slash-commands.ts","../../src/extensions/template-suggestions.ts","../../src/extensions/loading-node.ts","../../src/extensions/SmilieReplacer.ts","../../src/extensions/ColorHighlighter.ts","../../src/extensions/FontSize.ts","../../src/extensions/rich-text-preset.ts","../../src/extensions/mention.ts"],"sourcesContent":["import { Mark } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\nimport type { EditorState } from \"@tiptap/pm/state\";\nimport { TEMPLATE_REGEX, VARIABLE_REGEX, INSTRUCTION_REGEX, ColorGradient } from \"../grammar/tokens\";\n\nexport interface GradientTextOptions {\n templateColorMap: Map<string, ColorGradient>;\n speed?: number;\n jsonVariables?: string[] | Set<string>;\n onTemplateClick?: (templateName: string, event: MouseEvent) => void;\n}\n\nconst createGradientDecorations = (\n doc: ProsemirrorNode,\n options: GradientTextOptions,\n): Decoration[] => {\n const decorations: Decoration[] = [];\n const speed = options.speed ?? 1;\n const jsonVarSet = options.jsonVariables\n ? options.jsonVariables instanceof Set\n ? options.jsonVariables\n : new Set(options.jsonVariables)\n : null;\n\n doc.descendants((node, pos) => {\n if (node.isText) {\n const text = node.text || \"\";\n let match: RegExpExecArray | null;\n\n // 1. Template: {{templateName}}\n const tmplRegex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);\n while ((match = tmplRegex.exec(text)) !== null) {\n const templateName = match[1].trim();\n const colors = options.templateColorMap?.get(templateName);\n\n if (colors) {\n const start = pos + match.index;\n const end = start + match[0].length;\n const { from: colorFrom, to: colorTo } = colors;\n\n const style = `--bg-size: ${\n speed * 300\n }%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important;`;\n\n decorations.push(\n Decoration.inline(start, end, {\n class:\n \"inline animate-gradient bg-gradient-to-r from-[var(--color-from)] via-[var(--color-to)] to-[var(--color-from)] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent border border-(--color-to)/20 px-1 py-0.5 rounded-sm cursor-pointer\",\n style,\n \"data-template\": templateName,\n }),\n );\n }\n }\n\n // 2. Instruction: __text__\n const instRegex = new RegExp(\n INSTRUCTION_REGEX.source,\n INSTRUCTION_REGEX.flags,\n );\n while ((match = instRegex.exec(text)) !== null) {\n const content = match[1].trim();\n const colors = options.templateColorMap?.get(content) || {\n from: \"#ffaa40\",\n to: \"#9c40ff\",\n };\n\n const start = pos + match.index;\n const end = start + match[0].length;\n const { from: colorFrom, to: colorTo } = colors;\n\n const style = `--bg-size: ${\n speed * 300\n }%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important;`;\n\n decorations.push(\n Decoration.inline(start, end, {\n class:\n \"italic animate-gradient bg-gradient-to-r from-rose-400 from-50% to-violet-500 to-50% bg-size-[200%_100%] bg-clip-text text-transparent inline-flex items-baseline gap-0.5\",\n style,\n }),\n );\n }\n\n // 3. Variable: {variableName}\n const varRegex = new RegExp(\n VARIABLE_REGEX.source,\n VARIABLE_REGEX.flags,\n );\n while ((match = varRegex.exec(text)) !== null) {\n const variableName = match[1].trim();\n const start = pos + match.index;\n const end = start + match[0].length;\n const isJsonVar = jsonVarSet?.has(variableName);\n\n decorations.push(\n Decoration.inline(start, end, {\n class: isJsonVar\n ? \"bg-violet-400/40 border-b-4 border-rose-300 dark:border-rose-800 inline-flex items-baseline px-1 py-0 text-foreground/80 gap-0.5 rounded-xs\"\n : \"bg-rose-400/40 border-b-4 border-violet-300 dark:border-violet-800 inline-flex items-baseline px-1 py-0 text-foreground/80 gap-0.5 rounded-xs\",\n \"data-variable\": variableName,\n }),\n );\n }\n }\n });\n\n return decorations;\n};\n\nexport const GradientText = Mark.create<GradientTextOptions>({\n name: \"gradientText\",\n\n addOptions() {\n return {\n templateColorMap: new Map(),\n speed: 1,\n jsonVariables: undefined,\n onTemplateClick: undefined,\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const defaultColors = {\n from: \"#ffaa40\",\n to: \"#9c40ff\",\n };\n const speed = this.options.speed ?? 1;\n const style = `--bg-size: ${speed * 300}%; --color-from: ${\n defaultColors.from\n }; --color-to: ${defaultColors.to}; caret-color: #111 !important;`;\n\n return [\n \"span\",\n {\n class:\n \"inline animate-gradient bg-gradient-to-r from-[var(--color-from)] via-[var(--color-to)] to-[var(--color-from)] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent\",\n style,\n ...HTMLAttributes,\n },\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: \"span\",\n getAttrs: (node) =>\n (node as HTMLElement).classList.contains(\"animate-gradient\") &&\n (node as HTMLElement).classList.contains(\"bg-clip-text\") &&\n null,\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const markOptions = this.options;\n\n return [\n new Plugin({\n state: {\n init(_, { doc }) {\n return DecorationSet.create(\n doc,\n createGradientDecorations(doc, markOptions),\n );\n },\n apply(tr, value: DecorationSet) {\n const newDoc = tr.doc;\n if (tr.docChanged) {\n return DecorationSet.create(\n newDoc,\n createGradientDecorations(newDoc, markOptions),\n );\n }\n return value.map(tr.mapping, newDoc);\n },\n },\n props: {\n decorations(state: EditorState) {\n return (this as any).getState(state) as DecorationSet;\n },\n handleClickOn(view, pos, _node, _nodePos, event) {\n const decorationSet = (this as any).getState(\n view.state,\n ) as DecorationSet;\n const decorations = decorationSet.find(pos, pos + 1);\n\n for (const decoration of decorations) {\n const decorationWithAttrs = decoration as any;\n const templateName =\n decorationWithAttrs.type?.attrs?.[\"data-template\"];\n if (templateName) {\n if (markOptions.onTemplateClick) {\n markOptions.onTemplateClick(templateName, event as MouseEvent);\n }\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"show-gradient-popover\", {\n detail: {\n templateName,\n target: event.target,\n },\n }),\n );\n }\n return true;\n }\n }\n return false;\n },\n },\n }),\n ];\n },\n});\n","/**\n * Canonical regex patterns for prompt editing tokens.\n */\nexport const TEMPLATE_REGEX = /{{\\s*([^}]+?)\\s*}}/g;\nexport const VARIABLE_REGEX = /(?<!\\{)\\{([^{}]+)\\}(?!\\})/g;\nexport const INSTRUCTION_REGEX = /__(.+?)__/g;\n\n// Backward-compatible camelCase aliases\nexport const templateRegex = TEMPLATE_REGEX;\nexport const variableRegex = VARIABLE_REGEX;\nexport const instructionRegex = INSTRUCTION_REGEX;\n\nexport type TokenType = \"template\" | \"variable\" | \"instruction\" | \"text\";\n\nexport interface Token {\n type: TokenType;\n raw: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport interface TemplateVersion {\n id: string;\n version: string | number;\n body: string;\n createdAt?: any;\n [key: string]: any;\n}\n\nexport interface Template {\n id?: string;\n name: string;\n body?: string;\n latestVersion?: string | number;\n versions?: TemplateVersion[];\n color?: string;\n [key: string]: any;\n}\n\nexport interface ColorGradient {\n from: string;\n to: string;\n}\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\n\nexport interface SlashCommandMatchData {\n match: RegExpMatchArray;\n query: string;\n from: number;\n to: number;\n coords: { top: number; left: number; bottom: number; right: number };\n}\n\nexport interface SlashCommandsOptions {\n trigger?: string;\n onMatch?: (data: SlashCommandMatchData) => void;\n onClear?: () => void;\n containerId?: string;\n}\n\nexport const SlashCommands = Extension.create<SlashCommandsOptions>({\n name: \"slashCommands\",\n\n addOptions() {\n return {\n trigger: \"/\",\n onMatch: undefined,\n onClear: undefined,\n containerId: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const opts = this.options;\n\n return [\n new Plugin({\n view() {\n return {\n update(view) {\n const { state } = view;\n const { selection } = state;\n const { $from } = selection;\n\n if (!$from.parent.isTextblock) {\n opts.onClear?.();\n return;\n }\n\n const textBeforeCursor = $from.parent.textBetween(\n 0,\n $from.parentOffset,\n );\n\n const slashMatch = textBeforeCursor.match(\n /(?:^|\\s)\\/([a-zA-Z0-9_-]*)$/,\n );\n\n if (slashMatch) {\n const matchIndex = slashMatch.index ?? 0;\n const offsetInParent =\n matchIndex + (slashMatch[0].startsWith(\" \") ? 1 : 0);\n const matchFrom = $from.start() + offsetInParent;\n const matchTo = $from.pos;\n const coords = view.coordsAtPos($from.pos);\n\n let relativeCoords = {\n top: coords.top,\n left: coords.left,\n bottom: coords.bottom,\n right: coords.right,\n };\n\n if (opts.containerId && typeof document !== \"undefined\") {\n const container = document.getElementById(opts.containerId);\n if (container) {\n const rect = container.getBoundingClientRect();\n relativeCoords = {\n top: coords.bottom - rect.top + 5,\n left: coords.left - rect.left,\n bottom: coords.bottom - rect.top,\n right: coords.right - rect.left,\n };\n }\n }\n\n opts.onMatch?.({\n match: slashMatch,\n query: slashMatch[1] || \"\",\n from: matchFrom,\n to: matchTo,\n coords: relativeCoords,\n });\n } else {\n opts.onClear?.();\n }\n },\n };\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport Suggestion, { SuggestionOptions } from \"@tiptap/suggestion\";\nimport { Template } from \"../grammar/tokens\";\n\nexport interface TemplateSuggestionsOptions {\n templates: Template[];\n char?: string;\n onSuggestion?: (props: {\n query: string;\n range: { from: number; to: number };\n clientRect?: (() => DOMRect | null) | null;\n items: Template[];\n command: (props: { name: string }) => void;\n }) => void;\n}\n\nexport const TemplateSuggestions = Extension.create<TemplateSuggestionsOptions>({\n name: \"templateSuggestions\",\n\n addOptions() {\n return {\n templates: [],\n char: \"{{\",\n onSuggestion: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const opts = this.options;\n\n const suggestionConfig: Omit<SuggestionOptions<Template>, \"editor\"> = {\n char: opts.char || \"{{\",\n items: ({ query }) => {\n const lower = query.toLowerCase();\n return (opts.templates || []).filter((t) =>\n t.name.toLowerCase().includes(lower),\n );\n },\n command: ({ editor, range, props }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent(`{{${props.name}}}`)\n .run();\n },\n render: () => {\n return {\n onStart: (props) => {\n opts.onSuggestion?.(props as any);\n },\n onUpdate: (props) => {\n opts.onSuggestion?.(props as any);\n },\n onExit: () => {\n opts.onSuggestion?.({\n query: \"\",\n range: { from: 0, to: 0 },\n items: [],\n command: () => {},\n });\n },\n };\n },\n };\n\n const SuggestionFn =\n typeof Suggestion === \"function\"\n ? Suggestion\n : (Suggestion as any)?.default || (Suggestion as any)?.Suggestion;\n\n return [\n SuggestionFn({\n editor: this.editor,\n ...suggestionConfig,\n }),\n ];\n },\n});\n","import { Node, mergeAttributes } from \"@tiptap/core\";\n\nexport const LoadingNode = Node.create({\n name: \"loadingNode\",\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) return {};\n return { \"data-id\": attributes.id };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span[data-type=\"loading\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"loading\",\n class: \"inline-flex items-center px-1.5 py-0.5 text-xs text-muted-foreground animate-pulse\",\n }),\n \"⏳\",\n ];\n },\n});\n","import { Extension, textInputRule } from \"@tiptap/core\";\n\nexport const SmilieReplacer = Extension.create({\n name: \"smilieReplacer\",\n\n addInputRules() {\n return [\n textInputRule({ find: /-___- $/, replace: \"😑 \" }),\n textInputRule({ find: /:'-\\) $/, replace: \"😂 \" }),\n textInputRule({ find: /':-\\) $/, replace: \"😅 \" }),\n textInputRule({ find: /':-D $/, replace: \"😅 \" }),\n textInputRule({ find: />:-\\) $/, replace: \"😆 \" }),\n textInputRule({ find: /-__- $/, replace: \"😑 \" }),\n textInputRule({ find: /':-\\( $/, replace: \"😓 \" }),\n textInputRule({ find: /:'-\\( $/, replace: \"😢 \" }),\n textInputRule({ find: />:-\\( $/, replace: \"😠 \" }),\n textInputRule({ find: /O:-\\) $/, replace: \"😇 \" }),\n textInputRule({ find: /:'\\) $/, replace: \"😂 \" }),\n textInputRule({ find: /:-D $/, replace: \"😃 \" }),\n textInputRule({ find: /':\\) $/, replace: \"😅 \" }),\n textInputRule({ find: /;-\\) $/, replace: \"😉 \" }),\n textInputRule({ find: /B-\\) $/, replace: \"😎 \" }),\n textInputRule({ find: /:-\\* $/, replace: \"😘 \" }),\n textInputRule({ find: /:-\\) $/, replace: \"🙂 \" }),\n textInputRule({ find: /-_- $/, replace: \"😑 \" }),\n textInputRule({ find: /:-O $/, replace: \"😮 \" }),\n textInputRule({ find: /:-P $/, replace: \"😛 \" }),\n textInputRule({ find: /:-p $/, replace: \"😛 \" }),\n textInputRule({ find: /:-\\/ $/, replace: \"😕 \" }),\n textInputRule({ find: /:-\\( $/, replace: \"😞 \" }),\n textInputRule({ find: /:'\\( $/, replace: \"😢 \" }),\n textInputRule({ find: /:D $/, replace: \"😃 \" }),\n textInputRule({ find: /=D $/, replace: \"😃 \" }),\n textInputRule({ find: /;\\) $/, replace: \"😉 \" }),\n textInputRule({ find: /B\\) $/, replace: \"😎 \" }),\n textInputRule({ find: /:\\) $/, replace: \"🙂 \" }),\n textInputRule({ find: /=\\) $/, replace: \"🙂 \" }),\n textInputRule({ find: /:O $/, replace: \"😮 \" }),\n textInputRule({ find: /:P $/, replace: \"😛 \" }),\n textInputRule({ find: /:p $/, replace: \"😛 \" }),\n textInputRule({ find: /:\\/ $/, replace: \"😕 \" }),\n textInputRule({ find: /:\\( $/, replace: \"😞 \" }),\n textInputRule({ find: /<3 $/, replace: \"❤️ \" }),\n textInputRule({ find: /<\\/3 $/, replace: \"💔 \" }),\n textInputRule({ find: /\\/shrug $/, replace: \"¯\\\\_(ツ)_/¯ \" }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\n\nexport function findHexColors(doc: ProsemirrorNode): DecorationSet {\n const hexColorRegex = /(#[0-9a-fA-F]{3,8})\\b/g;\n const decorations: Decoration[] = [];\n\n doc.descendants((node, position) => {\n if (!node.text) return;\n\n let match: RegExpExecArray | null;\n while ((match = hexColorRegex.exec(node.text)) !== null) {\n const color = match[0];\n const from = position + match.index;\n const to = from + color.length;\n\n decorations.push(\n Decoration.inline(from, to, {\n class: \"color-highlight px-1 py-0.5 rounded text-xs font-mono border\",\n style: `--color: ${color}; background-color: ${color}20; border-color: ${color}; color: ${color};`,\n }),\n );\n }\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nexport const ColorHighlighter = Extension.create({\n name: \"colorHighlighter\",\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n state: {\n init(_, { doc }) {\n return findHexColors(doc);\n },\n apply(transaction, oldState) {\n return transaction.docChanged ? findHexColors(transaction.doc) : oldState;\n },\n },\n props: {\n decorations(state) {\n return (this as any).getState(state);\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport \"@tiptap/extension-text-style\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nexport const FontSize = Extension.create({\n name: \"fontSize\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) =>\n element.style.fontSize.replace(/['\"]+/g, \"\"),\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { fontSize }).run(),\n unsetFontSize:\n () =>\n ({ chain }) =>\n chain()\n .setMark(\"textStyle\", { fontSize: null })\n .removeEmptyTextStyle()\n .run(),\n };\n },\n});\n\nexport default FontSize;\n","import { wrappingInputRule, markInputRule, type Extensions } from \"@tiptap/core\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Color from \"@tiptap/extension-color\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport Link from \"@tiptap/extension-link\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport * as _TextStyle from \"@tiptap/extension-text-style\";\nconst TextStyle = (_TextStyle as any).TextStyle || (_TextStyle as any).default || _TextStyle;\nimport Typography from \"@tiptap/extension-typography\";\nimport Underline from \"@tiptap/extension-underline\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport CharacterCount from \"@tiptap/extension-character-count\";\n\nimport { SmilieReplacer } from \"./SmilieReplacer\";\nimport { ColorHighlighter } from \"./ColorHighlighter\";\nimport { FontSize } from \"./FontSize\";\nimport { Mention, type MentionOptions } from \"./mention\";\n\nexport interface RichTextPresetOptions {\n placeholder?: string | ((props: { node: any }) => string);\n characterLimit?: number;\n openLinksOnClick?: boolean;\n enableSmilies?: boolean;\n enableColorHighlighter?: boolean;\n headingLevels?: (1 | 2 | 3 | 4 | 5 | 6)[];\n mention?: MentionOptions | boolean;\n}\n\n/**\n * Creates a standard rich-text extensions bundle with full formatting support.\n */\nexport function createRichTextPreset(\n options: RichTextPresetOptions = {},\n): Extensions {\n const {\n placeholder = \"Start typing...\",\n characterLimit,\n openLinksOnClick = false,\n enableSmilies = true,\n enableColorHighlighter = true,\n headingLevels = [1, 2, 3, 4],\n } = options;\n\n const extensions: Extensions = [\n StarterKit.configure({\n orderedList: {\n HTMLAttributes: {\n class: \"list-decimal pl-4\",\n },\n },\n bulletList: {\n HTMLAttributes: {\n class: \"list-disc pl-4\",\n },\n },\n heading: {\n levels: headingLevels,\n HTMLAttributes: {\n class: \"font-bold tracking-tight\",\n },\n },\n }),\n TextStyle,\n Color,\n Highlight.configure({ multicolor: true }),\n Underline,\n Typography,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Link.extend({\n addInputRules() {\n return [\n markInputRule({\n find: /(?:^|\\s)\\[([^\\]]+)\\]\\(([^)]+)\\)$/,\n type: this.type,\n getAttributes: (match) => ({\n href: match[2],\n }),\n }),\n ];\n },\n }).configure({\n openOnClick: openLinksOnClick,\n autolink: true,\n defaultProtocol: \"https\",\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n class: \"text-blue-500 underline underline-offset-2\",\n },\n }),\n TaskList,\n TaskItem.extend({\n addInputRules() {\n return [\n wrappingInputRule({\n find: /^\\s*(\\[([ |x])?\\])\\s$/i,\n type: this.type,\n getAttributes: (match) => ({\n checked: match[2]?.toLowerCase() === \"x\",\n }),\n }),\n ];\n },\n }).configure({\n nested: true,\n }),\n FontSize,\n Placeholder.configure({\n emptyEditorClass: \"is-empty\",\n placeholder:\n typeof placeholder === \"function\"\n ? placeholder\n : () => placeholder,\n }),\n ];\n\n if (characterLimit) {\n extensions.push(\n CharacterCount.configure({\n limit: characterLimit,\n }),\n );\n }\n\n if (enableSmilies) {\n extensions.push(SmilieReplacer);\n }\n\n if (enableColorHighlighter) {\n extensions.push(ColorHighlighter);\n }\n\n if (options.mention) {\n const mentionConfig = typeof options.mention === \"object\" ? options.mention : {};\n extensions.push(\n Mention.configure({\n HTMLAttributes: {\n class: \"pixerate-mention-node\",\n ...(mentionConfig.HTMLAttributes || {}),\n },\n ...mentionConfig,\n }),\n );\n }\n\n return extensions;\n}\n","import MentionExtension, {\n type MentionOptions as TipTapMentionOptions,\n} from \"@tiptap/extension-mention\";\nimport type { SuggestionOptions } from \"@tiptap/suggestion\";\n\nexport interface MentionEntity {\n id: string;\n label: string;\n type?: string;\n avatarUrl?: string;\n color?: string;\n [key: string]: any;\n}\n\nexport interface MentionOptions extends Partial<TipTapMentionOptions> {\n HTMLAttributes?: Record<string, any>;\n suggestion?: Partial<SuggestionOptions<MentionEntity>>;\n}\n\n/**\n * First-class native Mention extension for @pixerate/editor.\n * Creates atomic inline <span data-type=\"mention\"> nodes with full suggestion support.\n */\nexport const Mention = MentionExtension.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n type: {\n default: null,\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(\"data-type-name\") ||\n element.getAttribute(\"data-entity-type\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.type) return {};\n return { \"data-type-name\": attributes.type };\n },\n },\n avatarUrl: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-avatar-url\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.avatarUrl) return {};\n return { \"data-avatar-url\": attributes.avatarUrl };\n },\n },\n color: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-color\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.color) return {};\n return { \"data-color\": attributes.color };\n },\n },\n };\n },\n});\n\n/**\n * Helper to configure the Mention extension with preset defaults.\n */\nexport function createMentionExtension(options: Partial<MentionOptions> = {}) {\n const { HTMLAttributes = {}, ...rest } = options;\n return Mention.configure({\n HTMLAttributes: {\n class: \"pixerate-mention-node\",\n ...HTMLAttributes,\n },\n ...rest,\n });\n}\n"],"mappings":"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","names":["Plugin","Extension","Extension","Extension","Plugin","Decoration","DecorationSet","Extension","TextStyle"]}
1
+ {"version":3,"sources":["../../src/extensions/gradient-text.ts","../../src/grammar/tokens.ts","../../src/extensions/slash-commands.ts","../../src/extensions/template-suggestions.ts","../../src/extensions/loading-node.ts","../../src/extensions/SmilieReplacer.ts","../../src/extensions/ColorHighlighter.ts","../../src/extensions/FontSize.ts","../../src/extensions/rich-text-preset.ts","../../src/extensions/mention.ts"],"sourcesContent":["import { Mark } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\nimport type { EditorState } from \"@tiptap/pm/state\";\nimport { TEMPLATE_REGEX, VARIABLE_REGEX, INSTRUCTION_REGEX, ColorGradient } from \"../grammar/tokens\";\n\nexport interface GradientTextOptions {\n templateColorMap: Map<string, ColorGradient>;\n speed?: number;\n jsonVariables?: string[] | Set<string>;\n onTemplateClick?: (templateName: string, event: MouseEvent) => void;\n}\n\nconst createGradientDecorations = (\n doc: ProsemirrorNode,\n options: GradientTextOptions,\n): Decoration[] => {\n const decorations: Decoration[] = [];\n const speed = options.speed ?? 1;\n const jsonVarSet = options.jsonVariables\n ? options.jsonVariables instanceof Set\n ? options.jsonVariables\n : new Set(options.jsonVariables)\n : null;\n\n doc.descendants((node, pos) => {\n if (node.isText) {\n const text = node.text || \"\";\n let match: RegExpExecArray | null;\n\n // 1. Template: {{templateName}}\n const tmplRegex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);\n while ((match = tmplRegex.exec(text)) !== null) {\n const templateName = match[1].trim();\n const colors = options.templateColorMap?.get(templateName);\n\n if (colors) {\n const start = pos + match.index;\n const end = start + match[0].length;\n const { from: colorFrom, to: colorTo } = colors;\n\n const style = `--bg-size: ${\n speed * 300\n }%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important; background-image: linear-gradient(to right, ${colorFrom}, ${colorTo}, ${colorFrom}); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent;`;\n\n decorations.push(\n Decoration.inline(start, end, {\n class:\n \"inline animate-gradient bg-gradient-to-r from-[var(--color-from)] via-[var(--color-to)] to-[var(--color-from)] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent border border-(--color-to)/20 px-1 py-0.5 rounded-sm cursor-pointer\",\n style,\n \"data-template\": templateName,\n }),\n );\n }\n }\n\n // 2. Instruction: __text__\n const instRegex = new RegExp(\n INSTRUCTION_REGEX.source,\n INSTRUCTION_REGEX.flags,\n );\n while ((match = instRegex.exec(text)) !== null) {\n const content = match[1].trim();\n const colors = options.templateColorMap?.get(content) || {\n from: \"#ffaa40\",\n to: \"#9c40ff\",\n };\n\n const start = pos + match.index;\n const end = start + match[0].length;\n const { from: colorFrom, to: colorTo } = colors;\n\n const style = `--bg-size: ${\n speed * 300\n }%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important; background-image: linear-gradient(to right, #fb7185, #8b5cf6, #fb7185); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent;`;\n\n decorations.push(\n Decoration.inline(start, end, {\n class:\n \"italic animate-gradient bg-gradient-to-r from-rose-400 from-50% to-violet-500 to-50% bg-size-[200%_100%] bg-clip-text text-transparent inline-flex items-baseline gap-0.5\",\n style,\n }),\n );\n }\n\n // 3. Variable: {variableName}\n const varRegex = new RegExp(\n VARIABLE_REGEX.source,\n VARIABLE_REGEX.flags,\n );\n while ((match = varRegex.exec(text)) !== null) {\n const variableName = match[1].trim();\n const start = pos + match.index;\n const end = start + match[0].length;\n const isJsonVar = jsonVarSet?.has(variableName);\n\n decorations.push(\n Decoration.inline(start, end, {\n class: isJsonVar\n ? \"bg-violet-400/40 border-b-4 border-rose-300 dark:border-rose-800 inline-flex items-baseline px-1 py-0 text-foreground/80 gap-0.5 rounded-xs\"\n : \"bg-rose-400/40 border-b-4 border-violet-300 dark:border-violet-800 inline-flex items-baseline px-1 py-0 text-foreground/80 gap-0.5 rounded-xs\",\n \"data-variable\": variableName,\n }),\n );\n }\n }\n });\n\n return decorations;\n};\n\nexport const GradientText = Mark.create<GradientTextOptions>({\n name: \"gradientText\",\n\n addOptions() {\n return {\n templateColorMap: new Map(),\n speed: 1,\n jsonVariables: undefined,\n onTemplateClick: undefined,\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const defaultColors = {\n from: \"#ffaa40\",\n to: \"#9c40ff\",\n };\n const speed = this.options.speed ?? 1;\n const style = `--bg-size: ${speed * 300}%; --color-from: ${\n defaultColors.from\n }; --color-to: ${defaultColors.to}; caret-color: #111 !important;`;\n\n return [\n \"span\",\n {\n class:\n \"inline animate-gradient bg-gradient-to-r from-[var(--color-from)] via-[var(--color-to)] to-[var(--color-from)] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent\",\n style,\n ...HTMLAttributes,\n },\n 0,\n ];\n },\n\n parseHTML() {\n return [\n {\n tag: \"span\",\n getAttrs: (node) =>\n (node as HTMLElement).classList.contains(\"animate-gradient\") &&\n (node as HTMLElement).classList.contains(\"bg-clip-text\") &&\n null,\n },\n ];\n },\n\n addProseMirrorPlugins() {\n const markOptions = this.options;\n\n return [\n new Plugin({\n state: {\n init(_, { doc }) {\n return DecorationSet.create(\n doc,\n createGradientDecorations(doc, markOptions),\n );\n },\n apply(tr, value: DecorationSet) {\n const newDoc = tr.doc;\n if (tr.docChanged) {\n return DecorationSet.create(\n newDoc,\n createGradientDecorations(newDoc, markOptions),\n );\n }\n return value.map(tr.mapping, newDoc);\n },\n },\n props: {\n decorations(state: EditorState) {\n return (this as any).getState(state) as DecorationSet;\n },\n handleClickOn(view, pos, _node, _nodePos, event) {\n const decorationSet = (this as any).getState(\n view.state,\n ) as DecorationSet;\n const decorations = decorationSet.find(pos, pos + 1);\n\n for (const decoration of decorations) {\n const decorationWithAttrs = decoration as any;\n const templateName =\n decorationWithAttrs.type?.attrs?.[\"data-template\"];\n if (templateName) {\n if (markOptions.onTemplateClick) {\n markOptions.onTemplateClick(templateName, event as MouseEvent);\n }\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"show-gradient-popover\", {\n detail: {\n templateName,\n target: event.target,\n },\n }),\n );\n }\n return true;\n }\n }\n return false;\n },\n },\n }),\n ];\n },\n});\n","/**\n * Canonical regex patterns for prompt editing tokens.\n */\nexport const TEMPLATE_REGEX = /{{\\s*([^}]+?)\\s*}}/g;\nexport const VARIABLE_REGEX = /(?<!\\{)\\{([^{}]+)\\}(?!\\})/g;\nexport const INSTRUCTION_REGEX = /__(.+?)__/g;\n\n// Backward-compatible camelCase aliases\nexport const templateRegex = TEMPLATE_REGEX;\nexport const variableRegex = VARIABLE_REGEX;\nexport const instructionRegex = INSTRUCTION_REGEX;\n\nexport type TokenType = \"template\" | \"variable\" | \"instruction\" | \"text\";\n\nexport interface Token {\n type: TokenType;\n raw: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport interface TemplateVersion {\n id: string;\n version: string | number;\n body: string;\n createdAt?: any;\n [key: string]: any;\n}\n\nexport interface Template {\n id?: string;\n name: string;\n body?: string;\n latestVersion?: string | number;\n versions?: TemplateVersion[];\n color?: string;\n [key: string]: any;\n}\n\nexport interface ColorGradient {\n from: string;\n to: string;\n}\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\n\nexport interface SlashCommandMatchData {\n match: RegExpMatchArray;\n query: string;\n from: number;\n to: number;\n coords: { top: number; left: number; bottom: number; right: number };\n}\n\nexport interface SlashCommandsOptions {\n trigger?: string;\n onMatch?: (data: SlashCommandMatchData) => void;\n onClear?: () => void;\n containerId?: string;\n}\n\nexport const SlashCommands = Extension.create<SlashCommandsOptions>({\n name: \"slashCommands\",\n\n addOptions() {\n return {\n trigger: \"/\",\n onMatch: undefined,\n onClear: undefined,\n containerId: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const opts = this.options;\n\n return [\n new Plugin({\n view() {\n return {\n update(view) {\n const { state } = view;\n const { selection } = state;\n const { $from } = selection;\n\n if (!$from.parent.isTextblock) {\n opts.onClear?.();\n return;\n }\n\n const textBeforeCursor = $from.parent.textBetween(\n 0,\n $from.parentOffset,\n );\n\n const slashMatch = textBeforeCursor.match(\n /(?:^|\\s)\\/([a-zA-Z0-9_-]*)$/,\n );\n\n if (slashMatch) {\n const matchIndex = slashMatch.index ?? 0;\n const offsetInParent =\n matchIndex + (slashMatch[0].startsWith(\" \") ? 1 : 0);\n const matchFrom = $from.start() + offsetInParent;\n const matchTo = $from.pos;\n const coords = view.coordsAtPos($from.pos);\n\n let relativeCoords = {\n top: coords.top,\n left: coords.left,\n bottom: coords.bottom,\n right: coords.right,\n };\n\n if (opts.containerId && typeof document !== \"undefined\") {\n const container = document.getElementById(opts.containerId);\n if (container) {\n const rect = container.getBoundingClientRect();\n relativeCoords = {\n top: coords.bottom - rect.top + 5,\n left: coords.left - rect.left,\n bottom: coords.bottom - rect.top,\n right: coords.right - rect.left,\n };\n }\n }\n\n opts.onMatch?.({\n match: slashMatch,\n query: slashMatch[1] || \"\",\n from: matchFrom,\n to: matchTo,\n coords: relativeCoords,\n });\n } else {\n opts.onClear?.();\n }\n },\n };\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport Suggestion, { SuggestionOptions } from \"@tiptap/suggestion\";\nimport { Template } from \"../grammar/tokens\";\n\nexport interface TemplateSuggestionsOptions {\n templates: Template[];\n char?: string;\n onSuggestion?: (props: {\n query: string;\n range: { from: number; to: number };\n clientRect?: (() => DOMRect | null) | null;\n items: Template[];\n command: (props: { name: string }) => void;\n }) => void;\n}\n\nexport const TemplateSuggestions = Extension.create<TemplateSuggestionsOptions>({\n name: \"templateSuggestions\",\n\n addOptions() {\n return {\n templates: [],\n char: \"{{\",\n onSuggestion: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const opts = this.options;\n\n const suggestionConfig: Omit<SuggestionOptions<Template>, \"editor\"> = {\n char: opts.char || \"{{\",\n items: ({ query }) => {\n const lower = query.toLowerCase();\n return (opts.templates || []).filter((t) =>\n t.name.toLowerCase().includes(lower),\n );\n },\n command: ({ editor, range, props }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertContent(`{{${props.name}}}`)\n .run();\n },\n render: () => {\n return {\n onStart: (props) => {\n opts.onSuggestion?.(props as any);\n },\n onUpdate: (props) => {\n opts.onSuggestion?.(props as any);\n },\n onExit: () => {\n opts.onSuggestion?.({\n query: \"\",\n range: { from: 0, to: 0 },\n items: [],\n command: () => {},\n });\n },\n };\n },\n };\n\n const SuggestionFn =\n typeof Suggestion === \"function\"\n ? Suggestion\n : (Suggestion as any)?.default || (Suggestion as any)?.Suggestion;\n\n return [\n SuggestionFn({\n editor: this.editor,\n ...suggestionConfig,\n }),\n ];\n },\n});\n","import { Node, mergeAttributes } from \"@tiptap/core\";\n\nexport const LoadingNode = Node.create({\n name: \"loadingNode\",\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) return {};\n return { \"data-id\": attributes.id };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'span[data-type=\"loading\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"loading\",\n class: \"inline-flex items-center px-1.5 py-0.5 text-xs text-muted-foreground animate-pulse\",\n }),\n \"⏳\",\n ];\n },\n});\n","import { Extension, textInputRule } from \"@tiptap/core\";\n\nexport const SmilieReplacer = Extension.create({\n name: \"smilieReplacer\",\n\n addInputRules() {\n return [\n textInputRule({ find: /-___- $/, replace: \"😑 \" }),\n textInputRule({ find: /:'-\\) $/, replace: \"😂 \" }),\n textInputRule({ find: /':-\\) $/, replace: \"😅 \" }),\n textInputRule({ find: /':-D $/, replace: \"😅 \" }),\n textInputRule({ find: />:-\\) $/, replace: \"😆 \" }),\n textInputRule({ find: /-__- $/, replace: \"😑 \" }),\n textInputRule({ find: /':-\\( $/, replace: \"😓 \" }),\n textInputRule({ find: /:'-\\( $/, replace: \"😢 \" }),\n textInputRule({ find: />:-\\( $/, replace: \"😠 \" }),\n textInputRule({ find: /O:-\\) $/, replace: \"😇 \" }),\n textInputRule({ find: /:'\\) $/, replace: \"😂 \" }),\n textInputRule({ find: /:-D $/, replace: \"😃 \" }),\n textInputRule({ find: /':\\) $/, replace: \"😅 \" }),\n textInputRule({ find: /;-\\) $/, replace: \"😉 \" }),\n textInputRule({ find: /B-\\) $/, replace: \"😎 \" }),\n textInputRule({ find: /:-\\* $/, replace: \"😘 \" }),\n textInputRule({ find: /:-\\) $/, replace: \"🙂 \" }),\n textInputRule({ find: /-_- $/, replace: \"😑 \" }),\n textInputRule({ find: /:-O $/, replace: \"😮 \" }),\n textInputRule({ find: /:-P $/, replace: \"😛 \" }),\n textInputRule({ find: /:-p $/, replace: \"😛 \" }),\n textInputRule({ find: /:-\\/ $/, replace: \"😕 \" }),\n textInputRule({ find: /:-\\( $/, replace: \"😞 \" }),\n textInputRule({ find: /:'\\( $/, replace: \"😢 \" }),\n textInputRule({ find: /:D $/, replace: \"😃 \" }),\n textInputRule({ find: /=D $/, replace: \"😃 \" }),\n textInputRule({ find: /;\\) $/, replace: \"😉 \" }),\n textInputRule({ find: /B\\) $/, replace: \"😎 \" }),\n textInputRule({ find: /:\\) $/, replace: \"🙂 \" }),\n textInputRule({ find: /=\\) $/, replace: \"🙂 \" }),\n textInputRule({ find: /:O $/, replace: \"😮 \" }),\n textInputRule({ find: /:P $/, replace: \"😛 \" }),\n textInputRule({ find: /:p $/, replace: \"😛 \" }),\n textInputRule({ find: /:\\/ $/, replace: \"😕 \" }),\n textInputRule({ find: /:\\( $/, replace: \"😞 \" }),\n textInputRule({ find: /<3 $/, replace: \"❤️ \" }),\n textInputRule({ find: /<\\/3 $/, replace: \"💔 \" }),\n textInputRule({ find: /\\/shrug $/, replace: \"¯\\\\_(ツ)_/¯ \" }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\n\nexport function findHexColors(doc: ProsemirrorNode): DecorationSet {\n const hexColorRegex = /(#[0-9a-fA-F]{3,8})\\b/g;\n const decorations: Decoration[] = [];\n\n doc.descendants((node, position) => {\n if (!node.text) return;\n\n let match: RegExpExecArray | null;\n while ((match = hexColorRegex.exec(node.text)) !== null) {\n const color = match[0];\n const from = position + match.index;\n const to = from + color.length;\n\n decorations.push(\n Decoration.inline(from, to, {\n class: \"color-highlight px-1 py-0.5 rounded text-xs font-mono border\",\n style: `--color: ${color}; background-color: ${color}20; border-color: ${color}; color: ${color};`,\n }),\n );\n }\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nexport const ColorHighlighter = Extension.create({\n name: \"colorHighlighter\",\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n state: {\n init(_, { doc }) {\n return findHexColors(doc);\n },\n apply(transaction, oldState) {\n return transaction.docChanged ? findHexColors(transaction.doc) : oldState;\n },\n },\n props: {\n decorations(state) {\n return (this as any).getState(state);\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport \"@tiptap/extension-text-style\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nexport const FontSize = Extension.create({\n name: \"fontSize\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) =>\n element.style.fontSize.replace(/['\"]+/g, \"\"),\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { fontSize }).run(),\n unsetFontSize:\n () =>\n ({ chain }) =>\n chain()\n .setMark(\"textStyle\", { fontSize: null })\n .removeEmptyTextStyle()\n .run(),\n };\n },\n});\n\nexport default FontSize;\n","import { wrappingInputRule, markInputRule, type Extensions } from \"@tiptap/core\";\nimport * as _StarterKit from \"@tiptap/starter-kit\";\nimport * as _Color from \"@tiptap/extension-color\";\nimport * as _Highlight from \"@tiptap/extension-highlight\";\nimport * as _Link from \"@tiptap/extension-link\";\nimport * as _TaskList from \"@tiptap/extension-task-list\";\nimport * as _TaskItem from \"@tiptap/extension-task-item\";\nimport * as _TextAlign from \"@tiptap/extension-text-align\";\nimport * as _TextStyle from \"@tiptap/extension-text-style\";\nimport * as _Typography from \"@tiptap/extension-typography\";\nimport * as _Underline from \"@tiptap/extension-underline\";\nimport * as _Placeholder from \"@tiptap/extension-placeholder\";\nimport * as _CharacterCount from \"@tiptap/extension-character-count\";\n\nconst resolveExt = (mod: any, name: string) =>\n mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;\n\nconst StarterKit = resolveExt(_StarterKit, \"StarterKit\");\nconst Color = resolveExt(_Color, \"Color\");\nconst Highlight = resolveExt(_Highlight, \"Highlight\");\nconst Link = resolveExt(_Link, \"Link\");\nconst TaskList = resolveExt(_TaskList, \"TaskList\");\nconst TaskItem = resolveExt(_TaskItem, \"TaskItem\");\nconst TextAlign = resolveExt(_TextAlign, \"TextAlign\");\nconst TextStyle = resolveExt(_TextStyle, \"TextStyle\");\nconst Typography = resolveExt(_Typography, \"Typography\");\nconst Underline = resolveExt(_Underline, \"Underline\");\nconst Placeholder = resolveExt(_Placeholder, \"Placeholder\");\nconst CharacterCount = resolveExt(_CharacterCount, \"CharacterCount\");\n\nimport { SmilieReplacer } from \"./SmilieReplacer\";\nimport { ColorHighlighter } from \"./ColorHighlighter\";\nimport { FontSize } from \"./FontSize\";\nimport { Mention, type MentionOptions } from \"./mention\";\n\nexport interface RichTextPresetOptions {\n placeholder?: string | ((props: { node: any }) => string);\n characterLimit?: number;\n openLinksOnClick?: boolean;\n enableSmilies?: boolean;\n enableColorHighlighter?: boolean;\n headingLevels?: (1 | 2 | 3 | 4 | 5 | 6)[];\n mention?: MentionOptions | boolean;\n}\n\n/**\n * Creates a standard rich-text extensions bundle with full formatting support.\n */\nexport function createRichTextPreset(\n options: RichTextPresetOptions = {},\n): Extensions {\n const {\n placeholder = \"Start typing...\",\n characterLimit,\n openLinksOnClick = false,\n enableSmilies = true,\n enableColorHighlighter = true,\n headingLevels = [1, 2, 3, 4],\n } = options;\n\n const extensions: Extensions = [\n StarterKit.configure({\n orderedList: {\n HTMLAttributes: {\n class: \"list-decimal pl-4\",\n },\n },\n bulletList: {\n HTMLAttributes: {\n class: \"list-disc pl-4\",\n },\n },\n heading: {\n levels: headingLevels,\n HTMLAttributes: {\n class: \"font-bold tracking-tight\",\n },\n },\n }),\n TextStyle,\n Color,\n Highlight.configure({ multicolor: true }),\n Underline,\n Typography,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Link.extend({\n addInputRules() {\n return [\n markInputRule({\n find: /(?:^|\\s)\\[([^\\]]+)\\]\\(([^)]+)\\)$/,\n type: this.type,\n getAttributes: (match) => ({\n href: match[2],\n }),\n }),\n ];\n },\n }).configure({\n openOnClick: openLinksOnClick,\n autolink: true,\n defaultProtocol: \"https\",\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n class: \"text-blue-500 underline underline-offset-2\",\n },\n }),\n TaskList,\n TaskItem.extend({\n addInputRules() {\n return [\n wrappingInputRule({\n find: /^\\s*(\\[([ |x])?\\])\\s$/i,\n type: this.type,\n getAttributes: (match) => ({\n checked: match[2]?.toLowerCase() === \"x\",\n }),\n }),\n ];\n },\n }).configure({\n nested: true,\n }),\n FontSize,\n Placeholder.configure({\n emptyEditorClass: \"is-empty\",\n placeholder:\n typeof placeholder === \"function\"\n ? placeholder\n : () => placeholder,\n }),\n ];\n\n if (characterLimit) {\n extensions.push(\n CharacterCount.configure({\n limit: characterLimit,\n }),\n );\n }\n\n if (enableSmilies) {\n extensions.push(SmilieReplacer);\n }\n\n if (enableColorHighlighter) {\n extensions.push(ColorHighlighter);\n }\n\n if (options.mention) {\n const mentionConfig = typeof options.mention === \"object\" ? options.mention : {};\n extensions.push(\n Mention.configure({\n HTMLAttributes: {\n class: \"pixerate-mention-node\",\n ...(mentionConfig.HTMLAttributes || {}),\n },\n ...mentionConfig,\n }),\n );\n }\n\n return extensions;\n}\n","import {\n Mention as TipTapMention,\n type MentionOptions as TipTapMentionOptions,\n} from \"@tiptap/extension-mention\";\nimport type { SuggestionOptions } from \"@tiptap/suggestion\";\n\nexport interface MentionEntity {\n id: string;\n label: string;\n type?: string;\n avatarUrl?: string;\n color?: string;\n [key: string]: any;\n}\n\nexport interface MentionOptions extends Partial<TipTapMentionOptions> {\n HTMLAttributes?: Record<string, any>;\n suggestion?: Partial<SuggestionOptions<MentionEntity>>;\n}\n\nconst BaseMention =\n TipTapMention ||\n (TipTapMention as any)?.default?.default ||\n (TipTapMention as any)?.default ||\n (TipTapMention as any);\n\n/**\n * First-class native Mention extension for @pixerate/editor.\n * Creates atomic inline <span data-type=\"mention\"> nodes with full suggestion support.\n */\nexport const Mention = BaseMention.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n type: {\n default: null,\n parseHTML: (element: HTMLElement) =>\n element.getAttribute(\"data-type-name\") ||\n element.getAttribute(\"data-entity-type\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.type) return {};\n return { \"data-type-name\": attributes.type };\n },\n },\n avatarUrl: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-avatar-url\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.avatarUrl) return {};\n return { \"data-avatar-url\": attributes.avatarUrl };\n },\n },\n color: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-color\"),\n renderHTML: (attributes: Record<string, any>) => {\n if (!attributes.color) return {};\n return { \"data-color\": attributes.color };\n },\n },\n };\n },\n});\n\n/**\n * Helper to configure the Mention extension with preset defaults.\n */\nexport function createMentionExtension(options: Partial<MentionOptions> = {}) {\n const { HTMLAttributes = {}, ...rest } = options;\n return Mention.configure({\n HTMLAttributes: {\n class: \"pixerate-mention-node\",\n ...HTMLAttributes,\n },\n ...rest,\n });\n}\n"],"mappings":"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","names":["Plugin","Extension","Extension","Extension","Plugin","Decoration","DecorationSet","Extension"]}
package/dist/index.cjs CHANGED
@@ -440,7 +440,7 @@ var createGradientDecorations = (doc, options) => {
440
440
  const start = pos + match.index;
441
441
  const end = start + match[0].length;
442
442
  const { from: colorFrom, to: colorTo } = colors;
443
- const style = `--bg-size: ${speed * 300}%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important;`;
443
+ const style = `--bg-size: ${speed * 300}%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important; background-image: linear-gradient(to right, ${colorFrom}, ${colorTo}, ${colorFrom}); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent;`;
444
444
  decorations.push(
445
445
  import_view.Decoration.inline(start, end, {
446
446
  class: "inline animate-gradient bg-gradient-to-r from-[var(--color-from)] via-[var(--color-to)] to-[var(--color-from)] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent border border-(--color-to)/20 px-1 py-0.5 rounded-sm cursor-pointer",
@@ -463,7 +463,7 @@ var createGradientDecorations = (doc, options) => {
463
463
  const start = pos + match.index;
464
464
  const end = start + match[0].length;
465
465
  const { from: colorFrom, to: colorTo } = colors;
466
- const style = `--bg-size: ${speed * 300}%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important;`;
466
+ const style = `--bg-size: ${speed * 300}%; --color-from: ${colorFrom}; --color-to: ${colorTo}; caret-color: #111 !important; background-image: linear-gradient(to right, #fb7185, #8b5cf6, #fb7185); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent;`;
467
467
  decorations.push(
468
468
  import_view.Decoration.inline(start, end, {
469
469
  class: "italic animate-gradient bg-gradient-to-r from-rose-400 from-50% to-violet-500 to-50% bg-size-[200%_100%] bg-clip-text text-transparent inline-flex items-baseline gap-0.5",
@@ -891,22 +891,23 @@ var FontSize = import_core7.Extension.create({
891
891
 
892
892
  // src/extensions/rich-text-preset.ts
893
893
  var import_core8 = require("@tiptap/core");
894
- var import_starter_kit = __toESM(require("@tiptap/starter-kit"), 1);
895
- var import_extension_color = __toESM(require("@tiptap/extension-color"), 1);
896
- var import_extension_highlight = __toESM(require("@tiptap/extension-highlight"), 1);
897
- var import_extension_link = __toESM(require("@tiptap/extension-link"), 1);
898
- var import_extension_task_list = __toESM(require("@tiptap/extension-task-list"), 1);
899
- var import_extension_task_item = __toESM(require("@tiptap/extension-task-item"), 1);
900
- var import_extension_text_align = __toESM(require("@tiptap/extension-text-align"), 1);
894
+ var _StarterKit = __toESM(require("@tiptap/starter-kit"), 1);
895
+ var _Color = __toESM(require("@tiptap/extension-color"), 1);
896
+ var _Highlight = __toESM(require("@tiptap/extension-highlight"), 1);
897
+ var _Link = __toESM(require("@tiptap/extension-link"), 1);
898
+ var _TaskList = __toESM(require("@tiptap/extension-task-list"), 1);
899
+ var _TaskItem = __toESM(require("@tiptap/extension-task-item"), 1);
900
+ var _TextAlign = __toESM(require("@tiptap/extension-text-align"), 1);
901
901
  var _TextStyle = __toESM(require("@tiptap/extension-text-style"), 1);
902
- var import_extension_typography = __toESM(require("@tiptap/extension-typography"), 1);
903
- var import_extension_underline = __toESM(require("@tiptap/extension-underline"), 1);
904
- var import_extension_placeholder = __toESM(require("@tiptap/extension-placeholder"), 1);
905
- var import_extension_character_count = __toESM(require("@tiptap/extension-character-count"), 1);
902
+ var _Typography = __toESM(require("@tiptap/extension-typography"), 1);
903
+ var _Underline = __toESM(require("@tiptap/extension-underline"), 1);
904
+ var _Placeholder = __toESM(require("@tiptap/extension-placeholder"), 1);
905
+ var _CharacterCount = __toESM(require("@tiptap/extension-character-count"), 1);
906
906
 
907
907
  // src/extensions/mention.ts
908
- var import_extension_mention = __toESM(require("@tiptap/extension-mention"), 1);
909
- var Mention = import_extension_mention.default.extend({
908
+ var import_extension_mention = require("@tiptap/extension-mention");
909
+ var BaseMention = import_extension_mention.Mention || import_extension_mention.Mention?.default?.default || import_extension_mention.Mention?.default || import_extension_mention.Mention;
910
+ var Mention = BaseMention.extend({
910
911
  addAttributes() {
911
912
  return {
912
913
  ...this.parent?.(),
@@ -949,7 +950,19 @@ function createMentionExtension(options = {}) {
949
950
  }
950
951
 
951
952
  // src/extensions/rich-text-preset.ts
952
- var TextStyle2 = _TextStyle.TextStyle || _TextStyle.default || _TextStyle;
953
+ var resolveExt = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
954
+ var StarterKit = resolveExt(_StarterKit, "StarterKit");
955
+ var Color = resolveExt(_Color, "Color");
956
+ var Highlight = resolveExt(_Highlight, "Highlight");
957
+ var Link = resolveExt(_Link, "Link");
958
+ var TaskList = resolveExt(_TaskList, "TaskList");
959
+ var TaskItem = resolveExt(_TaskItem, "TaskItem");
960
+ var TextAlign = resolveExt(_TextAlign, "TextAlign");
961
+ var TextStyle = resolveExt(_TextStyle, "TextStyle");
962
+ var Typography = resolveExt(_Typography, "Typography");
963
+ var Underline = resolveExt(_Underline, "Underline");
964
+ var Placeholder = resolveExt(_Placeholder, "Placeholder");
965
+ var CharacterCount = resolveExt(_CharacterCount, "CharacterCount");
953
966
  function createRichTextPreset(options = {}) {
954
967
  const {
955
968
  placeholder = "Start typing...",
@@ -960,7 +973,7 @@ function createRichTextPreset(options = {}) {
960
973
  headingLevels = [1, 2, 3, 4]
961
974
  } = options;
962
975
  const extensions = [
963
- import_starter_kit.default.configure({
976
+ StarterKit.configure({
964
977
  orderedList: {
965
978
  HTMLAttributes: {
966
979
  class: "list-decimal pl-4"
@@ -978,15 +991,15 @@ function createRichTextPreset(options = {}) {
978
991
  }
979
992
  }
980
993
  }),
981
- TextStyle2,
982
- import_extension_color.default,
983
- import_extension_highlight.default.configure({ multicolor: true }),
984
- import_extension_underline.default,
985
- import_extension_typography.default,
986
- import_extension_text_align.default.configure({
994
+ TextStyle,
995
+ Color,
996
+ Highlight.configure({ multicolor: true }),
997
+ Underline,
998
+ Typography,
999
+ TextAlign.configure({
987
1000
  types: ["heading", "paragraph"]
988
1001
  }),
989
- import_extension_link.default.extend({
1002
+ Link.extend({
990
1003
  addInputRules() {
991
1004
  return [
992
1005
  (0, import_core8.markInputRule)({
@@ -1008,8 +1021,8 @@ function createRichTextPreset(options = {}) {
1008
1021
  class: "text-blue-500 underline underline-offset-2"
1009
1022
  }
1010
1023
  }),
1011
- import_extension_task_list.default,
1012
- import_extension_task_item.default.extend({
1024
+ TaskList,
1025
+ TaskItem.extend({
1013
1026
  addInputRules() {
1014
1027
  return [
1015
1028
  (0, import_core8.wrappingInputRule)({
@@ -1025,14 +1038,14 @@ function createRichTextPreset(options = {}) {
1025
1038
  nested: true
1026
1039
  }),
1027
1040
  FontSize,
1028
- import_extension_placeholder.default.configure({
1041
+ Placeholder.configure({
1029
1042
  emptyEditorClass: "is-empty",
1030
1043
  placeholder: typeof placeholder === "function" ? placeholder : () => placeholder
1031
1044
  })
1032
1045
  ];
1033
1046
  if (characterLimit) {
1034
1047
  extensions.push(
1035
- import_extension_character_count.default.configure({
1048
+ CharacterCount.configure({
1036
1049
  limit: characterLimit
1037
1050
  })
1038
1051
  );