@llui/markdown-editor 0.2.13 → 0.2.14

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.
Files changed (67) hide show
  1. package/dist/editor.d.ts.map +1 -1
  2. package/dist/editor.js +34 -8
  3. package/dist/editor.js.map +1 -1
  4. package/dist/effects.d.ts +5 -3
  5. package/dist/effects.d.ts.map +1 -1
  6. package/dist/effects.js +7 -5
  7. package/dist/effects.js.map +1 -1
  8. package/dist/format.js.map +1 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/paste.d.ts.map +1 -1
  11. package/dist/paste.js +5 -0
  12. package/dist/paste.js.map +1 -1
  13. package/dist/plugins/_preview.js.map +1 -1
  14. package/dist/plugins/callout.d.ts.map +1 -1
  15. package/dist/plugins/callout.js +37 -45
  16. package/dist/plugins/callout.js.map +1 -1
  17. package/dist/plugins/context-menu.js.map +1 -1
  18. package/dist/plugins/core.js.map +1 -1
  19. package/dist/plugins/emoji.js.map +1 -1
  20. package/dist/plugins/floating-toolbar.js.map +1 -1
  21. package/dist/plugins/hr.d.ts.map +1 -1
  22. package/dist/plugins/hr.js +4 -7
  23. package/dist/plugins/hr.js.map +1 -1
  24. package/dist/plugins/image.d.ts.map +1 -1
  25. package/dist/plugins/image.js +28 -20
  26. package/dist/plugins/image.js.map +1 -1
  27. package/dist/plugins/inline.js.map +1 -1
  28. package/dist/plugins/link.d.ts.map +1 -1
  29. package/dist/plugins/link.js +16 -9
  30. package/dist/plugins/link.js.map +1 -1
  31. package/dist/plugins/math.d.ts.map +1 -1
  32. package/dist/plugins/math.js +25 -34
  33. package/dist/plugins/math.js.map +1 -1
  34. package/dist/plugins/mention.js.map +1 -1
  35. package/dist/plugins/mermaid.d.ts.map +1 -1
  36. package/dist/plugins/mermaid.js +25 -34
  37. package/dist/plugins/mermaid.js.map +1 -1
  38. package/dist/plugins/overlay.js.map +1 -1
  39. package/dist/plugins/single-block.js.map +1 -1
  40. package/dist/plugins/slash.js.map +1 -1
  41. package/dist/plugins/table.d.ts.map +1 -1
  42. package/dist/plugins/table.js +7 -4
  43. package/dist/plugins/table.js.map +1 -1
  44. package/dist/plugins/types.js.map +1 -1
  45. package/dist/plugins/ui.js.map +1 -1
  46. package/dist/security.d.ts +26 -0
  47. package/dist/security.d.ts.map +1 -0
  48. package/dist/security.js +87 -0
  49. package/dist/security.js.map +1 -0
  50. package/dist/state.js.map +1 -1
  51. package/dist/surfaces/link-dialog.js.map +1 -1
  52. package/dist/surfaces/toolbar.js.map +1 -1
  53. package/dist/theme.js.map +1 -1
  54. package/dist/transformers/gfm.js.map +1 -1
  55. package/dist/transformers/registry.js.map +1 -1
  56. package/package.json +10 -8
  57. package/src/editor.ts +44 -8
  58. package/src/effects.ts +7 -5
  59. package/src/paste.ts +5 -0
  60. package/src/plugins/callout.ts +44 -59
  61. package/src/plugins/hr.ts +4 -14
  62. package/src/plugins/image.ts +32 -29
  63. package/src/plugins/link.ts +20 -10
  64. package/src/plugins/math.ts +27 -41
  65. package/src/plugins/mermaid.ts +26 -45
  66. package/src/plugins/table.ts +7 -4
  67. package/src/security.ts +89 -0
@@ -1 +1 @@
1
- {"version":3,"file":"floating-toolbar.js","sourceRoot":"","sources":["../../src/plugins/floating-toolbar.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,uCAAuC;AAEvC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAe,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAgCvD,SAAS,UAAU,CAAC,MAAuC;IACzD,OAAO,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAA;QACjC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;QACvF,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;YACjC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC;YACrC,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC;YACnD,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;YACjC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;SACtF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EAAU,EAAE,GAAiB;IAC9C,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,IAAI,CAAA;QACjB,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC,MAAM,CAAA;QACnB,KAAK,eAAe;YAClB,OAAO,GAAG,CAAC,aAAa,CAAA;QAC1B,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,IAAI,CAAA;QACjB,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,IAAI,CAAA;QACjB;YACE,OAAO,KAAK,CAAA;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,aAAa,GAAkB,EAAE,CAAA;IAErC,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CACpE,CAAA;QACH,CAAC;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,GAAS,EAAE;gBACzB,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAClD,MAAM,CAAC,GAAG,aAAa,EAAE,CAAA;oBACzB,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;gBACjD,CAAC,CAAC,CAAA;gBACF,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;gBACxE,IAAI,SAAS,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;oBAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;oBAC5E,OAAM;gBACR,CAAC;gBACD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAA;gBACtD,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1C,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;oBAC5E,OAAM;gBACR,CAAC;gBACD,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;gBAC9B,MAAM,KAAK,GAAc,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACjD,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK;oBACtC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;iBAC7B,CAAC,CAAC,CAAA;gBACH,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,iBAAiB;oBACvB,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;iBACzE,CAAC,CAAA;YACJ,CAAC,CAAA;YACD,OAAO,aAAa,CAClB,MAAM,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;YAC9C,iEAAiE;YACjE,gBAAgB,CAAC,OAAO,CAAC,CAC1B,CAAA;QACH,CAAC;QACD,EAAE,EAAE,cAAc,CAAoC;YACpD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACpD,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACrB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;oBACjB,KAAK,MAAM;wBACT,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;oBAC7E,KAAK,MAAM;wBACT,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;oBAC3B,KAAK,KAAK,CAAC,CAAC,CAAC;wBACX,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;wBACnC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;gBACxB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;YACjD,CAAC;YACD,6EAA6E;YAC7E,uCAAuC;YACvC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CACxB,WAAW,CAAC;gBACV,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;gBACtB,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;gBAChB,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;gBAChB,MAAM,EAAE,SAAS,CAAC,eAAe;gBACjC,SAAS,EAAE,iCAAiC;gBAC5C,KAAK,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE;gBAC1D,QAAQ,EAAE,GAAG,EAAE,CAAC;oBACd,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAsB,EAAE;wBAC3C,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;wBAClB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;4BACvB,MAAM,CACJ;gCACE,IAAI,EAAE,QAAQ;gCACd,YAAY,EAAE,aAAa;gCAC3B,WAAW,EAAE,MAAM;gCACnB,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gCAC7D,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;gCACxC,WAAW,EAAE,CAAC,CAAa,EAAE,EAAE;oCAC7B,CAAC,CAAC,cAAc,EAAE,CAAA;oCAClB,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;gCAC5C,CAAC;6BACF,EACD,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC7E;yBACF;qBACF,CAAC;iBACH;aACF,CAAC;SACL,CAAC;KACH,CAAA;AACH,CAAC;AAED,wEAAwE;AACxE,SAAS,WAAW,CAAC,IAAqB;IACxC,2DAA2D;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;IAC/B,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;AACpG,CAAC","sourcesContent":["// Floating selection toolbar — a bubble of inline-format actions that appears\n// above a non-collapsed text selection. A plugin-UI overlay: `register` watches\n// selection changes and positions/fills the bar; clicking a button runs the\n// command on the still-live selection.\n\nimport { $getSelection, $isRangeSelection } from 'lexical'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { $isLinkNode } from '@lexical/link'\nimport { button, each, span, text, unsafeHtml, type Signal } from '@llui/dom'\nimport { definePluginUI } from './ui.js'\nimport { OVERLAY_Z, hideOverlay, onViewportChange, overlayRoot } from './overlay.js'\nimport { DEFAULT_GLYPHS } from '../surfaces/toolbar.js'\nimport type { CommandItem, MarkdownPlugin } from './types.js'\n\ninterface BarItem {\n id: string\n label: string\n glyph: string\n active: boolean\n}\n\ninterface FloatState {\n open: boolean\n x: number\n y: number\n items: BarItem[]\n}\n\ntype FloatMsg =\n | { type: 'show'; x: number; y: number; items: BarItem[] }\n | { type: 'hide' }\n | { type: 'run'; index: number }\n\ntype FloatEffect = { type: 'run'; id: string }\n\ninterface InlineFormat {\n bold: boolean\n italic: boolean\n strikethrough: boolean\n code: boolean\n link: boolean\n}\n\nfunction readFormat(editor: import('lexical').LexicalEditor): InlineFormat {\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return { bold: false, italic: false, strikethrough: false, code: false, link: false }\n }\n return {\n bold: selection.hasFormat('bold'),\n italic: selection.hasFormat('italic'),\n strikethrough: selection.hasFormat('strikethrough'),\n code: selection.hasFormat('code'),\n link: $findMatchingParent(selection.anchor.getNode(), (n) => $isLinkNode(n)) !== null,\n }\n })\n}\n\nfunction activeFor(id: string, fmt: InlineFormat): boolean {\n switch (id) {\n case 'bold':\n return fmt.bold\n case 'italic':\n return fmt.italic\n case 'strikethrough':\n return fmt.strikethrough\n case 'code':\n return fmt.code\n case 'link':\n return fmt.link\n default:\n return false\n }\n}\n\nexport function floatingToolbarPlugin(): MarkdownPlugin {\n let floatingItems: CommandItem[] = []\n\n return {\n name: 'floatingToolbar',\n onItems: (items) => {\n floatingItems = items.filter((i) =>\n i.surfaces ? i.surfaces.includes('floating') : i.group === 'inline',\n )\n },\n register: (editor, ctx) => {\n const refresh = (): void => {\n const collapsed = editor.getEditorState().read(() => {\n const s = $getSelection()\n return !$isRangeSelection(s) || s.isCollapsed()\n })\n const dom = typeof window !== 'undefined' ? window.getSelection() : null\n if (collapsed || !dom || dom.rangeCount === 0) {\n ctx.emit({ type: 'plugin', name: 'floatingToolbar', msg: { type: 'hide' } })\n return\n }\n const rect = dom.getRangeAt(0).getBoundingClientRect()\n if (rect.width === 0 && rect.height === 0) {\n ctx.emit({ type: 'plugin', name: 'floatingToolbar', msg: { type: 'hide' } })\n return\n }\n const fmt = readFormat(editor)\n const items: BarItem[] = floatingItems.map((i) => ({\n id: i.id,\n label: i.label,\n glyph: DEFAULT_GLYPHS[i.id] ?? i.label,\n active: activeFor(i.id, fmt),\n }))\n ctx.emit({\n type: 'plugin',\n name: 'floatingToolbar',\n msg: { type: 'show', x: rect.left + rect.width / 2, y: rect.top, items },\n })\n }\n return mergeRegister(\n editor.registerUpdateListener(() => refresh()),\n // Keep the bubble glued to the selection while the page scrolls.\n onViewportChange(refresh),\n )\n },\n ui: definePluginUI<FloatState, FloatMsg, FloatEffect>({\n init: () => ({ open: false, x: 0, y: 0, items: [] }),\n update: (state, msg) => {\n switch (msg.type) {\n case 'show':\n return { open: msg.items.length > 0, x: msg.x, y: msg.y, items: msg.items }\n case 'hide':\n return hideOverlay(state)\n case 'run': {\n const item = state.items[msg.index]\n return item ? [state, [{ type: 'run', id: item.id }]] : state\n }\n }\n },\n onEffect: (effect, ctx) => {\n ctx.emit({ type: 'runCommand', id: effect.id })\n },\n // `x` is the selection's horizontal centre; the transform centres the bar on\n // it and lifts it above the selection.\n view: ({ state, send }) =>\n overlayRoot({\n open: state.at('open'),\n x: state.at('x'),\n y: state.at('y'),\n zIndex: OVERLAY_Z.floatingToolbar,\n transform: 'transform:translate(-50%,-115%)',\n attrs: { 'data-scope': 'md-floating', 'data-part': 'bar' },\n children: () => [\n each(state.at('items') as Signal<BarItem[]>, {\n key: (it) => it.id,\n render: (item, index) => [\n button(\n {\n type: 'button',\n 'data-scope': 'md-floating',\n 'data-part': 'item',\n 'data-active': item.map((it) => (it.active ? '' : undefined)),\n 'aria-label': item.map((it) => it.label),\n onMouseDown: (e: MouseEvent) => {\n e.preventDefault()\n send({ type: 'run', index: index.peek() })\n },\n },\n [span({ 'data-part': 'glyph', 'aria-hidden': 'true' }, [renderGlyph(item)])],\n ),\n ],\n }),\n ],\n }),\n }),\n }\n}\n\n/** Render an item's glyph (SVG markup → unsafeHtml, otherwise text). */\nfunction renderGlyph(item: Signal<BarItem>): import('@llui/dom').Mountable {\n // The glyph value is stable per row; reading once is fine.\n const glyph = item.peek().glyph\n return glyph.trimStart().startsWith('<svg') ? unsafeHtml(glyph) : text(item.map((it) => it.glyph))\n}\n"]}
1
+ {"version":3,"file":"floating-toolbar.js","sourceRoot":"","sources":["../../src/plugins/floating-toolbar.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hr.d.ts","sourceRoot":"","sources":["../../src/plugins/hr.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AA6BhD,yDAAyD;AACzD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,QAAQ,IAAI,cAAc,CAkBzC"}
1
+ {"version":3,"file":"hr.d.ts","sourceRoot":"","sources":["../../src/plugins/hr.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAmBhD,yDAAyD;AACzD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,QAAQ,IAAI,cAAc,CAkBzC"}
@@ -3,14 +3,11 @@
3
3
  import {} from 'lexical';
4
4
  import { $insertNodeToNearestRoot } from '@lexical/utils';
5
5
  import { $createLLuiDecoratorNode, $isLLuiDecoratorNode, LLuiDecoratorNode, decoratorBridge, } from '@llui/lexical';
6
- import { component, hr } from '@llui/dom';
6
+ import { hr } from '@llui/dom';
7
7
  const BRIDGE_TYPE = 'hr';
8
- const hrBridge = decoratorBridge(BRIDGE_TYPE, () => component({
9
- name: 'HorizontalRule',
10
- init: () => ({}),
11
- update: (state) => state,
12
- view: () => [hr({ 'data-md-hr': '', contenteditable: 'false' })],
13
- }));
8
+ const hrBridge = decoratorBridge(BRIDGE_TYPE, () => [
9
+ hr({ 'data-md-hr': '', contenteditable: 'false' }),
10
+ ]);
14
11
  const HR_TRANSFORMER = {
15
12
  dependencies: [LLuiDecoratorNode],
16
13
  export: (node) => $isLLuiDecoratorNode(node) && node.getBridgeType() === BRIDGE_TYPE ? '---' : null,
@@ -1 +1 @@
1
- {"version":3,"file":"hr.js","sourceRoot":"","sources":["../../src/plugins/hr.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,sDAAsD;AAEtD,OAAO,EAAsC,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,WAAW,GAAG,IAAI,CAAA;AAExB,MAAM,QAAQ,GAAG,eAAe,CAK9B,WAAW,EAAE,GAAG,EAAE,CAClB,SAAS,CAAiD;IACxD,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAChB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;IACxB,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;CACjE,CAAC,CACH,CAAA;AAED,MAAM,cAAc,GAAuB;IACzC,YAAY,EAAE,CAAC,iBAAiB,CAAC;IACjC,MAAM,EAAE,CAAC,IAAiB,EAAiB,EAAE,CAC3C,oBAAoB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;IACnF,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,CAAC,UAAuB,EAAQ,EAAE;QACzC,UAAU,CAAC,OAAO,CAAC,wBAAwB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,EAAE,SAAS;CAChB,CAAA;AAED,yDAAyD;AACzD,MAAM,UAAU,qBAAqB;IACnC,wBAAwB,CAAC,wBAAwB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO;QACL,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,CAAC,iBAAiB,CAAC;QAC1B,UAAU,EAAE,CAAC,QAAQ,CAAC;QACtB,YAAY,EAAE,CAAC,cAAc,CAAC;QAC9B,KAAK,EAAE;YACL;gBACE,EAAE,EAAE,gBAAgB;gBACpB,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC;gBAChD,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;gBAC7D,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;aAC1C;SACF;KACF,CAAA;AACH,CAAC","sourcesContent":["// Horizontal-rule plugin — a thematic break rendered as an `<hr>` via the\n// decorator bridge, round-tripping to `---` markdown.\n\nimport { type ElementNode, type LexicalNode } from 'lexical'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport type { ElementTransformer } from '@lexical/markdown'\nimport {\n $createLLuiDecoratorNode,\n $isLLuiDecoratorNode,\n LLuiDecoratorNode,\n decoratorBridge,\n} from '@llui/lexical'\nimport { component, hr } from '@llui/dom'\nimport type { MarkdownPlugin } from './types.js'\n\nconst BRIDGE_TYPE = 'hr'\n\nconst hrBridge = decoratorBridge<\n Record<string, never>,\n Record<string, never>,\n { type: 'noop' },\n never\n>(BRIDGE_TYPE, () =>\n component<Record<string, never>, { type: 'noop' }, never>({\n name: 'HorizontalRule',\n init: () => ({}),\n update: (state) => state,\n view: () => [hr({ 'data-md-hr': '', contenteditable: 'false' })],\n }),\n)\n\nconst HR_TRANSFORMER: ElementTransformer = {\n dependencies: [LLuiDecoratorNode],\n export: (node: LexicalNode): string | null =>\n $isLLuiDecoratorNode(node) && node.getBridgeType() === BRIDGE_TYPE ? '---' : null,\n regExp: /^(---|\\*\\*\\*|___)\\s*$/,\n replace: (parentNode: ElementNode): void => {\n parentNode.replace($createLLuiDecoratorNode(BRIDGE_TYPE, {}))\n },\n type: 'element',\n}\n\n/** Insert a horizontal rule at the current selection. */\nexport function $insertHorizontalRule(): void {\n $insertNodeToNearestRoot($createLLuiDecoratorNode(BRIDGE_TYPE, {}))\n}\n\nexport function hrPlugin(): MarkdownPlugin {\n return {\n name: 'hr',\n nodes: [LLuiDecoratorNode],\n decorators: [hrBridge],\n transformers: [HR_TRANSFORMER],\n items: [\n {\n id: 'horizontalRule',\n label: 'Divider',\n icon: 'hr',\n group: 'insert',\n keywords: ['rule', 'divider', 'separator', 'hr'],\n run: (editor) => editor.update(() => $insertHorizontalRule()),\n surfaces: ['toolbar', 'slash', 'context'],\n },\n ],\n }\n}\n"]}
1
+ {"version":3,"file":"hr.js","sourceRoot":"","sources":["../../src/plugins/hr.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,sDAAsD;AAEtD,OAAO,EAAsC,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAA;AAG9B,MAAM,WAAW,GAAG,IAAI,CAAA;AAExB,MAAM,QAAQ,GAAG,eAAe,CAAwB,WAAW,EAAE,GAAG,EAAE,CAAC;IACzE,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;CACnD,CAAC,CAAA;AAEF,MAAM,cAAc,GAAuB;IACzC,YAAY,EAAE,CAAC,iBAAiB,CAAC;IACjC,MAAM,EAAE,CAAC,IAAiB,EAAiB,EAAE,CAC3C,oBAAoB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;IACnF,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,CAAC,UAAuB,EAAQ,EAAE;QACzC,UAAU,CAAC,OAAO,CAAC,wBAAwB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,EAAE,SAAS;CAChB,CAAA;AAED,yDAAyD;AACzD,MAAM,UAAU,qBAAqB;IACnC,wBAAwB,CAAC,wBAAwB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO;QACL,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,CAAC,iBAAiB,CAAC;QAC1B,UAAU,EAAE,CAAC,QAAQ,CAAC;QACtB,YAAY,EAAE,CAAC,cAAc,CAAC;QAC9B,KAAK,EAAE;YACL;gBACE,EAAE,EAAE,gBAAgB;gBACpB,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC;gBAChD,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;gBAC7D,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;aAC1C;SACF;KACF,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/plugins/image.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAgFhD,MAAM,WAAW,kBAAkB;IACjC;kDAC8C;IAC9C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACzC;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,cAAc,CA2HzE"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/plugins/image.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AA0EhD,MAAM,WAAW,kBAAkB;IACjC;kDAC8C;IAC9C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACzC;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,cAAc,CAkIzE"}
@@ -5,8 +5,9 @@
5
5
  import { $getSelection, $setSelection, } from 'lexical';
6
6
  import { $insertNodeToNearestRoot } from '@lexical/utils';
7
7
  import { $createLLuiDecoratorNode, $isLLuiDecoratorNode, LLuiDecoratorNode, decoratorBridge, } from '@llui/lexical';
8
- import { button, component, div, img, input, text } from '@llui/dom';
8
+ import { button, div, img, input, text } from '@llui/dom';
9
9
  import { connect as connectDialog, overlay as overlayDialog, } from '@llui/components/dialog';
10
+ import { sanitizeImageUrl } from '../security.js';
10
11
  import { definePluginUI } from './ui.js';
11
12
  const BRIDGE_TYPE = 'image';
12
13
  function isImageData(value) {
@@ -15,16 +16,11 @@ function isImageData(value) {
15
16
  typeof value.src === 'string' &&
16
17
  typeof value.alt === 'string');
17
18
  }
18
- const imageBridge = decoratorBridge(BRIDGE_TYPE, (data) => component({
19
- name: 'Image',
20
- init: () => ({ src: data.src, alt: data.alt }),
21
- update: (state) => state,
22
- view: ({ state }) => [
23
- div({ 'data-scope': 'md-image', 'data-part': 'root', contenteditable: 'false' }, [
24
- img({ src: state.at('src'), alt: state.at('alt') }),
25
- ]),
26
- ],
27
- }));
19
+ const imageBridge = decoratorBridge(BRIDGE_TYPE, (data) => [
20
+ div({ 'data-scope': 'md-image', 'data-part': 'root', contenteditable: 'false' }, [
21
+ img({ src: data.at('src'), alt: data.at('alt') }),
22
+ ]),
23
+ ]);
28
24
  const IMAGE_TRANSFORMER = {
29
25
  dependencies: [LLuiDecoratorNode],
30
26
  export: (node) => {
@@ -35,7 +31,13 @@ const IMAGE_TRANSFORMER = {
35
31
  },
36
32
  regExp: /^!\[([^\]]*)\]\(([^)]+)\)$/,
37
33
  replace: (parentNode, _children, match) => {
38
- parentNode.replace($createLLuiDecoratorNode(BRIDGE_TYPE, { alt: match[1] ?? '', src: match[2] ?? '' }));
34
+ // Enforce the image-src allowlist on import/paste: a disallowed scheme
35
+ // (e.g. `javascript:`) sanitizes to null → drop the image entirely rather
36
+ // than materialize a decorator node bound to an unsafe src.
37
+ const src = sanitizeImageUrl(match[2] ?? '');
38
+ if (src === null)
39
+ return;
40
+ parentNode.replace($createLLuiDecoratorNode(BRIDGE_TYPE, { alt: match[1] ?? '', src }));
39
41
  },
40
42
  type: 'element',
41
43
  };
@@ -55,7 +57,9 @@ function dialogOpen(msg, current) {
55
57
  }
56
58
  }
57
59
  export function imagePlugin(opts = {}) {
58
- let savedSelection = null;
60
+ // Keyed by the per-mount editor so two mounts never cross-wire the selection
61
+ // saved while the insert dialog is open.
62
+ const savedSelection = new WeakMap();
59
63
  return {
60
64
  name: 'image',
61
65
  nodes: [LLuiDecoratorNode],
@@ -155,20 +159,24 @@ export function imagePlugin(opts = {}) {
155
159
  if (!editor)
156
160
  return;
157
161
  if (effect.type === 'begin') {
158
- savedSelection = editor.getEditorState().read(() => {
162
+ savedSelection.set(editor, editor.getEditorState().read(() => {
159
163
  const selection = $getSelection();
160
164
  return selection ? selection.clone() : null;
161
- });
165
+ }));
162
166
  return;
163
167
  }
164
- if (effect.src.trim() === '')
168
+ // Enforce the image-src allowlist at insert: a disallowed scheme drops
169
+ // the insertion rather than binding the decorator to an unsafe src.
170
+ const src = sanitizeImageUrl(effect.src.trim());
171
+ if (src === null)
165
172
  return;
173
+ const saved = savedSelection.get(editor) ?? null;
166
174
  editor.update(() => {
167
- if (savedSelection)
168
- $setSelection(savedSelection.clone());
169
- $insertNodeToNearestRoot($createLLuiDecoratorNode(BRIDGE_TYPE, { src: effect.src.trim(), alt: effect.alt }));
175
+ if (saved)
176
+ $setSelection(saved.clone());
177
+ $insertNodeToNearestRoot($createLLuiDecoratorNode(BRIDGE_TYPE, { src, alt: effect.alt }));
170
178
  });
171
- savedSelection = null;
179
+ savedSelection.delete(editor);
172
180
  },
173
181
  }),
174
182
  };
@@ -1 +1 @@
1
- {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/plugins/image.ts"],"names":[],"mappings":"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","sourcesContent":["// Image plugin — a block image rendered via the decorator bridge, round-tripping\n// to `![alt](src)` markdown, inserted through a plugin-UI dialog (URL + alt, with\n// optional file upload). Exercises decorator rendering + a transformer + the\n// plugin-UI extension all at once.\n\nimport {\n $getSelection,\n $setSelection,\n type BaseSelection,\n type ElementNode,\n type LexicalNode,\n} from 'lexical'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport type { ElementTransformer } from '@lexical/markdown'\nimport {\n $createLLuiDecoratorNode,\n $isLLuiDecoratorNode,\n LLuiDecoratorNode,\n decoratorBridge,\n} from '@llui/lexical'\nimport { button, component, div, img, input, text, type Signal } from '@llui/dom'\nimport {\n connect as connectDialog,\n overlay as overlayDialog,\n type DialogMsg,\n} from '@llui/components/dialog'\nimport { definePluginUI } from './ui.js'\nimport type { MarkdownPlugin } from './types.js'\n\nconst BRIDGE_TYPE = 'image'\n\ninterface ImageData {\n src: string\n alt: string\n}\n\nfunction isImageData(value: unknown): value is ImageData {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as ImageData).src === 'string' &&\n typeof (value as ImageData).alt === 'string'\n )\n}\n\nconst imageBridge = decoratorBridge<ImageData, ImageData, { type: 'noop' }, never>(\n BRIDGE_TYPE,\n (data) =>\n component<ImageData, { type: 'noop' }, never>({\n name: 'Image',\n init: () => ({ src: data.src, alt: data.alt }),\n update: (state) => state,\n view: ({ state }) => [\n div({ 'data-scope': 'md-image', 'data-part': 'root', contenteditable: 'false' }, [\n img({ src: state.at('src') as Signal<string>, alt: state.at('alt') as Signal<string> }),\n ]),\n ],\n }),\n)\n\nconst IMAGE_TRANSFORMER: ElementTransformer = {\n dependencies: [LLuiDecoratorNode],\n export: (node: LexicalNode): string | null => {\n if (!$isLLuiDecoratorNode(node) || node.getBridgeType() !== BRIDGE_TYPE) return null\n const data = node.getData()\n return isImageData(data) ? `![${data.alt}](${data.src})` : null\n },\n regExp: /^!\\[([^\\]]*)\\]\\(([^)]+)\\)$/,\n replace: (parentNode: ElementNode, _children, match): void => {\n parentNode.replace(\n $createLLuiDecoratorNode(BRIDGE_TYPE, { alt: match[1] ?? '', src: match[2] ?? '' }),\n )\n },\n type: 'element',\n}\n\ninterface ImageState {\n dialog: { open: boolean }\n src: string\n alt: string\n}\n\ntype ImageMsg =\n | { type: 'open' }\n | { type: 'setSrc'; src: string }\n | { type: 'setAlt'; alt: string }\n | { type: 'submit' }\n | { type: 'dialog'; msg: DialogMsg }\n\ntype ImageEffect = { type: 'begin' } | { type: 'insert'; src: string; alt: string }\n\nfunction dialogOpen(msg: DialogMsg, current: boolean): boolean {\n switch (msg.type) {\n case 'open':\n return true\n case 'close':\n return false\n case 'toggle':\n return !current\n case 'setOpen':\n return msg.open\n case 'animationEnd':\n case 'transitionEnd':\n return current\n }\n}\n\nexport interface ImagePluginOptions {\n /** Upload a chosen file and resolve to its URL. When omitted, the file picker\n * is hidden and only URL entry is offered. */\n upload?: (file: File) => Promise<string>\n}\n\nexport function imagePlugin(opts: ImagePluginOptions = {}): MarkdownPlugin {\n let savedSelection: BaseSelection | null = null\n\n return {\n name: 'image',\n nodes: [LLuiDecoratorNode],\n decorators: [imageBridge],\n transformers: [IMAGE_TRANSFORMER],\n items: [\n {\n id: 'image',\n label: 'Image',\n icon: 'image',\n group: 'insert',\n keywords: ['img', 'picture', 'photo'],\n run: (_editor, ctx) => ctx.send({ type: 'plugin', name: 'image', msg: { type: 'open' } }),\n surfaces: ['toolbar', 'slash', 'context'],\n },\n ],\n ui: definePluginUI<ImageState, ImageMsg, ImageEffect>({\n init: () => ({ dialog: { open: false }, src: '', alt: '' }),\n update: (state, msg) => {\n switch (msg.type) {\n case 'open':\n return [{ dialog: { open: true }, src: '', alt: '' }, [{ type: 'begin' }]]\n case 'setSrc':\n return { ...state, src: msg.src }\n case 'setAlt':\n return { ...state, alt: msg.alt }\n case 'submit':\n return [\n { ...state, dialog: { open: false } },\n [{ type: 'insert', src: state.src, alt: state.alt }],\n ]\n case 'dialog': {\n const open = dialogOpen(msg.msg, state.dialog.open)\n return open === state.dialog.open ? state : { ...state, dialog: { open } }\n }\n }\n },\n view: ({ state, send }) => {\n const dialogSend = (msg: DialogMsg): void => send({ type: 'dialog', msg })\n const parts = connectDialog(state.at('dialog'), dialogSend, {\n id: 'md-image-dialog',\n closeLabel: 'Cancel',\n })\n return [\n overlayDialog({\n state: state.at('dialog'),\n send: dialogSend,\n parts,\n content: () => [\n div({ ...parts.content, 'data-md-link': 'box' }, [\n div({ ...parts.title, 'data-md-link': 'title' }, [text('Insert image')]),\n input({\n 'data-md-link': 'input',\n type: 'url',\n placeholder: 'https://example.com/image.png',\n value: state.at('src') as Signal<string>,\n onInput: (e: Event) =>\n send({ type: 'setSrc', src: (e.target as HTMLInputElement).value }),\n }),\n input({\n 'data-md-link': 'input',\n 'data-md-image': 'alt',\n type: 'text',\n placeholder: 'Alt text (description)',\n value: state.at('alt') as Signal<string>,\n onInput: (e: Event) =>\n send({ type: 'setAlt', alt: (e.target as HTMLInputElement).value }),\n }),\n ...(opts.upload\n ? [\n input({\n 'data-md-image': 'file',\n type: 'file',\n accept: 'image/*',\n onChange: (e: Event) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (file && opts.upload) {\n void opts.upload(file).then((src) => send({ type: 'setSrc', src }))\n }\n },\n }),\n ]\n : []),\n div({ 'data-md-link': 'actions' }, [\n button({ ...parts.closeTrigger, 'data-md-link': 'cancel' }, [text('Cancel')]),\n button(\n {\n type: 'button',\n 'data-md-link': 'apply',\n onClick: () => send({ type: 'submit' }),\n },\n [text('Insert')],\n ),\n ]),\n ]),\n ],\n }),\n ]\n },\n onEffect: (effect, ctx) => {\n const editor = ctx.editor()\n if (!editor) return\n if (effect.type === 'begin') {\n savedSelection = editor.getEditorState().read(() => {\n const selection = $getSelection()\n return selection ? selection.clone() : null\n })\n return\n }\n if (effect.src.trim() === '') return\n editor.update(() => {\n if (savedSelection) $setSelection(savedSelection.clone())\n $insertNodeToNearestRoot(\n $createLLuiDecoratorNode(BRIDGE_TYPE, { src: effect.src.trim(), alt: effect.alt }),\n )\n })\n savedSelection = null\n },\n }),\n }\n}\n"]}
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/plugins/image.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kFAAkF;AAClF,6EAA6E;AAC7E,mCAAmC;AAEnC,OAAO,EACL,aAAa,EACb,aAAa,GAKd,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAe,MAAM,WAAW,CAAA;AACtE,OAAO,EACL,OAAO,IAAI,aAAa,EACxB,OAAO,IAAI,aAAa,GAEzB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAGxC,MAAM,WAAW,GAAG,OAAO,CAAA;AAO3B,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAAmB,CAAC,GAAG,KAAK,QAAQ;QAC5C,OAAQ,KAAmB,CAAC,GAAG,KAAK,QAAQ,CAC7C,CAAA;AACH,CAAC;AAED,MAAM,WAAW,GAAG,eAAe,CAAY,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;IACpE,GAAG,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE;QAC/E,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAmB,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAmB,EAAE,CAAC;KACtF,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAuB;IAC5C,YAAY,EAAE,CAAC,iBAAiB,CAAC;IACjC,MAAM,EAAE,CAAC,IAAiB,EAAiB,EAAE;QAC3C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,WAAW;YAAE,OAAO,IAAI,CAAA;QACpF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC3B,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IACjE,CAAC;IACD,MAAM,EAAE,4BAA4B;IACpC,OAAO,EAAE,CAAC,UAAuB,EAAE,SAAS,EAAE,KAAK,EAAQ,EAAE;QAC3D,uEAAuE;QACvE,0EAA0E;QAC1E,4DAA4D;QAC5D,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5C,IAAI,GAAG,KAAK,IAAI;YAAE,OAAM;QACxB,UAAU,CAAC,OAAO,CAAC,wBAAwB,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IACzF,CAAC;IACD,IAAI,EAAE,SAAS;CAChB,CAAA;AAiBD,SAAS,UAAU,CAAC,GAAc,EAAE,OAAgB;IAClD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,IAAI,CAAA;QACb,KAAK,OAAO;YACV,OAAO,KAAK,CAAA;QACd,KAAK,QAAQ;YACX,OAAO,CAAC,OAAO,CAAA;QACjB,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC,IAAI,CAAA;QACjB,KAAK,cAAc,CAAC;QACpB,KAAK,eAAe;YAClB,OAAO,OAAO,CAAA;IAClB,CAAC;AACH,CAAC;AAQD,MAAM,UAAU,WAAW,CAAC,OAA2B,EAAE;IACvD,6EAA6E;IAC7E,yCAAyC;IACzC,MAAM,cAAc,GAAG,IAAI,OAAO,EAAuC,CAAA;IAEzE,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,CAAC,iBAAiB,CAAC;QAC1B,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,YAAY,EAAE,CAAC,iBAAiB,CAAC;QACjC,KAAK,EAAE;YACL;gBACE,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC;gBACrC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;gBACzF,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;aAC1C;SACF;QACD,EAAE,EAAE,cAAc,CAAoC;YACpD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;YAC3D,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACrB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;oBACjB,KAAK,MAAM;wBACT,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;oBAC5E,KAAK,QAAQ;wBACX,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;oBACnC,KAAK,QAAQ;wBACX,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;oBACnC,KAAK,QAAQ;wBACX,OAAO;4BACL,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;4BACrC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;yBACrD,CAAA;oBACH,KAAK,QAAQ,CAAC,CAAC,CAAC;wBACd,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;wBACnD,OAAO,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAA;oBAC5E,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;gBACxB,MAAM,UAAU,GAAG,CAAC,GAAc,EAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAA;gBAC1E,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE;oBAC1D,EAAE,EAAE,iBAAiB;oBACrB,UAAU,EAAE,QAAQ;iBACrB,CAAC,CAAA;gBACF,OAAO;oBACL,aAAa,CAAC;wBACZ,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC;wBACzB,IAAI,EAAE,UAAU;wBAChB,KAAK;wBACL,OAAO,EAAE,GAAG,EAAE,CAAC;4BACb,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE;gCAC/C,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gCACxE,KAAK,CAAC;oCACJ,cAAc,EAAE,OAAO;oCACvB,IAAI,EAAE,KAAK;oCACX,WAAW,EAAE,+BAA+B;oCAC5C,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAmB;oCACxC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE,CACpB,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAG,CAAC,CAAC,MAA2B,CAAC,KAAK,EAAE,CAAC;iCACtE,CAAC;gCACF,KAAK,CAAC;oCACJ,cAAc,EAAE,OAAO;oCACvB,eAAe,EAAE,KAAK;oCACtB,IAAI,EAAE,MAAM;oCACZ,WAAW,EAAE,wBAAwB;oCACrC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAmB;oCACxC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE,CACpB,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAG,CAAC,CAAC,MAA2B,CAAC,KAAK,EAAE,CAAC;iCACtE,CAAC;gCACF,GAAG,CAAC,IAAI,CAAC,MAAM;oCACb,CAAC,CAAC;wCACE,KAAK,CAAC;4CACJ,eAAe,EAAE,MAAM;4CACvB,IAAI,EAAE,MAAM;4CACZ,MAAM,EAAE,SAAS;4CACjB,QAAQ,EAAE,CAAC,CAAQ,EAAE,EAAE;gDACrB,MAAM,IAAI,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;gDACtD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oDACxB,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;gDACrE,CAAC;4CACH,CAAC;yCACF,CAAC;qCACH;oCACH,CAAC,CAAC,EAAE,CAAC;gCACP,GAAG,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE;oCACjC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;oCAC7E,MAAM,CACJ;wCACE,IAAI,EAAE,QAAQ;wCACd,cAAc,EAAE,OAAO;wCACvB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;qCACxC,EACD,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CACjB;iCACF,CAAC;6BACH,CAAC;yBACH;qBACF,CAAC;iBACH,CAAA;YACH,CAAC;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;gBACxB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAA;gBAC3B,IAAI,CAAC,MAAM;oBAAE,OAAM;gBACnB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5B,cAAc,CAAC,GAAG,CAChB,MAAM,EACN,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;wBAChC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAA;wBACjC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;oBAC7C,CAAC,CAAC,CACH,CAAA;oBACD,OAAM;gBACR,CAAC;gBACD,uEAAuE;gBACvE,oEAAoE;gBACpE,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC/C,IAAI,GAAG,KAAK,IAAI;oBAAE,OAAM;gBACxB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAA;gBAChD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;oBACjB,IAAI,KAAK;wBAAE,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;oBACvC,wBAAwB,CAAC,wBAAwB,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;gBAC3F,CAAC,CAAC,CAAA;gBACF,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC/B,CAAC;SACF,CAAC;KACH,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"inline.js","sourceRoot":"","sources":["../../src/plugins/inline.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,+EAA+E;AAC/E,kFAAkF;AAClF,gFAAgF;AAChF,uDAAuD;AAEvD,OAAO,EAAE,mBAAmB,EAA2C,MAAM,SAAS,CAAA;AAOtF,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,CAAA;AAUlG,MAAM,IAAI,GAA0C;IAClD,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,CAAC,QAAQ,CAAC;QACpB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;KACxB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,UAAU,CAAC;QACtB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;KAC1B;IACD,aAAa,EAAE;QACb,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC3B,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;KACjC;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;KACxB;CACF,CAAA;AAED,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;AACxE,CAAC;AAED;gFACgF;AAChF,MAAM,UAAU,WAAW,CAAC,UAAmC,cAAc;IAC3E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;QACpB,OAAO;YACL,EAAE;YACF,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,GAAG,EAAE,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;YACpC,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["// Shared inline text-formatting building blocks: the bold / italic /\n// strikethrough / code command items and the `FORMAT_TEXT_COMMAND` dispatcher.\n// Both `corePlugin` (the full GFM superset) and `singleBlockPlugin` (inline-only)\n// derive their inline surface from here, so the canonical inline-format set and\n// its labels/icons/keywords live in exactly one place.\n\nimport { FORMAT_TEXT_COMMAND, type LexicalEditor, type TextFormatType } from 'lexical'\nimport type { FormatState } from '../state.js'\nimport type { CommandItem } from './types.js'\n\n/** An inline text-format surfaced as a toolbar command item. */\nexport type InlineFormat = 'bold' | 'italic' | 'strikethrough' | 'code'\n\n/** The full inline-format set, in toolbar order. */\nexport const INLINE_FORMATS: readonly InlineFormat[] = ['bold', 'italic', 'strikethrough', 'code']\n\ninterface InlineFormatDef {\n label: string\n icon: string\n keywords: readonly string[]\n format: TextFormatType\n isActive: (f: FormatState) => boolean\n}\n\nconst DEFS: Record<InlineFormat, InlineFormatDef> = {\n bold: {\n label: 'Bold',\n icon: 'bold',\n keywords: ['strong'],\n format: 'bold',\n isActive: (f) => f.bold,\n },\n italic: {\n label: 'Italic',\n icon: 'italic',\n keywords: ['emphasis'],\n format: 'italic',\n isActive: (f) => f.italic,\n },\n strikethrough: {\n label: 'Strikethrough',\n icon: 'strikethrough',\n keywords: ['strike', 'del'],\n format: 'strikethrough',\n isActive: (f) => f.strikethrough,\n },\n code: {\n label: 'Inline code',\n icon: 'code',\n keywords: ['mono'],\n format: 'code',\n isActive: (f) => f.code,\n },\n}\n\n/** Dispatch a text-format toggle on the live editor. */\nexport function inlineFormatCommand(format: TextFormatType): (editor: LexicalEditor) => void {\n return (editor) => editor.dispatchCommand(FORMAT_TEXT_COMMAND, format)\n}\n\n/** Build the inline `CommandItem`s for `formats` (default: all four), grouped\n * under `'inline'`. Surfaces are left unset (item appears in every surface). */\nexport function inlineItems(formats: readonly InlineFormat[] = INLINE_FORMATS): CommandItem[] {\n return formats.map((id) => {\n const def = DEFS[id]\n return {\n id,\n label: def.label,\n icon: def.icon,\n group: 'inline',\n keywords: def.keywords,\n run: inlineFormatCommand(def.format),\n isActive: def.isActive,\n }\n })\n}\n"]}
1
+ {"version":3,"file":"inline.js","sourceRoot":"","sources":["../../src/plugins/inline.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,+EAA+E;AAC/E,kFAAkF;AAClF,gFAAgF;AAChF,uDAAuD;AAEvD,OAAO,EAAE,mBAAmB,EAA2C,MAAM,SAAS,CAAA;AAOtF,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,CAAA;AAUlG,MAAM,IAAI,GAA0C;IAClD,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,CAAC,QAAQ,CAAC;QACpB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;KACxB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,UAAU,CAAC;QACtB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;KAC1B;IACD,aAAa,EAAE;QACb,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC3B,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;KACjC;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;KACxB;CACF,CAAA;AAED,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;AACxE,CAAC;AAED;gFACgF;AAChF,MAAM,UAAU,WAAW,CAAC,UAAmC,cAAc;IAC3E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;QACpB,OAAO;YACL,EAAE;YACF,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,GAAG,EAAE,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;YACpC,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/plugins/link.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,YAAY,CAAA;AA4C7D,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,cAAc,CAkEvE"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/plugins/link.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,YAAY,CAAA;AA4C7D,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,cAAc,CA2EvE"}
@@ -6,6 +6,7 @@ import { $getSelection, $isRangeSelection, $setSelection, } from 'lexical';
6
6
  import { $findMatchingParent } from '@lexical/utils';
7
7
  import { $isLinkNode, $toggleLink } from '@lexical/link';
8
8
  import { linkDialog } from '../surfaces/link-dialog.js';
9
+ import { sanitizeLinkUrl } from '../security.js';
9
10
  import { definePluginUI } from './ui.js';
10
11
  const PLUGIN = 'link';
11
12
  /** Read the URL of the link wrapping the current selection (empty if none). */
@@ -35,8 +36,9 @@ function dialogOpen(msg, current) {
35
36
  }
36
37
  export function linkPlugin(opts = {}) {
37
38
  // Selection saved when the dialog opens (the modal steals focus/selection),
38
- // restored on commit. Encapsulated in the plugin instance not the core editor.
39
- let savedSelection = null;
39
+ // restored on commit. Keyed by the per-mount editor so two mounts of the same
40
+ // plugin instance never cross-wire their saved selection.
41
+ const savedSelection = new WeakMap();
40
42
  const item = {
41
43
  id: 'link',
42
44
  label: 'Link',
@@ -82,20 +84,25 @@ export function linkPlugin(opts = {}) {
82
84
  if (!editor)
83
85
  return;
84
86
  if (effect.type === 'begin') {
85
- savedSelection = editor.getEditorState().read(() => {
87
+ savedSelection.set(editor, editor.getEditorState().read(() => {
86
88
  const selection = $getSelection();
87
89
  return selection ? selection.clone() : null;
88
- });
90
+ }));
89
91
  ctx.send({ type: 'show', url: readLinkUrl(editor) });
90
92
  return;
91
93
  }
92
- const url = effect.url.trim();
94
+ // Enforce the URL-scheme allowlist at commit: a `javascript:`/`data:`
95
+ // href sanitizes to null → no link is created (unlink). The global
96
+ // LinkNode transform is the backstop, but blocking here avoids ever
97
+ // materializing the unsafe link.
98
+ const safe = sanitizeLinkUrl(effect.url.trim());
99
+ const saved = savedSelection.get(editor) ?? null;
93
100
  editor.update(() => {
94
- if (savedSelection)
95
- $setSelection(savedSelection.clone());
96
- $toggleLink(url === '' ? null : url);
101
+ if (saved)
102
+ $setSelection(saved.clone());
103
+ $toggleLink(safe === null || safe === '' ? null : safe);
97
104
  });
98
- savedSelection = null;
105
+ savedSelection.delete(editor);
99
106
  },
100
107
  }),
101
108
  };
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/plugins/link.ts"],"names":[],"mappings":"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","sourcesContent":["// The link plugin — a stateful, UI-bearing feature built entirely as a plugin\n// (no core editor changes). It owns its dialog state, its view (the modal), and\n// its effects (save/restore selection + toggle the link). This is the proof that\n// the plugin-UI extension makes such features pluggable rather than built-in.\n\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n type BaseSelection,\n type LexicalEditor,\n} from 'lexical'\nimport { $findMatchingParent } from '@lexical/utils'\nimport { $isLinkNode, $toggleLink } from '@lexical/link'\nimport type { DialogMsg, DialogState } from '@llui/components/dialog'\nimport { linkDialog } from '../surfaces/link-dialog.js'\nimport { definePluginUI } from './ui.js'\nimport type { CommandItem, MarkdownPlugin } from './types.js'\n\nconst PLUGIN = 'link'\n\ninterface LinkState {\n dialog: DialogState\n url: string\n}\n\ntype LinkMsg =\n | { type: 'open' }\n | { type: 'show'; url: string }\n | { type: 'setUrl'; url: string }\n | { type: 'submit' }\n | { type: 'dialog'; msg: DialogMsg }\n\ntype LinkEffect = { type: 'begin' } | { type: 'commit'; url: string }\n\n/** Read the URL of the link wrapping the current selection (empty if none). */\nfunction readLinkUrl(editor: LexicalEditor): string {\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) return ''\n const link = $findMatchingParent(selection.anchor.getNode(), (node) => $isLinkNode(node))\n return $isLinkNode(link) ? link.getURL() : ''\n })\n}\n\nfunction dialogOpen(msg: DialogMsg, current: boolean): boolean {\n switch (msg.type) {\n case 'open':\n return true\n case 'close':\n return false\n case 'toggle':\n return !current\n case 'setOpen':\n return msg.open\n case 'animationEnd':\n case 'transitionEnd':\n return current\n }\n}\n\nexport interface LinkPluginOptions {\n /** Default URL pre-filled when there's no existing link (default ''). */\n defaultUrl?: string\n}\n\nexport function linkPlugin(opts: LinkPluginOptions = {}): MarkdownPlugin {\n // Selection saved when the dialog opens (the modal steals focus/selection),\n // restored on commit. Encapsulated in the plugin instance — not the core editor.\n let savedSelection: BaseSelection | null = null\n\n const item: CommandItem = {\n id: 'link',\n label: 'Link',\n icon: 'link',\n group: 'inline',\n keywords: ['url', 'href'],\n run: (_editor, ctx) => ctx.send({ type: 'plugin', name: PLUGIN, msg: { type: 'open' } }),\n isActive: (f) => f.link,\n surfaces: ['toolbar', 'floating', 'context'],\n }\n\n return {\n name: PLUGIN,\n items: [item],\n ui: definePluginUI<LinkState, LinkMsg, LinkEffect>({\n init: () => ({ dialog: { open: false }, url: opts.defaultUrl ?? '' }),\n update: (state, msg) => {\n switch (msg.type) {\n case 'open':\n return [state, [{ type: 'begin' }]]\n case 'show':\n return { dialog: { open: true }, url: msg.url }\n case 'setUrl':\n return { ...state, url: msg.url }\n case 'submit':\n return [{ ...state, dialog: { open: false } }, [{ type: 'commit', url: state.url }]]\n case 'dialog': {\n const open = dialogOpen(msg.msg, state.dialog.open)\n return open === state.dialog.open ? state : { ...state, dialog: { open } }\n }\n }\n },\n view: ({ state, send }) => [\n linkDialog({\n dialog: state.at('dialog'),\n url: state.at('url'),\n onInput: (url) => send({ type: 'setUrl', url }),\n onSubmit: () => send({ type: 'submit' }),\n onDialog: (msg) => send({ type: 'dialog', msg }),\n }),\n ],\n onEffect: (effect, ctx) => {\n const editor = ctx.editor()\n if (!editor) return\n if (effect.type === 'begin') {\n savedSelection = editor.getEditorState().read(() => {\n const selection = $getSelection()\n return selection ? selection.clone() : null\n })\n ctx.send({ type: 'show', url: readLinkUrl(editor) })\n return\n }\n const url = effect.url.trim()\n editor.update(() => {\n if (savedSelection) $setSelection(savedSelection.clone())\n $toggleLink(url === '' ? null : url)\n })\n savedSelection = null\n },\n }),\n }\n}\n"]}
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/plugins/link.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/plugins/math.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAgBnE,MAAM,WAAW,iBAAiB;IAChC;gCAC4B;IAC5B;;;0CAGsC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,cAAc,CA0EvE"}
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/plugins/math.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAcnE,MAAM,WAAW,iBAAiB;IAChC;gCAC4B;IAC5B;;;0CAGsC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,cAAc,CA8DvE"}
@@ -4,7 +4,7 @@
4
4
  import {} from 'lexical';
5
5
  import { $insertNodeToNearestRoot } from '@lexical/utils';
6
6
  import { $createLLuiDecoratorNode, $isLLuiDecoratorNode, LLuiDecoratorNode, decoratorBridge, } from '@llui/lexical';
7
- import { component, div, span, text } from '@llui/dom';
7
+ import { div, span, text } from '@llui/dom';
8
8
  import { renderedPreview } from './_preview.js';
9
9
  const BRIDGE_TYPE = 'math';
10
10
  function isMathData(value) {
@@ -12,39 +12,30 @@ function isMathData(value) {
12
12
  }
13
13
  const stop = (e) => e.stopPropagation();
14
14
  export function mathPlugin(opts = {}) {
15
- const bridge = decoratorBridge(BRIDGE_TYPE, (data, api) => component({
16
- name: 'Math',
17
- init: () => ({ tex: data.tex }),
18
- update: (state, msg) => {
19
- if (msg.type === 'commit') {
20
- if (msg.tex === state.tex)
21
- return state;
22
- api.update({ tex: msg.tex });
23
- return { tex: msg.tex };
24
- }
25
- return state;
26
- },
27
- view: ({ state, send }) => {
28
- const children = [
29
- span({
30
- 'data-part': 'source',
31
- contenteditable: 'true',
32
- role: 'textbox',
33
- 'aria-label': 'TeX source',
34
- onKeyDown: stop,
35
- onBeforeInput: stop,
36
- onPaste: stop,
37
- onBlur: (e) => send({ type: 'commit', tex: e.target.textContent ?? '' }),
38
- }, [text(state.at('tex'))]),
39
- ];
40
- if (opts.render) {
41
- children.push(renderedPreview(state.at('tex'), opts.render, 'span'));
42
- }
43
- return [
44
- div({ 'data-scope': 'md-math', 'data-part': 'root', contenteditable: 'false' }, children),
45
- ];
46
- },
47
- }));
15
+ const bridge = decoratorBridge(BRIDGE_TYPE, (data, api) => {
16
+ const children = [
17
+ span({
18
+ 'data-part': 'source',
19
+ contenteditable: 'true',
20
+ role: 'textbox',
21
+ 'aria-label': 'TeX source',
22
+ onKeyDown: stop,
23
+ onBeforeInput: stop,
24
+ onPaste: stop,
25
+ onBlur: (e) => {
26
+ const tex = e.target.textContent ?? '';
27
+ if (tex !== data.peek().tex)
28
+ api.update({ tex });
29
+ },
30
+ }, [text(data.at('tex'))]),
31
+ ];
32
+ if (opts.render) {
33
+ children.push(renderedPreview(data.at('tex'), opts.render, 'span'));
34
+ }
35
+ return [
36
+ div({ 'data-scope': 'md-math', 'data-part': 'root', contenteditable: 'false' }, children),
37
+ ];
38
+ });
48
39
  const transformer = {
49
40
  dependencies: [LLuiDecoratorNode],
50
41
  export: (node) => {
@@ -1 +1 @@
1
- {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/plugins/math.ts"],"names":[],"mappings":"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","sourcesContent":["// Math plugin — a block math node ($$…$$) rendered via the decorator bridge. The\n// TeX source is editable inline (persists on blur); an optional `render` callback\n// (e.g. KaTeX) turns it into a typeset preview. Round-trips to `$$tex$$`.\n\nimport { type ElementNode, type LexicalNode } from 'lexical'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport type { ElementTransformer } from '@lexical/markdown'\nimport {\n $createLLuiDecoratorNode,\n $isLLuiDecoratorNode,\n LLuiDecoratorNode,\n decoratorBridge,\n} from '@llui/lexical'\nimport { component, div, span, text, type Mountable, type Signal } from '@llui/dom'\nimport type { MarkdownPlugin } from './types.js'\nimport { renderedPreview, type PreviewRender } from './_preview.js'\n\nconst BRIDGE_TYPE = 'math'\n\ninterface MathData {\n tex: string\n}\n\nfunction isMathData(value: unknown): value is MathData {\n return typeof value === 'object' && value !== null && typeof (value as MathData).tex === 'string'\n}\n\ntype MathMsg = { type: 'commit'; tex: string }\n\nconst stop = (e: Event): void => e.stopPropagation()\n\nexport interface MathPluginOptions {\n /** Typeset TeX to an HTML string (e.g. via KaTeX). When omitted, the raw TeX is\n * shown in a styled box. */\n /** Render the TeX source to a preview. Return a DOM `Node` (mounted\n * directly, no sanitization) or a **trusted HTML string** (injected as-is\n * — sanitize it yourself, e.g. via DOMPurify, since it carries document\n * content). See `renderedPreview`. */\n render?: PreviewRender\n}\n\nexport function mathPlugin(opts: MathPluginOptions = {}): MarkdownPlugin {\n const bridge = decoratorBridge<MathData, MathData, MathMsg, never>(BRIDGE_TYPE, (data, api) =>\n component<MathData, MathMsg, never>({\n name: 'Math',\n init: () => ({ tex: data.tex }),\n update: (state, msg) => {\n if (msg.type === 'commit') {\n if (msg.tex === state.tex) return state\n api.update({ tex: msg.tex })\n return { tex: msg.tex }\n }\n return state\n },\n view: ({ state, send }) => {\n const children: Mountable[] = [\n span(\n {\n 'data-part': 'source',\n contenteditable: 'true',\n role: 'textbox',\n 'aria-label': 'TeX source',\n onKeyDown: stop,\n onBeforeInput: stop,\n onPaste: stop,\n onBlur: (e: FocusEvent) =>\n send({ type: 'commit', tex: (e.target as HTMLElement).textContent ?? '' }),\n },\n [text(state.at('tex') as Signal<string>)],\n ),\n ]\n if (opts.render) {\n children.push(renderedPreview(state.at('tex') as Signal<string>, opts.render, 'span'))\n }\n return [\n div({ 'data-scope': 'md-math', 'data-part': 'root', contenteditable: 'false' }, children),\n ]\n },\n }),\n )\n\n const transformer: ElementTransformer = {\n dependencies: [LLuiDecoratorNode],\n export: (node: LexicalNode): string | null => {\n if (!$isLLuiDecoratorNode(node) || node.getBridgeType() !== BRIDGE_TYPE) return null\n const data = node.getData()\n return isMathData(data) ? `$$${data.tex}$$` : null\n },\n regExp: /^\\$\\$(.+)\\$\\$$/,\n replace: (parentNode: ElementNode, _children, match): void => {\n parentNode.replace($createLLuiDecoratorNode(BRIDGE_TYPE, { tex: match[1] ?? '' }))\n },\n type: 'element',\n }\n\n return {\n name: 'math',\n nodes: [LLuiDecoratorNode],\n decorators: [bridge],\n transformers: [transformer],\n items: [\n {\n id: 'math',\n label: 'Math block',\n icon: 'math',\n group: 'insert',\n keywords: ['latex', 'tex', 'equation', 'formula'],\n run: (editor) =>\n editor.update(() =>\n $insertNodeToNearestRoot($createLLuiDecoratorNode(BRIDGE_TYPE, { tex: 'e = mc^2' })),\n ),\n surfaces: ['slash', 'context'],\n },\n ],\n }\n}\n"]}
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/plugins/math.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/plugins/mention.ts"],"names":[],"mappings":"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","sourcesContent":["// Mention plugin — an `@`-triggered typeahead. Same shape as the slash menu, but\n// the candidates come from a configurable `source`, and choosing inserts the\n// mention text (`@label`) rather than running a command. Demonstrates a second\n// typeahead built on the plugin-UI seam with no new machinery.\n\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_HIGH,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n} from 'lexical'\nimport { mergeRegister } from '@lexical/utils'\nimport { div, each, text, type Signal } from '@llui/dom'\nimport { definePluginUI } from './ui.js'\nimport { OVERLAY_Z, hideOverlay, overlayRoot } from './overlay.js'\nimport type { MarkdownPlugin } from './types.js'\n\nexport interface Mention {\n id: string\n label: string\n}\n\ninterface Row {\n id: string\n label: string\n active: boolean\n}\n\ninterface MentionState {\n open: boolean\n query: string\n items: Row[]\n index: number\n x: number\n y: number\n}\n\ntype MentionMsg =\n | { type: 'show'; query: string; items: Mention[]; x: number; y: number }\n | { type: 'hide' }\n | { type: 'move'; delta: number }\n | { type: 'choose' }\n | { type: 'click'; index: number }\n\ntype MentionEffect = { type: 'insert'; label: string; query: string }\n\nconst TRIGGER = /(?:^|\\s)@(\\w*)$/\n\nconst DEFAULT_MENTIONS: readonly Mention[] = [\n { id: 'franco', label: 'Franco' },\n { id: 'ada', label: 'Ada' },\n { id: 'grace', label: 'Grace' },\n { id: 'linus', label: 'Linus' },\n { id: 'margaret', label: 'Margaret' },\n]\n\nfunction withActive(items: readonly Mention[], index: number): Row[] {\n return items.map((it, i) => ({ id: it.id, label: it.label, active: i === index }))\n}\n\nfunction $readQuery(): string | null {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) return null\n const node = selection.anchor.getNode()\n if (!$isTextNode(node)) return null\n const before = node.getTextContent().slice(0, selection.anchor.offset)\n const match = before.match(TRIGGER)\n return match ? (match[1] ?? '') : null\n}\n\nfunction caretXY(): { x: number; y: number } {\n if (typeof window === 'undefined') return { x: 0, y: 0 }\n const sel = window.getSelection()\n if (sel && sel.rangeCount > 0) {\n const rect = sel.getRangeAt(0).getBoundingClientRect()\n return { x: rect.left, y: rect.bottom + 4 }\n }\n return { x: 0, y: 0 }\n}\n\nexport interface MentionPluginOptions {\n /** Resolve candidates for a query (default: a small sample list). */\n source?: (query: string) => readonly Mention[]\n}\n\nexport function mentionPlugin(opts: MentionPluginOptions = {}): MarkdownPlugin {\n const source =\n opts.source ??\n ((query: string) =>\n DEFAULT_MENTIONS.filter((m) => m.label.toLowerCase().includes(query.toLowerCase())))\n\n return {\n name: 'mention',\n register: (editor, ctx) => {\n const isActive = (): boolean => editor.getEditorState().read(() => $readQuery() !== null)\n\n const refresh = (): void => {\n const query = editor.getEditorState().read(() => $readQuery())\n if (query === null) {\n ctx.emit({ type: 'plugin', name: 'mention', msg: { type: 'hide' } })\n return\n }\n const items = [...source(query)].slice(0, 8)\n const { x, y } = caretXY()\n ctx.emit({ type: 'plugin', name: 'mention', msg: { type: 'show', query, items, x, y } })\n }\n\n const nav = (delta: number, e: KeyboardEvent | null): boolean => {\n if (!isActive()) return false\n e?.preventDefault()\n ctx.emit({ type: 'plugin', name: 'mention', msg: { type: 'move', delta } })\n return true\n }\n\n return mergeRegister(\n editor.registerUpdateListener(() => refresh()),\n editor.registerCommand(KEY_ARROW_DOWN_COMMAND, (e) => nav(1, e), COMMAND_PRIORITY_HIGH),\n editor.registerCommand(KEY_ARROW_UP_COMMAND, (e) => nav(-1, e), COMMAND_PRIORITY_HIGH),\n editor.registerCommand(\n KEY_ENTER_COMMAND,\n (e) => {\n if (!isActive()) return false\n e?.preventDefault()\n ctx.emit({ type: 'plugin', name: 'mention', msg: { type: 'choose' } })\n return true\n },\n COMMAND_PRIORITY_HIGH,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (!isActive()) return false\n ctx.emit({ type: 'plugin', name: 'mention', msg: { type: 'hide' } })\n return true\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n },\n ui: definePluginUI<MentionState, MentionMsg, MentionEffect>({\n init: () => ({ open: false, query: '', items: [], index: 0, x: 0, y: 0 }),\n update: (state, msg) => {\n switch (msg.type) {\n case 'show':\n return {\n open: msg.items.length > 0,\n query: msg.query,\n items: withActive(msg.items, 0),\n index: 0,\n x: msg.x,\n y: msg.y,\n }\n case 'hide':\n return hideOverlay(state)\n case 'move': {\n if (!state.open || state.items.length === 0) return state\n const index = (state.index + msg.delta + state.items.length) % state.items.length\n return { ...state, index, items: withActive(state.items, index) }\n }\n case 'choose': {\n const item = state.items[state.index]\n if (!state.open || !item) return hideOverlay(state)\n return [\n { ...state, open: false },\n [{ type: 'insert', label: item.label, query: state.query }],\n ]\n }\n case 'click': {\n const item = state.items[msg.index]\n if (!item) return state\n return [\n { ...state, open: false },\n [{ type: 'insert', label: item.label, query: state.query }],\n ]\n }\n }\n },\n onEffect: (effect, ctx) => {\n const editor = ctx.editor()\n if (!editor) return\n editor.update(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) return\n const node = selection.anchor.getNode()\n if (!$isTextNode(node)) return\n const offset = selection.anchor.offset\n const start = offset - effect.query.length - 1\n if (start >= 0) node.spliceText(start, effect.query.length + 1, `@${effect.label} `, true)\n })\n },\n view: ({ state, send }) =>\n overlayRoot({\n open: state.at('open'),\n x: state.at('x'),\n y: state.at('y'),\n zIndex: OVERLAY_Z.typeahead,\n attrs: { 'data-scope': 'md-slash', 'data-part': 'root' },\n children: () => [\n each(state.at('items') as Signal<Row[]>, {\n key: (it) => it.id,\n render: (item, index) => [\n div(\n {\n 'data-scope': 'md-slash',\n 'data-part': 'option',\n 'data-active': item.map((it) => (it.active ? '' : undefined)),\n onMouseDown: (e: MouseEvent) => {\n e.preventDefault()\n send({ type: 'click', index: index.peek() })\n },\n },\n [text(item.map((it) => `@${it.label}`))],\n ),\n ],\n }),\n ],\n }),\n }),\n }\n}\n"]}
1
+ {"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/plugins/mention.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/plugins/mermaid.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAkBnE,MAAM,WAAW,oBAAoB;IACnC;kDAC8C;IAC9C;;;0CAGsC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,wBAAgB,aAAa,CAAC,IAAI,GAAE,oBAAyB,GAAG,cAAc,CAsF7E"}
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/plugins/mermaid.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAgBnE,MAAM,WAAW,oBAAoB;IACnC;kDAC8C;IAC9C;;;0CAGsC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,wBAAgB,aAAa,CAAC,IAAI,GAAE,oBAAyB,GAAG,cAAc,CAqE7E"}
@@ -8,7 +8,7 @@
8
8
  import {} from 'lexical';
9
9
  import { $insertNodeToNearestRoot } from '@lexical/utils';
10
10
  import { $createLLuiDecoratorNode, $isLLuiDecoratorNode, LLuiDecoratorNode, decoratorBridge, } from '@llui/lexical';
11
- import { component, div, text } from '@llui/dom';
11
+ import { div, text } from '@llui/dom';
12
12
  import { renderedPreview } from './_preview.js';
13
13
  const BRIDGE_TYPE = 'mermaid';
14
14
  function isMermaidData(value) {
@@ -16,39 +16,30 @@ function isMermaidData(value) {
16
16
  }
17
17
  const stop = (e) => e.stopPropagation();
18
18
  export function mermaidPlugin(opts = {}) {
19
- const bridge = decoratorBridge(BRIDGE_TYPE, (data, api) => component({
20
- name: 'Mermaid',
21
- init: () => ({ code: data.code }),
22
- update: (state, msg) => {
23
- if (msg.type === 'commit') {
24
- if (msg.code === state.code)
25
- return state;
26
- api.update({ code: msg.code });
27
- return { code: msg.code };
28
- }
29
- return state;
30
- },
31
- view: ({ state, send }) => {
32
- const children = [
33
- div({
34
- 'data-part': 'source',
35
- contenteditable: 'true',
36
- role: 'textbox',
37
- 'aria-label': 'Mermaid source',
38
- onKeyDown: stop,
39
- onBeforeInput: stop,
40
- onPaste: stop,
41
- onBlur: (e) => send({ type: 'commit', code: e.target.textContent ?? '' }),
42
- }, [text(state.at('code'))]),
43
- ];
44
- if (opts.render) {
45
- children.push(renderedPreview(state.at('code'), opts.render));
46
- }
47
- return [
48
- div({ 'data-scope': 'md-mermaid', 'data-part': 'root', contenteditable: 'false' }, children),
49
- ];
50
- },
51
- }));
19
+ const bridge = decoratorBridge(BRIDGE_TYPE, (data, api) => {
20
+ const children = [
21
+ div({
22
+ 'data-part': 'source',
23
+ contenteditable: 'true',
24
+ role: 'textbox',
25
+ 'aria-label': 'Mermaid source',
26
+ onKeyDown: stop,
27
+ onBeforeInput: stop,
28
+ onPaste: stop,
29
+ onBlur: (e) => {
30
+ const code = e.target.textContent ?? '';
31
+ if (code !== data.peek().code)
32
+ api.update({ code });
33
+ },
34
+ }, [text(data.at('code'))]),
35
+ ];
36
+ if (opts.render) {
37
+ children.push(renderedPreview(data.at('code'), opts.render));
38
+ }
39
+ return [
40
+ div({ 'data-scope': 'md-mermaid', 'data-part': 'root', contenteditable: 'false' }, children),
41
+ ];
42
+ });
52
43
  const transformer = {
53
44
  dependencies: [LLuiDecoratorNode],
54
45
  export: (node) => {