@dxos/react-ui-chat 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,119 +1,93 @@
1
1
  // src/components/ChatDialog/ChatDialog.tsx
2
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
3
2
  import { createContext } from "@radix-ui/react-context";
4
3
  import React, { useEffect, useState } from "react";
5
4
  import { Dialog, Icon, IconButton, useControlledState } from "@dxos/react-ui";
6
5
  import { ResizeHandle, resizeAttributes, sizeStyle } from "@dxos/react-ui-dnd";
7
- import { mx } from "@dxos/react-ui-theme";
6
+ import { mx } from "@dxos/ui-theme";
8
7
  var preventDefault = (event) => event.preventDefault();
9
8
  var Endcap = ({ children }) => {
10
- var _effect = _useSignals();
11
- try {
12
- return /* @__PURE__ */ React.createElement("div", {
13
- className: "grid w-[var(--rail-action)] h-[var(--rail-action)] items-center justify-center"
14
- }, children);
15
- } finally {
16
- _effect.f();
17
- }
9
+ return /* @__PURE__ */ React.createElement("div", {
10
+ className: "grid is-[var(--rail-action)] bs-[var(--rail-action)] items-center justify-center"
11
+ }, children);
18
12
  };
19
13
  var [ChatDialogContextProvider, useChatDialogContext] = createContext("ChatDialog");
20
- var ChatDialogRoot = ({ children, open: _open = false, expanded: expandedParam = false, onOpenChange, onExpandedChange, onEscape }) => {
21
- var _effect = _useSignals();
22
- try {
23
- const [size, setSize] = useState("min-content");
24
- const [open, setOpen] = useControlledState(_open, onOpenChange);
25
- const [expanded, setExpanded] = useControlledState(expandedParam, onExpandedChange);
26
- return /* @__PURE__ */ React.createElement(ChatDialogContextProvider, {
27
- open,
28
- setOpen,
29
- expanded,
30
- setExpanded,
31
- size,
32
- setSize
33
- }, /* @__PURE__ */ React.createElement(Dialog.Root, {
34
- modal: false,
35
- open,
36
- onOpenChange: setOpen
37
- }, /* @__PURE__ */ React.createElement("div", {
38
- role: "none",
39
- className: "dx-dialog__overlay bg-transparent pointer-events-none",
40
- "data-block-align": "end"
41
- }, /* @__PURE__ */ React.createElement(Dialog.Content, {
42
- inOverlayLayout: true,
43
- classNames: [
44
- "grid grid-rows-[var(--rail-action)_1fr_min-content] p-0 overflow-hidden",
45
- "box-content md:is-[35rem] md:max-is-none pointer-events-auto"
46
- ],
47
- onEscapeKeyDown: onEscape,
48
- onInteractOutside: preventDefault
49
- }, children))));
50
- } finally {
51
- _effect.f();
52
- }
14
+ var ChatDialogRoot = ({ children, open: openProp = false, expanded: expandedProp = false, onOpenChange, onExpandedChange, onEscape }) => {
15
+ const [size, setSize] = useState("min-content");
16
+ const [open, setOpen] = useControlledState(openProp, onOpenChange);
17
+ const [expanded, setExpanded] = useControlledState(expandedProp, onExpandedChange);
18
+ return /* @__PURE__ */ React.createElement(ChatDialogContextProvider, {
19
+ open,
20
+ setOpen,
21
+ expanded,
22
+ setExpanded,
23
+ size,
24
+ setSize
25
+ }, /* @__PURE__ */ React.createElement(Dialog.Root, {
26
+ modal: false,
27
+ open,
28
+ onOpenChange: setOpen
29
+ }, /* @__PURE__ */ React.createElement("div", {
30
+ role: "none",
31
+ className: "dx-dialog__overlay bg-transparent pointer-events-none",
32
+ "data-block-align": "end"
33
+ }, /* @__PURE__ */ React.createElement(Dialog.Content, {
34
+ inOverlayLayout: true,
35
+ classNames: [
36
+ "grid grid-rows-[var(--rail-action)_1fr_min-content] p-0 overflow-hidden",
37
+ "box-content md:is-[35rem] md:max-is-none pointer-events-auto"
38
+ ],
39
+ onEscapeKeyDown: onEscape,
40
+ onInteractOutside: preventDefault
41
+ }, children))));
53
42
  };
54
43
  ChatDialogRoot.displayName = "ChatDialog.Root";
55
44
  var ChatDialogHeader = ({ classNames, title }) => {
56
- var _effect = _useSignals();
57
- try {
58
- const { expanded, setExpanded } = useChatDialogContext(ChatDialogHeader.displayName);
59
- return /* @__PURE__ */ React.createElement("div", {
60
- className: mx("grid grid-cols-[var(--rail-action)_1fr_min-content] items-center overflow-hidden", classNames)
61
- }, /* @__PURE__ */ React.createElement(Endcap, null, /* @__PURE__ */ React.createElement(Dialog.Close, null, /* @__PURE__ */ React.createElement(Icon, {
62
- icon: "ph--x--regular"
63
- }))), /* @__PURE__ */ React.createElement(Dialog.Title, {
64
- classNames: "flex w-full justify-center text-sm text-subdued select-none cursor-pointer",
65
- onClick: () => setExpanded((expanded2) => !expanded2)
66
- }, title), /* @__PURE__ */ React.createElement(Endcap, null, /* @__PURE__ */ React.createElement(IconButton, {
67
- variant: "ghost",
68
- icon: "ph--caret-up--regular",
69
- iconOnly: true,
70
- classNames: mx("!p-1 [&>svg]:transition [&>svg]:duration-200", expanded && "[&>svg]:rotate-180"),
71
- label: expanded ? "Close" : "Open",
72
- onClick: () => setExpanded((expanded2) => !expanded2)
73
- })));
74
- } finally {
75
- _effect.f();
76
- }
45
+ const { expanded, setExpanded } = useChatDialogContext(ChatDialogHeader.displayName);
46
+ return /* @__PURE__ */ React.createElement("div", {
47
+ className: mx("grid grid-cols-[var(--rail-action)_1fr_min-content] items-center overflow-hidden", classNames)
48
+ }, /* @__PURE__ */ React.createElement(Endcap, null, /* @__PURE__ */ React.createElement(Dialog.Close, null, /* @__PURE__ */ React.createElement(Icon, {
49
+ icon: "ph--x--regular"
50
+ }))), /* @__PURE__ */ React.createElement(Dialog.Title, {
51
+ classNames: "flex is-full justify-center text-sm text-subdued select-none cursor-pointer",
52
+ onClick: () => setExpanded((expanded2) => !expanded2)
53
+ }, title), /* @__PURE__ */ React.createElement(Endcap, null, /* @__PURE__ */ React.createElement(IconButton, {
54
+ variant: "ghost",
55
+ icon: "ph--caret-up--regular",
56
+ iconOnly: true,
57
+ classNames: mx("!p-1 [&>svg]:transition [&>svg]:duration-200", expanded && "[&>svg]:rotate-180"),
58
+ label: expanded ? "Close" : "Open",
59
+ onClick: () => setExpanded((expanded2) => !expanded2)
60
+ })));
77
61
  };
78
62
  ChatDialogHeader.displayName = "ChatDialog.Header";
79
63
  var ChatDialogContent = ({ children, classNames }) => {
80
- var _effect = _useSignals();
81
- try {
82
- const { expanded, size, setSize } = useChatDialogContext(ChatDialogContent.displayName);
83
- useEffect(() => {
84
- setSize(expanded ? "min-content" : 0);
85
- }, [
86
- expanded
87
- ]);
88
- return /* @__PURE__ */ React.createElement("div", {
89
- className: mx("flex flex-col overflow-y-auto border-t border-b border-subduedSeparator", 'transition-[block-size] ease-in-out duration-0 [&:not([data-dx-resizing="true"])]:duration-200', classNames),
90
- style: {
91
- ...sizeStyle(size, "vertical", true),
92
- maxBlockSize: "calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 14rem)"
93
- },
94
- ...resizeAttributes
95
- }, /* @__PURE__ */ React.createElement(ResizeHandle, {
96
- side: "block-start",
97
- iconPosition: "center",
98
- defaultSize: "min-content",
99
- fallbackSize: 0,
100
- minSize: 0,
101
- onSizeChange: setSize
102
- }), children);
103
- } finally {
104
- _effect.f();
105
- }
64
+ const { expanded, size, setSize } = useChatDialogContext(ChatDialogContent.displayName);
65
+ useEffect(() => {
66
+ setSize(expanded ? "min-content" : 0);
67
+ }, [
68
+ expanded
69
+ ]);
70
+ return /* @__PURE__ */ React.createElement("div", {
71
+ className: mx("flex flex-col overflow-y-auto border-bs border-be border-subduedSeparator", 'transition-[block-size] ease-in-out duration-0 [&:not([data-dx-resizing="true"])]:duration-200', classNames),
72
+ style: {
73
+ ...sizeStyle(size, "vertical", true),
74
+ maxBlockSize: "calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 14rem)"
75
+ },
76
+ ...resizeAttributes
77
+ }, /* @__PURE__ */ React.createElement(ResizeHandle, {
78
+ side: "block-start",
79
+ iconPosition: "center",
80
+ defaultSize: "min-content",
81
+ fallbackSize: 0,
82
+ minSize: 0,
83
+ onSizeChange: setSize
84
+ }), children);
106
85
  };
107
86
  ChatDialogContent.displayName = "ChatDialog.Content";
108
87
  var ChatDialogFooter = ({ children, classNames }) => {
109
- var _effect = _useSignals();
110
- try {
111
- return /* @__PURE__ */ React.createElement("div", {
112
- className: mx(classNames)
113
- }, children);
114
- } finally {
115
- _effect.f();
116
- }
88
+ return /* @__PURE__ */ React.createElement("div", {
89
+ className: mx(classNames)
90
+ }, children);
117
91
  };
118
92
  ChatDialogFooter.displayName = "ChatDialog.Footer";
119
93
  var ChatDialog = {
@@ -133,7 +107,7 @@ var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui-chat/src/components/Chat
133
107
  var references = ({ provider, triggerCharacter = "@", debug = false }) => {
134
108
  invariant(triggerCharacter.length === 1, void 0, {
135
109
  F: __dxlog_file,
136
- L: 50,
110
+ L: 56,
137
111
  S: void 0,
138
112
  A: [
139
113
  "triggerCharacter.length === 1",
@@ -186,7 +160,7 @@ var references = ({ provider, triggerCharacter = "@", debug = false }) => {
186
160
  }
187
161
  }, {
188
162
  decorations: (v) => v.decorations,
189
- provide: (plugin) => [
163
+ provide: () => [
190
164
  EditorView.atomicRanges.of((view) => view.plugin(decorationField)?.decorations ?? RangeSet.empty)
191
165
  ]
192
166
  });
@@ -234,117 +208,65 @@ var ReferenceWidget = class extends WidgetType {
234
208
  constructor(data) {
235
209
  super(), this.data = data;
236
210
  }
211
+ ignoreEvent() {
212
+ return true;
213
+ }
214
+ eq(other) {
215
+ return this.data.uri === other.data.uri;
216
+ }
237
217
  toDOM() {
238
218
  const span = document.createElement("span");
239
- span.textContent = `@ ${this.data.label}`;
219
+ span.textContent = `@${this.data.label}`;
240
220
  span.className = "cm-reference-pill";
241
221
  return span;
242
222
  }
243
- eq(other) {
244
- return other.data.uri === this.data.uri;
245
- }
246
- ignoreEvent() {
247
- return true;
248
- }
249
223
  };
250
224
 
251
225
  // src/components/ChatEditor/ChatEditor.tsx
252
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
253
- import { keymap as keymap2 } from "@codemirror/view";
254
- import { useFocusFinders } from "@fluentui/react-tabster";
255
- import React2, { forwardRef, useImperativeHandle } from "react";
226
+ import React2, { forwardRef, useMemo } from "react";
256
227
  import { useThemeContext } from "@dxos/react-ui";
257
- import { autocomplete, createBasicExtensions, createThemeExtensions, useTextEditor } from "@dxos/react-ui-editor";
258
- import { mx as mx2 } from "@dxos/react-ui-theme";
228
+ import { Editor } from "@dxos/react-ui-editor";
229
+ import { createBasicExtensions, createThemeExtensions, submit } from "@dxos/ui-editor";
259
230
  import { isTruthy } from "@dxos/util";
260
- var ChatEditor = /* @__PURE__ */ forwardRef(({ classNames, extensions, references: references2, autoFocus, lineWrapping = false, placeholder, onSubmit, onSuggest, onCancel }, forwardRef2) => {
261
- var _effect = _useSignals2();
262
- try {
263
- const { themeMode } = useThemeContext();
264
- const { findNextFocusable, findPrevFocusable } = useFocusFinders();
265
- const { parentRef, view } = useTextEditor(() => ({
266
- debug: true,
267
- autoFocus,
268
- extensions: [
269
- createThemeExtensions({
270
- themeMode
271
- }),
272
- createBasicExtensions({
273
- bracketMatching: false,
274
- lineWrapping,
275
- placeholder
276
- }),
277
- autocomplete({
278
- onSubmit,
279
- onSuggest,
280
- onCancel
281
- }),
282
- references2 ? references({
283
- provider: references2.provider
284
- }) : [],
285
- // TODO(burdon): Standardize.
286
- keymap2.of([
287
- {
288
- key: "Tab",
289
- preventDefault: true,
290
- run: (view2) => {
291
- findNextFocusable(view2.dom)?.focus();
292
- return true;
293
- }
294
- },
295
- {
296
- key: "Shift-Tab",
297
- preventDefault: true,
298
- run: (view2) => {
299
- findPrevFocusable(view2.dom)?.focus();
300
- return true;
301
- }
302
- }
303
- ]),
304
- extensions
305
- ].filter(isTruthy)
306
- }), [
307
- themeMode,
308
- extensions,
309
- onSubmit,
310
- onSuggest,
311
- onCancel
312
- ]);
313
- useImperativeHandle(forwardRef2, () => {
314
- return {
315
- focus: () => {
316
- view?.focus();
317
- },
318
- getText: () => view?.state.doc.toString() ?? "",
319
- setText: (text) => {
320
- view?.dispatch({
321
- changes: {
322
- from: 0,
323
- to: view.state.doc.length,
324
- insert: text
325
- },
326
- selection: {
327
- anchor: text.length,
328
- head: text.length
329
- }
330
- });
331
- }
332
- };
333
- }, [
334
- view,
231
+ var useChatExtensions = ({ extensions, lineWrapping = false, placeholder, onSubmit }) => {
232
+ const { themeMode } = useThemeContext();
233
+ return useMemo(() => [
234
+ createThemeExtensions({
235
+ themeMode
236
+ }),
237
+ createBasicExtensions({
238
+ bracketMatching: false,
239
+ lineWrapping,
240
+ placeholder
241
+ }),
242
+ submit({
335
243
  onSubmit
336
- ]);
337
- return /* @__PURE__ */ React2.createElement("div", {
338
- ref: parentRef,
339
- className: mx2("is-full", classNames)
340
- });
341
- } finally {
342
- _effect.f();
343
- }
244
+ }),
245
+ extensions
246
+ ].filter(isTruthy), [
247
+ themeMode,
248
+ extensions,
249
+ onSubmit
250
+ ]);
251
+ };
252
+ var ChatEditor = /* @__PURE__ */ forwardRef(({ classNames, autoFocus, extensions: extensionsProp, lineWrapping = false, placeholder, onSubmit }, forwardRef2) => {
253
+ const extensions = useChatExtensions({
254
+ extensions: extensionsProp,
255
+ lineWrapping,
256
+ placeholder,
257
+ onSubmit
258
+ });
259
+ return /* @__PURE__ */ React2.createElement(Editor.Root, {
260
+ ref: forwardRef2
261
+ }, /* @__PURE__ */ React2.createElement(Editor.Content, {
262
+ classNames,
263
+ autoFocus,
264
+ extensions
265
+ }));
344
266
  });
345
267
 
346
268
  // src/translations.ts
347
- var translationKey = "react-ui-chat";
269
+ var translationKey = "@dxos/react-ui-chat";
348
270
  var translations = [
349
271
  {
350
272
  "en-US": {
@@ -357,6 +279,7 @@ export {
357
279
  ChatEditor,
358
280
  references,
359
281
  translationKey,
360
- translations
282
+ translations,
283
+ useChatExtensions
361
284
  };
362
285
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/ChatDialog/ChatDialog.tsx", "../../../src/components/ChatEditor/references.ts", "../../../src/components/ChatEditor/ChatEditor.tsx", "../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type Dispatch, type PropsWithChildren, type SetStateAction, useEffect, useState } from 'react';\n\nimport { Dialog, Icon, IconButton, type ThemedClassName, useControlledState } from '@dxos/react-ui';\nimport { ResizeHandle, type Size, resizeAttributes, sizeStyle } from '@dxos/react-ui-dnd';\nimport { mx } from '@dxos/react-ui-theme';\n\nconst preventDefault = (event: Event) => event.preventDefault();\n\n// TODO(burdon): Factor out.\nconst Endcap = ({ children }: PropsWithChildren) => {\n return (\n <div className='grid w-[var(--rail-action)] h-[var(--rail-action)] items-center justify-center'>{children}</div>\n );\n};\n\n//\n// Context\n//\n\ntype ChatDialogContextValue = {\n open: boolean;\n setOpen: Dispatch<SetStateAction<boolean>>;\n expanded: boolean;\n setExpanded: Dispatch<SetStateAction<boolean>>;\n size: Size;\n setSize: Dispatch<SetStateAction<Size>>;\n};\n\nconst [ChatDialogContextProvider, useChatDialogContext] = createContext<ChatDialogContextValue>('ChatDialog');\n\n//\n// Root\n//\n\ntype ChatDialogRootProps = PropsWithChildren<{\n open?: boolean;\n expanded?: boolean;\n onOpenChange?: (open: boolean) => void;\n onExpandedChange?: (expanded: boolean) => void;\n onEscape?: () => void;\n}>;\n\nconst ChatDialogRoot = ({\n children,\n open: _open = false,\n expanded: expandedParam = false,\n onOpenChange,\n onExpandedChange,\n onEscape,\n}: ChatDialogRootProps) => {\n const [size, setSize] = useState<Size>('min-content');\n const [open, setOpen] = useControlledState<boolean>(_open, onOpenChange);\n const [expanded, setExpanded] = useControlledState<boolean>(expandedParam, onExpandedChange);\n\n // NOTE: We set the min size to 5rem (80px), and the header and prompt bar to 40px (i.e., the rail-size) each.\n // The dialog has no vertical padding and has box-content so that when closed it collapses to the size of the header and prompt bar.\n return (\n <ChatDialogContextProvider\n open={open}\n setOpen={setOpen}\n expanded={expanded}\n setExpanded={setExpanded}\n size={size}\n setSize={setSize}\n >\n <Dialog.Root modal={false} open={open} onOpenChange={setOpen}>\n <div role='none' className='dx-dialog__overlay bg-transparent pointer-events-none' data-block-align='end'>\n <Dialog.Content\n inOverlayLayout\n classNames={[\n 'grid grid-rows-[var(--rail-action)_1fr_min-content] p-0 overflow-hidden',\n 'box-content md:is-[35rem] md:max-is-none pointer-events-auto',\n ]}\n onEscapeKeyDown={onEscape}\n onInteractOutside={preventDefault}\n >\n {children}\n </Dialog.Content>\n </div>\n </Dialog.Root>\n </ChatDialogContextProvider>\n );\n};\n\nChatDialogRoot.displayName = 'ChatDialog.Root';\n\n//\n// Header\n//\n\ntype ChatDialogHeaderProps = ThemedClassName<{\n title?: string;\n}>;\n\nconst ChatDialogHeader = ({ classNames, title }: ChatDialogHeaderProps) => {\n const { expanded, setExpanded } = useChatDialogContext(ChatDialogHeader.displayName);\n\n return (\n <div className={mx('grid grid-cols-[var(--rail-action)_1fr_min-content] items-center overflow-hidden', classNames)}>\n <Endcap>\n <Dialog.Close>\n <Icon icon='ph--x--regular' />\n </Dialog.Close>\n </Endcap>\n <Dialog.Title\n classNames='flex w-full justify-center text-sm text-subdued select-none cursor-pointer'\n onClick={() => setExpanded((expanded) => !expanded)}\n >\n {title}\n </Dialog.Title>\n <Endcap>\n <IconButton\n variant='ghost'\n icon='ph--caret-up--regular'\n iconOnly\n classNames={mx('!p-1 [&>svg]:transition [&>svg]:duration-200', expanded && '[&>svg]:rotate-180')}\n label={expanded ? 'Close' : 'Open'}\n onClick={() => setExpanded((expanded) => !expanded)}\n />\n </Endcap>\n </div>\n );\n};\n\nChatDialogHeader.displayName = 'ChatDialog.Header';\n\n//\n// Content\n//\n\ntype ChatDialogContentProps = ThemedClassName<PropsWithChildren>;\n\nconst ChatDialogContent = ({ children, classNames }: ChatDialogContentProps) => {\n const { expanded, size, setSize } = useChatDialogContext(ChatDialogContent.displayName);\n useEffect(() => {\n setSize(expanded ? 'min-content' : 0);\n }, [expanded]);\n\n return (\n <div\n className={mx(\n 'flex flex-col overflow-y-auto border-t border-b border-subduedSeparator',\n 'transition-[block-size] ease-in-out duration-0 [&:not([data-dx-resizing=\"true\"])]:duration-200',\n classNames,\n )}\n style={{\n ...sizeStyle(size, 'vertical', true),\n maxBlockSize: 'calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 14rem)',\n }}\n {...resizeAttributes}\n >\n <ResizeHandle\n side='block-start'\n iconPosition='center'\n defaultSize='min-content'\n fallbackSize={0}\n minSize={0}\n onSizeChange={setSize}\n />\n {children}\n </div>\n );\n};\n\nChatDialogContent.displayName = 'ChatDialog.Content';\n\n//\n// Footer\n//\n\ntype ChatDialogFooterProps = ThemedClassName<PropsWithChildren>;\n\nconst ChatDialogFooter = ({ children, classNames }: ChatDialogFooterProps) => {\n return <div className={mx(classNames)}>{children}</div>;\n};\n\nChatDialogFooter.displayName = 'ChatDialog.Footer';\n\n//\n// ChatDialog\n//\n\nexport const ChatDialog = {\n Root: ChatDialogRoot,\n Header: ChatDialogHeader,\n Content: ChatDialogContent,\n Footer: ChatDialogFooter,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type CompletionResult, autocompletion, completionKeymap } from '@codemirror/autocomplete';\nimport { type Extension, RangeSet } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n keymap,\n} from '@codemirror/view';\n\nimport { Mutex } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\n\n// TODO(dmaretskyi): Consider adding details renderer for when you hover over the reference.\nexport type ReferenceData = {\n uri: string;\n label: string;\n};\n\nexport interface ReferencesProvider {\n getReferences({ query }: { query: string }): Promise<ReferenceData[]>;\n resolveReference({ uri }: { uri: string }): Promise<ReferenceData | null>;\n}\n\nexport type ReferencesOptions = {\n provider: ReferencesProvider;\n\n /**\n * @default '@'\n */\n triggerCharacter?: string;\n\n /**\n * Prevent the autocomplete from closing when the user blurs the editor.\n * @default false\n */\n debug?: boolean;\n};\n\n/**\n * Lookup object references.\n */\nexport const references = ({ provider, triggerCharacter = '@', debug = false }: ReferencesOptions): Extension => {\n invariant(triggerCharacter.length === 1);\n\n const decorationField = ViewPlugin.fromClass(\n class ReferenceView {\n // TODO(burdon): Why?\n private _mutex = new Mutex();\n\n decorations: DecorationSet = Decoration.set([]);\n\n constructor(view: EditorView) {\n queueMicrotask(async () => {\n const guard = await this._mutex.acquire();\n try {\n this.decorations = await this._computeDecorations(view);\n } finally {\n guard.release();\n }\n });\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) {\n queueMicrotask(async () => {\n const guard = await this._mutex.acquire();\n try {\n this.decorations = await this._computeDecorations(update.view);\n } finally {\n guard.release();\n }\n });\n }\n }\n\n private async _computeDecorations(view: EditorView): Promise<DecorationSet> {\n const text = view.state.doc.toString();\n const references = text.matchAll(new RegExp(`${triggerCharacter}[a-zA-Z0-9@:]+\\\\s`, 'g'));\n\n const decorations = [];\n for (const match of references) {\n const reference = match[0];\n const uri = reference.slice(1, -1);\n const data = await provider.resolveReference({ uri });\n if (data) {\n decorations.push(\n Decoration.replace({\n widget: new ReferenceWidget(data),\n }).range(match.index!, match.index! + reference.length),\n );\n }\n }\n\n return Decoration.set(decorations);\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: (plugin) => [\n EditorView.atomicRanges.of(\n (view): DecorationSet => view.plugin(decorationField)?.decorations ?? RangeSet.empty,\n ),\n ],\n },\n );\n\n return [\n decorationField,\n\n EditorView.theme({\n '.cm-reference-pill': {\n borderRadius: '0.25rem',\n borderWidth: '1px',\n marginRight: '0.25rem',\n marginLeft: '0.25rem',\n },\n }),\n\n autocompletion({\n tooltipClass: () => 'shadow rounded',\n activateOnTyping: true,\n aboveCursor: true,\n closeOnBlur: !debug,\n override: [\n async (context): Promise<CompletionResult | null> => {\n const match = context.matchBefore(new RegExp(`${triggerCharacter}[a-zA-Z0-9]+`));\n if (!match || match?.to === match?.from) {\n return null;\n }\n\n const query = match.text.slice(1);\n const references = await provider.getReferences({ query });\n return {\n from: match.from,\n filter: false,\n options: references.map((reference) => ({\n label: reference.label,\n apply: `${triggerCharacter}${reference.uri} `,\n })),\n };\n },\n ],\n }),\n\n keymap.of(completionKeymap),\n ];\n};\n\nclass ReferenceWidget extends WidgetType {\n constructor(private data: ReferenceData) {\n super();\n }\n\n override toDOM(): HTMLSpanElement {\n const span = document.createElement('span');\n span.textContent = `@ ${this.data.label}`;\n span.className = 'cm-reference-pill';\n return span;\n }\n\n override eq(other: ReferenceWidget): boolean {\n return other.data.uri === this.data.uri;\n }\n\n override ignoreEvent(): boolean {\n return true;\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { keymap } from '@codemirror/view';\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport React, { forwardRef, useImperativeHandle } from 'react';\n\nimport { type ThemedClassName, useThemeContext } from '@dxos/react-ui';\nimport {\n type AutocompleteOptions,\n type BasicExtensionsOptions,\n type UseTextEditorProps,\n autocomplete,\n createBasicExtensions,\n createThemeExtensions,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { isTruthy } from '@dxos/util';\n\nimport { type ReferencesOptions, references as referencesExtension } from './references';\n\nexport interface ChatEditorController {\n focus(): void;\n getText(): string;\n setText(text: string): void;\n}\n\nexport type ChatEditorProps = ThemedClassName<\n {\n extensions?: Extension;\n references?: ReferencesOptions;\n } & AutocompleteOptions &\n Pick<UseTextEditorProps, 'id' | 'autoFocus'> &\n Pick<BasicExtensionsOptions, 'lineWrapping' | 'placeholder'>\n>;\n\nexport const ChatEditor = forwardRef<ChatEditorController, ChatEditorProps>(\n (\n { classNames, extensions, references, autoFocus, lineWrapping = false, placeholder, onSubmit, onSuggest, onCancel },\n forwardRef,\n ) => {\n const { themeMode } = useThemeContext();\n const { findNextFocusable, findPrevFocusable } = useFocusFinders();\n const { parentRef, view } = useTextEditor(\n () => ({\n debug: true,\n autoFocus,\n extensions: [\n createThemeExtensions({ themeMode }),\n createBasicExtensions({ bracketMatching: false, lineWrapping, placeholder }),\n autocomplete({ onSubmit, onSuggest, onCancel }),\n references ? referencesExtension({ provider: references.provider }) : [],\n // TODO(burdon): Standardize.\n keymap.of([\n {\n key: 'Tab',\n preventDefault: true,\n run: (view) => {\n findNextFocusable(view.dom)?.focus();\n return true;\n },\n },\n {\n key: 'Shift-Tab',\n preventDefault: true,\n run: (view) => {\n findPrevFocusable(view.dom)?.focus();\n return true;\n },\n },\n ]),\n extensions,\n ].filter(isTruthy),\n }),\n [themeMode, extensions, onSubmit, onSuggest, onCancel],\n );\n\n // Expose editor view.\n useImperativeHandle(forwardRef, () => {\n return {\n focus: () => {\n view?.focus();\n },\n getText: () => view?.state.doc.toString() ?? '',\n setText: (text: string) => {\n view?.dispatch({\n changes: {\n from: 0,\n to: view.state.doc.length,\n insert: text,\n },\n selection: {\n anchor: text.length,\n head: text.length,\n },\n });\n },\n };\n }, [view, onSubmit]);\n\n return <div ref={parentRef} className={mx('is-full', classNames)} />;\n },\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = 'react-ui-chat';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {},\n },\n },\n] as const satisfies Resource[];\n"],
5
- "mappings": "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",
6
- "names": ["createContext", "React", "useEffect", "useState", "Dialog", "Icon", "IconButton", "useControlledState", "ResizeHandle", "resizeAttributes", "sizeStyle", "mx", "preventDefault", "event", "Endcap", "children", "div", "className", "ChatDialogContextProvider", "useChatDialogContext", "createContext", "ChatDialogRoot", "open", "_open", "expanded", "expandedParam", "onOpenChange", "onExpandedChange", "onEscape", "size", "setSize", "useState", "setOpen", "useControlledState", "setExpanded", "Dialog", "Root", "modal", "role", "data-block-align", "Content", "inOverlayLayout", "classNames", "onEscapeKeyDown", "onInteractOutside", "displayName", "ChatDialogHeader", "title", "mx", "Close", "Icon", "icon", "Title", "onClick", "IconButton", "variant", "iconOnly", "label", "ChatDialogContent", "useEffect", "style", "sizeStyle", "maxBlockSize", "resizeAttributes", "ResizeHandle", "side", "iconPosition", "defaultSize", "fallbackSize", "minSize", "onSizeChange", "ChatDialogFooter", "ChatDialog", "Header", "Footer", "autocompletion", "completionKeymap", "RangeSet", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "keymap", "Mutex", "invariant", "references", "provider", "triggerCharacter", "debug", "length", "decorationField", "fromClass", "ReferenceView", "_mutex", "decorations", "set", "view", "queueMicrotask", "guard", "acquire", "_computeDecorations", "release", "update", "docChanged", "text", "state", "doc", "toString", "matchAll", "RegExp", "match", "reference", "uri", "slice", "data", "resolveReference", "push", "replace", "widget", "ReferenceWidget", "range", "index", "v", "provide", "plugin", "atomicRanges", "of", "empty", "theme", "borderRadius", "borderWidth", "marginRight", "marginLeft", "tooltipClass", "activateOnTyping", "aboveCursor", "closeOnBlur", "override", "context", "matchBefore", "to", "from", "query", "getReferences", "filter", "options", "map", "label", "apply", "toDOM", "span", "document", "createElement", "textContent", "className", "eq", "other", "ignoreEvent", "keymap", "useFocusFinders", "React", "forwardRef", "useImperativeHandle", "useThemeContext", "autocomplete", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "mx", "isTruthy", "ChatEditor", "forwardRef", "classNames", "extensions", "references", "autoFocus", "lineWrapping", "placeholder", "onSubmit", "onSuggest", "onCancel", "themeMode", "useThemeContext", "findNextFocusable", "findPrevFocusable", "useFocusFinders", "parentRef", "view", "useTextEditor", "debug", "createThemeExtensions", "createBasicExtensions", "bracketMatching", "autocomplete", "referencesExtension", "provider", "keymap", "of", "key", "preventDefault", "run", "dom", "focus", "filter", "isTruthy", "useImperativeHandle", "getText", "state", "doc", "toString", "setText", "text", "dispatch", "changes", "from", "to", "length", "insert", "selection", "anchor", "head", "React", "div", "ref", "className", "mx", "translationKey", "translations"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type Dispatch, type PropsWithChildren, type SetStateAction, useEffect, useState } from 'react';\n\nimport { Dialog, Icon, IconButton, type ThemedClassName, useControlledState } from '@dxos/react-ui';\nimport { ResizeHandle, type Size, resizeAttributes, sizeStyle } from '@dxos/react-ui-dnd';\nimport { mx } from '@dxos/ui-theme';\n\nconst preventDefault = (event: Event) => event.preventDefault();\n\n// TODO(burdon): Factor out.\nconst Endcap = ({ children }: PropsWithChildren) => {\n return (\n <div className='grid is-[var(--rail-action)] bs-[var(--rail-action)] items-center justify-center'>{children}</div>\n );\n};\n\n//\n// Context\n//\n\ntype ChatDialogContextValue = {\n open: boolean;\n setOpen: Dispatch<SetStateAction<boolean>>;\n expanded: boolean;\n setExpanded: Dispatch<SetStateAction<boolean>>;\n size: Size;\n setSize: Dispatch<SetStateAction<Size>>;\n};\n\nconst [ChatDialogContextProvider, useChatDialogContext] = createContext<ChatDialogContextValue>('ChatDialog');\n\n//\n// Root\n//\n\ntype ChatDialogRootProps = PropsWithChildren<{\n open?: boolean;\n expanded?: boolean;\n onOpenChange?: (open: boolean) => void;\n onExpandedChange?: (expanded: boolean) => void;\n onEscape?: () => void;\n}>;\n\nconst ChatDialogRoot = ({\n children,\n open: openProp = false,\n expanded: expandedProp = false,\n onOpenChange,\n onExpandedChange,\n onEscape,\n}: ChatDialogRootProps) => {\n const [size, setSize] = useState<Size>('min-content');\n const [open, setOpen] = useControlledState<boolean>(openProp, onOpenChange);\n const [expanded, setExpanded] = useControlledState<boolean>(expandedProp, onExpandedChange);\n\n // NOTE: We set the min size to 5rem (80px), and the header and prompt bar to 40px (i.e., the rail-size) each.\n // The dialog has no vertical padding and has box-content so that when closed it collapses to the size of the header and prompt bar.\n return (\n <ChatDialogContextProvider\n open={open}\n setOpen={setOpen}\n expanded={expanded}\n setExpanded={setExpanded}\n size={size}\n setSize={setSize}\n >\n <Dialog.Root modal={false} open={open} onOpenChange={setOpen}>\n <div role='none' className='dx-dialog__overlay bg-transparent pointer-events-none' data-block-align='end'>\n <Dialog.Content\n inOverlayLayout\n classNames={[\n 'grid grid-rows-[var(--rail-action)_1fr_min-content] p-0 overflow-hidden',\n 'box-content md:is-[35rem] md:max-is-none pointer-events-auto',\n ]}\n onEscapeKeyDown={onEscape}\n onInteractOutside={preventDefault}\n >\n {children}\n </Dialog.Content>\n </div>\n </Dialog.Root>\n </ChatDialogContextProvider>\n );\n};\n\nChatDialogRoot.displayName = 'ChatDialog.Root';\n\n//\n// Header\n//\n\ntype ChatDialogHeaderProps = ThemedClassName<{\n title?: string;\n}>;\n\nconst ChatDialogHeader = ({ classNames, title }: ChatDialogHeaderProps) => {\n const { expanded, setExpanded } = useChatDialogContext(ChatDialogHeader.displayName);\n\n return (\n <div className={mx('grid grid-cols-[var(--rail-action)_1fr_min-content] items-center overflow-hidden', classNames)}>\n <Endcap>\n <Dialog.Close>\n <Icon icon='ph--x--regular' />\n </Dialog.Close>\n </Endcap>\n <Dialog.Title\n classNames='flex is-full justify-center text-sm text-subdued select-none cursor-pointer'\n onClick={() => setExpanded((expanded) => !expanded)}\n >\n {title}\n </Dialog.Title>\n <Endcap>\n <IconButton\n variant='ghost'\n icon='ph--caret-up--regular'\n iconOnly\n classNames={mx('!p-1 [&>svg]:transition [&>svg]:duration-200', expanded && '[&>svg]:rotate-180')}\n label={expanded ? 'Close' : 'Open'}\n onClick={() => setExpanded((expanded) => !expanded)}\n />\n </Endcap>\n </div>\n );\n};\n\nChatDialogHeader.displayName = 'ChatDialog.Header';\n\n//\n// Content\n//\n\ntype ChatDialogContentProps = ThemedClassName<PropsWithChildren>;\n\nconst ChatDialogContent = ({ children, classNames }: ChatDialogContentProps) => {\n const { expanded, size, setSize } = useChatDialogContext(ChatDialogContent.displayName);\n useEffect(() => {\n setSize(expanded ? 'min-content' : 0);\n }, [expanded]);\n\n return (\n <div\n className={mx(\n 'flex flex-col overflow-y-auto border-bs border-be border-subduedSeparator',\n 'transition-[block-size] ease-in-out duration-0 [&:not([data-dx-resizing=\"true\"])]:duration-200',\n classNames,\n )}\n style={{\n ...sizeStyle(size, 'vertical', true),\n maxBlockSize: 'calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 14rem)',\n }}\n {...resizeAttributes}\n >\n <ResizeHandle\n side='block-start'\n iconPosition='center'\n defaultSize='min-content'\n fallbackSize={0}\n minSize={0}\n onSizeChange={setSize}\n />\n {children}\n </div>\n );\n};\n\nChatDialogContent.displayName = 'ChatDialog.Content';\n\n//\n// Footer\n//\n\ntype ChatDialogFooterProps = ThemedClassName<PropsWithChildren>;\n\nconst ChatDialogFooter = ({ children, classNames }: ChatDialogFooterProps) => {\n return <div className={mx(classNames)}>{children}</div>;\n};\n\nChatDialogFooter.displayName = 'ChatDialog.Footer';\n\n//\n// ChatDialog\n//\n\nexport const ChatDialog = {\n Root: ChatDialogRoot,\n Header: ChatDialogHeader,\n Content: ChatDialogContent,\n Footer: ChatDialogFooter,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type CompletionResult, autocompletion, completionKeymap } from '@codemirror/autocomplete';\nimport { type Extension, RangeSet } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n keymap,\n} from '@codemirror/view';\n\nimport { Mutex } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\n\n// TODO(dmaretskyi): Consider adding details renderer for when you hover over the reference.\nexport type ReferenceData = {\n uri: string; // TODO(burdon): Rename dxn.\n label: string;\n};\n\n/**\n * @deprecated\n */\n// TODO(burdon): Remove.\nexport interface ReferencesProvider {\n getReferences({ query }: { query: string }): Promise<ReferenceData[]>;\n resolveReference({ uri }: { uri: string }): Promise<ReferenceData | null>;\n}\n\nexport type ReferencesOptions = {\n provider: ReferencesProvider;\n\n /**\n * @default '@'\n */\n triggerCharacter?: string;\n\n /**\n * Prevent the autocomplete from closing when the user blurs the editor.\n * @default false\n */\n debug?: boolean;\n};\n\n/**\n * Lookup object references.\n * @deprecated\n */\n// TODO(burdon): Remove.\nexport const references = ({ provider, triggerCharacter = '@', debug = false }: ReferencesOptions): Extension => {\n invariant(triggerCharacter.length === 1);\n\n const decorationField = ViewPlugin.fromClass(\n class ReferenceView {\n // TODO(burdon): Why?\n private _mutex = new Mutex();\n\n decorations: DecorationSet = Decoration.set([]);\n\n constructor(view: EditorView) {\n queueMicrotask(async () => {\n const guard = await this._mutex.acquire();\n try {\n this.decorations = await this._computeDecorations(view);\n } finally {\n guard.release();\n }\n });\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) {\n queueMicrotask(async () => {\n const guard = await this._mutex.acquire();\n try {\n this.decorations = await this._computeDecorations(update.view);\n } finally {\n guard.release();\n }\n });\n }\n }\n\n private async _computeDecorations(view: EditorView): Promise<DecorationSet> {\n const text = view.state.doc.toString();\n const references = text.matchAll(new RegExp(`${triggerCharacter}[a-zA-Z0-9@:]+\\\\s`, 'g'));\n\n const decorations = [];\n for (const match of references) {\n const reference = match[0];\n const uri = reference.slice(1, -1);\n const data = await provider.resolveReference({ uri });\n if (data) {\n decorations.push(\n Decoration.replace({\n widget: new ReferenceWidget(data),\n }).range(match.index!, match.index! + reference.length),\n );\n }\n }\n\n return Decoration.set(decorations);\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: () => [\n EditorView.atomicRanges.of(\n (view): DecorationSet => view.plugin(decorationField)?.decorations ?? RangeSet.empty,\n ),\n ],\n },\n );\n\n return [\n decorationField,\n\n EditorView.theme({\n '.cm-reference-pill': {\n borderRadius: '0.25rem',\n borderWidth: '1px',\n marginRight: '0.25rem',\n marginLeft: '0.25rem',\n },\n }),\n\n autocompletion({\n tooltipClass: () => 'shadow rounded',\n activateOnTyping: true,\n aboveCursor: true,\n closeOnBlur: !debug,\n override: [\n async (context): Promise<CompletionResult | null> => {\n const match = context.matchBefore(new RegExp(`${triggerCharacter}[a-zA-Z0-9]+`));\n if (!match || match?.to === match?.from) {\n return null;\n }\n\n const query = match.text.slice(1);\n const references = await provider.getReferences({ query });\n return {\n from: match.from,\n filter: false,\n options: references.map((reference) => ({\n label: reference.label,\n apply: `${triggerCharacter}${reference.uri} `,\n })),\n };\n },\n ],\n }),\n\n keymap.of(completionKeymap),\n ];\n};\n\nclass ReferenceWidget extends WidgetType {\n constructor(private data: ReferenceData) {\n super();\n }\n\n override ignoreEvent() {\n return true;\n }\n\n override eq(other: this) {\n return this.data.uri === other.data.uri;\n }\n\n override toDOM() {\n const span = document.createElement('span');\n span.textContent = `@${this.data.label}`;\n span.className = 'cm-reference-pill';\n return span;\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport React, { forwardRef, useMemo } from 'react';\n\nimport { type ThemedClassName, useThemeContext } from '@dxos/react-ui';\nimport { Editor, type EditorController, type UseTextEditorProps } from '@dxos/react-ui-editor';\nimport {\n type BasicExtensionsOptions,\n type SubmitOptions,\n createBasicExtensions,\n createThemeExtensions,\n submit,\n} from '@dxos/ui-editor';\nimport { isTruthy } from '@dxos/util';\n\nimport { type ReferencesOptions } from './references';\n\nexport interface ChatEditorController extends EditorController {}\n\nexport type ChatEditorProps = ThemedClassName<\n {\n extensions?: Extension;\n references?: ReferencesOptions;\n } & (SubmitOptions &\n Pick<UseTextEditorProps, 'id' | 'autoFocus'> &\n Pick<BasicExtensionsOptions, 'lineWrapping' | 'placeholder'>)\n>;\n\nexport const useChatExtensions = ({ extensions, lineWrapping = false, placeholder, onSubmit }: ChatEditorProps) => {\n const { themeMode } = useThemeContext();\n return useMemo<Extension[]>(\n () =>\n [\n createThemeExtensions({ themeMode }),\n createBasicExtensions({ bracketMatching: false, lineWrapping, placeholder }),\n submit({ onSubmit }),\n extensions,\n ].filter(isTruthy),\n [themeMode, extensions, onSubmit],\n );\n};\n\nexport const ChatEditor = forwardRef<ChatEditorController, ChatEditorProps>(\n ({ classNames, autoFocus, extensions: extensionsProp, lineWrapping = false, placeholder, onSubmit }, forwardRef) => {\n const extensions = useChatExtensions({ extensions: extensionsProp, lineWrapping, placeholder, onSubmit });\n\n // TODO(burdon): Popover.\n return (\n <Editor.Root ref={forwardRef}>\n <Editor.Content classNames={classNames} autoFocus={autoFocus} extensions={extensions} />\n </Editor.Root>\n );\n },\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = '@dxos/react-ui-chat';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {},\n },\n },\n] as const satisfies Resource[];\n"],
5
+ "mappings": "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",
6
+ "names": ["createContext", "React", "useEffect", "useState", "Dialog", "Icon", "IconButton", "useControlledState", "ResizeHandle", "resizeAttributes", "sizeStyle", "mx", "preventDefault", "event", "Endcap", "children", "div", "className", "ChatDialogContextProvider", "useChatDialogContext", "createContext", "ChatDialogRoot", "open", "openProp", "expanded", "expandedProp", "onOpenChange", "onExpandedChange", "onEscape", "size", "setSize", "useState", "setOpen", "useControlledState", "setExpanded", "Dialog", "Root", "modal", "role", "data-block-align", "Content", "inOverlayLayout", "classNames", "onEscapeKeyDown", "onInteractOutside", "displayName", "ChatDialogHeader", "title", "mx", "Close", "Icon", "icon", "Title", "onClick", "IconButton", "variant", "iconOnly", "label", "ChatDialogContent", "useEffect", "style", "sizeStyle", "maxBlockSize", "resizeAttributes", "ResizeHandle", "side", "iconPosition", "defaultSize", "fallbackSize", "minSize", "onSizeChange", "ChatDialogFooter", "ChatDialog", "Header", "Footer", "autocompletion", "completionKeymap", "RangeSet", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "keymap", "Mutex", "invariant", "references", "provider", "triggerCharacter", "debug", "length", "decorationField", "fromClass", "ReferenceView", "_mutex", "decorations", "set", "view", "queueMicrotask", "guard", "acquire", "_computeDecorations", "release", "update", "docChanged", "text", "state", "doc", "toString", "matchAll", "RegExp", "match", "reference", "uri", "slice", "data", "resolveReference", "push", "replace", "widget", "ReferenceWidget", "range", "index", "v", "provide", "atomicRanges", "of", "plugin", "empty", "theme", "borderRadius", "borderWidth", "marginRight", "marginLeft", "tooltipClass", "activateOnTyping", "aboveCursor", "closeOnBlur", "override", "context", "matchBefore", "to", "from", "query", "getReferences", "filter", "options", "map", "label", "apply", "ignoreEvent", "eq", "other", "toDOM", "span", "document", "createElement", "textContent", "className", "React", "forwardRef", "useMemo", "useThemeContext", "Editor", "createBasicExtensions", "createThemeExtensions", "submit", "isTruthy", "useChatExtensions", "extensions", "lineWrapping", "placeholder", "onSubmit", "themeMode", "useThemeContext", "useMemo", "createThemeExtensions", "createBasicExtensions", "bracketMatching", "submit", "filter", "isTruthy", "ChatEditor", "forwardRef", "classNames", "autoFocus", "extensionsProp", "React", "Editor", "Root", "ref", "Content", "translationKey", "translations"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"src/components/ChatDialog/ChatDialog.tsx":{"bytes":17762,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-dnd","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"src/components/ChatDialog/index.ts":{"bytes":480,"imports":[{"path":"src/components/ChatDialog/ChatDialog.tsx","kind":"import-statement","original":"./ChatDialog"}],"format":"esm"},"src/components/ChatEditor/references.ts":{"bytes":15921,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/components/ChatEditor/ChatEditor.tsx":{"bytes":11267,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/components/ChatEditor/references.ts","kind":"import-statement","original":"./references"}],"format":"esm"},"src/components/ChatEditor/index.ts":{"bytes":574,"imports":[{"path":"src/components/ChatEditor/references.ts","kind":"import-statement","original":"./references"},{"path":"src/components/ChatEditor/ChatEditor.tsx","kind":"import-statement","original":"./ChatEditor"}],"format":"esm"},"src/components/index.ts":{"bytes":563,"imports":[{"path":"src/components/ChatDialog/index.ts","kind":"import-statement","original":"./ChatDialog"},{"path":"src/components/ChatEditor/index.ts","kind":"import-statement","original":"./ChatEditor"}],"format":"esm"},"src/translations.ts":{"bytes":1041,"imports":[],"format":"esm"},"src/index.ts":{"bytes":558,"imports":[{"path":"src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":23339},"dist/lib/browser/index.mjs":{"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-dnd","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["ChatDialog","ChatEditor","references","translationKey","translations"],"entryPoint":"src/index.ts","inputs":{"src/components/ChatDialog/ChatDialog.tsx":{"bytesInOutput":4874},"src/components/ChatDialog/index.ts":{"bytesInOutput":0},"src/components/index.ts":{"bytesInOutput":0},"src/components/ChatEditor/references.ts":{"bytesInOutput":3691},"src/components/ChatEditor/index.ts":{"bytesInOutput":0},"src/components/ChatEditor/ChatEditor.tsx":{"bytesInOutput":2700},"src/index.ts":{"bytesInOutput":0},"src/translations.ts":{"bytesInOutput":118}},"bytes":11662}}}
1
+ {"inputs":{"src/components/ChatDialog/ChatDialog.tsx":{"bytes":16935,"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-dnd","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"format":"esm"},"src/components/ChatDialog/index.ts":{"bytes":480,"imports":[{"path":"src/components/ChatDialog/ChatDialog.tsx","kind":"import-statement","original":"./ChatDialog"}],"format":"esm"},"src/components/ChatEditor/references.ts":{"bytes":16054,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/components/ChatEditor/ChatEditor.tsx":{"bytes":5856,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-editor","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/components/ChatEditor/index.ts":{"bytes":574,"imports":[{"path":"src/components/ChatEditor/references.ts","kind":"import-statement","original":"./references"},{"path":"src/components/ChatEditor/ChatEditor.tsx","kind":"import-statement","original":"./ChatEditor"}],"format":"esm"},"src/components/index.ts":{"bytes":563,"imports":[{"path":"src/components/ChatDialog/index.ts","kind":"import-statement","original":"./ChatDialog"},{"path":"src/components/ChatEditor/index.ts","kind":"import-statement","original":"./ChatEditor"}],"format":"esm"},"src/translations.ts":{"bytes":1055,"imports":[],"format":"esm"},"src/index.ts":{"bytes":558,"imports":[{"path":"src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":20945},"dist/lib/browser/index.mjs":{"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-dnd","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-editor","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["ChatDialog","ChatEditor","references","translationKey","translations","useChatExtensions"],"entryPoint":"src/index.ts","inputs":{"src/components/ChatDialog/ChatDialog.tsx":{"bytesInOutput":4286},"src/components/ChatDialog/index.ts":{"bytesInOutput":0},"src/components/index.ts":{"bytesInOutput":0},"src/components/ChatEditor/references.ts":{"bytesInOutput":3684},"src/components/ChatEditor/index.ts":{"bytesInOutput":0},"src/components/ChatEditor/ChatEditor.tsx":{"bytesInOutput":1210},"src/index.ts":{"bytesInOutput":0},"src/translations.ts":{"bytesInOutput":124}},"bytes":9604}}}