@dxos/plugin-thread 0.8.2-main.5ca3450 → 0.8.2-main.600d381

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 (45) hide show
  1. package/dist/lib/browser/{ChatContainer-UTQWOBXM.mjs → ChatContainer-H4XTHM3A.mjs} +2 -2
  2. package/dist/lib/browser/{chunk-2E5LHYLQ.mjs → chunk-I3JK6CBS.mjs} +8 -6
  3. package/dist/lib/browser/{chunk-2E5LHYLQ.mjs.map → chunk-I3JK6CBS.mjs.map} +3 -3
  4. package/dist/lib/browser/{chunk-UT6IV2FX.mjs → chunk-UIHVZTER.mjs} +2 -2
  5. package/dist/lib/browser/index.mjs +3 -3
  6. package/dist/lib/browser/index.mjs.map +1 -1
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/{react-surface-FUWNPSKX.mjs → react-surface-JRPJOEQ7.mjs} +17 -18
  9. package/dist/lib/browser/react-surface-JRPJOEQ7.mjs.map +7 -0
  10. package/dist/lib/node/{ChatContainer-VO5B47V4.cjs → ChatContainer-TUISUIY7.cjs} +8 -8
  11. package/dist/lib/node/{chunk-BUYO7P2A.cjs → chunk-ETDNE4Z6.cjs} +11 -9
  12. package/dist/lib/node/{chunk-BUYO7P2A.cjs.map → chunk-ETDNE4Z6.cjs.map} +3 -3
  13. package/dist/lib/node/{chunk-KYLJU47G.cjs → chunk-ZFPSGBXT.cjs} +5 -5
  14. package/dist/lib/node/index.cjs +8 -8
  15. package/dist/lib/node/index.cjs.map +1 -1
  16. package/dist/lib/node/meta.json +1 -1
  17. package/dist/lib/node/{react-surface-G7GXAK5G.cjs → react-surface-PLJ3Z77A.cjs} +23 -24
  18. package/dist/lib/node/react-surface-PLJ3Z77A.cjs.map +7 -0
  19. package/dist/lib/node-esm/{ChatContainer-IAX56SIL.mjs → ChatContainer-G7VTTRDN.mjs} +2 -2
  20. package/dist/lib/node-esm/{chunk-KUQP2ES3.mjs → chunk-G7AKHJ3A.mjs} +2 -2
  21. package/dist/lib/node-esm/{chunk-CBAEGDBZ.mjs → chunk-V7HLWNAO.mjs} +8 -6
  22. package/dist/lib/node-esm/{chunk-CBAEGDBZ.mjs.map → chunk-V7HLWNAO.mjs.map} +3 -3
  23. package/dist/lib/node-esm/index.mjs +3 -3
  24. package/dist/lib/node-esm/index.mjs.map +1 -1
  25. package/dist/lib/node-esm/meta.json +1 -1
  26. package/dist/lib/node-esm/{react-surface-FSBMYEZJ.mjs → react-surface-M5GMRQVC.mjs} +17 -18
  27. package/dist/lib/node-esm/react-surface-M5GMRQVC.mjs.map +7 -0
  28. package/dist/types/src/components/CommentContainer.d.ts.map +1 -1
  29. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  31. package/package.json +33 -33
  32. package/src/components/Chat.stories.tsx +1 -1
  33. package/src/components/CommentContainer.tsx +25 -49
  34. package/src/components/Comments.stories.tsx +1 -5
  35. package/src/components/MessageContainer.tsx +22 -38
  36. package/src/translations.ts +2 -2
  37. package/dist/lib/browser/react-surface-FUWNPSKX.mjs.map +0 -7
  38. package/dist/lib/node/react-surface-G7GXAK5G.cjs.map +0 -7
  39. package/dist/lib/node-esm/react-surface-FSBMYEZJ.mjs.map +0 -7
  40. /package/dist/lib/browser/{ChatContainer-UTQWOBXM.mjs.map → ChatContainer-H4XTHM3A.mjs.map} +0 -0
  41. /package/dist/lib/browser/{chunk-UT6IV2FX.mjs.map → chunk-UIHVZTER.mjs.map} +0 -0
  42. /package/dist/lib/node/{ChatContainer-VO5B47V4.cjs.map → ChatContainer-TUISUIY7.cjs.map} +0 -0
  43. /package/dist/lib/node/{chunk-KYLJU47G.cjs.map → chunk-ZFPSGBXT.cjs.map} +0 -0
  44. /package/dist/lib/node-esm/{ChatContainer-IAX56SIL.mjs.map → ChatContainer-G7VTTRDN.mjs.map} +0 -0
  45. /package/dist/lib/node-esm/{chunk-KUQP2ES3.mjs.map → chunk-G7AKHJ3A.mjs.map} +0 -0
@@ -1,4 +1,4 @@
1
- import "./chunk-UT6IV2FX.mjs";
1
+ import "./chunk-UIHVZTER.mjs";
2
2
  import {
3
3
  ThreadCapabilities
4
4
  } from "./chunk-EP6MRLY7.mjs";
@@ -6,7 +6,7 @@ import {
6
6
  MessageContainer,
7
7
  command,
8
8
  getMessageMetadata
9
- } from "./chunk-2E5LHYLQ.mjs";
9
+ } from "./chunk-I3JK6CBS.mjs";
10
10
  import {
11
11
  useStatus
12
12
  } from "./chunk-32EIWOAL.mjs";
@@ -44,8 +44,9 @@ var commentControlClassNames = "!p-1 !min-bs-0 transition-opacity";
44
44
  var ToggleResolvedButton = ({ isResolved, onResolve }) => {
45
45
  const { t } = useTranslation(THREAD_PLUGIN);
46
46
  const label = t(isResolved ? "mark as unresolved label" : "mark as resolved label");
47
- return /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
48
- asChild: true
47
+ return /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
48
+ asChild: true,
49
+ content: label
49
50
  }, /* @__PURE__ */ React.createElement(Button, {
50
51
  variant: "ghost",
51
52
  "data-testid": "thread.toggle-resolved",
@@ -61,13 +62,14 @@ var ToggleResolvedButton = ({ isResolved, onResolve }) => {
61
62
  weight: "fill"
62
63
  }) : /* @__PURE__ */ React.createElement(CheckCircle, {
63
64
  className: sizeClass
64
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, label, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))));
65
+ })));
65
66
  };
66
67
  var DeleteThreadButton = ({ onDelete }) => {
67
68
  const { t } = useTranslation(THREAD_PLUGIN);
68
69
  const label = t("delete thread label");
69
- return /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
70
- asChild: true
70
+ return /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
71
+ asChild: true,
72
+ content: label
71
73
  }, /* @__PURE__ */ React.createElement(Button, {
72
74
  variant: "ghost",
73
75
  "data-testid": "thread.delete",
@@ -80,9 +82,7 @@ var DeleteThreadButton = ({ onDelete }) => {
80
82
  className: "sr-only"
81
83
  }, label), /* @__PURE__ */ React.createElement(X, {
82
84
  className: sizeClass
83
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
84
- classNames: "z-30"
85
- }, label, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null))));
85
+ })));
86
86
  };
87
87
  var CommentContainer = ({ thread, detached, current, onAttend, onComment, onResolve, onMessageDelete, onThreadDelete }) => {
88
88
  const identity = useIdentity();
@@ -151,14 +151,13 @@ var CommentContainer = ({ thread, detached, current, onAttend, onComment, onReso
151
151
  }, /* @__PURE__ */ React.createElement("div", {
152
152
  role: "none",
153
153
  className: mx("col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]", hoverableControls, hoverableFocusedWithinControls)
154
- }, detached ? /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
155
- asChild: true
154
+ }, detached ? /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
155
+ asChild: true,
156
+ content: t("detached thread label"),
157
+ side: "top"
156
158
  }, /* @__PURE__ */ React.createElement(ThreadHeading, {
157
159
  detached: true
158
- }, thread.name)), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, {
159
- classNames: "z-30",
160
- side: "top"
161
- }, t("detached thread label"), /* @__PURE__ */ React.createElement(Tooltip.Arrow, null)))) : /* @__PURE__ */ React.createElement(ThreadHeading, null, thread.name), /* @__PURE__ */ React.createElement("div", {
160
+ }, thread.name)) : /* @__PURE__ */ React.createElement(ThreadHeading, null, thread.name), /* @__PURE__ */ React.createElement("div", {
162
161
  className: "flex flex-row items-center pli-1"
163
162
  }, thread.status === "staged" && /* @__PURE__ */ React.createElement(Tag, {
164
163
  palette: "neutral"
@@ -380,7 +379,7 @@ var ThreadSettings = ({ settings }) => {
380
379
  };
381
380
 
382
381
  // packages/plugins/plugin-thread/src/components/index.ts
383
- var ChatContainer = lazy(() => import("./ChatContainer-UTQWOBXM.mjs"));
382
+ var ChatContainer = lazy(() => import("./ChatContainer-H4XTHM3A.mjs"));
384
383
 
385
384
  // packages/plugins/plugin-thread/src/capabilities/react-surface.tsx
386
385
  var react_surface_default = () => contributes(Capabilities.ReactSurface, [
@@ -434,4 +433,4 @@ var react_surface_default = () => contributes(Capabilities.ReactSurface, [
434
433
  export {
435
434
  react_surface_default as default
436
435
  };
437
- //# sourceMappingURL=react-surface-FUWNPSKX.mjs.map
436
+ //# sourceMappingURL=react-surface-JRPJOEQ7.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/index.ts", "../../../src/components/CommentContainer.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/ThreadComplementary.tsx", "../../../src/components/ThreadSettings.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface, useLayout } from '@dxos/app-framework';\nimport { type Ref } from '@dxos/echo-schema';\nimport { DXN } from '@dxos/keys';\nimport { SettingsStore } from '@dxos/local-storage';\nimport { ChannelType, type ThreadType } from '@dxos/plugin-space/types';\nimport { getSpace, isSpace, type Space } from '@dxos/react-client/echo';\n\nimport { ChatContainer, ThreadComplementary, ThreadSettings } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { type ThreadSettingsProps } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${THREAD_PLUGIN}/channel`,\n role: 'article',\n filter: (data): data is { subject: ChannelType } => data.subject instanceof ChannelType,\n component: ({ data: { subject: channel }, role }) => {\n const layout = useLayout();\n const currentPosition = layout.active.findIndex((id) => id === channel.id);\n const objectToTheLeft = layout.active[currentPosition - 1];\n const context = currentPosition > 0 ? getSpace(channel)?.db.getObjectById(objectToTheLeft) : undefined;\n const space = getSpace(channel);\n if (!space) {\n return null;\n }\n\n return <ChatContainer space={space} dxn={channel.queue.dxn} context={context} />;\n },\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/comments`,\n role: 'article',\n filter: (data): data is { companionTo: { threads: Ref<ThreadType>[] } } =>\n data.subject === 'comments' &&\n !!data.companionTo &&\n typeof data.companionTo === 'object' &&\n 'threads' in data.companionTo &&\n Array.isArray(data.companionTo.threads),\n // TODO(wittjosiah): This isn't scrolling properly in a plank.\n component: ({ data }) => <ThreadComplementary subject={data.companionTo} />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/tabpanel`,\n role: 'tabpanel',\n filter: (data): data is { subject: DXN; space: Space } =>\n data.subject instanceof DXN && data.type === 'chat' && isSpace(data.space),\n component: ({ data: { subject: dxn, space } }) => <ChatContainer dxn={dxn} space={space} />,\n }),\n createSurface({\n id: `${THREAD_PLUGIN}/plugin-settings`,\n role: 'article',\n filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>\n data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,\n component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\n\n// TODO(wittjosiah): Suspense boundary for sidebar?\nexport * from './CommentContainer';\nexport * from './CommentsContainer';\nexport * from './MessageContainer';\nexport * from './ThreadComplementary';\nexport * from './ThreadSettings';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CheckCircle, X } from '@phosphor-icons/react';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { RefArray } from '@dxos/live-object';\nimport { fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Button, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, ThreadFooter, ThreadHeading } from '@dxos/react-ui-thread';\nimport { isNonNullable } from '@dxos/util';\n\nimport { MessageContainer } from './MessageContainer';\nimport { command } from './command-extension';\nimport { type ThreadContainerProps } from './types';\nimport { useStatus } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nconst sizeClass = getSize(4);\n\n// TODO(thure): #8149\nconst commentControlClassNames = '!p-1 !min-bs-0 transition-opacity';\n\nconst ToggleResolvedButton = ({\n isResolved,\n onResolve,\n}: {\n isResolved: boolean | undefined;\n onResolve: () => void;\n}) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t(isResolved ? 'mark as unresolved label' : 'mark as resolved label');\n return (\n <Tooltip.Trigger asChild content={label}>\n <Button\n variant='ghost'\n data-testid='thread.toggle-resolved'\n onClick={onResolve}\n classNames={[commentControlClassNames, !isResolved && hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n {isResolved ? <CheckCircle className={sizeClass} weight='fill' /> : <CheckCircle className={sizeClass} />}\n </Button>\n </Tooltip.Trigger>\n );\n};\n\nconst DeleteThreadButton = ({ onDelete }: { onDelete: () => void }) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const label = t('delete thread label');\n return (\n <Tooltip.Trigger asChild content={label}>\n <Button\n variant='ghost'\n data-testid='thread.delete'\n onClick={onDelete}\n classNames={[commentControlClassNames, hoverableControlItem]}\n >\n <span className='sr-only'>{label}</span>\n <X className={sizeClass} />\n </Button>\n </Tooltip.Trigger>\n );\n};\n\nexport const CommentContainer = ({\n thread,\n detached,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: ThreadContainerProps) => {\n const identity = useIdentity()!;\n const space = getSpace(thread);\n const members = useMembers(space?.key);\n const activity = useStatus(space, fullyQualifiedId(thread));\n const { t } = useTranslation(THREAD_PLUGIN);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [_count],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(thread), [onAttend, thread]);\n const handleResolve = useCallback(() => onResolve?.(thread), [onResolve, thread]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(thread, id), [onMessageDelete, thread]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(thread), [onThreadDelete, thread]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(thread, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n rerenderEditor();\n\n return true;\n }, [thread, identity]);\n\n return (\n <Thread onClickCapture={handleAttend} onFocusCapture={handleAttend} current={current} id={fullyQualifiedId(thread)}>\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <ThreadHeading detached>{thread.name}</ThreadHeading>\n </Tooltip.Trigger>\n ) : (\n <ThreadHeading>{thread.name}</ThreadHeading>\n )}\n <div className='flex flex-row items-center pli-1'>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <ToggleResolvedButton isResolved={thread?.status === 'resolved'} onResolve={handleResolve} />\n )}\n {onThreadDelete && <DeleteThreadButton onDelete={handleThreadDelete} />}\n </div>\n </div>\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {RefArray.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer\n key={message.id}\n editable\n message={message}\n members={members}\n onDelete={handleMessageDelete}\n />\n ))}\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n <ThreadFooter activity={activity}>{t('activity message')}</ThreadFooter>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </Thread>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { ChatText } from '@phosphor-icons/react';\nimport React, { useEffect } from 'react';\n\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useTranslation, Trans } from '@dxos/react-ui';\nimport { descriptionMessage, mx } from '@dxos/react-ui-theme';\n\nimport { CommentContainer } from './CommentContainer';\nimport { type ThreadContainerProps } from './types';\nimport { THREAD_PLUGIN } from '../meta';\n\nexport type ThreadsContainerProps = Omit<ThreadContainerProps, 'thread' | 'detached' | 'current' | 'autoFocus'> & {\n threads: ThreadType[];\n /**\n * Threads that are no longer anchored to a position in the object.\n */\n detached?: string[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Comment threads.\n */\nexport const CommentsContainer = ({\n threads,\n detached = [],\n currentId,\n showResolvedThreads,\n ...props\n}: ThreadsContainerProps) => {\n const { t } = useTranslation(THREAD_PLUGIN);\n const filteredThreads = showResolvedThreads ? threads : threads.filter((thread) => !(thread?.status === 'resolved'));\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n return (\n <>\n {filteredThreads.length > 0 ? (\n filteredThreads.map((thread) => {\n const threadId = fullyQualifiedId(thread);\n return (\n <CommentContainer\n key={threadId}\n thread={thread}\n current={currentId === threadId}\n detached={detached.includes(threadId)}\n {...props}\n />\n );\n })\n ) : (\n <div role='alert' className={mx(descriptionMessage, 'place-self-center rounded-lg text-center m-4')}>\n <h2 className='mbe-2 font-medium text-baseText'>{t('no comments title')}</h2>\n <p>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <ChatText className='inline-block' />,\n },\n }}\n />\n </p>\n </div>\n )}\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo } from 'react';\n\nimport { createIntent, LayoutAction, useCapability, useCapabilities, useIntentDispatcher } from '@dxos/app-framework';\nimport { ThreadCapabilities } from '@dxos/plugin-space';\nimport { type ThreadType } from '@dxos/plugin-space/types';\nimport { fullyQualifiedId, RefArray } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { isNonNullable } from '@dxos/util';\n\nimport { ThreadCapabilities as LocalThreadCapabilities } from '../capabilities';\nimport { CommentsContainer } from '../components';\nimport { THREAD_PLUGIN } from '../meta';\nimport { ThreadAction } from '../types';\n\nexport const ThreadComplementary = ({ subject }: { subject: any }) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const { t } = useTranslation(THREAD_PLUGIN);\n\n const { state, getViewState } = useCapability(LocalThreadCapabilities.MutableState);\n const viewState = getViewState(fullyQualifiedId(subject));\n const { showResolvedThreads } = viewState;\n const onChangeViewState = useCallback(\n (nextValue: string) => {\n viewState.showResolvedThreads = nextValue === 'all';\n },\n [viewState],\n );\n const drafts = state.drafts[fullyQualifiedId(subject)];\n\n const threadsIntegrators = useCapabilities(ThreadCapabilities.Thread);\n const createSort = useMemo(\n () => threadsIntegrators.find((p) => p.predicate(subject))?.createSort,\n [threadsIntegrators, subject],\n );\n const sort = useMemo(() => createSort?.(subject), [createSort, subject]);\n\n const threadObjects = RefArray.targets(subject.threads ?? []);\n\n const threads = useMemo(() => {\n return threadObjects.concat(drafts ?? []).filter(isNonNullable) as ThreadType[];\n }, [JSON.stringify(threadObjects), JSON.stringify(drafts)]);\n\n const detachedIds = useMemo(() => {\n return threads.filter(({ anchor }) => !anchor).map((thread) => fullyQualifiedId(thread));\n }, [threads]);\n\n useEffect(() => {\n if (!sort) {\n return;\n }\n threads.sort((a, b) => sort(a?.anchor, b?.anchor));\n }, [sort, threads]);\n\n const attended = useAttended();\n const qualifiedSubjectId = fullyQualifiedId(subject);\n\n const handleAttend = useCallback(\n (thread: ThreadType) => {\n const threadId = fullyQualifiedId(thread);\n if (state.current !== threadId) {\n state.current = threadId;\n\n // TODO(wittjosiah): Should this be a thread-specific intent?\n // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.\n // This may be overloading this intent or highjacking its intended purpose.\n void dispatch(\n createIntent(LayoutAction.ScrollIntoView, {\n part: 'current',\n subject: fullyQualifiedId(subject),\n options: {\n cursor: thread.anchor,\n ref: threadId,\n },\n }),\n );\n }\n },\n [state.current, dispatch, subject],\n );\n\n const handleComment = useCallback(\n async (thread: ThreadType, text: string) => {\n await dispatch(\n createIntent(ThreadAction.AddMessage, { thread, subject, sender: { identityDid: identity?.did }, text }),\n );\n\n state.current = fullyQualifiedId(thread);\n },\n [dispatch, identity, subject],\n );\n\n const handleResolve = useCallback(\n (thread: ThreadType) => dispatch(createIntent(ThreadAction.ToggleResolved, { thread })),\n [dispatch],\n );\n\n const handleThreadDelete = useCallback(\n (thread: ThreadType) => dispatch(createIntent(ThreadAction.Delete, { thread, subject })),\n [dispatch, subject],\n );\n\n const handleMessageDelete = useCallback(\n (thread: ThreadType, messageId: string) =>\n dispatch(createIntent(ThreadAction.DeleteMessage, { thread, subject, messageId })),\n [dispatch, subject],\n );\n\n const comments = (\n <CommentsContainer\n threads={threads}\n detached={detachedIds}\n currentId={attended.includes(qualifiedSubjectId) ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n />\n );\n\n return (\n <StackItem.Content toolbar>\n <Tabs.Root\n value={showResolvedThreads ? 'all' : 'unresolved'}\n onValueChange={onChangeViewState}\n orientation='horizontal'\n classNames='contents [&_[role=\"tabpanel\"]]:min-bs-0 [&_[role=\"tabpanel\"]]:overflow-y-auto [&_[role=\"tabpanel\"]]:scrollbar-thin'\n >\n <Tabs.Tablist classNames='p-1 gap-1 bs-[--rail-action] border-be border-separator'>\n <Tabs.Tab value='unresolved' classNames='text-sm'>\n {t('show unresolved label')}\n </Tabs.Tab>\n <Tabs.Tab value='all' classNames='text-sm'>\n {t('show all label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>\n <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>\n </Tabs.Root>\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\n// import { useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer } from '@dxos/react-ui-form';\n\n// import { THREAD_PLUGIN } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {\n // const { t } = useTranslation(THREAD_PLUGIN);\n\n return <DeprecatedFormContainer></DeprecatedFormContainer>;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "Capabilities", "contributes", "createSurface", "useLayout", "DXN", "SettingsStore", "ChannelType", "getSpace", "isSpace", "lazy", "CheckCircle", "X", "React", "useCallback", "useMemo", "useRef", "useState", "RefArray", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "Button", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "getSize", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "ThreadFooter", "ThreadHeading", "isNonNullable", "sizeClass", "getSize", "commentControlClassNames", "ToggleResolvedButton", "isResolved", "onResolve", "t", "useTranslation", "THREAD_PLUGIN", "label", "Tooltip", "Trigger", "asChild", "content", "Button", "variant", "data-testid", "onClick", "classNames", "hoverableControlItem", "span", "className", "CheckCircle", "weight", "DeleteThreadButton", "onDelete", "X", "CommentContainer", "thread", "detached", "current", "onAttend", "onComment", "onMessageDelete", "onThreadDelete", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "useState", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "id", "handleThreadDelete", "handleComment", "Thread", "onClickCapture", "onFocusCapture", "div", "role", "mx", "hoverableControls", "hoverableFocusedWithinControls", "side", "ThreadHeading", "name", "status", "Tag", "palette", "RefArray", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "editable", "MessageTextbox", "onSend", "ThreadFooter", "ref", "ChatText", "React", "useEffect", "fullyQualifiedId", "useTranslation", "Trans", "descriptionMessage", "mx", "CommentsContainer", "threads", "detached", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "THREAD_PLUGIN", "filteredThreads", "filter", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "React", "length", "map", "threadId", "fullyQualifiedId", "CommentContainer", "key", "current", "includes", "div", "role", "className", "mx", "descriptionMessage", "h2", "p", "Trans", "i18nKey", "components", "commentIcon", "ChatText", "React", "useCallback", "useEffect", "useMemo", "createIntent", "LayoutAction", "useCapability", "useCapabilities", "useIntentDispatcher", "ThreadCapabilities", "fullyQualifiedId", "RefArray", "useIdentity", "useTranslation", "useAttended", "StackItem", "Tabs", "isNonNullable", "ThreadComplementary", "subject", "dispatchPromise", "dispatch", "useIntentDispatcher", "identity", "useIdentity", "t", "useTranslation", "THREAD_PLUGIN", "state", "getViewState", "useCapability", "LocalThreadCapabilities", "MutableState", "viewState", "fullyQualifiedId", "showResolvedThreads", "onChangeViewState", "useCallback", "nextValue", "drafts", "threadsIntegrators", "useCapabilities", "ThreadCapabilities", "Thread", "createSort", "useMemo", "find", "p", "predicate", "sort", "threadObjects", "RefArray", "targets", "threads", "concat", "filter", "isNonNullable", "JSON", "stringify", "detachedIds", "anchor", "map", "thread", "useEffect", "a", "b", "attended", "useAttended", "qualifiedSubjectId", "handleAttend", "threadId", "current", "createIntent", "LayoutAction", "ScrollIntoView", "part", "options", "cursor", "ref", "handleComment", "text", "ThreadAction", "AddMessage", "sender", "identityDid", "did", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "comments", "React", "CommentsContainer", "detached", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "StackItem", "Content", "toolbar", "Tabs", "Root", "value", "onValueChange", "orientation", "classNames", "Tablist", "Tab", "Tabpanel", "React", "DeprecatedFormContainer", "ThreadSettings", "settings", "React", "DeprecatedFormContainer", "ChatContainer", "lazy", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "THREAD_PLUGIN", "role", "filter", "data", "subject", "ChannelType", "component", "channel", "layout", "useLayout", "currentPosition", "active", "findIndex", "objectToTheLeft", "context", "getSpace", "db", "getObjectById", "undefined", "space", "React", "ChatContainer", "dxn", "queue", "companionTo", "Array", "isArray", "threads", "ThreadComplementary", "DXN", "type", "isSpace", "SettingsStore", "prefix", "ThreadSettings", "settings", "value"]
7
+ }
@@ -26,14 +26,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var ChatContainer_VO5B47V4_exports = {};
30
- __export(ChatContainer_VO5B47V4_exports, {
29
+ var ChatContainer_TUISUIY7_exports = {};
30
+ __export(ChatContainer_TUISUIY7_exports, {
31
31
  ChatContainer: () => ChatContainer,
32
32
  ChatHeading: () => ChatHeading,
33
33
  default: () => ChatContainer_default
34
34
  });
35
- module.exports = __toCommonJS(ChatContainer_VO5B47V4_exports);
36
- var import_chunk_BUYO7P2A = require("./chunk-BUYO7P2A.cjs");
35
+ module.exports = __toCommonJS(ChatContainer_TUISUIY7_exports);
36
+ var import_chunk_ETDNE4Z6 = require("./chunk-ETDNE4Z6.cjs");
37
37
  var import_chunk_NO6WQR36 = require("./chunk-NO6WQR36.cjs");
38
38
  var import_chunk_ONLWOUYZ = require("./chunk-ONLWOUYZ.cjs");
39
39
  var import_react = __toESM(require("react"));
@@ -75,7 +75,7 @@ var ChatContainer = ({ space, dxn, context, current, autoFocusTextbox }) => {
75
75
  const [autoFocus, setAutoFocus] = (0, import_react.useState)(autoFocusTextbox);
76
76
  const threadScrollRef = (0, import_react.useRef)(null);
77
77
  const { themeMode } = (0, import_react_ui.useThemeContext)();
78
- const textboxMetadata = (0, import_chunk_BUYO7P2A.getMessageMetadata)(id, identity);
78
+ const textboxMetadata = (0, import_chunk_ETDNE4Z6.getMessageMetadata)(id, identity);
79
79
  const messageRef = (0, import_react.useRef)("");
80
80
  const extensions = (0, import_react.useMemo)(() => [
81
81
  (0, import_react_ui_editor.createBasicExtensions)({
@@ -87,7 +87,7 @@ var ChatContainer = ({ space, dxn, context, current, autoFocusTextbox }) => {
87
87
  (0, import_react_ui_editor.listener)({
88
88
  onChange: (text) => messageRef.current = text
89
89
  }),
90
- import_chunk_BUYO7P2A.command
90
+ import_chunk_ETDNE4Z6.command
91
91
  ], [
92
92
  themeMode,
93
93
  _count
@@ -137,7 +137,7 @@ var ChatContainer = ({ space, dxn, context, current, autoFocusTextbox }) => {
137
137
  }, /* @__PURE__ */ import_react.default.createElement("div", {
138
138
  role: "none",
139
139
  className: (0, import_react_ui_theme.mx)(import_react_ui_thread.threadLayout, "place-self-end")
140
- }, (queue?.items ?? []).map((message) => /* @__PURE__ */ import_react.default.createElement(import_chunk_BUYO7P2A.MessageContainer, {
140
+ }, (queue?.items ?? []).map((message) => /* @__PURE__ */ import_react.default.createElement(import_chunk_ETDNE4Z6.MessageContainer, {
141
141
  key: message.id,
142
142
  message,
143
143
  members
@@ -160,4 +160,4 @@ var ChatContainer_default = ChatContainer;
160
160
  ChatContainer,
161
161
  ChatHeading
162
162
  });
163
- //# sourceMappingURL=ChatContainer-VO5B47V4.cjs.map
163
+ //# sourceMappingURL=ChatContainer-TUISUIY7.cjs.map
@@ -26,13 +26,13 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_BUYO7P2A_exports = {};
30
- __export(chunk_BUYO7P2A_exports, {
29
+ var chunk_ETDNE4Z6_exports = {};
30
+ __export(chunk_ETDNE4Z6_exports, {
31
31
  MessageContainer: () => MessageContainer,
32
32
  command: () => command,
33
33
  getMessageMetadata: () => getMessageMetadata
34
34
  });
35
- module.exports = __toCommonJS(chunk_BUYO7P2A_exports);
35
+ module.exports = __toCommonJS(chunk_ETDNE4Z6_exports);
36
36
  var import_chunk_NO6WQR36 = require("./chunk-NO6WQR36.cjs");
37
37
  var import_chunk_ONLWOUYZ = require("./chunk-ONLWOUYZ.cjs");
38
38
  var import_language = require("@codemirror/language");
@@ -119,8 +119,9 @@ var MessageContainer = ({ message, members, editable = false, onDelete }) => {
119
119
  timestamp: messageMetadata.timestamp
120
120
  }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.ButtonGroup, {
121
121
  classNames: "mie-1"
122
- }, userIsAuthor && editable && /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
123
- asChild: true
122
+ }, userIsAuthor && editable && /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
123
+ asChild: true,
124
+ content: editLabel
124
125
  }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Button, {
125
126
  variant: "ghost",
126
127
  "data-testid": editing ? "thread.message.save" : "thread.message.edit",
@@ -132,8 +133,9 @@ var MessageContainer = ({ message, members, editable = false, onDelete }) => {
132
133
  className: (0, import_react_ui_theme2.getSize)(4)
133
134
  }) : /* @__PURE__ */ import_react2.default.createElement(import_react.PencilSimple, {
134
135
  className: (0, import_react_ui_theme2.getSize)(4)
135
- }))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, null, editLabel, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null)))), onDelete && /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
136
- asChild: true
136
+ }))), onDelete && /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
137
+ asChild: true,
138
+ content: deleteLabel
137
139
  }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Button, {
138
140
  variant: "ghost",
139
141
  "data-testid": "thread.message.delete",
@@ -143,7 +145,7 @@ var MessageContainer = ({ message, members, editable = false, onDelete }) => {
143
145
  className: "sr-only"
144
146
  }, deleteLabel), /* @__PURE__ */ import_react2.default.createElement(import_react.X, {
145
147
  className: (0, import_react_ui_theme2.getSize)(4)
146
- }))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, null, deleteLabel, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null)))))), textBlock && /* @__PURE__ */ import_react2.default.createElement(TextboxBlock, {
148
+ }))))), textBlock && /* @__PURE__ */ import_react2.default.createElement(TextboxBlock, {
147
149
  block: textBlock,
148
150
  isAuthor: userIsAuthor,
149
151
  editing
@@ -229,4 +231,4 @@ var MessageBlockObjectTile = /* @__PURE__ */ (0, import_react2.forwardRef)(({ su
229
231
  command,
230
232
  getMessageMetadata
231
233
  });
232
- //# sourceMappingURL=chunk-BUYO7P2A.cjs.map
234
+ //# sourceMappingURL=chunk-ETDNE4Z6.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/command-extension.ts", "../../../src/util.ts", "../../../src/components/MessageContainer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.did,\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { Check, PencilSimple, X } from '@phosphor-icons/react';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework';\nimport { RefArray } from '@dxos/live-object';\nimport { PublicKey } from '@dxos/react-client';\nimport { type AnyLiveObject, type Expando, type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type DataType } from '@dxos/schema';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\n// TODO(thure): #8149\nconst messageControlClassNames = ['!p-1 !min-bs-0 transition-opacity', hoverableControlItem];\n\nexport type MessageContainerProps = {\n message: DataType.Message;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n};\n\nexport const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const { t } = useTranslation(THREAD_PLUGIN);\n const editLabel = t(editing ? 'save message label' : 'edit message label');\n const deleteLabel = t('delete message label');\n const textBlock = message.blocks.find((block) => block.type === 'text');\n const references = message.blocks.filter((block) => block.type === 'reference').map((block) => block.reference);\n\n useOnEditAnalytics(message, textBlock, !!editing);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <ButtonGroup classNames='mie-1'>\n {userIsAuthor && editable && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n classNames={messageControlClassNames}\n onClick={() => setEditing((editing) => !editing)}\n >\n <span className='sr-only'>{editLabel}</span>\n {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n {editLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n {onDelete && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button\n variant='ghost'\n data-testid='thread.message.delete'\n classNames={messageControlClassNames}\n onClick={() => handleDelete()}\n >\n <span className='sr-only'>{deleteLabel}</span>\n <X className={getSize(4)} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n {deleteLabel}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n </ButtonGroup>\n </MessageHeading>\n {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}\n {RefArray.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n}: {\n block: DataType.MessageBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(block.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n block.text = inMemoryContentRef.current;\n }, [block]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: AnyLiveObject<any> }>(\n ({ subject }, forwardedRef) => {\n let title = subject.name ?? subject.title ?? subject.type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface role='card' limit={1} data={{ subject }} fallback={title} />\n </div>\n );\n },\n);\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,sBAAmE;AAGnE,6BAAqB;AACrB,4BAAmB;ACJnB,0BAA6B;AAI7B,kBAA8B;ACJ9B,kBAA2B;AAC3B,mBAAuC;AACvC,IAAAA,gBAA4E;AAE5E,2BAAwB;AACxB,yBAAyB;AACzB,0BAA0B;AAE1B,kBAA2C;AAC3C,sBAA+F;AAC/F,IAAAC,0BAA4E;AAC5E,IAAAC,yBAMO;AACP,6BAA4C;AFT5C,IAAMC,SAASC,+BAAeC,OAA0B;EACtDC,YAAY,OAAO;IAAEC,OAAO;EAAE;EAC9BC,OAAO,CAACC,QAAQC,UAAAA;AACdA,UAAMH;AACN,QAAIE,OAAOE,SAAQ,GAAI;AACrB,aAAO;IACT;AACA,QAAID,MAAMH,UAAU,KAAKE,OAAOG,MAAM,UAAA,GAAa;AACjD,aAAO;IACT;AACAH,WAAOI,KAAI;AACX,WAAO;EACT;AACF,CAAA;AAEA,IAAMC,SAASC,+BAAeV,OAAO;EACnC;IAAEW,KAAKC,4BAAKC;IAASC,WAAOC,0BAAG,iDAAA;EAAmD;CACnF;AAEM,IAAMC,UAAqB;EAAClB;MAAQmB,oCAAmBR,MAAAA;;ACpBvD,IAAMS,qBAAqB,CAACC,IAAYC,aAAAA;AAC7C,QAAMC,eAAWC,2BAAcF,UAAUG,YAAYC,MAAAA,KAAW,GAAA;AAChE,SAAO;IACLL;IACAM,UAAUL,UAAUM;IACpBC,YACEP,UAAUQ,SAASC,gBAClBT,UAAUG,kBAAcO,kCAAaV,SAASG,YAAYC,MAAK,CAAA,IAAMO;IACxEC,mBAAmB;MACjBC,KAAKb,UAAUQ,SAASM,MAAMD,OAAOZ,SAASY;MAC9CE,OAAOf,UAAUQ,SAASM,MAAMC,SAASd,SAASc;IACpD;EACF;AACF;ACMA,IAAMC,2BAA2B;EAAC;EAAqCC;;AAShE,IAAMC,mBAAmB,CAAC,EAAEC,SAASC,SAASC,WAAW,OAAOC,SAAQ,MAAyB;AACtG,QAAMC,iBAAiBH,QAAQI,KAC7B,CAACC,WACEN,QAAQO,OAAOC,eAAeF,OAAOzB,SAASM,QAAQa,QAAQO,OAAOC,eACrER,QAAQO,OAAOvB,eAAeyB,8BAAUC,OAAOJ,OAAOzB,SAASG,aAAagB,QAAQO,OAAOvB,WAAW,CAAA,GACxGH;AACH,QAAM8B,kBAAkBhC,mBAAmBqB,QAAQpB,IAAIwB,cAAAA;AACvD,QAAMQ,mBAAeC,yBAAAA,GAAe1B,QAAQwB,gBAAgBzB;AAC5D,QAAM,CAAC4B,SAASC,UAAAA,QAAcC,wBAAS,KAAA;AACvC,QAAMC,mBAAeC,2BAAY,MAAMf,WAAWH,QAAQpB,EAAE,GAAG;IAACoB;IAASG;GAAS;AAClF,QAAM,EAAEgB,EAAC,QAAKC,gCAAeC,mCAAAA;AAC7B,QAAMC,YAAYH,EAAEL,UAAU,uBAAuB,oBAAA;AACrD,QAAMS,cAAcJ,EAAE,sBAAA;AACtB,QAAMK,YAAYxB,QAAQyB,OAAOpB,KAAK,CAACqB,UAAUA,MAAMC,SAAS,MAAA;AAChE,QAAMC,aAAa5B,QAAQyB,OAAOI,OAAO,CAACH,UAAUA,MAAMC,SAAS,WAAA,EAAaG,IAAI,CAACJ,UAAUA,MAAMK,SAAS;AAE9GC,gDAAmBhC,SAASwB,WAAW,CAAC,CAACV,OAAAA;AAEzC,SACE,8BAAAmB,QAAA,cAACC,oCAAAA;IAAa,GAAGvB;IAAiBwB,YAAY;MAACC;MAAmBC;;KAChE,8BAAAJ,QAAA,cAACK,uCAAAA;IAAelD,YAAYuB,gBAAgBvB;IAAYmD,WAAW5B,gBAAgB4B;KACjF,8BAAAN,QAAA,cAACO,6BAAAA;IAAYL,YAAW;KACrBvB,gBAAgBV,YACf,8BAAA+B,QAAA,cAACQ,wBAAQC,MAAI,MACX,8BAAAT,QAAA,cAACQ,wBAAQE,SAAO;IAACC,SAAAA;KACf,8BAAAX,QAAA,cAACY,wBAAAA;IACCC,SAAQ;IACRC,eAAajC,UAAU,wBAAwB;IAC/CqB,YAAYtC;IACZmD,SAAS,MAAMjC,WAAW,CAACD,aAAY,CAACA,QAAAA;KAExC,8BAAAmB,QAAA,cAACgB,QAAAA;IAAKC,WAAU;KAAW5B,SAAAA,GAC1BR,UAAU,8BAAAmB,QAAA,cAACkB,oBAAAA;IAAMD,eAAWE,gCAAQ,CAAA;OAAS,8BAAAnB,QAAA,cAACoB,2BAAAA;IAAaH,eAAWE,gCAAQ,CAAA;QAGnF,8BAAAnB,QAAA,cAACQ,wBAAQa,QAAM,MACb,8BAAArB,QAAA,cAACQ,wBAAQc,SAAO,MACbjC,WACD,8BAAAW,QAAA,cAACQ,wBAAQe,OAAK,IAAA,CAAA,CAAA,CAAA,GAKrBrD,YACC,8BAAA8B,QAAA,cAACQ,wBAAQC,MAAI,MACX,8BAAAT,QAAA,cAACQ,wBAAQE,SAAO;IAACC,SAAAA;KACf,8BAAAX,QAAA,cAACY,wBAAAA;IACCC,SAAQ;IACRC,eAAY;IACZZ,YAAYtC;IACZmD,SAAS,MAAM/B,aAAAA;KAEf,8BAAAgB,QAAA,cAACgB,QAAAA;IAAKC,WAAU;KAAW3B,WAAAA,GAC3B,8BAAAU,QAAA,cAACwB,gBAAAA;IAAEP,eAAWE,gCAAQ,CAAA;QAG1B,8BAAAnB,QAAA,cAACQ,wBAAQa,QAAM,MACb,8BAAArB,QAAA,cAACQ,wBAAQc,SAAO,MACbhC,aACD,8BAAAU,QAAA,cAACQ,wBAAQe,OAAK,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAOzBhC,aAAa,8BAAAS,QAAA,cAACyB,cAAAA;IAAahC,OAAOF;IAAWmC,UAAU/C;IAAcE;MACrE8C,4BAASC,QAAQjC,UAAAA,EAAYE,IAAI,CAACC,WAAW+B,UAC5C,8BAAA7B,QAAA,cAAC8B,aAAAA;IAAYC,KAAKF;IAAOG,MAAMlC;;AAIvC;AAEA,IAAMgC,cAAc,CAAC,EAAEE,KAAI,MAAqB;AAC9C,SAAO,8BAAAhC,QAAA,cAACiC,wBAAAA;IAAuBC,SAASF;;AAC1C;AAEA,IAAMP,eAAe,CAAC,EACpBhC,OACAiC,UACA7C,QAAO,MAMR;AACC,QAAM,EAAEsD,UAAS,QAAKC,iCAAAA;AACtB,QAAMC,yBAAqBC,sBAAO7C,MAAM8C,IAAI;AAE5C,QAAMC,2BAAuBvD,2BAAY,CAACwD,aAAAA;AACxCJ,uBAAmBK,UAAUD;EAC/B,GAAG,CAAA,CAAE;AAEL,QAAME,yBAAqB1D,2BAAY,MAAA;AACrCQ,UAAM8C,OAAOF,mBAAmBK;EAClC,GAAG;IAACjD;GAAM;AAEVmD,uCAAgB/D,SAAS,MAAM,OAAO8D,kBAAAA;AAEtC,QAAM,EAAEE,WAAWC,iBAAiBC,KAAI,QAAKC,uCAC3C,OAAO;IACLC,cAAcxD,MAAM8C;IACpBW,YAAY;UACVC,+CAAsB;QAAEC,UAAU,CAAC1B,YAAY,CAAC7C;MAAQ,CAAA;UACxDwE,+CAAsB;QAAElB;MAAU,CAAA;MAClC3F;MACA8G,uBAAWC,eAAeC,GAAG,CAACC,WAAAA;AAC5B,YAAIA,OAAOC,YAAY;AACrBlB,+BAAqBiB,OAAO5H,MAAM8H,IAAIC,SAAQ,CAAA;QAChD;MACF,CAAA;;EAEJ,IACA;IAACnE,MAAM8C;IAAM1D;IAAS6C;IAAUS;IAAWK;GAAqB;AAGlEqB,+BAAU,MAAA;AACRhF,eAAWkE,MAAMe,MAAAA;EACnB,GAAG;IAACjF;IAASkE;GAAK;AAElB,SAAO,8BAAA/C,QAAA,cAAC+D,OAAAA;IAAIC,MAAK;IAAOC,KAAKpB;IAAW5B,WAAU;IAAS,GAAG6B;;AAChE;AAEA,IAAMb,yBAAyBiC,8CAC7B,CAAC,EAAEhC,QAAO,GAAIiC,iBAAAA;AACZ,MAAIC,QAAQlC,QAAQmC,QAAQnC,QAAQkC,SAASlC,QAAQxC,QAAQ;AAC7D,MAAI,OAAO0E,UAAU,UAAU;AAC7BA,YAAQA,OAAOE,WAAW;EAC5B;AAEA,SACE,8BAAAtE,QAAA,cAAC+D,OAAAA;IACCC,MAAK;IACL/C,eAAW1E,uBAAAA,IAAG,6BAA6B4D,0CAAmBC,qDAAAA;IAC9D6D,KAAKE;KAEL,8BAAAnE,QAAA,cAACuE,8BAAAA;IAAQP,MAAK;IAAOQ,OAAO;IAAG9G,MAAM;MAAEwE;IAAQ;IAAGrF,UAAUuH;;AAGlE,CAAA;",
6
- "names": ["import_react", "import_react_ui_editor", "import_react_ui_theme", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "getMessageMetadata", "id", "identity", "fallback", "hexToFallback", "identityKey", "toHex", "authorId", "did", "authorName", "profile", "displayName", "generateName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "messageControlClassNames", "hoverableControlItem", "MessageContainer", "message", "members", "editable", "onDelete", "senderIdentity", "find", "member", "sender", "identityDid", "PublicKey", "equals", "messageMetadata", "userIsAuthor", "useIdentity", "editing", "setEditing", "useState", "handleDelete", "useCallback", "t", "useTranslation", "THREAD_PLUGIN", "editLabel", "deleteLabel", "textBlock", "blocks", "block", "type", "references", "filter", "map", "reference", "useOnEditAnalytics", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "timestamp", "ButtonGroup", "Tooltip", "Root", "Trigger", "asChild", "Button", "variant", "data-testid", "onClick", "span", "className", "Check", "getSize", "PencilSimple", "Portal", "Content", "Arrow", "X", "TextboxBlock", "isAuthor", "RefArray", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "text", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readOnly", "createThemeExtensions", "EditorView", "updateListener", "of", "update", "docChanged", "doc", "toString", "useEffect", "focus", "div", "role", "ref", "forwardRef", "forwardedRef", "title", "name", "content", "Surface", "limit"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { generateName } from '@dxos/display-name';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.did,\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { Check, PencilSimple, X } from '@phosphor-icons/react';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework';\nimport { RefArray } from '@dxos/live-object';\nimport { PublicKey } from '@dxos/react-client';\nimport { type AnyLiveObject, type Expando, type SpaceMember } from '@dxos/react-client/echo';\nimport { useIdentity, type Identity } from '@dxos/react-client/halo';\nimport { Button, ButtonGroup, Tooltip, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport {\n getSize,\n hoverableControlItem,\n hoverableControls,\n hoverableFocusedWithinControls,\n mx,\n} from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type DataType } from '@dxos/schema';\n\nimport { command } from './command-extension';\nimport { useOnEditAnalytics } from '../hooks';\nimport { THREAD_PLUGIN } from '../meta';\nimport { getMessageMetadata } from '../util';\n\n// TODO(thure): #8149\nconst messageControlClassNames = ['!p-1 !min-bs-0 transition-opacity', hoverableControlItem];\n\nexport type MessageContainerProps = {\n message: DataType.Message;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n};\n\nexport const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = useIdentity()?.did === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const { t } = useTranslation(THREAD_PLUGIN);\n const editLabel = t(editing ? 'save message label' : 'edit message label');\n const deleteLabel = t('delete message label');\n const textBlock = message.blocks.find((block) => block.type === 'text');\n const references = message.blocks.filter((block) => block.type === 'reference').map((block) => block.reference);\n\n useOnEditAnalytics(message, textBlock, !!editing);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <ButtonGroup classNames='mie-1'>\n {userIsAuthor && editable && (\n <Tooltip.Trigger asChild content={editLabel}>\n <Button\n variant='ghost'\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n classNames={messageControlClassNames}\n onClick={() => setEditing((editing) => !editing)}\n >\n <span className='sr-only'>{editLabel}</span>\n {editing ? <Check className={getSize(4)} /> : <PencilSimple className={getSize(4)} />}\n </Button>\n </Tooltip.Trigger>\n )}\n {onDelete && (\n <Tooltip.Trigger asChild content={deleteLabel}>\n <Button\n variant='ghost'\n data-testid='thread.message.delete'\n classNames={messageControlClassNames}\n onClick={() => handleDelete()}\n >\n <span className='sr-only'>{deleteLabel}</span>\n <X className={getSize(4)} />\n </Button>\n </Tooltip.Trigger>\n )}\n </ButtonGroup>\n </MessageHeading>\n {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}\n {RefArray.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Expando }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n}: {\n block: DataType.MessageBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(block.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n block.text = inMemoryContentRef.current;\n }, [block]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: AnyLiveObject<any> }>(\n ({ subject }, forwardedRef) => {\n let title = subject.name ?? subject.title ?? subject.type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface role='card' limit={1} data={{ subject }} fallback={title} />\n </div>\n );\n },\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "import_react_ui_editor", "import_react_ui_theme", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "getMessageMetadata", "id", "identity", "fallback", "hexToFallback", "identityKey", "toHex", "authorId", "did", "authorName", "profile", "displayName", "generateName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "messageControlClassNames", "hoverableControlItem", "MessageContainer", "message", "members", "editable", "onDelete", "senderIdentity", "find", "member", "sender", "identityDid", "PublicKey", "equals", "messageMetadata", "userIsAuthor", "useIdentity", "editing", "setEditing", "useState", "handleDelete", "useCallback", "t", "useTranslation", "THREAD_PLUGIN", "editLabel", "deleteLabel", "textBlock", "blocks", "block", "type", "references", "filter", "map", "reference", "useOnEditAnalytics", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "timestamp", "ButtonGroup", "Tooltip", "Trigger", "asChild", "content", "Button", "variant", "data-testid", "onClick", "span", "className", "Check", "getSize", "PencilSimple", "X", "TextboxBlock", "isAuthor", "RefArray", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "text", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readOnly", "createThemeExtensions", "EditorView", "updateListener", "of", "update", "docChanged", "doc", "toString", "useEffect", "focus", "div", "role", "ref", "forwardRef", "forwardedRef", "title", "name", "Surface", "limit"]
7
7
  }
@@ -26,20 +26,20 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_KYLJU47G_exports = {};
30
- __export(chunk_KYLJU47G_exports, {
29
+ var chunk_ZFPSGBXT_exports = {};
30
+ __export(chunk_ZFPSGBXT_exports, {
31
31
  AppGraphBuilder: () => AppGraphBuilder,
32
32
  IntentResolver: () => IntentResolver,
33
33
  Markdown: () => Markdown,
34
34
  ReactSurface: () => ReactSurface,
35
35
  ThreadState: () => ThreadState
36
36
  });
37
- module.exports = __toCommonJS(chunk_KYLJU47G_exports);
37
+ module.exports = __toCommonJS(chunk_ZFPSGBXT_exports);
38
38
  var import_app_framework = require("@dxos/app-framework");
39
39
  var AppGraphBuilder = (0, import_app_framework.lazy)(() => import("./app-graph-builder-G45JDZWQ.cjs"));
40
40
  var IntentResolver = (0, import_app_framework.lazy)(() => import("./intent-resolver-ECFDZLCG.cjs"));
41
41
  var Markdown = (0, import_app_framework.lazy)(() => import("./markdown-G5NDD5EJ.cjs"));
42
- var ReactSurface = (0, import_app_framework.lazy)(() => import("./react-surface-G7GXAK5G.cjs"));
42
+ var ReactSurface = (0, import_app_framework.lazy)(() => import("./react-surface-PLJ3Z77A.cjs"));
43
43
  var ThreadSettings = (0, import_app_framework.lazy)(() => import("./settings-PV6MGI52.cjs"));
44
44
  var ThreadState = (0, import_app_framework.lazy)(() => import("./state-FOHMAVSU.cjs"));
45
45
  // Annotate the CommonJS export names for ESM import in node:
@@ -50,4 +50,4 @@ var ThreadState = (0, import_app_framework.lazy)(() => import("./state-FOHMAVSU.
50
50
  ReactSurface,
51
51
  ThreadState
52
52
  });
53
- //# sourceMappingURL=chunk-KYLJU47G.cjs.map
53
+ //# sourceMappingURL=chunk-ZFPSGBXT.cjs.map
@@ -28,7 +28,7 @@ __export(node_exports, {
28
28
  useStatus: () => import_chunk_NO6WQR36.useStatus
29
29
  });
30
30
  module.exports = __toCommonJS(node_exports);
31
- var import_chunk_KYLJU47G = require("./chunk-KYLJU47G.cjs");
31
+ var import_chunk_ZFPSGBXT = require("./chunk-ZFPSGBXT.cjs");
32
32
  var import_chunk_NQ5DTPOY = require("./chunk-NQ5DTPOY.cjs");
33
33
  var import_chunk_NO6WQR36 = require("./chunk-NO6WQR36.cjs");
34
34
  var import_chunk_HG7J3YR3 = require("./chunk-HG7J3YR3.cjs");
@@ -68,8 +68,8 @@ var translations_default = [
68
68
  "comments heading": "Comments",
69
69
  "chat heading": "Chat",
70
70
  "draft button": "DRAFT",
71
- "no comments title": "No comments (yet)",
72
- "no comments message": "To start a comment thread, select a range of text in a document and click the <commentIcon></commentIcon> Create comment button in the toolbar.",
71
+ "no comments title": "Comments",
72
+ "no comments message": "Click on the <commentIcon></commentIcon> button in the document toolbar to create a comment thread on the selected text.",
73
73
  "toggle show resolved": "Show resolved",
74
74
  "unnamed object threads label": "Threads",
75
75
  "mark as resolved label": "Mark as resolved",
@@ -98,7 +98,7 @@ var ThreadPlugin = () => (0, import_app_framework2.definePlugin)(import_chunk_ON
98
98
  // Should this be a different event?
99
99
  // Should settings store be renamed to be more generic?
100
100
  activatesOn: import_app_framework2.Events.SetupSettings,
101
- activate: import_chunk_KYLJU47G.ThreadState
101
+ activate: import_chunk_ZFPSGBXT.ThreadState
102
102
  }),
103
103
  (0, import_app_framework2.defineModule)({
104
104
  id: `${import_chunk_ONLWOUYZ.meta.id}/module/translations`,
@@ -185,7 +185,7 @@ var ThreadPlugin = () => (0, import_app_framework2.definePlugin)(import_chunk_ON
185
185
  (0, import_app_framework2.defineModule)({
186
186
  id: `${import_chunk_ONLWOUYZ.meta.id}/module/markdown`,
187
187
  activatesOn: import_plugin_markdown.MarkdownEvents.SetupExtensions,
188
- activate: import_chunk_KYLJU47G.Markdown
188
+ activate: import_chunk_ZFPSGBXT.Markdown
189
189
  }),
190
190
  (0, import_app_framework2.defineModule)({
191
191
  id: `${import_chunk_ONLWOUYZ.meta.id}/module/react-surface`,
@@ -195,17 +195,17 @@ var ThreadPlugin = () => (0, import_app_framework2.definePlugin)(import_chunk_ON
195
195
  import_plugin_space.ThreadEvents.SetupThread,
196
196
  ThreadEvents.SetupActivity
197
197
  ],
198
- activate: import_chunk_KYLJU47G.ReactSurface
198
+ activate: import_chunk_ZFPSGBXT.ReactSurface
199
199
  }),
200
200
  (0, import_app_framework2.defineModule)({
201
201
  id: `${import_chunk_ONLWOUYZ.meta.id}/module/intent-resolver`,
202
202
  activatesOn: import_app_framework2.Events.SetupIntentResolver,
203
- activate: import_chunk_KYLJU47G.IntentResolver
203
+ activate: import_chunk_ZFPSGBXT.IntentResolver
204
204
  }),
205
205
  (0, import_app_framework2.defineModule)({
206
206
  id: `${import_chunk_ONLWOUYZ.meta.id}/module/app-graph-builder`,
207
207
  activatesOn: import_app_framework2.Events.SetupAppGraph,
208
- activate: import_chunk_KYLJU47G.AppGraphBuilder
208
+ activate: import_chunk_ZFPSGBXT.AppGraphBuilder
209
209
  })
210
210
  ]);
211
211
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/events.ts", "../../../src/ThreadPlugin.tsx", "../../../src/translations.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Events } from '@dxos/app-framework';\n\nimport { THREAD_PLUGIN } from './meta';\n\nexport namespace ThreadEvents {\n export const SetupActivity = Events.createStateEvent(`${THREAD_PLUGIN}/setup-activity`);\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';\nimport { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';\nimport { MarkdownEvents } from '@dxos/plugin-markdown';\nimport { SpaceCapabilities, ThreadEvents } from '@dxos/plugin-space';\nimport { ChannelType, defineObjectForm, ThreadType } from '@dxos/plugin-space/types';\nimport { type AnyLiveObject, RefArray } from '@dxos/react-client/echo';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread';\nimport { DataType } from '@dxos/schema';\n\nimport { AppGraphBuilder, IntentResolver, Markdown, ReactSurface, ThreadState } from './capabilities';\nimport { ThreadEvents as LocalThreadEvents } from './events';\nimport { meta, THREAD_ITEM } from './meta';\nimport translations from './translations';\nimport { ThreadAction } from './types';\n\n// TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.\n// NOTE(burdon): Review/discuss CursorConverter semantics.\nexport const ThreadPlugin = () =>\n definePlugin(meta, [\n // TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.\n // defineModule({\n // id: `${meta.id}/module/settings`,\n // activatesOn: Events.SetupSettings,\n // activate: ThreadSettings,\n // }),\n defineModule({\n id: `${meta.id}/module/state`,\n // TODO(wittjosiah): Does not integrate with settings store.\n // Should this be a different event?\n // Should settings store be renamed to be more generic?\n activatesOn: Events.SetupSettings,\n activate: ThreadState,\n }),\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, [...translations, ...threadTranslations]),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () => [\n contributes(Capabilities.Metadata, {\n id: ChannelType.typename,\n metadata: {\n icon: 'ph--hash--regular',\n },\n }),\n contributes(Capabilities.Metadata, {\n id: ThreadType.typename,\n metadata: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: async (thread: ThreadType) => await RefArray.loadAll(thread.messages ?? []),\n },\n }),\n contributes(Capabilities.Metadata, {\n id: DataType.Message.typename,\n metadata: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (message: DataType.Message) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),\n },\n }),\n contributes(Capabilities.Metadata, {\n id: THREAD_ITEM,\n metadata: {\n parse: (item: AnyLiveObject<any>, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.title, data: item };\n case 'object':\n return item;\n case 'view-object':\n return { id: `${item.id}-view`, object: item };\n }\n },\n },\n }),\n ],\n }),\n defineModule({\n id: `${meta.id}/module/object-form`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () =>\n contributes(\n SpaceCapabilities.ObjectForm,\n defineObjectForm({\n objectSchema: ChannelType,\n getIntent: (_, options) => createIntent(ThreadAction.CreateChannel, { spaceId: options.space.id }),\n }),\n ),\n }),\n defineModule({\n id: `${meta.id}/module/schema`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () => contributes(ClientCapabilities.Schema, [ThreadType, DataType.Message, DataType.MessageV1]),\n }),\n defineModule({\n id: `${meta.id}/module/migration`,\n activatesOn: ClientEvents.SetupMigration,\n activate: () => contributes(ClientCapabilities.Migration, [DataType.MessageV1ToV2]),\n }),\n defineModule({\n id: `${meta.id}/module/markdown`,\n activatesOn: MarkdownEvents.SetupExtensions,\n activate: Markdown,\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n // TODO(wittjosiah): Should occur before the comments thread is loaded when surfaces activation is more granular.\n activatesBefore: [ThreadEvents.SetupThread, LocalThreadEvents.SetupActivity],\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n defineModule({\n id: `${meta.id}/module/app-graph-builder`,\n activatesOn: Events.SetupAppGraph,\n activate: AppGraphBuilder,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ChannelType } from '@dxos/plugin-space/types';\n\nimport { THREAD_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [ChannelType.typename]: {\n 'typename label': 'Channel',\n 'object name placeholder': 'New channel',\n },\n [THREAD_PLUGIN]: {\n 'plugin name': 'Threads',\n 'channel title label': 'Title',\n 'message placeholder': 'Reply…',\n 'activity message': 'Processing…',\n 'anonymous label': 'Anonymous',\n 'delete message block label': 'Delete message block',\n 'detached thread label': 'Referenced content was removed',\n 'delete thread label': 'Delete thread',\n 'thread deleted label': 'You deleted a thread.',\n 'message deleted label': 'You deleted a message.',\n 'comments heading': 'Comments',\n 'chat heading': 'Chat',\n 'draft button': 'DRAFT',\n 'no comments title': 'No comments (yet)',\n 'no comments message':\n 'To start a comment thread, select a range of text in a document and click the <commentIcon></commentIcon> Create comment button in the toolbar.',\n 'toggle show resolved': 'Show resolved',\n 'unnamed object threads label': 'Threads',\n 'mark as resolved label': 'Mark as resolved',\n 'mark as unresolved label': 'Mark as unresolved',\n 'save message label': 'Save',\n 'edit message label': 'Edit',\n 'delete message label': 'Delete message',\n 'open comments panel label': 'Show Comments',\n 'comments label': 'Comments',\n 'show all label': 'All comments',\n 'show unresolved label': 'Unresolved only',\n },\n },\n },\n];\n"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Events } from '@dxos/app-framework';\n\nimport { THREAD_PLUGIN } from './meta';\n\nexport namespace ThreadEvents {\n export const SetupActivity = Events.createStateEvent(`${THREAD_PLUGIN}/setup-activity`);\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';\nimport { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';\nimport { MarkdownEvents } from '@dxos/plugin-markdown';\nimport { SpaceCapabilities, ThreadEvents } from '@dxos/plugin-space';\nimport { ChannelType, defineObjectForm, ThreadType } from '@dxos/plugin-space/types';\nimport { type AnyLiveObject, RefArray } from '@dxos/react-client/echo';\nimport { translations as threadTranslations } from '@dxos/react-ui-thread';\nimport { DataType } from '@dxos/schema';\n\nimport { AppGraphBuilder, IntentResolver, Markdown, ReactSurface, ThreadState } from './capabilities';\nimport { ThreadEvents as LocalThreadEvents } from './events';\nimport { meta, THREAD_ITEM } from './meta';\nimport translations from './translations';\nimport { ThreadAction } from './types';\n\n// TODO(Zan): Every instance of `cursor` should be replaced with `anchor`.\n// NOTE(burdon): Review/discuss CursorConverter semantics.\nexport const ThreadPlugin = () =>\n definePlugin(meta, [\n // TODO(wittjosiah): Currently not used but leaving because there will likely be settings for threads again.\n // defineModule({\n // id: `${meta.id}/module/settings`,\n // activatesOn: Events.SetupSettings,\n // activate: ThreadSettings,\n // }),\n defineModule({\n id: `${meta.id}/module/state`,\n // TODO(wittjosiah): Does not integrate with settings store.\n // Should this be a different event?\n // Should settings store be renamed to be more generic?\n activatesOn: Events.SetupSettings,\n activate: ThreadState,\n }),\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, [...translations, ...threadTranslations]),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () => [\n contributes(Capabilities.Metadata, {\n id: ChannelType.typename,\n metadata: {\n icon: 'ph--hash--regular',\n },\n }),\n contributes(Capabilities.Metadata, {\n id: ThreadType.typename,\n metadata: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: async (thread: ThreadType) => await RefArray.loadAll(thread.messages ?? []),\n },\n }),\n contributes(Capabilities.Metadata, {\n id: DataType.Message.typename,\n metadata: {\n // TODO(wittjosiah): Move out of metadata.\n loadReferences: (message: DataType.Message) => [], // loadObjectReferences(message, (message) => [...message.parts, message.context]),\n },\n }),\n contributes(Capabilities.Metadata, {\n id: THREAD_ITEM,\n metadata: {\n parse: (item: AnyLiveObject<any>, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.title, data: item };\n case 'object':\n return item;\n case 'view-object':\n return { id: `${item.id}-view`, object: item };\n }\n },\n },\n }),\n ],\n }),\n defineModule({\n id: `${meta.id}/module/object-form`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () =>\n contributes(\n SpaceCapabilities.ObjectForm,\n defineObjectForm({\n objectSchema: ChannelType,\n getIntent: (_, options) => createIntent(ThreadAction.CreateChannel, { spaceId: options.space.id }),\n }),\n ),\n }),\n defineModule({\n id: `${meta.id}/module/schema`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () => contributes(ClientCapabilities.Schema, [ThreadType, DataType.Message, DataType.MessageV1]),\n }),\n defineModule({\n id: `${meta.id}/module/migration`,\n activatesOn: ClientEvents.SetupMigration,\n activate: () => contributes(ClientCapabilities.Migration, [DataType.MessageV1ToV2]),\n }),\n defineModule({\n id: `${meta.id}/module/markdown`,\n activatesOn: MarkdownEvents.SetupExtensions,\n activate: Markdown,\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n // TODO(wittjosiah): Should occur before the comments thread is loaded when surfaces activation is more granular.\n activatesBefore: [ThreadEvents.SetupThread, LocalThreadEvents.SetupActivity],\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n defineModule({\n id: `${meta.id}/module/app-graph-builder`,\n activatesOn: Events.SetupAppGraph,\n activate: AppGraphBuilder,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ChannelType } from '@dxos/plugin-space/types';\n\nimport { THREAD_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [ChannelType.typename]: {\n 'typename label': 'Channel',\n 'object name placeholder': 'New channel',\n },\n [THREAD_PLUGIN]: {\n 'plugin name': 'Threads',\n 'channel title label': 'Title',\n 'message placeholder': 'Reply…',\n 'activity message': 'Processing…',\n 'anonymous label': 'Anonymous',\n 'delete message block label': 'Delete message block',\n 'detached thread label': 'Referenced content was removed',\n 'delete thread label': 'Delete thread',\n 'thread deleted label': 'You deleted a thread.',\n 'message deleted label': 'You deleted a message.',\n 'comments heading': 'Comments',\n 'chat heading': 'Chat',\n 'draft button': 'DRAFT',\n 'no comments title': 'Comments',\n 'no comments message':\n 'Click on the <commentIcon></commentIcon> button in the document toolbar to create a comment thread on the selected text.',\n 'toggle show resolved': 'Show resolved',\n 'unnamed object threads label': 'Threads',\n 'mark as resolved label': 'Mark as resolved',\n 'mark as unresolved label': 'Mark as unresolved',\n 'save message label': 'Save',\n 'edit message label': 'Edit',\n 'delete message label': 'Delete message',\n 'open comments panel label': 'Show Comments',\n 'comments label': 'Comments',\n 'show all label': 'All comments',\n 'show unresolved label': 'Unresolved only',\n },\n },\n },\n];\n"],
5
5
  "mappings": "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",
6
6
  "names": ["import_app_framework", "import_types", "ThreadEvents", "SetupActivity", "Events", "createStateEvent", "THREAD_PLUGIN", "ChannelType", "typename", "ThreadPlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "SetupSettings", "activate", "ThreadState", "SetupTranslations", "contributes", "Capabilities", "Translations", "translations", "threadTranslations", "SetupMetadata", "Metadata", "metadata", "icon", "ThreadType", "loadReferences", "thread", "RefArray", "loadAll", "messages", "DataType", "Message", "message", "THREAD_ITEM", "parse", "item", "type", "label", "title", "data", "object", "ClientEvents", "SetupSchema", "SpaceCapabilities", "ObjectForm", "defineObjectForm", "objectSchema", "getIntent", "_", "options", "createIntent", "ThreadAction", "CreateChannel", "spaceId", "space", "ClientCapabilities", "Schema", "MessageV1", "SetupMigration", "Migration", "MessageV1ToV2", "MarkdownEvents", "SetupExtensions", "Markdown", "SetupReactSurface", "activatesBefore", "SetupThread", "LocalThreadEvents", "ReactSurface", "SetupIntentResolver", "IntentResolver", "SetupAppGraph", "AppGraphBuilder"]
7
7
  }