@dxos/plugin-markdown 0.6.13-main.ed424a1 → 0.6.13-staging.1e988a3

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 (122) hide show
  1. package/dist/lib/browser/DocumentCard-2P4EICBA.mjs +11 -0
  2. package/dist/lib/browser/DocumentEditor-GPWV3VN3.mjs +11 -0
  3. package/dist/lib/browser/MarkdownEditor-EKJJQEFL.mjs +10 -0
  4. package/dist/lib/browser/MarkdownEditor-EKJJQEFL.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-354DCID5.mjs +117 -0
  6. package/dist/lib/browser/chunk-354DCID5.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-4GGD6YJO.mjs +19 -0
  8. package/dist/lib/browser/chunk-4GGD6YJO.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-7AF2JLK4.mjs +164 -0
  10. package/dist/lib/browser/chunk-7AF2JLK4.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-US5O2P3R.mjs → chunk-CQJL4G4X.mjs} +2 -4
  12. package/dist/lib/browser/chunk-CQJL4G4X.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-RL7QY322.mjs +86 -0
  14. package/dist/lib/browser/chunk-RL7QY322.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-VUN4QKTT.mjs +208 -0
  16. package/dist/lib/browser/chunk-VUN4QKTT.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +117 -78
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/meta.mjs +1 -1
  21. package/dist/lib/browser/types/index.mjs +4 -6
  22. package/dist/lib/node/{chunk-P7YU53RP.cjs → DocumentCard-EHJDDSRY.cjs} +10 -16
  23. package/dist/lib/node/DocumentCard-EHJDDSRY.cjs.map +7 -0
  24. package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs +29 -0
  25. package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs.map +7 -0
  26. package/dist/lib/node/MarkdownEditor-UE23H75V.cjs +31 -0
  27. package/dist/lib/node/MarkdownEditor-UE23H75V.cjs.map +7 -0
  28. package/dist/lib/node/chunk-7XIBNEI7.cjs +238 -0
  29. package/dist/lib/node/chunk-7XIBNEI7.cjs.map +7 -0
  30. package/dist/lib/node/chunk-KTYIOXL5.cjs +149 -0
  31. package/dist/lib/node/chunk-KTYIOXL5.cjs.map +7 -0
  32. package/dist/lib/node/chunk-Q4ZSCBQE.cjs +114 -0
  33. package/dist/lib/node/chunk-Q4ZSCBQE.cjs.map +7 -0
  34. package/dist/lib/node/chunk-RVGN72IX.cjs +189 -0
  35. package/dist/lib/node/chunk-RVGN72IX.cjs.map +7 -0
  36. package/dist/lib/node/chunk-TGMR2CKU.cjs +52 -0
  37. package/dist/lib/node/chunk-TGMR2CKU.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-UJMOZCIA.cjs → chunk-VWQH4WC2.cjs} +8 -11
  39. package/dist/lib/node/chunk-VWQH4WC2.cjs.map +7 -0
  40. package/dist/lib/node/index.cjs +147 -112
  41. package/dist/lib/node/index.cjs.map +4 -4
  42. package/dist/lib/node/meta.cjs +3 -3
  43. package/dist/lib/node/meta.cjs.map +1 -1
  44. package/dist/lib/node/meta.json +1 -1
  45. package/dist/lib/node/types/index.cjs +6 -8
  46. package/dist/lib/node/types/index.cjs.map +2 -2
  47. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  48. package/dist/types/src/components/DocumentCard.d.ts +16 -0
  49. package/dist/types/src/components/DocumentCard.d.ts.map +1 -0
  50. package/dist/types/src/components/DocumentEditor.d.ts +14 -0
  51. package/dist/types/src/components/DocumentEditor.d.ts.map +1 -0
  52. package/dist/types/src/components/HeadingMenu.d.ts +13 -0
  53. package/dist/types/src/components/HeadingMenu.d.ts.map +1 -0
  54. package/dist/types/src/components/Layout.d.ts +6 -0
  55. package/dist/types/src/components/Layout.d.ts.map +1 -0
  56. package/dist/types/src/components/MarkdownEditor.d.ts +3 -8
  57. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  58. package/dist/types/src/components/MarkdownEditor.stories.d.ts +3 -3
  59. package/dist/types/src/components/MarkdownEditor.stories.d.ts.map +1 -1
  60. package/dist/types/src/components/index.d.ts +11 -2
  61. package/dist/types/src/components/index.d.ts.map +1 -1
  62. package/dist/types/src/extensions.d.ts +15 -11
  63. package/dist/types/src/extensions.d.ts.map +1 -1
  64. package/dist/types/src/meta.d.ts +9 -4
  65. package/dist/types/src/meta.d.ts.map +1 -1
  66. package/dist/types/src/types/document.d.ts +1 -10
  67. package/dist/types/src/types/document.d.ts.map +1 -1
  68. package/dist/types/src/types/types.d.ts +9 -8
  69. package/dist/types/src/types/types.d.ts.map +1 -1
  70. package/package.json +36 -41
  71. package/src/MarkdownPlugin.tsx +97 -50
  72. package/src/components/DocumentCard.tsx +107 -0
  73. package/src/components/DocumentEditor.tsx +137 -0
  74. package/src/components/HeadingMenu.tsx +46 -0
  75. package/src/components/Layout.tsx +27 -0
  76. package/src/components/MarkdownEditor.stories.tsx +7 -13
  77. package/src/components/MarkdownEditor.tsx +75 -40
  78. package/src/components/Toolbar.stories.tsx +2 -2
  79. package/src/components/index.ts +14 -2
  80. package/src/extensions.tsx +67 -124
  81. package/src/meta.tsx +19 -0
  82. package/src/types/document.ts +0 -12
  83. package/src/types/types.ts +7 -10
  84. package/src/util.tsx +2 -2
  85. package/dist/lib/browser/MarkdownContainer-AYBJNSXD.mjs +0 -467
  86. package/dist/lib/browser/MarkdownContainer-AYBJNSXD.mjs.map +0 -7
  87. package/dist/lib/browser/chunk-45N5MEOV.mjs +0 -50
  88. package/dist/lib/browser/chunk-45N5MEOV.mjs.map +0 -7
  89. package/dist/lib/browser/chunk-DRJ3FPYF.mjs +0 -15
  90. package/dist/lib/browser/chunk-DRJ3FPYF.mjs.map +0 -7
  91. package/dist/lib/browser/chunk-US5O2P3R.mjs.map +0 -7
  92. package/dist/lib/node/MarkdownContainer-IM3V72FY.cjs +0 -482
  93. package/dist/lib/node/MarkdownContainer-IM3V72FY.cjs.map +0 -7
  94. package/dist/lib/node/chunk-P7YU53RP.cjs.map +0 -7
  95. package/dist/lib/node/chunk-UJMOZCIA.cjs.map +0 -7
  96. package/dist/lib/node/chunk-W2YJVZ3N.cjs +0 -72
  97. package/dist/lib/node/chunk-W2YJVZ3N.cjs.map +0 -7
  98. package/dist/lib/node-esm/MarkdownContainer-56YBSFBE.mjs +0 -468
  99. package/dist/lib/node-esm/MarkdownContainer-56YBSFBE.mjs.map +0 -7
  100. package/dist/lib/node-esm/chunk-MIDCCMIX.mjs +0 -42
  101. package/dist/lib/node-esm/chunk-MIDCCMIX.mjs.map +0 -7
  102. package/dist/lib/node-esm/chunk-NEVN5WR6.mjs +0 -17
  103. package/dist/lib/node-esm/chunk-NEVN5WR6.mjs.map +0 -7
  104. package/dist/lib/node-esm/chunk-UCNOGIBC.mjs +0 -51
  105. package/dist/lib/node-esm/chunk-UCNOGIBC.mjs.map +0 -7
  106. package/dist/lib/node-esm/index.mjs +0 -494
  107. package/dist/lib/node-esm/index.mjs.map +0 -7
  108. package/dist/lib/node-esm/meta.json +0 -1
  109. package/dist/lib/node-esm/meta.mjs +0 -10
  110. package/dist/lib/node-esm/types/index.mjs +0 -15
  111. package/dist/types/src/components/MarkdownContainer.d.ts +0 -15
  112. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  113. package/dist/types/src/hooks/index.d.ts +0 -2
  114. package/dist/types/src/hooks/index.d.ts.map +0 -1
  115. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  116. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  117. package/src/components/MarkdownContainer.tsx +0 -108
  118. package/src/hooks/index.ts +0 -5
  119. package/src/hooks/useSelectCurrentThread.tsx +0 -46
  120. package/src/meta.ts +0 -15
  121. /package/dist/lib/{node-esm/meta.mjs.map → browser/DocumentCard-2P4EICBA.mjs.map} +0 -0
  122. /package/dist/lib/{node-esm/types/index.mjs.map → browser/DocumentEditor-GPWV3VN3.mjs.map} +0 -0
@@ -1,16 +1,20 @@
1
- import { type ReactNode } from 'react';
2
1
  import { type IntentDispatcher } from '@dxos/app-framework';
3
2
  import { type Query } from '@dxos/react-client/echo';
4
- import { type EditorViewMode, type Extension } from '@dxos/react-ui-editor';
5
- import { type DocumentType, type MarkdownPluginState, type MarkdownSettingsProps } from './types';
6
- type ExtensionsOptions = {
7
- document: DocumentType;
8
- dispatch?: IntentDispatcher;
9
- query?: Query<DocumentType>;
10
- settings: MarkdownSettingsProps;
3
+ import { type Extension, type EditorViewMode } from '@dxos/react-ui-editor';
4
+ import { type DocumentType, type MarkdownSettingsProps } from './types';
5
+ export type ExtensionsOptions = {
11
6
  viewMode?: EditorViewMode;
7
+ settings?: MarkdownSettingsProps;
8
+ document?: DocumentType;
9
+ debug?: boolean;
10
+ experimental?: boolean;
11
+ numberedHeadings?: boolean;
12
+ folding?: boolean;
13
+ query?: Query<DocumentType>;
14
+ dispatch?: IntentDispatcher;
12
15
  };
13
- export declare const useExtensions: ({ extensionProviders, document, settings, viewMode, }: Pick<ExtensionsOptions, "document" | "settings" | "viewMode"> & Pick<MarkdownPluginState, "extensionProviders">) => Extension[];
14
- export declare const renderRoot: <T extends Element>(root: T, node: ReactNode) => T;
15
- export {};
16
+ /**
17
+ * Create extension instances for editor.
18
+ */
19
+ export declare const createBaseExtensions: ({ viewMode, settings, document, query, dispatch, }: ExtensionsOptions) => Extension[];
16
20
  //# sourceMappingURL=extensions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../../src/extensions.tsx"],"names":[],"mappings":"AAIA,OAAc,EAA6B,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAGlF,OAAO,EAAE,KAAK,gBAAgB,EAAyC,MAAM,qBAAqB,CAAC;AAEnG,OAAO,EAAiD,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAIpG,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,SAAS,EAQf,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGlG,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAGF,eAAO,MAAM,aAAa,0DAKvB,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,GAC9D,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,KAAG,SAAS,EA2D5D,CAAC;AA+HF,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,OAAO,QAAQ,CAAC,QAAQ,SAAS,KAAG,CAGxE,CAAC"}
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../../src/extensions.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,cAAc,EAQpB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAExE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,uDAM9B,iBAAiB,KAAG,SAAS,EAkF/B,CAAC"}
@@ -1,10 +1,15 @@
1
+ import { type IconProps } from '@phosphor-icons/react';
2
+ import React from 'react';
1
3
  export declare const MARKDOWN_PLUGIN = "dxos.org/plugin/markdown";
2
4
  declare const _default: {
3
5
  id: string;
4
- name: string;
5
- description: string;
6
- homePage: string;
7
- icon: string;
6
+ shortId?: string;
7
+ name?: string;
8
+ description?: string;
9
+ homePage?: string;
10
+ tags?: string[];
11
+ iconComponent?: React.FC<IconProps>;
12
+ iconSymbol?: string;
8
13
  };
9
14
  export default _default;
10
15
  //# sourceMappingURL=meta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/meta.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,6BAA6B,CAAC;;;;;;;;AAE1D,wBAMuB"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/meta.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,eAAO,MAAM,eAAe,6BAA6B,CAAC;;;;;;;;;;;AAE1D,wBAOG"}
@@ -9,12 +9,12 @@ declare const TextType_base: import("@dxos/echo-schema").AbstractTypedObject<{
9
9
  export declare class TextType extends TextType_base {
10
10
  }
11
11
  declare const DocumentType_base: import("@dxos/echo-schema").AbstractTypedObject<{
12
+ name?: string | undefined;
12
13
  content: import("@dxos/echo-schema").Ref<{
13
14
  content: string;
14
15
  } & {
15
16
  id: string;
16
17
  }>;
17
- name?: string | undefined;
18
18
  fallbackName?: string | undefined;
19
19
  threads: import("@dxos/echo-schema").Ref<{
20
20
  name?: string | undefined;
@@ -23,7 +23,6 @@ declare const DocumentType_base: import("@dxos/echo-schema").AbstractTypedObject
23
23
  messages: import("@dxos/echo-schema").Ref<{
24
24
  text: string;
25
25
  timestamp: string;
26
- state?: import("@dxos/plugin-space/types").MessageState | undefined;
27
26
  sender: {
28
27
  name?: string | undefined;
29
28
  contact?: import("@dxos/echo-schema").Ref<{
@@ -66,7 +65,6 @@ declare const DocumentType_base: import("@dxos/echo-schema").AbstractTypedObject
66
65
  messages: import("@dxos/echo-schema").Ref<{
67
66
  text: string;
68
67
  timestamp: string;
69
- state?: import("@dxos/plugin-space/types").MessageState | undefined;
70
68
  sender: {
71
69
  name?: string | undefined;
72
70
  contact?: import("@dxos/echo-schema").Ref<{
@@ -95,12 +93,5 @@ declare const DocumentType_base: import("@dxos/echo-schema").AbstractTypedObject
95
93
  }>>;
96
94
  export declare class DocumentType extends DocumentType_base {
97
95
  }
98
- /**
99
- * Checks if an object conforms to the interface needed to render an editor.
100
- */
101
- export declare const isEditorModel: (data: any) => data is {
102
- id: string;
103
- text: string;
104
- };
105
96
  export {};
106
97
  //# sourceMappingURL=document.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../../src/types/document.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;;;;;;;;AAGxD,qBAAa,QAAS,SAAQ,aAE5B;CAAG;;;;;;;;;;;;;;;;iBAoBshF,CAAC;;oBAA8D,CAAC;uBAAyC,CAAC;wBAAwD,CAAC;;;;;;;;2BAAsP,CAAC;qBAAuC,CAAC;;iBAA8C,CAAC;sBAA4E,CAAC;;;mBAAwE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;iBAAvoB,CAAC;;oBAA8D,CAAC;uBAAyC,CAAC;wBAAwD,CAAC;;;;;;;;2BAAsP,CAAC;qBAAuC,CAAC;;iBAA8C,CAAC;sBAA4E,CAAC;;;mBAAwE,CAAC;;;;;;;;AAlBlqG,qBAAa,YAAa,SAAQ,iBAKhC;CAAG;AAEL;;GAEG;AAEH,eAAO,MAAM,aAAa,SAAU,GAAG,KAAG,IAAI,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAM7C,CAAC"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../../src/types/document.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;;;;;;;;AAGxD,qBAAa,QAAS,SAAQ,aAE5B;CAAG;;;;;;;;;;;;;;;;;oBAQ+rF,CAAC;uBAAyC,CAAC;wBAAwD,CAAC;;;;;;;;2BAAsP,CAAC;qBAAuC,CAAC;;iBAA8C,CAAC;sBAA4E,CAAC;;;mBAAwE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;oBAAxkB,CAAC;uBAAyC,CAAC;wBAAwD,CAAC;;;;;;;;2BAAsP,CAAC;qBAAuC,CAAC;;iBAA8C,CAAC;sBAA4E,CAAC;;;mBAAwE,CAAC;;;;;;;;AAN5wG,qBAAa,YAAa,SAAQ,iBAKhC;CAAG"}
@@ -1,6 +1,5 @@
1
1
  import type { GraphBuilderProvides, GraphSerializerProvides, IntentResolverProvides, MetadataRecordsProvides, SettingsProvides, SurfaceProvides, TranslationsProvides } from '@dxos/app-framework';
2
2
  import { type SchemaProvides } from '@dxos/plugin-client';
3
- import { type SpaceInitProvides } from '@dxos/plugin-space';
4
3
  import { type Extension, type EditorInputMode, type EditorViewMode } from '@dxos/react-ui-editor';
5
4
  import { type DocumentType } from './document';
6
5
  export declare enum MarkdownAction {
@@ -8,13 +7,13 @@ export declare enum MarkdownAction {
8
7
  SET_VIEW_MODE = "dxos.org/plugin/markdown/action/set-view-mode"
9
8
  }
10
9
  export type MarkdownProperties = Record<string, any>;
11
- export type MarkdownExtensionProvider = (props: {
10
+ export type ExtensionsProvider = (props: {
12
11
  document?: DocumentType;
13
- }) => Extension | undefined;
12
+ }) => Extension[];
14
13
  export type OnChange = (text: string) => void;
15
14
  export type MarkdownExtensionProvides = {
16
15
  markdown: {
17
- extensions: MarkdownExtensionProvider;
16
+ extensions: ExtensionsProvider;
18
17
  };
19
18
  };
20
19
  type StackProvides = {
@@ -23,8 +22,10 @@ type StackProvides = {
23
22
  };
24
23
  };
25
24
  export type MarkdownPluginState = {
26
- extensionProviders?: MarkdownExtensionProvider[];
27
- viewMode: Record<string, EditorViewMode>;
25
+ extensionProviders: NonNullable<ExtensionsProvider>[];
26
+ viewMode: {
27
+ [key: string]: EditorViewMode;
28
+ };
28
29
  };
29
30
  export type MarkdownSettingsProps = {
30
31
  defaultViewMode: EditorViewMode;
@@ -39,9 +40,9 @@ export type MarkdownSettingsProps = {
39
40
  type ThreadProvides<T> = {
40
41
  thread: {
41
42
  predicate: (obj: any) => obj is T;
42
- createSort: (obj: T) => (anchorA: string | undefined, anchorB: string | undefined) => number;
43
+ createSort: (obj: T) => (anchorA: string, anchorB: string) => number;
43
44
  };
44
45
  };
45
- export type MarkdownPluginProvides = SurfaceProvides & IntentResolverProvides & GraphBuilderProvides & GraphSerializerProvides & MetadataRecordsProvides & SettingsProvides<MarkdownSettingsProps> & TranslationsProvides & SchemaProvides & SpaceInitProvides & StackProvides & ThreadProvides<DocumentType>;
46
+ export type MarkdownPluginProvides = SurfaceProvides & IntentResolverProvides & GraphBuilderProvides & GraphSerializerProvides & MetadataRecordsProvides & SettingsProvides<MarkdownSettingsProps> & TranslationsProvides & SchemaProvides & StackProvides & ThreadProvides<DocumentType>;
46
47
  export {};
47
48
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAElG,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,oBAAY,cAAc;IACxB,MAAM,2CAA8B;IACpC,aAAa,kDAAqC;CACnD;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAGrD,MAAM,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,CAAA;CAAE,KAAK,SAAS,GAAG,SAAS,CAAC;AAEtG,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAE9C,MAAM,MAAM,yBAAyB,GAAG;IAEtC,QAAQ,EAAE;QACR,UAAU,EAAE,yBAAyB,CAAC;KACvC,CAAC;CACH,CAAC;AAGF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;KAClC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAEhC,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IAIjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,eAAe,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAGF,KAAK,cAAc,CAAC,CAAC,IAAI;IACvB,MAAM,EAAE;QACN,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;QAClC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;KAC9F,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAClD,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,gBAAgB,CAAC,qBAAqB,CAAC,GACvC,oBAAoB,GACpB,cAAc,GACd,iBAAiB,GACjB,aAAa,GACb,cAAc,CAAC,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAElG,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,oBAAY,cAAc;IACxB,MAAM,2CAA8B;IACpC,aAAa,kDAAqC;CACnD;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAErD,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,CAAA;CAAE,KAAK,SAAS,EAAE,CAAC;AAErF,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAE9C,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE;QACR,UAAU,EAAE,kBAAkB,CAAC;KAChC,CAAC;CACH,CAAC;AAGF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;KAClC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAEhC,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAItD,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;KAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,eAAe,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAIF,KAAK,cAAc,CAAC,CAAC,IAAI;IACvB,MAAM,EAAE;QACN,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;QAClC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;KACtE,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAClD,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,gBAAgB,CAAC,qBAAqB,CAAC,GACvC,oBAAoB,GACpB,cAAc,GACd,aAAa,GACb,cAAc,CAAC,YAAY,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-markdown",
3
- "version": "0.6.13-main.ed424a1",
3
+ "version": "0.6.13-staging.1e988a3",
4
4
  "description": "DXOS Surface plugin for interacting with Markdown",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,24 +10,21 @@
10
10
  ".": {
11
11
  "browser": "./dist/lib/browser/index.mjs",
12
12
  "node": {
13
- "require": "./dist/lib/node/index.cjs",
14
- "default": "./dist/lib/node-esm/index.mjs"
13
+ "default": "./dist/lib/node/index.cjs"
15
14
  },
16
15
  "types": "./dist/types/src/index.d.ts"
17
16
  },
18
17
  "./meta": {
19
18
  "browser": "./dist/lib/browser/meta.mjs",
20
19
  "node": {
21
- "require": "./dist/lib/node/meta.cjs",
22
- "default": "./dist/lib/node-esm/meta.mjs"
20
+ "default": "./dist/lib/node/meta.cjs"
23
21
  },
24
22
  "types": "./dist/types/src/meta.d.ts"
25
23
  },
26
24
  "./types": {
27
25
  "browser": "./dist/lib/browser/types/index.mjs",
28
26
  "node": {
29
- "require": "./dist/lib/node/types/index.cjs",
30
- "default": "./dist/lib/node-esm/types/index.mjs"
27
+ "default": "./dist/lib/node/types/index.cjs"
31
28
  },
32
29
  "types": "./dist/types/src/types/index.d.ts"
33
30
  }
@@ -49,31 +46,29 @@
49
46
  ],
50
47
  "dependencies": {
51
48
  "@codemirror/search": "^6.5.6",
52
- "@codemirror/view": "^6.34.1",
53
- "@effect/schema": "^0.75.1",
49
+ "@codemirror/view": "^6.29.1",
54
50
  "@preact/signals-core": "^1.6.0",
55
- "@dxos/app-framework": "0.6.13-main.ed424a1",
56
- "@dxos/async": "0.6.13-main.ed424a1",
57
- "@dxos/echo-schema": "0.6.13-main.ed424a1",
58
- "@dxos/invariant": "0.6.13-main.ed424a1",
59
- "@dxos/keys": "0.6.13-main.ed424a1",
60
- "@dxos/local-storage": "0.6.13-main.ed424a1",
61
- "@dxos/log": "0.6.13-main.ed424a1",
62
- "@dxos/plugin-attention": "0.6.13-main.ed424a1",
63
- "@dxos/plugin-client": "0.6.13-main.ed424a1",
64
- "@dxos/plugin-graph": "0.6.13-main.ed424a1",
65
- "@dxos/plugin-space": "0.6.13-main.ed424a1",
66
- "@dxos/plugin-settings": "0.6.13-main.ed424a1",
67
- "@dxos/plugin-theme": "0.6.13-main.ed424a1",
68
- "@dxos/react-client": "0.6.13-main.ed424a1",
69
- "@dxos/react-hooks": "0.6.13-main.ed424a1",
70
- "@dxos/react-ui-attention": "0.6.13-main.ed424a1",
71
- "@dxos/react-ui-card": "0.6.13-main.ed424a1",
72
- "@dxos/react-ui-deck": "0.6.13-main.ed424a1",
73
- "@dxos/react-ui-editor": "0.6.13-main.ed424a1",
74
- "@dxos/react-ui-stack": "0.6.13-main.ed424a1",
75
- "@dxos/util": "0.6.13-main.ed424a1",
76
- "@dxos/react-ui-mosaic": "0.6.13-main.ed424a1"
51
+ "@dxos/app-framework": "0.6.13-staging.1e988a3",
52
+ "@dxos/async": "0.6.13-staging.1e988a3",
53
+ "@dxos/echo-schema": "0.6.13-staging.1e988a3",
54
+ "@dxos/keys": "0.6.13-staging.1e988a3",
55
+ "@dxos/local-storage": "0.6.13-staging.1e988a3",
56
+ "@dxos/invariant": "0.6.13-staging.1e988a3",
57
+ "@dxos/log": "0.6.13-staging.1e988a3",
58
+ "@dxos/plugin-attention": "0.6.13-staging.1e988a3",
59
+ "@dxos/plugin-client": "0.6.13-staging.1e988a3",
60
+ "@dxos/plugin-graph": "0.6.13-staging.1e988a3",
61
+ "@dxos/plugin-space": "0.6.13-staging.1e988a3",
62
+ "@dxos/plugin-theme": "0.6.13-staging.1e988a3",
63
+ "@dxos/plugin-settings": "0.6.13-staging.1e988a3",
64
+ "@dxos/react-client": "0.6.13-staging.1e988a3",
65
+ "@dxos/react-hooks": "0.6.13-staging.1e988a3",
66
+ "@dxos/react-ui-deck": "0.6.13-staging.1e988a3",
67
+ "@dxos/react-ui-card": "0.6.13-staging.1e988a3",
68
+ "@dxos/react-ui-editor": "0.6.13-staging.1e988a3",
69
+ "@dxos/react-ui-mosaic": "0.6.13-staging.1e988a3",
70
+ "@dxos/react-ui-stack": "0.6.13-staging.1e988a3",
71
+ "@dxos/util": "0.6.13-staging.1e988a3"
77
72
  },
78
73
  "devDependencies": {
79
74
  "@phosphor-icons/react": "^2.1.5",
@@ -81,18 +76,18 @@
81
76
  "@types/react-dom": "~18.2.0",
82
77
  "react": "~18.2.0",
83
78
  "react-dom": "~18.2.0",
84
- "vite": "5.4.7",
85
- "@dxos/react-ui": "0.6.13-main.ed424a1",
86
- "@dxos/random": "0.6.13-main.ed424a1",
87
- "@dxos/react-ui-theme": "0.6.13-main.ed424a1",
88
- "@dxos/storybook-utils": "0.6.13-main.ed424a1"
79
+ "vite": "^5.3.4",
80
+ "@dxos/random": "0.6.13-staging.1e988a3",
81
+ "@dxos/storybook-utils": "0.6.13-staging.1e988a3",
82
+ "@dxos/react-ui": "0.6.13-staging.1e988a3",
83
+ "@dxos/react-ui-theme": "0.6.13-staging.1e988a3"
89
84
  },
90
- "peerDependencies": {
85
+ "optionalDependencies": {
91
86
  "@phosphor-icons/react": "^2.1.5",
92
- "react": "~18.2.0",
93
- "react-dom": "~18.2.0",
94
- "@dxos/react-ui": "0.6.13-main.ed424a1",
95
- "@dxos/react-ui-theme": "0.6.13-main.ed424a1"
87
+ "react": "^18.0.0",
88
+ "react-dom": "^18.0.0",
89
+ "@dxos/react-ui": "0.6.13-staging.1e988a3",
90
+ "@dxos/react-ui-theme": "0.6.13-staging.1e988a3"
96
91
  },
97
92
  "publishConfig": {
98
93
  "access": "public"
@@ -2,10 +2,11 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { TextAa } from '@phosphor-icons/react';
6
- import React from 'react';
5
+ import { type IconProps, TextAa } from '@phosphor-icons/react';
6
+ import React, { type Ref } from 'react';
7
7
 
8
8
  import {
9
+ isObject,
9
10
  parseIntentPlugin,
10
11
  resolvePlugin,
11
12
  LayoutAction,
@@ -15,6 +16,7 @@ import {
15
16
  } from '@dxos/app-framework';
16
17
  import { create } from '@dxos/echo-schema';
17
18
  import { LocalStorageStore } from '@dxos/local-storage';
19
+ import { log } from '@dxos/log';
18
20
  import { parseClientPlugin } from '@dxos/plugin-client';
19
21
  import { type ActionGroup, createExtension, isActionGroup } from '@dxos/plugin-graph';
20
22
  import { SpaceAction } from '@dxos/plugin-space';
@@ -32,11 +34,12 @@ import {
32
34
  EditorViewModes,
33
35
  translations as editorTranslations,
34
36
  } from '@dxos/react-ui-editor';
37
+ import { isTileComponentProps } from '@dxos/react-ui-mosaic';
35
38
 
36
- import { MarkdownContainer, MarkdownSettings } from './components';
39
+ import { type DocumentItemProps, DocumentCard, DocumentEditor, MarkdownEditor, MarkdownSettings } from './components';
37
40
  import meta, { MARKDOWN_PLUGIN } from './meta';
38
41
  import translations from './translations';
39
- import { DocumentType, isEditorModel, TextType } from './types';
42
+ import { DocumentType, TextType } from './types';
40
43
  import {
41
44
  type MarkdownPluginProvides,
42
45
  type MarkdownSettingsProps,
@@ -45,22 +48,37 @@ import {
45
48
  } from './types';
46
49
  import { markdownExtensionPlugins, serializer } from './util';
47
50
 
48
- // TODO(burdon): Normalize active/object.
49
- const getDoc = (object: any) => (object instanceof DocumentType ? object : undefined);
51
+ /**
52
+ * Checks if an object conforms to the interface needed to render an editor.
53
+ */
54
+ const isEditorModel = (data: any): data is { id: string; text: string } => {
55
+ return (
56
+ data &&
57
+ typeof data === 'object' &&
58
+ 'id' in data &&
59
+ typeof data.id === 'string' &&
60
+ 'text' in data &&
61
+ typeof data.text === 'string'
62
+ );
63
+ };
50
64
 
51
65
  export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
52
66
  const settings = new LocalStorageStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN, {
53
67
  defaultViewMode: 'preview',
54
68
  toolbar: true,
55
- numberedHeadings: true,
56
69
  folding: false,
57
70
  experimental: false,
58
71
  });
59
72
 
60
73
  const state = new LocalStorageStore<MarkdownPluginState>(MARKDOWN_PLUGIN, { extensionProviders: [], viewMode: {} });
61
74
 
62
- const getViewMode = (id: string) => (id && state.values.viewMode[id]) || settings.values.defaultViewMode;
63
- const setViewMode = (id: string, viewMode: EditorViewMode) => (state.values.viewMode[id] = viewMode);
75
+ const getViewMode = (id?: string) => {
76
+ return (id && state.values.viewMode[id]) || settings.values.defaultViewMode;
77
+ };
78
+
79
+ const setViewMode = (id: string, nextViewMode: EditorViewMode) => {
80
+ state.values.viewMode[id] = nextViewMode;
81
+ };
64
82
 
65
83
  return {
66
84
  meta,
@@ -91,7 +109,7 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
91
109
 
92
110
  markdownExtensionPlugins(plugins).forEach((plugin) => {
93
111
  const { extensions } = plugin.provides.markdown;
94
- state.values.extensionProviders?.push(extensions);
112
+ state.values.extensionProviders.push(extensions);
95
113
  });
96
114
  },
97
115
  provides: {
@@ -99,9 +117,10 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
99
117
  metadata: {
100
118
  records: {
101
119
  [DocumentType.typename]: {
102
- label: (object: any) => (object instanceof DocumentType ? object.name || object.fallbackName : undefined),
120
+ label: (object: any) => (object instanceof DocumentType ? object.name ?? object.fallbackName : undefined),
103
121
  placeholder: ['document title placeholder', { ns: MARKDOWN_PLUGIN }],
104
- icon: 'ph--text-aa--regular',
122
+ icon: (props: IconProps) => <TextAa {...props} />,
123
+ iconSymbol: 'ph--text-aa--regular',
105
124
  graphProps: {
106
125
  managesAutofocus: true,
107
126
  },
@@ -115,12 +134,6 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
115
134
  echo: {
116
135
  schema: [DocumentType, TextType],
117
136
  },
118
- space: {
119
- onSpaceCreate: {
120
- label: ['create document label', { ns: MARKDOWN_PLUGIN }],
121
- action: MarkdownAction.CREATE,
122
- },
123
- },
124
137
  graph: {
125
138
  builder: (plugins) => {
126
139
  const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
@@ -154,7 +167,8 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
154
167
  },
155
168
  properties: {
156
169
  label: ['create document label', { ns: MARKDOWN_PLUGIN }],
157
- icon: 'ph--text-aa--regular',
170
+ icon: (props: IconProps) => <TextAa {...props} />,
171
+ iconSymbol: 'ph--text-aa--regular',
158
172
  testId: 'markdownPlugin.createObject',
159
173
  },
160
174
  },
@@ -227,10 +241,13 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
227
241
  ],
228
242
  },
229
243
  thread: {
244
+ // TODO(Zan): How to better handle the type predicate?
230
245
  predicate: (obj) => obj instanceof DocumentType,
231
246
  createSort: (doc: DocumentType) => {
232
247
  const accessor = doc.content ? createDocAccessor(doc.content, ['content']) : undefined;
248
+
233
249
  if (!accessor) {
250
+ log.warn('No accessor found for document content.');
234
251
  return (_) => 0;
235
252
  }
236
253
 
@@ -239,45 +256,75 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
239
256
  return range?.start ?? Number.MAX_SAFE_INTEGER;
240
257
  };
241
258
 
242
- return (anchorA: string | undefined, anchorB: string | undefined): number => {
243
- if (anchorA === undefined || anchorB === undefined) {
244
- return 0;
245
- }
246
- const posA = getStartPosition(anchorA);
247
- const posB = getStartPosition(anchorB);
248
- return posA - posB;
249
- };
259
+ return (anchorA: string, anchorB: string) => getStartPosition(anchorA) - getStartPosition(anchorB);
250
260
  },
251
261
  },
252
262
  surface: {
253
- component: ({ data, role }) => {
263
+ component: ({ data, role, ...props }, forwardedRef) => {
264
+ const doc =
265
+ data.active instanceof DocumentType
266
+ ? data.active
267
+ : data.object instanceof DocumentType
268
+ ? data.object
269
+ : undefined;
270
+
254
271
  switch (role) {
255
272
  case 'section':
256
273
  case 'article': {
257
- // TODO(burdon): Normalize types (from FilesPlugin).
258
- const doc = getDoc(data.active) ?? getDoc(data.object);
259
- const { id, object } = isEditorModel(data.object)
260
- ? { id: data.object.id, object: data.object }
261
- : doc
262
- ? { id: fullyQualifiedId(doc), object: doc }
263
- : {};
264
-
265
- if (!id || !object) {
266
- return null;
274
+ if (doc && doc.content) {
275
+ return (
276
+ <DocumentEditor
277
+ role={role}
278
+ coordinate={data.coordinate as LayoutCoordinate}
279
+ document={doc}
280
+ extensionProviders={state.values.extensionProviders}
281
+ settings={settings.values}
282
+ scrollPastEnd
283
+ viewMode={getViewMode(fullyQualifiedId(doc))}
284
+ onViewModeChange={setViewMode}
285
+ />
286
+ );
287
+ } else if (isEditorModel(data.object)) {
288
+ return (
289
+ <MarkdownEditor
290
+ id={data.object.id}
291
+ role={role}
292
+ coordinate={data.coordinate as LayoutCoordinate}
293
+ initialValue={data.object.text}
294
+ extensionProviders={state.values.extensionProviders}
295
+ inputMode={settings.values.editorInputMode}
296
+ toolbar={settings.values.toolbar}
297
+ scrollPastEnd
298
+ viewMode={getViewMode(data.object.id)}
299
+ onViewModeChange={setViewMode}
300
+ />
301
+ );
267
302
  }
303
+ break;
304
+ }
268
305
 
269
- return (
270
- <MarkdownContainer
271
- id={id}
272
- object={object}
273
- role={role}
274
- coordinate={data.coordinate as LayoutCoordinate}
275
- settings={settings.values}
276
- extensionProviders={state.values.extensionProviders}
277
- viewMode={getViewMode(id)}
278
- onViewModeChange={setViewMode}
279
- />
280
- );
306
+ case 'card': {
307
+ if (
308
+ isObject(data.content) &&
309
+ typeof data.content.id === 'string' &&
310
+ data.content.object instanceof DocumentType
311
+ ) {
312
+ // isTileComponentProps is a type guard for these props.
313
+ // `props` will not pass this guard without transforming `data` into `item`.
314
+ const cardProps = {
315
+ ...props,
316
+ item: {
317
+ id: data.content.id,
318
+ object: data.content.object,
319
+ color: typeof data.content.color === 'string' ? data.content.color : undefined,
320
+ } as DocumentItemProps,
321
+ };
322
+
323
+ return isTileComponentProps(cardProps) ? (
324
+ <DocumentCard {...cardProps} settings={settings.values} ref={forwardedRef as Ref<HTMLDivElement>} />
325
+ ) : null;
326
+ }
327
+ break;
281
328
  }
282
329
 
283
330
  case 'settings': {
@@ -0,0 +1,107 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { forwardRef } from 'react';
6
+
7
+ import { createDocAccessor } from '@dxos/react-client/echo';
8
+ import { DropdownMenu, Input, useThemeContext, useTranslation } from '@dxos/react-ui';
9
+ import { Card } from '@dxos/react-ui-card';
10
+ import {
11
+ createBasicExtensions,
12
+ createDataExtensions,
13
+ createThemeExtensions,
14
+ useTextEditor,
15
+ } from '@dxos/react-ui-editor';
16
+ import type { MosaicTileComponent } from '@dxos/react-ui-mosaic';
17
+ import { focusRing, mx } from '@dxos/react-ui-theme';
18
+
19
+ import { createBaseExtensions } from '../extensions';
20
+ import { MARKDOWN_PLUGIN } from '../meta';
21
+ import { type DocumentType, type MarkdownSettingsProps } from '../types';
22
+
23
+ export type DocumentItemProps = {
24
+ id: string;
25
+ object: DocumentType;
26
+ color?: string;
27
+ };
28
+
29
+ export type DocumentCardProps = {
30
+ settings: MarkdownSettingsProps;
31
+ };
32
+
33
+ /**
34
+ * @deprecated
35
+ */
36
+ // TODO(wittjosiah): Unify with DocumentEditor.
37
+ export const DocumentCard: MosaicTileComponent<DocumentItemProps, HTMLDivElement, DocumentCardProps> = forwardRef(
38
+ (
39
+ {
40
+ classNames,
41
+ isDragging,
42
+ draggableStyle,
43
+ draggableProps,
44
+ item: { id, object, color },
45
+ grow,
46
+ settings,
47
+ onSelect,
48
+ onAction,
49
+ },
50
+ forwardRef,
51
+ ) => {
52
+ const { t } = useTranslation(MARKDOWN_PLUGIN);
53
+ const { themeMode } = useThemeContext();
54
+ const { parentRef, focusAttributes } = useTextEditor(
55
+ () => ({
56
+ initialValue: object.content?.content,
57
+ extensions: [
58
+ createBasicExtensions({ placeholder: t('editor placeholder') }),
59
+ createThemeExtensions({ themeMode }),
60
+ createDataExtensions({
61
+ id: object.id,
62
+ text: object.content && createDocAccessor(object.content, ['content']),
63
+ }),
64
+ createBaseExtensions({
65
+ document: object,
66
+ debug: settings.debug,
67
+ experimental: settings.experimental,
68
+ }),
69
+ ],
70
+ }),
71
+ [object, object.content, themeMode],
72
+ );
73
+
74
+ return (
75
+ <div role='none' ref={forwardRef} className='flex w-full' style={draggableStyle}>
76
+ <Card.Root classNames={mx('w-full snap-center', color, isDragging && 'opacity-20', classNames)} grow={grow}>
77
+ <Card.Header onDoubleClick={() => onSelect?.()}>
78
+ <Card.DragHandle {...draggableProps} />
79
+ <Input.Root>
80
+ <Input.TextInput
81
+ variant='subdued'
82
+ classNames='p-0'
83
+ placeholder={t('document title placeholder')}
84
+ value={object.name}
85
+ onChange={(event) => (object.name = event.target.value)}
86
+ />
87
+ </Input.Root>
88
+ <Card.Menu>
89
+ {/* TODO(burdon): Handle events/intents? */}
90
+ <DropdownMenu.Item onClick={() => onAction?.({ id, action: 'delete' })}>
91
+ <span className='grow'>Delete</span>
92
+ </DropdownMenu.Item>
93
+ <DropdownMenu.Item onClick={() => onAction?.({ id, action: 'set-color' })}>
94
+ <span className='grow'>Change color</span>
95
+ </DropdownMenu.Item>
96
+ </Card.Menu>
97
+ </Card.Header>
98
+ <Card.Body>
99
+ <div {...focusAttributes} ref={parentRef} className={mx(focusRing, 'rounded-sm h-full p-1 text-sm')} />
100
+ </Card.Body>
101
+ </Card.Root>
102
+ </div>
103
+ );
104
+ },
105
+ );
106
+
107
+ export default DocumentCard;