@chat-lab/ui 0.1.0-beta.14 → 0.1.0-beta.15
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.
- package/dist/components/Chatkit/index.cjs.map +1 -1
- package/dist/components/Chatkit/index.d.ts +1 -0
- package/dist/components/Chatkit/index.d.ts.map +1 -1
- package/dist/components/Chatkit/index.js.map +1 -1
- package/dist/components/assistant-ui/markdown-text.cjs +20 -1
- package/dist/components/assistant-ui/markdown-text.cjs.map +1 -1
- package/dist/components/assistant-ui/markdown-text.d.ts.map +1 -1
- package/dist/components/assistant-ui/markdown-text.js +20 -1
- package/dist/components/assistant-ui/markdown-text.js.map +1 -1
- package/dist/components/assistant-ui/shiki-highlighter.cjs +1 -1
- package/dist/components/assistant-ui/shiki-highlighter.cjs.map +1 -1
- package/dist/components/assistant-ui/shiki-highlighter.js +1 -1
- package/dist/components/assistant-ui/shiki-highlighter.js.map +1 -1
- package/dist/components/assistant-ui/thread.cjs +1 -1
- package/dist/components/assistant-ui/thread.cjs.map +1 -1
- package/dist/components/assistant-ui/thread.js +1 -1
- package/dist/components/assistant-ui/thread.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/utils/imageLoadingPlugin.cjs +73 -0
- package/dist/utils/imageLoadingPlugin.cjs.map +1 -0
- package/dist/utils/imageLoadingPlugin.d.ts +5 -0
- package/dist/utils/imageLoadingPlugin.d.ts.map +1 -0
- package/dist/utils/imageLoadingPlugin.js +71 -0
- package/dist/utils/imageLoadingPlugin.js.map +1 -0
- package/dist/utils/markdownCursorPlugin.cjs +65 -0
- package/dist/utils/markdownCursorPlugin.cjs.map +1 -0
- package/dist/utils/markdownCursorPlugin.d.ts +4 -0
- package/dist/utils/markdownCursorPlugin.d.ts.map +1 -0
- package/dist/utils/markdownCursorPlugin.js +63 -0
- package/dist/utils/markdownCursorPlugin.js.map +1 -0
- package/package.json +8 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["// import \"./style.less\";\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider, useChatkitRef } from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport DemoToolUI from \"../assistant-ui-tools/web-search\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*, video/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","ref","threadList","useThreadManagerStore","useImperativeHandleChatkitRef","_jsx","ChatkitProvider","_jsxs","ThreadList","Thread","useMemo","useRef","useExternalStoreRuntime","convertToBase64","toast","uuid","AssistantRuntimeProvider","Toaster","ExecutionCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider, useChatkitRef } from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nimport \"./style.less\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*, video/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","ref","threadList","useThreadManagerStore","useImperativeHandleChatkitRef","_jsx","ChatkitProvider","_jsxs","ThreadList","Thread","useMemo","useRef","useExternalStoreRuntime","convertToBase64","toast","uuid","AssistantRuntimeProvider","Toaster","ExecutionCard"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/index.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/index.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAsBnD,OAAO,cAAc,CAAC;;AA8NtB,wBAAmC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["// import \"./style.less\";\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider, useChatkitRef } from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport DemoToolUI from \"../assistant-ui-tools/web-search\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*, video/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["_jsx","_jsxs","uuid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider, useChatkitRef } from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nimport \"./style.less\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*, video/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["_jsx","_jsxs","uuid"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ var schema$1 = require('../../node_modules/.pnpm/hast-util-sanitize@5.0.2/node_m
|
|
|
13
13
|
var index = require('../../node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.cjs');
|
|
14
14
|
var index$1 = require('../../node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.cjs');
|
|
15
15
|
var index$2 = require('../../node_modules/.pnpm/rehype-sanitize@6.0.0/node_modules/rehype-sanitize/lib/index.cjs');
|
|
16
|
+
var loaderCircle = require('../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/loader-circle.cjs');
|
|
16
17
|
var copy = require('../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/copy.cjs');
|
|
17
18
|
var check = require('../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/check.cjs');
|
|
18
19
|
|
|
@@ -36,22 +37,34 @@ const schema = {
|
|
|
36
37
|
"autoPlay",
|
|
37
38
|
"playsInline",
|
|
38
39
|
],
|
|
40
|
+
div: [
|
|
41
|
+
...(schema$1.defaultSchema.attributes?.div || []),
|
|
42
|
+
"className", //
|
|
43
|
+
"data-content", // 如果你在插件里用了 data-content
|
|
44
|
+
],
|
|
39
45
|
// 允许 source 标签使用的属性
|
|
40
46
|
source: ["src", "type"],
|
|
41
47
|
},
|
|
42
48
|
};
|
|
49
|
+
// const remarkPlugins: PluggableList = [remarkGfm, remarkLoadingImage];
|
|
50
|
+
// const rehypePlugins: PluggableList = [
|
|
51
|
+
// rehypeRaw,
|
|
52
|
+
// [rehypeSanitize, schema],
|
|
53
|
+
// // rehypeAppendCursor,
|
|
54
|
+
// ];
|
|
43
55
|
const MarkdownTextImpl = () => {
|
|
44
56
|
return (jsxRuntime.jsx(MarkdownText$1.MarkdownTextPrimitive, { remarkPlugins: [index], rehypePlugins: [index$1, [index$2, schema]], className: "aui-md", components: defaultComponents }));
|
|
45
57
|
};
|
|
46
58
|
const MarkdownText = React.memo(MarkdownTextImpl);
|
|
47
59
|
const CodeHeader = ({ language, code }) => {
|
|
48
60
|
const { isCopied, copyToClipboard } = useCopyToClipboard();
|
|
61
|
+
const processedLanguage = language == "unknown" ? "text" : language;
|
|
49
62
|
const onCopy = () => {
|
|
50
63
|
if (!code || isCopied)
|
|
51
64
|
return;
|
|
52
65
|
copyToClipboard(code);
|
|
53
66
|
};
|
|
54
|
-
return (jsxRuntime.jsxs("div", { className: "aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground", children: [jsxRuntime.jsx("span", { className: "aui-code-header-language lowercase [&>span]:text-xs", children:
|
|
67
|
+
return (jsxRuntime.jsxs("div", { className: "aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground w-max-[800px]", children: [jsxRuntime.jsx("span", { className: "aui-code-header-language lowercase [&>span]:text-xs", children: processedLanguage }), jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", onClick: onCopy, children: [!isCopied && jsxRuntime.jsx(copy.default, {}), isCopied && jsxRuntime.jsx(check.default, {})] })] }));
|
|
55
68
|
};
|
|
56
69
|
const Video = ({ src, className, ...props }) => {
|
|
57
70
|
const debouncedSrc = useDebounce.useDebounce(src, 500);
|
|
@@ -121,6 +134,12 @@ const defaultComponents = memoization.memoizeMarkdownComponents({
|
|
|
121
134
|
"aui-md-inline-code rounded border bg-muted font-semibold", className), ...props }));
|
|
122
135
|
},
|
|
123
136
|
CodeHeader,
|
|
137
|
+
div: ({ className, ...props }) => {
|
|
138
|
+
if (className?.includes("img-loading-placeholder")) {
|
|
139
|
+
return (jsxRuntime.jsxs("div", { className: utils.cn("flex items-center gap-2 py-2 text-muted-foreground", className), children: [jsxRuntime.jsx(loaderCircle.default, { className: "h-4 w-4 animate-spin" }), jsxRuntime.jsx("span", { className: "text-sm", children: props["data-content"] || "正在生成图片..." })] }));
|
|
140
|
+
}
|
|
141
|
+
return jsxRuntime.jsx("div", { className: className, ...props });
|
|
142
|
+
},
|
|
124
143
|
});
|
|
125
144
|
|
|
126
145
|
exports.MarkdownText = MarkdownText;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-text.cjs","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"sourcesContent":["\"use client\";\n\nimport \"@assistant-ui/react-markdown/styles/dot.css\";\n\nimport {\n type CodeHeaderProps,\n MarkdownTextPrimitive,\n unstable_memoizeMarkdownComponents as memoizeMarkdownComponents,\n useIsMarkdownCodeBlock,\n} from \"@assistant-ui/react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize, { defaultSchema } from \"rehype-sanitize\";\nimport { type FC, memo, useState } from \"react\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport \"./index.less\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport { cn } from \"@/lib/utils\";\nimport { SyntaxHighlighter } from \"./shiki-highlighter\";\nimport { useDebounce } from \"@/hooks/useDebounce\";\n\nconst schema = {\n ...defaultSchema,\n // 1. 添加标签到白名单\n tagNames: [...(defaultSchema.tagNames || []), \"video\", \"source\"],\n // 2. 添加允许的属性\n attributes: {\n ...defaultSchema.attributes,\n // 允许 video 标签使用的属性\n video: [\n \"controls\",\n \"width\",\n \"height\",\n \"poster\",\n \"preload\",\n \"src\",\n \"muted\",\n \"loop\",\n \"autoPlay\",\n \"playsInline\",\n ],\n // 允许 source 标签使用的属性\n source: [\"src\", \"type\"],\n },\n};\n\nconst MarkdownTextImpl = () => {\n return (\n <MarkdownTextPrimitive\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw, [rehypeSanitize, schema]]}\n className=\"aui-md\"\n components={defaultComponents}\n />\n );\n};\n\nexport const MarkdownText = memo(MarkdownTextImpl);\n\nconst CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard();\n const onCopy = () => {\n if (!code || isCopied) return;\n copyToClipboard(code);\n };\n\n return (\n <div className=\"aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground\">\n <span className=\"aui-code-header-language lowercase [&>span]:text-xs\">\n {language}\n </span>\n <TooltipIconButton tooltip=\"Copy\" onClick={onCopy}>\n {!isCopied && <CopyIcon />}\n {isCopied && <CheckIcon />}\n </TooltipIconButton>\n </div>\n );\n};\n\nconst Video = ({\n src,\n className,\n ...props\n}: {\n src?: string;\n className?: string;\n}) => {\n const debouncedSrc = useDebounce(src, 500);\n return (\n <video\n src={debouncedSrc}\n style={{ maxWidth: 600 }}\n className={cn(\"aui-md-video max-w-full rounded-lg\", className)}\n controls\n {...props}\n />\n );\n};\n\nconst useCopyToClipboard = ({\n copiedDuration = 3000,\n}: {\n copiedDuration?: number;\n} = {}) => {\n const [isCopied, setIsCopied] = useState<boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (!value) return;\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n });\n };\n\n return { isCopied, copyToClipboard };\n};\n\nconst defaultComponents = memoizeMarkdownComponents({\n h1: ({ className, ...props }) => (\n <h1\n className={cn(\n \"aui-md-h1 mb-8 scroll-m-20 text-4xl font-extrabold tracking-tight last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h2: ({ className, ...props }) => (\n <h2\n className={cn(\n \"aui-md-h2 mt-8 mb-4 scroll-m-20 text-3xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h3: ({ className, ...props }) => (\n <h3\n className={cn(\n \"aui-md-h3 mt-6 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h4: ({ className, ...props }) => (\n <h4\n className={cn(\n \"aui-md-h4 mt-6 mb-4 scroll-m-20 text-xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h5: ({ className, ...props }) => (\n <h5\n className={cn(\n \"aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h6: ({ className, ...props }) => (\n <h6\n className={cn(\n \"aui-md-h6 my-4 font-semibold first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n p: ({ className, ...props }) => (\n <p\n className={cn(\n \"aui-md-p mt-5 mb-5 leading-7 first:mt-0 last:mb-0 chatkit-md-text-p\",\n className\n )}\n {...props}\n />\n ),\n image: ({ className, ...props }) => {\n return (\n <img\n src={props.href}\n style={{ maxWidth: 400 }}\n className={cn(\"aui-md-img max-w-full rounded-lg\", className)}\n />\n );\n },\n a: ({ className, ...props }) => {\n const isVideo = (href: string | undefined) => {\n if (!href) return false;\n const videoExtensions = [\n \".mp4\",\n \".avi\",\n \".mov\",\n \".wmv\",\n \".flv\",\n \".webm\",\n \".mkv\",\n \".m4v\",\n ];\n return videoExtensions.some((ext) => href.toLowerCase().includes(ext));\n };\n\n if (isVideo(props.href)) {\n return (\n <>\n <a\n className={cn(\n \"aui-md-a font-medium text-primary underline underline-offset-4\",\n className\n )}\n {...props}\n />\n <Video src={props.href} className={className} {...props} />\n </>\n );\n }\n\n return (\n <a\n className={cn(\n \"aui-md-a font-medium text-primary underline underline-offset-4\",\n className\n )}\n {...props}\n />\n );\n },\n video: ({ className, ...props }) => {\n return <Video className={className} {...props} />;\n },\n blockquote: ({ className, ...props }) => (\n <blockquote\n className={cn(\"aui-md-blockquote border-l-2 pl-6 italic\", className)}\n {...props}\n />\n ),\n ul: ({ className, ...props }) => (\n <ul\n className={cn(\"aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n ol: ({ className, ...props }) => (\n <ol\n className={cn(\"aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n hr: ({ className, ...props }) => (\n <hr className={cn(\"aui-md-hr my-5 border-b\", className)} {...props} />\n ),\n table: ({ className, ...props }) => (\n <table\n className={cn(\n \"aui-md-table my-5 w-full border-separate border-spacing-0 overflow-y-auto\",\n className\n )}\n {...props}\n />\n ),\n th: ({ className, ...props }) => (\n <th\n className={cn(\n \"aui-md-th bg-muted px-4 py-2 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right\",\n className\n )}\n {...props}\n />\n ),\n td: ({ className, ...props }) => (\n <td\n className={cn(\n \"aui-md-td border-b border-l px-4 py-2 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right\",\n className\n )}\n {...props}\n />\n ),\n tr: ({ className, ...props }) => (\n <tr\n className={cn(\n \"aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg\",\n className\n )}\n {...props}\n />\n ),\n sup: ({ className, ...props }) => (\n <sup\n className={cn(\"aui-md-sup [&>a]:text-xs [&>a]:no-underline\", className)}\n {...props}\n />\n ),\n SyntaxHighlighter: SyntaxHighlighter,\n pre: ({ className, ...props }) => (\n <pre\n className={cn(\n \"aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg bg-black p-4 text-white\",\n className\n )}\n {...props}\n />\n ),\n code: function Code({ className, ...props }) {\n const isCodeBlock = useIsMarkdownCodeBlock();\n return (\n <code\n className={cn(\n !isCodeBlock &&\n \"aui-md-inline-code rounded border bg-muted font-semibold\",\n className\n )}\n {...props}\n />\n );\n },\n CodeHeader,\n});\n"],"names":["defaultSchema","_jsx","MarkdownTextPrimitive","remarkGfm","rehypeRaw","rehypeSanitize","memo","_jsxs","TooltipIconButton","CopyIcon","CheckIcon","useDebounce","cn","useState","memoizeMarkdownComponents","_Fragment","SyntaxHighlighter","useIsMarkdownCodeBlock"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markdown-text.cjs","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"sourcesContent":["\"use client\";\n\nimport \"@assistant-ui/react-markdown/styles/dot.css\";\n\nimport {\n type CodeHeaderProps,\n MarkdownTextPrimitive,\n unstable_memoizeMarkdownComponents as memoizeMarkdownComponents,\n useIsMarkdownCodeBlock,\n} from \"@assistant-ui/react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize, { defaultSchema } from \"rehype-sanitize\";\nimport { type FC, memo, useState } from \"react\";\nimport { CheckIcon, CopyIcon, Loader2 } from \"lucide-react\";\nimport \"./index.less\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport { cn } from \"@/lib/utils\";\nimport { SyntaxHighlighter } from \"./shiki-highlighter\";\nimport { useDebounce } from \"@/hooks/useDebounce\";\nimport remarkLoadingImage from \"@/utils/imageLoadingPlugin\";\nimport { rehypeAppendCursor } from \"@/utils/markdownCursorPlugin\";\nimport { PluggableList } from \"unified\";\n\nconst schema = {\n ...defaultSchema,\n // 1. 添加标签到白名单\n tagNames: [...(defaultSchema.tagNames || []), \"video\", \"source\"],\n // 2. 添加允许的属性\n attributes: {\n ...defaultSchema.attributes,\n // 允许 video 标签使用的属性\n video: [\n \"controls\",\n \"width\",\n \"height\",\n \"poster\",\n \"preload\",\n \"src\",\n \"muted\",\n \"loop\",\n \"autoPlay\",\n \"playsInline\",\n ],\n div: [\n ...(defaultSchema.attributes?.div || []),\n \"className\", //\n \"data-content\", // 如果你在插件里用了 data-content\n ],\n // 允许 source 标签使用的属性\n source: [\"src\", \"type\"],\n },\n};\n\n// const remarkPlugins: PluggableList = [remarkGfm, remarkLoadingImage];\n\n// const rehypePlugins: PluggableList = [\n// rehypeRaw,\n// [rehypeSanitize, schema],\n// // rehypeAppendCursor,\n// ];\nconst MarkdownTextImpl = () => {\n return (\n <MarkdownTextPrimitive\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw, [rehypeSanitize, schema]]}\n className=\"aui-md\"\n components={defaultComponents}\n />\n );\n};\n\nexport const MarkdownText = memo(MarkdownTextImpl);\n\nconst CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard();\n const processedLanguage = language == \"unknown\" ? \"text\" : language;\n const onCopy = () => {\n if (!code || isCopied) return;\n copyToClipboard(code);\n };\n\n return (\n <div className=\"aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground w-max-[800px]\">\n <span className=\"aui-code-header-language lowercase [&>span]:text-xs\">\n {processedLanguage}\n </span>\n <TooltipIconButton tooltip=\"Copy\" onClick={onCopy}>\n {!isCopied && <CopyIcon />}\n {isCopied && <CheckIcon />}\n </TooltipIconButton>\n </div>\n );\n};\n\nconst Video = ({\n src,\n className,\n ...props\n}: {\n src?: string;\n className?: string;\n}) => {\n const debouncedSrc = useDebounce(src, 500);\n return (\n <video\n src={debouncedSrc}\n style={{ maxWidth: 600 }}\n className={cn(\"aui-md-video max-w-full rounded-lg\", className)}\n controls\n {...props}\n />\n );\n};\n\nconst useCopyToClipboard = ({\n copiedDuration = 3000,\n}: {\n copiedDuration?: number;\n} = {}) => {\n const [isCopied, setIsCopied] = useState<boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (!value) return;\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n });\n };\n\n return { isCopied, copyToClipboard };\n};\n\nconst defaultComponents = memoizeMarkdownComponents({\n h1: ({ className, ...props }) => (\n <h1\n className={cn(\n \"aui-md-h1 mb-8 scroll-m-20 text-4xl font-extrabold tracking-tight last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h2: ({ className, ...props }) => (\n <h2\n className={cn(\n \"aui-md-h2 mt-8 mb-4 scroll-m-20 text-3xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h3: ({ className, ...props }) => (\n <h3\n className={cn(\n \"aui-md-h3 mt-6 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h4: ({ className, ...props }) => (\n <h4\n className={cn(\n \"aui-md-h4 mt-6 mb-4 scroll-m-20 text-xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h5: ({ className, ...props }) => (\n <h5\n className={cn(\n \"aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h6: ({ className, ...props }) => (\n <h6\n className={cn(\n \"aui-md-h6 my-4 font-semibold first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n p: ({ className, ...props }) => (\n <p\n className={cn(\n \"aui-md-p mt-5 mb-5 leading-7 first:mt-0 last:mb-0 chatkit-md-text-p\",\n className\n )}\n {...props}\n />\n ),\n image: ({ className, ...props }) => {\n return (\n <img\n src={props.href}\n style={{ maxWidth: 400 }}\n className={cn(\"aui-md-img max-w-full rounded-lg\", className)}\n />\n );\n },\n a: ({ className, ...props }) => {\n const isVideo = (href: string | undefined) => {\n if (!href) return false;\n const videoExtensions = [\n \".mp4\",\n \".avi\",\n \".mov\",\n \".wmv\",\n \".flv\",\n \".webm\",\n \".mkv\",\n \".m4v\",\n ];\n return videoExtensions.some((ext) => href.toLowerCase().includes(ext));\n };\n\n if (isVideo(props.href)) {\n return (\n <>\n <a\n className={cn(\n \"aui-md-a font-medium text-primary underline underline-offset-4\",\n className\n )}\n {...props}\n />\n <Video src={props.href} className={className} {...props} />\n </>\n );\n }\n\n return (\n <a\n className={cn(\n \"aui-md-a font-medium text-primary underline underline-offset-4\",\n className\n )}\n {...props}\n />\n );\n },\n video: ({ className, ...props }) => {\n return <Video className={className} {...props} />;\n },\n blockquote: ({ className, ...props }) => (\n <blockquote\n className={cn(\"aui-md-blockquote border-l-2 pl-6 italic\", className)}\n {...props}\n />\n ),\n ul: ({ className, ...props }) => (\n <ul\n className={cn(\"aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n ol: ({ className, ...props }) => (\n <ol\n className={cn(\"aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n hr: ({ className, ...props }) => (\n <hr className={cn(\"aui-md-hr my-5 border-b\", className)} {...props} />\n ),\n table: ({ className, ...props }) => (\n <table\n className={cn(\n \"aui-md-table my-5 w-full border-separate border-spacing-0 overflow-y-auto\",\n className\n )}\n {...props}\n />\n ),\n th: ({ className, ...props }) => (\n <th\n className={cn(\n \"aui-md-th bg-muted px-4 py-2 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right\",\n className\n )}\n {...props}\n />\n ),\n td: ({ className, ...props }) => (\n <td\n className={cn(\n \"aui-md-td border-b border-l px-4 py-2 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right\",\n className\n )}\n {...props}\n />\n ),\n tr: ({ className, ...props }) => (\n <tr\n className={cn(\n \"aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg\",\n className\n )}\n {...props}\n />\n ),\n sup: ({ className, ...props }) => (\n <sup\n className={cn(\"aui-md-sup [&>a]:text-xs [&>a]:no-underline\", className)}\n {...props}\n />\n ),\n SyntaxHighlighter: SyntaxHighlighter,\n pre: ({ className, ...props }) => (\n <pre\n className={cn(\n \"aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg bg-black p-4 text-white\",\n className\n )}\n {...props}\n />\n ),\n code: function Code({ className, ...props }) {\n const isCodeBlock = useIsMarkdownCodeBlock();\n return (\n <code\n className={cn(\n !isCodeBlock &&\n \"aui-md-inline-code rounded border bg-muted font-semibold\",\n className\n )}\n {...props}\n />\n );\n },\n CodeHeader,\n div: ({ className, ...props }) => {\n if (className?.includes(\"img-loading-placeholder\")) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2 py-2 text-muted-foreground\",\n className\n )}\n >\n {/* 这里可以使用你的 Loading 图片,建议放在 packages/chatui/src/assets/ 下并 import */}\n {/* <img src={require(\"@/assets/loading.gif\")} alt=\"loading\" className=\"h-4 w-4\" /> */}\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-sm\">\n {(props as any)[\"data-content\"] || \"正在生成图片...\"}\n </span>\n </div>\n );\n }\n return <div className={className} {...props} />;\n },\n});\n"],"names":["defaultSchema","_jsx","MarkdownTextPrimitive","remarkGfm","rehypeRaw","rehypeSanitize","memo","_jsxs","TooltipIconButton","CopyIcon","CheckIcon","useDebounce","cn","useState","memoizeMarkdownComponents","_Fragment","SyntaxHighlighter","useIsMarkdownCodeBlock","Loader2"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"names":[],"mappings":"AAEA,OAAO,6CAA6C,CAAC;AAarD,OAAO,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"names":[],"mappings":"AAEA,OAAO,6CAA6C,CAAC;AAarD,OAAO,cAAc,CAAC;AAyDtB,eAAO,MAAM,YAAY,wDAAyB,CAAC"}
|
|
@@ -11,6 +11,7 @@ import { defaultSchema } from '../../node_modules/.pnpm/hast-util-sanitize@5.0.2
|
|
|
11
11
|
import remarkGfm from '../../node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.js';
|
|
12
12
|
import rehypeRaw from '../../node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.js';
|
|
13
13
|
import rehypeSanitize from '../../node_modules/.pnpm/rehype-sanitize@6.0.0/node_modules/rehype-sanitize/lib/index.js';
|
|
14
|
+
import LoaderCircle from '../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/loader-circle.js';
|
|
14
15
|
import Copy from '../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/copy.js';
|
|
15
16
|
import Check from '../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/check.js';
|
|
16
17
|
|
|
@@ -34,22 +35,34 @@ const schema = {
|
|
|
34
35
|
"autoPlay",
|
|
35
36
|
"playsInline",
|
|
36
37
|
],
|
|
38
|
+
div: [
|
|
39
|
+
...(defaultSchema.attributes?.div || []),
|
|
40
|
+
"className", //
|
|
41
|
+
"data-content", // 如果你在插件里用了 data-content
|
|
42
|
+
],
|
|
37
43
|
// 允许 source 标签使用的属性
|
|
38
44
|
source: ["src", "type"],
|
|
39
45
|
},
|
|
40
46
|
};
|
|
47
|
+
// const remarkPlugins: PluggableList = [remarkGfm, remarkLoadingImage];
|
|
48
|
+
// const rehypePlugins: PluggableList = [
|
|
49
|
+
// rehypeRaw,
|
|
50
|
+
// [rehypeSanitize, schema],
|
|
51
|
+
// // rehypeAppendCursor,
|
|
52
|
+
// ];
|
|
41
53
|
const MarkdownTextImpl = () => {
|
|
42
54
|
return (jsx(MarkdownTextPrimitive, { remarkPlugins: [remarkGfm], rehypePlugins: [rehypeRaw, [rehypeSanitize, schema]], className: "aui-md", components: defaultComponents }));
|
|
43
55
|
};
|
|
44
56
|
const MarkdownText = memo(MarkdownTextImpl);
|
|
45
57
|
const CodeHeader = ({ language, code }) => {
|
|
46
58
|
const { isCopied, copyToClipboard } = useCopyToClipboard();
|
|
59
|
+
const processedLanguage = language == "unknown" ? "text" : language;
|
|
47
60
|
const onCopy = () => {
|
|
48
61
|
if (!code || isCopied)
|
|
49
62
|
return;
|
|
50
63
|
copyToClipboard(code);
|
|
51
64
|
};
|
|
52
|
-
return (jsxs("div", { className: "aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground", children: [jsx("span", { className: "aui-code-header-language lowercase [&>span]:text-xs", children:
|
|
65
|
+
return (jsxs("div", { className: "aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground w-max-[800px]", children: [jsx("span", { className: "aui-code-header-language lowercase [&>span]:text-xs", children: processedLanguage }), jsxs(TooltipIconButton, { tooltip: "Copy", onClick: onCopy, children: [!isCopied && jsx(Copy, {}), isCopied && jsx(Check, {})] })] }));
|
|
53
66
|
};
|
|
54
67
|
const Video = ({ src, className, ...props }) => {
|
|
55
68
|
const debouncedSrc = useDebounce(src, 500);
|
|
@@ -119,6 +132,12 @@ const defaultComponents = memoizeMarkdownComponents({
|
|
|
119
132
|
"aui-md-inline-code rounded border bg-muted font-semibold", className), ...props }));
|
|
120
133
|
},
|
|
121
134
|
CodeHeader,
|
|
135
|
+
div: ({ className, ...props }) => {
|
|
136
|
+
if (className?.includes("img-loading-placeholder")) {
|
|
137
|
+
return (jsxs("div", { className: cn("flex items-center gap-2 py-2 text-muted-foreground", className), children: [jsx(LoaderCircle, { className: "h-4 w-4 animate-spin" }), jsx("span", { className: "text-sm", children: props["data-content"] || "正在生成图片..." })] }));
|
|
138
|
+
}
|
|
139
|
+
return jsx("div", { className: className, ...props });
|
|
140
|
+
},
|
|
122
141
|
});
|
|
123
142
|
|
|
124
143
|
export { MarkdownText };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-text.js","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"sourcesContent":["\"use client\";\n\nimport \"@assistant-ui/react-markdown/styles/dot.css\";\n\nimport {\n type CodeHeaderProps,\n MarkdownTextPrimitive,\n unstable_memoizeMarkdownComponents as memoizeMarkdownComponents,\n useIsMarkdownCodeBlock,\n} from \"@assistant-ui/react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize, { defaultSchema } from \"rehype-sanitize\";\nimport { type FC, memo, useState } from \"react\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport \"./index.less\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport { cn } from \"@/lib/utils\";\nimport { SyntaxHighlighter } from \"./shiki-highlighter\";\nimport { useDebounce } from \"@/hooks/useDebounce\";\n\nconst schema = {\n ...defaultSchema,\n // 1. 添加标签到白名单\n tagNames: [...(defaultSchema.tagNames || []), \"video\", \"source\"],\n // 2. 添加允许的属性\n attributes: {\n ...defaultSchema.attributes,\n // 允许 video 标签使用的属性\n video: [\n \"controls\",\n \"width\",\n \"height\",\n \"poster\",\n \"preload\",\n \"src\",\n \"muted\",\n \"loop\",\n \"autoPlay\",\n \"playsInline\",\n ],\n // 允许 source 标签使用的属性\n source: [\"src\", \"type\"],\n },\n};\n\nconst MarkdownTextImpl = () => {\n return (\n <MarkdownTextPrimitive\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw, [rehypeSanitize, schema]]}\n className=\"aui-md\"\n components={defaultComponents}\n />\n );\n};\n\nexport const MarkdownText = memo(MarkdownTextImpl);\n\nconst CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard();\n const onCopy = () => {\n if (!code || isCopied) return;\n copyToClipboard(code);\n };\n\n return (\n <div className=\"aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground\">\n <span className=\"aui-code-header-language lowercase [&>span]:text-xs\">\n {language}\n </span>\n <TooltipIconButton tooltip=\"Copy\" onClick={onCopy}>\n {!isCopied && <CopyIcon />}\n {isCopied && <CheckIcon />}\n </TooltipIconButton>\n </div>\n );\n};\n\nconst Video = ({\n src,\n className,\n ...props\n}: {\n src?: string;\n className?: string;\n}) => {\n const debouncedSrc = useDebounce(src, 500);\n return (\n <video\n src={debouncedSrc}\n style={{ maxWidth: 600 }}\n className={cn(\"aui-md-video max-w-full rounded-lg\", className)}\n controls\n {...props}\n />\n );\n};\n\nconst useCopyToClipboard = ({\n copiedDuration = 3000,\n}: {\n copiedDuration?: number;\n} = {}) => {\n const [isCopied, setIsCopied] = useState<boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (!value) return;\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n });\n };\n\n return { isCopied, copyToClipboard };\n};\n\nconst defaultComponents = memoizeMarkdownComponents({\n h1: ({ className, ...props }) => (\n <h1\n className={cn(\n \"aui-md-h1 mb-8 scroll-m-20 text-4xl font-extrabold tracking-tight last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h2: ({ className, ...props }) => (\n <h2\n className={cn(\n \"aui-md-h2 mt-8 mb-4 scroll-m-20 text-3xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h3: ({ className, ...props }) => (\n <h3\n className={cn(\n \"aui-md-h3 mt-6 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h4: ({ className, ...props }) => (\n <h4\n className={cn(\n \"aui-md-h4 mt-6 mb-4 scroll-m-20 text-xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h5: ({ className, ...props }) => (\n <h5\n className={cn(\n \"aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h6: ({ className, ...props }) => (\n <h6\n className={cn(\n \"aui-md-h6 my-4 font-semibold first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n p: ({ className, ...props }) => (\n <p\n className={cn(\n \"aui-md-p mt-5 mb-5 leading-7 first:mt-0 last:mb-0 chatkit-md-text-p\",\n className\n )}\n {...props}\n />\n ),\n image: ({ className, ...props }) => {\n return (\n <img\n src={props.href}\n style={{ maxWidth: 400 }}\n className={cn(\"aui-md-img max-w-full rounded-lg\", className)}\n />\n );\n },\n a: ({ className, ...props }) => {\n const isVideo = (href: string | undefined) => {\n if (!href) return false;\n const videoExtensions = [\n \".mp4\",\n \".avi\",\n \".mov\",\n \".wmv\",\n \".flv\",\n \".webm\",\n \".mkv\",\n \".m4v\",\n ];\n return videoExtensions.some((ext) => href.toLowerCase().includes(ext));\n };\n\n if (isVideo(props.href)) {\n return (\n <>\n <a\n className={cn(\n \"aui-md-a font-medium text-primary underline underline-offset-4\",\n className\n )}\n {...props}\n />\n <Video src={props.href} className={className} {...props} />\n </>\n );\n }\n\n return (\n <a\n className={cn(\n \"aui-md-a font-medium text-primary underline underline-offset-4\",\n className\n )}\n {...props}\n />\n );\n },\n video: ({ className, ...props }) => {\n return <Video className={className} {...props} />;\n },\n blockquote: ({ className, ...props }) => (\n <blockquote\n className={cn(\"aui-md-blockquote border-l-2 pl-6 italic\", className)}\n {...props}\n />\n ),\n ul: ({ className, ...props }) => (\n <ul\n className={cn(\"aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n ol: ({ className, ...props }) => (\n <ol\n className={cn(\"aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n hr: ({ className, ...props }) => (\n <hr className={cn(\"aui-md-hr my-5 border-b\", className)} {...props} />\n ),\n table: ({ className, ...props }) => (\n <table\n className={cn(\n \"aui-md-table my-5 w-full border-separate border-spacing-0 overflow-y-auto\",\n className\n )}\n {...props}\n />\n ),\n th: ({ className, ...props }) => (\n <th\n className={cn(\n \"aui-md-th bg-muted px-4 py-2 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right\",\n className\n )}\n {...props}\n />\n ),\n td: ({ className, ...props }) => (\n <td\n className={cn(\n \"aui-md-td border-b border-l px-4 py-2 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right\",\n className\n )}\n {...props}\n />\n ),\n tr: ({ className, ...props }) => (\n <tr\n className={cn(\n \"aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg\",\n className\n )}\n {...props}\n />\n ),\n sup: ({ className, ...props }) => (\n <sup\n className={cn(\"aui-md-sup [&>a]:text-xs [&>a]:no-underline\", className)}\n {...props}\n />\n ),\n SyntaxHighlighter: SyntaxHighlighter,\n pre: ({ className, ...props }) => (\n <pre\n className={cn(\n \"aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg bg-black p-4 text-white\",\n className\n )}\n {...props}\n />\n ),\n code: function Code({ className, ...props }) {\n const isCodeBlock = useIsMarkdownCodeBlock();\n return (\n <code\n className={cn(\n !isCodeBlock &&\n \"aui-md-inline-code rounded border bg-muted font-semibold\",\n className\n )}\n {...props}\n />\n );\n },\n CodeHeader,\n});\n"],"names":["_jsx","_jsxs","CopyIcon","CheckIcon","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markdown-text.js","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"sourcesContent":["\"use client\";\n\nimport \"@assistant-ui/react-markdown/styles/dot.css\";\n\nimport {\n type CodeHeaderProps,\n MarkdownTextPrimitive,\n unstable_memoizeMarkdownComponents as memoizeMarkdownComponents,\n useIsMarkdownCodeBlock,\n} from \"@assistant-ui/react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize, { defaultSchema } from \"rehype-sanitize\";\nimport { type FC, memo, useState } from \"react\";\nimport { CheckIcon, CopyIcon, Loader2 } from \"lucide-react\";\nimport \"./index.less\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport { cn } from \"@/lib/utils\";\nimport { SyntaxHighlighter } from \"./shiki-highlighter\";\nimport { useDebounce } from \"@/hooks/useDebounce\";\nimport remarkLoadingImage from \"@/utils/imageLoadingPlugin\";\nimport { rehypeAppendCursor } from \"@/utils/markdownCursorPlugin\";\nimport { PluggableList } from \"unified\";\n\nconst schema = {\n ...defaultSchema,\n // 1. 添加标签到白名单\n tagNames: [...(defaultSchema.tagNames || []), \"video\", \"source\"],\n // 2. 添加允许的属性\n attributes: {\n ...defaultSchema.attributes,\n // 允许 video 标签使用的属性\n video: [\n \"controls\",\n \"width\",\n \"height\",\n \"poster\",\n \"preload\",\n \"src\",\n \"muted\",\n \"loop\",\n \"autoPlay\",\n \"playsInline\",\n ],\n div: [\n ...(defaultSchema.attributes?.div || []),\n \"className\", //\n \"data-content\", // 如果你在插件里用了 data-content\n ],\n // 允许 source 标签使用的属性\n source: [\"src\", \"type\"],\n },\n};\n\n// const remarkPlugins: PluggableList = [remarkGfm, remarkLoadingImage];\n\n// const rehypePlugins: PluggableList = [\n// rehypeRaw,\n// [rehypeSanitize, schema],\n// // rehypeAppendCursor,\n// ];\nconst MarkdownTextImpl = () => {\n return (\n <MarkdownTextPrimitive\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw, [rehypeSanitize, schema]]}\n className=\"aui-md\"\n components={defaultComponents}\n />\n );\n};\n\nexport const MarkdownText = memo(MarkdownTextImpl);\n\nconst CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard();\n const processedLanguage = language == \"unknown\" ? \"text\" : language;\n const onCopy = () => {\n if (!code || isCopied) return;\n copyToClipboard(code);\n };\n\n return (\n <div className=\"aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground w-max-[800px]\">\n <span className=\"aui-code-header-language lowercase [&>span]:text-xs\">\n {processedLanguage}\n </span>\n <TooltipIconButton tooltip=\"Copy\" onClick={onCopy}>\n {!isCopied && <CopyIcon />}\n {isCopied && <CheckIcon />}\n </TooltipIconButton>\n </div>\n );\n};\n\nconst Video = ({\n src,\n className,\n ...props\n}: {\n src?: string;\n className?: string;\n}) => {\n const debouncedSrc = useDebounce(src, 500);\n return (\n <video\n src={debouncedSrc}\n style={{ maxWidth: 600 }}\n className={cn(\"aui-md-video max-w-full rounded-lg\", className)}\n controls\n {...props}\n />\n );\n};\n\nconst useCopyToClipboard = ({\n copiedDuration = 3000,\n}: {\n copiedDuration?: number;\n} = {}) => {\n const [isCopied, setIsCopied] = useState<boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (!value) return;\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n });\n };\n\n return { isCopied, copyToClipboard };\n};\n\nconst defaultComponents = memoizeMarkdownComponents({\n h1: ({ className, ...props }) => (\n <h1\n className={cn(\n \"aui-md-h1 mb-8 scroll-m-20 text-4xl font-extrabold tracking-tight last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h2: ({ className, ...props }) => (\n <h2\n className={cn(\n \"aui-md-h2 mt-8 mb-4 scroll-m-20 text-3xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h3: ({ className, ...props }) => (\n <h3\n className={cn(\n \"aui-md-h3 mt-6 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h4: ({ className, ...props }) => (\n <h4\n className={cn(\n \"aui-md-h4 mt-6 mb-4 scroll-m-20 text-xl font-semibold tracking-tight first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h5: ({ className, ...props }) => (\n <h5\n className={cn(\n \"aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n h6: ({ className, ...props }) => (\n <h6\n className={cn(\n \"aui-md-h6 my-4 font-semibold first:mt-0 last:mb-0\",\n className\n )}\n {...props}\n />\n ),\n p: ({ className, ...props }) => (\n <p\n className={cn(\n \"aui-md-p mt-5 mb-5 leading-7 first:mt-0 last:mb-0 chatkit-md-text-p\",\n className\n )}\n {...props}\n />\n ),\n image: ({ className, ...props }) => {\n return (\n <img\n src={props.href}\n style={{ maxWidth: 400 }}\n className={cn(\"aui-md-img max-w-full rounded-lg\", className)}\n />\n );\n },\n a: ({ className, ...props }) => {\n const isVideo = (href: string | undefined) => {\n if (!href) return false;\n const videoExtensions = [\n \".mp4\",\n \".avi\",\n \".mov\",\n \".wmv\",\n \".flv\",\n \".webm\",\n \".mkv\",\n \".m4v\",\n ];\n return videoExtensions.some((ext) => href.toLowerCase().includes(ext));\n };\n\n if (isVideo(props.href)) {\n return (\n <>\n <a\n className={cn(\n \"aui-md-a font-medium text-primary underline underline-offset-4\",\n className\n )}\n {...props}\n />\n <Video src={props.href} className={className} {...props} />\n </>\n );\n }\n\n return (\n <a\n className={cn(\n \"aui-md-a font-medium text-primary underline underline-offset-4\",\n className\n )}\n {...props}\n />\n );\n },\n video: ({ className, ...props }) => {\n return <Video className={className} {...props} />;\n },\n blockquote: ({ className, ...props }) => (\n <blockquote\n className={cn(\"aui-md-blockquote border-l-2 pl-6 italic\", className)}\n {...props}\n />\n ),\n ul: ({ className, ...props }) => (\n <ul\n className={cn(\"aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n ol: ({ className, ...props }) => (\n <ol\n className={cn(\"aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n hr: ({ className, ...props }) => (\n <hr className={cn(\"aui-md-hr my-5 border-b\", className)} {...props} />\n ),\n table: ({ className, ...props }) => (\n <table\n className={cn(\n \"aui-md-table my-5 w-full border-separate border-spacing-0 overflow-y-auto\",\n className\n )}\n {...props}\n />\n ),\n th: ({ className, ...props }) => (\n <th\n className={cn(\n \"aui-md-th bg-muted px-4 py-2 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right\",\n className\n )}\n {...props}\n />\n ),\n td: ({ className, ...props }) => (\n <td\n className={cn(\n \"aui-md-td border-b border-l px-4 py-2 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right\",\n className\n )}\n {...props}\n />\n ),\n tr: ({ className, ...props }) => (\n <tr\n className={cn(\n \"aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg\",\n className\n )}\n {...props}\n />\n ),\n sup: ({ className, ...props }) => (\n <sup\n className={cn(\"aui-md-sup [&>a]:text-xs [&>a]:no-underline\", className)}\n {...props}\n />\n ),\n SyntaxHighlighter: SyntaxHighlighter,\n pre: ({ className, ...props }) => (\n <pre\n className={cn(\n \"aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg bg-black p-4 text-white\",\n className\n )}\n {...props}\n />\n ),\n code: function Code({ className, ...props }) {\n const isCodeBlock = useIsMarkdownCodeBlock();\n return (\n <code\n className={cn(\n !isCodeBlock &&\n \"aui-md-inline-code rounded border bg-muted font-semibold\",\n className\n )}\n {...props}\n />\n );\n },\n CodeHeader,\n div: ({ className, ...props }) => {\n if (className?.includes(\"img-loading-placeholder\")) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2 py-2 text-muted-foreground\",\n className\n )}\n >\n {/* 这里可以使用你的 Loading 图片,建议放在 packages/chatui/src/assets/ 下并 import */}\n {/* <img src={require(\"@/assets/loading.gif\")} alt=\"loading\" className=\"h-4 w-4\" /> */}\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-sm\">\n {(props as any)[\"data-content\"] || \"正在生成图片...\"}\n </span>\n </div>\n );\n }\n return <div className={className} {...props} />;\n },\n});\n"],"names":["_jsx","_jsxs","CopyIcon","CheckIcon","_Fragment","Loader2"],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ var utils = require('../../lib/utils.cjs');
|
|
|
18
18
|
const SyntaxHighlighter = ({ code, language, theme = { dark: "github-dark", light: "github-light" }, className, addDefaultStyles = false, // assistant-ui requires custom base styles
|
|
19
19
|
showLanguage = false, // assistant-ui/react-markdown handles language labels
|
|
20
20
|
node: _node, components: _components, ...props }) => {
|
|
21
|
-
return (jsxRuntime.jsx(index.default, { ...props, language: language, theme: theme, addDefaultStyles: addDefaultStyles, showLanguage: showLanguage, defaultColor: "light-dark()", className: utils.cn("aui-shiki-base [&_pre]:overflow-x-auto [&_pre]:rounded-b-lg [&_pre]:!bg-muted/75 [&_pre]:p-4 [&_pre]:border", className), children: code.trim() }));
|
|
21
|
+
return (jsxRuntime.jsx(index.default, { ...props, language: language, theme: theme, addDefaultStyles: addDefaultStyles, showLanguage: showLanguage, defaultColor: "light-dark()", className: utils.cn("aui-shiki-base [&_pre]:overflow-x-auto [&_pre]:rounded-b-lg [&_pre]:!bg-muted/75 [&_pre]:p-4 [&_pre]:border max-w-[800px]", className), children: code.trim() }));
|
|
22
22
|
};
|
|
23
23
|
SyntaxHighlighter.displayName = "SyntaxHighlighter";
|
|
24
24
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shiki-highlighter.cjs","sources":["../../../src/components/assistant-ui/shiki-highlighter.tsx"],"sourcesContent":["\"use client\";\n\nimport { FC } from \"react\";\nimport ShikiHighlighter, { type ShikiHighlighterProps } from \"react-shiki\";\nimport type { SyntaxHighlighterProps as AUIProps } from \"@assistant-ui/react-markdown\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Props for the SyntaxHighlighter component\n */\nexport type HighlighterProps = Omit<\n ShikiHighlighterProps,\n \"children\" | \"theme\"\n> & {\n theme?: ShikiHighlighterProps[\"theme\"];\n} & Pick<AUIProps, \"node\" | \"components\" | \"language\" | \"code\">;\n\n/**\n * SyntaxHighlighter component, using react-shiki\n * Use it by passing to `defaultComponents` in `markdown-text.tsx`\n *\n * @example\n * const defaultComponents = memoizeMarkdownComponents({\n * SyntaxHighlighter,\n * h1: //...\n * //...other elements...\n * });\n */\nexport const SyntaxHighlighter: FC<HighlighterProps> = ({\n code,\n language,\n theme = { dark: \"github-dark\", light: \"github-light\" },\n className,\n addDefaultStyles = false, // assistant-ui requires custom base styles\n showLanguage = false, // assistant-ui/react-markdown handles language labels\n node: _node,\n components: _components,\n ...props\n}) => {\n return (\n <ShikiHighlighter\n {...props}\n language={language}\n theme={theme}\n addDefaultStyles={addDefaultStyles}\n showLanguage={showLanguage}\n defaultColor=\"light-dark()\"\n className={cn(\n \"aui-shiki-base [&_pre]:overflow-x-auto [&_pre]:rounded-b-lg [&_pre]:!bg-muted/75 [&_pre]:p-4 [&_pre]:border\",\n className,\n )}\n >\n {code.trim()}\n </ShikiHighlighter>\n );\n};\n\nSyntaxHighlighter.displayName = \"SyntaxHighlighter\";\n"],"names":["_jsx","ShikiHighlighter","cn"],"mappings":";;;;;;AAiBA;;;;;;;;;;AAUG;AACI,MAAM,iBAAiB,GAAyB,CAAC,EACtD,IAAI,EACJ,QAAQ,EACR,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,EACtD,SAAS,EACT,gBAAgB,GAAG,KAAK;AACxB,YAAY,GAAG,KAAK;AACpB,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,GAAG,KAAK,EACT,KAAI;AACH,IAAA,QACEA,cAAC,CAAAC,aAAgB,OACX,KAAK,EACT,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAC,cAAc,EAC3B,SAAS,EAAEC,QAAE,CACX,
|
|
1
|
+
{"version":3,"file":"shiki-highlighter.cjs","sources":["../../../src/components/assistant-ui/shiki-highlighter.tsx"],"sourcesContent":["\"use client\";\n\nimport { FC } from \"react\";\nimport ShikiHighlighter, { type ShikiHighlighterProps } from \"react-shiki\";\nimport type { SyntaxHighlighterProps as AUIProps } from \"@assistant-ui/react-markdown\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Props for the SyntaxHighlighter component\n */\nexport type HighlighterProps = Omit<\n ShikiHighlighterProps,\n \"children\" | \"theme\"\n> & {\n theme?: ShikiHighlighterProps[\"theme\"];\n} & Pick<AUIProps, \"node\" | \"components\" | \"language\" | \"code\">;\n\n/**\n * SyntaxHighlighter component, using react-shiki\n * Use it by passing to `defaultComponents` in `markdown-text.tsx`\n *\n * @example\n * const defaultComponents = memoizeMarkdownComponents({\n * SyntaxHighlighter,\n * h1: //...\n * //...other elements...\n * });\n */\nexport const SyntaxHighlighter: FC<HighlighterProps> = ({\n code,\n language,\n theme = { dark: \"github-dark\", light: \"github-light\" },\n className,\n addDefaultStyles = false, // assistant-ui requires custom base styles\n showLanguage = false, // assistant-ui/react-markdown handles language labels\n node: _node,\n components: _components,\n ...props\n}) => {\n return (\n <ShikiHighlighter\n {...props}\n language={language}\n theme={theme}\n addDefaultStyles={addDefaultStyles}\n showLanguage={showLanguage}\n defaultColor=\"light-dark()\"\n className={cn(\n \"aui-shiki-base [&_pre]:overflow-x-auto [&_pre]:rounded-b-lg [&_pre]:!bg-muted/75 [&_pre]:p-4 [&_pre]:border max-w-[800px]\",\n className,\n )}\n >\n {code.trim()}\n </ShikiHighlighter>\n );\n};\n\nSyntaxHighlighter.displayName = \"SyntaxHighlighter\";\n"],"names":["_jsx","ShikiHighlighter","cn"],"mappings":";;;;;;AAiBA;;;;;;;;;;AAUG;AACI,MAAM,iBAAiB,GAAyB,CAAC,EACtD,IAAI,EACJ,QAAQ,EACR,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,EACtD,SAAS,EACT,gBAAgB,GAAG,KAAK;AACxB,YAAY,GAAG,KAAK;AACpB,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,GAAG,KAAK,EACT,KAAI;AACH,IAAA,QACEA,cAAC,CAAAC,aAAgB,OACX,KAAK,EACT,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAC,cAAc,EAC3B,SAAS,EAAEC,QAAE,CACX,2HAA2H,EAC3H,SAAS,CACV,YAEA,IAAI,CAAC,IAAI,EAAE,EAAA,CACK,EACnB;AACJ,EAAE;AAEF,iBAAiB,CAAC,WAAW,GAAG,mBAAmB;;;;"}
|
|
@@ -16,7 +16,7 @@ import { cn } from '../../lib/utils.js';
|
|
|
16
16
|
const SyntaxHighlighter = ({ code, language, theme = { dark: "github-dark", light: "github-light" }, className, addDefaultStyles = false, // assistant-ui requires custom base styles
|
|
17
17
|
showLanguage = false, // assistant-ui/react-markdown handles language labels
|
|
18
18
|
node: _node, components: _components, ...props }) => {
|
|
19
|
-
return (jsx(src_default, { ...props, language: language, theme: theme, addDefaultStyles: addDefaultStyles, showLanguage: showLanguage, defaultColor: "light-dark()", className: cn("aui-shiki-base [&_pre]:overflow-x-auto [&_pre]:rounded-b-lg [&_pre]:!bg-muted/75 [&_pre]:p-4 [&_pre]:border", className), children: code.trim() }));
|
|
19
|
+
return (jsx(src_default, { ...props, language: language, theme: theme, addDefaultStyles: addDefaultStyles, showLanguage: showLanguage, defaultColor: "light-dark()", className: cn("aui-shiki-base [&_pre]:overflow-x-auto [&_pre]:rounded-b-lg [&_pre]:!bg-muted/75 [&_pre]:p-4 [&_pre]:border max-w-[800px]", className), children: code.trim() }));
|
|
20
20
|
};
|
|
21
21
|
SyntaxHighlighter.displayName = "SyntaxHighlighter";
|
|
22
22
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shiki-highlighter.js","sources":["../../../src/components/assistant-ui/shiki-highlighter.tsx"],"sourcesContent":["\"use client\";\n\nimport { FC } from \"react\";\nimport ShikiHighlighter, { type ShikiHighlighterProps } from \"react-shiki\";\nimport type { SyntaxHighlighterProps as AUIProps } from \"@assistant-ui/react-markdown\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Props for the SyntaxHighlighter component\n */\nexport type HighlighterProps = Omit<\n ShikiHighlighterProps,\n \"children\" | \"theme\"\n> & {\n theme?: ShikiHighlighterProps[\"theme\"];\n} & Pick<AUIProps, \"node\" | \"components\" | \"language\" | \"code\">;\n\n/**\n * SyntaxHighlighter component, using react-shiki\n * Use it by passing to `defaultComponents` in `markdown-text.tsx`\n *\n * @example\n * const defaultComponents = memoizeMarkdownComponents({\n * SyntaxHighlighter,\n * h1: //...\n * //...other elements...\n * });\n */\nexport const SyntaxHighlighter: FC<HighlighterProps> = ({\n code,\n language,\n theme = { dark: \"github-dark\", light: \"github-light\" },\n className,\n addDefaultStyles = false, // assistant-ui requires custom base styles\n showLanguage = false, // assistant-ui/react-markdown handles language labels\n node: _node,\n components: _components,\n ...props\n}) => {\n return (\n <ShikiHighlighter\n {...props}\n language={language}\n theme={theme}\n addDefaultStyles={addDefaultStyles}\n showLanguage={showLanguage}\n defaultColor=\"light-dark()\"\n className={cn(\n \"aui-shiki-base [&_pre]:overflow-x-auto [&_pre]:rounded-b-lg [&_pre]:!bg-muted/75 [&_pre]:p-4 [&_pre]:border\",\n className,\n )}\n >\n {code.trim()}\n </ShikiHighlighter>\n );\n};\n\nSyntaxHighlighter.displayName = \"SyntaxHighlighter\";\n"],"names":["_jsx","ShikiHighlighter"],"mappings":";;;;AAiBA;;;;;;;;;;AAUG;AACI,MAAM,iBAAiB,GAAyB,CAAC,EACtD,IAAI,EACJ,QAAQ,EACR,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,EACtD,SAAS,EACT,gBAAgB,GAAG,KAAK;AACxB,YAAY,GAAG,KAAK;AACpB,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,GAAG,KAAK,EACT,KAAI;AACH,IAAA,QACEA,GAAC,CAAAC,WAAgB,OACX,KAAK,EACT,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAC,cAAc,EAC3B,SAAS,EAAE,EAAE,CACX,
|
|
1
|
+
{"version":3,"file":"shiki-highlighter.js","sources":["../../../src/components/assistant-ui/shiki-highlighter.tsx"],"sourcesContent":["\"use client\";\n\nimport { FC } from \"react\";\nimport ShikiHighlighter, { type ShikiHighlighterProps } from \"react-shiki\";\nimport type { SyntaxHighlighterProps as AUIProps } from \"@assistant-ui/react-markdown\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Props for the SyntaxHighlighter component\n */\nexport type HighlighterProps = Omit<\n ShikiHighlighterProps,\n \"children\" | \"theme\"\n> & {\n theme?: ShikiHighlighterProps[\"theme\"];\n} & Pick<AUIProps, \"node\" | \"components\" | \"language\" | \"code\">;\n\n/**\n * SyntaxHighlighter component, using react-shiki\n * Use it by passing to `defaultComponents` in `markdown-text.tsx`\n *\n * @example\n * const defaultComponents = memoizeMarkdownComponents({\n * SyntaxHighlighter,\n * h1: //...\n * //...other elements...\n * });\n */\nexport const SyntaxHighlighter: FC<HighlighterProps> = ({\n code,\n language,\n theme = { dark: \"github-dark\", light: \"github-light\" },\n className,\n addDefaultStyles = false, // assistant-ui requires custom base styles\n showLanguage = false, // assistant-ui/react-markdown handles language labels\n node: _node,\n components: _components,\n ...props\n}) => {\n return (\n <ShikiHighlighter\n {...props}\n language={language}\n theme={theme}\n addDefaultStyles={addDefaultStyles}\n showLanguage={showLanguage}\n defaultColor=\"light-dark()\"\n className={cn(\n \"aui-shiki-base [&_pre]:overflow-x-auto [&_pre]:rounded-b-lg [&_pre]:!bg-muted/75 [&_pre]:p-4 [&_pre]:border max-w-[800px]\",\n className,\n )}\n >\n {code.trim()}\n </ShikiHighlighter>\n );\n};\n\nSyntaxHighlighter.displayName = \"SyntaxHighlighter\";\n"],"names":["_jsx","ShikiHighlighter"],"mappings":";;;;AAiBA;;;;;;;;;;AAUG;AACI,MAAM,iBAAiB,GAAyB,CAAC,EACtD,IAAI,EACJ,QAAQ,EACR,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,EACtD,SAAS,EACT,gBAAgB,GAAG,KAAK;AACxB,YAAY,GAAG,KAAK;AACpB,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,WAAW,EACvB,GAAG,KAAK,EACT,KAAI;AACH,IAAA,QACEA,GAAC,CAAAC,WAAgB,OACX,KAAK,EACT,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAC,cAAc,EAC3B,SAAS,EAAE,EAAE,CACX,2HAA2H,EAC3H,SAAS,CACV,YAEA,IAAI,CAAC,IAAI,EAAE,EAAA,CACK,EACnB;AACJ,EAAE;AAEF,iBAAiB,CAAC,WAAW,GAAG,mBAAmB;;;;"}
|
|
@@ -160,7 +160,7 @@ const AssistantActionBar = () => {
|
|
|
160
160
|
}
|
|
161
161
|
return "";
|
|
162
162
|
});
|
|
163
|
-
return (jsxRuntime.jsxs(ActionBarRoot.ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm", children: [jsxRuntime.jsx("div", { onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Like", children: jsxRuntime.jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Dislike", children: jsxRuntime.jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsxRuntime.jsx(ActionBarCopy.ActionBarPrimitiveCopy, { asChild: true, children: jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", children: [jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: true, children: jsxRuntime.jsx(check.default, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: false, children: jsxRuntime.jsx(Copy, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "download", onClick: () => {
|
|
163
|
+
return (jsxRuntime.jsxs(ActionBarRoot.ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Like", children: jsxRuntime.jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Dislike", children: jsxRuntime.jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsxRuntime.jsx(ActionBarCopy.ActionBarPrimitiveCopy, { asChild: true, children: jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", children: [jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: true, children: jsxRuntime.jsx(check.default, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: false, children: jsxRuntime.jsx(Copy, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "download", onClick: () => {
|
|
164
164
|
download.saveStringToMarkdown(downloadContent, "message.md");
|
|
165
165
|
}, children: jsxRuntime.jsx(Download, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }), jsxRuntime.jsx(ActionBarReload.ActionBarPrimitiveReload, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Refresh", children: jsxRuntime.jsx(RefreshIcon, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }) })] }));
|
|
166
166
|
};
|