@harbour-enterprises/superdoc 0.18.0-next.2 → 0.18.0-next.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{PdfViewer-D9sb0T1f.cjs → PdfViewer-Clvr2OBw.cjs} +1 -1
- package/dist/chunks/{PdfViewer-C3MhLK2d.es.js → PdfViewer-tWXS43mF.es.js} +1 -1
- package/dist/chunks/{index-D4MPFidQ.cjs → index-BkStnRcA.cjs} +2 -2
- package/dist/chunks/{index-OlqsNrl5.es.js → index-Dwl_rWDB.es.js} +2 -2
- package/dist/chunks/{super-editor.es-D0wPEvPh.cjs → super-editor.es-CpjpLN5S.cjs} +351 -31
- package/dist/chunks/{super-editor.es-D57bZvWs.es.js → super-editor.es-IKbi3D64.es.js} +351 -31
- package/dist/super-editor/ai-writer.es.js +1 -1
- package/dist/super-editor/chunks/{editor-Dlzi1Ni6.js → editor-dWtBG-wm.js} +351 -31
- package/dist/super-editor/chunks/{toolbar-DIRJurpK.js → toolbar-BTjX4A_E.js} +1 -1
- package/dist/super-editor/editor.es.js +1 -1
- package/dist/super-editor/src/extensions/block-node/block-node.d.ts +27 -3
- package/dist/super-editor/src/extensions/color/color.d.ts +1 -1
- package/dist/super-editor/src/extensions/dropcursor/dropcursor.d.ts +5 -0
- package/dist/super-editor/src/extensions/gapcursor/gapcursor.d.ts +5 -0
- package/dist/super-editor/src/extensions/image/image.d.ts +5 -0
- package/dist/super-editor/src/extensions/image/imageHelpers/getFileOpener.d.ts +1 -1
- package/dist/super-editor/src/extensions/image/imageHelpers/handleImageUpload.d.ts +1 -1
- package/dist/super-editor/src/extensions/image/imageHelpers/imagePlaceholderPlugin.d.ts +2 -3
- package/dist/super-editor/src/extensions/image/imageHelpers/imagePositionPlugin.d.ts +1 -2
- package/dist/super-editor/src/extensions/image/imageHelpers/processUploadedImage.d.ts +2 -5
- package/dist/super-editor/src/extensions/image/imageHelpers/startImageUpload.d.ts +18 -3
- package/dist/super-editor/src/extensions/linked-styles/helpers.d.ts +4 -6
- package/dist/super-editor/src/extensions/linked-styles/linked-styles.d.ts +29 -0
- package/dist/super-editor/src/extensions/linked-styles/plugin.d.ts +4 -2
- package/dist/super-editor/src/extensions/text-align/text-align.d.ts +9 -0
- package/dist/super-editor/src/extensions/text-indent/text-indent.d.ts +19 -0
- package/dist/super-editor/src/extensions/text-transform/text-transform.d.ts +5 -0
- package/dist/super-editor/super-editor.es.js +3 -3
- package/dist/super-editor/toolbar.es.js +2 -2
- package/dist/super-editor.cjs +1 -1
- package/dist/super-editor.es.js +1 -1
- package/dist/superdoc.cjs +2 -2
- package/dist/superdoc.es.js +2 -2
- package/dist/superdoc.umd.js +351 -31
- package/dist/superdoc.umd.js.map +1 -1
- package/package.json +1 -1
|
@@ -48499,6 +48499,10 @@ const TextAlign = Extension.create({
|
|
|
48499
48499
|
{
|
|
48500
48500
|
types: this.options.types,
|
|
48501
48501
|
attributes: {
|
|
48502
|
+
/**
|
|
48503
|
+
* @category Attribute
|
|
48504
|
+
* @param {string} [textAlign='left'] - Text alignment value (left, center, right, justify)
|
|
48505
|
+
*/
|
|
48502
48506
|
textAlign: {
|
|
48503
48507
|
default: this.options.defaultAlignment,
|
|
48504
48508
|
parseDOM: (el) => {
|
|
@@ -48519,11 +48523,32 @@ const TextAlign = Extension.create({
|
|
|
48519
48523
|
},
|
|
48520
48524
|
addCommands() {
|
|
48521
48525
|
return {
|
|
48526
|
+
/**
|
|
48527
|
+
* Set text alignment
|
|
48528
|
+
* @category Command
|
|
48529
|
+
* @param {string} alignment - Alignment value (left, center, right, justify)
|
|
48530
|
+
* @returns {Function} Command function
|
|
48531
|
+
* @example
|
|
48532
|
+
* // Set to center
|
|
48533
|
+
* setTextAlign('center')
|
|
48534
|
+
*
|
|
48535
|
+
* // Set to justify
|
|
48536
|
+
* setTextAlign('justify')
|
|
48537
|
+
* @note Applies to all configured node types (heading, paragraph by default)
|
|
48538
|
+
*/
|
|
48522
48539
|
setTextAlign: (alignment2) => ({ commands: commands2 }) => {
|
|
48523
48540
|
const containsAlignment = this.options.alignments.includes(alignment2);
|
|
48524
48541
|
if (!containsAlignment) return false;
|
|
48525
48542
|
return this.options.types.map((type2) => commands2.updateAttributes(type2, { textAlign: alignment2 })).every((result) => result);
|
|
48526
48543
|
},
|
|
48544
|
+
/**
|
|
48545
|
+
* Remove text alignment (reset to default)
|
|
48546
|
+
* @category Command
|
|
48547
|
+
* @returns {Function} Command function
|
|
48548
|
+
* @example
|
|
48549
|
+
* unsetTextAlign()
|
|
48550
|
+
* @note Resets alignment to the default value
|
|
48551
|
+
*/
|
|
48527
48552
|
unsetTextAlign: () => ({ commands: commands2 }) => {
|
|
48528
48553
|
return this.options.types.map((type2) => commands2.resetAttributes(type2, "textAlign")).every((result) => result);
|
|
48529
48554
|
}
|
|
@@ -48554,6 +48579,10 @@ const TextIndent = Extension.create({
|
|
|
48554
48579
|
{
|
|
48555
48580
|
types: this.options.types,
|
|
48556
48581
|
attributes: {
|
|
48582
|
+
/**
|
|
48583
|
+
* @category Attribute
|
|
48584
|
+
* @param {string} [textIndent] - Text indentation value with unit (e.g., '0.5in')
|
|
48585
|
+
*/
|
|
48557
48586
|
textIndent: {
|
|
48558
48587
|
default: null,
|
|
48559
48588
|
parseDOM: (el) => el.style.textIndent,
|
|
@@ -48571,13 +48600,43 @@ const TextIndent = Extension.create({
|
|
|
48571
48600
|
},
|
|
48572
48601
|
addCommands() {
|
|
48573
48602
|
return {
|
|
48603
|
+
/**
|
|
48604
|
+
* Set text indentation
|
|
48605
|
+
* @category Command
|
|
48606
|
+
* @param {string} indent - Indentation value with unit (e.g., '0.5in', '2cm')
|
|
48607
|
+
* @returns {Function} Command function
|
|
48608
|
+
* @example
|
|
48609
|
+
* // Set to 0.5 inches
|
|
48610
|
+
* setTextIndent('0.5in')
|
|
48611
|
+
*
|
|
48612
|
+
* // Set to 2 centimeters
|
|
48613
|
+
* setTextIndent('2cm')
|
|
48614
|
+
* @note Accepts any valid CSS unit (in, cm, px, em, etc.)
|
|
48615
|
+
*/
|
|
48574
48616
|
setTextIndent: (indent) => ({ commands: commands2 }) => {
|
|
48575
48617
|
if (!indent) return false;
|
|
48576
48618
|
return this.options.types.map((type2) => commands2.updateAttributes(type2, { textIndent: indent })).every((result) => result);
|
|
48577
48619
|
},
|
|
48620
|
+
/**
|
|
48621
|
+
* Remove text indentation
|
|
48622
|
+
* @category Command
|
|
48623
|
+
* @returns {Function} Command function
|
|
48624
|
+
* @example
|
|
48625
|
+
* unsetTextIndent()
|
|
48626
|
+
* @note Removes all indentation from the selected nodes
|
|
48627
|
+
*/
|
|
48578
48628
|
unsetTextIndent: () => ({ commands: commands2 }) => {
|
|
48579
48629
|
return this.options.types.map((type2) => commands2.resetAttributes(type2, "textIndent")).every((result) => result);
|
|
48580
48630
|
},
|
|
48631
|
+
/**
|
|
48632
|
+
* Increase text indentation
|
|
48633
|
+
* @category Command
|
|
48634
|
+
* @returns {Function} Command function
|
|
48635
|
+
* @example
|
|
48636
|
+
* increaseTextIndent()
|
|
48637
|
+
* @note Increments by the default value (0.125in by default)
|
|
48638
|
+
* @note Creates initial indent if none exists
|
|
48639
|
+
*/
|
|
48581
48640
|
increaseTextIndent: () => ({ commands: commands2 }) => {
|
|
48582
48641
|
return this.options.types.map((type2) => {
|
|
48583
48642
|
let { textIndent } = this.editor.getAttributes(type2);
|
|
@@ -48588,7 +48647,7 @@ const TextIndent = Extension.create({
|
|
|
48588
48647
|
});
|
|
48589
48648
|
}
|
|
48590
48649
|
let [value, unit] = parseSizeUnit(textIndent);
|
|
48591
|
-
value = value + this.options.defaults.increment;
|
|
48650
|
+
value = Number(value) + this.options.defaults.increment;
|
|
48592
48651
|
unit = unit ? unit : this.options.defaults.unit;
|
|
48593
48652
|
if (Number.isNaN(value)) return false;
|
|
48594
48653
|
return commands2.updateAttributes(type2, {
|
|
@@ -48596,12 +48655,21 @@ const TextIndent = Extension.create({
|
|
|
48596
48655
|
});
|
|
48597
48656
|
}).every((result) => result);
|
|
48598
48657
|
},
|
|
48658
|
+
/**
|
|
48659
|
+
* Decrease text indentation
|
|
48660
|
+
* @category Command
|
|
48661
|
+
* @returns {Function} Command function
|
|
48662
|
+
* @example
|
|
48663
|
+
* decreaseTextIndent()
|
|
48664
|
+
* @note Decrements by the default value (0.125in by default)
|
|
48665
|
+
* @note Removes indentation completely if it reaches 0 or below
|
|
48666
|
+
*/
|
|
48599
48667
|
decreaseTextIndent: () => ({ commands: commands2 }) => {
|
|
48600
48668
|
return this.options.types.map((type2) => {
|
|
48601
48669
|
let { textIndent } = this.editor.getAttributes(type2);
|
|
48602
48670
|
if (!textIndent) return false;
|
|
48603
48671
|
let [value, unit] = parseSizeUnit(textIndent);
|
|
48604
|
-
value = value - this.options.defaults.increment;
|
|
48672
|
+
value = Number(value) - this.options.defaults.increment;
|
|
48605
48673
|
unit = unit ? unit : this.options.defaults.unit;
|
|
48606
48674
|
if (Number.isNaN(value)) return false;
|
|
48607
48675
|
if (value <= 0) {
|
|
@@ -49170,8 +49238,17 @@ const Gapcursor = Extension.create({
|
|
|
49170
49238
|
addPmPlugins() {
|
|
49171
49239
|
return [gapCursor()];
|
|
49172
49240
|
},
|
|
49241
|
+
/**
|
|
49242
|
+
* Extend node schema to allow gap cursor positioning
|
|
49243
|
+
* @returns {Object} Schema extension with allowGapCursor property
|
|
49244
|
+
*/
|
|
49173
49245
|
extendNodeSchema(extension) {
|
|
49174
49246
|
return {
|
|
49247
|
+
/**
|
|
49248
|
+
* Whether to allow gap cursor before/after this node
|
|
49249
|
+
* Set to false on nodes where gap cursor shouldn't appear
|
|
49250
|
+
* @type {boolean|null}
|
|
49251
|
+
*/
|
|
49175
49252
|
allowGapCursor: callOrGet(
|
|
49176
49253
|
getExtensionConfigField(extension, "allowGapCursor", {
|
|
49177
49254
|
name: extension.name,
|
|
@@ -50233,10 +50310,12 @@ const getLinkedStyle = (styleId, styles = []) => {
|
|
|
50233
50310
|
};
|
|
50234
50311
|
const getSpacingStyle = (spacing) => {
|
|
50235
50312
|
const { lineSpaceBefore, lineSpaceAfter, line, lineRule } = spacing;
|
|
50313
|
+
const lineHeightResult = getLineHeightValueString(line, "", lineRule, true);
|
|
50314
|
+
const lineHeightStyles = typeof lineHeightResult === "object" && lineHeightResult !== null ? lineHeightResult : {};
|
|
50236
50315
|
return {
|
|
50237
50316
|
"margin-top": lineSpaceBefore + "px",
|
|
50238
50317
|
"margin-bottom": lineSpaceAfter + "px",
|
|
50239
|
-
...
|
|
50318
|
+
...lineHeightStyles
|
|
50240
50319
|
};
|
|
50241
50320
|
};
|
|
50242
50321
|
const getSpacingStyleString = (spacing) => {
|
|
@@ -50421,6 +50500,11 @@ const createLinkedStylesPlugin = (editor) => {
|
|
|
50421
50500
|
return new Plugin({
|
|
50422
50501
|
key: LinkedStylesPluginKey,
|
|
50423
50502
|
state: {
|
|
50503
|
+
/**
|
|
50504
|
+
* Initialize plugin state with styles and decorations
|
|
50505
|
+
* @returns {Object} Initial state with styles and decorations
|
|
50506
|
+
* @private
|
|
50507
|
+
*/
|
|
50424
50508
|
init() {
|
|
50425
50509
|
if (!editor.converter || editor.options.mode !== "docx") return {};
|
|
50426
50510
|
const styles = editor.converter?.linkedStyles || [];
|
|
@@ -50429,6 +50513,15 @@ const createLinkedStylesPlugin = (editor) => {
|
|
|
50429
50513
|
decorations: generateDecorations(editor.state, styles)
|
|
50430
50514
|
};
|
|
50431
50515
|
},
|
|
50516
|
+
/**
|
|
50517
|
+
* Update decorations when document changes
|
|
50518
|
+
* @param {Object} tr - The transaction
|
|
50519
|
+
* @param {Object} prev - Previous plugin state
|
|
50520
|
+
* @param {Object} oldEditorState - Old editor state
|
|
50521
|
+
* @param {Object} newEditorState - New editor state
|
|
50522
|
+
* @returns {Object} Updated state with styles and decorations
|
|
50523
|
+
* @private
|
|
50524
|
+
*/
|
|
50432
50525
|
apply(tr, prev, oldEditorState, newEditorState) {
|
|
50433
50526
|
if (!editor.converter || editor.options.mode !== "docx") return { ...prev };
|
|
50434
50527
|
let decorations = prev.decorations || DecorationSet.empty;
|
|
@@ -50440,6 +50533,12 @@ const createLinkedStylesPlugin = (editor) => {
|
|
|
50440
50533
|
}
|
|
50441
50534
|
},
|
|
50442
50535
|
props: {
|
|
50536
|
+
/**
|
|
50537
|
+
* Provide decorations to the editor view
|
|
50538
|
+
* @param {Object} state - Current editor state
|
|
50539
|
+
* @returns {Object} The decoration set
|
|
50540
|
+
* @private
|
|
50541
|
+
*/
|
|
50443
50542
|
decorations(state2) {
|
|
50444
50543
|
return LinkedStylesPluginKey.getState(state2)?.decorations;
|
|
50445
50544
|
}
|
|
@@ -50481,24 +50580,35 @@ const LinkedStyles = Extension.create({
|
|
|
50481
50580
|
addCommands() {
|
|
50482
50581
|
return {
|
|
50483
50582
|
/**
|
|
50484
|
-
* Apply a linked style to the
|
|
50485
|
-
*
|
|
50486
|
-
* @param {
|
|
50487
|
-
* @
|
|
50488
|
-
* @
|
|
50583
|
+
* Apply a linked style to the selected paragraphs
|
|
50584
|
+
* @category Command
|
|
50585
|
+
* @param {Object} style - The style object to apply
|
|
50586
|
+
* @returns {Function} Command function
|
|
50587
|
+
* @example
|
|
50588
|
+
* const style = editor.helpers.linkedStyles.getStyleById('Heading1');
|
|
50589
|
+
* setLinkedStyle(style);
|
|
50590
|
+
* @note Clears existing formatting when applying a style
|
|
50591
|
+
* @note Works with custom selection preservation
|
|
50489
50592
|
*/
|
|
50490
50593
|
setLinkedStyle: (style2) => (params2) => {
|
|
50491
50594
|
const { tr } = params2;
|
|
50492
50595
|
return applyLinkedStyleToTransaction(tr, this.editor, style2);
|
|
50493
50596
|
},
|
|
50494
50597
|
/**
|
|
50495
|
-
* Toggle a linked style on the current selection
|
|
50598
|
+
* Toggle a linked style on the current selection
|
|
50599
|
+
* @category Command
|
|
50600
|
+
* @param {Object} style - The linked style to apply (with id property)
|
|
50601
|
+
* @param {string|null} [nodeType=null] - Node type to restrict toggle to (e.g., 'paragraph')
|
|
50602
|
+
* @returns {Function} Command function
|
|
50603
|
+
* @example
|
|
50604
|
+
* // Toggle a heading style
|
|
50605
|
+
* const style = editor.helpers.linkedStyles.getStyleById('Heading1');
|
|
50606
|
+
* toggleLinkedStyle(style)
|
|
50496
50607
|
*
|
|
50497
|
-
*
|
|
50498
|
-
*
|
|
50499
|
-
* @
|
|
50500
|
-
*
|
|
50501
|
-
* @returns {boolean} Whether the style was correctly applied/removed
|
|
50608
|
+
* // Toggle only on paragraph nodes
|
|
50609
|
+
* toggleLinkedStyle(style, 'paragraph')
|
|
50610
|
+
* @note If selection is empty, returns false
|
|
50611
|
+
* @note Removes style if already applied, applies it if not
|
|
50502
50612
|
*/
|
|
50503
50613
|
toggleLinkedStyle: (style2, nodeType = null) => (params2) => {
|
|
50504
50614
|
const { tr } = params2;
|
|
@@ -50521,9 +50631,17 @@ const LinkedStyles = Extension.create({
|
|
|
50521
50631
|
return applyLinkedStyleToTransaction(tr, this.editor, style2);
|
|
50522
50632
|
},
|
|
50523
50633
|
/**
|
|
50524
|
-
* Apply a linked style by its ID
|
|
50525
|
-
* @
|
|
50526
|
-
* @
|
|
50634
|
+
* Apply a linked style by its ID
|
|
50635
|
+
* @category Command
|
|
50636
|
+
* @param {string} styleId - The style ID to apply (e.g., 'Heading1')
|
|
50637
|
+
* @returns {Function} Command function
|
|
50638
|
+
* @example
|
|
50639
|
+
* // Apply a heading style
|
|
50640
|
+
* setStyleById('Heading1')
|
|
50641
|
+
*
|
|
50642
|
+
* // Apply a normal style
|
|
50643
|
+
* setStyleById('Normal')
|
|
50644
|
+
* @note Looks up the style from loaded Word styles
|
|
50527
50645
|
*/
|
|
50528
50646
|
setStyleById: (styleId) => (params2) => {
|
|
50529
50647
|
const { state: state2, tr } = params2;
|
|
@@ -50538,22 +50656,39 @@ const LinkedStyles = Extension.create({
|
|
|
50538
50656
|
addHelpers() {
|
|
50539
50657
|
return {
|
|
50540
50658
|
/**
|
|
50541
|
-
* Get all linked styles
|
|
50659
|
+
* Get all available linked styles
|
|
50660
|
+
* @category Helper
|
|
50542
50661
|
* @returns {Array} Array of linked style objects
|
|
50662
|
+
* @example
|
|
50663
|
+
* const styles = editor.helpers.linkedStyles.getStyles();
|
|
50664
|
+
* // Returns all styles from the Word document
|
|
50543
50665
|
*/
|
|
50544
50666
|
getStyles: () => {
|
|
50545
50667
|
const styles = LinkedStylesPluginKey.getState(this.editor.state)?.styles || [];
|
|
50546
50668
|
return styles;
|
|
50547
50669
|
},
|
|
50548
50670
|
/**
|
|
50549
|
-
* Get a
|
|
50550
|
-
* @
|
|
50551
|
-
* @
|
|
50671
|
+
* Get a specific style by ID
|
|
50672
|
+
* @category Helper
|
|
50673
|
+
* @param {string} styleId - The style ID to find
|
|
50674
|
+
* @returns {Object} The style object or undefined
|
|
50675
|
+
* @example
|
|
50676
|
+
* const headingStyle = editor.helpers.linkedStyles.getStyleById('Heading1');
|
|
50552
50677
|
*/
|
|
50553
50678
|
getStyleById: (styleId) => {
|
|
50554
50679
|
const styles = this.editor.helpers[this.name].getStyles();
|
|
50555
50680
|
return styles.find((s) => s.id === styleId);
|
|
50556
50681
|
},
|
|
50682
|
+
/**
|
|
50683
|
+
* Get the CSS string for a style
|
|
50684
|
+
* @category Helper
|
|
50685
|
+
* @param {string} styleId - The style ID
|
|
50686
|
+
* @returns {string} CSS style string
|
|
50687
|
+
* @example
|
|
50688
|
+
* const css = editor.helpers.linkedStyles.getLinkedStyleString('Heading1');
|
|
50689
|
+
* // Returns: "font-size: 16pt; font-weight: bold; color: #2E74B5"
|
|
50690
|
+
* @private
|
|
50691
|
+
*/
|
|
50557
50692
|
getLinkedStyleString: (styleId) => {
|
|
50558
50693
|
const styles = this.editor.helpers.linkedStyles.getStyles();
|
|
50559
50694
|
const style2 = styles.find((s) => s.id === styleId);
|
|
@@ -56932,6 +57067,10 @@ const Image = Node$1.create({
|
|
|
56932
57067
|
},
|
|
56933
57068
|
addAttributes() {
|
|
56934
57069
|
return {
|
|
57070
|
+
/**
|
|
57071
|
+
* @category Attribute
|
|
57072
|
+
* @param {string} [src] - Image source URL or path
|
|
57073
|
+
*/
|
|
56935
57074
|
src: {
|
|
56936
57075
|
default: null,
|
|
56937
57076
|
renderDOM: ({ src }) => {
|
|
@@ -56940,31 +57079,90 @@ const Image = Node$1.create({
|
|
|
56940
57079
|
};
|
|
56941
57080
|
}
|
|
56942
57081
|
},
|
|
57082
|
+
/**
|
|
57083
|
+
* @category Attribute
|
|
57084
|
+
* @param {string} [alt='Uploaded picture'] - Alternative text for accessibility
|
|
57085
|
+
*/
|
|
56943
57086
|
alt: {
|
|
56944
57087
|
default: "Uploaded picture"
|
|
56945
57088
|
},
|
|
57089
|
+
/**
|
|
57090
|
+
* @category Attribute
|
|
57091
|
+
* @param {string} [id] - Image element ID
|
|
57092
|
+
* @private
|
|
57093
|
+
*/
|
|
56946
57094
|
id: { rendered: false },
|
|
57095
|
+
/**
|
|
57096
|
+
* @category Attribute
|
|
57097
|
+
* @param {string} [title] - Image title/tooltip text
|
|
57098
|
+
*/
|
|
56947
57099
|
title: {
|
|
56948
57100
|
default: null
|
|
56949
57101
|
},
|
|
57102
|
+
/**
|
|
57103
|
+
* @category Attribute
|
|
57104
|
+
* @param {string} [rId] - Relationship ID for Word export
|
|
57105
|
+
* @private
|
|
57106
|
+
*/
|
|
56950
57107
|
rId: {
|
|
56951
57108
|
default: null,
|
|
56952
57109
|
rendered: false
|
|
56953
57110
|
},
|
|
57111
|
+
/**
|
|
57112
|
+
* @category Attribute
|
|
57113
|
+
* @param {Object} [originalPadding] - Original padding values from Word import
|
|
57114
|
+
* @private
|
|
57115
|
+
*/
|
|
56954
57116
|
originalPadding: {
|
|
56955
57117
|
default: null,
|
|
56956
57118
|
rendered: false
|
|
56957
57119
|
},
|
|
57120
|
+
/**
|
|
57121
|
+
* @category Attribute
|
|
57122
|
+
* @param {Object} [originalAttributes] - Original attributes from Word import
|
|
57123
|
+
* @private
|
|
57124
|
+
*/
|
|
56958
57125
|
originalAttributes: { rendered: false },
|
|
57126
|
+
/**
|
|
57127
|
+
* @category Attribute
|
|
57128
|
+
* @param {boolean} [wrapTopAndBottom] - Wrap text above and below image
|
|
57129
|
+
* @private
|
|
57130
|
+
*/
|
|
56959
57131
|
wrapTopAndBottom: { rendered: false },
|
|
57132
|
+
/**
|
|
57133
|
+
* @category Attribute
|
|
57134
|
+
* @param {Object} [anchorData] - Anchor positioning data for Word
|
|
57135
|
+
* @private
|
|
57136
|
+
*/
|
|
56960
57137
|
anchorData: {
|
|
56961
57138
|
default: null,
|
|
56962
57139
|
rendered: false
|
|
56963
57140
|
},
|
|
57141
|
+
/**
|
|
57142
|
+
* @category Attribute
|
|
57143
|
+
* @param {boolean} [isAnchor] - Whether image is anchored
|
|
57144
|
+
* @private
|
|
57145
|
+
*/
|
|
56964
57146
|
isAnchor: { rendered: false },
|
|
57147
|
+
/**
|
|
57148
|
+
* @category Attribute
|
|
57149
|
+
* @param {boolean} [simplePos] - Simple positioning flag
|
|
57150
|
+
* @private
|
|
57151
|
+
*/
|
|
56965
57152
|
simplePos: { rendered: false },
|
|
57153
|
+
/**
|
|
57154
|
+
* @category Attribute
|
|
57155
|
+
* @param {string} [wrapText] - Text wrapping style
|
|
57156
|
+
* @private
|
|
57157
|
+
*/
|
|
56966
57158
|
wrapText: { rendered: false },
|
|
56967
57159
|
extension: { rendered: false },
|
|
57160
|
+
/**
|
|
57161
|
+
* @category Attribute
|
|
57162
|
+
* @param {Object} [size] - Image dimensions
|
|
57163
|
+
* @param {number} [size.width] - Width in pixels
|
|
57164
|
+
* @param {number} [size.height] - Height in pixels
|
|
57165
|
+
*/
|
|
56968
57166
|
size: {
|
|
56969
57167
|
default: {},
|
|
56970
57168
|
renderDOM: ({ size: size2, extension }) => {
|
|
@@ -56977,6 +57175,14 @@ const Image = Node$1.create({
|
|
|
56977
57175
|
return { style: style2 };
|
|
56978
57176
|
}
|
|
56979
57177
|
},
|
|
57178
|
+
/**
|
|
57179
|
+
* @category Attribute
|
|
57180
|
+
* @param {Object} [padding] - Image padding/margins
|
|
57181
|
+
* @param {number} [padding.left] - Left padding in pixels
|
|
57182
|
+
* @param {number} [padding.top] - Top padding in pixels
|
|
57183
|
+
* @param {number} [padding.bottom] - Bottom padding in pixels
|
|
57184
|
+
* @param {number} [padding.right] - Right padding in pixels
|
|
57185
|
+
*/
|
|
56980
57186
|
padding: {
|
|
56981
57187
|
default: {},
|
|
56982
57188
|
renderDOM: ({ padding, marginOffset }) => {
|
|
@@ -56989,6 +57195,12 @@ const Image = Node$1.create({
|
|
|
56989
57195
|
return { style: style2 };
|
|
56990
57196
|
}
|
|
56991
57197
|
},
|
|
57198
|
+
/**
|
|
57199
|
+
* @category Attribute
|
|
57200
|
+
* @param {Object} [marginOffset] - Margin offset for anchored images
|
|
57201
|
+
* @param {number} [marginOffset.left] - Left margin offset
|
|
57202
|
+
* @param {number} [marginOffset.top] - Top margin offset
|
|
57203
|
+
*/
|
|
56992
57204
|
marginOffset: {
|
|
56993
57205
|
default: {},
|
|
56994
57206
|
renderDOM: ({ marginOffset, anchorData }) => {
|
|
@@ -57004,6 +57216,10 @@ const Image = Node$1.create({
|
|
|
57004
57216
|
return { style: style2 };
|
|
57005
57217
|
}
|
|
57006
57218
|
},
|
|
57219
|
+
/**
|
|
57220
|
+
* @category Attribute
|
|
57221
|
+
* @param {string} [style] - Custom inline CSS styles
|
|
57222
|
+
*/
|
|
57007
57223
|
style: {
|
|
57008
57224
|
default: null,
|
|
57009
57225
|
rendered: true,
|
|
@@ -57026,6 +57242,27 @@ const Image = Node$1.create({
|
|
|
57026
57242
|
},
|
|
57027
57243
|
addCommands() {
|
|
57028
57244
|
return {
|
|
57245
|
+
/**
|
|
57246
|
+
* Insert an image at the current position
|
|
57247
|
+
* @category Command
|
|
57248
|
+
* @param {Object} options - Image attributes
|
|
57249
|
+
* @param {string} options.src - Image source URL or data URI
|
|
57250
|
+
* @param {string} [options.alt] - Alternative text
|
|
57251
|
+
* @param {string} [options.title] - Image title
|
|
57252
|
+
* @param {Object} [options.size] - Image dimensions
|
|
57253
|
+
* @returns {Function} Command function
|
|
57254
|
+
* @example
|
|
57255
|
+
* // Insert an image from a URL
|
|
57256
|
+
* setImage({ src: 'https://example.com/image.jpg' })
|
|
57257
|
+
*
|
|
57258
|
+
* // Insert a base64 encoded image
|
|
57259
|
+
* setImage({
|
|
57260
|
+
* src: 'data:image/png;base64,...',
|
|
57261
|
+
* alt: 'Company logo',
|
|
57262
|
+
* size: { width: 200 }
|
|
57263
|
+
* })
|
|
57264
|
+
* @note Supports URLs, relative paths, and base64 data URIs
|
|
57265
|
+
*/
|
|
57029
57266
|
setImage: (options) => ({ commands: commands2 }) => {
|
|
57030
57267
|
return commands2.insertContent({
|
|
57031
57268
|
type: this.name,
|
|
@@ -57063,7 +57300,9 @@ const getFileOpener = () => {
|
|
|
57063
57300
|
const handleImageUpload = (file) => {
|
|
57064
57301
|
return new Promise((resolve, reject) => {
|
|
57065
57302
|
let reader = new FileReader();
|
|
57066
|
-
reader.onload = (event) =>
|
|
57303
|
+
reader.onload = (event) => {
|
|
57304
|
+
resolve(event.target.result);
|
|
57305
|
+
};
|
|
57067
57306
|
reader.onerror = reject;
|
|
57068
57307
|
setTimeout(() => reader.readAsDataURL(file), 250);
|
|
57069
57308
|
});
|
|
@@ -57267,8 +57506,8 @@ async function uploadImage({ editor, view, file, size: size2, uploadHandler }) {
|
|
|
57267
57506
|
let rId = null;
|
|
57268
57507
|
if (editor.options.mode === "docx") {
|
|
57269
57508
|
const [, path] = mediaPath.split("word/");
|
|
57270
|
-
const
|
|
57271
|
-
if (
|
|
57509
|
+
const imageid = addImageRelationship({ editor, path });
|
|
57510
|
+
if (imageid) rId = imageid;
|
|
57272
57511
|
}
|
|
57273
57512
|
let imageNode = schema.nodes.image.create({
|
|
57274
57513
|
src: mediaPath,
|
|
@@ -57291,8 +57530,8 @@ function addImageRelationship({ editor, path }) {
|
|
|
57291
57530
|
const target = path;
|
|
57292
57531
|
const type2 = "image";
|
|
57293
57532
|
try {
|
|
57294
|
-
const
|
|
57295
|
-
return
|
|
57533
|
+
const relationshipId = insertNewRelationship(target, type2, editor);
|
|
57534
|
+
return relationshipId;
|
|
57296
57535
|
} catch {
|
|
57297
57536
|
return null;
|
|
57298
57537
|
}
|
|
@@ -58405,6 +58644,17 @@ const BlockNode = Extension.create({
|
|
|
58405
58644
|
name: "blockNode",
|
|
58406
58645
|
addCommands() {
|
|
58407
58646
|
return {
|
|
58647
|
+
/**
|
|
58648
|
+
* Replace a block node by its ID with new content
|
|
58649
|
+
* @category Command
|
|
58650
|
+
* @param {string} id - The sdBlockId of the node to replace
|
|
58651
|
+
* @param {Object} contentNode - The replacement ProseMirror node
|
|
58652
|
+
* @returns {Function} Command function
|
|
58653
|
+
* @example
|
|
58654
|
+
* const newParagraph = editor.schema.nodes.paragraph.create({}, editor.schema.text('New content'))
|
|
58655
|
+
* replaceBlockNodeById('block-123', newParagraph)
|
|
58656
|
+
* @note The replacement node should have the same type as the original
|
|
58657
|
+
*/
|
|
58408
58658
|
replaceBlockNodeById: (id, contentNode) => ({ dispatch, tr }) => {
|
|
58409
58659
|
const blockNode = this.editor.helpers.blockNode.getBlockNodeById(id);
|
|
58410
58660
|
if (!blockNode || blockNode.length > 1) {
|
|
@@ -58421,6 +58671,15 @@ const BlockNode = Extension.create({
|
|
|
58421
58671
|
}
|
|
58422
58672
|
return true;
|
|
58423
58673
|
},
|
|
58674
|
+
/**
|
|
58675
|
+
* Delete a block node by its ID
|
|
58676
|
+
* @category Command
|
|
58677
|
+
* @param {string} id - The sdBlockId of the node to delete
|
|
58678
|
+
* @returns {Function} Command function
|
|
58679
|
+
* @example
|
|
58680
|
+
* deleteBlockNodeById('block-123')
|
|
58681
|
+
* @note Completely removes the node from the document
|
|
58682
|
+
*/
|
|
58424
58683
|
deleteBlockNodeById: (id) => ({ dispatch, tr }) => {
|
|
58425
58684
|
const blockNode = this.editor.helpers.blockNode.getBlockNodeById(id);
|
|
58426
58685
|
if (!blockNode || blockNode.length > 1) {
|
|
@@ -58437,6 +58696,18 @@ const BlockNode = Extension.create({
|
|
|
58437
58696
|
}
|
|
58438
58697
|
return true;
|
|
58439
58698
|
},
|
|
58699
|
+
/**
|
|
58700
|
+
* Update attributes of a block node by its ID
|
|
58701
|
+
* @category Command
|
|
58702
|
+
* @param {string} id - The sdBlockId of the node to update
|
|
58703
|
+
* @param {Object} attrs - Attributes to update
|
|
58704
|
+
* @returns {Function} Command function
|
|
58705
|
+
* @example
|
|
58706
|
+
* updateBlockNodeAttributes('block-123', { textAlign: 'center' })
|
|
58707
|
+
* @example
|
|
58708
|
+
* updateBlockNodeAttributes('block-123', { indent: { left: 20 } })
|
|
58709
|
+
* @note Merges new attributes with existing ones
|
|
58710
|
+
*/
|
|
58440
58711
|
updateBlockNodeAttributes: (id, attrs = {}) => ({ dispatch, tr }) => {
|
|
58441
58712
|
const blockNode = this.editor.helpers.blockNode.getBlockNodeById(id);
|
|
58442
58713
|
if (!blockNode || blockNode.length > 1) {
|
|
@@ -58459,15 +58730,54 @@ const BlockNode = Extension.create({
|
|
|
58459
58730
|
},
|
|
58460
58731
|
addHelpers() {
|
|
58461
58732
|
return {
|
|
58733
|
+
/**
|
|
58734
|
+
* Get all block nodes in the document
|
|
58735
|
+
* @category Helper
|
|
58736
|
+
* @returns {Array<BlockNodeInfo>} Array of block node info objects
|
|
58737
|
+
* @example
|
|
58738
|
+
* const blocks = editor.helpers.blockNode.getBlockNodes()
|
|
58739
|
+
* console.log(`Found ${blocks.length} block nodes`)
|
|
58740
|
+
*/
|
|
58462
58741
|
getBlockNodes: () => {
|
|
58463
58742
|
return findChildren(this.editor.state.doc, (node2) => nodeAllowsSdBlockIdAttr(node2));
|
|
58464
58743
|
},
|
|
58744
|
+
/**
|
|
58745
|
+
* Get a specific block node by its ID
|
|
58746
|
+
* @category Helper
|
|
58747
|
+
* @param {string} id - The sdBlockId to search for
|
|
58748
|
+
* @returns {Array<BlockNodeInfo>} Array containing the matching node (or empty)
|
|
58749
|
+
* @example
|
|
58750
|
+
* const block = editor.helpers.blockNode.getBlockNodeById('block-123')
|
|
58751
|
+
* if (block.length) console.log('Found:', block[0].node.type.name)
|
|
58752
|
+
*/
|
|
58465
58753
|
getBlockNodeById: (id) => {
|
|
58466
58754
|
return findChildren(this.editor.state.doc, (node2) => node2.attrs.sdBlockId === id);
|
|
58467
58755
|
},
|
|
58756
|
+
/**
|
|
58757
|
+
* Get all block nodes of a specific type
|
|
58758
|
+
* @category Helper
|
|
58759
|
+
* @param {string} type - The node type name (e.g., 'paragraph', 'heading')
|
|
58760
|
+
* @returns {Array<BlockNodeInfo>} Array of matching block nodes
|
|
58761
|
+
* @example
|
|
58762
|
+
* const paragraphs = editor.helpers.blockNode.getBlockNodesByType('paragraph')
|
|
58763
|
+
* const headings = editor.helpers.blockNode.getBlockNodesByType('heading')
|
|
58764
|
+
*/
|
|
58468
58765
|
getBlockNodesByType: (type2) => {
|
|
58469
58766
|
return findChildren(this.editor.state.doc, (node2) => node2.type.name === type2);
|
|
58470
58767
|
},
|
|
58768
|
+
/**
|
|
58769
|
+
* Get all block nodes within a position range
|
|
58770
|
+
* @category Helper
|
|
58771
|
+
* @param {number} from - Start position
|
|
58772
|
+
* @param {number} to - End position
|
|
58773
|
+
* @returns {Array<BlockNodeInfo>} Array of block nodes in the range
|
|
58774
|
+
* @example
|
|
58775
|
+
* const selection = editor.state.selection
|
|
58776
|
+
* const blocksInSelection = editor.helpers.blockNode.getBlockNodesInRange(
|
|
58777
|
+
* selection.from,
|
|
58778
|
+
* selection.to
|
|
58779
|
+
* )
|
|
58780
|
+
*/
|
|
58471
58781
|
getBlockNodesInRange: (from2, to) => {
|
|
58472
58782
|
let blockNodes = [];
|
|
58473
58783
|
this.editor.state.doc.nodesBetween(from2, to, (node2, pos) => {
|
|
@@ -58523,10 +58833,11 @@ const nodeNeedsSdBlockId = (node2) => {
|
|
|
58523
58833
|
return !currentId;
|
|
58524
58834
|
};
|
|
58525
58835
|
const checkForNewBlockNodesInTrs = (transactions) => {
|
|
58526
|
-
return transactions.some((tr) => {
|
|
58836
|
+
return Array.from(transactions).some((tr) => {
|
|
58527
58837
|
return tr.steps.some((step) => {
|
|
58838
|
+
if (!(step instanceof ReplaceStep)) return false;
|
|
58528
58839
|
const hasValidSdBlockNodes = step.slice?.content?.content?.some((node2) => nodeAllowsSdBlockIdAttr(node2));
|
|
58529
|
-
return
|
|
58840
|
+
return hasValidSdBlockNodes;
|
|
58530
58841
|
});
|
|
58531
58842
|
});
|
|
58532
58843
|
};
|
|
@@ -58555,6 +58866,10 @@ const TextStyle = Mark2.create({
|
|
|
58555
58866
|
},
|
|
58556
58867
|
addAttributes() {
|
|
58557
58868
|
return {
|
|
58869
|
+
/**
|
|
58870
|
+
* @category Attribute
|
|
58871
|
+
* @param {string} [styleId] - Style identifier for referencing predefined styles
|
|
58872
|
+
*/
|
|
58558
58873
|
styleId: {}
|
|
58559
58874
|
};
|
|
58560
58875
|
},
|
|
@@ -58563,10 +58878,11 @@ const TextStyle = Mark2.create({
|
|
|
58563
58878
|
/**
|
|
58564
58879
|
* Remove empty text style marks
|
|
58565
58880
|
* @category Command
|
|
58566
|
-
* @returns {Function} Command - Removes mark if no attributes present
|
|
58881
|
+
* @returns {Function} Command function - Removes mark if no attributes present
|
|
58567
58882
|
* @example
|
|
58568
58883
|
* removeEmptyTextStyle()
|
|
58569
58884
|
* @note Cleanup utility to prevent empty span elements
|
|
58885
|
+
* @note Automatically checks if any style attributes exist before removal
|
|
58570
58886
|
*/
|
|
58571
58887
|
removeEmptyTextStyle: () => ({ state: state2, commands: commands2 }) => {
|
|
58572
58888
|
const attributes = Attribute2.getMarkAttributes(state2, this.type);
|
|
@@ -59588,12 +59904,16 @@ const TextTransform = Extension.create({
|
|
|
59588
59904
|
{
|
|
59589
59905
|
types: this.options.types,
|
|
59590
59906
|
attributes: {
|
|
59907
|
+
/**
|
|
59908
|
+
* @category Attribute
|
|
59909
|
+
* @param {string} [textTransform] - Text transform value (uppercase, lowercase, capitalize, none)
|
|
59910
|
+
*/
|
|
59591
59911
|
textTransform: {
|
|
59592
59912
|
default: null,
|
|
59593
59913
|
renderDOM: (attrs) => {
|
|
59594
|
-
if (!attrs.
|
|
59914
|
+
if (!attrs.textTransform) return {};
|
|
59595
59915
|
return {
|
|
59596
|
-
style: `text-transform: ${attrs.
|
|
59916
|
+
style: `text-transform: ${attrs.textTransform}`
|
|
59597
59917
|
};
|
|
59598
59918
|
}
|
|
59599
59919
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, onMounted, onUnmounted, computed, createElementBlock, openBlock, withModifiers, createElementVNode, withDirectives, unref, vModelText, createCommentVNode, nextTick } from "vue";
|
|
2
2
|
import { T as TextSelection } from "./chunks/converter-DdzGurMJ.js";
|
|
3
|
-
import { _ as _export_sfc } from "./chunks/editor-
|
|
3
|
+
import { _ as _export_sfc } from "./chunks/editor-dWtBG-wm.js";
|
|
4
4
|
const DEFAULT_API_ENDPOINT = "https://sd-dev-express-gateway-i6xtm.ondigitalocean.app/insights";
|
|
5
5
|
const SYSTEM_PROMPT = "You are an expert copywriter and you are immersed in a document editor. You are to provide document related text responses based on the user prompts. Only write what is asked for. Do not provide explanations. Try to keep placeholders as short as possible. Do not output your prompt. Your instructions are: ";
|
|
6
6
|
async function baseInsightsFetch(payload, options = {}) {
|