@gravity-ui/markdown-editor 15.14.2 → 15.16.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 (77) hide show
  1. package/build/cjs/bundle/config/dynamicModifiers.js +1 -1
  2. package/build/cjs/bundle/config/dynamicModifiers.js.map +1 -1
  3. package/build/cjs/bundle/toolbar/custom/ToolbarFilePopup.d.ts +1 -1
  4. package/build/cjs/bundle/toolbar/custom/ToolbarFilePopup.js +2 -2
  5. package/build/cjs/bundle/toolbar/custom/ToolbarFilePopup.js.map +1 -1
  6. package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.d.ts +1 -1
  7. package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.js +2 -2
  8. package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.js.map +1 -1
  9. package/build/cjs/core/SchemaDynamicModifier.d.ts +29 -0
  10. package/build/cjs/core/SchemaDynamicModifier.js +17 -1
  11. package/build/cjs/core/SchemaDynamicModifier.js.map +1 -1
  12. package/build/cjs/core/markdown/MarkdownParser.d.ts +69 -1
  13. package/build/cjs/core/markdown/MarkdownParser.js +54 -4
  14. package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
  15. package/build/cjs/core/markdown/MarkdownSerializerDynamicModifier.d.ts +40 -1
  16. package/build/cjs/core/markdown/MarkdownSerializerDynamicModifier.js +0 -1
  17. package/build/cjs/core/markdown/MarkdownSerializerDynamicModifier.js.map +1 -1
  18. package/build/cjs/core/types/dynamicModifiers.d.ts +28 -1
  19. package/build/cjs/core/types/dynamicModifiers.js.map +1 -1
  20. package/build/cjs/core/types/parser.d.ts +2 -0
  21. package/build/cjs/core/types/parser.js.map +1 -1
  22. package/build/cjs/extensions/markdown/Link/paste-plugin.js +8 -2
  23. package/build/cjs/extensions/markdown/Link/paste-plugin.js.map +1 -1
  24. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +2 -1
  25. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  26. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.d.ts +2 -1
  27. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js +12 -1
  28. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js.map +1 -1
  29. package/build/cjs/forms/FileForm.d.ts +1 -0
  30. package/build/cjs/forms/FileForm.js +2 -2
  31. package/build/cjs/forms/FileForm.js.map +1 -1
  32. package/build/cjs/forms/ImageForm.d.ts +1 -0
  33. package/build/cjs/forms/ImageForm.js +2 -2
  34. package/build/cjs/forms/ImageForm.js.map +1 -1
  35. package/build/cjs/forms/TextInput.js +1 -1
  36. package/build/cjs/forms/TextInput.js.map +1 -1
  37. package/build/cjs/version.js +1 -1
  38. package/build/cjs/version.js.map +1 -1
  39. package/build/esm/bundle/config/dynamicModifiers.js +1 -1
  40. package/build/esm/bundle/config/dynamicModifiers.js.map +1 -1
  41. package/build/esm/bundle/toolbar/custom/ToolbarFilePopup.d.ts +1 -1
  42. package/build/esm/bundle/toolbar/custom/ToolbarFilePopup.js +2 -2
  43. package/build/esm/bundle/toolbar/custom/ToolbarFilePopup.js.map +1 -1
  44. package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.d.ts +1 -1
  45. package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.js +2 -2
  46. package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.js.map +1 -1
  47. package/build/esm/core/SchemaDynamicModifier.d.ts +29 -0
  48. package/build/esm/core/SchemaDynamicModifier.js +17 -1
  49. package/build/esm/core/SchemaDynamicModifier.js.map +1 -1
  50. package/build/esm/core/markdown/MarkdownParser.d.ts +69 -1
  51. package/build/esm/core/markdown/MarkdownParser.js +54 -4
  52. package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
  53. package/build/esm/core/markdown/MarkdownSerializerDynamicModifier.d.ts +40 -1
  54. package/build/esm/core/markdown/MarkdownSerializerDynamicModifier.js +0 -1
  55. package/build/esm/core/markdown/MarkdownSerializerDynamicModifier.js.map +1 -1
  56. package/build/esm/core/types/dynamicModifiers.d.ts +28 -1
  57. package/build/esm/core/types/dynamicModifiers.js.map +1 -1
  58. package/build/esm/core/types/parser.d.ts +2 -0
  59. package/build/esm/core/types/parser.js.map +1 -1
  60. package/build/esm/extensions/markdown/Link/paste-plugin.js +8 -2
  61. package/build/esm/extensions/markdown/Link/paste-plugin.js.map +1 -1
  62. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +2 -1
  63. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  64. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.d.ts +2 -1
  65. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js +12 -1
  66. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js.map +1 -1
  67. package/build/esm/forms/FileForm.d.ts +1 -0
  68. package/build/esm/forms/FileForm.js +2 -2
  69. package/build/esm/forms/FileForm.js.map +1 -1
  70. package/build/esm/forms/ImageForm.d.ts +1 -0
  71. package/build/esm/forms/ImageForm.js +2 -2
  72. package/build/esm/forms/ImageForm.js.map +1 -1
  73. package/build/esm/forms/TextInput.js +1 -1
  74. package/build/esm/forms/TextInput.js.map +1 -1
  75. package/build/esm/version.js +1 -1
  76. package/build/esm/version.js.map +1 -1
  77. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["core/types/dynamicModifiers.ts"],"names":[],"mappings":"","sourcesContent":["import type {ProcessNode, ProcessNodeAttrs, ProcessToken} from '../markdown/MarkdownParser';\nimport type {SerializerProcessNode} from '../markdown/MarkdownSerializerDynamicModifier';\n\n/** @internal */\nexport type DynamicModifiers =\n | ParserTokenModifier\n | ParserNodeAttrsModifier\n | ParserNodeModifier\n | SerializerNodeModifier\n | SchemaNodeSpecModifier;\n\n/** @internal */\nexport type ParserTokenModifier = {\n type: 'parserToken';\n tokenName: string;\n process: ProcessToken;\n};\n\n/** @internal */\nexport type ParserNodeAttrsModifier = {\n type: 'parserNodeAttrs'; // TODO: fix name\n tokenName: string;\n process: ProcessNodeAttrs;\n};\n\n/** @internal */\nexport type ParserNodeModifier = {\n type: 'parserNode';\n nodeName: string;\n process: ProcessNode;\n};\n\n/** @internal */\nexport type SerializerNodeModifier = {\n type: 'serializerNode';\n nodeName: string;\n process: SerializerProcessNode;\n};\n\n/** @internal */\nexport type SchemaNodeSpecModifier = {\n type: 'schemaNodeSpec';\n nodeName: string;\n allowedAttrs: string[];\n};\n"]}
1
+ {"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["core/types/dynamicModifiers.ts"],"names":[],"mappings":"","sourcesContent":["import type {ProcessNode, ProcessNodeAttrs, ProcessToken} from '../markdown/MarkdownParser';\nimport type {SerializerProcessNode} from '../markdown/MarkdownSerializerDynamicModifier';\n\nexport type DynamicModifiers =\n | ParserTokenModifier\n | ParserNodeAttrsModifier\n | ParserNodeModifier\n | SerializerNodeModifier\n | SchemaNodeSpecModifier;\n\nexport type ParserTokenModifier = {\n type: 'parserToken';\n tokenName: string;\n process: ProcessToken;\n};\n\nexport type ParserNodeAttrsModifier = {\n type: 'parserNodeAttrs'; // TODO: fix name\n tokenName: string;\n process: ProcessNodeAttrs;\n};\n\nexport type ParserNodeModifier = {\n type: 'parserNode';\n nodeName: string;\n process: ProcessNode;\n};\n\nexport type SerializerNodeModifier = {\n type: 'serializerNode';\n nodeName: string;\n process: SerializerProcessNode;\n};\n\nexport type SchemaNodeSpecModifier = {\n type: 'schemaNodeSpec';\n nodeName: string;\n allowedAttrs: string[];\n};\n"]}
@@ -4,6 +4,8 @@ import type { Node } from 'prosemirror-model';
4
4
  export interface Parser {
5
5
  /** Parse raw markup to prosemirror's root node */
6
6
  parse(markup: string): Node;
7
+ /** Parse markdown-it tokens stream to prosemirror's root node */
8
+ parse(tokens: Token[]): Node;
7
9
  validateLink(url: string): boolean;
8
10
  normalizeLink(url: string): string;
9
11
  normalizeLinkText(url: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/types/parser.ts"],"names":[],"mappings":"","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type Token from 'markdown-it/lib/token';\nimport type {Node} from 'prosemirror-model';\n\nexport interface Parser {\n /** Parse raw markup to prosemirror's root node */\n parse(markup: string): Node;\n validateLink(url: string): boolean;\n normalizeLink(url: string): string;\n normalizeLinkText(url: string): string;\n matchLinks(text: string): Readonly<Match>[] | null;\n}\n\nexport interface ParserToken {\n name: string;\n type: 'node' | 'block' | 'mark';\n attrs?: {[name: string]: unknown};\n getAttrs?: (token: Token, tokens: Token[], index: number) => NonNullable<ParserToken['attrs']>;\n // It means that there is no closing token\n // That is, the content lies in the content field of the token, and not between the opening and closing tokens.\n noCloseToken?: boolean;\n ignore?: boolean;\n code?: boolean;\n /** only for tokens with type=block */\n prepareContent?: (content: string) => string;\n /**\n * only for tokens with type=block and noCloseToken=true\n * @default 'content'\n */\n contentField?: 'content' | 'children';\n}\n"]}
1
+ {"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/types/parser.ts"],"names":[],"mappings":"","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type Token from 'markdown-it/lib/token';\nimport type {Node} from 'prosemirror-model';\n\nexport interface Parser {\n /** Parse raw markup to prosemirror's root node */\n parse(markup: string): Node;\n /** Parse markdown-it tokens stream to prosemirror's root node */\n parse(tokens: Token[]): Node;\n validateLink(url: string): boolean;\n normalizeLink(url: string): string;\n normalizeLinkText(url: string): string;\n matchLinks(text: string): Readonly<Match>[] | null;\n}\n\nexport interface ParserToken {\n name: string;\n type: 'node' | 'block' | 'mark';\n attrs?: {[name: string]: unknown};\n getAttrs?: (token: Token, tokens: Token[], index: number) => NonNullable<ParserToken['attrs']>;\n // It means that there is no closing token\n // That is, the content lies in the content field of the token, and not between the opening and closing tokens.\n noCloseToken?: boolean;\n ignore?: boolean;\n code?: boolean;\n /** only for tokens with type=block */\n prepareContent?: (content: string) => string;\n /**\n * only for tokens with type=block and noCloseToken=true\n * @default 'content'\n */\n contentField?: 'content' | 'children';\n}\n"]}
@@ -69,8 +69,14 @@ function getUrl(data, parser) {
69
69
  // TODO: should we process HTML here?
70
70
  const text = data.getData(utils_1.DataTransferType.Text);
71
71
  const match = parser.matchLinks(text);
72
- if (match?.[0]?.raw === text)
73
- return match[0].url;
72
+ if (match?.[0]) {
73
+ const { raw, url } = match[0];
74
+ if (raw === text)
75
+ return url;
76
+ if (text.endsWith('?') && raw + '?' === text && parser.validateLink(text)) {
77
+ return parser.normalizeLink(text);
78
+ }
79
+ }
74
80
  return null;
75
81
  }
76
82
  //# sourceMappingURL=paste-plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paste-plugin.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Link/paste-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {Plugin, TextSelection, type Transaction} from 'prosemirror-state';\n\nimport {type ExtensionDeps, type Parser, getLoggerFromState} from '../../../core';\nimport {isNodeSelection, isTextSelection} from '../../../utils/selection';\nimport {DataTransferType, isIosSafariShare} from '../../behavior/Clipboard/utils';\nimport {imageType} from '../Image';\n\nimport {LinkAttr, linkType} from './index';\n\nexport function linkPasteEnhance({markupParser: parser}: ExtensionDeps) {\n return new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e): boolean {\n const logger = getLoggerFromState(view.state).nested({\n plugin: 'link-paste-enhance',\n domEvent: 'paste',\n });\n\n const {state, dispatch} = view;\n const sel = state.selection;\n let tr: Transaction | null = null;\n\n if (\n isTextSelection(sel) ||\n (isNodeSelection(sel) && sel.node.type === imageType(state.schema))\n ) {\n const {$from, $to} = sel;\n if ($from.pos === $to.pos) {\n const url = getUrl(e.clipboardData, parser);\n if (url) {\n const linkMarkType = linkType(state.schema);\n tr = state.tr.replaceSelectionWith(\n state.schema.text(url, [\n ...$from\n .marks()\n .filter((mark) => mark.type !== linkMarkType),\n linkMarkType.create({[LinkAttr.Href]: url}),\n ]),\n false,\n );\n logger.event({\n event: 'paste-url',\n });\n }\n } else if ($from.sameParent($to)) {\n const url = getUrl(e.clipboardData, parser);\n if (url) {\n tr = state.tr.addMark(\n $from.pos,\n $to.pos,\n linkType(state.schema).create({\n [LinkAttr.Href]: url,\n }),\n );\n tr.setSelection(TextSelection.create(tr.doc, $to.pos));\n logger.event({\n event: 'paste-url-on-text',\n });\n }\n }\n }\n\n if (tr) {\n dispatch(tr.scrollIntoView());\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n}\n\nfunction getUrl(data: DataTransfer | null, parser: Parser): string | null {\n if (!data || data.types.includes(DataTransferType.Yfm)) return null;\n if (isIosSafariShare(data)) return data.getData(DataTransferType.UriList);\n // TODO: should we process HTML here?\n const text = data.getData(DataTransferType.Text);\n const match = parser.matchLinks(text);\n if (match?.[0]?.raw === text) return match[0].url;\n return null;\n}\n"]}
1
+ {"version":3,"file":"paste-plugin.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Link/paste-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {Plugin, TextSelection, type Transaction} from 'prosemirror-state';\n\nimport {type ExtensionDeps, type Parser, getLoggerFromState} from '../../../core';\nimport {isNodeSelection, isTextSelection} from '../../../utils/selection';\nimport {DataTransferType, isIosSafariShare} from '../../behavior/Clipboard/utils';\nimport {imageType} from '../Image';\n\nimport {LinkAttr, linkType} from './index';\n\nexport function linkPasteEnhance({markupParser: parser}: ExtensionDeps) {\n return new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e): boolean {\n const logger = getLoggerFromState(view.state).nested({\n plugin: 'link-paste-enhance',\n domEvent: 'paste',\n });\n\n const {state, dispatch} = view;\n const sel = state.selection;\n let tr: Transaction | null = null;\n\n if (\n isTextSelection(sel) ||\n (isNodeSelection(sel) && sel.node.type === imageType(state.schema))\n ) {\n const {$from, $to} = sel;\n if ($from.pos === $to.pos) {\n const url = getUrl(e.clipboardData, parser);\n if (url) {\n const linkMarkType = linkType(state.schema);\n tr = state.tr.replaceSelectionWith(\n state.schema.text(url, [\n ...$from\n .marks()\n .filter((mark) => mark.type !== linkMarkType),\n linkMarkType.create({[LinkAttr.Href]: url}),\n ]),\n false,\n );\n logger.event({\n event: 'paste-url',\n });\n }\n } else if ($from.sameParent($to)) {\n const url = getUrl(e.clipboardData, parser);\n if (url) {\n tr = state.tr.addMark(\n $from.pos,\n $to.pos,\n linkType(state.schema).create({\n [LinkAttr.Href]: url,\n }),\n );\n tr.setSelection(TextSelection.create(tr.doc, $to.pos));\n logger.event({\n event: 'paste-url-on-text',\n });\n }\n }\n }\n\n if (tr) {\n dispatch(tr.scrollIntoView());\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n}\n\nfunction getUrl(data: DataTransfer | null, parser: Parser): string | null {\n if (!data || data.types.includes(DataTransferType.Yfm)) return null;\n if (isIosSafariShare(data)) return data.getData(DataTransferType.UriList);\n // TODO: should we process HTML here?\n const text = data.getData(DataTransferType.Text);\n const match = parser.matchLinks(text);\n if (match?.[0]) {\n const {raw, url} = match[0];\n if (raw === text) return url;\n if (text.endsWith('?') && raw + '?' === text && parser.validateLink(text)) {\n return parser.normalizeLink(text);\n }\n }\n return null;\n}\n"]}
@@ -4,6 +4,7 @@ exports.YfmNoteSpecs = exports.noteTitleType = exports.noteType = exports.YfmNot
4
4
  const tslib_1 = require("tslib");
5
5
  const log_js_1 = require("@diplodoc/transform/lib/log.js");
6
6
  const index_js_1 = tslib_1.__importDefault(require("@diplodoc/transform/lib/plugins/notes/index.js"));
7
+ const configure_1 = require("../../../../configure.js");
7
8
  const const_1 = require("./const.js");
8
9
  const parser_1 = require("./parser.js");
9
10
  const schema_1 = require("./schema.js");
@@ -16,7 +17,7 @@ Object.defineProperty(exports, "noteTitleType", { enumerable: true, get: functio
16
17
  const YfmNoteSpecs = (builder, opts) => {
17
18
  const schemaSpecs = (0, schema_1.getSchemaSpecs)(opts, builder.context.get('placeholder'));
18
19
  builder
19
- .configureMd((md) => md.use(index_js_1.default, { log: log_js_1.log }))
20
+ .configureMd((md) => md.use(index_js_1.default, { log: log_js_1.log, lang: (0, configure_1.getConfig)().lang || 'en' }))
20
21
  .addNode(const_1.NoteNode.Note, () => ({
21
22
  spec: schemaSpecs[const_1.NoteNode.Note],
22
23
  toMd: serializer_1.serializerTokens[const_1.NoteNode.Note],
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmNote/YfmNoteSpecs/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAmD;AACnD,sGAAuE;AAKvE,sCAAiC;AACjC,wCAAsC;AACtC,wCAAwC;AACxC,gDAA8C;AAE9C,oCAAgD;AAAxC,oGAAA,QAAQ,OAAe;AAC/B,oCAAgD;AAAxC,iGAAA,QAAQ,OAAA;AAAE,sGAAA,aAAa,OAAA;AASxB,MAAM,YAAY,GAAuC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9E,MAAM,WAAW,GAAG,IAAA,uBAAc,EAAC,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,kBAAS,EAAE,EAAC,GAAG,EAAH,YAAG,EAAC,CAAC,CAAC;SAC7C,OAAO,CAAC,gBAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3B,IAAI,EAAE,WAAW,CAAC,gBAAQ,CAAC,IAAI,CAAC;QAChC,IAAI,EAAE,6BAAgB,CAAC,gBAAQ,CAAC,IAAI,CAAC;QACrC,MAAM,EAAE;YACJ,SAAS,EAAE,qBAAY,CAAC,gBAAQ,CAAC,IAAI,CAAC;SACzC;KACJ,CAAC,CAAC;SACF,OAAO,CAAC,gBAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,gBAAQ,CAAC,SAAS,CAAC;QACrC,IAAI,EAAE,6BAAgB,CAAC,gBAAQ,CAAC,SAAS,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,qBAAY,CAAC,gBAAQ,CAAC,SAAS,CAAC;SAC9C;KACJ,CAAC,CAAC;SACF,OAAO,CAAC,gBAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QAClC,IAAI,EAAE,WAAW,CAAC,gBAAQ,CAAC,WAAW,CAAC;QACvC,IAAI,EAAE,6BAAgB,CAAC,gBAAQ,CAAC,WAAW,CAAC;QAC5C,MAAM,EAAE;YACJ,SAAS,EAAE,qBAAY,CAAC,gBAAQ,CAAC,WAAW,CAAC;SAChD;KACJ,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AA1BW,QAAA,YAAY,gBA0BvB","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport yfmPlugin from '@diplodoc/transform/lib/plugins/notes/index.js';\nimport type {NodeSpec} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../../../../core';\n\nimport {NoteNode} from './const';\nimport {parserTokens} from './parser';\nimport {getSchemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {NoteNode as YfmNoteNode} from './const';\nexport {noteType, noteTitleType} from './utils';\n\nexport type YfmNoteSpecsOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n yfmNoteTitlePlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n};\n\nexport const YfmNoteSpecs: ExtensionAuto<YfmNoteSpecsOptions> = (builder, opts) => {\n const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));\n\n builder\n .configureMd((md) => md.use(yfmPlugin, {log}))\n .addNode(NoteNode.Note, () => ({\n spec: schemaSpecs[NoteNode.Note],\n toMd: serializerTokens[NoteNode.Note],\n fromMd: {\n tokenSpec: parserTokens[NoteNode.Note],\n },\n }))\n .addNode(NoteNode.NoteTitle, () => ({\n spec: schemaSpecs[NoteNode.NoteTitle],\n toMd: serializerTokens[NoteNode.NoteTitle],\n fromMd: {\n tokenSpec: parserTokens[NoteNode.NoteTitle],\n },\n }))\n .addNode(NoteNode.NoteContent, () => ({\n spec: schemaSpecs[NoteNode.NoteContent],\n toMd: serializerTokens[NoteNode.NoteContent],\n fromMd: {\n tokenSpec: parserTokens[NoteNode.NoteContent],\n },\n }));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmNote/YfmNoteSpecs/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAmD;AACnD,sGAAuE;AAGvE,wDAAwC;AAGxC,sCAAiC;AACjC,wCAAsC;AACtC,wCAAwC;AACxC,gDAA8C;AAE9C,oCAAgD;AAAxC,oGAAA,QAAQ,OAAe;AAC/B,oCAAgD;AAAxC,iGAAA,QAAQ,OAAA;AAAE,sGAAA,aAAa,OAAA;AASxB,MAAM,YAAY,GAAuC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9E,MAAM,WAAW,GAAG,IAAA,uBAAc,EAAC,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,kBAAS,EAAE,EAAC,GAAG,EAAH,YAAG,EAAE,IAAI,EAAE,IAAA,qBAAS,GAAE,CAAC,IAAI,IAAI,IAAI,EAAC,CAAC,CAAC;SAC7E,OAAO,CAAC,gBAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3B,IAAI,EAAE,WAAW,CAAC,gBAAQ,CAAC,IAAI,CAAC;QAChC,IAAI,EAAE,6BAAgB,CAAC,gBAAQ,CAAC,IAAI,CAAC;QACrC,MAAM,EAAE;YACJ,SAAS,EAAE,qBAAY,CAAC,gBAAQ,CAAC,IAAI,CAAC;SACzC;KACJ,CAAC,CAAC;SACF,OAAO,CAAC,gBAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,gBAAQ,CAAC,SAAS,CAAC;QACrC,IAAI,EAAE,6BAAgB,CAAC,gBAAQ,CAAC,SAAS,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,qBAAY,CAAC,gBAAQ,CAAC,SAAS,CAAC;SAC9C;KACJ,CAAC,CAAC;SACF,OAAO,CAAC,gBAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QAClC,IAAI,EAAE,WAAW,CAAC,gBAAQ,CAAC,WAAW,CAAC;QACvC,IAAI,EAAE,6BAAgB,CAAC,gBAAQ,CAAC,WAAW,CAAC;QAC5C,MAAM,EAAE;YACJ,SAAS,EAAE,qBAAY,CAAC,gBAAQ,CAAC,WAAW,CAAC;SAChD;KACJ,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AA1BW,QAAA,YAAY,gBA0BvB","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport yfmPlugin from '@diplodoc/transform/lib/plugins/notes/index.js';\nimport type {NodeSpec} from 'prosemirror-model';\n\nimport {getConfig} from 'src/configure';\nimport type {ExtensionAuto} from 'src/core';\n\nimport {NoteNode} from './const';\nimport {parserTokens} from './parser';\nimport {getSchemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {NoteNode as YfmNoteNode} from './const';\nexport {noteType, noteTitleType} from './utils';\n\nexport type YfmNoteSpecsOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n yfmNoteTitlePlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n};\n\nexport const YfmNoteSpecs: ExtensionAuto<YfmNoteSpecsOptions> = (builder, opts) => {\n const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));\n\n builder\n .configureMd((md) => md.use(yfmPlugin, {log, lang: getConfig().lang || 'en'}))\n .addNode(NoteNode.Note, () => ({\n spec: schemaSpecs[NoteNode.Note],\n toMd: serializerTokens[NoteNode.Note],\n fromMd: {\n tokenSpec: parserTokens[NoteNode.Note],\n },\n }))\n .addNode(NoteNode.NoteTitle, () => ({\n spec: schemaSpecs[NoteNode.NoteTitle],\n toMd: serializerTokens[NoteNode.NoteTitle],\n fromMd: {\n tokenSpec: parserTokens[NoteNode.NoteTitle],\n },\n }))\n .addNode(NoteNode.NoteContent, () => ({\n spec: schemaSpecs[NoteNode.NoteContent],\n toMd: serializerTokens[NoteNode.NoteContent],\n fromMd: {\n tokenSpec: parserTokens[NoteNode.NoteContent],\n },\n }));\n};\n"]}
@@ -1,6 +1,7 @@
1
+ import type { YfmTablePluginOptions } from '@diplodoc/transform/lib/plugins/table/types.js';
1
2
  import type { ExtensionWithOptions } from "../../../../core/index.js";
2
3
  import { type YfmTableSchemaOptions } from "./schema.js";
3
4
  export { YfmTableNode } from "./const.js";
4
5
  export { yfmTableType, yfmTableBodyType, yfmTableRowType, yfmTableCellType } from "./utils.js";
5
- export type YfmTableSpecsOptions = YfmTableSchemaOptions & {};
6
+ export type YfmTableSpecsOptions = YfmTableSchemaOptions & Pick<YfmTablePluginOptions, 'table_ignoreSplittersInBlockCode' | 'table_ignoreSplittersInBlockMath' | 'table_ignoreSplittersInInlineCode' | 'table_ignoreSplittersInInlineMath'> & {};
6
7
  export declare const YfmTableSpecs: ExtensionWithOptions<YfmTableSpecsOptions>;
@@ -17,8 +17,19 @@ Object.defineProperty(exports, "yfmTableRowType", { enumerable: true, get: funct
17
17
  Object.defineProperty(exports, "yfmTableCellType", { enumerable: true, get: function () { return utils_1.yfmTableCellType; } });
18
18
  const YfmTableSpecs = (builder, options) => {
19
19
  const schemaSpecs = (0, schema_1.getSchemaSpecs)(options, builder.context.get('placeholder'));
20
+ /* eslint-disable camelcase */
21
+ const { table_ignoreSplittersInBlockCode, table_ignoreSplittersInBlockMath, table_ignoreSplittersInInlineCode, table_ignoreSplittersInInlineMath, } = options;
22
+ /* eslint-enable camelcase */
20
23
  builder
21
- .configureMd((md) => md.use(index_js_1.default, { log: log_js_1.log }))
24
+ .configureMd((md) => md.use(index_js_1.default, {
25
+ log: log_js_1.log,
26
+ /* eslint-disable camelcase */
27
+ table_ignoreSplittersInBlockCode,
28
+ table_ignoreSplittersInBlockMath,
29
+ table_ignoreSplittersInInlineCode,
30
+ table_ignoreSplittersInInlineMath,
31
+ /* eslint-enable camelcase */
32
+ }))
22
33
  .addNode(const_1.YfmTableNode.Table, () => ({
23
34
  spec: schemaSpecs[const_1.YfmTableNode.Table],
24
35
  toMd: serializer_1.serializerTokens[const_1.YfmTableNode.Table],
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/YfmTableSpecs/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAmD;AACnD,sGAAsE;AAItE,sCAAqC;AACrC,wCAAsC;AACtC,wCAAoE;AACpE,gDAA8C;AAE9C,oCAAqC;AAA7B,qGAAA,YAAY,OAAA;AACpB,oCAA0F;AAAlF,qGAAA,YAAY,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAIlE,MAAM,aAAa,GAA+C,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1F,MAAM,WAAW,GAAG,IAAA,uBAAc,EAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAEhF,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAQ,EAAE,EAAC,GAAG,EAAH,YAAG,EAAC,CAAC,CAAC;SAC5C,OAAO,CAAC,oBAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,oBAAY,CAAC,KAAK,CAAC;QACrC,IAAI,EAAE,6BAAgB,CAAC,oBAAY,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAY,CAAC,oBAAY,CAAC,KAAK,CAAC,EAAC;KACxD,CAAC,CAAC;SACF,OAAO,CAAC,oBAAY,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,WAAW,CAAC,oBAAY,CAAC,IAAI,CAAC;QACpC,IAAI,EAAE,6BAAgB,CAAC,oBAAY,CAAC,IAAI,CAAC;QACzC,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAY,CAAC,oBAAY,CAAC,IAAI,CAAC,EAAC;KACvD,CAAC,CAAC;SACF,OAAO,CAAC,oBAAY,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,WAAW,CAAC,oBAAY,CAAC,GAAG,CAAC;QACnC,IAAI,EAAE,6BAAgB,CAAC,oBAAY,CAAC,GAAG,CAAC;QACxC,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAY,CAAC,oBAAY,CAAC,GAAG,CAAC,EAAC;KACtD,CAAC,CAAC;SACF,OAAO,CAAC,oBAAY,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,WAAW,CAAC,oBAAY,CAAC,IAAI,CAAC;QACpC,IAAI,EAAE,6BAAgB,CAAC,oBAAY,CAAC,IAAI,CAAC;QACzC,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAY,CAAC,oBAAY,CAAC,IAAI,CAAC,EAAC;KACvD,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAzBW,QAAA,aAAa,iBAyBxB","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport yfmTable from '@diplodoc/transform/lib/plugins/table/index.js';\n\nimport type {ExtensionWithOptions} from '../../../../core';\n\nimport {YfmTableNode} from './const';\nimport {parserTokens} from './parser';\nimport {type YfmTableSchemaOptions, getSchemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {YfmTableNode} from './const';\nexport {yfmTableType, yfmTableBodyType, yfmTableRowType, yfmTableCellType} from './utils';\n\nexport type YfmTableSpecsOptions = YfmTableSchemaOptions & {};\n\nexport const YfmTableSpecs: ExtensionWithOptions<YfmTableSpecsOptions> = (builder, options) => {\n const schemaSpecs = getSchemaSpecs(options, builder.context.get('placeholder'));\n\n builder\n .configureMd((md) => md.use(yfmTable, {log}))\n .addNode(YfmTableNode.Table, () => ({\n spec: schemaSpecs[YfmTableNode.Table],\n toMd: serializerTokens[YfmTableNode.Table],\n fromMd: {tokenSpec: parserTokens[YfmTableNode.Table]},\n }))\n .addNode(YfmTableNode.Body, () => ({\n spec: schemaSpecs[YfmTableNode.Body],\n toMd: serializerTokens[YfmTableNode.Body],\n fromMd: {tokenSpec: parserTokens[YfmTableNode.Body]},\n }))\n .addNode(YfmTableNode.Row, () => ({\n spec: schemaSpecs[YfmTableNode.Row],\n toMd: serializerTokens[YfmTableNode.Row],\n fromMd: {tokenSpec: parserTokens[YfmTableNode.Row]},\n }))\n .addNode(YfmTableNode.Cell, () => ({\n spec: schemaSpecs[YfmTableNode.Cell],\n toMd: serializerTokens[YfmTableNode.Cell],\n fromMd: {tokenSpec: parserTokens[YfmTableNode.Cell]},\n }));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/YfmTableSpecs/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAmD;AACnD,sGAAsE;AAKtE,sCAAqC;AACrC,wCAAsC;AACtC,wCAAoE;AACpE,gDAA8C;AAE9C,oCAAqC;AAA7B,qGAAA,YAAY,OAAA;AACpB,oCAA0F;AAAlF,qGAAA,YAAY,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAWlE,MAAM,aAAa,GAA+C,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1F,MAAM,WAAW,GAAG,IAAA,uBAAc,EAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAEhF,8BAA8B;IAC9B,MAAM,EACF,gCAAgC,EAChC,gCAAgC,EAChC,iCAAiC,EACjC,iCAAiC,GACpC,GAAG,OAAO,CAAC;IACZ,6BAA6B;IAE7B,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE,CAAC,GAAG,CAAC,kBAAQ,EAAE;QACb,GAAG,EAAH,YAAG;QACH,8BAA8B;QAC9B,gCAAgC;QAChC,gCAAgC;QAChC,iCAAiC;QACjC,iCAAiC;QACjC,6BAA6B;KAChC,CAAC,CACL;SACA,OAAO,CAAC,oBAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,oBAAY,CAAC,KAAK,CAAC;QACrC,IAAI,EAAE,6BAAgB,CAAC,oBAAY,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAY,CAAC,oBAAY,CAAC,KAAK,CAAC,EAAC;KACxD,CAAC,CAAC;SACF,OAAO,CAAC,oBAAY,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,WAAW,CAAC,oBAAY,CAAC,IAAI,CAAC;QACpC,IAAI,EAAE,6BAAgB,CAAC,oBAAY,CAAC,IAAI,CAAC;QACzC,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAY,CAAC,oBAAY,CAAC,IAAI,CAAC,EAAC;KACvD,CAAC,CAAC;SACF,OAAO,CAAC,oBAAY,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,WAAW,CAAC,oBAAY,CAAC,GAAG,CAAC;QACnC,IAAI,EAAE,6BAAgB,CAAC,oBAAY,CAAC,GAAG,CAAC;QACxC,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAY,CAAC,oBAAY,CAAC,GAAG,CAAC,EAAC;KACtD,CAAC,CAAC;SACF,OAAO,CAAC,oBAAY,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,WAAW,CAAC,oBAAY,CAAC,IAAI,CAAC;QACpC,IAAI,EAAE,6BAAgB,CAAC,oBAAY,CAAC,IAAI,CAAC;QACzC,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAY,CAAC,oBAAY,CAAC,IAAI,CAAC,EAAC;KACvD,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AA5CW,QAAA,aAAa,iBA4CxB","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport yfmTable from '@diplodoc/transform/lib/plugins/table/index.js';\nimport type {YfmTablePluginOptions} from '@diplodoc/transform/lib/plugins/table/types.js';\n\nimport type {ExtensionWithOptions} from '../../../../core';\n\nimport {YfmTableNode} from './const';\nimport {parserTokens} from './parser';\nimport {type YfmTableSchemaOptions, getSchemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {YfmTableNode} from './const';\nexport {yfmTableType, yfmTableBodyType, yfmTableRowType, yfmTableCellType} from './utils';\n\nexport type YfmTableSpecsOptions = YfmTableSchemaOptions &\n Pick<\n YfmTablePluginOptions,\n | 'table_ignoreSplittersInBlockCode'\n | 'table_ignoreSplittersInBlockMath'\n | 'table_ignoreSplittersInInlineCode'\n | 'table_ignoreSplittersInInlineMath'\n > & {};\n\nexport const YfmTableSpecs: ExtensionWithOptions<YfmTableSpecsOptions> = (builder, options) => {\n const schemaSpecs = getSchemaSpecs(options, builder.context.get('placeholder'));\n\n /* eslint-disable camelcase */\n const {\n table_ignoreSplittersInBlockCode,\n table_ignoreSplittersInBlockMath,\n table_ignoreSplittersInInlineCode,\n table_ignoreSplittersInInlineMath,\n } = options;\n /* eslint-enable camelcase */\n\n builder\n .configureMd((md) =>\n md.use(yfmTable, {\n log,\n /* eslint-disable camelcase */\n table_ignoreSplittersInBlockCode,\n table_ignoreSplittersInBlockMath,\n table_ignoreSplittersInInlineCode,\n table_ignoreSplittersInInlineMath,\n /* eslint-enable camelcase */\n }),\n )\n .addNode(YfmTableNode.Table, () => ({\n spec: schemaSpecs[YfmTableNode.Table],\n toMd: serializerTokens[YfmTableNode.Table],\n fromMd: {tokenSpec: parserTokens[YfmTableNode.Table]},\n }))\n .addNode(YfmTableNode.Body, () => ({\n spec: schemaSpecs[YfmTableNode.Body],\n toMd: serializerTokens[YfmTableNode.Body],\n fromMd: {tokenSpec: parserTokens[YfmTableNode.Body]},\n }))\n .addNode(YfmTableNode.Row, () => ({\n spec: schemaSpecs[YfmTableNode.Row],\n toMd: serializerTokens[YfmTableNode.Row],\n fromMd: {tokenSpec: parserTokens[YfmTableNode.Row]},\n }))\n .addNode(YfmTableNode.Cell, () => ({\n spec: schemaSpecs[YfmTableNode.Cell],\n toMd: serializerTokens[YfmTableNode.Cell],\n fromMd: {tokenSpec: parserTokens[YfmTableNode.Cell]},\n }));\n};\n"]}
@@ -9,5 +9,6 @@ export type FileFormProps = ClassNameProps & {
9
9
  onCancel(): void;
10
10
  onAttach?: (files: File[]) => void;
11
11
  loading?: boolean;
12
+ uploadHint?: string;
12
13
  };
13
14
  export declare const FileForm: React.FC<FileFormProps>;
@@ -19,7 +19,7 @@ var TabId;
19
19
  TabId["Attach"] = "attach";
20
20
  TabId["Link"] = "link";
21
21
  })(TabId || (TabId = {}));
22
- const FileForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, }) => {
22
+ const FileForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, uploadHint, }) => {
23
23
  const [tabId, setTabId] = (0, react_1.useState)(() => (0, lodash_1.isFunction)(onAttach) ? TabId.Attach : TabId.Link);
24
24
  const [src, setSrc] = (0, react_1.useState)('');
25
25
  const [name, setName] = (0, react_1.useState)('');
@@ -39,7 +39,7 @@ const FileForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading,
39
39
  return ((0, jsx_runtime_1.jsxs)(base_1.default.Form, { className: b(null, [className]), children: [shouldRenderTabs && ((0, jsx_runtime_1.jsx)(legacy_1.Tabs, { activeTab: tabId, onSelectTab: setTabId, items: [
40
40
  { id: TabId.Attach, title: (0, forms_1.i18n)('common_tab_attach') },
41
41
  { id: TabId.Link, title: (0, forms_1.i18n)('common_tab_link') },
42
- ] })), tabId === TabId.Attach && onAttach && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Layout, { children: (0, forms_1.i18n)('file_upload_help') }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, children: (0, jsx_runtime_1.jsx)(components_1.ButtonAttach, { multiple: true, buttonProps: {
42
+ ] })), tabId === TabId.Attach && onAttach && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Layout, { children: uploadHint ?? (0, forms_1.i18n)('file_upload_help') }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, children: (0, jsx_runtime_1.jsx)(components_1.ButtonAttach, { multiple: true, buttonProps: {
43
43
  size: 's',
44
44
  view: 'action',
45
45
  loading,
@@ -1 +1 @@
1
- {"version":3,"file":"FileForm.js","sourceRoot":"../../../src","sources":["forms/FileForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach} from './components';\n\nconst b = cn('file-form');\n\nconst enum TabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type FileFormSubmitParams = {\n src: string;\n name: string;\n};\n\nexport type FileFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: FileFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n};\n\nexport const FileForm: React.FC<FileFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? TabId.Attach : TabId.Link,\n );\n const [src, setSrc] = useState('');\n const [name, setName] = useState('');\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === TabId.Attach) {\n setTabId(TabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n onSubmit({\n src: src.trim(),\n name: name.trim(),\n });\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: TabId.Attach, title: i18n('common_tab_attach')},\n {id: TabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === TabId.Attach && onAttach && (\n <>\n <Form.Layout>{i18n('file_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n buttonProps={{\n size: 's',\n view: 'action',\n loading,\n }}\n onUpdate={onAttach}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === TabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n help={i18n('file_link_help')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={src}\n onUpdate={setSrc}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('file_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\n );\n};\n"]}
1
+ {"version":3,"file":"FileForm.js","sourceRoot":"../../../src","sources":["forms/FileForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach} from './components';\n\nconst b = cn('file-form');\n\nconst enum TabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type FileFormSubmitParams = {\n src: string;\n name: string;\n};\n\nexport type FileFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: FileFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n uploadHint?: string;\n};\n\nexport const FileForm: React.FC<FileFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n uploadHint,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? TabId.Attach : TabId.Link,\n );\n const [src, setSrc] = useState('');\n const [name, setName] = useState('');\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === TabId.Attach) {\n setTabId(TabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n onSubmit({\n src: src.trim(),\n name: name.trim(),\n });\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: TabId.Attach, title: i18n('common_tab_attach')},\n {id: TabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === TabId.Attach && onAttach && (\n <>\n <Form.Layout>{uploadHint ?? i18n('file_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n buttonProps={{\n size: 's',\n view: 'action',\n loading,\n }}\n onUpdate={onAttach}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === TabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n help={i18n('file_link_help')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={src}\n onUpdate={setSrc}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('file_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\n );\n};\n"]}
@@ -14,5 +14,6 @@ export type ImageFormProps = ClassNameProps & {
14
14
  onAttach?: (files: File[]) => void;
15
15
  loading?: boolean;
16
16
  imageTitle?: string;
17
+ uploadHint?: string;
17
18
  };
18
19
  export declare const ImageForm: React.FC<ImageFormProps>;
@@ -20,7 +20,7 @@ var ImageTabId;
20
20
  ImageTabId["Attach"] = "attach";
21
21
  ImageTabId["Link"] = "link";
22
22
  })(ImageTabId || (ImageTabId = {}));
23
- const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, imageTitle: providedName, }) => {
23
+ const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, imageTitle: providedName, uploadHint, }) => {
24
24
  const [tabId, setTabId] = (0, react_1.useState)(() => (0, lodash_1.isFunction)(onAttach) ? ImageTabId.Attach : ImageTabId.Link);
25
25
  const [url, setUrl] = (0, react_1.useState)('');
26
26
  const [name, setName] = (0, react_1.useState)(providedName ?? '');
@@ -49,7 +49,7 @@ const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading
49
49
  return ((0, jsx_runtime_1.jsxs)(base_1.default.Form, { className: b(null, [className]), children: [shouldRenderTabs && ((0, jsx_runtime_1.jsx)(legacy_1.Tabs, { activeTab: tabId, onSelectTab: setTabId, items: [
50
50
  { id: ImageTabId.Attach, title: (0, forms_1.i18n)('common_tab_attach') },
51
51
  { id: ImageTabId.Link, title: (0, forms_1.i18n)('common_tab_link') },
52
- ] })), tabId === ImageTabId.Attach && onAttach && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Layout, { children: (0, forms_1.i18n)('image_upload_help') }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, children: (0, jsx_runtime_1.jsx)(components_1.ButtonAttach, { multiple: true, accept: "image/*", onUpdate: onAttach, buttonProps: { size: 's', view: 'action', loading }, children: (0, forms_1.i18n)('common_action_upload') }) })] })), tabId === ImageTabId.Link && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(base_1.default.Layout, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('common_link'), control: (0, jsx_runtime_1.jsx)(TextInput_1.TextInputFixed, { size: "s", view: "normal", value: url, onUpdate: setUrl, placeholder: "https://", autoFocus: autoFocus, className: b('input', { type: 'link' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('image_name'), control: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { size: "s", view: "normal", value: name, onUpdate: setName, className: b('input', { type: 'name' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('image_alt'), help: (0, forms_1.i18n)('image_alt_help'), control: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { size: "s", view: "normal", value: alt, onUpdate: setAlt, className: b('input', { type: 'alt' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('common_sizes'), control: (0, jsx_runtime_1.jsxs)("div", { className: b('size-controls'), children: [(0, jsx_runtime_1.jsx)(components_1.NumberInput, { min: 0, size: "s", view: "normal", value: width, onUpdate: setWidth, placeholder: (0, forms_1.i18n)('image_size_width'), className: b('input', { type: 'width' }), onKeyDown: inputEnterKeyHandler }), "x", (0, jsx_runtime_1.jsx)(components_1.NumberInput, { min: 0, size: "s", view: "normal", value: height, onUpdate: setHeight, placeholder: (0, forms_1.i18n)('image_size_height'), className: b('input', { type: 'height' }), onKeyDown: inputEnterKeyHandler })] }) })] }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, onSubmit: handleSubmit })] }))] }));
52
+ ] })), tabId === ImageTabId.Attach && onAttach && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Layout, { children: uploadHint ?? (0, forms_1.i18n)('image_upload_help') }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, children: (0, jsx_runtime_1.jsx)(components_1.ButtonAttach, { multiple: true, accept: "image/*", onUpdate: onAttach, buttonProps: { size: 's', view: 'action', loading }, children: (0, forms_1.i18n)('common_action_upload') }) })] })), tabId === ImageTabId.Link && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(base_1.default.Layout, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('common_link'), control: (0, jsx_runtime_1.jsx)(TextInput_1.TextInputFixed, { size: "s", view: "normal", value: url, onUpdate: setUrl, placeholder: "https://", autoFocus: autoFocus, className: b('input', { type: 'link' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('image_name'), control: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { size: "s", view: "normal", value: name, onUpdate: setName, className: b('input', { type: 'name' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('image_alt'), help: (0, forms_1.i18n)('image_alt_help'), control: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { size: "s", view: "normal", value: alt, onUpdate: setAlt, className: b('input', { type: 'alt' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('common_sizes'), control: (0, jsx_runtime_1.jsxs)("div", { className: b('size-controls'), children: [(0, jsx_runtime_1.jsx)(components_1.NumberInput, { min: 0, size: "s", view: "normal", value: width, onUpdate: setWidth, placeholder: (0, forms_1.i18n)('image_size_width'), className: b('input', { type: 'width' }), onKeyDown: inputEnterKeyHandler }), "x", (0, jsx_runtime_1.jsx)(components_1.NumberInput, { min: 0, size: "s", view: "normal", value: height, onUpdate: setHeight, placeholder: (0, forms_1.i18n)('image_size_height'), className: b('input', { type: 'height' }), onKeyDown: inputEnterKeyHandler })] }) })] }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, onSubmit: handleSubmit })] }))] }));
53
53
  };
54
54
  exports.ImageForm = ImageForm;
55
55
  //# sourceMappingURL=ImageForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageForm.js","sourceRoot":"../../../src","sources":["forms/ImageForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach, NumberInput} from './components';\n\nimport './ImageForm.scss';\n\nconst b = cn('image-form');\n\nconst enum ImageTabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type ImageFormSubmitParams = {\n url: string;\n name: string;\n alt: string;\n width?: number;\n height?: number;\n};\n\nexport type ImageFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: ImageFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n imageTitle?: string;\n};\n\nexport const ImageForm: React.FC<ImageFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n imageTitle: providedName,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? ImageTabId.Attach : ImageTabId.Link,\n );\n const [url, setUrl] = useState('');\n const [name, setName] = useState(providedName ?? '');\n const [alt, setAlt] = useState('');\n const [width, setWidth] = useState<number | undefined>();\n const [height, setHeight] = useState<number | undefined>();\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === ImageTabId.Attach) {\n setTabId(ImageTabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n const data: ImageFormSubmitParams = {\n url: url.trim(),\n name: name.trim(),\n alt: alt.trim(),\n };\n if (typeof width === 'number' && width >= 0) data.width = width;\n if (typeof height === 'number' && height >= 0) data.height = height;\n onSubmit(data);\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: ImageTabId.Attach, title: i18n('common_tab_attach')},\n {id: ImageTabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === ImageTabId.Attach && onAttach && (\n <>\n <Form.Layout>{i18n('image_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n accept=\"image/*\"\n onUpdate={onAttach}\n buttonProps={{size: 's', view: 'action', loading}}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === ImageTabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={url}\n onUpdate={setUrl}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_alt')}\n help={i18n('image_alt_help')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={alt}\n onUpdate={setAlt}\n className={b('input', {type: 'alt'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('common_sizes')}\n control={\n <div className={b('size-controls')}>\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={width}\n onUpdate={setWidth}\n placeholder={i18n('image_size_width')}\n className={b('input', {type: 'width'})}\n onKeyDown={inputEnterKeyHandler}\n />\n x\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={height}\n onUpdate={setHeight}\n placeholder={i18n('image_size_height')}\n className={b('input', {type: 'height'})}\n onKeyDown={inputEnterKeyHandler}\n />\n </div>\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\n );\n};\n"]}
1
+ {"version":3,"file":"ImageForm.js","sourceRoot":"../../../src","sources":["forms/ImageForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach, NumberInput} from './components';\n\nimport './ImageForm.scss';\n\nconst b = cn('image-form');\n\nconst enum ImageTabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type ImageFormSubmitParams = {\n url: string;\n name: string;\n alt: string;\n width?: number;\n height?: number;\n};\n\nexport type ImageFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: ImageFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n imageTitle?: string;\n uploadHint?: string;\n};\n\nexport const ImageForm: React.FC<ImageFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n imageTitle: providedName,\n uploadHint,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? ImageTabId.Attach : ImageTabId.Link,\n );\n const [url, setUrl] = useState('');\n const [name, setName] = useState(providedName ?? '');\n const [alt, setAlt] = useState('');\n const [width, setWidth] = useState<number | undefined>();\n const [height, setHeight] = useState<number | undefined>();\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === ImageTabId.Attach) {\n setTabId(ImageTabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n const data: ImageFormSubmitParams = {\n url: url.trim(),\n name: name.trim(),\n alt: alt.trim(),\n };\n if (typeof width === 'number' && width >= 0) data.width = width;\n if (typeof height === 'number' && height >= 0) data.height = height;\n onSubmit(data);\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: ImageTabId.Attach, title: i18n('common_tab_attach')},\n {id: ImageTabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === ImageTabId.Attach && onAttach && (\n <>\n <Form.Layout>{uploadHint ?? i18n('image_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n accept=\"image/*\"\n onUpdate={onAttach}\n buttonProps={{size: 's', view: 'action', loading}}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === ImageTabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={url}\n onUpdate={setUrl}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_alt')}\n help={i18n('image_alt_help')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={alt}\n onUpdate={setAlt}\n className={b('input', {type: 'alt'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('common_sizes')}\n control={\n <div className={b('size-controls')}>\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={width}\n onUpdate={setWidth}\n placeholder={i18n('image_size_width')}\n className={b('input', {type: 'width'})}\n onKeyDown={inputEnterKeyHandler}\n />\n x\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={height}\n onUpdate={setHeight}\n placeholder={i18n('image_size_height')}\n className={b('input', {type: 'height'})}\n onKeyDown={inputEnterKeyHandler}\n />\n </div>\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\n );\n};\n"]}
@@ -33,5 +33,5 @@ exports.TextAreaFixed = (0, react_1.forwardRef)((props, ref) => {
33
33
  });
34
34
  return (0, jsx_runtime_1.jsx)(uikit_1.TextArea, { ref: ref, ...props, controlRef: controlRef, autoFocus: false });
35
35
  });
36
- exports.TextAreaFixed.displayName = 'TextInputFixed';
36
+ exports.TextAreaFixed.displayName = 'TextAreaFixed';
37
37
  //# sourceMappingURL=TextInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput.js","sourceRoot":"../../../src","sources":["forms/TextInput.tsx"],"names":[],"mappings":";;;;AAAA,iCAAyC;AAEzC,6CAK2B;AAC3B,yCAAwC;AAExC,0EAA0E;AAC7D,QAAA,cAAc,GAAG,IAAA,kBAAU,EAAkC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACrF,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,UAAU,GAAI,KAAK,CAAC,UAAgD,IAAI,QAAQ,CAAC;IAEvF,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,UAAU,CAAC,GAAG,EAAE;gBACZ,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAChC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,OAAO,uBAAC,iBAAc,IAAC,GAAG,EAAE,GAAG,KAAM,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,GAAI,CAAC;AAC7F,CAAC,CAAC,CAAC;AAEH,sBAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC;AAE9C,0EAA0E;AAC7D,QAAA,aAAa,GAAG,IAAA,kBAAU,EAAiC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACnF,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAsB,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAI,KAAK,CAAC,UAAmD,IAAI,QAAQ,CAAC;IAE1F,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,UAAU,CAAC,GAAG,EAAE;gBACZ,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAChC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,uBAAC,gBAAa,IAAC,GAAG,EAAE,GAAG,KAAM,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,GAAI,CAAC;AAC5F,CAAC,CAAC,CAAC;AAEH,qBAAa,CAAC,WAAW,GAAG,gBAAgB,CAAC","sourcesContent":["import {forwardRef, useRef} from 'react';\n\nimport {\n type TextAreaProps,\n TextArea as TextAreaUIKit,\n type TextInputProps,\n TextInput as TextInputUIKit,\n} from '@gravity-ui/uikit';\nimport {useEffectOnce} from 'react-use';\n\n// TODO: remove after fix https://github.com/yandex-cloud/uikit/issues/133\nexport const TextInputFixed = forwardRef<HTMLSpanElement, TextInputProps>((props, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const controlRef = (props.controlRef as React.RefObject<HTMLInputElement>) ?? inputRef;\n\n useEffectOnce(() => {\n if (props.autoFocus) {\n setTimeout(() => {\n controlRef.current?.focus();\n }, 30);\n }\n });\n\n // eslint-disable-next-line jsx-a11y/no-autofocus\n return <TextInputUIKit ref={ref} {...props} controlRef={controlRef} autoFocus={false} />;\n});\n\nTextInputFixed.displayName = 'TextInputFixed';\n\n// TODO: remove after fix https://github.com/yandex-cloud/uikit/issues/133\nexport const TextAreaFixed = forwardRef<HTMLSpanElement, TextAreaProps>((props, ref) => {\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const controlRef = (props.controlRef as React.RefObject<HTMLTextAreaElement>) ?? inputRef;\n\n useEffectOnce(() => {\n if (props.autoFocus) {\n setTimeout(() => {\n controlRef.current?.focus();\n }, 30);\n }\n });\n\n return <TextAreaUIKit ref={ref} {...props} controlRef={controlRef} autoFocus={false} />;\n});\n\nTextAreaFixed.displayName = 'TextInputFixed';\n"]}
1
+ {"version":3,"file":"TextInput.js","sourceRoot":"../../../src","sources":["forms/TextInput.tsx"],"names":[],"mappings":";;;;AAAA,iCAAyC;AAEzC,6CAK2B;AAC3B,yCAAwC;AAExC,0EAA0E;AAC7D,QAAA,cAAc,GAAG,IAAA,kBAAU,EAAkC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACrF,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,UAAU,GAAI,KAAK,CAAC,UAAgD,IAAI,QAAQ,CAAC;IAEvF,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,UAAU,CAAC,GAAG,EAAE;gBACZ,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAChC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,OAAO,uBAAC,iBAAc,IAAC,GAAG,EAAE,GAAG,KAAM,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,GAAI,CAAC;AAC7F,CAAC,CAAC,CAAC;AAEH,sBAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC;AAE9C,0EAA0E;AAC7D,QAAA,aAAa,GAAG,IAAA,kBAAU,EAAiC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACnF,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAsB,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAI,KAAK,CAAC,UAAmD,IAAI,QAAQ,CAAC;IAE1F,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,UAAU,CAAC,GAAG,EAAE;gBACZ,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAChC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,uBAAC,gBAAa,IAAC,GAAG,EAAE,GAAG,KAAM,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,GAAI,CAAC;AAC5F,CAAC,CAAC,CAAC;AAEH,qBAAa,CAAC,WAAW,GAAG,eAAe,CAAC","sourcesContent":["import {forwardRef, useRef} from 'react';\n\nimport {\n type TextAreaProps,\n TextArea as TextAreaUIKit,\n type TextInputProps,\n TextInput as TextInputUIKit,\n} from '@gravity-ui/uikit';\nimport {useEffectOnce} from 'react-use';\n\n// TODO: remove after fix https://github.com/yandex-cloud/uikit/issues/133\nexport const TextInputFixed = forwardRef<HTMLSpanElement, TextInputProps>((props, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const controlRef = (props.controlRef as React.RefObject<HTMLInputElement>) ?? inputRef;\n\n useEffectOnce(() => {\n if (props.autoFocus) {\n setTimeout(() => {\n controlRef.current?.focus();\n }, 30);\n }\n });\n\n // eslint-disable-next-line jsx-a11y/no-autofocus\n return <TextInputUIKit ref={ref} {...props} controlRef={controlRef} autoFocus={false} />;\n});\n\nTextInputFixed.displayName = 'TextInputFixed';\n\n// TODO: remove after fix https://github.com/yandex-cloud/uikit/issues/133\nexport const TextAreaFixed = forwardRef<HTMLSpanElement, TextAreaProps>((props, ref) => {\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const controlRef = (props.controlRef as React.RefObject<HTMLTextAreaElement>) ?? inputRef;\n\n useEffectOnce(() => {\n if (props.autoFocus) {\n setTimeout(() => {\n controlRef.current?.focus();\n }, 30);\n }\n });\n\n return <TextAreaUIKit ref={ref} {...props} controlRef={controlRef} autoFocus={false} />;\n});\n\nTextAreaFixed.displayName = 'TextAreaFixed';\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '15.14.2' !== 'undefined' ? '15.14.2' : 'unknown';
5
+ exports.VERSION = typeof '15.16.0' !== 'undefined' ? '15.16.0' : 'unknown';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.14.2' !== 'undefined' ? '15.14.2' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.16.0' !== 'undefined' ? '15.16.0' : 'unknown';\n"]}
@@ -13,7 +13,7 @@ export function createDynamicModifiers(markupManager) {
13
13
  */
14
14
  process: (token, _, rawMarkup) => {
15
15
  const { map } = token;
16
- if (map) {
16
+ if (map && rawMarkup !== null) {
17
17
  const content = rawMarkup.split('\n').slice(map[0], map[1]).join('\n').trim();
18
18
  const tokenId = v5(content, markupManager.getNamespace());
19
19
  if (/^\s*#\|/.test(content)) {
@@ -1 +1 @@
1
- {"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":"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","sourcesContent":["import dedent from 'ts-dedent';\nimport {v5} from 'uuid';\n\nimport type {DynamicModifiers} from '../../core/types/dynamicModifiers';\nimport type {MarkupManager} from '../MarkupManager';\n\nconst YFM_TABLE_TOKEN_ATTR = 'data-token-id';\nconst YFM_TABLE_NODE_ATTR = 'data-node-id';\n\nexport function createDynamicModifiers(markupManager: MarkupManager): DynamicModifiers[] {\n return [\n {\n type: 'parserToken',\n tokenName: 'yfm_table',\n /**\n * - Assigns a unique `data-token-id` to each token.\n * - Captures and stores the raw Markdown using `MarkupManager`.\n */\n process: (token, _, rawMarkup) => {\n const {map} = token;\n\n if (map) {\n const content = rawMarkup.split('\\n').slice(map[0], map[1]).join('\\n').trim();\n const tokenId = v5(content, markupManager.getNamespace());\n\n if (/^\\s*#\\|/.test(content)) {\n token.attrSet(YFM_TABLE_TOKEN_ATTR, tokenId);\n markupManager.setMarkup(tokenId, dedent(content));\n }\n }\n return token;\n },\n },\n {\n type: 'parserNodeAttrs',\n tokenName: 'yfm_table',\n /**\n * - Links the token to its corresponding node via `data-node-id`.\n */\n process: (token, attrs) => ({\n ...attrs,\n [YFM_TABLE_NODE_ATTR]: token.attrGet(YFM_TABLE_TOKEN_ATTR),\n }),\n },\n {\n type: 'parserNode',\n nodeName: 'yfm_table',\n process: (node) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n if (nodeId) {\n markupManager.setNode(nodeId, node);\n }\n return node;\n },\n },\n {\n type: 'serializerNode',\n nodeName: 'yfm_table',\n /**\n * - Retrieves the original Markdown using the `data-node-id` attribute.\n * - Uses the original Markdown if the node matches the saved version.\n * - Falls back to schema-based rendering if the node structure, attributes, or parent elements affect it.\n */\n process: (state, node, parent, index, callback) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n const savedNode = markupManager.getNode(nodeId);\n\n if (savedNode?.eq(node)) {\n const content: string = markupManager.getMarkup(nodeId) || '';\n state.ensureNewLine();\n state.text(content, false);\n state.ensureNewLine();\n state.closeBlock();\n state.write('\\n');\n return;\n }\n\n callback?.(state, node, parent, index);\n },\n },\n {\n type: 'schemaNodeSpec',\n nodeName: 'yfm_table',\n /**\n * - Adds the `data-node-id` attribute to the list of allowed attributes.\n */\n allowedAttrs: [YFM_TABLE_NODE_ATTR],\n },\n ];\n}\n"]}
1
+ {"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":"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","sourcesContent":["import dedent from 'ts-dedent';\nimport {v5} from 'uuid';\n\nimport type {DynamicModifiers} from '../../core/types/dynamicModifiers';\nimport type {MarkupManager} from '../MarkupManager';\n\nconst YFM_TABLE_TOKEN_ATTR = 'data-token-id';\nconst YFM_TABLE_NODE_ATTR = 'data-node-id';\n\nexport function createDynamicModifiers(markupManager: MarkupManager): DynamicModifiers[] {\n return [\n {\n type: 'parserToken',\n tokenName: 'yfm_table',\n /**\n * - Assigns a unique `data-token-id` to each token.\n * - Captures and stores the raw Markdown using `MarkupManager`.\n */\n process: (token, _, rawMarkup) => {\n const {map} = token;\n\n if (map && rawMarkup !== null) {\n const content = rawMarkup.split('\\n').slice(map[0], map[1]).join('\\n').trim();\n const tokenId = v5(content, markupManager.getNamespace());\n\n if (/^\\s*#\\|/.test(content)) {\n token.attrSet(YFM_TABLE_TOKEN_ATTR, tokenId);\n markupManager.setMarkup(tokenId, dedent(content));\n }\n }\n return token;\n },\n },\n {\n type: 'parserNodeAttrs',\n tokenName: 'yfm_table',\n /**\n * - Links the token to its corresponding node via `data-node-id`.\n */\n process: (token, attrs) => ({\n ...attrs,\n [YFM_TABLE_NODE_ATTR]: token.attrGet(YFM_TABLE_TOKEN_ATTR),\n }),\n },\n {\n type: 'parserNode',\n nodeName: 'yfm_table',\n process: (node) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n if (nodeId) {\n markupManager.setNode(nodeId, node);\n }\n return node;\n },\n },\n {\n type: 'serializerNode',\n nodeName: 'yfm_table',\n /**\n * - Retrieves the original Markdown using the `data-node-id` attribute.\n * - Uses the original Markdown if the node matches the saved version.\n * - Falls back to schema-based rendering if the node structure, attributes, or parent elements affect it.\n */\n process: (state, node, parent, index, callback) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n const savedNode = markupManager.getNode(nodeId);\n\n if (savedNode?.eq(node)) {\n const content: string = markupManager.getMarkup(nodeId) || '';\n state.ensureNewLine();\n state.text(content, false);\n state.ensureNewLine();\n state.closeBlock();\n state.write('\\n');\n return;\n }\n\n callback?.(state, node, parent, index);\n },\n },\n {\n type: 'schemaNodeSpec',\n nodeName: 'yfm_table',\n /**\n * - Adds the `data-node-id` attribute to the list of allowed attributes.\n */\n allowedAttrs: [YFM_TABLE_NODE_ATTR],\n },\n ];\n}\n"]}
@@ -6,5 +6,5 @@ export type ToolbarFilePopupProps = Omit<ToolbarBaseProps<never>, 'editor'> & {
6
6
  anchorElement: HTMLElement | null;
7
7
  uploadHandler?: FileUploadHandler;
8
8
  onSuccessUpload?: (result: BatchUploadResult) => void;
9
- } & Pick<FileFormProps, 'onSubmit'>;
9
+ } & Pick<FileFormProps, 'onSubmit' | 'uploadHint'>;
10
10
  export declare const ToolbarFilePopup: React.FC<ToolbarFilePopupProps>;
@@ -6,7 +6,7 @@ import { i18n } from "../../../i18n/forms/index.js";
6
6
  import { useBooleanState } from "../../../react-utils/hooks.js";
7
7
  import { batchUploadFiles, } from "../../../utils/upload.js";
8
8
  const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
9
- export const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, focus, onClick, uploadHandler, onSuccessUpload, }) => {
9
+ export const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, focus, onClick, uploadHandler, onSuccessUpload, uploadHint, }) => {
10
10
  const toaster = useToaster();
11
11
  const [loading, showLoading, hideLoading] = useBooleanState(false);
12
12
  const handleCancel = useCallback(() => {
@@ -34,6 +34,6 @@ export const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, foc
34
34
  focus();
35
35
  onSubmit(data);
36
36
  onClick?.('addFile');
37
- }, loading: loading }) }));
37
+ }, loading: loading, uploadHint: uploadHint }) }));
38
38
  };
39
39
  //# sourceMappingURL=ToolbarFilePopup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarFilePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarFilePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,QAAQ,EAAqB,mCAAgC;AACrE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAUzF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,SAAS,EACT,IAAI,EACJ,aAAa,EAEb,QAAQ,EACR,KAAK,EACL,OAAO,EACP,aAAa,EACb,eAAe,GAClB,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,KAAK,QACL,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,QAAQ,IACL,SAAS,QACT,QAAQ,EACJ,aAAa;gBACb,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,IAAI,CACvC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;wBACN,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC;4BACjC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;yBACzB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC,EACD,OAAO,EAAE,OAAO,GAClB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {FileForm, type FileFormProps} from '../../../forms/FileForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarFilePopupProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n hide: () => void;\n anchorElement: HTMLElement | null;\n\n uploadHandler?: FileUploadHandler;\n onSuccessUpload?: (result: BatchUploadResult) => void;\n} & Pick<FileFormProps, 'onSubmit'>;\n\nexport const ToolbarFilePopup: React.FC<ToolbarFilePopupProps> = ({\n className,\n hide,\n anchorElement,\n\n onSubmit,\n focus,\n onClick,\n uploadHandler,\n onSuccessUpload,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n modal\n onOpenChange={handleCancel}\n anchorElement={anchorElement}\n placement={placement}\n className={className}\n >\n <FileForm\n autoFocus\n onAttach={\n uploadHandler &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadHandler).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (error) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_file_upload',\n title: i18n('file_upload_failed'),\n content: String(error),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addFile');\n }}\n loading={loading}\n />\n </Popup>\n );\n};\n"]}
1
+ {"version":3,"file":"ToolbarFilePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarFilePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,QAAQ,EAAqB,mCAAgC;AACrE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAUzF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,SAAS,EACT,IAAI,EACJ,aAAa,EAEb,QAAQ,EACR,KAAK,EACL,OAAO,EACP,aAAa,EACb,eAAe,EACf,UAAU,GACb,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,KAAK,QACL,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,QAAQ,IACL,SAAS,QACT,QAAQ,EACJ,aAAa;gBACb,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,IAAI,CACvC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;wBACN,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC;4BACjC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;yBACzB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC,EACD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACxB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {FileForm, type FileFormProps} from '../../../forms/FileForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarFilePopupProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n hide: () => void;\n anchorElement: HTMLElement | null;\n\n uploadHandler?: FileUploadHandler;\n onSuccessUpload?: (result: BatchUploadResult) => void;\n} & Pick<FileFormProps, 'onSubmit' | 'uploadHint'>;\n\nexport const ToolbarFilePopup: React.FC<ToolbarFilePopupProps> = ({\n className,\n hide,\n anchorElement,\n\n onSubmit,\n focus,\n onClick,\n uploadHandler,\n onSuccessUpload,\n uploadHint,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n modal\n onOpenChange={handleCancel}\n anchorElement={anchorElement}\n placement={placement}\n className={className}\n >\n <FileForm\n autoFocus\n onAttach={\n uploadHandler &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadHandler).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (error) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_file_upload',\n title: i18n('file_upload_failed'),\n content: String(error),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addFile');\n }}\n loading={loading}\n uploadHint={uploadHint}\n />\n </Popup>\n );\n};\n"]}
@@ -6,5 +6,5 @@ export type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {
6
6
  onSuccessUpload?: (res: BatchUploadResult) => void;
7
7
  hide: () => void;
8
8
  anchorElement: HTMLElement | null;
9
- } & Pick<ImageFormProps, 'onSubmit' | 'imageTitle'>;
9
+ } & Pick<ImageFormProps, 'onSubmit' | 'imageTitle' | 'uploadHint'>;
10
10
  export declare const ToolbarImagePopup: React.FC<ToolbarImagePopuProps>;
@@ -6,7 +6,7 @@ import { i18n } from "../../../i18n/forms/index.js";
6
6
  import { useBooleanState } from "../../../react-utils/hooks.js";
7
7
  import { batchUploadFiles, } from "../../../utils/upload.js";
8
8
  const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
9
- export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, imageTitle, }) => {
9
+ export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, imageTitle, uploadHint, }) => {
10
10
  const toaster = useToaster();
11
11
  const [loading, showLoading, hideLoading] = useBooleanState(false);
12
12
  const handleCancel = useCallback(() => {
@@ -34,6 +34,6 @@ export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, fo
34
34
  focus();
35
35
  onSubmit(data);
36
36
  onClick?.('addImage');
37
- }, loading: loading, imageTitle: imageTitle }) }));
37
+ }, loading: loading, imageTitle: imageTitle, uploadHint: uploadHint }) }));
38
38
  };
39
39
  //# sourceMappingURL=ToolbarImagePopup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,SAAS,EAAsB,oCAAiC;AACxE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASzF,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,EAC/D,SAAS,EACT,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,EACZ,eAAe,EACf,UAAU,GACb,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,SAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,IAAI,CACtC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,sBAAsB;4BAC5B,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC;4BAClC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;yBACvB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,EACD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACxB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {ImageForm, type ImageFormProps} from '../../../forms/ImageForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n uploadImages?: FileUploadHandler;\n onSuccessUpload?: (res: BatchUploadResult) => void;\n hide: () => void;\n anchorElement: HTMLElement | null;\n} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle'>;\n\nexport const ToolbarImagePopup: React.FC<ToolbarImagePopuProps> = ({\n className,\n anchorElement,\n hide,\n onSubmit,\n focus,\n onClick,\n uploadImages,\n onSuccessUpload,\n imageTitle,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n onOpenChange={handleCancel}\n placement={placement}\n className={className}\n >\n <ImageForm\n autoFocus\n onAttach={\n uploadImages &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadImages).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (err) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_image_upload',\n title: i18n('image_upload_failed'),\n content: String(err),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addImage');\n }}\n loading={loading}\n imageTitle={imageTitle}\n />\n </Popup>\n );\n};\n"]}
1
+ {"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,SAAS,EAAsB,oCAAiC;AACxE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASzF,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,EAC/D,SAAS,EACT,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,EACZ,eAAe,EACf,UAAU,EACV,UAAU,GACb,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,SAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,IAAI,CACtC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,sBAAsB;4BAC5B,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC;4BAClC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;yBACvB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,EACD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,GACxB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {ImageForm, type ImageFormProps} from '../../../forms/ImageForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n uploadImages?: FileUploadHandler;\n onSuccessUpload?: (res: BatchUploadResult) => void;\n hide: () => void;\n anchorElement: HTMLElement | null;\n} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle' | 'uploadHint'>;\n\nexport const ToolbarImagePopup: React.FC<ToolbarImagePopuProps> = ({\n className,\n anchorElement,\n hide,\n onSubmit,\n focus,\n onClick,\n uploadImages,\n onSuccessUpload,\n imageTitle,\n uploadHint,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n onOpenChange={handleCancel}\n placement={placement}\n className={className}\n >\n <ImageForm\n autoFocus\n onAttach={\n uploadImages &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadImages).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (err) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_image_upload',\n title: i18n('image_upload_failed'),\n content: String(err),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addImage');\n }}\n loading={loading}\n imageTitle={imageTitle}\n uploadHint={uploadHint}\n />\n </Popup>\n );\n};\n"]}
@@ -1,3 +1,32 @@
1
+ import type { NodeSpec } from 'prosemirror-model';
1
2
  export type TokenAttrs = {
2
3
  [name: string]: unknown;
3
4
  };
5
+ export interface NodeSpecProcessor {
6
+ allowedAttrs?: string[];
7
+ }
8
+ export interface SchemaDynamicModifierConfig {
9
+ [elementType: string]: NodeSpecProcessor;
10
+ }
11
+ /**
12
+ * Class SchemaDynamicModifier
13
+ *
14
+ * Provides a mechanism for dynamic modification of schema node attributes:
15
+ *
16
+ * - `allowedAttrs`: A list of additional attributes to include in the ProseMirror schema with default values.
17
+ * When specified, these attributes are added to the schema and preserved during processing.
18
+ *
19
+ * Example:
20
+ * ```ts
21
+ * const dynamicModifier = new SchemaDynamicModifier({
22
+ * paragraph: {
23
+ * allowedAttrs: ['data-paragraph'],
24
+ * },
25
+ * });
26
+ * ```
27
+ */
28
+ export declare class SchemaDynamicModifier {
29
+ private nodeSpecsProcessors;
30
+ constructor(config: SchemaDynamicModifierConfig);
31
+ processNodeSpec(name: string, nodeSpec: NodeSpec): NodeSpec;
32
+ }
@@ -1,4 +1,20 @@
1
- /** @internal */
1
+ /**
2
+ * Class SchemaDynamicModifier
3
+ *
4
+ * Provides a mechanism for dynamic modification of schema node attributes:
5
+ *
6
+ * - `allowedAttrs`: A list of additional attributes to include in the ProseMirror schema with default values.
7
+ * When specified, these attributes are added to the schema and preserved during processing.
8
+ *
9
+ * Example:
10
+ * ```ts
11
+ * const dynamicModifier = new SchemaDynamicModifier({
12
+ * paragraph: {
13
+ * allowedAttrs: ['data-paragraph'],
14
+ * },
15
+ * });
16
+ * ```
17
+ */
2
18
  export class SchemaDynamicModifier {
3
19
  nodeSpecsProcessors;
4
20
  constructor(config) {