@dxos/react-ui-editor 0.8.4-main.406dc2a → 0.8.4-main.548089c

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 (108) hide show
  1. package/dist/lib/browser/index.mjs +1379 -1139
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +1379 -1139
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/Editor/Editor.stories.d.ts +0 -3
  8. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -1
  9. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +17 -2
  10. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  11. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  12. package/dist/types/src/components/EditorToolbar/util.d.ts +5 -19
  13. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  14. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  15. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  16. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  17. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  18. package/dist/types/src/extensions/automerge/sync.d.ts +1 -1
  19. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  20. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  21. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  22. package/dist/types/src/extensions/autoscroll.d.ts +14 -4
  23. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -1
  24. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  25. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  26. package/dist/types/src/extensions/blocks.d.ts +2 -0
  27. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  28. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  29. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  30. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  31. package/dist/types/src/extensions/factories.d.ts +4 -4
  32. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  33. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  34. package/dist/types/src/extensions/index.d.ts +4 -0
  35. package/dist/types/src/extensions/index.d.ts.map +1 -1
  36. package/dist/types/src/extensions/listener.d.ts +8 -6
  37. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  38. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  39. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -2
  40. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  41. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts +1 -1
  42. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +1 -1
  43. package/dist/types/src/extensions/popover/popover.d.ts.map +1 -1
  44. package/dist/types/src/extensions/preview/preview.d.ts +6 -2
  45. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  46. package/dist/types/src/extensions/replacer.d.ts +21 -0
  47. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  48. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  49. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  50. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  51. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  52. package/dist/types/src/extensions/tags/xml-tags.d.ts +41 -16
  53. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -1
  54. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -1
  55. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  56. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
  57. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  58. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  59. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  60. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  61. package/dist/types/tsconfig.tsbuildinfo +1 -1
  62. package/package.json +41 -38
  63. package/src/components/Editor/Editor.stories.tsx +4 -7
  64. package/src/components/EditorToolbar/EditorToolbar.tsx +90 -90
  65. package/src/components/EditorToolbar/headings.ts +6 -4
  66. package/src/components/EditorToolbar/util.ts +4 -20
  67. package/src/extensions/autocomplete/autocomplete.ts +5 -5
  68. package/src/extensions/automerge/automerge.stories.tsx +1 -1
  69. package/src/extensions/automerge/automerge.ts +1 -1
  70. package/src/extensions/automerge/cursor.ts +1 -1
  71. package/src/extensions/automerge/sync.ts +1 -1
  72. package/src/extensions/automerge/update-automerge.ts +1 -1
  73. package/src/extensions/autoscroll.ts +74 -68
  74. package/src/extensions/awareness/awareness-provider.ts +2 -2
  75. package/src/extensions/blocks.ts +131 -0
  76. package/src/extensions/bookmarks.ts +75 -0
  77. package/src/extensions/comments.ts +2 -1
  78. package/src/extensions/factories.ts +6 -4
  79. package/src/extensions/folding.tsx +1 -2
  80. package/src/extensions/index.ts +4 -0
  81. package/src/extensions/listener.ts +14 -20
  82. package/src/extensions/markdown/bundle.ts +12 -2
  83. package/src/extensions/markdown/decorate.ts +8 -8
  84. package/src/extensions/markdown/formatting.ts +8 -8
  85. package/src/extensions/markdown/highlight.ts +1 -1
  86. package/src/extensions/markdown/image.ts +2 -2
  87. package/src/extensions/markdown/table.ts +6 -6
  88. package/src/extensions/popover/PopoverMenuProvider.tsx +2 -3
  89. package/src/extensions/popover/popover.ts +0 -4
  90. package/src/extensions/preview/preview.ts +14 -9
  91. package/src/extensions/replacer.test.ts +75 -0
  92. package/src/extensions/replacer.ts +93 -0
  93. package/src/extensions/scrolling.ts +189 -0
  94. package/src/extensions/selection.ts +1 -1
  95. package/src/extensions/tags/extended-markdown.test.ts +2 -1
  96. package/src/extensions/tags/xml-tags.ts +310 -203
  97. package/src/extensions/typewriter.ts +1 -1
  98. package/src/stories/CommandDialog.stories.tsx +9 -4
  99. package/src/stories/Comments.stories.tsx +1 -1
  100. package/src/stories/EditorToolbar.stories.tsx +4 -5
  101. package/src/stories/Popover.stories.tsx +4 -6
  102. package/src/stories/Preview.stories.tsx +15 -8
  103. package/src/stories/Tags.stories.tsx +19 -5
  104. package/src/stories/TextEditor.stories.tsx +2 -2
  105. package/src/stories/components/EditorStory.tsx +3 -3
  106. package/src/stories/components/util.tsx +39 -6
  107. package/src/styles/markdown.ts +1 -1
  108. package/src/styles/theme.ts +1 -1
@@ -5,7 +5,7 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { type KeyboardEvent, useState } from 'react';
7
7
 
8
- import { Button, Icon, Input } from '@dxos/react-ui';
8
+ import { type Button, IconButton, Input } from '@dxos/react-ui';
9
9
  import { withTheme } from '@dxos/react-ui/testing';
10
10
  import { mx } from '@dxos/react-ui-theme';
11
11
 
@@ -54,9 +54,14 @@ const CommandDialog = ({ onAction }: { onAction: (action?: any) => void }) => {
54
54
  onKeyDown={handleKeyDown}
55
55
  />
56
56
  </Input.Root>
57
- <Button variant='ghost' classNames='pli-0' onClick={() => onAction({ type: 'cancel' })}>
58
- <Icon icon='ph--x--regular' size={5} />
59
- </Button>
57
+ <IconButton
58
+ icon='ph--x--regular'
59
+ label='Cancel'
60
+ iconOnly
61
+ variant='ghost'
62
+ classNames='pli-0'
63
+ onClick={() => onAction({ type: 'cancel' })}
64
+ />
60
65
  </div>
61
66
  </div>
62
67
  );
@@ -80,7 +80,7 @@ const Key: FC<{ char: string }> = ({ char }) => (
80
80
 
81
81
  const CommentTooltip: FC<{ shortcut: string }> = ({ shortcut }) => {
82
82
  return (
83
- <div className='flex items-center gap-2 px-2 py-2 bg-neutral-700 text-white text-xs rounded'>
83
+ <div className='flex items-center gap-2 pli-2 plb-2 bg-neutral-700 text-white text-xs rounded'>
84
84
  <div>Create comment</div>
85
85
  <div className='flex gap-1'>
86
86
  {keySymbols(parseShortcut(shortcut)).map((char) => (
@@ -19,7 +19,7 @@ import {
19
19
  createThemeExtensions,
20
20
  decorateMarkdown,
21
21
  formattingKeymap,
22
- useFormattingState,
22
+ formattingListener,
23
23
  } from '../extensions';
24
24
  import { type UseTextEditorProps, useTextEditor } from '../hooks';
25
25
  import { translations } from '../translations';
@@ -31,7 +31,6 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
31
31
  const { themeMode } = useThemeContext();
32
32
  const toolbarState = useEditorToolbarState({ viewMode: 'source' });
33
33
  const viewMode = toolbarState.viewMode;
34
- const trackFormatting = useFormattingState(toolbarState);
35
34
  // TODO(wittjosiah): Provide way to change the input mode.
36
35
  const [editorInputMode, _setEditorInputMode] = useState<EditorInputMode>('default');
37
36
  const { parentRef, view } = useTextEditor(
@@ -46,7 +45,7 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
46
45
  createThemeExtensions({ themeMode, syntaxHighlighting: true }),
47
46
  viewMode === 'source' ? [] : decorateMarkdown(),
48
47
  formattingKeymap(),
49
- trackFormatting,
48
+ formattingListener(() => toolbarState),
50
49
  ],
51
50
  }),
52
51
  [editorInputMode, viewMode, themeMode, placeholder],
@@ -65,7 +64,7 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
65
64
  // Also not sure if view is even guaranteed to exist at this point.
66
65
  return (
67
66
  <div role='none' className={mx('fixed inset-0 flex flex-col')}>
68
- {toolbarState && <EditorToolbar state={toolbarState} getView={getView} viewMode={handleViewModeChange} />}
67
+ {toolbarState && <EditorToolbar state={toolbarState} getView={getView} onViewModeChange={handleViewModeChange} />}
69
68
  <div role='none' className={mx('grow overflow-hidden', attentionSurface)}>
70
69
  <div className={mx(editorWidth)} ref={parentRef} />
71
70
  </div>
@@ -91,6 +90,6 @@ export const Default: Story = {
91
90
  args: {
92
91
  autoFocus: true,
93
92
  placeholder: 'Text...',
94
- initialValue: '# Demo\n\nThis is a document.\n\n',
93
+ initialValue: '# Demo\n\nThis is a **document**.\n\n',
95
94
  },
96
95
  };
@@ -42,9 +42,7 @@ const placeholder = (trigger: string[]) =>
42
42
  .children(
43
43
  Domino.of('span').text('Press'),
44
44
  ...trigger.map((trigger) =>
45
- Domino.of('span')
46
- .text(trigger)
47
- .classNames('border border-separator rounded-sm mx-1 pis-1 pie-1 pbs-[2px] pbe-[3px]'),
45
+ Domino.of('span').text(trigger).classNames('border border-separator rounded-sm mx-1 pli-1 pbs-[2px] pbe-[3px]'),
48
46
  ),
49
47
  Domino.of('span').text('for commands'),
50
48
  )
@@ -78,7 +76,7 @@ const LinkStory = (args: StoryProps) => {
78
76
  }
79
77
 
80
78
  const name = text?.startsWith('@') ? text.slice(1).toLowerCase() : (text?.toLowerCase() ?? '');
81
- const result = await space?.db.query(Query.type(Testing.Contact)).run();
79
+ const result = await space?.db.query(Query.type(Testing.Person)).run();
82
80
  const items = result.objects
83
81
  .filter((object) => object.name.toLowerCase().includes(name))
84
82
  .map(
@@ -144,11 +142,11 @@ export const Link: Story = {
144
142
  withClientProvider({
145
143
  createSpace: true,
146
144
  onInitialized: async (client) => {
147
- client.addTypes([Testing.Contact]);
145
+ client.addTypes([Testing.Person]);
148
146
  },
149
147
  onCreateSpace: async ({ space }) => {
150
148
  const createObjects = createObjectFactory(space.db, generator);
151
- await createObjects([{ type: Testing.Contact, count: 10 }]);
149
+ await createObjects([{ type: Testing.Person, count: 10 }]);
152
150
  await space.db.flush({ indexes: true });
153
151
  },
154
152
  }),
@@ -16,7 +16,14 @@ import { Card } from '@dxos/react-ui-stack';
16
16
  import { hoverableControlItem, hoverableControlItemTransition, hoverableControls } from '@dxos/react-ui-theme';
17
17
  import { trim } from '@dxos/util';
18
18
 
19
- import { type PreviewLinkRef, type PreviewLinkTarget, getLinkRef, image, preview } from '../extensions';
19
+ import {
20
+ type PreviewBlock,
21
+ type PreviewLinkRef,
22
+ type PreviewLinkTarget,
23
+ getLinkRef,
24
+ image,
25
+ preview,
26
+ } from '../extensions';
20
27
  import { PreviewPopoverProvider, usePreviewPopover } from '../testing';
21
28
 
22
29
  import { EditorStory } from './components';
@@ -70,7 +77,7 @@ type PreviewAction =
70
77
  link: PreviewLinkRef;
71
78
  };
72
79
 
73
- const PreviewBlock = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElement; view?: EditorView }) => {
80
+ const PreviewBlockComponent = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElement; view?: EditorView }) => {
74
81
  const target = useRefTarget(link);
75
82
 
76
83
  const handleAction = useCallback(
@@ -180,16 +187,16 @@ type Story = StoryObj<typeof meta>;
180
187
  export const Default: Story = {
181
188
  render: () => {
182
189
  const [view, setView] = useState<EditorView>();
183
- const [previewBlocks, setPreviewBlocks] = useState<{ link: PreviewLinkRef; el: HTMLElement }[]>([]);
190
+ const [previewBlocks, setPreviewBlocks] = useState<PreviewBlock[]>([]);
184
191
  const extensions = useMemo(() => {
185
192
  return [
186
193
  image(),
187
194
  preview({
188
- addBlockContainer: (link, el) => {
189
- setPreviewBlocks((prev) => [...prev, { link, el }]);
195
+ addBlockContainer: (block) => {
196
+ setPreviewBlocks((prev) => [...prev, block]);
190
197
  },
191
- removeBlockContainer: (link) => {
192
- setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));
198
+ removeBlockContainer: (block) => {
199
+ setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== block.link.ref));
193
200
  },
194
201
  }),
195
202
  ];
@@ -221,7 +228,7 @@ export const Default: Story = {
221
228
  />
222
229
  <PreviewCard />
223
230
  {previewBlocks.map(({ link, el }) => (
224
- <PreviewBlock key={link.ref} link={link} el={el} view={view} />
231
+ <PreviewBlockComponent key={link.ref} link={link} el={el} view={view} />
225
232
  ))}
226
233
  </PreviewPopoverProvider>
227
234
  );
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { useState } from 'react';
6
+ import React, { useEffect, useState } from 'react';
7
7
  import { createPortal } from 'react-dom';
8
8
 
9
9
  import { useThemeContext } from '@dxos/react-ui';
@@ -22,10 +22,22 @@ import {
22
22
  import { useTextEditor } from '../hooks';
23
23
 
24
24
  const registry = {
25
- // <test/>
25
+ /**
26
+ * Custom tag: <test/>
27
+ */
26
28
  ['test' as const]: {
27
29
  block: true,
28
- Component: () => <div className='p-2 border border-separator rounded'>Test</div>,
30
+ Component: () => {
31
+ const [count, setCount] = useState(0);
32
+ useEffect(() => {
33
+ const interval = setInterval(() => {
34
+ setCount((prev) => prev + 1);
35
+ }, 1_000);
36
+ return () => clearInterval(interval);
37
+ }, []);
38
+
39
+ return <div className='p-2 border border-separator rounded'>Test {count}</div>;
40
+ },
29
41
  },
30
42
  } satisfies XmlWidgetRegistry;
31
43
 
@@ -36,7 +48,7 @@ const DefaultStory = ({ text }: { text?: string }) => {
36
48
  initialValue: text,
37
49
  extensions: [
38
50
  createThemeExtensions({ themeMode }),
39
- createBasicExtensions({ lineWrapping: true, readOnly: true }),
51
+ createBasicExtensions({ lineWrapping: true }),
40
52
  decorateMarkdown(),
41
53
  extendedMarkdown({ registry }),
42
54
  xmlTags({ registry, setWidgets }),
@@ -56,13 +68,15 @@ const DefaultStory = ({ text }: { text?: string }) => {
56
68
  const text = trim`
57
69
  # Tags
58
70
 
71
+ React widget below.
72
+
59
73
  <test id="123" />
60
74
 
61
75
  React widget above.
62
76
  `;
63
77
 
64
78
  const meta = {
65
- title: 'ui/react-ui-editor/Tags',
79
+ title: 'ui/react-ui-editor/XmlTags',
66
80
  render: DefaultStory,
67
81
  decorators: [withTheme],
68
82
  parameters: {
@@ -113,10 +113,10 @@ export const Listener: Story = {
113
113
  text={str('# Listener', '', content.footer)}
114
114
  extensions={[
115
115
  listener({
116
- onFocus: (focusing) => {
116
+ onFocus: ({ focusing }) => {
117
117
  log.info('listener', { focusing });
118
118
  },
119
- onChange: (text) => {
119
+ onChange: ({ text }) => {
120
120
  log.info('listener', { text });
121
121
  },
122
122
  }),
@@ -5,11 +5,11 @@
5
5
  import { type EditorView } from '@codemirror/view';
6
6
  import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';
7
7
 
8
+ import { createDocAccessor, createObject } from '@dxos/client/echo';
8
9
  import { Expando } from '@dxos/echo/internal';
9
10
  import { live } from '@dxos/echo/internal';
10
11
  import { invariant } from '@dxos/invariant';
11
12
  import { PublicKey } from '@dxos/keys';
12
- import { createDocAccessor, createObject } from '@dxos/react-client/echo';
13
13
  import { useForwardedRef, useThemeContext } from '@dxos/react-ui';
14
14
  import { useAttentionAttributes } from '@dxos/react-ui-attention';
15
15
  import { JsonFilter } from '@dxos/react-ui-syntax-highlighter';
@@ -59,12 +59,12 @@ export const EditorStory = forwardRef<EditorView | null, StoryProps>(
59
59
 
60
60
  const view = viewRef.current;
61
61
  return (
62
- <div className={mx('w-full h-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
62
+ <div className={mx('is-full bs-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
63
63
  <EditorComponent ref={viewRef} object={object} text={text} extensions={extensions} {...props} />
64
64
 
65
65
  {debug && (
66
66
  <div
67
- className='grid h-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
67
+ className='grid bs-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
68
68
  {...attentionAttrs}
69
69
  >
70
70
  {view && debugCustom?.(view)}
@@ -27,6 +27,7 @@ export const num = () => faker.number.int({ min: 0, max: 9999 }).toLocaleString(
27
27
  export const img = '![dxos](https://dxos.network/dxos-logotype-blue.png)';
28
28
 
29
29
  export const code = str(
30
+ // prettier-ignore
30
31
  '// Code',
31
32
  'const Component = () => {',
32
33
  ' const x = 100;',
@@ -38,7 +39,7 @@ export const code = str(
38
39
  // Content blocks for stories
39
40
  export const content = {
40
41
  tasks: str(
41
- //
42
+ // prettier-ignore
42
43
  '### TaskList',
43
44
  '',
44
45
  `- [x] ${faker.lorem.sentences()}`,
@@ -50,7 +51,7 @@ export const content = {
50
51
  ),
51
52
 
52
53
  bullets: str(
53
- //
54
+ // prettier-ignore
54
55
  '### BulletList',
55
56
  '',
56
57
  `- ${faker.lorem.sentences()}`,
@@ -62,7 +63,7 @@ export const content = {
62
63
  ),
63
64
 
64
65
  numbered: str(
65
- //
66
+ // prettier-ignore
66
67
  '### OrderedList (part 1)',
67
68
  '',
68
69
  `1. ${faker.lorem.sentences()}`,
@@ -81,11 +82,34 @@ export const content = {
81
82
 
82
83
  typescript: code,
83
84
 
84
- codeblocks: str('### Code', '', '```bash', '$ ls -las', '```', '', '```tsx', code, '```', ''),
85
+ codeblocks: str(
86
+ // prettier-ignore
87
+ '### Code',
88
+ '',
89
+ '```bash',
90
+ '$ ls -las',
91
+ '```',
92
+ '',
93
+ '```tsx',
94
+ code,
95
+ '```',
96
+ '',
97
+ ),
85
98
 
86
- comment: str('<!--', 'A comment', '-->', '', 'No comment.', 'Partial comment. <!-- comment. -->'),
99
+ comment: str(
100
+ // prettier-ignore
101
+ '### Comment',
102
+ '',
103
+ '<!--',
104
+ 'A comment',
105
+ '-->',
106
+ '',
107
+ 'Partial comment. <!-- comment. -->',
108
+ '',
109
+ ),
87
110
 
88
111
  links: str(
112
+ // prettier-ignore
89
113
  '### Links',
90
114
  '',
91
115
  'This is a naked link https://dxos.org within a sentence.',
@@ -97,6 +121,7 @@ export const content = {
97
121
  ),
98
122
 
99
123
  table: str(
124
+ // prettier-ignore
100
125
  '### Tables',
101
126
  '',
102
127
  `| ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} |`,
@@ -113,9 +138,16 @@ export const content = {
113
138
  ...[1, 2, 3, 4, 5, 6].map((level) => ['#'.repeat(level) + ` Heading ${level}`, faker.lorem.sentences(), '']).flat(),
114
139
  ),
115
140
 
116
- formatting: str('### Formatting', '', 'This this is **bold**, ~~strikethrough~~, _italic_, and `f(INLINE)`.', ''),
141
+ formatting: str(
142
+ // prettier-ignore
143
+ '### Formatting',
144
+ '',
145
+ 'This this is **bold**, ~~strikethrough~~, _italic_, and `f(INLINE)`.',
146
+ '',
147
+ ),
117
148
 
118
149
  blockquotes: str(
150
+ // prettier-ignore
119
151
  '### Blockquotes',
120
152
  '',
121
153
  '> This is a block quote.',
@@ -154,6 +186,7 @@ export const text = str(
154
186
  '---',
155
187
  '## Misc',
156
188
  content.codeblocks,
189
+ content.comment,
157
190
  content.table,
158
191
  content.image,
159
192
  content.footer,
@@ -21,6 +21,6 @@ export const theme = {
21
21
  codeMark: 'font-mono text-primary-500',
22
22
  mark: 'opacity-50',
23
23
  heading: (level: HeadingLevel) => {
24
- return mx(headings[level], 'dark:text-primary-400');
24
+ return mx(headings[level], 'dark:text-neutral-400');
25
25
  },
26
26
  };
@@ -74,12 +74,12 @@ export const defaultTheme: ThemeStyles = {
74
74
  */
75
75
  '.cm-gutters': {
76
76
  borderRight: 'none',
77
- // background: 'transparent',
78
77
  },
79
78
  '.cm-gutter': {},
80
79
  '.cm-gutter.cm-lineNumbers': {
81
80
  paddingRight: '4px',
82
81
  borderRight: '1px solid var(--dx-subduedSeparator)',
82
+ color: 'var(--dx-subduedText)',
83
83
  },
84
84
  '.cm-gutter.cm-lineNumbers .cm-gutterElement': {
85
85
  minWidth: '40px',