@dxos/react-ui-editor 0.8.4-main.dedc0f3 → 0.8.4-main.ead640a

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 (218) hide show
  1. package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
  2. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +5482 -5519
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +71 -1
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/browser/types/index.mjs +1 -1
  9. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  10. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  11. package/dist/lib/node-esm/index.mjs +5482 -5519
  12. package/dist/lib/node-esm/index.mjs.map +4 -4
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +71 -1
  15. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  16. package/dist/lib/node-esm/types/index.mjs +1 -1
  17. package/dist/types/src/components/Editor/Editor.d.ts +24 -9
  18. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  19. package/dist/types/src/components/Editor/Editor.stories.d.ts +27 -0
  20. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  22. package/dist/types/src/components/EditorToolbar/util.d.ts +1 -1
  23. package/dist/types/src/components/index.d.ts +0 -1
  24. package/dist/types/src/components/index.d.ts.map +1 -1
  25. package/dist/types/src/extensions/{autocomplete.d.ts → autocomplete/autocomplete.d.ts} +1 -1
  26. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  27. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  28. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  29. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  30. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  31. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  32. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  33. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  34. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  35. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  36. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  37. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +1 -1
  38. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  39. package/dist/types/src/extensions/automerge/sync.d.ts +2 -2
  40. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  41. package/dist/types/src/extensions/autoscroll.d.ts +2 -2
  42. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -1
  43. package/dist/types/src/extensions/factories.d.ts +7 -2
  44. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  45. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  46. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  47. package/dist/types/src/extensions/index.d.ts +2 -1
  48. package/dist/types/src/extensions/index.d.ts.map +1 -1
  49. package/dist/types/src/extensions/json.d.ts +1 -1
  50. package/dist/types/src/extensions/json.d.ts.map +1 -1
  51. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  52. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  53. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  54. package/dist/types/src/extensions/modes.d.ts +1 -1
  55. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  56. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  57. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  58. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts +36 -0
  59. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +1 -0
  60. package/dist/types/src/extensions/popover/index.d.ts +8 -0
  61. package/dist/types/src/extensions/popover/index.d.ts.map +1 -0
  62. package/dist/types/src/extensions/popover/menu-presets.d.ts +4 -0
  63. package/dist/types/src/extensions/popover/menu-presets.d.ts.map +1 -0
  64. package/dist/types/src/extensions/popover/menu.d.ts +24 -0
  65. package/dist/types/src/extensions/popover/menu.d.ts.map +1 -0
  66. package/dist/types/src/extensions/popover/modal.d.ts +7 -0
  67. package/dist/types/src/extensions/popover/modal.d.ts.map +1 -0
  68. package/dist/types/src/extensions/popover/popover.d.ts +47 -0
  69. package/dist/types/src/extensions/popover/popover.d.ts.map +1 -0
  70. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +34 -0
  71. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +1 -0
  72. package/dist/types/src/extensions/popover/util.d.ts +8 -0
  73. package/dist/types/src/extensions/popover/util.d.ts.map +1 -0
  74. package/dist/types/src/extensions/preview/preview.d.ts +0 -2
  75. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  76. package/dist/types/src/extensions/state.d.ts +2 -0
  77. package/dist/types/src/extensions/state.d.ts.map +1 -0
  78. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -1
  79. package/dist/types/src/extensions/tags/xml-tags.d.ts +1 -0
  80. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -1
  81. package/dist/types/src/hooks/useTextEditor.d.ts +4 -8
  82. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  83. package/dist/types/src/stories/{Command.stories.d.ts → CommandDialog.stories.d.ts} +2 -3
  84. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  85. package/dist/types/src/stories/Comments.stories.d.ts +3 -4
  86. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  87. package/dist/types/src/stories/EditorToolbar.stories.d.ts +1 -2
  88. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  89. package/dist/types/src/stories/Experimental.stories.d.ts +3 -4
  90. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  91. package/dist/types/src/stories/Markdown.stories.d.ts +3 -4
  92. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  93. package/dist/types/src/stories/Outliner.stories.d.ts +0 -1
  94. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  95. package/dist/types/src/stories/{CommandMenu.stories.d.ts → Popover.stories.d.ts} +6 -6
  96. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  97. package/dist/types/src/stories/Preview.stories.d.ts +3 -4
  98. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  99. package/dist/types/src/stories/Tags.stories.d.ts +0 -1
  100. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  101. package/dist/types/src/stories/TextEditor.stories.d.ts +3 -5
  102. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  103. package/dist/types/src/stories/components/EditorStory.d.ts +5 -5
  104. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  105. package/dist/types/src/styles/theme.d.ts.map +1 -1
  106. package/dist/types/src/testing/PreviewPopover.d.ts +20 -0
  107. package/dist/types/src/testing/PreviewPopover.d.ts.map +1 -0
  108. package/dist/types/src/testing/index.d.ts +1 -0
  109. package/dist/types/src/testing/index.d.ts.map +1 -1
  110. package/dist/types/src/types/types.d.ts +1 -1
  111. package/dist/types/src/types/types.d.ts.map +1 -1
  112. package/dist/types/src/util/index.d.ts +0 -1
  113. package/dist/types/src/util/index.d.ts.map +1 -1
  114. package/dist/types/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +55 -52
  116. package/src/components/Editor/Editor.stories.tsx +69 -0
  117. package/src/components/Editor/Editor.tsx +57 -14
  118. package/src/components/EditorToolbar/EditorToolbar.tsx +1 -0
  119. package/src/components/index.ts +0 -1
  120. package/src/extensions/{autocomplete.ts → autocomplete/autocomplete.ts} +2 -1
  121. package/src/extensions/autocomplete/index.ts +8 -0
  122. package/src/extensions/autocomplete/match.ts +46 -0
  123. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  124. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  125. package/src/extensions/automerge/automerge.stories.tsx +8 -8
  126. package/src/extensions/automerge/automerge.ts +28 -9
  127. package/src/extensions/automerge/sync.ts +7 -3
  128. package/src/extensions/autoscroll.ts +43 -37
  129. package/src/extensions/factories.ts +41 -12
  130. package/src/extensions/focus.ts +5 -4
  131. package/src/extensions/folding.tsx +4 -6
  132. package/src/extensions/hashtag.tsx +2 -2
  133. package/src/extensions/index.ts +2 -1
  134. package/src/extensions/json.ts +1 -1
  135. package/src/extensions/markdown/bundle.ts +16 -4
  136. package/src/extensions/markdown/decorate.ts +1 -0
  137. package/src/extensions/markdown/link.ts +3 -0
  138. package/src/extensions/modes.ts +2 -2
  139. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +15 -20
  140. package/src/extensions/outliner/outliner.ts +3 -3
  141. package/src/extensions/popover/PopoverMenuProvider.tsx +221 -0
  142. package/src/extensions/popover/index.ts +12 -0
  143. package/src/extensions/popover/menu-presets.ts +124 -0
  144. package/src/extensions/popover/menu.ts +67 -0
  145. package/src/extensions/popover/modal.ts +24 -0
  146. package/src/extensions/popover/popover.ts +291 -0
  147. package/src/extensions/popover/usePopoverMenu.ts +173 -0
  148. package/src/extensions/popover/util.ts +29 -0
  149. package/src/extensions/preview/index.ts +1 -1
  150. package/src/extensions/preview/preview.ts +0 -5
  151. package/src/extensions/selection.ts +2 -2
  152. package/src/extensions/state.ts +7 -0
  153. package/src/extensions/tags/streamer.ts +4 -5
  154. package/src/extensions/tags/xml-tags.ts +59 -1
  155. package/src/hooks/useTextEditor.ts +27 -39
  156. package/src/stories/{Command.stories.tsx → CommandDialog.stories.tsx} +10 -22
  157. package/src/stories/Comments.stories.tsx +5 -5
  158. package/src/stories/EditorToolbar.stories.tsx +6 -5
  159. package/src/stories/Experimental.stories.tsx +6 -6
  160. package/src/stories/Markdown.stories.tsx +5 -5
  161. package/src/stories/Outliner.stories.tsx +42 -26
  162. package/src/stories/Popover.stories.tsx +163 -0
  163. package/src/stories/Preview.stories.tsx +9 -9
  164. package/src/stories/Tags.stories.tsx +5 -5
  165. package/src/stories/TextEditor.stories.tsx +7 -32
  166. package/src/stories/components/EditorStory.tsx +7 -5
  167. package/src/styles/theme.ts +12 -10
  168. package/src/{components/Popover/RefDropdownMenu.tsx → testing/PreviewPopover.tsx} +20 -29
  169. package/src/testing/index.ts +1 -0
  170. package/src/types/types.ts +1 -1
  171. package/src/util/index.ts +0 -1
  172. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  174. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  175. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  176. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -14
  177. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  178. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -37
  179. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  180. package/dist/types/src/components/Popover/index.d.ts +0 -4
  181. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  182. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  183. package/dist/types/src/extensions/command/action.d.ts +0 -17
  184. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  185. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  186. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  187. package/dist/types/src/extensions/command/command.d.ts +0 -6
  188. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  189. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  190. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  191. package/dist/types/src/extensions/command/hint.d.ts +0 -19
  192. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  193. package/dist/types/src/extensions/command/index.d.ts +0 -7
  194. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  195. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  196. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  197. package/dist/types/src/extensions/command/state.d.ts +0 -16
  198. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  199. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  200. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  201. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  202. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  203. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  204. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  205. package/dist/types/src/util/domino.d.ts +0 -18
  206. package/dist/types/src/util/domino.d.ts.map +0 -1
  207. package/src/components/Popover/CommandMenu.tsx +0 -279
  208. package/src/components/Popover/RefPopover.tsx +0 -117
  209. package/src/components/Popover/index.ts +0 -7
  210. package/src/extensions/command/action.ts +0 -56
  211. package/src/extensions/command/command-menu.ts +0 -211
  212. package/src/extensions/command/command.ts +0 -34
  213. package/src/extensions/command/hint.ts +0 -103
  214. package/src/extensions/command/index.ts +0 -10
  215. package/src/extensions/command/state.ts +0 -90
  216. package/src/extensions/command/useCommandMenu.ts +0 -119
  217. package/src/stories/CommandMenu.stories.tsx +0 -160
  218. package/src/util/domino.ts +0 -51
@@ -1,26 +0,0 @@
1
- import { type EditorView } from '@codemirror/view';
2
- import { type RefObject } from 'react';
3
- import { type DxAnchor, type DxAnchorActivate } from '@dxos/lit-ui';
4
- import { type MaybePromise } from '@dxos/util';
5
- import { type CommandMenuGroup, type CommandMenuItem } from '../../components';
6
- import { type PlaceholderOptions } from './placeholder';
7
- export type UseCommandMenuOptions = {
8
- viewRef: RefObject<EditorView | undefined>;
9
- trigger: string | string[];
10
- placeholder?: Partial<PlaceholderOptions>;
11
- getMenu: (trigger: string, query?: string) => MaybePromise<CommandMenuGroup[]>;
12
- };
13
- export declare const useCommandMenu: ({ viewRef, trigger, placeholder, getMenu }: UseCommandMenuOptions) => {
14
- commandMenu: (import("@codemirror/state").Extension | import("@codemirror/state").StateField<{
15
- trigger: string;
16
- range: import("../..").Range;
17
- } | null>)[];
18
- currentItem: string | undefined;
19
- groupsRef: import("react").MutableRefObject<CommandMenuGroup[]>;
20
- ref: import("react").MutableRefObject<DxAnchor | null>;
21
- open: boolean;
22
- onActivate: (event: DxAnchorActivate) => Promise<void>;
23
- onOpenChange: import("react").Dispatch<import("react").SetStateAction<boolean>>;
24
- onSelect: (item: CommandMenuItem) => void;
25
- };
26
- //# sourceMappingURL=useCommandMenu.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCommandMenu.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/command/useCommandMenu.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,SAAS,EAA0C,MAAM,OAAO,CAAC;AAE/E,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAyC,MAAM,kBAAkB,CAAC;AAGtH,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC1C,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC;CAChF,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,4CAA4C,qBAAqB;;;;;;;;;wBAwB9E,gBAAgB;;qBAeQ,eAAe;CAyDxD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Command.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/Command.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAuC,MAAM,OAAO,CAAC;AA4D5D,QAAA,MAAM,IAAI;;;;;;;CAgBqB,CAAC;AAEhC,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommandMenu.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/CommandMenu.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAA8B,MAAM,OAAO,CAAC;AAmBnD,OAAO,EAAE,KAAK,qBAAqB,EAAkB,MAAM,eAAe,CAAC;AAQ3E,KAAK,UAAU,GAAG,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA+B5E,QAAA,MAAM,IAAI;;mCA7BkC,UAAU;;;;;CAoCjB,CAAC;AAEtC,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAGnC,eAAO,MAAM,KAAK,EAAE,KAkBnB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KA2DlB,CAAC"}
@@ -1,18 +0,0 @@
1
- import { type ClassNameValue } from '@dxos/react-ui-types';
2
- /**
3
- * Super lightweight chainable DOM builder.
4
- */
5
- export declare class Domino<T extends HTMLElement> {
6
- static of<K extends keyof HTMLElementTagNameMap>(tag: K): Domino<HTMLElementTagNameMap[K]>;
7
- private readonly _el;
8
- constructor(tag: keyof HTMLElementTagNameMap);
9
- classNames(...classNames: ClassNameValue[]): this;
10
- text(value: string): this;
11
- data(key: string, value: string): this;
12
- style(styles: Partial<CSSStyleDeclaration>): this;
13
- attr<K extends keyof T>(key: K, value: T[K]): this;
14
- child<C extends HTMLElement>(...children: Domino<C>[]): this;
15
- on(event: string, handler: (e: Event) => void): this;
16
- build(): T;
17
- }
18
- //# sourceMappingURL=domino.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"domino.d.ts","sourceRoot":"","sources":["../../../../src/util/domino.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;GAEG;AACH,qBAAa,MAAM,CAAC,CAAC,SAAS,WAAW;IACvC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,MAAM,qBAAqB,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAI1F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAI;gBACZ,GAAG,EAAE,MAAM,qBAAqB;IAG5C,UAAU,CAAC,GAAG,UAAU,EAAE,cAAc,EAAE,GAAG,IAAI;IAIjD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAItC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAIjD,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAIlD,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAI5D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAIpD,KAAK,IAAI,CAAC;CAGX"}
@@ -1,279 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { type EditorView } from '@codemirror/view';
6
- import React, { Fragment, useCallback, useEffect, useRef } from 'react';
7
-
8
- import { Icon, type Label, Popover, toLocalizedString, useThemeContext, useTranslation } from '@dxos/react-ui';
9
- import { type MaybePromise } from '@dxos/util';
10
-
11
- import { commandRangeEffect } from '../../extensions';
12
-
13
- export type CommandMenuGroup = {
14
- id: string;
15
- label?: Label;
16
- items: CommandMenuItem[];
17
- };
18
-
19
- export type CommandMenuItem = {
20
- id: string;
21
- label: Label;
22
- icon?: string;
23
- onSelect?: (view: EditorView, head: number) => MaybePromise<void>;
24
- };
25
-
26
- export type CommandMenuProps = {
27
- groups: CommandMenuGroup[];
28
- currentItem?: string;
29
- onSelect: (item: CommandMenuItem) => void;
30
- };
31
-
32
- // NOTE: Not using DropdownMenu because the command menu needs to manage focus explicitly.
33
- export const CommandMenu = ({ groups, currentItem, onSelect }: CommandMenuProps) => {
34
- const { tx } = useThemeContext();
35
- const groupsWithItems = groups.filter((group) => group.items.length > 0);
36
- return (
37
- <Popover.Portal>
38
- <Popover.Content
39
- align='start'
40
- onOpenAutoFocus={(event) => event.preventDefault()}
41
- classNames={tx('menu.content', 'menu--exotic-unfocusable', { elevation: 'positioned' }, [
42
- 'max-h-[300px] overflow-y-auto',
43
- ])}
44
- >
45
- <Popover.Viewport classNames={tx('menu.viewport', 'menu__viewport--exotic-unfocusable', {})}>
46
- <ul>
47
- {groupsWithItems.map((group, index) => (
48
- <Fragment key={group.id}>
49
- <CommandGroup group={group} currentItem={currentItem} onSelect={onSelect} />
50
- {index < groupsWithItems.length - 1 && <div className={tx('menu.separator', 'menu__item', {})} />}
51
- </Fragment>
52
- ))}
53
- </ul>
54
- </Popover.Viewport>
55
- </Popover.Content>
56
- </Popover.Portal>
57
- );
58
- };
59
-
60
- const CommandGroup = ({
61
- group,
62
- currentItem,
63
- onSelect,
64
- }: {
65
- group: CommandMenuGroup;
66
- currentItem?: string;
67
- onSelect: (item: CommandMenuItem) => void;
68
- }) => {
69
- const { tx } = useThemeContext();
70
- const { t } = useTranslation();
71
- return (
72
- <>
73
- {group.label && (
74
- <div className={tx('menu.groupLabel', 'menu__group__label', {})}>
75
- <span>{toLocalizedString(group.label, t)}</span>
76
- </div>
77
- )}
78
- {group.items.map((item) => (
79
- <CommandItem key={item.id} item={item} current={currentItem === item.id} onSelect={onSelect} />
80
- ))}
81
- </>
82
- );
83
- };
84
-
85
- const CommandItem = ({
86
- item,
87
- current,
88
- onSelect,
89
- }: {
90
- item: CommandMenuItem;
91
- current: boolean;
92
- onSelect: (item: CommandMenuItem) => void;
93
- }) => {
94
- const ref = useRef<HTMLLIElement>(null);
95
- const { tx } = useThemeContext();
96
- const { t } = useTranslation();
97
- const handleSelect = useCallback(() => onSelect(item), [item, onSelect]);
98
-
99
- useEffect(() => {
100
- if (current && ref.current) {
101
- ref.current.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
102
- }
103
- }, [current]);
104
-
105
- return (
106
- <li
107
- ref={ref}
108
- className={tx('menu.item', 'menu__item--exotic-unfocusable', {}, [current && 'bg-hoverSurface'])}
109
- onClick={handleSelect}
110
- >
111
- {item.icon && <Icon icon={item.icon} size={5} />}
112
- <span className='grow truncate'>{toLocalizedString(item.label, t)}</span>
113
- </li>
114
- );
115
- };
116
-
117
- // TODO(wittjosiah): Factor out into a separate file.
118
-
119
- //
120
- // Helpers
121
- //
122
-
123
- export const getItem = (groups: CommandMenuGroup[], id?: string): CommandMenuItem | undefined => {
124
- return groups.flatMap((group) => group.items).find((item) => item.id === id);
125
- };
126
-
127
- export const getNextItem = (groups: CommandMenuGroup[], id?: string): CommandMenuItem => {
128
- const items = groups.flatMap((group) => group.items);
129
- const index = items.findIndex((item) => item.id === id);
130
- return items[(index + 1) % items.length];
131
- };
132
-
133
- export const getPreviousItem = (groups: CommandMenuGroup[], id?: string): CommandMenuItem => {
134
- const items = groups.flatMap((group) => group.items);
135
- const index = items.findIndex((item) => item.id === id);
136
- return items[(index - 1 + items.length) % items.length];
137
- };
138
-
139
- export const filterItems = (
140
- groups: CommandMenuGroup[],
141
- filter: (item: CommandMenuItem) => boolean,
142
- ): CommandMenuGroup[] => {
143
- return groups.map((group) => ({
144
- ...group,
145
- items: group.items.filter(filter),
146
- }));
147
- };
148
-
149
- export const insertAtCursor = (view: EditorView, head: number, insert: string) => {
150
- view.dispatch({
151
- changes: { from: head, to: head, insert },
152
- selection: { anchor: head + insert.length, head: head + insert.length },
153
- });
154
- };
155
-
156
- /**
157
- * If the cursor is at the start of a line, insert the text at the cursor.
158
- * Otherwise, insert the text on a new line.
159
- */
160
- export const insertAtLineStart = (view: EditorView, head: number, insert: string) => {
161
- const line = view.state.doc.lineAt(head);
162
- if (line.from === head) {
163
- insertAtCursor(view, head, insert);
164
- } else {
165
- insert = '\n' + insert;
166
- view.dispatch({
167
- changes: { from: line.to, to: line.to, insert },
168
- selection: { anchor: line.to + insert.length, head: line.to + insert.length },
169
- });
170
- }
171
- };
172
-
173
- export const coreSlashCommands: CommandMenuGroup = {
174
- id: 'markdown',
175
- label: 'Markdown',
176
- items: [
177
- {
178
- id: 'heading-1',
179
- label: 'Heading 1',
180
- icon: 'ph--text-h-one--regular',
181
- onSelect: (view, head) => insertAtLineStart(view, head, '# '),
182
- },
183
- {
184
- id: 'heading-2',
185
- label: 'Heading 2',
186
- icon: 'ph--text-h-two--regular',
187
- onSelect: (view, head) => insertAtLineStart(view, head, '## '),
188
- },
189
- {
190
- id: 'heading-3',
191
- label: 'Heading 3',
192
- icon: 'ph--text-h-three--regular',
193
- onSelect: (view, head) => insertAtLineStart(view, head, '### '),
194
- },
195
- {
196
- id: 'heading-4',
197
- label: 'Heading 4',
198
- icon: 'ph--text-h-four--regular',
199
- onSelect: (view, head) => insertAtLineStart(view, head, '#### '),
200
- },
201
- {
202
- id: 'heading-5',
203
- label: 'Heading 5',
204
- icon: 'ph--text-h-five--regular',
205
- onSelect: (view, head) => insertAtLineStart(view, head, '##### '),
206
- },
207
- {
208
- id: 'heading-6',
209
- label: 'Heading 6',
210
- icon: 'ph--text-h-six--regular',
211
- onSelect: (view, head) => insertAtLineStart(view, head, '###### '),
212
- },
213
- {
214
- id: 'bullet-list',
215
- label: 'Bullet List',
216
- icon: 'ph--list-bullets--regular',
217
- onSelect: (view, head) => insertAtLineStart(view, head, '- '),
218
- },
219
- {
220
- id: 'numbered-list',
221
- label: 'Numbered List',
222
- icon: 'ph--list-numbers--regular',
223
- onSelect: (view, head) => insertAtLineStart(view, head, '1. '),
224
- },
225
- {
226
- id: 'task-list',
227
- label: 'Task List',
228
- icon: 'ph--list-checks--regular',
229
- onSelect: (view, head) => insertAtLineStart(view, head, '- [ ] '),
230
- },
231
- {
232
- id: 'quote',
233
- label: 'Quote',
234
- icon: 'ph--quotes--regular',
235
- onSelect: (view, head) => insertAtLineStart(view, head, '> '),
236
- },
237
- {
238
- id: 'code-block',
239
- label: 'Code Block',
240
- icon: 'ph--code-block--regular',
241
- onSelect: (view, head) => insertAtLineStart(view, head, '```\n\n```'),
242
- },
243
- {
244
- id: 'table',
245
- label: 'Table',
246
- icon: 'ph--table--regular',
247
- onSelect: (view, head) => insertAtLineStart(view, head, '| | | |\n|---|---|---|\n| | | |'),
248
- },
249
- ],
250
- };
251
-
252
- export const linkSlashCommands: CommandMenuGroup = {
253
- id: 'link',
254
- label: 'Link',
255
- items: [
256
- {
257
- id: 'inline-link',
258
- label: 'Inline link',
259
- icon: 'ph--link--regular',
260
- onSelect: (view, head) =>
261
- view.dispatch({
262
- changes: { from: head, insert: '@' },
263
- selection: { anchor: head + 1, head: head + 1 },
264
- effects: commandRangeEffect.of({ trigger: '@', range: { from: head, to: head + 1 } }),
265
- }),
266
- },
267
- {
268
- id: 'block-embed',
269
- label: 'Block embed',
270
- icon: 'ph--lego--regular',
271
- onSelect: (view, head) =>
272
- view.dispatch({
273
- changes: { from: head, insert: '@@' },
274
- selection: { anchor: head + 2, head: head + 2 },
275
- effects: commandRangeEffect.of({ trigger: '@', range: { from: head, to: head + 2 } }),
276
- }),
277
- },
278
- ],
279
- };
@@ -1,117 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { createContext } from '@radix-ui/react-context';
6
- import React, {
7
- type PropsWithChildren,
8
- type RefObject,
9
- forwardRef,
10
- useCallback,
11
- useEffect,
12
- useRef,
13
- useState,
14
- } from 'react';
15
-
16
- import { addEventListener } from '@dxos/async';
17
- import { type DxAnchor, type DxAnchorActivate } from '@dxos/lit-ui';
18
- import { Popover } from '@dxos/react-ui';
19
-
20
- import { type PreviewLinkRef, type PreviewLinkTarget, type PreviewLookup } from '../../extensions';
21
-
22
- // TODO(burdon): Move to @dxos/lit-ui
23
-
24
- //
25
- // Context
26
- //
27
-
28
- type RefPopoverValue = Partial<{
29
- link: PreviewLinkRef;
30
- target: PreviewLinkTarget;
31
- pending: boolean;
32
- }>;
33
-
34
- const [RefPopoverContextProvider, useRefPopover] = createContext<RefPopoverValue>('RefPopover', {});
35
-
36
- //
37
- // ContextProvider
38
- //
39
-
40
- type PreviewProviderProps = PropsWithChildren<{
41
- onLookup?: PreviewLookup;
42
- }>;
43
-
44
- const PreviewProvider = ({ children, onLookup }: PreviewProviderProps) => {
45
- const trigger = useRef<DxAnchor | null>(null);
46
- const [value, setValue] = useState<RefPopoverValue>({});
47
- const [open, setOpen] = useState(false);
48
-
49
- const handleDxAnchorActivate = useCallback(
50
- (event: DxAnchorActivate) => {
51
- const { refId, label, trigger: dxTrigger } = event;
52
- setValue((value) => ({
53
- ...value,
54
- link: { label, ref: refId },
55
- pending: true,
56
- }));
57
- trigger.current = dxTrigger;
58
- queueMicrotask(() => setOpen(true));
59
- void onLookup?.({ label, ref: refId }).then((target) =>
60
- setValue((value) => ({
61
- ...value,
62
- target: target ?? undefined,
63
- pending: false,
64
- })),
65
- );
66
- },
67
- [onLookup],
68
- );
69
-
70
- return (
71
- <RefPopoverContextProvider pending={value.pending} link={value.link} target={value.target}>
72
- <RefPopover ref={trigger} open={open} onOpenChange={setOpen} onActivate={handleDxAnchorActivate}>
73
- {children}
74
- </RefPopover>
75
- </RefPopoverContextProvider>
76
- );
77
- };
78
-
79
- //
80
- // Popover
81
- //
82
-
83
- type RefPopoverProps = PropsWithChildren<{
84
- modal?: boolean;
85
- open?: boolean;
86
- onOpenChange?: (open: boolean) => void;
87
- onActivate?: (event: DxAnchorActivate) => void;
88
- }>;
89
-
90
- /**
91
- * Wraps components that contain <dx-anchor> elements?
92
- */
93
- const RefPopover = forwardRef<DxAnchor | null, RefPopoverProps>(
94
- ({ children, open, onOpenChange, modal, onActivate }, ref) => {
95
- const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);
96
- useEffect(() => {
97
- if (!rootRef || !onActivate) {
98
- return;
99
- }
100
-
101
- return addEventListener(rootRef, 'dx-anchor-activate' as any, onActivate, { capture: true, passive: false });
102
- }, [rootRef, onActivate]);
103
-
104
- return (
105
- <Popover.Root open={open} onOpenChange={onOpenChange} modal={modal}>
106
- <Popover.VirtualTrigger virtualRef={ref as unknown as RefObject<HTMLButtonElement>} />
107
- <div role='none' className='contents' ref={setRootRef}>
108
- {children}
109
- </div>
110
- </Popover.Root>
111
- );
112
- },
113
- );
114
-
115
- export { RefPopover, PreviewProvider, useRefPopover };
116
-
117
- export type { RefPopoverProps, PreviewProviderProps, RefPopoverValue };
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2022 DXOS.org
3
- //
4
-
5
- export * from './CommandMenu';
6
- export * from './RefPopover';
7
- export * from './RefDropdownMenu';
@@ -1,56 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { StateEffect } from '@codemirror/state';
6
- import { type Command, type EditorView, type KeyBinding } from '@codemirror/view';
7
-
8
- import { commandState } from './state';
9
-
10
- export type Action =
11
- | {
12
- type: 'insert';
13
- text: string;
14
- }
15
- | {
16
- type: 'cancel';
17
- };
18
-
19
- export type ActionHandler = (action: Action) => void;
20
-
21
- export const openEffect = StateEffect.define<{ pos: number; fullWidth?: boolean }>();
22
- export const closeEffect = StateEffect.define<null>();
23
-
24
- export const openCommand: Command = (view: EditorView) => {
25
- if (view.state.field(commandState, false)) {
26
- const selection = view.state.selection.main;
27
- const line = view.state.doc.lineAt(selection.from);
28
- if (line.from === selection.from && line.from === line.to) {
29
- view.dispatch({ effects: openEffect.of({ pos: selection.anchor, fullWidth: true }) });
30
- return true;
31
- }
32
- }
33
-
34
- return false;
35
- };
36
-
37
- export const closeCommand: Command = (view: EditorView) => {
38
- if (view.state.field(commandState, false)) {
39
- view.dispatch({ effects: closeEffect.of(null) });
40
- return true;
41
- }
42
-
43
- return false;
44
- };
45
-
46
- export const commandKeyBindings: readonly KeyBinding[] = [
47
- {
48
- key: '/',
49
- preventDefault: true,
50
- run: openCommand,
51
- },
52
- {
53
- key: 'Escape',
54
- run: closeCommand,
55
- },
56
- ];