@gravity-ui/markdown-editor 15.28.1 → 15.30.0

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 (120) hide show
  1. package/build/cjs/bundle/Editor.js +1 -0
  2. package/build/cjs/bundle/Editor.js.map +1 -1
  3. package/build/cjs/bundle/settings/index.css +6 -14
  4. package/build/cjs/bundle/settings/index.js +5 -2
  5. package/build/cjs/bundle/settings/index.js.map +1 -1
  6. package/build/cjs/bundle/types.d.ts +2 -0
  7. package/build/cjs/bundle/types.js.map +1 -1
  8. package/build/cjs/core/types/serializer.d.ts +5 -0
  9. package/build/cjs/core/types/serializer.js.map +1 -1
  10. package/build/cjs/extensions/behavior/Search/SearchViewPlugin.js +24 -0
  11. package/build/cjs/extensions/behavior/Search/SearchViewPlugin.js.map +1 -1
  12. package/build/cjs/extensions/markdown/Breaks/index.d.ts +2 -0
  13. package/build/cjs/extensions/markdown/Breaks/index.js +7 -4
  14. package/build/cjs/extensions/markdown/Breaks/index.js.map +1 -1
  15. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/const.d.ts +3 -0
  16. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/const.js +5 -1
  17. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/const.js.map +1 -1
  18. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.d.ts +2 -6
  19. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js +1 -1
  20. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
  21. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/parser.js +27 -1
  22. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/parser.js.map +1 -1
  23. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/schema.d.ts +8 -2
  24. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/schema.js +3 -1
  25. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/schema.js.map +1 -1
  26. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/serializer.js +14 -2
  27. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/serializer.js.map +1 -1
  28. package/build/cjs/extensions/yfm/Checkbox/index.css +5 -9
  29. package/build/cjs/extensions/yfm/Checkbox/index.d.ts +8 -1
  30. package/build/cjs/extensions/yfm/Checkbox/index.js +1 -1
  31. package/build/cjs/extensions/yfm/Checkbox/index.js.map +1 -1
  32. package/build/cjs/extensions/yfm/Checkbox/plugin.d.ts +5 -1
  33. package/build/cjs/extensions/yfm/Checkbox/plugin.js +8 -3
  34. package/build/cjs/extensions/yfm/Checkbox/plugin.js.map +1 -1
  35. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +5 -1
  36. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  37. package/build/cjs/markup/codemirror/create.d.ts +3 -1
  38. package/build/cjs/markup/codemirror/create.js +4 -1
  39. package/build/cjs/markup/codemirror/create.js.map +1 -1
  40. package/build/cjs/markup/codemirror/gravity.js +0 -1
  41. package/build/cjs/markup/codemirror/gravity.js.map +1 -1
  42. package/build/cjs/markup/codemirror/search-plugin/plugin.js +10 -0
  43. package/build/cjs/markup/codemirror/search-plugin/plugin.js.map +1 -1
  44. package/build/cjs/modules/search/components/SearchPopup.d.ts +2 -0
  45. package/build/cjs/modules/search/components/SearchPopup.js +11 -2
  46. package/build/cjs/modules/search/components/SearchPopup.js.map +1 -1
  47. package/build/cjs/modules/search/components/hooks/useObserveIntersection.d.ts +10 -0
  48. package/build/cjs/modules/search/components/hooks/useObserveIntersection.js +44 -0
  49. package/build/cjs/modules/search/components/hooks/useObserveIntersection.js.map +1 -0
  50. package/build/cjs/react-utils/hooks/useRAF.d.ts +1 -0
  51. package/build/cjs/react-utils/hooks/useRAF.js +24 -0
  52. package/build/cjs/react-utils/hooks/useRAF.js.map +1 -0
  53. package/build/cjs/react-utils/useSticky.js +3 -12
  54. package/build/cjs/react-utils/useSticky.js.map +1 -1
  55. package/build/cjs/utils/dom.d.ts +3 -0
  56. package/build/cjs/utils/dom.js +32 -0
  57. package/build/cjs/utils/dom.js.map +1 -0
  58. package/build/cjs/version.js +1 -1
  59. package/build/cjs/version.js.map +1 -1
  60. package/build/esm/bundle/Editor.js +1 -0
  61. package/build/esm/bundle/Editor.js.map +1 -1
  62. package/build/esm/bundle/settings/index.css +6 -14
  63. package/build/esm/bundle/settings/index.js +6 -3
  64. package/build/esm/bundle/settings/index.js.map +1 -1
  65. package/build/esm/bundle/types.d.ts +2 -0
  66. package/build/esm/bundle/types.js.map +1 -1
  67. package/build/esm/core/types/serializer.d.ts +5 -0
  68. package/build/esm/core/types/serializer.js.map +1 -1
  69. package/build/esm/extensions/behavior/Search/SearchViewPlugin.js +25 -1
  70. package/build/esm/extensions/behavior/Search/SearchViewPlugin.js.map +1 -1
  71. package/build/esm/extensions/markdown/Breaks/index.d.ts +2 -0
  72. package/build/esm/extensions/markdown/Breaks/index.js +7 -5
  73. package/build/esm/extensions/markdown/Breaks/index.js.map +1 -1
  74. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/const.d.ts +3 -0
  75. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/const.js +4 -0
  76. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/const.js.map +1 -1
  77. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.d.ts +2 -6
  78. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js +1 -1
  79. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
  80. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/parser.js +28 -2
  81. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/parser.js.map +1 -1
  82. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/schema.d.ts +8 -2
  83. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/schema.js +3 -1
  84. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/schema.js.map +1 -1
  85. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/serializer.js +14 -2
  86. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/serializer.js.map +1 -1
  87. package/build/esm/extensions/yfm/Checkbox/index.css +5 -9
  88. package/build/esm/extensions/yfm/Checkbox/index.d.ts +8 -1
  89. package/build/esm/extensions/yfm/Checkbox/index.js +1 -1
  90. package/build/esm/extensions/yfm/Checkbox/index.js.map +1 -1
  91. package/build/esm/extensions/yfm/Checkbox/plugin.d.ts +5 -1
  92. package/build/esm/extensions/yfm/Checkbox/plugin.js +8 -3
  93. package/build/esm/extensions/yfm/Checkbox/plugin.js.map +1 -1
  94. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +5 -1
  95. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  96. package/build/esm/markup/codemirror/create.d.ts +3 -1
  97. package/build/esm/markup/codemirror/create.js +5 -2
  98. package/build/esm/markup/codemirror/create.js.map +1 -1
  99. package/build/esm/markup/codemirror/gravity.js +0 -1
  100. package/build/esm/markup/codemirror/gravity.js.map +1 -1
  101. package/build/esm/markup/codemirror/search-plugin/plugin.js +10 -0
  102. package/build/esm/markup/codemirror/search-plugin/plugin.js.map +1 -1
  103. package/build/esm/modules/search/components/SearchPopup.d.ts +2 -0
  104. package/build/esm/modules/search/components/SearchPopup.js +11 -2
  105. package/build/esm/modules/search/components/SearchPopup.js.map +1 -1
  106. package/build/esm/modules/search/components/hooks/useObserveIntersection.d.ts +10 -0
  107. package/build/esm/modules/search/components/hooks/useObserveIntersection.js +41 -0
  108. package/build/esm/modules/search/components/hooks/useObserveIntersection.js.map +1 -0
  109. package/build/esm/react-utils/hooks/useRAF.d.ts +1 -0
  110. package/build/esm/react-utils/hooks/useRAF.js +21 -0
  111. package/build/esm/react-utils/hooks/useRAF.js.map +1 -0
  112. package/build/esm/react-utils/useSticky.js +3 -12
  113. package/build/esm/react-utils/useSticky.js.map +1 -1
  114. package/build/esm/utils/dom.d.ts +3 -0
  115. package/build/esm/utils/dom.js +27 -0
  116. package/build/esm/utils/dom.js.map +1 -0
  117. package/build/esm/version.js +1 -1
  118. package/build/esm/version.js.map +1 -1
  119. package/build/styles.css +11 -23
  120. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Breaks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAC7C,OAAO,EAAC,KAAK,EAAC,mCAAgC;AAC9C,OAAO,EAAC,eAAe,EAAC,oCAAiC;AACzD,OAAO,EAAC,KAAK,EAAC,uDAA8C;AAE5D,OAAO,EAAC,WAAW,EAA2B,MAAM,EAAE,MAAM,EAAC,+BAAsB;AAEnF,OAAO,EAAC,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAC,+BAAsB;AAWzE,MAAM,CAAC,MAAM,MAAM,GAAiC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClE,IAAI,cAA+B,CAAC;IACpC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC;SAAM,CAAC;QACJ,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC;QAC/C,YAAY,CAAC,IAAI,CACb,8FAA8F,CACjG,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,GAAG,CACd,8FAA8F,CACjG,CAAC;IACN,CAAC;IAED,OAAO,CAAC,GAAG,CAAqB,WAAW,EAAE,EAAC,cAAc,EAAC,CAAC,CAAC;IAE/D,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,MAAM,IAAI,GAAW;YACjB,aAAa,EAAE,GAAG;SACrB,CAAC;QAEF,IAAI,KAAK,EAAE,EAAE,CAAC;YACV,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,EAAY,EAAE,EAAE,CAC3B,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;IACxC,MAAM,EAAC,SAAS,EAAE,GAAG,EAAE,MAAM,EAAC,GAAG,KAAK,CAAC;IACvC,IACI,CAAC,eAAe,CAAC,GAAG,CAAC;QACrB,CAAC,GAAG,CAAC,KAAK;QACV,sCAAsC;QACtC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC;QAE1C,OAAO,KAAK,CAAC;IAEjB,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,EACF,OAAO,EACP,OAAO,EAAE,EAAC,GAAG,EAAC,GACjB,GAAG,GAAG,CAAC;YACR,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAEjC,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC;YAElE,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;YAC7E,EAAE,GAAG,EAAE;iBACF,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;iBACxD,cAAc,EAAE;iBAChB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,6DAA6D;iBACjF,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,uDAAuD;YAClF,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC,CAAC;AAaP,SAAS,WAAW,CAAC,IAA8B;IAC/C,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import {chainCommands, exitCode} from 'prosemirror-commands';\nimport type {Node, NodeType} from 'prosemirror-model';\nimport {TextSelection} from 'prosemirror-state';\n\nimport type {ExtensionAuto, Keymap} from '../../../core';\nimport {globalLogger} from '../../../logger';\nimport {isMac} from '../../../utils/platform';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base/BaseSchema/BaseSchemaSpecs';\n\nimport {BreaksSpecs, type BreaksSpecsOptions, hbType, sbType} from './BreaksSpecs';\n\nexport {BreaksSpecs, BreakNodeName, hbType, sbType} from './BreaksSpecs';\n\nexport type BreaksOptions = {\n /**\n * This option is used if the 'breaks' parameter is not specified via the context\n * @default 'hard'\n */\n // TODO: [context] make this deprecated\n preferredBreak?: 'hard' | 'soft';\n};\n\nexport const Breaks: ExtensionAuto<BreaksOptions> = (builder, opts) => {\n let preferredBreak: 'hard' | 'soft';\n if (builder.context.has('breaks')) {\n preferredBreak = builder.context.get('breaks') ? 'soft' : 'hard';\n } else {\n preferredBreak = opts.preferredBreak ?? 'hard';\n globalLogger.info(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n builder.logger.log(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n }\n\n builder.use<BreaksSpecsOptions>(BreaksSpecs, {preferredBreak});\n\n builder.addKeymap(({schema}) => {\n const cmd = addBr((preferredBreak === 'soft' ? sbType : hbType)(schema));\n const keys: Keymap = {\n 'Shift-Enter': cmd,\n };\n\n if (isMac()) {\n keys['Ctrl-Enter'] = cmd;\n }\n\n return keys;\n });\n};\n\nconst addBr = (br: NodeType) =>\n chainCommands(exitCode, (state, dispatch) => {\n const {selection: sel, schema} = state;\n if (\n !isTextSelection(sel) ||\n !sel.empty ||\n // breaks can only be in the paragraph\n sel.$cursor?.parent.type !== pType(schema)\n )\n return false;\n\n if (isBreakNode(sel.$cursor.nodeBefore)) {\n if (dispatch) {\n const {\n $cursor,\n $cursor: {pos},\n } = sel;\n const from = isBreakNode($cursor.nodeAfter) ? pos + 1 : pos;\n const posEnd = $cursor.end();\n const posAfter = $cursor.after();\n\n const contentAfter = state.doc.slice(from, posEnd, false).content;\n\n let tr = state.tr.insert(posAfter, pType(schema).create(null, contentAfter));\n tr = tr\n .setSelection(TextSelection.create(tr.doc, posAfter + 1))\n .scrollIntoView()\n .delete(pos, posEnd) // remove content after current pos (it's moved to next para)\n .delete(pos - 1, pos); // remove break before current pos ($cursor.nodeBefore)\n dispatch(tr);\n }\n return true;\n }\n\n dispatch?.(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n return true;\n });\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n /**\n * Same as @type {MarkdownIt.Options.breaks}\n */\n breaks: boolean;\n }\n }\n}\n\nfunction isBreakNode(node?: Node | null | undefined): boolean {\n return Boolean(node?.type.spec.isBreak);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Breaks/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands, exitCode} from 'prosemirror-commands';\nimport type {Node, NodeType} from 'prosemirror-model';\nimport {TextSelection} from 'prosemirror-state';\n\nimport type {ExtensionAuto, Keymap} from '../../../core';\nimport {globalLogger} from '../../../logger';\nimport {isMac} from '../../../utils/platform';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base/BaseSchema/BaseSchemaSpecs';\n\nimport {BreaksSpecs, type BreaksSpecsOptions, hbType, sbType} from './BreaksSpecs';\n\nexport {BreaksSpecs, BreakNodeName, hbType, sbType} from './BreaksSpecs';\n\nexport type BreaksOptions = {\n /**\n * This option is used if the 'breaks' parameter is not specified via the context\n * @default 'hard'\n */\n // TODO: [context] make this deprecated\n preferredBreak?: 'hard' | 'soft';\n};\n\nexport const Breaks: ExtensionAuto<BreaksOptions> = (builder, opts) => {\n let preferredBreak: 'hard' | 'soft';\n if (builder.context.has('breaks')) {\n preferredBreak = builder.context.get('breaks') ? 'soft' : 'hard';\n } else {\n preferredBreak = opts.preferredBreak ?? 'hard';\n globalLogger.info(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n builder.logger.log(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n }\n\n builder.use<BreaksSpecsOptions>(BreaksSpecs, {preferredBreak});\n\n builder.addKeymap(({schema}) => {\n const cmd = addBr((preferredBreak === 'soft' ? sbType : hbType)(schema));\n const keys: Keymap = {\n 'Shift-Enter': cmd,\n };\n\n if (isMac()) {\n keys['Ctrl-Enter'] = cmd;\n }\n\n return keys;\n });\n};\n\nconst addBr = (br: NodeType) =>\n chainCommands(exitCode, (state, dispatch) => {\n const {selection: sel, schema} = state;\n if (!isTextSelection(sel) || !sel.$cursor || !canContainBreaks(sel.$cursor.parent))\n return false;\n\n if (isBreakNode(sel.$cursor.nodeBefore)) {\n if (dispatch) {\n const {\n $cursor,\n $cursor: {pos},\n } = sel;\n const from = isBreakNode($cursor.nodeAfter) ? pos + 1 : pos;\n const posEnd = $cursor.end();\n const posAfter = $cursor.after();\n\n const contentAfter = state.doc.slice(from, posEnd, false).content;\n\n let tr = state.tr.insert(posAfter, pType(schema).create(null, contentAfter));\n tr = tr\n .setSelection(TextSelection.create(tr.doc, posAfter + 1))\n .scrollIntoView()\n .delete(pos, posEnd) // remove content after current pos (it's moved to next para)\n .delete(pos - 1, pos); // remove break before current pos ($cursor.nodeBefore)\n dispatch(tr);\n }\n return true;\n }\n\n dispatch?.(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n return true;\n });\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n /**\n * Same as @type {MarkdownIt.Options.breaks}\n */\n breaks: boolean;\n }\n }\n}\n\nfunction canContainBreaks(node: Node): boolean {\n return (\n Boolean(node.type.spec.canContainBreaks) ||\n // always allow breaks in paragraph\n node.type === pType(node.type.schema)\n );\n}\n\nexport function isBreakNode(node: Node | null | undefined): boolean {\n return Boolean(node?.type.spec.isBreak);\n}\n"]}
@@ -10,9 +10,12 @@ export declare const CheckboxAttr: {
10
10
  readonly Checked: "checked";
11
11
  readonly For: "for";
12
12
  readonly Line: "data-line";
13
+ readonly Tight: "data-tight";
13
14
  };
14
15
  export declare const idPrefix = "yfm-editor-checkbox";
15
16
  export declare const b: import("@bem-react/classname").ClassNameFormatter;
16
17
  export declare const checkboxType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
17
18
  export declare const checkboxLabelType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
18
19
  export declare const checkboxInputType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
20
+ export declare const CHECKBOX_OPEN_TOKEN = "checkbox_open";
21
+ export declare const CHECKBOX_CLOSE_TOKEN = "checkbox_close";
@@ -13,10 +13,14 @@ export const CheckboxAttr = {
13
13
  Checked: 'checked',
14
14
  For: 'for',
15
15
  Line: 'data-line',
16
+ Tight: 'data-tight',
16
17
  };
17
18
  export const idPrefix = 'yfm-editor-checkbox';
19
+ // TODO [MAJOR]: remove custom classname
18
20
  export const b = cn('checkbox');
19
21
  export const checkboxType = nodeTypeFactory(CheckboxNode.Checkbox);
20
22
  export const checkboxLabelType = nodeTypeFactory(CheckboxNode.Label);
21
23
  export const checkboxInputType = nodeTypeFactory(CheckboxNode.Input);
24
+ export const CHECKBOX_OPEN_TOKEN = 'checkbox_open';
25
+ export const CHECKBOX_CLOSE_TOKEN = 'checkbox_close';
22
26
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACpB,qCAAqB,CAAA;IACrB,wCAAwB,CAAA;IACxB,wCAAwB,CAAA;AAC5B,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,WAAW;CACX,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAE9C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC","sourcesContent":["import {cn} from '../../../../classname';\nimport {nodeTypeFactory} from '../../../../utils/schema';\n\nexport enum CheckboxNode {\n Checkbox = 'checkbox',\n Input = 'checkbox_input',\n Label = 'checkbox_label',\n}\n\nexport const CheckboxAttr = {\n Class: 'class',\n Type: 'type',\n Id: 'id',\n Checked: 'checked',\n For: 'for',\n Line: 'data-line',\n} as const;\n\nexport const idPrefix = 'yfm-editor-checkbox';\n\nexport const b = cn('checkbox');\n\nexport const checkboxType = nodeTypeFactory(CheckboxNode.Checkbox);\nexport const checkboxLabelType = nodeTypeFactory(CheckboxNode.Label);\nexport const checkboxInputType = nodeTypeFactory(CheckboxNode.Input);\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACpB,qCAAqB,CAAA;IACrB,wCAAwB,CAAA;IACxB,wCAAwB,CAAA;AAC5B,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,YAAY;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAE9C,wCAAwC;AACxC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC","sourcesContent":["import {cn} from '../../../../classname';\nimport {nodeTypeFactory} from '../../../../utils/schema';\n\nexport enum CheckboxNode {\n Checkbox = 'checkbox',\n Input = 'checkbox_input',\n Label = 'checkbox_label',\n}\n\nexport const CheckboxAttr = {\n Class: 'class',\n Type: 'type',\n Id: 'id',\n Checked: 'checked',\n For: 'for',\n Line: 'data-line',\n Tight: 'data-tight',\n} as const;\n\nexport const idPrefix = 'yfm-editor-checkbox';\n\n// TODO [MAJOR]: remove custom classname\nexport const b = cn('checkbox');\n\nexport const checkboxType = nodeTypeFactory(CheckboxNode.Checkbox);\nexport const checkboxLabelType = nodeTypeFactory(CheckboxNode.Label);\nexport const checkboxInputType = nodeTypeFactory(CheckboxNode.Input);\n\nexport const CHECKBOX_OPEN_TOKEN = 'checkbox_open';\nexport const CHECKBOX_CLOSE_TOKEN = 'checkbox_close';\n"]}
@@ -1,11 +1,7 @@
1
- import type { NodeSpec } from 'prosemirror-model';
2
1
  import type { ExtensionAuto, ExtensionNodeSpec } from "../../../../core/index.js";
2
+ import { type GetSchemaSpecsOptions } from "./schema.js";
3
3
  export { CheckboxAttr, CheckboxNode, checkboxType, checkboxLabelType, checkboxInputType, } from "./const.js";
4
- export type CheckboxSpecsOptions = {
5
- /**
6
- * @deprecated use placeholder option in BehaviorPreset instead.
7
- */
8
- checkboxLabelPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];
4
+ export type CheckboxSpecsOptions = GetSchemaSpecsOptions & {
9
5
  inputView?: ExtensionNodeSpec['view'];
10
6
  labelView?: ExtensionNodeSpec['view'];
11
7
  checkboxView?: ExtensionNodeSpec['view'];
@@ -7,7 +7,7 @@ export { CheckboxAttr, CheckboxNode, checkboxType, checkboxLabelType, checkboxIn
7
7
  export const CheckboxSpecs = (builder, opts) => {
8
8
  const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));
9
9
  builder
10
- .configureMd((md) => md.use(checkboxPlugin, { idPrefix, divClass: b() }))
10
+ .configureMd((md) => md.use(checkboxPlugin, { idPrefix, divClass: b(null, 'checkbox') }))
11
11
  .addNode(CheckboxNode.Checkbox, () => ({
12
12
  spec: schemaSpecs[CheckboxNode.Checkbox],
13
13
  toMd: serializerTokens[CheckboxNode.Checkbox],
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mDAAmD,CAAC;AAK/E,OAAO,EAAC,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAC,mBAAgB;AAClD,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAAC,cAAc,EAAC,oBAAiB;AACxC,OAAO,EAAC,gBAAgB,EAAC,wBAAqB;AAE9C,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GACpB,mBAAgB;AAYjB,MAAM,CAAC,MAAM,aAAa,GAAwC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChF,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAE7E,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,EAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAC,CAAC,CAAC;SACtE,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC;QACxC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC7C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC;SACjD;QACD,IAAI,EAAE,IAAI,CAAC,YAAY;KAC1B,CAAC,CAAC;SACF,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC;SAC9C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS;KACvB,CAAC,CAAC;SACF,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC;YAC3C,SAAS,EAAE,gBAAgB;SAC9B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS;KACvB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import checkboxPlugin from '@diplodoc/transform/lib/plugins/checkbox/index.js';\nimport type {NodeSpec} from 'prosemirror-model';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '../../../../core';\n\nimport {CheckboxNode, b, idPrefix} from './const';\nimport {parserTokens} from './parser';\nimport {getSchemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {\n CheckboxAttr,\n CheckboxNode,\n checkboxType,\n checkboxLabelType,\n checkboxInputType,\n} from './const';\n\nexport type CheckboxSpecsOptions = {\n /**\n * @deprecated use placeholder option in BehaviorPreset instead.\n */\n checkboxLabelPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n inputView?: ExtensionNodeSpec['view'];\n labelView?: ExtensionNodeSpec['view'];\n checkboxView?: ExtensionNodeSpec['view'];\n};\n\nexport const CheckboxSpecs: ExtensionAuto<CheckboxSpecsOptions> = (builder, opts) => {\n const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));\n\n builder\n .configureMd((md) => md.use(checkboxPlugin, {idPrefix, divClass: b()}))\n .addNode(CheckboxNode.Checkbox, () => ({\n spec: schemaSpecs[CheckboxNode.Checkbox],\n toMd: serializerTokens[CheckboxNode.Checkbox],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Checkbox],\n },\n view: opts.checkboxView,\n }))\n .addNode(CheckboxNode.Input, () => ({\n spec: schemaSpecs[CheckboxNode.Input],\n toMd: serializerTokens[CheckboxNode.Input],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Input],\n },\n view: opts.inputView,\n }))\n .addNode(CheckboxNode.Label, () => ({\n spec: schemaSpecs[CheckboxNode.Label],\n toMd: serializerTokens[CheckboxNode.Label],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Label],\n tokenName: 'checkbox_label',\n },\n view: opts.labelView,\n }));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mDAAmD,CAAC;AAI/E,OAAO,EAAC,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAC,mBAAgB;AAClD,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAA6B,cAAc,EAAC,oBAAiB;AACpE,OAAO,EAAC,gBAAgB,EAAC,wBAAqB;AAE9C,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GACpB,mBAAgB;AAQjB,MAAM,CAAC,MAAM,aAAa,GAAwC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChF,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAE7E,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,EAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAC,CAAC,CAAC;SACtF,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC;QACxC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC7C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC;SACjD;QACD,IAAI,EAAE,IAAI,CAAC,YAAY;KAC1B,CAAC,CAAC;SACF,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC;SAC9C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS;KACvB,CAAC,CAAC;SACF,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC;YAC3C,SAAS,EAAE,gBAAgB;SAC9B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS;KACvB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import checkboxPlugin from '@diplodoc/transform/lib/plugins/checkbox/index.js';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\n\nimport {CheckboxNode, b, idPrefix} from './const';\nimport {parserTokens} from './parser';\nimport {type GetSchemaSpecsOptions, getSchemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {\n CheckboxAttr,\n CheckboxNode,\n checkboxType,\n checkboxLabelType,\n checkboxInputType,\n} from './const';\n\nexport type CheckboxSpecsOptions = GetSchemaSpecsOptions & {\n inputView?: ExtensionNodeSpec['view'];\n labelView?: ExtensionNodeSpec['view'];\n checkboxView?: ExtensionNodeSpec['view'];\n};\n\nexport const CheckboxSpecs: ExtensionAuto<CheckboxSpecsOptions> = (builder, opts) => {\n const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));\n\n builder\n .configureMd((md) => md.use(checkboxPlugin, {idPrefix, divClass: b(null, 'checkbox')}))\n .addNode(CheckboxNode.Checkbox, () => ({\n spec: schemaSpecs[CheckboxNode.Checkbox],\n toMd: serializerTokens[CheckboxNode.Checkbox],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Checkbox],\n },\n view: opts.checkboxView,\n }))\n .addNode(CheckboxNode.Input, () => ({\n spec: schemaSpecs[CheckboxNode.Input],\n toMd: serializerTokens[CheckboxNode.Input],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Input],\n },\n view: opts.inputView,\n }))\n .addNode(CheckboxNode.Label, () => ({\n spec: schemaSpecs[CheckboxNode.Label],\n toMd: serializerTokens[CheckboxNode.Label],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Label],\n tokenName: 'checkbox_label',\n },\n view: opts.labelView,\n }));\n};\n"]}
@@ -1,8 +1,34 @@
1
- import { CheckboxNode } from "../const.js";
1
+ import { CheckboxAttr, CheckboxNode } from "../const.js";
2
+ import { CHECKBOX_CLOSE_TOKEN, CHECKBOX_OPEN_TOKEN } from "./const.js";
3
+ const getCheckboxAttrs = (token, tokens, index) => {
4
+ const tight = checkboxIsTight(tokens, index);
5
+ const attrs = token.attrs ? Object.fromEntries(token.attrs) : {};
6
+ return { ...attrs, [CheckboxAttr.Tight]: tight };
7
+ };
2
8
  const getAttrs = (tok) => (tok.attrs ? Object.fromEntries(tok.attrs) : {});
3
9
  export const parserTokens = {
4
- [CheckboxNode.Checkbox]: { name: CheckboxNode.Checkbox, type: 'block', getAttrs },
10
+ [CheckboxNode.Checkbox]: {
11
+ name: CheckboxNode.Checkbox,
12
+ type: 'block',
13
+ getAttrs: getCheckboxAttrs,
14
+ },
5
15
  [CheckboxNode.Input]: { name: CheckboxNode.Input, type: 'node', getAttrs },
6
16
  [CheckboxNode.Label]: { name: CheckboxNode.Label, type: 'block', getAttrs },
7
17
  };
18
+ function checkboxIsTight(tokens, index) {
19
+ let closeTokenEndLine;
20
+ let nextOpenTokenStartLine;
21
+ for (let i = index + 1; i < tokens.length; i++) {
22
+ if (tokens[i].type === CHECKBOX_CLOSE_TOKEN) {
23
+ closeTokenEndLine = tokens[i].map?.[1];
24
+ if (tokens[i + 1]?.type === CHECKBOX_OPEN_TOKEN) {
25
+ nextOpenTokenStartLine = tokens[i + 1].map?.[0];
26
+ }
27
+ break;
28
+ }
29
+ }
30
+ if (!Number.isFinite(closeTokenEndLine) || !Number.isFinite(nextOpenTokenStartLine))
31
+ return null;
32
+ return closeTokenEndLine === nextOpenTokenStartLine;
33
+ }
8
34
  //# sourceMappingURL=parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,oBAAiB;AAEtC,MAAM,QAAQ,GAA4B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEpG,MAAM,CAAC,MAAM,YAAY,GAAsC;IAC3D,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAC;IAE/E,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAC;IAExE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAC;CAC5E,CAAC","sourcesContent":["import type {ParserToken} from '../../../../core';\nimport {CheckboxNode} from '../const';\n\nconst getAttrs: ParserToken['getAttrs'] = (tok) => (tok.attrs ? Object.fromEntries(tok.attrs) : {});\n\nexport const parserTokens: Record<CheckboxNode, ParserToken> = {\n [CheckboxNode.Checkbox]: {name: CheckboxNode.Checkbox, type: 'block', getAttrs},\n\n [CheckboxNode.Input]: {name: CheckboxNode.Input, type: 'node', getAttrs},\n\n [CheckboxNode.Label]: {name: CheckboxNode.Label, type: 'block', getAttrs},\n};\n"]}
1
+ {"version":3,"file":"parser.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,oBAAiB;AAEpD,OAAO,EAAC,oBAAoB,EAAE,mBAAmB,EAAC,mBAAgB;AAElE,MAAM,gBAAgB,GAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IACvE,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjE,OAAO,EAAC,GAAG,KAAK,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,EAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAA4B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEpG,MAAM,CAAC,MAAM,YAAY,GAAsC;IAC3D,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,YAAY,CAAC,QAAQ;QAC3B,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,gBAAgB;KAC7B;IAED,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAC;IAExE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAC;CAC5E,CAAC;AAEF,SAAS,eAAe,CAAC,MAAe,EAAE,KAAa;IACnD,IAAI,iBAAqC,CAAC;IAC1C,IAAI,sBAA0C,CAAC;IAE/C,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAC1C,iBAAiB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAEvC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBAC9C,sBAAsB,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC;YAED,MAAM;QACV,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC/E,OAAO,IAAI,CAAC;IAEhB,OAAO,iBAAiB,KAAK,sBAAsB,CAAC;AACxD,CAAC","sourcesContent":["import type Token from 'markdown-it/lib/token';\n\nimport type {ParserToken} from '#core';\n\nimport {CheckboxAttr, CheckboxNode} from '../const';\n\nimport {CHECKBOX_CLOSE_TOKEN, CHECKBOX_OPEN_TOKEN} from './const';\n\nconst getCheckboxAttrs: ParserToken['getAttrs'] = (token, tokens, index) => {\n const tight = checkboxIsTight(tokens, index);\n const attrs = token.attrs ? Object.fromEntries(token.attrs) : {};\n\n return {...attrs, [CheckboxAttr.Tight]: tight};\n};\n\nconst getAttrs: ParserToken['getAttrs'] = (tok) => (tok.attrs ? Object.fromEntries(tok.attrs) : {});\n\nexport const parserTokens: Record<CheckboxNode, ParserToken> = {\n [CheckboxNode.Checkbox]: {\n name: CheckboxNode.Checkbox,\n type: 'block',\n getAttrs: getCheckboxAttrs,\n },\n\n [CheckboxNode.Input]: {name: CheckboxNode.Input, type: 'node', getAttrs},\n\n [CheckboxNode.Label]: {name: CheckboxNode.Label, type: 'block', getAttrs},\n};\n\nfunction checkboxIsTight(tokens: Token[], index: number): boolean | null {\n let closeTokenEndLine: number | undefined;\n let nextOpenTokenStartLine: number | undefined;\n\n for (let i = index + 1; i < tokens.length; i++) {\n if (tokens[i].type === CHECKBOX_CLOSE_TOKEN) {\n closeTokenEndLine = tokens[i].map?.[1];\n\n if (tokens[i + 1]?.type === CHECKBOX_OPEN_TOKEN) {\n nextOpenTokenStartLine = tokens[i + 1].map?.[0];\n }\n\n break;\n }\n }\n\n if (!Number.isFinite(closeTokenEndLine) || !Number.isFinite(nextOpenTokenStartLine))\n return null;\n\n return closeTokenEndLine === nextOpenTokenStartLine;\n}\n"]}
@@ -1,5 +1,11 @@
1
1
  import { type NodeSpec } from 'prosemirror-model';
2
2
  import type { PlaceholderOptions } from "../../../../utils/placeholder.js";
3
3
  import { CheckboxNode } from "./const.js";
4
- import type { CheckboxSpecsOptions } from "./index.js";
5
- export declare const getSchemaSpecs: (opts?: Pick<CheckboxSpecsOptions, "checkboxLabelPlaceholder">, placeholder?: PlaceholderOptions) => Record<CheckboxNode, NodeSpec>;
4
+ export type GetSchemaSpecsOptions = {
5
+ multiline?: boolean;
6
+ /**
7
+ * @deprecated use placeholder option in BehaviorPreset instead.
8
+ */
9
+ checkboxLabelPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];
10
+ };
11
+ export declare const getSchemaSpecs: (opts?: GetSchemaSpecsOptions, placeholder?: PlaceholderOptions) => Record<CheckboxNode, NodeSpec>;
@@ -8,8 +8,9 @@ export const getSchemaSpecs = (opts, placeholder) => ({
8
8
  selectable: true,
9
9
  allowSelection: false,
10
10
  attrs: {
11
- [CheckboxAttr.Class]: { default: b() },
11
+ [CheckboxAttr.Class]: { default: b(null, 'checkbox') },
12
12
  [CheckboxAttr.Line]: { default: null },
13
+ ...(opts?.multiline ? { [CheckboxAttr.Tight]: { default: null } } : undefined),
13
14
  },
14
15
  parseDOM: [
15
16
  {
@@ -92,6 +93,7 @@ export const getSchemaSpecs = (opts, placeholder) => ({
92
93
  selectable: false,
93
94
  allowSelection: false,
94
95
  disableGapCursor: true,
96
+ canContainBreaks: Boolean(opts?.multiline),
95
97
  complex: 'leaf',
96
98
  },
97
99
  });
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type NodeSpec, type Schema} from 'prosemirror-model';\n\nimport type {PlaceholderOptions} from '../../../../utils/placeholder';\n\nimport {CheckboxAttr, CheckboxNode, b, checkboxInputType, checkboxLabelType} from './const';\n\nimport type {CheckboxSpecsOptions} from './index';\n\nconst DEFAULT_LABEL_PLACEHOLDER = 'Checkbox';\n\nexport const getSchemaSpecs = (\n opts?: Pick<CheckboxSpecsOptions, 'checkboxLabelPlaceholder'>,\n placeholder?: PlaceholderOptions,\n): Record<CheckboxNode, NodeSpec> => ({\n [CheckboxNode.Checkbox]: {\n group: 'block checkbox',\n content: `${CheckboxNode.Input} ${CheckboxNode.Label}`,\n selectable: true,\n allowSelection: false,\n attrs: {\n [CheckboxAttr.Class]: {default: b()},\n [CheckboxAttr.Line]: {default: null},\n },\n parseDOM: [\n {\n tag: 'div.checkbox',\n priority: 100,\n getContent(node, schema) {\n if (node instanceof HTMLElement) {\n const input = node.querySelector<HTMLInputElement>('input[type=checkbox]');\n\n if (input && input instanceof HTMLInputElement) {\n const label = findLabelForInput(input);\n return createCheckboxFragment(\n schema,\n input.checked,\n label?.textContent,\n );\n }\n }\n return Fragment.empty;\n },\n },\n {\n tag: 'input[type=checkbox]',\n priority: 50,\n getContent(input, schema) {\n if (input instanceof HTMLInputElement) {\n const label = findLabelForInput(input);\n return createCheckboxFragment(schema, input.checked, label?.textContent);\n }\n return Fragment.empty;\n },\n },\n ],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n complex: 'root',\n },\n\n [CheckboxNode.Input]: {\n group: 'block checkbox',\n parseDOM: [],\n attrs: {\n [CheckboxAttr.Type]: {default: 'checkbox'},\n [CheckboxAttr.Id]: {default: null},\n [CheckboxAttr.Checked]: {default: null},\n },\n toDOM(node) {\n return ['div', node.attrs];\n },\n selectable: false,\n allowSelection: false,\n complex: 'leaf',\n },\n\n [CheckboxNode.Label]: {\n content: 'inline*',\n group: 'block checkbox',\n parseDOM: [\n {\n tag: `span[class=\"${b('label')}\"]`,\n getAttrs: (node) => ({\n [CheckboxAttr.For]: (node as Element).getAttribute(CheckboxAttr.For) || '',\n }),\n },\n {\n // input handled by checkbox node parse rule\n // ignore label\n tag: 'input[type=checkbox] ~ label',\n ignore: true,\n consuming: true,\n },\n ],\n attrs: {\n [CheckboxAttr.For]: {default: null},\n },\n escapeText: false,\n placeholder: {\n content:\n placeholder?.[CheckboxNode.Label] ??\n opts?.checkboxLabelPlaceholder ??\n DEFAULT_LABEL_PLACEHOLDER,\n alwaysVisible: true,\n },\n toDOM(node) {\n return ['span', {...node.attrs, class: b('label')}, 0];\n },\n selectable: false,\n allowSelection: false,\n disableGapCursor: true,\n complex: 'leaf',\n },\n});\n\n// fallback for invalid HTML (input without id + label without for)\nfunction findNextSiblingLabel(element: HTMLInputElement): HTMLLabelElement | null {\n const nextSibling = element.nextElementSibling;\n return nextSibling instanceof HTMLLabelElement ? nextSibling : null;\n}\n\nfunction findLabelForInput(element: HTMLInputElement): HTMLLabelElement | null {\n return element.labels?.[0] || findNextSiblingLabel(element);\n}\n\nfunction createCheckboxFragment(\n schema: Schema<any, any>,\n checked: boolean | null,\n labelText: string | null | undefined,\n): Fragment {\n return Fragment.from([\n checkboxInputType(schema).create({[CheckboxAttr.Checked]: checked ? 'true' : null}),\n checkboxLabelType(schema).create(null, labelText ? schema.text(labelText) : null),\n ]);\n}\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type NodeSpec, type Schema} from 'prosemirror-model';\n\nimport type {PlaceholderOptions} from 'src/utils/placeholder';\n\nimport {CheckboxAttr, CheckboxNode, b, checkboxInputType, checkboxLabelType} from './const';\n\nconst DEFAULT_LABEL_PLACEHOLDER = 'Checkbox';\n\nexport type GetSchemaSpecsOptions = {\n multiline?: boolean;\n /**\n * @deprecated use placeholder option in BehaviorPreset instead.\n */\n checkboxLabelPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n};\n\nexport const getSchemaSpecs = (\n opts?: GetSchemaSpecsOptions,\n placeholder?: PlaceholderOptions,\n): Record<CheckboxNode, NodeSpec> => ({\n [CheckboxNode.Checkbox]: {\n group: 'block checkbox',\n content: `${CheckboxNode.Input} ${CheckboxNode.Label}`,\n selectable: true,\n allowSelection: false,\n attrs: {\n [CheckboxAttr.Class]: {default: b(null, 'checkbox')},\n [CheckboxAttr.Line]: {default: null},\n ...(opts?.multiline ? {[CheckboxAttr.Tight]: {default: null}} : undefined),\n },\n parseDOM: [\n {\n tag: 'div.checkbox',\n priority: 100,\n getContent(node, schema) {\n if (node instanceof HTMLElement) {\n const input = node.querySelector<HTMLInputElement>('input[type=checkbox]');\n\n if (input && input instanceof HTMLInputElement) {\n const label = findLabelForInput(input);\n return createCheckboxFragment(\n schema,\n input.checked,\n label?.textContent,\n );\n }\n }\n return Fragment.empty;\n },\n },\n {\n tag: 'input[type=checkbox]',\n priority: 50,\n getContent(input, schema) {\n if (input instanceof HTMLInputElement) {\n const label = findLabelForInput(input);\n return createCheckboxFragment(schema, input.checked, label?.textContent);\n }\n return Fragment.empty;\n },\n },\n ],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n complex: 'root',\n },\n\n [CheckboxNode.Input]: {\n group: 'block checkbox',\n parseDOM: [],\n attrs: {\n [CheckboxAttr.Type]: {default: 'checkbox'},\n [CheckboxAttr.Id]: {default: null},\n [CheckboxAttr.Checked]: {default: null},\n },\n toDOM(node) {\n return ['div', node.attrs];\n },\n selectable: false,\n allowSelection: false,\n complex: 'leaf',\n },\n\n [CheckboxNode.Label]: {\n content: 'inline*',\n group: 'block checkbox',\n parseDOM: [\n {\n tag: `span[class=\"${b('label')}\"]`,\n getAttrs: (node) => ({\n [CheckboxAttr.For]: (node as Element).getAttribute(CheckboxAttr.For) || '',\n }),\n },\n {\n // input handled by checkbox node parse rule\n // ignore label\n tag: 'input[type=checkbox] ~ label',\n ignore: true,\n consuming: true,\n },\n ],\n attrs: {\n [CheckboxAttr.For]: {default: null},\n },\n escapeText: false,\n placeholder: {\n content:\n placeholder?.[CheckboxNode.Label] ??\n opts?.checkboxLabelPlaceholder ??\n DEFAULT_LABEL_PLACEHOLDER,\n alwaysVisible: true,\n },\n toDOM(node) {\n return ['span', {...node.attrs, class: b('label')}, 0];\n },\n selectable: false,\n allowSelection: false,\n disableGapCursor: true,\n canContainBreaks: Boolean(opts?.multiline),\n complex: 'leaf',\n },\n});\n\n// fallback for invalid HTML (input without id + label without for)\nfunction findNextSiblingLabel(element: HTMLInputElement): HTMLLabelElement | null {\n const nextSibling = element.nextElementSibling;\n return nextSibling instanceof HTMLLabelElement ? nextSibling : null;\n}\n\nfunction findLabelForInput(element: HTMLInputElement): HTMLLabelElement | null {\n return element.labels?.[0] || findNextSiblingLabel(element);\n}\n\nfunction createCheckboxFragment(\n schema: Schema<any, any>,\n checked: boolean | null,\n labelText: string | null | undefined,\n): Fragment {\n return Fragment.from([\n checkboxInputType(schema).create({[CheckboxAttr.Checked]: checked ? 'true' : null}),\n checkboxLabelType(schema).create(null, labelText ? schema.text(labelText) : null),\n ]);\n}\n"]}
@@ -1,9 +1,21 @@
1
1
  import { getPlaceholderContent } from "../../../../utils/placeholder.js";
2
2
  import { CheckboxAttr, CheckboxNode } from "./const.js";
3
3
  export const serializerTokens = {
4
- [CheckboxNode.Checkbox]: (state, node) => {
4
+ [CheckboxNode.Checkbox]: (state, node, parent, index) => {
5
5
  state.renderInline(node);
6
- state.closeBlock(node);
6
+ // TODO [MAJOR]: remove this check after removing `multiline` option
7
+ if (!node.type.spec.attrs?.[CheckboxAttr.Tight]) {
8
+ state.closeBlock(node);
9
+ return;
10
+ }
11
+ const tight = node.attrs[CheckboxAttr.Tight];
12
+ const nextIsCheckbox = parent.maybeChild(index + 1)?.type.name === CheckboxNode.Checkbox;
13
+ if (tight === false || !nextIsCheckbox) {
14
+ state.closeBlock(node);
15
+ }
16
+ else {
17
+ state.ensureNewLine();
18
+ }
7
19
  },
8
20
  [CheckboxNode.Input]: (state, node) => {
9
21
  const checked = node.attrs[CheckboxAttr.Checked] === 'true';
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/serializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,qBAAqB,EAAC,yCAAsC;AAEpE,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,mBAAgB;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAA8C;IACvE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;QAC5D,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YAC5E,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;YACzC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACJ,CAAC","sourcesContent":["import type {SerializerNodeToken} from '../../../../core';\nimport {getPlaceholderContent} from '../../../../utils/placeholder';\n\nimport {CheckboxAttr, CheckboxNode} from './const';\n\nexport const serializerTokens: Record<CheckboxNode, SerializerNodeToken> = {\n [CheckboxNode.Checkbox]: (state, node) => {\n state.renderInline(node);\n state.closeBlock(node);\n },\n\n [CheckboxNode.Input]: (state, node) => {\n const checked = node.attrs[CheckboxAttr.Checked] === 'true';\n state.write(`[${checked ? 'X' : ' '}] `);\n },\n\n [CheckboxNode.Label]: (state, node, _, idx) => {\n if ((!node.content.size || node.textContent.trim().length === 0) && idx !== 0) {\n state.write(getPlaceholderContent(node));\n return;\n }\n\n if (!idx) {\n state.write('[ ] ');\n }\n\n state.renderInline(node);\n },\n};\n"]}
1
+ {"version":3,"file":"serializer.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/serializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,qBAAqB,EAAC,yCAAsC;AAEpE,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,mBAAgB;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAA8C;IACvE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QACpD,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEzB,oEAAoE;QACpE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,QAAQ,CAAC;QAEzF,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,aAAa,EAAE,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;QAC5D,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YAC5E,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;YACzC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACJ,CAAC","sourcesContent":["import type {SerializerNodeToken} from '../../../../core';\nimport {getPlaceholderContent} from '../../../../utils/placeholder';\n\nimport {CheckboxAttr, CheckboxNode} from './const';\n\nexport const serializerTokens: Record<CheckboxNode, SerializerNodeToken> = {\n [CheckboxNode.Checkbox]: (state, node, parent, index) => {\n state.renderInline(node);\n\n // TODO [MAJOR]: remove this check after removing `multiline` option\n if (!node.type.spec.attrs?.[CheckboxAttr.Tight]) {\n state.closeBlock(node);\n return;\n }\n\n const tight = node.attrs[CheckboxAttr.Tight];\n const nextIsCheckbox = parent.maybeChild(index + 1)?.type.name === CheckboxNode.Checkbox;\n\n if (tight === false || !nextIsCheckbox) {\n state.closeBlock(node);\n } else {\n state.ensureNewLine();\n }\n },\n\n [CheckboxNode.Input]: (state, node) => {\n const checked = node.attrs[CheckboxAttr.Checked] === 'true';\n state.write(`[${checked ? 'X' : ' '}] `);\n },\n\n [CheckboxNode.Label]: (state, node, _, idx) => {\n if ((!node.content.size || node.textContent.trim().length === 0) && idx !== 0) {\n state.write(getPlaceholderContent(node));\n return;\n }\n\n if (!idx) {\n state.write('[ ] ');\n }\n\n state.renderInline(node);\n },\n};\n"]}
@@ -1,12 +1,8 @@
1
- .g-md-checkbox {
1
+ .yfm-editor .g-md-checkbox {
2
2
  display: flex;
3
- align-items: center;
4
- /* Increasing selector specificity to override yfm styles with zero padding */
5
3
  }
6
- .g-md-checkbox__label {
7
- display: inline-block;
8
- }
9
- .g-md-checkbox__input {
10
- /* stylelint-disable declaration-no-important */
11
- margin-right: 5px !important;
4
+ .yfm-editor .g-md-checkbox__input[type=checkbox] {
5
+ top: 3px;
6
+ align-self: flex-start;
7
+ margin-right: 5px;
12
8
  }
@@ -3,7 +3,14 @@ import { type CheckboxSpecsOptions } from "./CheckboxSpecs/index.js";
3
3
  import "./index.css";
4
4
  declare const checkboxAction = "addCheckbox";
5
5
  export { CheckboxAttr, CheckboxNode, checkboxType, checkboxLabelType, checkboxInputType, } from "./CheckboxSpecs/index.js";
6
- export type CheckboxOptions = Pick<CheckboxSpecsOptions, 'checkboxLabelPlaceholder'> & {};
6
+ export type CheckboxOptions = Pick<CheckboxSpecsOptions, 'checkboxLabelPlaceholder'> & {
7
+ /**
8
+ * Allow multiline label in checkboxes.
9
+ * Available with @diplodoc/transform v4.68.0 or higher.
10
+ * @default false
11
+ */
12
+ multiline?: boolean;
13
+ };
7
14
  export declare const Checkbox: ExtensionAuto<CheckboxOptions>;
8
15
  declare global {
9
16
  namespace WysiwygEditor {
@@ -14,7 +14,7 @@ export const Checkbox = (builder, opts) => {
14
14
  inputView: () => CheckboxInputView.create,
15
15
  });
16
16
  builder
17
- .addPlugin(keymapPlugin, builder.Priority.High)
17
+ .addPlugin(() => keymapPlugin(opts), builder.Priority.High)
18
18
  .addPlugin(fixPastePlugin)
19
19
  .addAction(checkboxAction, () => addCheckbox())
20
20
  .addInputRules(({ schema }) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/Checkbox/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,qCAAkC;AAExD,OAAO,EAAC,aAAa,EAA4B,iCAAwB;AACzE,OAAO,EAAC,WAAW,EAAC,qBAAkB;AACtC,OAAO,EAAC,iBAAiB,EAAC,uBAAoB;AAC9C,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAAC,cAAc,EAAC,+BAA4B;AACnD,OAAO,EAAC,iBAAiB,EAAE,YAAY,EAAC,mBAAgB;AAExD,qBAAsB;AAEtB,MAAM,cAAc,GAAG,aAAa,CAAC;AAErC,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GACpB,iCAAwB;AAIzB,MAAM,CAAC,MAAM,QAAQ,GAAmC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACtE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;QACvB,GAAG,IAAI;QACP,SAAS,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM;KAC5C,CAAC,CAAC;IAEH,OAAO;SACF,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;SAC9C,SAAS,CAAC,cAAc,CAAC;SACzB,SAAS,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;SAC9C,aAAa,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE;YACH,aAAa,CACT,eAAe,EACf,YAAY,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAC1E,CAAC,CACJ;SACJ;KACJ,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\nimport {nodeInputRule} from '../../../utils/inputrules';\n\nimport {CheckboxSpecs, type CheckboxSpecsOptions} from './CheckboxSpecs';\nimport {addCheckbox} from './actions';\nimport {CheckboxInputView} from './nodeviews';\nimport {keymapPlugin} from './plugin';\nimport {fixPastePlugin} from './plugins/fix-paste';\nimport {checkboxInputType, checkboxType} from './utils';\n\nimport './index.scss';\n\nconst checkboxAction = 'addCheckbox';\n\nexport {\n CheckboxAttr,\n CheckboxNode,\n checkboxType,\n checkboxLabelType,\n checkboxInputType,\n} from './CheckboxSpecs';\n\nexport type CheckboxOptions = Pick<CheckboxSpecsOptions, 'checkboxLabelPlaceholder'> & {};\n\nexport const Checkbox: ExtensionAuto<CheckboxOptions> = (builder, opts) => {\n builder.use(CheckboxSpecs, {\n ...opts,\n inputView: () => CheckboxInputView.create,\n });\n\n builder\n .addPlugin(keymapPlugin, builder.Priority.High)\n .addPlugin(fixPastePlugin)\n .addAction(checkboxAction, () => addCheckbox())\n .addInputRules(({schema}) => ({\n rules: [\n nodeInputRule(\n /^\\[(\\s?)\\]\\s$/,\n checkboxType(schema).createAndFill({}, checkboxInputType(schema).create()),\n 2,\n ),\n ],\n }));\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [checkboxAction]: Action;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/Checkbox/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,qCAAkC;AAExD,OAAO,EAAC,aAAa,EAA4B,iCAAwB;AACzE,OAAO,EAAC,WAAW,EAAC,qBAAkB;AACtC,OAAO,EAAC,iBAAiB,EAAC,uBAAoB;AAC9C,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAAC,cAAc,EAAC,+BAA4B;AACnD,OAAO,EAAC,iBAAiB,EAAE,YAAY,EAAC,mBAAgB;AAExD,qBAAsB;AAEtB,MAAM,cAAc,GAAG,aAAa,CAAC;AAErC,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GACpB,iCAAwB;AAYzB,MAAM,CAAC,MAAM,QAAQ,GAAmC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACtE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;QACvB,GAAG,IAAI;QACP,SAAS,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM;KAC5C,CAAC,CAAC;IAEH,OAAO;SACF,SAAS,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;SAC1D,SAAS,CAAC,cAAc,CAAC;SACzB,SAAS,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;SAC9C,aAAa,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE;YACH,aAAa,CACT,eAAe,EACf,YAAY,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAC1E,CAAC,CACJ;SACJ;KACJ,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../core';\nimport {nodeInputRule} from '../../../utils/inputrules';\n\nimport {CheckboxSpecs, type CheckboxSpecsOptions} from './CheckboxSpecs';\nimport {addCheckbox} from './actions';\nimport {CheckboxInputView} from './nodeviews';\nimport {keymapPlugin} from './plugin';\nimport {fixPastePlugin} from './plugins/fix-paste';\nimport {checkboxInputType, checkboxType} from './utils';\n\nimport './index.scss';\n\nconst checkboxAction = 'addCheckbox';\n\nexport {\n CheckboxAttr,\n CheckboxNode,\n checkboxType,\n checkboxLabelType,\n checkboxInputType,\n} from './CheckboxSpecs';\n\nexport type CheckboxOptions = Pick<CheckboxSpecsOptions, 'checkboxLabelPlaceholder'> & {\n /**\n * Allow multiline label in checkboxes.\n * Available with @diplodoc/transform v4.68.0 or higher.\n * @default false\n */\n // TODO [MAJOR]: enable by default and remove option\n multiline?: boolean;\n};\n\nexport const Checkbox: ExtensionAuto<CheckboxOptions> = (builder, opts) => {\n builder.use(CheckboxSpecs, {\n ...opts,\n inputView: () => CheckboxInputView.create,\n });\n\n builder\n .addPlugin(() => keymapPlugin(opts), builder.Priority.High)\n .addPlugin(fixPastePlugin)\n .addAction(checkboxAction, () => addCheckbox())\n .addInputRules(({schema}) => ({\n rules: [\n nodeInputRule(\n /^\\[(\\s?)\\]\\s$/,\n checkboxType(schema).createAndFill({}, checkboxInputType(schema).create()),\n 2,\n ),\n ],\n }));\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [checkboxAction]: Action;\n }\n }\n}\n"]}
@@ -1,3 +1,7 @@
1
1
  import { type Command } from 'prosemirror-state';
2
2
  export declare const splitCheckbox: (replaceWithParagraph?: boolean) => Command;
3
- export declare const keymapPlugin: () => import("prosemirror-state").Plugin<any>;
3
+ type KeymapPluginOptions = {
4
+ multiline?: boolean;
5
+ };
6
+ export declare const keymapPlugin: (props: KeymapPluginOptions) => import("prosemirror-state").Plugin<any>;
7
+ export {};
@@ -3,8 +3,9 @@ import { Fragment } from 'prosemirror-model';
3
3
  import { TextSelection } from 'prosemirror-state';
4
4
  // @ts-ignore // TODO: fix cjs build
5
5
  import { findParentNodeOfType } from 'prosemirror-utils';
6
- import { isWholeSelection } from "../../../utils/selection.js";
7
6
  import { pType } from "../../base/BaseSchema/index.js";
7
+ import { isBreakNode } from "../../markdown/Breaks/index.js";
8
+ import { isWholeSelection } from "../../../utils/selection.js";
8
9
  import { checkboxInputType, checkboxLabelType, checkboxType } from "./utils.js";
9
10
  export const splitCheckbox = (replaceWithParagraph) => (state, dispatch) => {
10
11
  const { $from, $to } = state.selection;
@@ -31,6 +32,10 @@ export const splitCheckbox = (replaceWithParagraph) => (state, dispatch) => {
31
32
  tr.insert($from.after(), [node]);
32
33
  tr.replace(label.start + $from.parentOffset, label.pos + label.node.nodeSize);
33
34
  tr.setSelection(new TextSelection(tr.doc.resolve(tr.selection.$from.after() + (replaceWithParagraph ? 2 : 4))));
35
+ // remove break before cursor
36
+ if (isBreakNode($from.nodeBefore)) {
37
+ tr.replaceWith($from.pos - 1, $from.pos, Fragment.empty);
38
+ }
34
39
  dispatch?.(tr);
35
40
  return true;
36
41
  }
@@ -54,9 +59,9 @@ const removeCheckbox = (state, dispatch) => {
54
59
  }
55
60
  return false;
56
61
  };
57
- export const keymapPlugin = () => keymap({
62
+ export const keymapPlugin = (props) => keymap({
58
63
  Enter: splitCheckbox(),
59
64
  Backspace: removeCheckbox,
60
- 'Shift-Enter': splitCheckbox(true),
65
+ ...(props.multiline ? undefined : { 'Shift-Enter': splitCheckbox(true) }),
61
66
  });
62
67
  //# sourceMappingURL=plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/Checkbox/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {keymap} from 'prosemirror-keymap';\nimport {Fragment} from 'prosemirror-model';\nimport {type Command, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findParentNodeOfType} from 'prosemirror-utils';\n\nimport {isWholeSelection} from '../../../utils/selection';\nimport {pType} from '../../base/BaseSchema';\n\nimport {checkboxInputType, checkboxLabelType, checkboxType} from './utils';\n\nexport const splitCheckbox: (replaceWithParagraph?: boolean) => Command =\n (replaceWithParagraph) => (state, dispatch) => {\n const {$from, $to} = state.selection;\n const {schema} = state;\n const label = findParentNodeOfType(checkboxLabelType(schema))(state.selection);\n\n if (!label) return false;\n\n const checkbox = findParentNodeOfType(checkboxType(schema))(state.selection);\n\n if (label.node.content.size === 0 && checkbox) {\n dispatch?.(\n state.tr\n .replaceWith(\n checkbox.pos,\n checkbox.pos + checkbox.node.nodeSize,\n pType(schema).create(),\n )\n .scrollIntoView(),\n );\n\n return true;\n }\n\n if ($from.pos === $to.pos) {\n const {tr} = state;\n\n const content = Fragment.from($from.parent.cut($from.parentOffset).content);\n\n const node = replaceWithParagraph\n ? pType(state.schema).create({}, content)\n : checkboxType(schema).create({}, [\n checkboxInputType(schema).create(),\n checkboxLabelType(schema).create({}, content),\n ]);\n\n tr.insert($from.after(), [node]);\n\n tr.replace(label.start + $from.parentOffset, label.pos + label.node.nodeSize);\n tr.setSelection(\n new TextSelection(\n tr.doc.resolve(tr.selection.$from.after() + (replaceWithParagraph ? 2 : 4)),\n ),\n );\n dispatch?.(tr);\n\n return true;\n }\n\n return false;\n };\n\nconst removeCheckbox: Command = (state, dispatch) => {\n const label = findParentNodeOfType(checkboxLabelType(state.schema))(state.selection);\n const checkbox = findParentNodeOfType(checkboxType(state.schema))(state.selection);\n\n const {selection} = state;\n const {from, to} = selection;\n\n if (!label || !checkbox) {\n return false;\n }\n\n const idx = from - label.pos - 2;\n\n if (idx < 0 && from === to && !isWholeSelection(selection)) {\n const {tr} = state;\n dispatch?.(\n tr\n .replaceWith(\n checkbox.pos,\n checkbox.pos + checkbox.node.nodeSize,\n pType(state.schema).create(null, label.node.content),\n )\n .setSelection(new TextSelection(tr.doc.resolve(state.selection.from - 2))),\n );\n return true;\n }\n\n return false;\n};\n\nexport const keymapPlugin = () =>\n keymap({\n Enter: splitCheckbox(),\n Backspace: removeCheckbox,\n 'Shift-Enter': splitCheckbox(true),\n });\n"]}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/Checkbox/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {keymap} from 'prosemirror-keymap';\nimport {Fragment} from 'prosemirror-model';\nimport {type Command, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findParentNodeOfType} from 'prosemirror-utils';\n\nimport {pType} from 'src/extensions/base/BaseSchema';\nimport {isBreakNode} from 'src/extensions/markdown/Breaks';\nimport {isWholeSelection} from 'src/utils/selection';\n\nimport {checkboxInputType, checkboxLabelType, checkboxType} from './utils';\n\nexport const splitCheckbox: (replaceWithParagraph?: boolean) => Command =\n (replaceWithParagraph) => (state, dispatch) => {\n const {$from, $to} = state.selection;\n const {schema} = state;\n const label = findParentNodeOfType(checkboxLabelType(schema))(state.selection);\n\n if (!label) return false;\n\n const checkbox = findParentNodeOfType(checkboxType(schema))(state.selection);\n\n if (label.node.content.size === 0 && checkbox) {\n dispatch?.(\n state.tr\n .replaceWith(\n checkbox.pos,\n checkbox.pos + checkbox.node.nodeSize,\n pType(schema).create(),\n )\n .scrollIntoView(),\n );\n\n return true;\n }\n\n if ($from.pos === $to.pos) {\n const {tr} = state;\n\n const content = Fragment.from($from.parent.cut($from.parentOffset).content);\n\n const node = replaceWithParagraph\n ? pType(state.schema).create({}, content)\n : checkboxType(schema).create({}, [\n checkboxInputType(schema).create(),\n checkboxLabelType(schema).create({}, content),\n ]);\n\n tr.insert($from.after(), [node]);\n\n tr.replace(label.start + $from.parentOffset, label.pos + label.node.nodeSize);\n tr.setSelection(\n new TextSelection(\n tr.doc.resolve(tr.selection.$from.after() + (replaceWithParagraph ? 2 : 4)),\n ),\n );\n\n // remove break before cursor\n if (isBreakNode($from.nodeBefore)) {\n tr.replaceWith($from.pos - 1, $from.pos, Fragment.empty);\n }\n\n dispatch?.(tr);\n\n return true;\n }\n\n return false;\n };\n\nconst removeCheckbox: Command = (state, dispatch) => {\n const label = findParentNodeOfType(checkboxLabelType(state.schema))(state.selection);\n const checkbox = findParentNodeOfType(checkboxType(state.schema))(state.selection);\n\n const {selection} = state;\n const {from, to} = selection;\n\n if (!label || !checkbox) {\n return false;\n }\n\n const idx = from - label.pos - 2;\n\n if (idx < 0 && from === to && !isWholeSelection(selection)) {\n const {tr} = state;\n dispatch?.(\n tr\n .replaceWith(\n checkbox.pos,\n checkbox.pos + checkbox.node.nodeSize,\n pType(state.schema).create(null, label.node.content),\n )\n .setSelection(new TextSelection(tr.doc.resolve(state.selection.from - 2))),\n );\n return true;\n }\n\n return false;\n};\n\ntype KeymapPluginOptions = {\n multiline?: boolean;\n};\n\nexport const keymapPlugin = (props: KeymapPluginOptions) =>\n keymap({\n Enter: splitCheckbox(),\n Backspace: removeCheckbox,\n ...(props.multiline ? undefined : {'Shift-Enter': splitCheckbox(true)}),\n });\n"]}
@@ -71,6 +71,10 @@ export class EmojiHandler {
71
71
  }
72
72
  onEnter(action) {
73
73
  this.updateState(action);
74
+ const emojiDef = this._emojiCarousel?.currentItem;
75
+ if (!emojiDef) {
76
+ return false;
77
+ }
74
78
  this.select();
75
79
  return true;
76
80
  }
@@ -178,7 +182,7 @@ function filterEmojis(defs, text) {
178
182
  }
179
183
  return byShortcuts.concat(byName);
180
184
  }
181
- const CHARS_TO_HIDE = 4;
185
+ const CHARS_TO_HIDE = 1;
182
186
  function needToHide(defs, text) {
183
187
  let iter = 1;
184
188
  do {
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiHandler.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Schema} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {AutocompletePopupCloser} from '../../../../utils/autocomplete-popup';\nimport {ArrayCarousel} from '../../../../utils/carousel';\nimport {type RendererItem, getReactRendererFromState} from '../../../behavior';\nimport {\n type AutocompleteAction,\n AutocompleteActionKind,\n type AutocompleteHandler,\n closeAutocomplete,\n getAutocompleteState,\n} from '../../../behavior/Autocomplete';\nimport {EmojiConsts} from '../EmojiSpecs';\n\nimport {type EmojiSuggestComponentProps, render} from './EmojiSuggestComponent';\nimport type {EmojiDef} from './types';\nimport {findDecoElem} from './utils';\n\nconst emptyArray = new Array<string>(0);\n\nexport type EmojiHandlerParams = {\n defs: Record<string, string>;\n shortcuts?: Partial<Record<string, string | string[]>>;\n};\n\nexport class EmojiHandler implements AutocompleteHandler {\n private readonly _emojis: readonly EmojiDef[];\n private _emojiCarousel?: ArrayCarousel<EmojiDef>;\n\n private _view?: EditorView;\n private _anchor: Element | null = null;\n private _popupCloser?: AutocompletePopupCloser;\n\n private _suggestProps?: EmojiSuggestComponentProps;\n private _suggestRenderItem?: RendererItem;\n\n constructor({defs, shortcuts = {}}: EmojiHandlerParams) {\n this._emojis = Object.entries(defs).map(([name, symbol]) => {\n const def: EmojiDef = {symbol, origName: name, name: name.toLowerCase()};\n const short = shortcuts[name];\n if (short) {\n def.origShortcuts = emptyArray.concat(short);\n def.shortcuts = def.origShortcuts.map((val) =>\n val.startsWith(':') ? val.slice(1) : val,\n );\n }\n return def;\n });\n }\n\n onOpen(action: AutocompleteAction): boolean {\n this.findAnchor();\n if (!this._anchor) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this._popupCloser = new AutocompletePopupCloser(action.view);\n this.updateState(action);\n this.filterActions();\n this.render();\n\n return true;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n if (action.filter?.endsWith(' ')) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n const needToClose = this.filterActions(action.filter?.trim());\n this.render();\n\n if (needToClose) {\n this.closeAutocomplete(action.view);\n }\n\n return true;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n if (!this._emojiCarousel) return false;\n\n switch (action.kind) {\n case AutocompleteActionKind.up: {\n this._emojiCarousel.prev();\n break;\n }\n case AutocompleteActionKind.down: {\n this._emojiCarousel.next();\n break;\n }\n default:\n return false;\n }\n\n this.render();\n\n return true;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.select();\n\n return true;\n }\n\n onClose(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.clear();\n\n return true;\n }\n\n onDestroy(): void {\n this.clear();\n }\n\n private closeAutocomplete(view: EditorView) {\n setTimeout(() => {\n closeAutocomplete(view);\n });\n }\n\n private select() {\n const {_view: view} = this;\n if (!view) return;\n\n const emojiDef = this._emojiCarousel?.currentItem;\n if (!emojiDef) return;\n\n const autocompleteState = getAutocompleteState(view.state);\n if (!autocompleteState || !autocompleteState.active) return;\n\n const {range} = autocompleteState;\n const {tr, schema} = view.state;\n view.dispatch(\n tr.replaceWith(range.from, range.to, createEmoji(schema, emojiDef)).scrollIntoView(),\n );\n view.focus();\n }\n\n private filterActions(inputText?: string): boolean {\n const currentItem = this._emojiCarousel?.currentItem;\n\n let filteredEmojis = this._emojis;\n let needToClose = false;\n\n if (inputText) {\n filteredEmojis = filterEmojis(filteredEmojis, inputText);\n needToClose = !filteredEmojis.length && needToHide(this._emojis, inputText);\n }\n\n this._emojiCarousel = new ArrayCarousel(filteredEmojis);\n\n if (currentItem) {\n const newIndex = this._emojiCarousel.array.findIndex((item) => item === currentItem);\n if (newIndex !== -1) {\n this._emojiCarousel.currentIndex = newIndex;\n }\n }\n\n return needToClose;\n }\n\n private render() {\n this.findAnchor();\n const viewItems = this._emojiCarousel?.array ?? [];\n this._suggestProps = {\n anchorElement: this._anchor,\n currentIndex: this._emojiCarousel?.currentIndex,\n items: viewItems,\n onClick: this.onItemClick,\n onOpenChange: this._popupCloser?.popupOpenChangeHandler,\n };\n this._suggestRenderItem = this._suggestRenderItem ?? this.createMenuRenderItem();\n this._suggestRenderItem.rerender();\n }\n\n private onItemClick = (index: number) => {\n if (this._emojiCarousel) {\n this._emojiCarousel.currentIndex = index;\n this.select();\n }\n this._view?.focus();\n };\n\n private updateState({view}: AutocompleteAction) {\n this._view = view;\n }\n\n private clear() {\n this._view = undefined;\n this._anchor = null;\n this._emojiCarousel = undefined;\n this._popupCloser?.cancelTimer();\n this._popupCloser = undefined;\n this._suggestProps = undefined;\n this._suggestRenderItem?.remove();\n this._suggestRenderItem = undefined;\n }\n\n private createMenuRenderItem(): RendererItem {\n return getReactRendererFromState(this._view!.state).createItem('emoji_suggest', () =>\n this._suggestProps ? render(this._suggestProps) : null,\n );\n }\n\n private findAnchor() {\n this._anchor = findDecoElem(this._view?.dom);\n }\n}\n\nfunction createEmoji(schema: Schema, def: EmojiDef) {\n return EmojiConsts.nodeType(schema).create(\n {[EmojiConsts.NodeAttrs.Markup]: def.name},\n schema.text(def.symbol),\n );\n}\n\nfunction filterEmojis(defs: readonly EmojiDef[], text: string): readonly EmojiDef[] {\n if (!text) return defs;\n const textLowerCase = text.toLowerCase();\n\n const byShortcuts: EmojiDef[] = [];\n const byName: EmojiDef[] = [];\n for (const emoji of defs) {\n if (emoji.shortcuts?.some((val) => val.startsWith(text))) {\n byShortcuts.push(emoji);\n } else if (emoji.name.startsWith(textLowerCase)) {\n byName.push(emoji);\n }\n }\n return byShortcuts.concat(byName);\n}\n\nconst CHARS_TO_HIDE = 4;\nfunction needToHide(defs: readonly EmojiDef[], text: string): boolean {\n let iter = 1;\n do {\n const prevInput = text.slice(0, text.length - iter);\n const prevActions = filterEmojis(defs, prevInput);\n if (prevActions.length) break;\n iter++;\n } while (iter < text.length && iter < CHARS_TO_HIDE);\n return iter >= CHARS_TO_HIDE;\n}\n"]}
1
+ {"version":3,"file":"EmojiHandler.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Schema} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {AutocompletePopupCloser} from '../../../../utils/autocomplete-popup';\nimport {ArrayCarousel} from '../../../../utils/carousel';\nimport {type RendererItem, getReactRendererFromState} from '../../../behavior';\nimport {\n type AutocompleteAction,\n AutocompleteActionKind,\n type AutocompleteHandler,\n closeAutocomplete,\n getAutocompleteState,\n} from '../../../behavior/Autocomplete';\nimport {EmojiConsts} from '../EmojiSpecs';\n\nimport {type EmojiSuggestComponentProps, render} from './EmojiSuggestComponent';\nimport type {EmojiDef} from './types';\nimport {findDecoElem} from './utils';\n\nconst emptyArray = new Array<string>(0);\n\nexport type EmojiHandlerParams = {\n defs: Record<string, string>;\n shortcuts?: Partial<Record<string, string | string[]>>;\n};\n\nexport class EmojiHandler implements AutocompleteHandler {\n private readonly _emojis: readonly EmojiDef[];\n private _emojiCarousel?: ArrayCarousel<EmojiDef>;\n\n private _view?: EditorView;\n private _anchor: Element | null = null;\n private _popupCloser?: AutocompletePopupCloser;\n\n private _suggestProps?: EmojiSuggestComponentProps;\n private _suggestRenderItem?: RendererItem;\n\n constructor({defs, shortcuts = {}}: EmojiHandlerParams) {\n this._emojis = Object.entries(defs).map(([name, symbol]) => {\n const def: EmojiDef = {symbol, origName: name, name: name.toLowerCase()};\n const short = shortcuts[name];\n if (short) {\n def.origShortcuts = emptyArray.concat(short);\n def.shortcuts = def.origShortcuts.map((val) =>\n val.startsWith(':') ? val.slice(1) : val,\n );\n }\n return def;\n });\n }\n\n onOpen(action: AutocompleteAction): boolean {\n this.findAnchor();\n if (!this._anchor) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this._popupCloser = new AutocompletePopupCloser(action.view);\n this.updateState(action);\n this.filterActions();\n this.render();\n\n return true;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n if (action.filter?.endsWith(' ')) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n const needToClose = this.filterActions(action.filter?.trim());\n this.render();\n\n if (needToClose) {\n this.closeAutocomplete(action.view);\n }\n\n return true;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n if (!this._emojiCarousel) return false;\n\n switch (action.kind) {\n case AutocompleteActionKind.up: {\n this._emojiCarousel.prev();\n break;\n }\n case AutocompleteActionKind.down: {\n this._emojiCarousel.next();\n break;\n }\n default:\n return false;\n }\n\n this.render();\n\n return true;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n const emojiDef = this._emojiCarousel?.currentItem;\n if (!emojiDef) {\n return false;\n }\n\n this.select();\n return true;\n }\n\n onClose(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.clear();\n\n return true;\n }\n\n onDestroy(): void {\n this.clear();\n }\n\n private closeAutocomplete(view: EditorView) {\n setTimeout(() => {\n closeAutocomplete(view);\n });\n }\n\n private select() {\n const {_view: view} = this;\n if (!view) return;\n\n const emojiDef = this._emojiCarousel?.currentItem;\n if (!emojiDef) return;\n\n const autocompleteState = getAutocompleteState(view.state);\n if (!autocompleteState || !autocompleteState.active) return;\n\n const {range} = autocompleteState;\n const {tr, schema} = view.state;\n view.dispatch(\n tr.replaceWith(range.from, range.to, createEmoji(schema, emojiDef)).scrollIntoView(),\n );\n view.focus();\n }\n\n private filterActions(inputText?: string): boolean {\n const currentItem = this._emojiCarousel?.currentItem;\n\n let filteredEmojis = this._emojis;\n let needToClose = false;\n\n if (inputText) {\n filteredEmojis = filterEmojis(filteredEmojis, inputText);\n needToClose = !filteredEmojis.length && needToHide(this._emojis, inputText);\n }\n\n this._emojiCarousel = new ArrayCarousel(filteredEmojis);\n\n if (currentItem) {\n const newIndex = this._emojiCarousel.array.findIndex((item) => item === currentItem);\n if (newIndex !== -1) {\n this._emojiCarousel.currentIndex = newIndex;\n }\n }\n\n return needToClose;\n }\n\n private render() {\n this.findAnchor();\n const viewItems = this._emojiCarousel?.array ?? [];\n this._suggestProps = {\n anchorElement: this._anchor,\n currentIndex: this._emojiCarousel?.currentIndex,\n items: viewItems,\n onClick: this.onItemClick,\n onOpenChange: this._popupCloser?.popupOpenChangeHandler,\n };\n this._suggestRenderItem = this._suggestRenderItem ?? this.createMenuRenderItem();\n this._suggestRenderItem.rerender();\n }\n\n private onItemClick = (index: number) => {\n if (this._emojiCarousel) {\n this._emojiCarousel.currentIndex = index;\n this.select();\n }\n this._view?.focus();\n };\n\n private updateState({view}: AutocompleteAction) {\n this._view = view;\n }\n\n private clear() {\n this._view = undefined;\n this._anchor = null;\n this._emojiCarousel = undefined;\n this._popupCloser?.cancelTimer();\n this._popupCloser = undefined;\n this._suggestProps = undefined;\n this._suggestRenderItem?.remove();\n this._suggestRenderItem = undefined;\n }\n\n private createMenuRenderItem(): RendererItem {\n return getReactRendererFromState(this._view!.state).createItem('emoji_suggest', () =>\n this._suggestProps ? render(this._suggestProps) : null,\n );\n }\n\n private findAnchor() {\n this._anchor = findDecoElem(this._view?.dom);\n }\n}\n\nfunction createEmoji(schema: Schema, def: EmojiDef) {\n return EmojiConsts.nodeType(schema).create(\n {[EmojiConsts.NodeAttrs.Markup]: def.name},\n schema.text(def.symbol),\n );\n}\n\nfunction filterEmojis(defs: readonly EmojiDef[], text: string): readonly EmojiDef[] {\n if (!text) return defs;\n const textLowerCase = text.toLowerCase();\n\n const byShortcuts: EmojiDef[] = [];\n const byName: EmojiDef[] = [];\n for (const emoji of defs) {\n if (emoji.shortcuts?.some((val) => val.startsWith(text))) {\n byShortcuts.push(emoji);\n } else if (emoji.name.startsWith(textLowerCase)) {\n byName.push(emoji);\n }\n }\n return byShortcuts.concat(byName);\n}\n\nconst CHARS_TO_HIDE = 1;\nfunction needToHide(defs: readonly EmojiDef[], text: string): boolean {\n let iter = 1;\n do {\n const prevInput = text.slice(0, text.length - iter);\n const prevActions = filterEmojis(defs, prevInput);\n if (prevActions.length) break;\n iter++;\n } while (iter < text.length && iter < CHARS_TO_HIDE);\n return iter >= CHARS_TO_HIDE;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { autocompletion } from '@codemirror/autocomplete';
2
2
  import type { Extension, StateCommand } from '@codemirror/state';
3
- import { EditorView, type EditorViewConfig, type KeyBinding, placeholder } from '@codemirror/view';
3
+ import { EditorView, type EditorViewConfig, type KeyBinding, placeholder, tooltips } from '@codemirror/view';
4
4
  import type { ParseInsertedUrlAsImage } from "../../bundle/index.js";
5
5
  import type { EventMap } from "../../bundle/Editor.js";
6
6
  import type { ReactRenderStorage } from "../../extensions/index.js";
@@ -11,6 +11,7 @@ import { type FileUploadHandler } from "./files-upload-facet.js";
11
11
  import { type YfmLangOptions } from "./yfm.js";
12
12
  export type { YfmLangOptions };
13
13
  type Autocompletion = Parameters<typeof autocompletion>[0];
14
+ type Tooltips = Parameters<typeof tooltips>[0];
14
15
  export type CreateCodemirrorParams = {
15
16
  doc: EditorViewConfig['doc'];
16
17
  placeholder: Parameters<typeof placeholder>[0];
@@ -34,6 +35,7 @@ export type CreateCodemirrorParams = {
34
35
  receiver?: Receiver<EventMap>;
35
36
  yfmLangOptions?: YfmLangOptions;
36
37
  autocompletion?: Autocompletion;
38
+ tooltips?: Tooltips;
37
39
  directiveSyntax: DirectiveSyntaxContext;
38
40
  preserveEmptyRows: boolean;
39
41
  searchPanel?: boolean;
@@ -1,7 +1,7 @@
1
1
  import { autocompletion } from '@codemirror/autocomplete';
2
2
  import { defaultKeymap, history, historyKeymap, indentWithTab, insertNewlineKeepIndent, insertTab, } from '@codemirror/commands';
3
3
  import { syntaxHighlighting } from '@codemirror/language';
4
- import { EditorView, keymap, placeholder, } from '@codemirror/view';
4
+ import { EditorView, keymap, placeholder, tooltips, } from '@codemirror/view';
5
5
  import { InputState } from "../../utils/input-state.js";
6
6
  import { ActionName } from "../../bundle/config/action-names.js";
7
7
  import { globalLogger } from "../../logger.js";
@@ -20,7 +20,7 @@ import { smartReindent } from "./smart-reindent/index.js";
20
20
  import { yfmLang } from "./yfm.js";
21
21
  const linkRegex = /\[[\s\S]*?]\([\s\S]*?\)/g;
22
22
  export function createCodemirror(params) {
23
- const { logger, doc, reactRenderer, onCancel, onScroll, onSubmit, onChange, onDocChange, disabledExtensions = {}, keymaps = [], receiver, yfmLangOptions, extensions: extraExtensions, placeholder: placeholderContent, autocompletion: autocompletionConfig, parseHtmlOnPaste, parseInsertedUrlAsImage, directiveSyntax, preserveEmptyRows, searchPanel = true, } = params;
23
+ const { logger, doc, reactRenderer, onCancel, onScroll, onSubmit, onChange, onDocChange, disabledExtensions = {}, keymaps = [], receiver, yfmLangOptions, extensions: extraExtensions, placeholder: placeholderContent, autocompletion: autocompletionConfig, tooltips: tooltipsConfig, parseHtmlOnPaste, parseInsertedUrlAsImage, directiveSyntax, preserveEmptyRows, searchPanel = true, } = params;
24
24
  const extensions = [gravityTheme, placeholder(placeholderContent)];
25
25
  if (!disabledExtensions.history) {
26
26
  extensions.push(history());
@@ -177,6 +177,9 @@ export function createCodemirror(params) {
177
177
  enableNewImageSizeCalculation: params.enableNewImageSizeCalculation,
178
178
  }));
179
179
  }
180
+ if (tooltipsConfig) {
181
+ extensions.push(tooltips(tooltipsConfig));
182
+ }
180
183
  if (extraExtensions) {
181
184
  extensions.push(...extraExtensions);
182
185
  }