mdwysiwyg 0.4.0 → 0.6.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.
- package/README.md +23 -7
- package/dist/index.cjs +171 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +159 -118
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +199 -32
- package/dist/index.d.ts +199 -32
- package/dist/index.js +225 -66
- package/dist/index.js.map +1 -1
- package/docs/THEMING.md +329 -0
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -85,8 +85,24 @@ export default function App() {
|
|
|
85
85
|
}
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
That's it — no configuration required.
|
|
89
|
-
|
|
88
|
+
That's it — no configuration required. Every prop is documented in the code itself (hover it in your editor to
|
|
89
|
+
see what it does, its default and how it relates to other props).
|
|
90
|
+
|
|
91
|
+
- **All props, API and examples**: [component documentation](./src/components/MarkdownEditor/README.md)
|
|
92
|
+
- **Styling it for your app** (dark theme, brand colors, fonts — every CSS variable, recipes, troubleshooting):
|
|
93
|
+
[How to style mdwysiwyg in your host](https://github.com/ferkiernan/mdwysiwyg/blob/master/docs/THEMING.md) (Spanish)
|
|
94
|
+
- **Try every prop and build your theme live**: [playground](https://ferkiernan.github.io/mdwysiwyg/)
|
|
95
|
+
|
|
96
|
+
To match your product's look, declare `--mdw-*` variables on a class and pass it in `className` (or declare them on any
|
|
97
|
+
ancestor / `:root` for every editor on the page):
|
|
98
|
+
|
|
99
|
+
```css
|
|
100
|
+
.my-editor { --mdw-bg: #0b1220; --mdw-fg: #e5e7eb; --mdw-accent: #60a5fa; }
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<MarkdownEditor className="my-editor" />
|
|
105
|
+
```
|
|
90
106
|
|
|
91
107
|
### Cloning the repository instead
|
|
92
108
|
|
|
@@ -122,13 +138,13 @@ Try it in your browser, no install required: **[ferkiernan.github.io/mdwysiwyg](
|
|
|
122
138
|
| Diagrams | ` ```mermaid ` blocks render as live diagrams; pasted Mermaid syntax is auto-detected on HTML insert. Lazy-loaded, `securityLevel: strict` |
|
|
123
139
|
| Export | Copy as Markdown or as HTML, one click |
|
|
124
140
|
| Modes | Full editor (default) or read-only viewer (`onlyView`, with a configurable notice via `onlyViewNotice`) |
|
|
125
|
-
| Sizing | Fixed (`width`/`height` props)
|
|
126
|
-
| Toolbar | Shown by default; hide/show it at runtime with `showToolbar` (no content, caret or undo loss) |
|
|
141
|
+
| Sizing | Fixed (`width`/`height` props), user-resizable (`resizable`, default on) or growing with its content (`autoHeight`: no inner vertical scrollbar, `height` becomes the minimum) |
|
|
142
|
+
| Toolbar | Shown by default; hide/show it at runtime with `showToolbar` (no content, caret or undo loss), or only while the editor has focus with `autoHideBar` |
|
|
127
143
|
| Version history | Opt-in `historyUndo`: a version is saved after 3 s without changes; a clock icon right after the HTML button opens a history mode with ← Undo / Redo →, Confirm / Cancel (back to last version) and a right-hand list of versions with their time (click one to jump to it; document read-only while browsing; `Ctrl+Z` / `Ctrl+Shift+Z` map to Undo / Redo) |
|
|
128
|
-
| Compare mode | `mode="compare"` + `
|
|
144
|
+
| Compare mode | `mode="compare"` + `compareContent` (+ optional `compareOrientation`: `side-to-side` by default, or `up-and-down`): read-only original next to an editable new version with changed words highlighted in yellow, and a second bar to accept, reject or restore the change (`onCompareDecision`) |
|
|
129
145
|
| Compare scroll sync | In compare mode the two panes follow each other by matching content (top edge ↔ top edge; added/removed passages are crossed proportionally; vertical only). On by default; turn it off with `compareSyncScroll={false}` |
|
|
130
|
-
| Theming | CSS Custom Properties
|
|
131
|
-
| Imperative API | `ref` exposing `reset()` and `
|
|
146
|
+
| Theming | 47 CSS Custom Properties (`--mdw-*`) covering toolbar, content, tables, code and syntax highlighting, quotes, menus/dialogs, compare highlight and scrollbars; declare them on your class, a wrapper or `:root`, in any load order — see the [theming guide](https://github.com/ferkiernan/mdwysiwyg/blob/master/docs/THEMING.md) |
|
|
147
|
+
| Imperative API | `ref` exposing `reset()`, `isModified()`, `insertMarkdown()` and `setMarkdown()` |
|
|
132
148
|
|
|
133
149
|
## Tech under the hood
|
|
134
150
|
|
package/dist/index.cjs
CHANGED
|
@@ -3479,7 +3479,8 @@ var MarkdownEditor_default = {
|
|
|
3479
3479
|
menu: "MarkdownEditor_menu",
|
|
3480
3480
|
menuItem: "MarkdownEditor_menuItem",
|
|
3481
3481
|
menuSeparator: "MarkdownEditor_menuSeparator",
|
|
3482
|
-
dangerLink: "MarkdownEditor_dangerLink"
|
|
3482
|
+
dangerLink: "MarkdownEditor_dangerLink",
|
|
3483
|
+
autoHeight: "MarkdownEditor_autoHeight"
|
|
3483
3484
|
};
|
|
3484
3485
|
|
|
3485
3486
|
// src/components/MarkdownEditor/compare/CompareBar.tsx
|
|
@@ -3535,11 +3536,43 @@ function RenderedView({ editor }) {
|
|
|
3535
3536
|
// src/components/MarkdownEditor/views/MarkdownSourceView.tsx
|
|
3536
3537
|
var import_react2 = require("react");
|
|
3537
3538
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
3538
|
-
|
|
3539
|
+
function fitToContent(textarea) {
|
|
3540
|
+
textarea.style.height = "auto";
|
|
3541
|
+
textarea.style.height = `${textarea.scrollHeight}px`;
|
|
3542
|
+
}
|
|
3543
|
+
var MarkdownSourceView = (0, import_react2.forwardRef)(function MarkdownSourceView2({
|
|
3544
|
+
value,
|
|
3545
|
+
onChange,
|
|
3546
|
+
readOnly = false,
|
|
3547
|
+
ariaLabel = "C\xF3digo fuente Markdown",
|
|
3548
|
+
autoSize = false
|
|
3549
|
+
}, ref) {
|
|
3550
|
+
const innerRef = (0, import_react2.useRef)(null);
|
|
3551
|
+
(0, import_react2.useImperativeHandle)(ref, () => innerRef.current);
|
|
3552
|
+
(0, import_react2.useLayoutEffect)(() => {
|
|
3553
|
+
const textarea = innerRef.current;
|
|
3554
|
+
if (textarea === null) return;
|
|
3555
|
+
if (autoSize) fitToContent(textarea);
|
|
3556
|
+
else textarea.style.height = "";
|
|
3557
|
+
}, [autoSize, value]);
|
|
3558
|
+
(0, import_react2.useLayoutEffect)(() => {
|
|
3559
|
+
const textarea = innerRef.current;
|
|
3560
|
+
if (!autoSize || textarea === null || typeof ResizeObserver === "undefined") {
|
|
3561
|
+
return;
|
|
3562
|
+
}
|
|
3563
|
+
let width = textarea.clientWidth;
|
|
3564
|
+
const observer = new ResizeObserver(() => {
|
|
3565
|
+
if (textarea.clientWidth === width) return;
|
|
3566
|
+
width = textarea.clientWidth;
|
|
3567
|
+
fitToContent(textarea);
|
|
3568
|
+
});
|
|
3569
|
+
observer.observe(textarea);
|
|
3570
|
+
return () => observer.disconnect();
|
|
3571
|
+
}, [autoSize]);
|
|
3539
3572
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
3540
3573
|
"textarea",
|
|
3541
3574
|
{
|
|
3542
|
-
ref,
|
|
3575
|
+
ref: innerRef,
|
|
3543
3576
|
className: MarkdownEditor_default["source"],
|
|
3544
3577
|
"aria-label": ariaLabel,
|
|
3545
3578
|
spellCheck: false,
|
|
@@ -3555,7 +3588,14 @@ var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
|
3555
3588
|
function noop() {
|
|
3556
3589
|
}
|
|
3557
3590
|
var OriginalPane = (0, import_react3.forwardRef)(
|
|
3558
|
-
function OriginalPane2({
|
|
3591
|
+
function OriginalPane2({
|
|
3592
|
+
markdown,
|
|
3593
|
+
viewMode,
|
|
3594
|
+
sanitizeEmbeddedHtml,
|
|
3595
|
+
resolveImageSrc,
|
|
3596
|
+
onEditor,
|
|
3597
|
+
autoSize = false
|
|
3598
|
+
}, ref) {
|
|
3559
3599
|
const hasImageResolver = resolveImageSrc !== void 0;
|
|
3560
3600
|
const extensions = (0, import_react3.useMemo)(
|
|
3561
3601
|
() => createEditorExtensions({
|
|
@@ -3599,7 +3639,8 @@ var OriginalPane = (0, import_react3.forwardRef)(
|
|
|
3599
3639
|
value: markdown,
|
|
3600
3640
|
onChange: noop,
|
|
3601
3641
|
readOnly: true,
|
|
3602
|
-
ariaLabel: "C\xF3digo fuente Markdown original (solo lectura)"
|
|
3642
|
+
ariaLabel: "C\xF3digo fuente Markdown original (solo lectura)",
|
|
3643
|
+
autoSize
|
|
3603
3644
|
}
|
|
3604
3645
|
)
|
|
3605
3646
|
}
|
|
@@ -3921,7 +3962,7 @@ function segments(value, ranges) {
|
|
|
3921
3962
|
nodes.push(value.slice(cursor));
|
|
3922
3963
|
return nodes;
|
|
3923
3964
|
}
|
|
3924
|
-
var HighlightedSource = (0, import_react6.forwardRef)(function HighlightedSource2({ value, onChange, readOnly, ranges }, ref) {
|
|
3965
|
+
var HighlightedSource = (0, import_react6.forwardRef)(function HighlightedSource2({ value, onChange, readOnly, ranges, autoSize }, ref) {
|
|
3925
3966
|
const layerRef = (0, import_react6.useRef)(null);
|
|
3926
3967
|
const syncScroll = (event) => {
|
|
3927
3968
|
const layer = layerRef.current;
|
|
@@ -3945,7 +3986,8 @@ var HighlightedSource = (0, import_react6.forwardRef)(function HighlightedSource
|
|
|
3945
3986
|
ref,
|
|
3946
3987
|
value,
|
|
3947
3988
|
onChange,
|
|
3948
|
-
...readOnly !== void 0 ? { readOnly } : {}
|
|
3989
|
+
...readOnly !== void 0 ? { readOnly } : {},
|
|
3990
|
+
...autoSize !== void 0 ? { autoSize } : {}
|
|
3949
3991
|
}
|
|
3950
3992
|
)
|
|
3951
3993
|
]
|
|
@@ -4558,6 +4600,69 @@ function CodeLanguagePicker({
|
|
|
4558
4600
|
// src/components/MarkdownEditor/Toolbar/buttons/FloatingPanel.tsx
|
|
4559
4601
|
var import_react14 = require("react");
|
|
4560
4602
|
var import_react_dom = require("react-dom");
|
|
4603
|
+
|
|
4604
|
+
// src/components/MarkdownEditor/theme/themeTokens.ts
|
|
4605
|
+
var THEME_TOKENS = [
|
|
4606
|
+
{ name: "--mdw-border", group: "base", kind: "color", default: "#d0d4da", description: "Bordes del componente, tablas y paneles" },
|
|
4607
|
+
{ name: "--mdw-bg", group: "base", kind: "color", default: "#ffffff", description: "Fondo del componente; base del fondo del contenido y de los paneles flotantes" },
|
|
4608
|
+
{ name: "--mdw-fg", group: "base", kind: "color", default: "#1f2328", description: "Color de texto; base del texto del contenido" },
|
|
4609
|
+
{ name: "--mdw-muted", group: "base", kind: "color", default: "#f6f7f9", description: "Fondos suaves: encabezados de tabla, c\xF3digo, Mermaid, lista de versiones" },
|
|
4610
|
+
{ name: "--mdw-accent", group: "base", kind: "color", default: "#3d6fd8", description: "Anillos de foco y estados seleccionados" },
|
|
4611
|
+
{ name: "--mdw-toolbar-gradient-from", group: "toolbar", kind: "color", default: "#eeeeee", description: "Color inicial del degradado de la barra" },
|
|
4612
|
+
{ name: "--mdw-toolbar-gradient-via", group: "toolbar", kind: "color", default: "#dcdcdc", description: "Color intermedio del degradado" },
|
|
4613
|
+
{ name: "--mdw-toolbar-gradient-to", group: "toolbar", kind: "color", default: "#cfcfcf", description: "Color final del degradado" },
|
|
4614
|
+
{ name: "--mdw-toolbar-fg", group: "toolbar", kind: "color", default: "#222222", description: "Texto e iconos de la barra" },
|
|
4615
|
+
{ name: "--mdw-toolbar-font-family", group: "toolbar", kind: "font", default: "Arial, sans-serif", description: "Fuente de la barra" },
|
|
4616
|
+
{ name: "--mdw-toolbar-select-bg", group: "toolbar", kind: "color", default: "#e9e9e9", description: "Fondo del selector de encabezado" },
|
|
4617
|
+
{ name: "--mdw-button-active-bg", group: "toolbar", kind: "color", default: "#c8c8c8", description: "Fondo de un bot\xF3n presionado o activo" },
|
|
4618
|
+
{ name: "--mdw-button-hover-gradient-from", group: "toolbar", kind: "color", default: "#ffffff", description: "Degradado de un bot\xF3n en hover (inicio)" },
|
|
4619
|
+
{ name: "--mdw-button-hover-gradient-to", group: "toolbar", kind: "color", default: "#d8d8d8", description: "Degradado de un bot\xF3n en hover (fin)" },
|
|
4620
|
+
{ name: "--mdw-content-bg", group: "content", kind: "background", default: "var(--mdw-bg)", description: "Fondo del \xE1rea de contenido (color, degradado o imagen)" },
|
|
4621
|
+
{ name: "--mdw-content-wysiwyg-fg", group: "content", kind: "color", default: "var(--mdw-fg)", description: "Texto de la vista renderizada" },
|
|
4622
|
+
{ name: "--mdw-content-wysiwyg-font-family", group: "content", kind: "font", default: "inherit", description: "Fuente de la vista renderizada" },
|
|
4623
|
+
{ name: "--mdw-content-markdown-fg", group: "content", kind: "color", default: "var(--mdw-fg)", description: "Texto de la vista Markdown" },
|
|
4624
|
+
{ name: "--mdw-content-markdown-font-family", group: "content", kind: "font", default: "ui-monospace, Consolas, monospace", description: "Fuente de la vista Markdown" },
|
|
4625
|
+
{ name: "--mdw-table-header-bg", group: "tables-code", kind: "color", default: "var(--mdw-muted)", description: "Fondo de los encabezados de tabla" },
|
|
4626
|
+
{ name: "--mdw-table-menu-trigger-color", group: "tables-code", kind: "color", default: "var(--mdw-scrollbar-thumb)", description: "Tri\xE1ngulo que abre el men\xFA de columna/fila" },
|
|
4627
|
+
{ name: "--mdw-table-menu-trigger-size", group: "tables-code", kind: "length", default: "0.7em", description: "Tama\xF1o del tri\xE1ngulo del men\xFA de tabla" },
|
|
4628
|
+
{ name: "--mdw-table-picker-selected-bg", group: "tables-code", kind: "color", default: "#dbe4f8", description: "Celdas seleccionadas al elegir el tama\xF1o de una tabla" },
|
|
4629
|
+
{ name: "--mdw-code-block-bg", group: "tables-code", kind: "color", default: "var(--mdw-muted)", description: "Fondo de los bloques de c\xF3digo" },
|
|
4630
|
+
{ name: "--mdw-mermaid-bg", group: "tables-code", kind: "color", default: "var(--mdw-muted)", description: "Fondo de los diagramas Mermaid" },
|
|
4631
|
+
{ name: "--mdw-code-keyword", group: "syntax", kind: "color", default: "#a626a4", description: "Palabras clave, etiquetas y literales" },
|
|
4632
|
+
{ name: "--mdw-code-string", group: "syntax", kind: "color", default: "#50a14f", description: "Cadenas y atributos" },
|
|
4633
|
+
{ name: "--mdw-code-comment", group: "syntax", kind: "color", default: "#a0a1a7", description: "Comentarios" },
|
|
4634
|
+
{ name: "--mdw-code-number", group: "syntax", kind: "color", default: "#986801", description: "N\xFAmeros y funciones integradas" },
|
|
4635
|
+
{ name: "--mdw-code-title", group: "syntax", kind: "color", default: "#4078f2", description: "T\xEDtulos y nombres de funci\xF3n o clase" },
|
|
4636
|
+
{ name: "--mdw-link-fg", group: "content", kind: "color", default: "#0000ee", description: "Enlaces de la vista renderizada (el azul por defecto del navegador)" },
|
|
4637
|
+
{ name: "--mdw-link-visited-fg", group: "content", kind: "color", default: "#551a8b", description: "Enlaces ya visitados" },
|
|
4638
|
+
{ name: "--mdw-blockquote-fg", group: "quote", kind: "color", default: "#57606a", description: "Texto de las citas" },
|
|
4639
|
+
{ name: "--mdw-blockquote-border", group: "quote", kind: "color", default: "var(--mdw-border)", description: "L\xEDnea izquierda de las citas" },
|
|
4640
|
+
{ name: "--mdw-control-border", group: "controls", kind: "color", default: "#999", description: "Bordes de botones, selectores, barras y celdas del selector de tabla" },
|
|
4641
|
+
{ name: "--mdw-control-highlight", group: "controls", kind: "color", default: "#fff", description: "Borde claro interior de botones y barras" },
|
|
4642
|
+
{ name: "--mdw-control-shadow", group: "controls", kind: "color", default: "rgba(0, 0, 0, 0.15)", description: "Sombra de botones y de la barra" },
|
|
4643
|
+
{ name: "--mdw-control-pressed-shadow", group: "controls", kind: "color", default: "rgba(0, 0, 0, 0.25)", description: "Sombra interior de un bot\xF3n presionado" },
|
|
4644
|
+
{ name: "--mdw-separator-color", group: "controls", kind: "color", default: "#aaa", description: "Separadores de la barra" },
|
|
4645
|
+
{ name: "--mdw-popover-bg", group: "floating", kind: "color", default: "var(--mdw-bg)", description: "Fondo de men\xFAs, di\xE1logos y popovers" },
|
|
4646
|
+
{ name: "--mdw-popover-shadow", group: "floating", kind: "shadow", default: "0 4px 12px rgba(0, 0, 0, 0.12)", description: "Sombra de los paneles flotantes" },
|
|
4647
|
+
{ name: "--mdw-menu-hover-bg", group: "floating", kind: "color", default: "#e4e7eb", description: "Fondo de un elemento de men\xFA en hover o foco" },
|
|
4648
|
+
{ name: "--mdw-danger-fg", group: "floating", kind: "color", default: "#b42318", description: "Acciones destructivas (eliminar fila/columna, quitar enlace)" },
|
|
4649
|
+
{ name: "--mdw-danger-hover-fg", group: "floating", kind: "color", default: "#8c1c11", description: "Acciones destructivas en hover o foco" },
|
|
4650
|
+
{ name: "--mdw-compare-highlight-bg", group: "compare", kind: "color", default: "#fff176", description: "Resaltado de diferencias en modo comparaci\xF3n" },
|
|
4651
|
+
{ name: "--mdw-scrollbar-thumb", group: "scroll", kind: "color", default: "#c1c1c1", description: "Pulgar de las barras de desplazamiento" },
|
|
4652
|
+
{ name: "--mdw-scrollbar-track", group: "scroll", kind: "color", default: "transparent", description: "Riel de las barras de desplazamiento" }
|
|
4653
|
+
];
|
|
4654
|
+
function copyThemeTokens(source, target) {
|
|
4655
|
+
const view = source.ownerDocument.defaultView;
|
|
4656
|
+
if (view === null) return;
|
|
4657
|
+
const computed = view.getComputedStyle(source);
|
|
4658
|
+
for (const token of THEME_TOKENS) {
|
|
4659
|
+
const value = computed.getPropertyValue(token.name).trim();
|
|
4660
|
+
if (value === "") target.style.removeProperty(token.name);
|
|
4661
|
+
else target.style.setProperty(token.name, value);
|
|
4662
|
+
}
|
|
4663
|
+
}
|
|
4664
|
+
|
|
4665
|
+
// src/components/MarkdownEditor/Toolbar/buttons/FloatingPanel.tsx
|
|
4561
4666
|
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
4562
4667
|
function FloatingPanel({
|
|
4563
4668
|
anchor,
|
|
@@ -4579,6 +4684,15 @@ function FloatingPanel({
|
|
|
4579
4684
|
setStyle({ top: rect.bottom, left: rect.left });
|
|
4580
4685
|
}
|
|
4581
4686
|
}, [anchor, align]);
|
|
4687
|
+
(0, import_react14.useLayoutEffect)(() => {
|
|
4688
|
+
const panel = panelRef.current;
|
|
4689
|
+
const rootClass = MarkdownEditor_default["root"];
|
|
4690
|
+
if (style === null || panel === null || anchor === null || rootClass === void 0) {
|
|
4691
|
+
return;
|
|
4692
|
+
}
|
|
4693
|
+
const source = anchor.closest(`.${CSS.escape(rootClass)}`);
|
|
4694
|
+
if (source !== null) copyThemeTokens(source, panel);
|
|
4695
|
+
}, [style === null, anchor]);
|
|
4582
4696
|
(0, import_react14.useLayoutEffect)(() => {
|
|
4583
4697
|
if (style === null || !autoFocus) return;
|
|
4584
4698
|
panelRef.current?.querySelector(
|
|
@@ -5305,7 +5419,9 @@ var MarkdownEditor = (0, import_react19.forwardRef)(function MarkdownEditor2({
|
|
|
5305
5419
|
className,
|
|
5306
5420
|
onlyView = false,
|
|
5307
5421
|
showToolbar = true,
|
|
5422
|
+
autoHideBar = false,
|
|
5308
5423
|
resizable = true,
|
|
5424
|
+
autoHeight = false,
|
|
5309
5425
|
onlyViewNotice,
|
|
5310
5426
|
resolveImageSrc,
|
|
5311
5427
|
mode = "default",
|
|
@@ -5316,7 +5432,7 @@ var MarkdownEditor = (0, import_react19.forwardRef)(function MarkdownEditor2({
|
|
|
5316
5432
|
compareSyncScroll = true
|
|
5317
5433
|
}, ref) {
|
|
5318
5434
|
const historyEntryRef = (0, import_react19.useRef)(null);
|
|
5319
|
-
const requestedContent = mode === "compare" &&
|
|
5435
|
+
const requestedContent = mode === "compare" && compareContent !== void 0 ? compareContent : null;
|
|
5320
5436
|
const [source, setSource] = (0, import_react19.useState)(requestedContent ?? initialContent);
|
|
5321
5437
|
const [compareState, setCompareState] = (0, import_react19.useState)(
|
|
5322
5438
|
() => requestedContent === null ? { key: null, session: null } : {
|
|
@@ -5556,8 +5672,16 @@ var MarkdownEditor = (0, import_react19.forwardRef)(function MarkdownEditor2({
|
|
|
5556
5672
|
};
|
|
5557
5673
|
const appliedSessionRef = (0, import_react19.useRef)(session);
|
|
5558
5674
|
const canonicalForRef = (0, import_react19.useRef)(null);
|
|
5675
|
+
const decidedRef = (0, import_react19.useRef)(false);
|
|
5559
5676
|
(0, import_react19.useLayoutEffect)(() => {
|
|
5560
5677
|
if (session === null) {
|
|
5678
|
+
const ended = appliedSessionRef.current;
|
|
5679
|
+
if (ended !== null && !decidedRef.current && editor !== null) {
|
|
5680
|
+
const changed = sourceRef.current !== ended.original;
|
|
5681
|
+
loadContent(ended.original);
|
|
5682
|
+
if (changed) onChangeRef.current?.(ended.original);
|
|
5683
|
+
}
|
|
5684
|
+
decidedRef.current = false;
|
|
5561
5685
|
appliedSessionRef.current = null;
|
|
5562
5686
|
canonicalForRef.current = null;
|
|
5563
5687
|
setProvidedCanonical(null);
|
|
@@ -5602,6 +5726,7 @@ var MarkdownEditor = (0, import_react19.forwardRef)(function MarkdownEditor2({
|
|
|
5602
5726
|
const summary = session === null ? NO_DIFFERENCES2 : textDiff?.summary ?? renderedSummary;
|
|
5603
5727
|
const modified = session !== null && source !== session.provided && source !== providedCanonical;
|
|
5604
5728
|
const endCompare = () => {
|
|
5729
|
+
decidedRef.current = true;
|
|
5605
5730
|
sessionRef.current = null;
|
|
5606
5731
|
setCompareState((previous) => ({ ...previous, session: null }));
|
|
5607
5732
|
};
|
|
@@ -5744,12 +5869,42 @@ var MarkdownEditor = (0, import_react19.forwardRef)(function MarkdownEditor2({
|
|
|
5744
5869
|
editor.chain().focus().setTextSelection(linkPopover.range).extendMarkRange("link").unsetLink().run();
|
|
5745
5870
|
closeLinkPopover();
|
|
5746
5871
|
};
|
|
5872
|
+
const rootRef = (0, import_react19.useRef)(null);
|
|
5873
|
+
const [focusInside, setFocusInside] = (0, import_react19.useState)(false);
|
|
5874
|
+
const focusOutTimer = (0, import_react19.useRef)(null);
|
|
5875
|
+
const handleFocusIn = () => {
|
|
5876
|
+
if (focusOutTimer.current !== null) {
|
|
5877
|
+
clearTimeout(focusOutTimer.current);
|
|
5878
|
+
focusOutTimer.current = null;
|
|
5879
|
+
}
|
|
5880
|
+
setFocusInside(true);
|
|
5881
|
+
};
|
|
5882
|
+
const handleFocusOut = () => {
|
|
5883
|
+
if (focusOutTimer.current !== null) clearTimeout(focusOutTimer.current);
|
|
5884
|
+
focusOutTimer.current = setTimeout(() => {
|
|
5885
|
+
focusOutTimer.current = null;
|
|
5886
|
+
setFocusInside(false);
|
|
5887
|
+
}, 0);
|
|
5888
|
+
};
|
|
5889
|
+
(0, import_react19.useLayoutEffect)(() => {
|
|
5890
|
+
if (!autoHideBar) return;
|
|
5891
|
+
const root = rootRef.current;
|
|
5892
|
+
setFocusInside(root !== null && root.contains(document.activeElement));
|
|
5893
|
+
}, [autoHideBar]);
|
|
5894
|
+
(0, import_react19.useEffect)(
|
|
5895
|
+
() => () => {
|
|
5896
|
+
if (focusOutTimer.current !== null) clearTimeout(focusOutTimer.current);
|
|
5897
|
+
},
|
|
5898
|
+
[]
|
|
5899
|
+
);
|
|
5747
5900
|
const rootClassName = [
|
|
5748
5901
|
MarkdownEditor_default["root"],
|
|
5749
|
-
resizable ? MarkdownEditor_default["resizable"] : void 0,
|
|
5902
|
+
resizable && !autoHeight ? MarkdownEditor_default["resizable"] : void 0,
|
|
5903
|
+
autoHeight ? MarkdownEditor_default["autoHeight"] : void 0,
|
|
5750
5904
|
className
|
|
5751
5905
|
].filter(Boolean).join(" ");
|
|
5752
5906
|
const orientation = compareOrientation ?? "side-to-side";
|
|
5907
|
+
const toolbarVisible = showToolbar && (!autoHideBar || focusInside);
|
|
5753
5908
|
const panesClassName = [
|
|
5754
5909
|
MarkdownEditor_default["panes"],
|
|
5755
5910
|
session !== null ? MarkdownEditor_default["panesCompare"] : void 0,
|
|
@@ -5759,10 +5914,12 @@ var MarkdownEditor = (0, import_react19.forwardRef)(function MarkdownEditor2({
|
|
|
5759
5914
|
"div",
|
|
5760
5915
|
{
|
|
5761
5916
|
className: rootClassName,
|
|
5762
|
-
style: { width: toCssSize(width), height: toCssSize(height) },
|
|
5917
|
+
style: autoHeight ? { width: toCssSize(width), minHeight: toCssSize(height) } : { width: toCssSize(width), height: toCssSize(height) },
|
|
5763
5918
|
...historyOpen ? { onKeyDownCapture: handleHistoryKeyDown } : {},
|
|
5919
|
+
...autoHideBar ? { onFocus: handleFocusIn, onBlur: handleFocusOut } : {},
|
|
5920
|
+
ref: rootRef,
|
|
5764
5921
|
children: [
|
|
5765
|
-
|
|
5922
|
+
toolbarVisible && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ToolbarSlot, { onFocusLost: () => editor?.view.focus(), children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
5766
5923
|
Toolbar,
|
|
5767
5924
|
{
|
|
5768
5925
|
editor,
|
|
@@ -5815,6 +5972,7 @@ var MarkdownEditor = (0, import_react19.forwardRef)(function MarkdownEditor2({
|
|
|
5815
5972
|
{
|
|
5816
5973
|
ref: originalPaneRef,
|
|
5817
5974
|
onEditor: setOriginalEditor,
|
|
5975
|
+
autoSize: autoHeight,
|
|
5818
5976
|
markdown: session.original,
|
|
5819
5977
|
viewMode: effectiveViewMode,
|
|
5820
5978
|
sanitizeEmbeddedHtml,
|
|
@@ -5845,7 +6003,8 @@ var MarkdownEditor = (0, import_react19.forwardRef)(function MarkdownEditor2({
|
|
|
5845
6003
|
value: source,
|
|
5846
6004
|
onChange: handleSourceChange,
|
|
5847
6005
|
readOnly: onlyView || historyOpen,
|
|
5848
|
-
ranges: session !== null ? textDiff?.ranges ?? [] : null
|
|
6006
|
+
ranges: session !== null ? textDiff?.ranges ?? [] : null,
|
|
6007
|
+
autoSize: autoHeight
|
|
5849
6008
|
}
|
|
5850
6009
|
),
|
|
5851
6010
|
tableTriggerEnabled && triggerCell !== null && triggerCell.isConnected && contentRef.current !== null && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|