@formulaxjs/ckeditor5 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -69,7 +69,7 @@ function openFormulaXModal(input) {
69
69
  root.remove();
70
70
  return Promise.reject(new Error("[FormulaX] CKEditor 5 modal host not found."));
71
71
  }
72
- const mounted = (0, import_editor.mountFormulaXKityEditor)(host, {
72
+ const mounted = (0, import_editor.mountFormulaXEditor)(host, {
73
73
  initialLatex: input.initialLatex,
74
74
  height: input.options.editor.height,
75
75
  autofocus: input.options.editor.autofocus,
@@ -421,7 +421,7 @@ function renderFormulaSvgMarkup(latex, options) {
421
421
  host.style.pointerEvents = "none";
422
422
  host.setAttribute("aria-hidden", "true");
423
423
  document.body.appendChild(host);
424
- const mounted = (0, import_editor2.mountFormulaXKityEditor)(host, {
424
+ const mounted = (0, import_editor2.mountFormulaXEditor)(host, {
425
425
  initialLatex: latex,
426
426
  height: options.editor.height,
427
427
  autofocus: false,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/modal.ts"],"sourcesContent":["export {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n} from '@formulaxjs/editor';\n\nexport {\n DEFAULT_BUTTON_NAME,\n DEFAULT_MODEL_NAME,\n FormulaX,\n FormulaXCommand,\n resolveOptions,\n} from './plugin';\n\nexport type {\n FormulaXCKEditor5Options,\n FormulaXPayload,\n RequiredFormulaXCKEditor5Options,\n} from './types';\n\nexport { openFormulaXModal } from './modal';\n\nexport { FormulaX as default } from './plugin';\n","import {\n ButtonView,\n Command,\n Plugin,\n Widget,\n toWidget,\n viewToModelPositionOutsideModelElement,\n} from 'ckeditor5';\nimport {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n createFormulaMarkup,\n ensureFormulaXModalStyles,\n mountFormulaXKityEditor,\n} from '@formulaxjs/editor';\nimport { openFormulaXModal } from './modal';\nimport type {\n FormulaXCKEditor5Options,\n FormulaXPayload,\n RequiredFormulaXCKEditor5Options,\n} from './types';\n\nconst DEFAULT_BUTTON_NAME = 'formulaX';\nconst DEFAULT_MODEL_NAME = 'formulaX';\n\nexport { DEFAULT_BUTTON_NAME, DEFAULT_MODEL_NAME };\n\nexport function resolveOptions(options: FormulaXCKEditor5Options = {}): RequiredFormulaXCKEditor5Options {\n return {\n name: options.name ?? DEFAULT_MODEL_NAME,\n buttonName: options.buttonName ?? DEFAULT_BUTTON_NAME,\n toolbarText: options.toolbarText ?? 'FormulaX',\n tooltip: options.tooltip ?? 'Insert or edit formula',\n cursorStyle: options.cursorStyle ?? 'pointer',\n formulaClassName: options.formulaClassName ?? DEFAULT_FORMULA_CLASS,\n formulaAttributeName: options.formulaAttributeName ?? DEFAULT_FORMULA_ATTRIBUTE,\n modal: {\n title: options.modal?.title ?? 'FormulaX Editor',\n insertText: options.modal?.insertText ?? 'Insert',\n updateText: options.modal?.updateText ?? 'Update',\n cancelText: options.modal?.cancelText ?? 'Cancel',\n closeOnBackdrop: options.modal?.closeOnBackdrop ?? true,\n },\n editor: {\n height: options.editor?.height ?? '100%',\n autofocus: options.editor?.autofocus ?? true,\n assets: options.editor?.assets ?? {},\n render: {\n fontsize: options.editor?.render?.fontsize ?? 40,\n },\n },\n };\n}\n\nexport class FormulaXCommand extends Command {\n private readonly options: RequiredFormulaXCKEditor5Options;\n\n constructor(editor: unknown, options: RequiredFormulaXCKEditor5Options) {\n super(editor as any);\n this.options = options;\n }\n\n override refresh(): void {\n this.isEnabled = true;\n }\n\n override execute(): void {\n const editor = this.editor as any;\n const selectedFormula = getSelectedFormulaModelElement(editor, this.options.name);\n const initialLatex = String(selectedFormula?.getAttribute('latex') ?? '');\n\n void openFormulaXModal({\n initialLatex,\n isUpdate: Boolean(selectedFormula),\n options: this.options,\n }).then((payload) => {\n if (!payload) return;\n applyFormulaPayload(editor, selectedFormula, payload, this.options.name);\n editor.editing.view.focus();\n });\n }\n}\n\nexport class FormulaX extends Plugin {\n static get pluginName(): string {\n return 'FormulaX';\n }\n\n static get requires(): readonly [typeof Widget] {\n return [Widget];\n }\n\n init(): void {\n const editor = this.editor as any;\n const options = resolveOptions(editor.config.get('formulaX') as FormulaXCKEditor5Options | undefined);\n\n if (hasRegisteredFormulaModelName(editor, options.name)) {\n console.error(\n `[FormulaX] CKEditor5 model name \"${options.name}\" is already registered. ` +\n 'Pass a unique \"name\" option to avoid schema collisions.',\n );\n return;\n }\n\n ensureFormulaXModalStyles(document);\n defineFormulaSchema(editor, options.name);\n defineFormulaConverters(editor, options);\n editor.editing.mapper.on(\n 'viewToModelPosition',\n viewToModelPositionOutsideModelElement(editor.model, isFormulaWidgetView),\n );\n\n const command = new FormulaXCommand(editor, options);\n editor.commands.add(options.buttonName, command);\n\n editor.ui.componentFactory.add(options.buttonName, (locale: unknown) => {\n const button = new ButtonView(locale as any);\n\n button.set({\n label: options.toolbarText,\n tooltip: options.tooltip,\n withText: true,\n });\n\n button.bind('isEnabled').to(command, 'isEnabled');\n this.listenTo(button, 'execute', () => editor.execute(options.buttonName));\n\n return button;\n });\n }\n}\n\nexport default FormulaX;\n\nfunction applyFormulaPayload(\n editor: any,\n selectedFormula: any,\n payload: FormulaXPayload,\n modelName: string,\n): void {\n editor.model.change((writer: any) => {\n if (selectedFormula) {\n if (!payload.latex.trim()) {\n writer.remove(selectedFormula);\n return;\n }\n\n writer.setAttribute('latex', payload.latex, selectedFormula);\n return;\n }\n\n if (!payload.latex.trim()) return;\n\n const formula = writer.createElement(modelName, {\n latex: payload.latex,\n });\n\n editor.model.insertObject(formula, null, null, { setSelection: 'after' });\n });\n}\n\nfunction hasRegisteredFormulaModelName(editor: any, modelName: string): boolean {\n const schema = editor?.model?.schema;\n\n if (!schema) {\n return false;\n }\n\n if (typeof schema.isRegistered === 'function') {\n return Boolean(schema.isRegistered(modelName));\n }\n\n if (typeof schema.getDefinition === 'function') {\n return Boolean(schema.getDefinition(modelName));\n }\n\n if (schema._sourceDefinitions?.has) {\n return Boolean(schema._sourceDefinitions.has(modelName));\n }\n\n return Boolean(schema._definitions?.[modelName]);\n}\n\nfunction defineFormulaSchema(editor: any, modelName: string): void {\n editor.model.schema.register(modelName, {\n allowWhere: '$text',\n isInline: true,\n isObject: true,\n allowAttributes: ['latex'],\n });\n}\n\nfunction defineFormulaConverters(editor: any, options: RequiredFormulaXCKEditor5Options): void {\n editor.conversion.for('upcast').elementToElement({\n view: {\n name: 'span',\n attributes: {\n [FORMULA_FLAG_ATTRIBUTE]: true,\n },\n },\n model: (viewElement: any, { writer }: any) => writer.createElement(options.name, {\n latex: readFormulaLatexFromView(viewElement, options),\n }),\n });\n\n editor.conversion.for('dataDowncast').elementToElement({\n model: createFormulaConverterModelDefinition(options.name),\n view: (modelElement: any, { writer }: any) => createFormulaRawElement(writer, modelElement, options),\n });\n\n editor.conversion.for('editingDowncast').elementToElement({\n model: createFormulaConverterModelDefinition(options.name),\n view: (modelElement: any, { writer }: any) => {\n const widgetElement = createFormulaWidgetElement(writer, modelElement, options, editor);\n return toWidget(widgetElement, writer, { label: 'FormulaX formula' });\n },\n });\n}\n\nfunction createFormulaConverterModelDefinition(modelName: string): {\n name: string;\n attributes: string[];\n} {\n return {\n name: modelName,\n attributes: ['latex'],\n };\n}\n\nfunction createFormulaRawElement(\n writer: any,\n modelElement: any,\n options: RequiredFormulaXCKEditor5Options,\n): any {\n const latex = String(modelElement.getAttribute('latex') ?? '');\n\n const element = writer.createContainerElement(\n 'span',\n createFormulaViewAttributes(latex, options),\n );\n\n writer.insert(\n writer.createPositionAt(element, 0),\n writer.createText(latex || '\\\\square'),\n );\n\n return element;\n}\n\nfunction createFormulaWidgetElement(\n writer: any,\n modelElement: any,\n options: RequiredFormulaXCKEditor5Options,\n editor: any,\n): any {\n const latex = String(modelElement.getAttribute('latex') ?? '');\n const widgetElement = writer.createContainerElement(\n 'span',\n createFormulaViewAttributes(latex, options),\n );\n const contentElement = writer.createRawElement(\n 'span',\n {\n class: `${options.formulaClassName}__content`,\n 'aria-hidden': 'true',\n },\n (domElement: HTMLElement) => {\n domElement.innerHTML = createFormulaFallbackMarkup(latex, options);\n void renderFormulaIntoElement(domElement, latex, options);\n bindFormulaWidgetDomEvents(domElement, editor, modelElement, options.buttonName);\n },\n );\n\n writer.insert(writer.createPositionAt(widgetElement, 0), contentElement);\n\n return widgetElement;\n}\n\nfunction createFormulaViewAttributes(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Record<string, string> {\n return {\n class: options.formulaClassName,\n [FORMULA_FLAG_ATTRIBUTE]: 'true',\n [options.formulaAttributeName]: latex,\n 'data-latex': latex,\n contenteditable: 'false',\n role: 'button',\n style: `cursor: ${options.cursorStyle}`,\n tabindex: '0',\n };\n}\n\nfunction bindFormulaWidgetDomEvents(\n domElement: HTMLElement,\n editor: any,\n modelElement: any,\n commandName: string,\n): void {\n domElement.onclick = (event) => {\n event.preventDefault();\n selectFormulaModelElement(editor, modelElement);\n };\n\n domElement.ondblclick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n selectFormulaModelElement(editor, modelElement);\n editor.execute(commandName);\n };\n}\n\nfunction selectFormulaModelElement(editor: any, modelElement: any): void {\n if (!modelElement?.is?.('element', 'formulaX')) {\n return;\n }\n\n editor.editing.view.focus();\n editor.model.change((writer: any) => {\n writer.setSelection(modelElement, 'on');\n });\n}\n\nfunction createFormulaFallbackMarkup(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): string {\n const markup = createFormulaMarkup(latex, {\n attributeName: options.formulaAttributeName,\n className: options.formulaClassName,\n });\n return extractInnerHtml(markup);\n}\n\nfunction extractInnerHtml(markup: string): string {\n const wrapper = document.createElement('span');\n wrapper.innerHTML = markup;\n return wrapper.firstElementChild?.innerHTML ?? '';\n}\n\nfunction getSelectedFormulaModelElement(editor: any, modelName: string): any | null {\n const selectedElement = editor.model.document.selection.getSelectedElement();\n return selectedElement?.is?.('element', modelName) ? selectedElement : null;\n}\n\nfunction isFormulaWidgetView(node: any): boolean {\n return Boolean(node?.is?.('element') && node.hasAttribute?.(FORMULA_FLAG_ATTRIBUTE));\n}\n\nfunction readFormulaLatexFromView(viewElement: any, options: RequiredFormulaXCKEditor5Options): string {\n return String(\n viewElement.getAttribute(options.formulaAttributeName)\n ?? viewElement.getAttribute('data-latex')\n ?? '',\n );\n}\n\nconst formulaRenderCache = new Map<string, Promise<string>>();\n\nasync function renderFormulaIntoElement(\n domElement: HTMLElement,\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Promise<void> {\n const trimmedLatex = latex.trim();\n const renderToken = `${trimmedLatex}::${Date.now()}::${Math.random().toString(36).slice(2, 8)}`;\n domElement.dataset.renderToken = renderToken;\n\n if (!trimmedLatex) {\n return;\n }\n\n try {\n const markup = await renderFormulaSvgMarkup(trimmedLatex, options);\n if (domElement.dataset.renderToken !== renderToken) {\n return;\n }\n\n domElement.innerHTML = markup;\n } catch (error) {\n if (domElement.dataset.renderToken !== renderToken) {\n return;\n }\n\n console.error('[FormulaX] Failed to render CKEditor5 formula widget:', error);\n }\n}\n\nfunction renderFormulaSvgMarkup(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Promise<string> {\n const cached = formulaRenderCache.get(latex);\n if (cached) {\n return cached;\n }\n\n const pending = (async () => {\n const host = document.createElement('div');\n host.style.position = 'fixed';\n host.style.left = '-100000px';\n host.style.top = '0';\n host.style.width = '1px';\n host.style.height = '1px';\n host.style.opacity = '0';\n host.style.pointerEvents = 'none';\n host.setAttribute('aria-hidden', 'true');\n document.body.appendChild(host);\n\n const mounted = mountFormulaXKityEditor(host, {\n initialLatex: latex,\n height: options.editor.height,\n autofocus: false,\n assets: options.editor.assets,\n render: {\n fontsize: options.editor.render.fontsize,\n },\n });\n\n try {\n return await mounted.getRenderHtml();\n } finally {\n mounted.destroy();\n host.remove();\n }\n })();\n\n formulaRenderCache.set(latex, pending);\n pending.catch(() => {\n if (formulaRenderCache.get(latex) === pending) {\n formulaRenderCache.delete(latex);\n }\n });\n return pending;\n}\n","import {\n ensureFormulaXModalStyles,\n escapeAttribute,\n escapeHtml,\n mountFormulaXKityEditor,\n} from '@formulaxjs/editor';\nimport type { FormulaXPayload, RequiredFormulaXCKEditor5Options } from './types';\n\nexport interface OpenFormulaXModalInput {\n initialLatex: string;\n isUpdate: boolean;\n options: RequiredFormulaXCKEditor5Options;\n}\n\nexport function openFormulaXModal(input: OpenFormulaXModalInput): Promise<FormulaXPayload | null> {\n ensureFormulaXModalStyles(document);\n\n const root = document.createElement('div');\n root.className = 'fx-formula-modal-root';\n root.setAttribute('data-formulax-modal', 'true');\n\n const submitText = input.isUpdate ? input.options.modal.updateText : input.options.modal.insertText;\n\n root.innerHTML = `\n <div class=\"fx-formula-modal-backdrop\" data-action=\"backdrop\"></div>\n <div class=\"fx-formula-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${escapeAttribute(input.options.modal.title)}\">\n <header class=\"fx-formula-modal__header\">\n <h2 class=\"fx-formula-modal__title\">${escapeHtml(input.options.modal.title)}</h2>\n <button class=\"fx-formula-modal__close\" type=\"button\" data-action=\"close\" aria-label=\"Close\">×</button>\n </header>\n <section class=\"fx-formula-modal__body\">\n <div class=\"fx-formula-editor-host\"></div>\n </section>\n <footer class=\"fx-formula-modal__footer\">\n <button class=\"fx-formula-modal__button\" type=\"button\" data-action=\"cancel\">${escapeHtml(input.options.modal.cancelText)}</button>\n <button class=\"fx-formula-modal__button fx-formula-modal__button--primary\" type=\"button\" data-action=\"submit\">${escapeHtml(submitText)}</button>\n </footer>\n </div>\n `;\n\n document.body.appendChild(root);\n document.body.classList.add('fx-formula-modal-open');\n\n const host = root.querySelector<HTMLElement>('.fx-formula-editor-host');\n if (!host) {\n root.remove();\n return Promise.reject(new Error('[FormulaX] CKEditor 5 modal host not found.'));\n }\n\n const mounted = mountFormulaXKityEditor(host, {\n initialLatex: input.initialLatex,\n height: input.options.editor.height,\n autofocus: input.options.editor.autofocus,\n assets: input.options.editor.assets,\n render: {\n fontsize: input.options.editor.render.fontsize,\n },\n });\n let closed = false;\n\n return new Promise((resolve) => {\n const close = (payload: FormulaXPayload | null): void => {\n if (closed) return;\n closed = true;\n\n mounted.destroy();\n root.removeEventListener('click', onClick);\n document.removeEventListener('keydown', onKeydown, true);\n root.remove();\n document.body.classList.remove('fx-formula-modal-open');\n resolve(payload);\n };\n\n const submit = async (): Promise<void> => {\n try {\n const latex = await mounted.getLatex();\n close({ latex });\n } catch (error) {\n host.innerHTML = `\n <div class=\"fx-formula-editor-error\">\n Failed to read FormulaX editor content.\n <pre>${escapeHtml(error instanceof Error ? error.message : String(error))}</pre>\n </div>\n `;\n }\n };\n\n function onClick(event: MouseEvent): void {\n const action = (event.target as HTMLElement).closest<HTMLElement>('[data-action]')?.dataset.action;\n if (!action) return;\n\n if (action === 'submit') {\n void submit();\n return;\n }\n\n if (action === 'cancel' || action === 'close') {\n close(null);\n return;\n }\n\n if (action === 'backdrop' && input.options.modal.closeOnBackdrop) {\n close(null);\n }\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n close(null);\n }\n }\n\n root.addEventListener('click', onClick);\n document.addEventListener('keydown', onKeydown, true);\n\n queueMicrotask(() => {\n mounted.root.focus();\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,iBAIO;;;ACJP,uBAOO;AACP,IAAAC,iBAOO;;;ACfP,oBAKO;AASA,SAAS,kBAAkB,OAAgE;AAChG,+CAA0B,QAAQ;AAElC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,OAAK,aAAa,uBAAuB,MAAM;AAE/C,QAAM,aAAa,MAAM,WAAW,MAAM,QAAQ,MAAM,aAAa,MAAM,QAAQ,MAAM;AAEzF,OAAK,YAAY;AAAA;AAAA,oFAE6D,+BAAgB,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA;AAAA,kDAE5E,0BAAW,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0FAOG,0BAAW,MAAM,QAAQ,MAAM,UAAU,CAAC;AAAA,4HACR,0BAAW,UAAU,CAAC;AAAA;AAAA;AAAA;AAK5I,WAAS,KAAK,YAAY,IAAI;AAC9B,WAAS,KAAK,UAAU,IAAI,uBAAuB;AAEnD,QAAM,OAAO,KAAK,cAA2B,yBAAyB;AACtE,MAAI,CAAC,MAAM;AACT,SAAK,OAAO;AACZ,WAAO,QAAQ,OAAO,IAAI,MAAM,6CAA6C,CAAC;AAAA,EAChF;AAEA,QAAM,cAAU,uCAAwB,MAAM;AAAA,IAC5C,cAAc,MAAM;AAAA,IACpB,QAAQ,MAAM,QAAQ,OAAO;AAAA,IAC7B,WAAW,MAAM,QAAQ,OAAO;AAAA,IAChC,QAAQ,MAAM,QAAQ,OAAO;AAAA,IAC7B,QAAQ;AAAA,MACN,UAAU,MAAM,QAAQ,OAAO,OAAO;AAAA,IACxC;AAAA,EACF,CAAC;AACD,MAAI,SAAS;AAEb,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQ,CAAC,YAA0C;AACvD,UAAI,OAAQ;AACZ,eAAS;AAET,cAAQ,QAAQ;AAChB,WAAK,oBAAoB,SAAS,OAAO;AACzC,eAAS,oBAAoB,WAAW,WAAW,IAAI;AACvD,WAAK,OAAO;AACZ,eAAS,KAAK,UAAU,OAAO,uBAAuB;AACtD,cAAQ,OAAO;AAAA,IACjB;AAEA,UAAM,SAAS,YAA2B;AACxC,UAAI;AACF,cAAM,QAAQ,MAAM,QAAQ,SAAS;AACrC,cAAM,EAAE,MAAM,CAAC;AAAA,MACjB,SAAS,OAAO;AACd,aAAK,YAAY;AAAA;AAAA;AAAA,uBAGN,0BAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA,MAG/E;AAAA,IACF;AAEA,aAAS,QAAQ,OAAyB;AACxC,YAAM,SAAU,MAAM,OAAuB,QAAqB,eAAe,GAAG,QAAQ;AAC5F,UAAI,CAAC,OAAQ;AAEb,UAAI,WAAW,UAAU;AACvB,aAAK,OAAO;AACZ;AAAA,MACF;AAEA,UAAI,WAAW,YAAY,WAAW,SAAS;AAC7C,cAAM,IAAI;AACV;AAAA,MACF;AAEA,UAAI,WAAW,cAAc,MAAM,QAAQ,MAAM,iBAAiB;AAChE,cAAM,IAAI;AAAA,MACZ;AAAA,IACF;AAEA,aAAS,UAAU,OAA4B;AAC7C,UAAI,MAAM,QAAQ,UAAU;AAC1B,cAAM,eAAe;AACrB,cAAM,IAAI;AAAA,MACZ;AAAA,IACF;AAEA,SAAK,iBAAiB,SAAS,OAAO;AACtC,aAAS,iBAAiB,WAAW,WAAW,IAAI;AAEpD,mBAAe,MAAM;AACnB,cAAQ,KAAK,MAAM;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AACH;;;ADjGA,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAIpB,SAAS,eAAe,UAAoC,CAAC,GAAqC;AACvG,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,YAAY,QAAQ,cAAc;AAAA,IAClC,aAAa,QAAQ,eAAe;AAAA,IACpC,SAAS,QAAQ,WAAW;AAAA,IAC5B,aAAa,QAAQ,eAAe;AAAA,IACpC,kBAAkB,QAAQ,oBAAoB;AAAA,IAC9C,sBAAsB,QAAQ,wBAAwB;AAAA,IACtD,OAAO;AAAA,MACL,OAAO,QAAQ,OAAO,SAAS;AAAA,MAC/B,YAAY,QAAQ,OAAO,cAAc;AAAA,MACzC,YAAY,QAAQ,OAAO,cAAc;AAAA,MACzC,YAAY,QAAQ,OAAO,cAAc;AAAA,MACzC,iBAAiB,QAAQ,OAAO,mBAAmB;AAAA,IACrD;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ,QAAQ,QAAQ,UAAU;AAAA,MAClC,WAAW,QAAQ,QAAQ,aAAa;AAAA,MACxC,QAAQ,QAAQ,QAAQ,UAAU,CAAC;AAAA,MACnC,QAAQ;AAAA,QACN,UAAU,QAAQ,QAAQ,QAAQ,YAAY;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,kBAAN,cAA8B,yBAAQ;AAAA,EAC1B;AAAA,EAEjB,YAAY,QAAiB,SAA2C;AACtE,UAAM,MAAa;AACnB,SAAK,UAAU;AAAA,EACjB;AAAA,EAES,UAAgB;AACvB,SAAK,YAAY;AAAA,EACnB;AAAA,EAES,UAAgB;AACvB,UAAM,SAAS,KAAK;AACpB,UAAM,kBAAkB,+BAA+B,QAAQ,KAAK,QAAQ,IAAI;AAChF,UAAM,eAAe,OAAO,iBAAiB,aAAa,OAAO,KAAK,EAAE;AAExE,SAAK,kBAAkB;AAAA,MACrB;AAAA,MACA,UAAU,QAAQ,eAAe;AAAA,MACjC,SAAS,KAAK;AAAA,IAChB,CAAC,EAAE,KAAK,CAAC,YAAY;AACnB,UAAI,CAAC,QAAS;AACd,0BAAoB,QAAQ,iBAAiB,SAAS,KAAK,QAAQ,IAAI;AACvE,aAAO,QAAQ,KAAK,MAAM;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAEO,IAAM,WAAN,cAAuB,wBAAO;AAAA,EACnC,WAAW,aAAqB;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,WAAqC;AAC9C,WAAO,CAAC,uBAAM;AAAA,EAChB;AAAA,EAEA,OAAa;AACX,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,eAAe,OAAO,OAAO,IAAI,UAAU,CAAyC;AAEpG,QAAI,8BAA8B,QAAQ,QAAQ,IAAI,GAAG;AACvD,cAAQ;AAAA,QACN,oCAAoC,QAAQ,IAAI;AAAA,MAElD;AACA;AAAA,IACF;AAEA,kDAA0B,QAAQ;AAClC,wBAAoB,QAAQ,QAAQ,IAAI;AACxC,4BAAwB,QAAQ,OAAO;AACvC,WAAO,QAAQ,OAAO;AAAA,MACpB;AAAA,UACA,yDAAuC,OAAO,OAAO,mBAAmB;AAAA,IAC1E;AAEA,UAAM,UAAU,IAAI,gBAAgB,QAAQ,OAAO;AACnD,WAAO,SAAS,IAAI,QAAQ,YAAY,OAAO;AAE/C,WAAO,GAAG,iBAAiB,IAAI,QAAQ,YAAY,CAAC,WAAoB;AACtE,YAAM,SAAS,IAAI,4BAAW,MAAa;AAE3C,aAAO,IAAI;AAAA,QACT,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,QACjB,UAAU;AAAA,MACZ,CAAC;AAED,aAAO,KAAK,WAAW,EAAE,GAAG,SAAS,WAAW;AAChD,WAAK,SAAS,QAAQ,WAAW,MAAM,OAAO,QAAQ,QAAQ,UAAU,CAAC;AAEzE,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAIA,SAAS,oBACP,QACA,iBACA,SACA,WACM;AACN,SAAO,MAAM,OAAO,CAAC,WAAgB;AACnC,QAAI,iBAAiB;AACnB,UAAI,CAAC,QAAQ,MAAM,KAAK,GAAG;AACzB,eAAO,OAAO,eAAe;AAC7B;AAAA,MACF;AAEA,aAAO,aAAa,SAAS,QAAQ,OAAO,eAAe;AAC3D;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,MAAM,KAAK,EAAG;AAE3B,UAAM,UAAU,OAAO,cAAc,WAAW;AAAA,MAC9C,OAAO,QAAQ;AAAA,IACjB,CAAC;AAED,WAAO,MAAM,aAAa,SAAS,MAAM,MAAM,EAAE,cAAc,QAAQ,CAAC;AAAA,EAC1E,CAAC;AACH;AAEA,SAAS,8BAA8B,QAAa,WAA4B;AAC9E,QAAM,SAAS,QAAQ,OAAO;AAE9B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,OAAO,iBAAiB,YAAY;AAC7C,WAAO,QAAQ,OAAO,aAAa,SAAS,CAAC;AAAA,EAC/C;AAEA,MAAI,OAAO,OAAO,kBAAkB,YAAY;AAC9C,WAAO,QAAQ,OAAO,cAAc,SAAS,CAAC;AAAA,EAChD;AAEA,MAAI,OAAO,oBAAoB,KAAK;AAClC,WAAO,QAAQ,OAAO,mBAAmB,IAAI,SAAS,CAAC;AAAA,EACzD;AAEA,SAAO,QAAQ,OAAO,eAAe,SAAS,CAAC;AACjD;AAEA,SAAS,oBAAoB,QAAa,WAAyB;AACjE,SAAO,MAAM,OAAO,SAAS,WAAW;AAAA,IACtC,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB,CAAC,OAAO;AAAA,EAC3B,CAAC;AACH;AAEA,SAAS,wBAAwB,QAAa,SAAiD;AAC7F,SAAO,WAAW,IAAI,QAAQ,EAAE,iBAAiB;AAAA,IAC/C,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,YAAY;AAAA,QACV,CAAC,qCAAsB,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,OAAO,CAAC,aAAkB,EAAE,OAAO,MAAW,OAAO,cAAc,QAAQ,MAAM;AAAA,MAC/E,OAAO,yBAAyB,aAAa,OAAO;AAAA,IACtD,CAAC;AAAA,EACH,CAAC;AAED,SAAO,WAAW,IAAI,cAAc,EAAE,iBAAiB;AAAA,IACrD,OAAO,sCAAsC,QAAQ,IAAI;AAAA,IACzD,MAAM,CAAC,cAAmB,EAAE,OAAO,MAAW,wBAAwB,QAAQ,cAAc,OAAO;AAAA,EACrG,CAAC;AAED,SAAO,WAAW,IAAI,iBAAiB,EAAE,iBAAiB;AAAA,IACxD,OAAO,sCAAsC,QAAQ,IAAI;AAAA,IACzD,MAAM,CAAC,cAAmB,EAAE,OAAO,MAAW;AAC5C,YAAM,gBAAgB,2BAA2B,QAAQ,cAAc,SAAS,MAAM;AACtF,iBAAO,2BAAS,eAAe,QAAQ,EAAE,OAAO,mBAAmB,CAAC;AAAA,IACtE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,sCAAsC,WAG7C;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY,CAAC,OAAO;AAAA,EACtB;AACF;AAEA,SAAS,wBACP,QACA,cACA,SACK;AACL,QAAM,QAAQ,OAAO,aAAa,aAAa,OAAO,KAAK,EAAE;AAE7D,QAAM,UAAU,OAAO;AAAA,IACrB;AAAA,IACA,4BAA4B,OAAO,OAAO;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL,OAAO,iBAAiB,SAAS,CAAC;AAAA,IAClC,OAAO,WAAW,SAAS,UAAU;AAAA,EACvC;AAEA,SAAO;AACT;AAEA,SAAS,2BACP,QACA,cACA,SACA,QACK;AACL,QAAM,QAAQ,OAAO,aAAa,aAAa,OAAO,KAAK,EAAE;AAC7D,QAAM,gBAAgB,OAAO;AAAA,IAC3B;AAAA,IACA,4BAA4B,OAAO,OAAO;AAAA,EAC5C;AACA,QAAM,iBAAiB,OAAO;AAAA,IAC5B;AAAA,IACA;AAAA,MACE,OAAO,GAAG,QAAQ,gBAAgB;AAAA,MAClC,eAAe;AAAA,IACjB;AAAA,IACA,CAAC,eAA4B;AAC3B,iBAAW,YAAY,4BAA4B,OAAO,OAAO;AACjE,WAAK,yBAAyB,YAAY,OAAO,OAAO;AACxD,iCAA2B,YAAY,QAAQ,cAAc,QAAQ,UAAU;AAAA,IACjF;AAAA,EACF;AAEA,SAAO,OAAO,OAAO,iBAAiB,eAAe,CAAC,GAAG,cAAc;AAEvE,SAAO;AACT;AAEA,SAAS,4BACP,OACA,SACwB;AACxB,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,CAAC,qCAAsB,GAAG;AAAA,IAC1B,CAAC,QAAQ,oBAAoB,GAAG;AAAA,IAChC,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,OAAO,WAAW,QAAQ,WAAW;AAAA,IACrC,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,2BACP,YACA,QACA,cACA,aACM;AACN,aAAW,UAAU,CAAC,UAAU;AAC9B,UAAM,eAAe;AACrB,8BAA0B,QAAQ,YAAY;AAAA,EAChD;AAEA,aAAW,aAAa,CAAC,UAAU;AACjC,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,8BAA0B,QAAQ,YAAY;AAC9C,WAAO,QAAQ,WAAW;AAAA,EAC5B;AACF;AAEA,SAAS,0BAA0B,QAAa,cAAyB;AACvE,MAAI,CAAC,cAAc,KAAK,WAAW,UAAU,GAAG;AAC9C;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,MAAM;AAC1B,SAAO,MAAM,OAAO,CAAC,WAAgB;AACnC,WAAO,aAAa,cAAc,IAAI;AAAA,EACxC,CAAC;AACH;AAEA,SAAS,4BACP,OACA,SACQ;AACR,QAAM,aAAS,oCAAoB,OAAO;AAAA,IACxC,eAAe,QAAQ;AAAA,IACvB,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,SAAO,iBAAiB,MAAM;AAChC;AAEA,SAAS,iBAAiB,QAAwB;AAChD,QAAM,UAAU,SAAS,cAAc,MAAM;AAC7C,UAAQ,YAAY;AACpB,SAAO,QAAQ,mBAAmB,aAAa;AACjD;AAEA,SAAS,+BAA+B,QAAa,WAA+B;AAClF,QAAM,kBAAkB,OAAO,MAAM,SAAS,UAAU,mBAAmB;AAC3E,SAAO,iBAAiB,KAAK,WAAW,SAAS,IAAI,kBAAkB;AACzE;AAEA,SAAS,oBAAoB,MAAoB;AAC/C,SAAO,QAAQ,MAAM,KAAK,SAAS,KAAK,KAAK,eAAe,qCAAsB,CAAC;AACrF;AAEA,SAAS,yBAAyB,aAAkB,SAAmD;AACrG,SAAO;AAAA,IACL,YAAY,aAAa,QAAQ,oBAAoB,KAClD,YAAY,aAAa,YAAY,KACrC;AAAA,EACL;AACF;AAEA,IAAM,qBAAqB,oBAAI,IAA6B;AAE5D,eAAe,yBACb,YACA,OACA,SACe;AACf,QAAM,eAAe,MAAM,KAAK;AAChC,QAAM,cAAc,GAAG,YAAY,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC7F,aAAW,QAAQ,cAAc;AAEjC,MAAI,CAAC,cAAc;AACjB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,uBAAuB,cAAc,OAAO;AACjE,QAAI,WAAW,QAAQ,gBAAgB,aAAa;AAClD;AAAA,IACF;AAEA,eAAW,YAAY;AAAA,EACzB,SAAS,OAAO;AACd,QAAI,WAAW,QAAQ,gBAAgB,aAAa;AAClD;AAAA,IACF;AAEA,YAAQ,MAAM,yDAAyD,KAAK;AAAA,EAC9E;AACF;AAEA,SAAS,uBACP,OACA,SACiB;AACjB,QAAM,SAAS,mBAAmB,IAAI,KAAK;AAC3C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY;AAC3B,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,MAAM;AACjB,SAAK,MAAM,QAAQ;AACnB,SAAK,MAAM,SAAS;AACpB,SAAK,MAAM,UAAU;AACrB,SAAK,MAAM,gBAAgB;AAC3B,SAAK,aAAa,eAAe,MAAM;AACvC,aAAS,KAAK,YAAY,IAAI;AAE9B,UAAM,cAAU,wCAAwB,MAAM;AAAA,MAC5C,cAAc;AAAA,MACd,QAAQ,QAAQ,OAAO;AAAA,MACvB,WAAW;AAAA,MACX,QAAQ,QAAQ,OAAO;AAAA,MACvB,QAAQ;AAAA,QACN,UAAU,QAAQ,OAAO,OAAO;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI;AACF,aAAO,MAAM,QAAQ,cAAc;AAAA,IACrC,UAAE;AACA,cAAQ,QAAQ;AAChB,WAAK,OAAO;AAAA,IACd;AAAA,EACF,GAAG;AAEH,qBAAmB,IAAI,OAAO,OAAO;AACrC,UAAQ,MAAM,MAAM;AAClB,QAAI,mBAAmB,IAAI,KAAK,MAAM,SAAS;AAC7C,yBAAmB,OAAO,KAAK;AAAA,IACjC;AAAA,EACF,CAAC;AACD,SAAO;AACT;","names":["import_editor","import_editor"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/plugin.ts","../src/modal.ts"],"sourcesContent":["export {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n} from '@formulaxjs/editor';\n\nexport {\n DEFAULT_BUTTON_NAME,\n DEFAULT_MODEL_NAME,\n FormulaX,\n FormulaXCommand,\n resolveOptions,\n} from './plugin';\n\nexport type {\n FormulaXCKEditor5Options,\n FormulaXPayload,\n RequiredFormulaXCKEditor5Options,\n} from './types';\n\nexport { openFormulaXModal } from './modal';\n\nexport { FormulaX as default } from './plugin';\n","import {\n ButtonView,\n Command,\n Plugin,\n Widget,\n toWidget,\n viewToModelPositionOutsideModelElement,\n} from 'ckeditor5';\nimport {\n DEFAULT_FORMULA_ATTRIBUTE,\n DEFAULT_FORMULA_CLASS,\n FORMULA_FLAG_ATTRIBUTE,\n createFormulaMarkup,\n ensureFormulaXModalStyles,\n mountFormulaXEditor,\n} from '@formulaxjs/editor';\nimport { openFormulaXModal } from './modal';\nimport type {\n FormulaXCKEditor5Options,\n FormulaXPayload,\n RequiredFormulaXCKEditor5Options,\n} from './types';\n\nconst DEFAULT_BUTTON_NAME = 'formulaX';\nconst DEFAULT_MODEL_NAME = 'formulaX';\n\nexport { DEFAULT_BUTTON_NAME, DEFAULT_MODEL_NAME };\n\nexport function resolveOptions(options: FormulaXCKEditor5Options = {}): RequiredFormulaXCKEditor5Options {\n return {\n name: options.name ?? DEFAULT_MODEL_NAME,\n buttonName: options.buttonName ?? DEFAULT_BUTTON_NAME,\n toolbarText: options.toolbarText ?? 'FormulaX',\n tooltip: options.tooltip ?? 'Insert or edit formula',\n cursorStyle: options.cursorStyle ?? 'pointer',\n formulaClassName: options.formulaClassName ?? DEFAULT_FORMULA_CLASS,\n formulaAttributeName: options.formulaAttributeName ?? DEFAULT_FORMULA_ATTRIBUTE,\n modal: {\n title: options.modal?.title ?? 'FormulaX Editor',\n insertText: options.modal?.insertText ?? 'Insert',\n updateText: options.modal?.updateText ?? 'Update',\n cancelText: options.modal?.cancelText ?? 'Cancel',\n closeOnBackdrop: options.modal?.closeOnBackdrop ?? true,\n },\n editor: {\n height: options.editor?.height ?? '100%',\n autofocus: options.editor?.autofocus ?? true,\n assets: options.editor?.assets ?? {},\n render: {\n fontsize: options.editor?.render?.fontsize ?? 40,\n },\n },\n };\n}\n\nexport class FormulaXCommand extends Command {\n private readonly options: RequiredFormulaXCKEditor5Options;\n\n constructor(editor: unknown, options: RequiredFormulaXCKEditor5Options) {\n super(editor as any);\n this.options = options;\n }\n\n override refresh(): void {\n this.isEnabled = true;\n }\n\n override execute(): void {\n const editor = this.editor as any;\n const selectedFormula = getSelectedFormulaModelElement(editor, this.options.name);\n const initialLatex = String(selectedFormula?.getAttribute('latex') ?? '');\n\n void openFormulaXModal({\n initialLatex,\n isUpdate: Boolean(selectedFormula),\n options: this.options,\n }).then((payload) => {\n if (!payload) return;\n applyFormulaPayload(editor, selectedFormula, payload, this.options.name);\n editor.editing.view.focus();\n });\n }\n}\n\nexport class FormulaX extends Plugin {\n static get pluginName(): string {\n return 'FormulaX';\n }\n\n static get requires(): readonly [typeof Widget] {\n return [Widget];\n }\n\n init(): void {\n const editor = this.editor as any;\n const options = resolveOptions(editor.config.get('formulaX') as FormulaXCKEditor5Options | undefined);\n\n if (hasRegisteredFormulaModelName(editor, options.name)) {\n console.error(\n `[FormulaX] CKEditor5 model name \"${options.name}\" is already registered. ` +\n 'Pass a unique \"name\" option to avoid schema collisions.',\n );\n return;\n }\n\n ensureFormulaXModalStyles(document);\n defineFormulaSchema(editor, options.name);\n defineFormulaConverters(editor, options);\n editor.editing.mapper.on(\n 'viewToModelPosition',\n viewToModelPositionOutsideModelElement(editor.model, isFormulaWidgetView),\n );\n\n const command = new FormulaXCommand(editor, options);\n editor.commands.add(options.buttonName, command);\n\n editor.ui.componentFactory.add(options.buttonName, (locale: unknown) => {\n const button = new ButtonView(locale as any);\n\n button.set({\n label: options.toolbarText,\n tooltip: options.tooltip,\n withText: true,\n });\n\n button.bind('isEnabled').to(command, 'isEnabled');\n this.listenTo(button, 'execute', () => editor.execute(options.buttonName));\n\n return button;\n });\n }\n}\n\nexport default FormulaX;\n\nfunction applyFormulaPayload(\n editor: any,\n selectedFormula: any,\n payload: FormulaXPayload,\n modelName: string,\n): void {\n editor.model.change((writer: any) => {\n if (selectedFormula) {\n if (!payload.latex.trim()) {\n writer.remove(selectedFormula);\n return;\n }\n\n writer.setAttribute('latex', payload.latex, selectedFormula);\n return;\n }\n\n if (!payload.latex.trim()) return;\n\n const formula = writer.createElement(modelName, {\n latex: payload.latex,\n });\n\n editor.model.insertObject(formula, null, null, { setSelection: 'after' });\n });\n}\n\nfunction hasRegisteredFormulaModelName(editor: any, modelName: string): boolean {\n const schema = editor?.model?.schema;\n\n if (!schema) {\n return false;\n }\n\n if (typeof schema.isRegistered === 'function') {\n return Boolean(schema.isRegistered(modelName));\n }\n\n if (typeof schema.getDefinition === 'function') {\n return Boolean(schema.getDefinition(modelName));\n }\n\n if (schema._sourceDefinitions?.has) {\n return Boolean(schema._sourceDefinitions.has(modelName));\n }\n\n return Boolean(schema._definitions?.[modelName]);\n}\n\nfunction defineFormulaSchema(editor: any, modelName: string): void {\n editor.model.schema.register(modelName, {\n allowWhere: '$text',\n isInline: true,\n isObject: true,\n allowAttributes: ['latex'],\n });\n}\n\nfunction defineFormulaConverters(editor: any, options: RequiredFormulaXCKEditor5Options): void {\n editor.conversion.for('upcast').elementToElement({\n view: {\n name: 'span',\n attributes: {\n [FORMULA_FLAG_ATTRIBUTE]: true,\n },\n },\n model: (viewElement: any, { writer }: any) => writer.createElement(options.name, {\n latex: readFormulaLatexFromView(viewElement, options),\n }),\n });\n\n editor.conversion.for('dataDowncast').elementToElement({\n model: createFormulaConverterModelDefinition(options.name),\n view: (modelElement: any, { writer }: any) => createFormulaRawElement(writer, modelElement, options),\n });\n\n editor.conversion.for('editingDowncast').elementToElement({\n model: createFormulaConverterModelDefinition(options.name),\n view: (modelElement: any, { writer }: any) => {\n const widgetElement = createFormulaWidgetElement(writer, modelElement, options, editor);\n return toWidget(widgetElement, writer, { label: 'FormulaX formula' });\n },\n });\n}\n\nfunction createFormulaConverterModelDefinition(modelName: string): {\n name: string;\n attributes: string[];\n} {\n return {\n name: modelName,\n attributes: ['latex'],\n };\n}\n\nfunction createFormulaRawElement(\n writer: any,\n modelElement: any,\n options: RequiredFormulaXCKEditor5Options,\n): any {\n const latex = String(modelElement.getAttribute('latex') ?? '');\n\n const element = writer.createContainerElement(\n 'span',\n createFormulaViewAttributes(latex, options),\n );\n\n writer.insert(\n writer.createPositionAt(element, 0),\n writer.createText(latex || '\\\\square'),\n );\n\n return element;\n}\n\nfunction createFormulaWidgetElement(\n writer: any,\n modelElement: any,\n options: RequiredFormulaXCKEditor5Options,\n editor: any,\n): any {\n const latex = String(modelElement.getAttribute('latex') ?? '');\n const widgetElement = writer.createContainerElement(\n 'span',\n createFormulaViewAttributes(latex, options),\n );\n const contentElement = writer.createRawElement(\n 'span',\n {\n class: `${options.formulaClassName}__content`,\n 'aria-hidden': 'true',\n },\n (domElement: HTMLElement) => {\n domElement.innerHTML = createFormulaFallbackMarkup(latex, options);\n void renderFormulaIntoElement(domElement, latex, options);\n bindFormulaWidgetDomEvents(domElement, editor, modelElement, options.buttonName);\n },\n );\n\n writer.insert(writer.createPositionAt(widgetElement, 0), contentElement);\n\n return widgetElement;\n}\n\nfunction createFormulaViewAttributes(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Record<string, string> {\n return {\n class: options.formulaClassName,\n [FORMULA_FLAG_ATTRIBUTE]: 'true',\n [options.formulaAttributeName]: latex,\n 'data-latex': latex,\n contenteditable: 'false',\n role: 'button',\n style: `cursor: ${options.cursorStyle}`,\n tabindex: '0',\n };\n}\n\nfunction bindFormulaWidgetDomEvents(\n domElement: HTMLElement,\n editor: any,\n modelElement: any,\n commandName: string,\n): void {\n domElement.onclick = (event) => {\n event.preventDefault();\n selectFormulaModelElement(editor, modelElement);\n };\n\n domElement.ondblclick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n selectFormulaModelElement(editor, modelElement);\n editor.execute(commandName);\n };\n}\n\nfunction selectFormulaModelElement(editor: any, modelElement: any): void {\n if (!modelElement?.is?.('element', 'formulaX')) {\n return;\n }\n\n editor.editing.view.focus();\n editor.model.change((writer: any) => {\n writer.setSelection(modelElement, 'on');\n });\n}\n\nfunction createFormulaFallbackMarkup(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): string {\n const markup = createFormulaMarkup(latex, {\n attributeName: options.formulaAttributeName,\n className: options.formulaClassName,\n });\n return extractInnerHtml(markup);\n}\n\nfunction extractInnerHtml(markup: string): string {\n const wrapper = document.createElement('span');\n wrapper.innerHTML = markup;\n return wrapper.firstElementChild?.innerHTML ?? '';\n}\n\nfunction getSelectedFormulaModelElement(editor: any, modelName: string): any | null {\n const selectedElement = editor.model.document.selection.getSelectedElement();\n return selectedElement?.is?.('element', modelName) ? selectedElement : null;\n}\n\nfunction isFormulaWidgetView(node: any): boolean {\n return Boolean(node?.is?.('element') && node.hasAttribute?.(FORMULA_FLAG_ATTRIBUTE));\n}\n\nfunction readFormulaLatexFromView(viewElement: any, options: RequiredFormulaXCKEditor5Options): string {\n return String(\n viewElement.getAttribute(options.formulaAttributeName)\n ?? viewElement.getAttribute('data-latex')\n ?? '',\n );\n}\n\nconst formulaRenderCache = new Map<string, Promise<string>>();\n\nasync function renderFormulaIntoElement(\n domElement: HTMLElement,\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Promise<void> {\n const trimmedLatex = latex.trim();\n const renderToken = `${trimmedLatex}::${Date.now()}::${Math.random().toString(36).slice(2, 8)}`;\n domElement.dataset.renderToken = renderToken;\n\n if (!trimmedLatex) {\n return;\n }\n\n try {\n const markup = await renderFormulaSvgMarkup(trimmedLatex, options);\n if (domElement.dataset.renderToken !== renderToken) {\n return;\n }\n\n domElement.innerHTML = markup;\n } catch (error) {\n if (domElement.dataset.renderToken !== renderToken) {\n return;\n }\n\n console.error('[FormulaX] Failed to render CKEditor5 formula widget:', error);\n }\n}\n\nfunction renderFormulaSvgMarkup(\n latex: string,\n options: RequiredFormulaXCKEditor5Options,\n): Promise<string> {\n const cached = formulaRenderCache.get(latex);\n if (cached) {\n return cached;\n }\n\n const pending = (async () => {\n const host = document.createElement('div');\n host.style.position = 'fixed';\n host.style.left = '-100000px';\n host.style.top = '0';\n host.style.width = '1px';\n host.style.height = '1px';\n host.style.opacity = '0';\n host.style.pointerEvents = 'none';\n host.setAttribute('aria-hidden', 'true');\n document.body.appendChild(host);\n\n const mounted = mountFormulaXEditor(host, {\n initialLatex: latex,\n height: options.editor.height,\n autofocus: false,\n assets: options.editor.assets,\n render: {\n fontsize: options.editor.render.fontsize,\n },\n });\n\n try {\n return await mounted.getRenderHtml();\n } finally {\n mounted.destroy();\n host.remove();\n }\n })();\n\n formulaRenderCache.set(latex, pending);\n pending.catch(() => {\n if (formulaRenderCache.get(latex) === pending) {\n formulaRenderCache.delete(latex);\n }\n });\n return pending;\n}\n","import {\n ensureFormulaXModalStyles,\n escapeAttribute,\n escapeHtml,\n mountFormulaXEditor,\n} from '@formulaxjs/editor';\nimport type { FormulaXPayload, RequiredFormulaXCKEditor5Options } from './types';\n\nexport interface OpenFormulaXModalInput {\n initialLatex: string;\n isUpdate: boolean;\n options: RequiredFormulaXCKEditor5Options;\n}\n\nexport function openFormulaXModal(input: OpenFormulaXModalInput): Promise<FormulaXPayload | null> {\n ensureFormulaXModalStyles(document);\n\n const root = document.createElement('div');\n root.className = 'fx-formula-modal-root';\n root.setAttribute('data-formulax-modal', 'true');\n\n const submitText = input.isUpdate ? input.options.modal.updateText : input.options.modal.insertText;\n\n root.innerHTML = `\n <div class=\"fx-formula-modal-backdrop\" data-action=\"backdrop\"></div>\n <div class=\"fx-formula-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${escapeAttribute(input.options.modal.title)}\">\n <header class=\"fx-formula-modal__header\">\n <h2 class=\"fx-formula-modal__title\">${escapeHtml(input.options.modal.title)}</h2>\n <button class=\"fx-formula-modal__close\" type=\"button\" data-action=\"close\" aria-label=\"Close\">×</button>\n </header>\n <section class=\"fx-formula-modal__body\">\n <div class=\"fx-formula-editor-host\"></div>\n </section>\n <footer class=\"fx-formula-modal__footer\">\n <button class=\"fx-formula-modal__button\" type=\"button\" data-action=\"cancel\">${escapeHtml(input.options.modal.cancelText)}</button>\n <button class=\"fx-formula-modal__button fx-formula-modal__button--primary\" type=\"button\" data-action=\"submit\">${escapeHtml(submitText)}</button>\n </footer>\n </div>\n `;\n\n document.body.appendChild(root);\n document.body.classList.add('fx-formula-modal-open');\n\n const host = root.querySelector<HTMLElement>('.fx-formula-editor-host');\n if (!host) {\n root.remove();\n return Promise.reject(new Error('[FormulaX] CKEditor 5 modal host not found.'));\n }\n\n const mounted = mountFormulaXEditor(host, {\n initialLatex: input.initialLatex,\n height: input.options.editor.height,\n autofocus: input.options.editor.autofocus,\n assets: input.options.editor.assets,\n render: {\n fontsize: input.options.editor.render.fontsize,\n },\n });\n let closed = false;\n\n return new Promise((resolve) => {\n const close = (payload: FormulaXPayload | null): void => {\n if (closed) return;\n closed = true;\n\n mounted.destroy();\n root.removeEventListener('click', onClick);\n document.removeEventListener('keydown', onKeydown, true);\n root.remove();\n document.body.classList.remove('fx-formula-modal-open');\n resolve(payload);\n };\n\n const submit = async (): Promise<void> => {\n try {\n const latex = await mounted.getLatex();\n close({ latex });\n } catch (error) {\n host.innerHTML = `\n <div class=\"fx-formula-editor-error\">\n Failed to read FormulaX editor content.\n <pre>${escapeHtml(error instanceof Error ? error.message : String(error))}</pre>\n </div>\n `;\n }\n };\n\n function onClick(event: MouseEvent): void {\n const action = (event.target as HTMLElement).closest<HTMLElement>('[data-action]')?.dataset.action;\n if (!action) return;\n\n if (action === 'submit') {\n void submit();\n return;\n }\n\n if (action === 'cancel' || action === 'close') {\n close(null);\n return;\n }\n\n if (action === 'backdrop' && input.options.modal.closeOnBackdrop) {\n close(null);\n }\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n close(null);\n }\n }\n\n root.addEventListener('click', onClick);\n document.addEventListener('keydown', onKeydown, true);\n\n queueMicrotask(() => {\n mounted.root.focus();\n });\n });\n}\n"],"mappings":"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","names":["import_editor","import_editor"]}
@@ -4919,28 +4919,30 @@ var FormulaX = (() => {
4919
4919
 
4920
4920
  // ../kity-runtime/src/vendor/legacy-ui-utils.ts
4921
4921
  function createLegacyUiUtils() {
4922
- return {
4923
- ele: createElement,
4924
- getRectBox,
4925
- on(target, type, fn) {
4926
- addEvent(target, type, fn);
4927
- return this;
4928
- },
4929
- delegate(target, selector, type, fn) {
4930
- delegateEvent(target, selector, type, fn);
4931
- return this;
4932
- },
4933
- publish(topic, ...args) {
4934
- publish(topic, ...args);
4935
- },
4936
- subscribe,
4937
- getClassList
4938
- };
4922
+ return legacyUiUtils;
4939
4923
  }
4924
+ var legacyUiUtils;
4940
4925
  var init_legacy_ui_utils = __esm({
4941
4926
  "../kity-runtime/src/vendor/legacy-ui-utils.ts"() {
4942
4927
  "use strict";
4943
4928
  init_dom_utils();
4929
+ legacyUiUtils = {
4930
+ ele: createElement,
4931
+ getRectBox,
4932
+ on(target, type, fn) {
4933
+ addEvent(target, type, fn);
4934
+ return this;
4935
+ },
4936
+ delegate(target, selector, type, fn) {
4937
+ delegateEvent(target, selector, type, fn);
4938
+ return this;
4939
+ },
4940
+ publish(topic, ...args) {
4941
+ publish(topic, ...args);
4942
+ },
4943
+ subscribe,
4944
+ getClassList
4945
+ };
4944
4946
  }
4945
4947
  });
4946
4948
 
@@ -23805,7 +23807,7 @@ var FormulaX = (() => {
23805
23807
  kity: runtimeWindow.kity,
23806
23808
  otherPosition: legacyOtherPosition,
23807
23809
  uiDef: legacyUiDef,
23808
- uiUtils: createLegacyUiUtils()
23810
+ uiUtils: legacyUiUtils
23809
23811
  };
23810
23812
  }
23811
23813
  async function ensureKityRuntime() {
@@ -24244,7 +24246,7 @@ var FormulaX = (() => {
24244
24246
  style.textContent = formulaXModalStyles;
24245
24247
  doc2.head.appendChild(style);
24246
24248
  }
24247
- function mountFormulaXKityEditor(root2, options = {}) {
24249
+ function mountFormulaXEditor(root2, options = {}) {
24248
24250
  let destroyed = false;
24249
24251
  let latestLatex = options.initialLatex ?? "";
24250
24252
  let handle = null;
@@ -45647,7 +45649,7 @@ Original error: ${originalError.name}: ${originalError.message}` : "";
45647
45649
  }
45648
45650
  return clonedNodes;
45649
45651
  }
45650
- function insertText2() {
45652
+ function insertText() {
45651
45653
  return (evt, data, conversionApi) => {
45652
45654
  if (!conversionApi.consumable.consume(data.item, evt.name)) {
45653
45655
  return;
@@ -55982,7 +55984,7 @@ Original error: ${originalError.name}: ${originalError.message}` : "";
55982
55984
  schema: model.schema
55983
55985
  });
55984
55986
  mapper.bindElements(node.root, viewRoot);
55985
- downcastDispatcher.on("insert:$text", insertText2());
55987
+ downcastDispatcher.on("insert:$text", insertText());
55986
55988
  downcastDispatcher.on("insert", insertAttributesAndChildren(), {
55987
55989
  priority: "lowest"
55988
55990
  });
@@ -61939,7 +61941,7 @@ Original error: ${originalError.name}: ${originalError.message}` : "";
61939
61941
  root2.remove();
61940
61942
  return Promise.reject(new Error("[FormulaX] CKEditor 5 modal host not found."));
61941
61943
  }
61942
- const mounted = mountFormulaXKityEditor(host, {
61944
+ const mounted = mountFormulaXEditor(host, {
61943
61945
  initialLatex: input.initialLatex,
61944
61946
  height: input.options.editor.height,
61945
61947
  autofocus: input.options.editor.autofocus,
@@ -62291,7 +62293,7 @@ Original error: ${originalError.name}: ${originalError.message}` : "";
62291
62293
  host.style.pointerEvents = "none";
62292
62294
  host.setAttribute("aria-hidden", "true");
62293
62295
  document.body.appendChild(host);
62294
- const mounted = mountFormulaXKityEditor(host, {
62296
+ const mounted = mountFormulaXEditor(host, {
62295
62297
  initialLatex: latex,
62296
62298
  height: options.editor.height,
62297
62299
  autofocus: false,