@dxos/react-ui-editor 0.4.3-main.38898ae → 0.4.3-main.3a01342

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.
@@ -1,7 +1,7 @@
1
1
  // packages/ui/react-ui-editor/src/index.ts
2
+ import { keymap as keymap8 } from "@codemirror/view";
2
3
  import { TextKind } from "@dxos/protocols/proto/dxos/echo/model/text";
3
4
  import { Doc, YText, YXmlFragment } from "@dxos/text-model";
4
- import { keymap as keymap7 } from "@codemirror/view";
5
5
 
6
6
  // packages/ui/react-ui-editor/src/components/TextEditor/index.ts
7
7
  import { tags as tags2 } from "@lezer/highlight";
@@ -9,7 +9,7 @@ import { tags as tags2 } from "@lezer/highlight";
9
9
  // packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx
10
10
  import { EditorState as EditorState2 } from "@codemirror/state";
11
11
  import { EditorView as EditorView15 } from "@codemirror/view";
12
- import { vim } from "@replit/codemirror-vim";
12
+ import { useFocusableGroup } from "@fluentui/react-tabster";
13
13
  import defaultsDeep2 from "lodash.defaultsdeep";
14
14
  import React, { forwardRef, useCallback, useEffect as useEffect2, useImperativeHandle, useRef, useState as useState2 } from "react";
15
15
  import { log as log2 } from "@dxos/log";
@@ -3517,13 +3517,42 @@ var mention = ({ onSearch }) => {
3517
3517
  });
3518
3518
  };
3519
3519
 
3520
+ // packages/ui/react-ui-editor/src/extensions/modes.ts
3521
+ import { Facet as Facet4 } from "@codemirror/state";
3522
+ import { keymap as keymap6 } from "@codemirror/view";
3523
+ import { vim } from "@replit/codemirror-vim";
3524
+ var editorMode = Facet4.define({
3525
+ combine: (modes) => modes[0] ?? {}
3526
+ });
3527
+ var EditorModes = {
3528
+ default: [],
3529
+ vim: [
3530
+ vim(),
3531
+ editorMode.of({
3532
+ type: "vim",
3533
+ noTabster: true
3534
+ }),
3535
+ keymap6.of([
3536
+ {
3537
+ key: "Alt-Escape",
3538
+ run: (view) => {
3539
+ view.dispatch({
3540
+ userEvent: "focus.container"
3541
+ });
3542
+ return true;
3543
+ }
3544
+ }
3545
+ ])
3546
+ ]
3547
+ };
3548
+
3520
3549
  // packages/ui/react-ui-editor/src/extensions/outliner.ts
3521
3550
  var outliner = (options = {}) => {
3522
3551
  return [];
3523
3552
  };
3524
3553
 
3525
3554
  // packages/ui/react-ui-editor/src/extensions/typewriter.ts
3526
- import { keymap as keymap6 } from "@codemirror/view";
3555
+ import { keymap as keymap7 } from "@codemirror/view";
3527
3556
  var defaultItems = [
3528
3557
  "hello world!",
3529
3558
  "this is a test.",
@@ -3533,7 +3562,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
3533
3562
  let t;
3534
3563
  let idx = 0;
3535
3564
  return [
3536
- keymap6.of([
3565
+ keymap7.of([
3537
3566
  {
3538
3567
  // Reset.
3539
3568
  key: "alt-meta-'",
@@ -3821,11 +3850,10 @@ var codeTheme = {
3821
3850
 
3822
3851
  // packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx
3823
3852
  var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx";
3824
- var EditorModes = [
3825
- "default",
3826
- "vim"
3827
- ];
3828
- var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, autoFocus, scrollTo, selection, editorMode, theme, slots = defaultSlots, extensions = [], debug }, forwardedRef) => {
3853
+ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, autoFocus, scrollTo, selection, theme, slots = defaultSlots, extensions = [], debug }, forwardedRef) => {
3854
+ const tabsterDOMAttribute = useFocusableGroup({
3855
+ tabBehavior: "limited"
3856
+ });
3829
3857
  const { themeMode } = useThemeContext();
3830
3858
  const rootRef = useRef(null);
3831
3859
  const [view, setView] = useState2(null);
@@ -3860,7 +3888,7 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, autoFocus, s
3860
3888
  EditorView15.exceptionSink.of((err) => {
3861
3889
  log2.catch(err, void 0, {
3862
3890
  F: __dxlog_file3,
3863
- L: 135,
3891
+ L: 112,
3864
3892
  S: void 0,
3865
3893
  C: (f, a) => f(...a)
3866
3894
  });
@@ -3876,14 +3904,20 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, autoFocus, s
3876
3904
  EditorView15.contentAttributes.of({
3877
3905
  class: slots.content?.className ?? ""
3878
3906
  }),
3907
+ // Focus.
3908
+ EditorView15.updateListener.of((update2) => {
3909
+ update2.transactions.forEach((transaction) => {
3910
+ if (transaction.isUserEvent("focus.container")) {
3911
+ rootRef.current?.focus();
3912
+ }
3913
+ });
3914
+ }),
3879
3915
  // State.
3880
3916
  EditorView15.editable.of(!readonly),
3881
3917
  EditorState2.readOnly.of(!!readonly),
3882
3918
  // Storage and replication.
3883
3919
  // NOTE: This must come before user extensions.
3884
3920
  model.extension,
3885
- // TODO(burdon): Factor out? (Requires special handling for Escape/Enter below).
3886
- editorMode === "vim" && vim(),
3887
3921
  // Custom.
3888
3922
  ...extensions
3889
3923
  ].filter(isNotFalsy4)
@@ -3903,6 +3937,9 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, autoFocus, s
3903
3937
  });
3904
3938
  view?.destroy();
3905
3939
  setView(newView);
3940
+ if (state.facet(editorMode).noTabster) {
3941
+ rootRef.current.removeAttribute("data-tabster");
3942
+ }
3906
3943
  return () => {
3907
3944
  newView?.destroy();
3908
3945
  setView(null);
@@ -3911,35 +3948,27 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, autoFocus, s
3911
3948
  rootRef,
3912
3949
  model,
3913
3950
  readonly,
3914
- editorMode,
3915
3951
  themeMode
3916
3952
  ]);
3917
3953
  const handleKeyUp = useCallback((event) => {
3918
- const { key, altKey, shiftKey, metaKey, ctrlKey } = event;
3954
+ const { key } = event;
3919
3955
  switch (key) {
3920
3956
  case "Enter": {
3921
3957
  view?.focus();
3922
3958
  break;
3923
3959
  }
3924
- case "Escape": {
3925
- if (editorMode === "vim" && (altKey || shiftKey || metaKey || ctrlKey)) {
3926
- view?.focus();
3927
- }
3928
- break;
3929
- }
3930
3960
  }
3931
3961
  }, [
3932
- view,
3933
- editorMode
3962
+ view
3934
3963
  ]);
3935
3964
  return /* @__PURE__ */ React.createElement("div", {
3936
- key: model.id,
3937
3965
  role: "none",
3966
+ ref: rootRef,
3967
+ key: model.id,
3938
3968
  tabIndex: 0,
3939
- ...slots.root,
3940
- // {...(editorMode !== 'vim' && tabsterDOMAttribute)}
3941
3969
  onKeyUp: handleKeyUp,
3942
- ref: rootRef
3970
+ ...slots.root,
3971
+ ...tabsterDOMAttribute
3943
3972
  });
3944
3973
  });
3945
3974
  var TextEditor = /* @__PURE__ */ forwardRef(({ readonly, placeholder: placeholder3, lineWrapping, theme = textTheme, slots, extensions = [], ...props }, forwardedRef) => {
@@ -4643,6 +4672,7 @@ export {
4643
4672
  defaultSlots,
4644
4673
  defaultTextSlots,
4645
4674
  defaultTheme,
4675
+ editorMode,
4646
4676
  editorWithToolbarLayout,
4647
4677
  focusComment,
4648
4678
  formatting,
@@ -4652,7 +4682,7 @@ export {
4652
4682
  hr,
4653
4683
  image,
4654
4684
  insertTable,
4655
- keymap7 as keymap,
4685
+ keymap8 as keymap,
4656
4686
  link,
4657
4687
  listener,
4658
4688
  logChanges,