@domternal/vue 0.14.0 → 0.15.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/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as vue from 'vue';
2
2
  import { ShallowRef, Ref, ComputedRef, InjectionKey, Component, PropType, VNode, AppContext } from 'vue';
3
- import { AnyExtension, Content, FocusPosition, Editor, JSONContent, IconSet, ToolbarLayoutEntry, BubbleMenuOptions, FloatingMenuOptions, FloatingMenuItemsOverride, FloatingMenuKeymap } from '@domternal/core';
3
+ import { AnyExtension, Content, EditorPreset, FocusPosition, Editor, JSONContent, IconSet, ToolbarLayoutEntry, BubbleMenuOptions, FloatingMenuOptions, FloatingMenuItemsOverride, FloatingMenuKeymap } from '@domternal/core';
4
4
  export { AnyExtension, Content, Editor, FocusPosition, GenerateHTMLOptions, GenerateJSONOptions, GenerateTextOptions, JSONContent, generateHTML, generateJSON, generateText } from '@domternal/core';
5
5
  import * as prosemirror_state from 'prosemirror-state';
6
6
  import * as prosemirror_view from 'prosemirror-view';
@@ -19,6 +19,12 @@ interface UseEditorOptions {
19
19
  content?: Content;
20
20
  /** Whether the editor is editable. @default true */
21
21
  editable?: boolean;
22
+ /**
23
+ * Editing experience preset. `'notion'` paints `dm-notion-mode` on the
24
+ * `.dm-editor` wrapper and switches preset-aware extensions to their
25
+ * Notion behavior, replacing the hand-written class. Create-time only.
26
+ */
27
+ preset?: EditorPreset;
22
28
  /** Where to autofocus on mount. @default false */
23
29
  autofocus?: FocusPosition;
24
30
  /** Output format for content comparison. @default 'html' */
@@ -169,6 +175,8 @@ interface DomternalEditorProps {
169
175
  extensions?: AnyExtension[];
170
176
  content?: Content;
171
177
  editable?: boolean;
178
+ /** Editing experience preset; 'notion' paints dm-notion-mode on the wrapper. Create-time only. */
179
+ preset?: EditorPreset;
172
180
  autofocus?: FocusPosition;
173
181
  immediatelyRender?: boolean;
174
182
  outputFormat?: 'html' | 'json';
@@ -231,6 +239,10 @@ declare const DomternalEditor: vue.DefineComponent<vue.ExtractPropTypes<{
231
239
  type: BooleanConstructor;
232
240
  default: boolean;
233
241
  };
242
+ preset: {
243
+ type: PropType<EditorPreset>;
244
+ default: undefined;
245
+ };
234
246
  autofocus: {
235
247
  type: PropType<FocusPosition>;
236
248
  default: boolean;
@@ -304,6 +316,10 @@ declare const DomternalEditor: vue.DefineComponent<vue.ExtractPropTypes<{
304
316
  type: BooleanConstructor;
305
317
  default: boolean;
306
318
  };
319
+ preset: {
320
+ type: PropType<EditorPreset>;
321
+ default: undefined;
322
+ };
307
323
  autofocus: {
308
324
  type: PropType<FocusPosition>;
309
325
  default: boolean;
@@ -376,11 +392,12 @@ declare const DomternalEditor: vue.DefineComponent<vue.ExtractPropTypes<{
376
392
  onDestroy: () => void;
377
393
  content: Content;
378
394
  class: string;
379
- editable: boolean;
395
+ preset: EditorPreset;
380
396
  onSelectionChange: (props: {
381
397
  editor: Editor;
382
398
  }) => void;
383
399
  extensions: AnyExtension[];
400
+ editable: boolean;
384
401
  autofocus: FocusPosition;
385
402
  outputFormat: "html" | "json";
386
403
  immediatelyRender: boolean;
package/dist/index.js CHANGED
@@ -33,7 +33,8 @@ function useEditor(options = {}) {
33
33
  extensions: [...defaults, ...extensions],
34
34
  content: initialContent,
35
35
  editable,
36
- autofocus: focus
36
+ autofocus: focus,
37
+ ...options.preset ? { preset: options.preset } : {}
37
38
  });
38
39
  markRaw(ed);
39
40
  wireEvents(ed);
@@ -69,6 +70,7 @@ function useEditor(options = {}) {
69
70
  const mount = editorRef.value;
70
71
  if (mount && ed.view.dom.parentElement !== mount) {
71
72
  mount.appendChild(ed.view.dom);
73
+ ed.adoptPresetClass();
72
74
  }
73
75
  return;
74
76
  }
@@ -279,6 +281,7 @@ function useToolbarController(editor, layout) {
279
281
  const toolbarRef = ref();
280
282
  let cleanupFloating = null;
281
283
  let clickOutsideHandler = null;
284
+ let escapeHandler = null;
282
285
  let dismissOverlayHandler = null;
283
286
  let editorEl = null;
284
287
  let syncStateRaf = 0;
@@ -315,6 +318,17 @@ function useToolbarController(editor, layout) {
315
318
  }
316
319
  };
317
320
  document.addEventListener("mousedown", clickOutsideHandler);
321
+ escapeHandler = (e) => {
322
+ if (!controller?.openDropdown) return;
323
+ if (e.key !== "Escape") return;
324
+ if (toolbarRef.value?.contains(document.activeElement)) return;
325
+ cleanupFloating?.();
326
+ cleanupFloating = null;
327
+ controller.closeDropdown();
328
+ syncState();
329
+ e.preventDefault();
330
+ };
331
+ document.addEventListener("keydown", escapeHandler);
318
332
  editorEl = ed.view.dom.closest(".dm-editor");
319
333
  if (editorEl) {
320
334
  dismissOverlayHandler = () => {
@@ -338,6 +352,10 @@ function useToolbarController(editor, layout) {
338
352
  document.removeEventListener("mousedown", clickOutsideHandler);
339
353
  clickOutsideHandler = null;
340
354
  }
355
+ if (escapeHandler) {
356
+ document.removeEventListener("keydown", escapeHandler);
357
+ escapeHandler = null;
358
+ }
341
359
  if (dismissOverlayHandler && editorEl) {
342
360
  editorEl.removeEventListener("dm:dismiss-overlays", dismissOverlayHandler);
343
361
  dismissOverlayHandler = null;
@@ -1212,7 +1230,8 @@ function useBubbleMenu(options) {
1212
1230
  }
1213
1231
  trailing.value = {
1214
1232
  isNodeSelection: isNode,
1215
- showColorPickerButton: hasNotionColorPicker,
1233
+ // Hidden without a live notionColorOpen listener: the trigger would be dead.
1234
+ showColorPickerButton: hasNotionColorPicker && currentEd.listenerCount("notionColorOpen") > 0,
1216
1235
  showBlockMenuButton: hasBlockContextMenu,
1217
1236
  blockMenuButtonDisabled: blockMenuDisabled,
1218
1237
  currentTextColorVar: textVar,
@@ -2198,6 +2217,7 @@ var Domternal = defineComponent({
2198
2217
  extensions: { type: Array, default: void 0 },
2199
2218
  content: { type: [String, Object], default: "" },
2200
2219
  editable: { type: Boolean, default: true },
2220
+ preset: { type: String, default: void 0 },
2201
2221
  autofocus: { type: [Boolean, String, Number], default: false },
2202
2222
  outputFormat: { type: String, default: "html" },
2203
2223
  immediatelyRender: { type: Boolean, default: false },
@@ -2213,6 +2233,7 @@ var Domternal = defineComponent({
2213
2233
  ...props.extensions && { extensions: props.extensions },
2214
2234
  content: props.content,
2215
2235
  editable: props.editable,
2236
+ ...props.preset && { preset: props.preset },
2216
2237
  autofocus: props.autofocus,
2217
2238
  outputFormat: props.outputFormat,
2218
2239
  immediatelyRender: props.immediatelyRender,
@@ -2249,6 +2270,7 @@ var DomternalContent = defineComponent({
2249
2270
  const editorDom = ed.view.dom;
2250
2271
  if (editorDom.parentElement !== container) {
2251
2272
  container.appendChild(editorDom);
2273
+ ed.adoptPresetClass();
2252
2274
  }
2253
2275
  });
2254
2276
  return () => {
@@ -2276,6 +2298,7 @@ var DomternalEditor = defineComponent({
2276
2298
  extensions: { type: Array, default: void 0 },
2277
2299
  content: { type: [String, Object], default: void 0 },
2278
2300
  editable: { type: Boolean, default: true },
2301
+ preset: { type: String, default: void 0 },
2279
2302
  autofocus: { type: [Boolean, String, Number], default: false },
2280
2303
  immediatelyRender: { type: Boolean, default: false },
2281
2304
  outputFormat: { type: String, default: "html" },
@@ -2296,6 +2319,7 @@ var DomternalEditor = defineComponent({
2296
2319
  ...props.extensions && { extensions: props.extensions },
2297
2320
  content: props.modelValue ?? props.content ?? "",
2298
2321
  editable: props.editable,
2322
+ ...props.preset && { preset: props.preset },
2299
2323
  autofocus: props.autofocus,
2300
2324
  immediatelyRender: props.immediatelyRender,
2301
2325
  outputFormat: props.outputFormat,
@@ -2385,6 +2409,7 @@ var EditorContent = defineComponent({
2385
2409
  const editorDom = editor.view.dom;
2386
2410
  if (editorDom.parentElement !== container) {
2387
2411
  container.appendChild(editorDom);
2412
+ editor.adoptPresetClass();
2388
2413
  }
2389
2414
  });
2390
2415
  return () => h("div", {