@lobehub/ui 3.4.6 → 4.0.0
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/README.md +48 -0
- package/es/Accordion/Accordion.d.mts +2 -2
- package/es/Accordion/AccordionItem.d.mts +2 -2
- package/es/Accordion/AccordionItem.mjs +5 -5
- package/es/Accordion/AccordionItem.mjs.map +1 -1
- package/es/ActionIcon/ActionIcon.d.mts +2 -2
- package/es/Alert/Alert.d.mts +2 -2
- package/es/AutoComplete/Select.d.mts +2 -2
- package/es/Avatar/AvatarGroup/index.d.mts +2 -2
- package/es/Burger/Burger.d.mts +2 -2
- package/es/CodeEditor/CodeEditor.d.mts +2 -2
- package/es/Collapse/Collapse.d.mts +2 -2
- package/es/ConfigProvider/index.d.mts +10 -4
- package/es/ConfigProvider/index.mjs +28 -6
- package/es/ConfigProvider/index.mjs.map +1 -1
- package/es/CopyButton/CopyButton.d.mts +2 -2
- package/es/DatePicker/DatePicker.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
- package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
- package/es/Drawer/Drawer.d.mts +2 -2
- package/es/Dropdown/Dropdown.d.mts +2 -2
- package/es/EditableText/EditableText.d.mts +2 -2
- package/es/EmojiPicker/AvatarUploader.mjs +10 -4
- package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
- package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
- package/es/EmojiPicker/EmojiPicker.mjs +9 -3
- package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
- package/es/Flex/FlexBasic.d.mts +2 -2
- package/es/FontLoader/index.d.mts +2 -2
- package/es/Footer/Footer.d.mts +2 -2
- package/es/Form/components/FormGroup.d.mts +2 -2
- package/es/Form/components/FormItem.d.mts +2 -2
- package/es/Form/components/FormSubmitFooter.d.mts +2 -2
- package/es/Form/components/FormSubmitFooter.mjs +20 -8
- package/es/Form/components/FormSubmitFooter.mjs.map +1 -1
- package/es/FormModal/FormModal.d.mts +2 -2
- package/es/GuideCard/GuideCard.d.mts +2 -2
- package/es/Header/Header.d.mts +2 -2
- package/es/Highlighter/Highlighter.d.mts +2 -2
- package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
- package/es/Hotkey/Hotkey.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.mjs +13 -6
- package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
- package/es/Icon/Icon.d.mts +2 -2
- package/es/Icon/components/IconProvider.d.mts +3 -3
- package/es/Image/PreviewGroup.d.mts +2 -2
- package/es/ImageSelect/ImageSelect.d.mts +2 -2
- package/es/Input/Input.d.mts +2 -2
- package/es/Input/InputNumber.d.mts +2 -2
- package/es/Input/InputOPT.d.mts +2 -2
- package/es/Input/InputPassword.d.mts +2 -2
- package/es/Input/TextArea.d.mts +2 -2
- package/es/Layout/components/LayoutFooter.d.mts +2 -2
- package/es/Layout/components/LayoutHeader.d.mts +2 -2
- package/es/Layout/components/LayoutMain.d.mts +2 -2
- package/es/Layout/components/LayoutSidebar.d.mts +2 -2
- package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
- package/es/Layout/components/LayoutToc.d.mts +2 -2
- package/es/List/ListItem/index.d.mts +2 -2
- package/es/Markdown/Markdown.d.mts +2 -2
- package/es/Markdown/Typography.d.mts +2 -2
- package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
- package/es/MaskShadow/MaskShadow.d.mts +2 -2
- package/es/Menu/Menu.d.mts +2 -2
- package/es/Mermaid/Mermaid.d.mts +2 -2
- package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
- package/es/Modal/Modal.d.mts +2 -2
- package/es/MotionProvider/index.d.mts +15 -0
- package/es/MotionProvider/index.d.ts +1 -0
- package/es/MotionProvider/index.js +1 -0
- package/es/MotionProvider/index.mjs +22 -0
- package/es/MotionProvider/index.mjs.map +1 -0
- package/es/Provider.d.mts +2 -0
- package/es/SearchBar/SearchBar.d.mts +2 -2
- package/es/Segmented/Segmented.d.mts +2 -2
- package/es/Select/Select.d.mts +2 -2
- package/es/SideNav/SideNav.d.mts +2 -2
- package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
- package/es/SortableList/components/DragHandle.d.mts +2 -2
- package/es/SortableList/components/SortableItem.d.mts +2 -2
- package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
- package/es/ThemeProvider/ThemeProvider.mjs +11 -4
- package/es/ThemeProvider/ThemeProvider.mjs.map +1 -1
- package/es/ThemeProvider/type.d.mts +4 -0
- package/es/Toc/Toc.d.mts +2 -2
- package/es/Video/index.d.mts +2 -2
- package/es/_virtual/rolldown_runtime.mjs +18 -0
- package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
- package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
- package/es/awesome/Features/Features.d.mts +2 -2
- package/es/awesome/Giscus/Giscus.d.mts +2 -2
- package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
- package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
- package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
- package/es/awesome/Hero/Hero.d.mts +2 -2
- package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
- package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
- package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
- package/es/awesome/TypewriterEffect/TypewriterEffect.mjs +5 -4
- package/es/awesome/TypewriterEffect/TypewriterEffect.mjs.map +1 -1
- package/es/brand/BrandLoading/{style-CB0aumHV.css → style-Cof4dJBw.css} +1 -1
- package/es/brand/BrandLoading/{style-CB0aumHV.css.map → style-Cof4dJBw.css.map} +1 -1
- package/es/brand/LobeChat/index.d.mts +2 -2
- package/es/brand/LobeHub/index.d.mts +2 -2
- package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
- package/es/brand/LogoThree/index.d.mts +2 -2
- package/es/chat/BackBottom/BackBottom.d.mts +2 -2
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
- package/es/chat/ChatItem/ChatItem.d.mts +2 -2
- package/es/chat/ChatItem/ChatItem.mjs +8 -3
- package/es/chat/ChatItem/ChatItem.mjs.map +1 -1
- package/es/chat/ChatList/ChatList.d.mts +2 -2
- package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
- package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
- package/es/chat/EditableMessageList/EditableMessageList.mjs +17 -7
- package/es/chat/EditableMessageList/EditableMessageList.mjs.map +1 -1
- package/es/chat/EditableMessageList/type.d.mts +9 -0
- package/es/chat/MessageInput/MessageInput.d.mts +2 -2
- package/es/chat/MessageModal/MessageModal.d.mts +2 -2
- package/es/chat/MessageModal/MessageModal.mjs +27 -22
- package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
- package/es/chat/TokenTag/TokenTag.mjs +7 -1
- package/es/chat/TokenTag/TokenTag.mjs.map +1 -1
- package/es/color/ColorScales/index.d.mts +2 -2
- package/es/i18n/context.d.mts +17 -0
- package/es/i18n/context.mjs +18 -0
- package/es/i18n/context.mjs.map +1 -0
- package/es/i18n/index.d.mts +6 -0
- package/es/i18n/index.d.ts +1 -0
- package/es/i18n/index.js +1 -0
- package/es/i18n/index.mjs +6 -0
- package/es/i18n/resources/en/chat.d.mts +11 -0
- package/es/i18n/resources/en/chat.mjs +12 -0
- package/es/i18n/resources/en/chat.mjs.map +1 -0
- package/es/i18n/resources/en/common.d.mts +10 -0
- package/es/i18n/resources/en/common.mjs +11 -0
- package/es/i18n/resources/en/common.mjs.map +1 -0
- package/es/i18n/resources/en/editableMessage.d.mts +13 -0
- package/es/i18n/resources/en/editableMessage.mjs +14 -0
- package/es/i18n/resources/en/editableMessage.mjs.map +1 -0
- package/es/i18n/resources/en/emojiPicker.d.mts +12 -0
- package/es/i18n/resources/en/emojiPicker.mjs +13 -0
- package/es/i18n/resources/en/emojiPicker.mjs.map +1 -0
- package/es/i18n/resources/en/form.d.mts +10 -0
- package/es/i18n/resources/en/form.mjs +11 -0
- package/es/i18n/resources/en/form.mjs.map +1 -0
- package/es/i18n/resources/en/hotkey.d.mts +10 -0
- package/es/i18n/resources/en/hotkey.mjs +11 -0
- package/es/i18n/resources/en/hotkey.mjs.map +1 -0
- package/es/i18n/resources/en/index.d.mts +16 -0
- package/es/i18n/resources/en/index.mjs +25 -0
- package/es/i18n/resources/en/index.mjs.map +1 -0
- package/es/i18n/resources/en/messageModal.d.mts +9 -0
- package/es/i18n/resources/en/messageModal.mjs +10 -0
- package/es/i18n/resources/en/messageModal.mjs.map +1 -0
- package/es/i18n/resources/en/sideNav.d.mts +21 -0
- package/es/i18n/resources/en/sideNav.mjs +22 -0
- package/es/i18n/resources/en/sideNav.mjs.map +1 -0
- package/es/i18n/resources/index.d.mts +3 -0
- package/es/i18n/resources/index.mjs +4 -0
- package/es/i18n/resources/zhCn/chat.d.mts +11 -0
- package/es/i18n/resources/zhCn/chat.mjs +12 -0
- package/es/i18n/resources/zhCn/chat.mjs.map +1 -0
- package/es/i18n/resources/zhCn/common.d.mts +10 -0
- package/es/i18n/resources/zhCn/common.mjs +11 -0
- package/es/i18n/resources/zhCn/common.mjs.map +1 -0
- package/es/i18n/resources/zhCn/editableMessage.d.mts +13 -0
- package/es/i18n/resources/zhCn/editableMessage.mjs +14 -0
- package/es/i18n/resources/zhCn/editableMessage.mjs.map +1 -0
- package/es/i18n/resources/zhCn/emojiPicker.d.mts +12 -0
- package/es/i18n/resources/zhCn/emojiPicker.mjs +13 -0
- package/es/i18n/resources/zhCn/emojiPicker.mjs.map +1 -0
- package/es/i18n/resources/zhCn/form.d.mts +10 -0
- package/es/i18n/resources/zhCn/form.mjs +11 -0
- package/es/i18n/resources/zhCn/form.mjs.map +1 -0
- package/es/i18n/resources/zhCn/hotkey.d.mts +10 -0
- package/es/i18n/resources/zhCn/hotkey.mjs +11 -0
- package/es/i18n/resources/zhCn/hotkey.mjs.map +1 -0
- package/es/i18n/resources/zhCn/index.d.mts +16 -0
- package/es/i18n/resources/zhCn/index.mjs +25 -0
- package/es/i18n/resources/zhCn/index.mjs.map +1 -0
- package/es/i18n/resources/zhCn/messageModal.d.mts +9 -0
- package/es/i18n/resources/zhCn/messageModal.mjs +10 -0
- package/es/i18n/resources/zhCn/messageModal.mjs.map +1 -0
- package/es/i18n/resources/zhCn/sideNav.d.mts +21 -0
- package/es/i18n/resources/zhCn/sideNav.mjs +22 -0
- package/es/i18n/resources/zhCn/sideNav.mjs.map +1 -0
- package/es/i18n/types.d.mts +28 -0
- package/es/i18n/useTranslation.d.mts +10 -0
- package/es/i18n/useTranslation.mjs +22 -0
- package/es/i18n/useTranslation.mjs.map +1 -0
- package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
- package/es/icons/lucideExtra/CreateBotIcon.d.mts +3 -3
- package/es/icons/lucideExtra/DiscordIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GlobeOffIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GroupBotIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +3 -3
- package/es/icons/lucideExtra/LeftClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +2 -2
- package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +2 -2
- package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
- package/es/index.d.mts +5 -1
- package/es/index.mjs +4 -1
- package/es/mdx/Mdx/index.d.mts +2 -2
- package/es/mobile/TabBar/TabBar.d.mts +2 -2
- package/es/motion/LazyMotion.d.mts +2 -2
- package/es/storybook/StoryBook/index.d.mts +2 -2
- package/package.json +27 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { SpotlightCardProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react127 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/awesome/SpotlightCard/SpotlightCard.d.ts
|
|
5
|
-
declare const SpotlightCard:
|
|
5
|
+
declare const SpotlightCard: react127.NamedExoticComponent<SpotlightCardProps<any>>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { SpotlightCard };
|
|
8
8
|
//# sourceMappingURL=SpotlightCard.d.mts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { TypewriterEffectProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react128 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/awesome/TypewriterEffect/TypewriterEffect.d.ts
|
|
5
|
-
declare const TypewriterEffect:
|
|
5
|
+
declare const TypewriterEffect: react128.NamedExoticComponent<TypewriterEffectProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { TypewriterEffect };
|
|
8
8
|
//# sourceMappingURL=TypewriterEffect.d.mts.map
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { MotionComponent } from "../../MotionProvider/index.mjs";
|
|
3
4
|
import { useStyles } from "./style.mjs";
|
|
4
|
-
import { createElement, memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
+
import { createElement, memo, use, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
6
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
-
import { motion } from "motion/react";
|
|
7
7
|
|
|
8
8
|
//#region src/awesome/TypewriterEffect/TypewriterEffect.tsx
|
|
9
9
|
const TypewriterEffect = memo(({ sentences, as: Component = "div", typingSpeed = 100, initialDelay = 0, pauseDuration = 2e3, deletingSpeed = 50, deletePauseDuration = 0, loop = true, className = "", color, showCursor = true, hideCursorWhileTyping = false, cursorCharacter, cursorClassName = "", cursorColor, cursorBlinkDuration = .8, cursorFade = true, cursorStyle = "pipe", textColors = [], variableSpeed, onSentenceComplete, startOnVisible = false, reverseMode = false, segmentMode = "grapheme", ...props }) => {
|
|
10
|
+
const Motion = use(MotionComponent);
|
|
10
11
|
const { styles, cx } = useStyles();
|
|
11
12
|
const [displayedText, setDisplayedText] = useState("");
|
|
12
13
|
const [currentCharIndex, setCurrentCharIndex] = useState(0);
|
|
@@ -139,7 +140,7 @@ const TypewriterEffect = memo(({ sentences, as: Component = "div", typingSpeed =
|
|
|
139
140
|
}, /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
|
|
140
141
|
className: styles.text,
|
|
141
142
|
style: textColor ? { color: textColor } : void 0,
|
|
142
|
-
children: characters.map((char, index) => /* @__PURE__ */ jsx(
|
|
143
|
+
children: characters.map((char, index) => /* @__PURE__ */ jsx(Motion.span, {
|
|
143
144
|
animate: { opacity: 1 },
|
|
144
145
|
initial: { opacity: 0 },
|
|
145
146
|
style: { display: "inline-block" },
|
|
@@ -149,7 +150,7 @@ const TypewriterEffect = memo(({ sentences, as: Component = "div", typingSpeed =
|
|
|
149
150
|
},
|
|
150
151
|
children: char === " " ? "\xA0" : char
|
|
151
152
|
}, `${currentTextIndex}-${index}`))
|
|
152
|
-
}), showCursor && (cursorFade ? /* @__PURE__ */ jsx(
|
|
153
|
+
}), showCursor && (cursorFade ? /* @__PURE__ */ jsx(Motion.span, {
|
|
153
154
|
animate: { opacity: shouldHideCursor ? 0 : 1 },
|
|
154
155
|
className: cx(getCursorStyle(), cursorClassName),
|
|
155
156
|
initial: { opacity: 0 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypewriterEffect.mjs","names":["timeout: ReturnType<typeof setTimeout>"],"sources":["../../../src/awesome/TypewriterEffect/TypewriterEffect.tsx"],"sourcesContent":["'use client';\n\nimport { motion } from 'motion/react';\nimport { createElement, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useStyles } from './style';\nimport type { TypewriterEffectProps } from './type';\n\nconst TypewriterEffect = memo<TypewriterEffectProps>(\n ({\n sentences,\n as: Component = 'div',\n typingSpeed = 100,\n initialDelay = 0,\n pauseDuration = 2000,\n deletingSpeed = 50,\n deletePauseDuration = 0,\n loop = true,\n className = '',\n color,\n showCursor = true,\n hideCursorWhileTyping = false,\n cursorCharacter,\n cursorClassName = '',\n cursorColor,\n cursorBlinkDuration = 0.8,\n cursorFade = true,\n cursorStyle = 'pipe',\n textColors = [],\n variableSpeed,\n onSentenceComplete,\n startOnVisible = false,\n reverseMode = false,\n segmentMode = 'grapheme',\n ...props\n }: TypewriterEffectProps) => {\n const { styles, cx } = useStyles();\n const [displayedText, setDisplayedText] = useState('');\n const [currentCharIndex, setCurrentCharIndex] = useState(0);\n const [isDeleting, setIsDeleting] = useState(false);\n const [currentTextIndex, setCurrentTextIndex] = useState(0);\n const [isVisible, setIsVisible] = useState(!startOnVisible);\n const [isDeletePausing, setIsDeletePausing] = useState(false);\n const containerRef = useRef<HTMLElement>(null);\n\n const textArray = useMemo(\n () => (Array.isArray(sentences) ? sentences : [sentences]),\n [sentences],\n );\n\n // Helper function to split text based on segment mode\n const splitText = useCallback(\n (text: string): string[] => {\n // Use Intl.Segmenter if available\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n const segmenter = new Intl.Segmenter(undefined, { granularity: segmentMode });\n return Array.from(segmenter.segment(text), (segment) => segment.segment);\n }\n\n // Fallback when Intl.Segmenter is not available\n if (segmentMode === 'word') {\n // Simple word splitting fallback\n return text.split(/(\\s+)/).filter(Boolean);\n }\n\n // Grapheme fallback\n return Array.from(text);\n },\n [segmentMode],\n );\n\n const getRandomSpeed = useCallback(() => {\n if (!variableSpeed) return typingSpeed;\n const { min, max } = variableSpeed;\n return Math.random() * (max - min) + min;\n }, [variableSpeed, typingSpeed]);\n\n const getCurrentTextColor = () => {\n if (textColors.length > 0) {\n return textColors[currentTextIndex % textColors.length];\n }\n return color;\n };\n\n const getCurrentCursorColor = () => {\n return cursorColor || color;\n };\n\n useEffect(() => {\n if (!startOnVisible || !containerRef.current) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n }\n });\n },\n { threshold: 0.1 },\n );\n\n observer.observe(containerRef.current);\n\n return () => observer.disconnect();\n }, [startOnVisible]);\n\n useEffect(() => {\n if (!isVisible) return;\n\n let timeout: ReturnType<typeof setTimeout>;\n\n const currentText = textArray[currentTextIndex];\n // Split text based on segment mode\n const textSegments = splitText(currentText);\n const processedText = reverseMode ? textSegments.reverse().join('') : currentText;\n\n // Handle delete pause state\n if (isDeletePausing) {\n timeout = setTimeout(() => {\n setIsDeletePausing(false);\n }, deletePauseDuration);\n return () => clearTimeout(timeout);\n }\n\n const executeTypingAnimation = () => {\n if (isDeleting) {\n if (displayedText === '') {\n setIsDeleting(false);\n if (currentTextIndex === textArray.length - 1 && !loop) {\n return;\n }\n if (onSentenceComplete) {\n onSentenceComplete(textArray[currentTextIndex], currentTextIndex);\n }\n setCurrentTextIndex((prev) => (prev + 1) % textArray.length);\n setCurrentCharIndex(0);\n\n if (deletePauseDuration > 0) {\n setIsDeletePausing(true);\n return;\n }\n } else {\n timeout = setTimeout(() => {\n setDisplayedText((prev) => {\n const segments = splitText(prev);\n return segments.slice(0, -1).join('');\n });\n }, deletingSpeed);\n }\n } else {\n const processedSegments = splitText(processedText);\n if (currentCharIndex < processedSegments.length) {\n timeout = setTimeout(\n () => {\n setDisplayedText((prev) => prev + processedSegments[currentCharIndex]);\n setCurrentCharIndex((prev) => prev + 1);\n },\n variableSpeed ? getRandomSpeed() : typingSpeed,\n );\n } else if (textArray.length >= 1) {\n if (!loop && currentTextIndex === textArray.length - 1) return;\n\n timeout = setTimeout(() => {\n setIsDeleting(true);\n }, pauseDuration);\n }\n }\n };\n\n if (currentCharIndex === 0 && !isDeleting && displayedText === '') {\n timeout = setTimeout(executeTypingAnimation, initialDelay);\n } else {\n executeTypingAnimation();\n }\n\n return () => clearTimeout(timeout);\n }, [\n currentCharIndex,\n displayedText,\n isDeleting,\n isDeletePausing,\n typingSpeed,\n deletingSpeed,\n deletePauseDuration,\n pauseDuration,\n textArray,\n currentTextIndex,\n loop,\n initialDelay,\n isVisible,\n reverseMode,\n variableSpeed,\n onSentenceComplete,\n getRandomSpeed,\n splitText,\n ]);\n\n const getCursorStyle = () => {\n if (cursorCharacter) return styles.cursorCustom;\n\n switch (cursorStyle) {\n case 'block': {\n return styles.cursorBlock;\n }\n case 'dot': {\n return styles.cursorDot;\n }\n case 'underscore': {\n return styles.cursorUnderscore;\n }\n case 'pipe': {\n return styles.cursor;\n }\n }\n };\n\n const currentTextLength = splitText(textArray[currentTextIndex]).length;\n const isTyping = currentCharIndex < currentTextLength && !isDeleting;\n const isAfterTyping = currentCharIndex === currentTextLength && !isDeleting;\n\n const shouldHideCursor = (() => {\n if (hideCursorWhileTyping === true) return true; // 完全隐藏\n if (hideCursorWhileTyping === 'typing') return isTyping || isDeleting; // 打字和删除时隐藏\n if (hideCursorWhileTyping === 'afterTyping') return isAfterTyping; // 打字完成后隐藏\n return false;\n })();\n\n const textColor = getCurrentTextColor();\n const finalCursorColor = getCurrentCursorColor();\n\n // Split displayed text for animation\n const characters = splitText(displayedText);\n\n return createElement(\n Component,\n {\n className: cx(styles.container, className),\n ref: containerRef,\n ...props,\n },\n <>\n <span className={styles.text} style={textColor ? { color: textColor } : undefined}>\n {characters.map((char, index) => (\n <motion.span\n animate={{ opacity: 1 }}\n initial={{ opacity: 0 }}\n key={`${currentTextIndex}-${index}`}\n style={{ display: 'inline-block' }}\n transition={{\n duration: typingSpeed / 500,\n ease: 'easeInOut',\n }}\n >\n {char === ' ' ? '\\u00A0' : char}\n </motion.span>\n ))}\n </span>\n {showCursor &&\n (cursorFade ? (\n <motion.span\n animate={{ opacity: shouldHideCursor ? 0 : 1 }}\n className={cx(getCursorStyle(), cursorClassName)}\n initial={{ opacity: 0 }}\n style={finalCursorColor ? { backgroundColor: finalCursorColor } : undefined}\n transition={{\n duration: shouldHideCursor ? 0.2 : cursorBlinkDuration,\n ease: 'easeInOut',\n repeat: shouldHideCursor ? 0 : Number.POSITIVE_INFINITY,\n repeatType: 'reverse',\n }}\n >\n {cursorCharacter}\n </motion.span>\n ) : (\n <span\n className={cx(getCursorStyle(), cursorClassName)}\n style={{\n backgroundColor: finalCursorColor,\n opacity: shouldHideCursor ? 0 : 1,\n }}\n >\n {cursorCharacter}\n </span>\n ))}\n </>,\n );\n },\n);\n\nTypewriterEffect.displayName = 'TypewriterEffect';\n\nexport default TypewriterEffect;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TypewriterEffect.mjs","names":["timeout: ReturnType<typeof setTimeout>"],"sources":["../../../src/awesome/TypewriterEffect/TypewriterEffect.tsx"],"sourcesContent":["'use client';\n\nimport { createElement, memo, use, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { MotionComponent } from '@/MotionProvider';\n\nimport { useStyles } from './style';\nimport type { TypewriterEffectProps } from './type';\n\nconst TypewriterEffect = memo<TypewriterEffectProps>(\n ({\n sentences,\n as: Component = 'div',\n typingSpeed = 100,\n initialDelay = 0,\n pauseDuration = 2000,\n deletingSpeed = 50,\n deletePauseDuration = 0,\n loop = true,\n className = '',\n color,\n showCursor = true,\n hideCursorWhileTyping = false,\n cursorCharacter,\n cursorClassName = '',\n cursorColor,\n cursorBlinkDuration = 0.8,\n cursorFade = true,\n cursorStyle = 'pipe',\n textColors = [],\n variableSpeed,\n onSentenceComplete,\n startOnVisible = false,\n reverseMode = false,\n segmentMode = 'grapheme',\n ...props\n }: TypewriterEffectProps) => {\n const Motion = use(MotionComponent);\n const { styles, cx } = useStyles();\n const [displayedText, setDisplayedText] = useState('');\n const [currentCharIndex, setCurrentCharIndex] = useState(0);\n const [isDeleting, setIsDeleting] = useState(false);\n const [currentTextIndex, setCurrentTextIndex] = useState(0);\n const [isVisible, setIsVisible] = useState(!startOnVisible);\n const [isDeletePausing, setIsDeletePausing] = useState(false);\n const containerRef = useRef<HTMLElement>(null);\n\n const textArray = useMemo(\n () => (Array.isArray(sentences) ? sentences : [sentences]),\n [sentences],\n );\n\n // Helper function to split text based on segment mode\n const splitText = useCallback(\n (text: string): string[] => {\n // Use Intl.Segmenter if available\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n const segmenter = new Intl.Segmenter(undefined, { granularity: segmentMode });\n return Array.from(segmenter.segment(text), (segment) => segment.segment);\n }\n\n // Fallback when Intl.Segmenter is not available\n if (segmentMode === 'word') {\n // Simple word splitting fallback\n return text.split(/(\\s+)/).filter(Boolean);\n }\n\n // Grapheme fallback\n return Array.from(text);\n },\n [segmentMode],\n );\n\n const getRandomSpeed = useCallback(() => {\n if (!variableSpeed) return typingSpeed;\n const { min, max } = variableSpeed;\n return Math.random() * (max - min) + min;\n }, [variableSpeed, typingSpeed]);\n\n const getCurrentTextColor = () => {\n if (textColors.length > 0) {\n return textColors[currentTextIndex % textColors.length];\n }\n return color;\n };\n\n const getCurrentCursorColor = () => {\n return cursorColor || color;\n };\n\n useEffect(() => {\n if (!startOnVisible || !containerRef.current) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n }\n });\n },\n { threshold: 0.1 },\n );\n\n observer.observe(containerRef.current);\n\n return () => observer.disconnect();\n }, [startOnVisible]);\n\n useEffect(() => {\n if (!isVisible) return;\n\n let timeout: ReturnType<typeof setTimeout>;\n\n const currentText = textArray[currentTextIndex];\n // Split text based on segment mode\n const textSegments = splitText(currentText);\n const processedText = reverseMode ? textSegments.reverse().join('') : currentText;\n\n // Handle delete pause state\n if (isDeletePausing) {\n timeout = setTimeout(() => {\n setIsDeletePausing(false);\n }, deletePauseDuration);\n return () => clearTimeout(timeout);\n }\n\n const executeTypingAnimation = () => {\n if (isDeleting) {\n if (displayedText === '') {\n setIsDeleting(false);\n if (currentTextIndex === textArray.length - 1 && !loop) {\n return;\n }\n if (onSentenceComplete) {\n onSentenceComplete(textArray[currentTextIndex], currentTextIndex);\n }\n setCurrentTextIndex((prev) => (prev + 1) % textArray.length);\n setCurrentCharIndex(0);\n\n if (deletePauseDuration > 0) {\n setIsDeletePausing(true);\n return;\n }\n } else {\n timeout = setTimeout(() => {\n setDisplayedText((prev) => {\n const segments = splitText(prev);\n return segments.slice(0, -1).join('');\n });\n }, deletingSpeed);\n }\n } else {\n const processedSegments = splitText(processedText);\n if (currentCharIndex < processedSegments.length) {\n timeout = setTimeout(\n () => {\n setDisplayedText((prev) => prev + processedSegments[currentCharIndex]);\n setCurrentCharIndex((prev) => prev + 1);\n },\n variableSpeed ? getRandomSpeed() : typingSpeed,\n );\n } else if (textArray.length >= 1) {\n if (!loop && currentTextIndex === textArray.length - 1) return;\n\n timeout = setTimeout(() => {\n setIsDeleting(true);\n }, pauseDuration);\n }\n }\n };\n\n if (currentCharIndex === 0 && !isDeleting && displayedText === '') {\n timeout = setTimeout(executeTypingAnimation, initialDelay);\n } else {\n executeTypingAnimation();\n }\n\n return () => clearTimeout(timeout);\n }, [\n currentCharIndex,\n displayedText,\n isDeleting,\n isDeletePausing,\n typingSpeed,\n deletingSpeed,\n deletePauseDuration,\n pauseDuration,\n textArray,\n currentTextIndex,\n loop,\n initialDelay,\n isVisible,\n reverseMode,\n variableSpeed,\n onSentenceComplete,\n getRandomSpeed,\n splitText,\n ]);\n\n const getCursorStyle = () => {\n if (cursorCharacter) return styles.cursorCustom;\n\n switch (cursorStyle) {\n case 'block': {\n return styles.cursorBlock;\n }\n case 'dot': {\n return styles.cursorDot;\n }\n case 'underscore': {\n return styles.cursorUnderscore;\n }\n case 'pipe': {\n return styles.cursor;\n }\n }\n };\n\n const currentTextLength = splitText(textArray[currentTextIndex]).length;\n const isTyping = currentCharIndex < currentTextLength && !isDeleting;\n const isAfterTyping = currentCharIndex === currentTextLength && !isDeleting;\n\n const shouldHideCursor = (() => {\n if (hideCursorWhileTyping === true) return true; // 完全隐藏\n if (hideCursorWhileTyping === 'typing') return isTyping || isDeleting; // 打字和删除时隐藏\n if (hideCursorWhileTyping === 'afterTyping') return isAfterTyping; // 打字完成后隐藏\n return false;\n })();\n\n const textColor = getCurrentTextColor();\n const finalCursorColor = getCurrentCursorColor();\n\n // Split displayed text for animation\n const characters = splitText(displayedText);\n\n return createElement(\n Component,\n {\n className: cx(styles.container, className),\n ref: containerRef,\n ...props,\n },\n <>\n <span className={styles.text} style={textColor ? { color: textColor } : undefined}>\n {characters.map((char, index) => (\n <Motion.span\n animate={{ opacity: 1 }}\n initial={{ opacity: 0 }}\n key={`${currentTextIndex}-${index}`}\n style={{ display: 'inline-block' }}\n transition={{\n duration: typingSpeed / 500,\n ease: 'easeInOut',\n }}\n >\n {char === ' ' ? '\\u00A0' : char}\n </Motion.span>\n ))}\n </span>\n {showCursor &&\n (cursorFade ? (\n <Motion.span\n animate={{ opacity: shouldHideCursor ? 0 : 1 }}\n className={cx(getCursorStyle(), cursorClassName)}\n initial={{ opacity: 0 }}\n style={finalCursorColor ? { backgroundColor: finalCursorColor } : undefined}\n transition={{\n duration: shouldHideCursor ? 0.2 : cursorBlinkDuration,\n ease: 'easeInOut',\n repeat: shouldHideCursor ? 0 : Number.POSITIVE_INFINITY,\n repeatType: 'reverse',\n }}\n >\n {cursorCharacter}\n </Motion.span>\n ) : (\n <span\n className={cx(getCursorStyle(), cursorClassName)}\n style={{\n backgroundColor: finalCursorColor,\n opacity: shouldHideCursor ? 0 : 1,\n }}\n >\n {cursorCharacter}\n </span>\n ))}\n </>,\n );\n },\n);\n\nTypewriterEffect.displayName = 'TypewriterEffect';\n\nexport default TypewriterEffect;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style-
|
|
1
|
+
{"version":3,"file":"style-Cof4dJBw.css","names":[],"sources":["../../../src/brand/BrandLoading/style.css"],"sourcesContent":["@keyframes draw {\n 0% {\n stroke-dashoffset: 1000;\n }\n\n 100% {\n stroke-dashoffset: 0;\n }\n}\n\n@keyframes fill {\n 30% {\n fill-opacity: 5%;\n }\n\n 100% {\n fill-opacity: 100%;\n }\n}\n\n.lobe-brand-loading path {\n fill: currentcolor;\n fill-opacity: 0%;\n stroke: currentcolor;\n stroke-dasharray: 1000;\n stroke-dashoffset: 1000;\n stroke-width: 0.25em;\n\n animation:\n draw 2s cubic-bezier(0.4, 0, 0.2, 1) infinite,\n fill 2s cubic-bezier(0.4, 0, 0.2, 1) infinite;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DivProps } from "../../types/index.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react46 from "react";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
//#region src/brand/LobeChat/index.d.ts
|
|
@@ -8,7 +8,7 @@ interface LobeChatProps extends DivProps {
|
|
|
8
8
|
size?: number;
|
|
9
9
|
type?: '3d' | 'flat' | 'mono' | 'text' | 'combine';
|
|
10
10
|
}
|
|
11
|
-
declare const LobeChat:
|
|
11
|
+
declare const LobeChat: react46.NamedExoticComponent<LobeChatProps>;
|
|
12
12
|
//#endregion
|
|
13
13
|
export { LobeChat, LobeChatProps };
|
|
14
14
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DivProps } from "../../types/index.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react48 from "react";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
//#region src/brand/LobeHub/index.d.ts
|
|
@@ -8,7 +8,7 @@ interface LobeHubProps extends DivProps {
|
|
|
8
8
|
size?: number;
|
|
9
9
|
type?: '3d' | 'flat' | 'mono' | 'text' | 'combine';
|
|
10
10
|
}
|
|
11
|
-
declare const LobeHub:
|
|
11
|
+
declare const LobeHub: react48.NamedExoticComponent<LobeHubProps>;
|
|
12
12
|
//#endregion
|
|
13
13
|
export { LobeHub, LobeHubProps };
|
|
14
14
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SplineProps } from "../../awesome/Spline/type.mjs";
|
|
2
2
|
import "../../awesome/Spline/index.mjs";
|
|
3
|
-
import * as
|
|
3
|
+
import * as react47 from "react";
|
|
4
4
|
import { CSSProperties } from "react";
|
|
5
5
|
|
|
6
6
|
//#region src/brand/LogoThree/LogoSpline.d.ts
|
|
@@ -10,7 +10,7 @@ interface LogoSplineProps extends Partial<SplineProps> {
|
|
|
10
10
|
style?: CSSProperties;
|
|
11
11
|
width?: number | string;
|
|
12
12
|
}
|
|
13
|
-
declare const LogoSpline:
|
|
13
|
+
declare const LogoSpline: react47.NamedExoticComponent<LogoSplineProps>;
|
|
14
14
|
//#endregion
|
|
15
15
|
export { LogoSpline, LogoSplineProps };
|
|
16
16
|
//# sourceMappingURL=LogoSpline.d.mts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SplineProps } from "../../awesome/Spline/type.mjs";
|
|
2
2
|
import "../../awesome/Spline/index.mjs";
|
|
3
|
-
import * as
|
|
3
|
+
import * as react49 from "react";
|
|
4
4
|
import { CSSProperties } from "react";
|
|
5
5
|
|
|
6
6
|
//#region src/brand/LogoThree/index.d.ts
|
|
@@ -9,7 +9,7 @@ interface LogoThreeProps extends Partial<SplineProps> {
|
|
|
9
9
|
size?: number;
|
|
10
10
|
style?: CSSProperties;
|
|
11
11
|
}
|
|
12
|
-
declare const LogoThree:
|
|
12
|
+
declare const LogoThree: react49.NamedExoticComponent<LogoThreeProps>;
|
|
13
13
|
//#endregion
|
|
14
14
|
export { LogoThree, LogoThreeProps };
|
|
15
15
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BackBottomProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react109 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/chat/BackBottom/BackBottom.d.ts
|
|
5
|
-
declare const BackBottom:
|
|
5
|
+
declare const BackBottom: react109.NamedExoticComponent<BackBottomProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { BackBottom };
|
|
8
8
|
//# sourceMappingURL=BackBottom.d.mts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ChatInputAreaInnerProps } from "../type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react113 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/chat/ChatInputArea/components/ChatInputAreaInner.d.ts
|
|
5
|
-
declare const ChatInputAreaInner:
|
|
5
|
+
declare const ChatInputAreaInner: react113.NamedExoticComponent<ChatInputAreaInnerProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { ChatInputAreaInner };
|
|
8
8
|
//# sourceMappingURL=ChatInputAreaInner.d.mts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ChatItemProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react107 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/chat/ChatItem/ChatItem.d.ts
|
|
5
|
-
declare const ChatItem:
|
|
5
|
+
declare const ChatItem: react107.NamedExoticComponent<ChatItemProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { ChatItem };
|
|
8
8
|
//# sourceMappingURL=ChatItem.d.mts.map
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import FlexBasic_default from "../../Flex/FlexBasic.mjs";
|
|
4
|
+
import { useTranslation } from "../../i18n/useTranslation.mjs";
|
|
5
|
+
import chat_default from "../../i18n/resources/en/chat.mjs";
|
|
4
6
|
import { useStyles } from "./style.mjs";
|
|
5
7
|
import Actions_default from "./components/Actions.mjs";
|
|
6
8
|
import Avatar_default from "./components/Avatar.mjs";
|
|
@@ -14,8 +16,9 @@ import { useResponsive } from "antd-style";
|
|
|
14
16
|
|
|
15
17
|
//#region src/chat/ChatItem/ChatItem.tsx
|
|
16
18
|
const MOBILE_AVATAR_SIZE = 32;
|
|
17
|
-
const ChatItem = memo(({ avatarAddon, onAvatarClick, avatarProps, actions, className, primary, loading, message, placeholderMessage
|
|
19
|
+
const ChatItem = memo(({ avatarAddon, onAvatarClick, avatarProps, actions, className, primary, loading, message, placeholderMessage, placement = "left", variant = "bubble", avatar, error, showTitle, time, editing, onChange, onEditingChange, messageExtra, renderMessage, text, errorMessage, onDoubleClick, fontSize, aboveMessage, belowMessage, markdownProps, actionsWrapWidth = 54, showAvatar = true, titleAddon, ...rest }) => {
|
|
18
20
|
const { mobile } = useResponsive();
|
|
21
|
+
const { t } = useTranslation(chat_default);
|
|
19
22
|
const { cx: cx$1, styles } = useStyles({
|
|
20
23
|
editing,
|
|
21
24
|
placement,
|
|
@@ -25,6 +28,8 @@ const ChatItem = memo(({ avatarAddon, onAvatarClick, avatarProps, actions, class
|
|
|
25
28
|
title: avatar.title,
|
|
26
29
|
variant
|
|
27
30
|
});
|
|
31
|
+
const placeholderText = placeholderMessage ?? t("chat.placeholder");
|
|
32
|
+
const avatarAlt = avatarProps?.alt || avatar.title || t("chat.avatar");
|
|
28
33
|
const contentRef = useRef(null);
|
|
29
34
|
const containerRef = useRef(null);
|
|
30
35
|
const [layoutMode, setLayoutMode] = useState(variant === "bubble" ? "horizontal" : "vertical");
|
|
@@ -53,7 +58,7 @@ const ChatItem = memo(({ avatarAddon, onAvatarClick, avatarProps, actions, class
|
|
|
53
58
|
showAvatar && /* @__PURE__ */ jsx(Avatar_default, {
|
|
54
59
|
...avatarProps,
|
|
55
60
|
addon: avatarAddon,
|
|
56
|
-
alt:
|
|
61
|
+
alt: avatarAlt,
|
|
57
62
|
avatar,
|
|
58
63
|
loading,
|
|
59
64
|
onClick: onAvatarClick,
|
|
@@ -86,7 +91,7 @@ const ChatItem = memo(({ avatarAddon, onAvatarClick, avatarProps, actions, class
|
|
|
86
91
|
children: [/* @__PURE__ */ jsx(FlexBasic_default, {
|
|
87
92
|
ref: contentRef,
|
|
88
93
|
width: "100%",
|
|
89
|
-
children: error && (message ===
|
|
94
|
+
children: error && (message === placeholderText || !message) ? /* @__PURE__ */ jsx(ErrorContent_default, {
|
|
90
95
|
error,
|
|
91
96
|
message: errorMessage,
|
|
92
97
|
placement
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatItem.mjs","names":["Flexbox","cx","Avatar","Title","ErrorContent","MessageContent","Actions","BorderSpacing"],"sources":["../../../src/chat/ChatItem/ChatItem.tsx"],"sourcesContent":["'use client';\n\nimport { useResponsive } from 'antd-style';\nimport { memo, useEffect, useRef, useState } from 'react';\n\nimport { Flexbox } from '@/Flex';\n\nimport Actions from './components/Actions';\nimport Avatar from './components/Avatar';\nimport BorderSpacing from './components/BorderSpacing';\nimport ErrorContent from './components/ErrorContent';\nimport MessageContent from './components/MessageContent';\nimport Title from './components/Title';\nimport { useStyles } from './style';\nimport type { ChatItemProps } from './type';\n\nconst MOBILE_AVATAR_SIZE = 32;\n\nconst ChatItem = memo<ChatItemProps>(\n ({\n avatarAddon,\n onAvatarClick,\n avatarProps,\n actions,\n className,\n primary,\n loading,\n message,\n placeholderMessage
|
|
1
|
+
{"version":3,"file":"ChatItem.mjs","names":["chatMessages","Flexbox","cx","Avatar","Title","ErrorContent","MessageContent","Actions","BorderSpacing"],"sources":["../../../src/chat/ChatItem/ChatItem.tsx"],"sourcesContent":["'use client';\n\nimport { useResponsive } from 'antd-style';\nimport { memo, useEffect, useRef, useState } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport chatMessages from '@/i18n/resources/en/chat';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport Actions from './components/Actions';\nimport Avatar from './components/Avatar';\nimport BorderSpacing from './components/BorderSpacing';\nimport ErrorContent from './components/ErrorContent';\nimport MessageContent from './components/MessageContent';\nimport Title from './components/Title';\nimport { useStyles } from './style';\nimport type { ChatItemProps } from './type';\n\nconst MOBILE_AVATAR_SIZE = 32;\n\nconst ChatItem = memo<ChatItemProps>(\n ({\n avatarAddon,\n onAvatarClick,\n avatarProps,\n actions,\n className,\n primary,\n loading,\n message,\n placeholderMessage,\n placement = 'left',\n variant = 'bubble',\n avatar,\n error,\n showTitle,\n time,\n editing,\n onChange,\n onEditingChange,\n messageExtra,\n renderMessage,\n text,\n errorMessage,\n onDoubleClick,\n fontSize,\n aboveMessage,\n belowMessage,\n markdownProps,\n actionsWrapWidth = 54,\n showAvatar = true,\n titleAddon,\n ...rest\n }) => {\n const { mobile } = useResponsive();\n const { t } = useTranslation(chatMessages);\n const { cx, styles } = useStyles({\n editing,\n placement,\n primary,\n showTitle,\n time,\n title: avatar.title,\n variant,\n });\n const placeholderText = placeholderMessage ?? t('chat.placeholder');\n const avatarAlt = avatarProps?.alt || avatar.title || t('chat.avatar');\n\n // 在 ChatItem 组件中添加\n const contentRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [layoutMode, setLayoutMode] = useState<'horizontal' | 'vertical'>(\n variant === 'bubble' ? 'horizontal' : 'vertical',\n );\n\n // 使用 ResizeObserver 监控内容和容器尺寸\n useEffect(() => {\n if (variant === 'docs') {\n setLayoutMode('vertical');\n return;\n }\n\n if (!contentRef.current || !containerRef.current) return;\n\n const observer = new ResizeObserver(() => {\n if (!contentRef.current || !containerRef.current) return;\n\n const containerWidth = containerRef.current.clientWidth;\n const contentWidth = contentRef.current.scrollWidth; // 使用scrollWidth获取实际内容宽度\n\n // 预留给Actions的最小空间 (根据实际Actions大小调整)\n\n // 只有当内容宽度 + Actions最小宽度 > 容器宽度时才切换布局\n setLayoutMode(contentWidth + actionsWrapWidth > containerWidth ? 'vertical' : 'horizontal');\n });\n\n observer.observe(contentRef.current);\n observer.observe(containerRef.current);\n\n return () => observer.disconnect();\n }, [variant, actionsWrapWidth]);\n\n return (\n <Flexbox\n className={cx(styles.container, className)}\n direction={placement === 'left' ? 'horizontal' : 'horizontal-reverse'}\n gap={mobile ? 6 : 12}\n {...rest}\n >\n {showAvatar && (\n <Avatar\n {...avatarProps}\n addon={avatarAddon}\n alt={avatarAlt}\n avatar={avatar}\n loading={loading}\n onClick={onAvatarClick}\n placement={placement}\n size={mobile ? MOBILE_AVATAR_SIZE : undefined}\n style={{\n marginTop: showTitle ? -12 : 6,\n ...avatarProps?.style,\n }}\n />\n )}\n <Flexbox\n align={placement === 'left' ? 'flex-start' : 'flex-end'}\n className={styles.messageContainer}\n ref={containerRef}\n >\n <Title\n avatar={avatar}\n placement={placement}\n showTitle={showTitle}\n time={time}\n titleAddon={titleAddon}\n />\n {aboveMessage}\n <Flexbox\n align={placement === 'left' ? 'flex-start' : 'flex-end'}\n className={styles.messageContent}\n data-layout={layoutMode} // 添加数据属性以方便样式选择\n direction={\n layoutMode === 'horizontal'\n ? placement === 'left'\n ? 'horizontal'\n : 'horizontal-reverse'\n : 'vertical'\n }\n gap={8}\n >\n <Flexbox ref={contentRef} width={'100%'}>\n {error && (message === placeholderText || !message) ? (\n <ErrorContent error={error} message={errorMessage} placement={placement} />\n ) : (\n <MessageContent\n editing={editing}\n fontSize={fontSize}\n markdownProps={markdownProps}\n message={message}\n messageExtra={\n <>\n {error && (\n <ErrorContent error={error} message={errorMessage} placement={placement} />\n )}\n {messageExtra}\n </>\n }\n onChange={onChange}\n onDoubleClick={onDoubleClick}\n onEditingChange={onEditingChange}\n placement={placement}\n primary={primary}\n renderMessage={renderMessage}\n text={text}\n variant={variant}\n />\n )}\n </Flexbox>\n {actions && (\n <Actions\n actions={actions}\n editing={editing}\n placement={placement}\n variant={variant}\n />\n )}\n </Flexbox>\n {belowMessage}\n </Flexbox>\n {mobile && variant === 'bubble' && showAvatar && (\n <BorderSpacing borderSpacing={MOBILE_AVATAR_SIZE} />\n )}\n </Flexbox>\n );\n },\n);\n\nexport default ChatItem;\n\nexport type { ChatItemProps } from './type';\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAM,qBAAqB;AAE3B,MAAM,WAAW,MACd,EACC,aACA,eACA,aACA,SACA,WACA,SACA,SACA,SACA,oBACA,YAAY,QACZ,UAAU,UACV,QACA,OACA,WACA,MACA,SACA,UACA,iBACA,cACA,eACA,MACA,cACA,eACA,UACA,cACA,cACA,eACA,mBAAmB,IACnB,aAAa,MACb,YACA,GAAG,WACC;CACJ,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,EAAE,MAAM,eAAeA,aAAa;CAC1C,MAAM,EAAE,UAAI,WAAW,UAAU;EAC/B;EACA;EACA;EACA;EACA;EACA,OAAO,OAAO;EACd;EACD,CAAC;CACF,MAAM,kBAAkB,sBAAsB,EAAE,mBAAmB;CACnE,MAAM,YAAY,aAAa,OAAO,OAAO,SAAS,EAAE,cAAc;CAGtE,MAAM,aAAa,OAAuB,KAAK;CAC/C,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,CAAC,YAAY,iBAAiB,SAClC,YAAY,WAAW,eAAe,WACvC;AAGD,iBAAgB;AACd,MAAI,YAAY,QAAQ;AACtB,iBAAc,WAAW;AACzB;;AAGF,MAAI,CAAC,WAAW,WAAW,CAAC,aAAa,QAAS;EAElD,MAAM,WAAW,IAAI,qBAAqB;AACxC,OAAI,CAAC,WAAW,WAAW,CAAC,aAAa,QAAS;GAElD,MAAM,iBAAiB,aAAa,QAAQ;GAC5C,MAAM,eAAe,WAAW,QAAQ;AAKxC,iBAAc,eAAe,mBAAmB,iBAAiB,aAAa,aAAa;IAC3F;AAEF,WAAS,QAAQ,WAAW,QAAQ;AACpC,WAAS,QAAQ,aAAa,QAAQ;AAEtC,eAAa,SAAS,YAAY;IACjC,CAAC,SAAS,iBAAiB,CAAC;AAE/B,QACE,qBAACC;EACC,WAAWC,KAAG,OAAO,WAAW,UAAU;EAC1C,WAAW,cAAc,SAAS,eAAe;EACjD,KAAK,SAAS,IAAI;EAClB,GAAI;;GAEH,cACC,oBAACC;IACC,GAAI;IACJ,OAAO;IACP,KAAK;IACG;IACC;IACT,SAAS;IACE;IACX,MAAM,SAAS,qBAAqB;IACpC,OAAO;KACL,WAAW,YAAY,MAAM;KAC7B,GAAG,aAAa;KACjB;KACD;GAEJ,qBAACF;IACC,OAAO,cAAc,SAAS,eAAe;IAC7C,WAAW,OAAO;IAClB,KAAK;;KAEL,oBAACG;MACS;MACG;MACA;MACL;MACM;OACZ;KACD;KACD,qBAACH;MACC,OAAO,cAAc,SAAS,eAAe;MAC7C,WAAW,OAAO;MAClB,eAAa;MACb,WACE,eAAe,eACX,cAAc,SACZ,eACA,uBACF;MAEN,KAAK;iBAEL,oBAACA;OAAQ,KAAK;OAAY,OAAO;iBAC9B,UAAU,YAAY,mBAAmB,CAAC,WACzC,oBAACI;QAAoB;QAAO,SAAS;QAAyB;SAAa,GAE3E,oBAACC;QACU;QACC;QACK;QACN;QACT,cACE,8CACG,SACC,oBAACD;SAAoB;SAAO,SAAS;SAAyB;UAAa,EAE5E,gBACA;QAEK;QACK;QACE;QACN;QACF;QACM;QACT;QACG;SACT;QAEI,EACT,WACC,oBAACE;OACU;OACA;OACE;OACF;QACT;OAEI;KACT;;KACO;GACT,UAAU,YAAY,YAAY,cACjC,oBAACC,yBAAc,eAAe,qBAAsB;;GAE9C;EAGf;AAED,uBAAe"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ChatListProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react108 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/chat/ChatList/ChatList.d.ts
|
|
5
|
-
declare const ChatList:
|
|
5
|
+
declare const ChatList: react108.NamedExoticComponent<ChatListProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { ChatList };
|
|
8
8
|
//# sourceMappingURL=ChatList.d.mts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { EditableMessageProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react110 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/chat/EditableMessage/EditableMessage.d.ts
|
|
5
|
-
declare const EditableMessage:
|
|
5
|
+
declare const EditableMessage: react110.NamedExoticComponent<EditableMessageProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { EditableMessage };
|
|
8
8
|
//# sourceMappingURL=EditableMessage.d.mts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { EditableMessageListProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react112 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/chat/EditableMessageList/EditableMessageList.d.ts
|
|
5
|
-
declare const EditableMessageList:
|
|
5
|
+
declare const EditableMessageList: react112.NamedExoticComponent<EditableMessageListProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { EditableMessageList };
|
|
8
8
|
//# sourceMappingURL=EditableMessageList.d.mts.map
|
|
@@ -4,7 +4,9 @@ import FlexBasic_default from "../../Flex/FlexBasic.mjs";
|
|
|
4
4
|
import ActionIcon_default from "../../ActionIcon/ActionIcon.mjs";
|
|
5
5
|
import Button_default from "../../Button/Button.mjs";
|
|
6
6
|
import ControlInput_default from "../../EditableText/ControlInput.mjs";
|
|
7
|
+
import { useTranslation } from "../../i18n/useTranslation.mjs";
|
|
7
8
|
import Select_default from "../../Select/Select.mjs";
|
|
9
|
+
import editableMessage_default from "../../i18n/resources/en/editableMessage.mjs";
|
|
8
10
|
import { messagesReducer } from "./messageReducer.mjs";
|
|
9
11
|
import { memo, useEffect, useReducer } from "react";
|
|
10
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -12,8 +14,16 @@ import { Plus, Trash } from "lucide-react";
|
|
|
12
14
|
import isEqual from "fast-deep-equal";
|
|
13
15
|
|
|
14
16
|
//#region src/chat/EditableMessageList/EditableMessageList.tsx
|
|
15
|
-
const EditableMessageList = memo(({ disabled, dataSources, onChange }) => {
|
|
17
|
+
const EditableMessageList = memo(({ disabled, dataSources, onChange, texts }) => {
|
|
16
18
|
const [chatMessages, dispatch] = useReducer(messagesReducer, dataSources);
|
|
19
|
+
const { t } = useTranslation(editableMessage_default);
|
|
20
|
+
const addPropsText = texts?.addProps ?? t("editableMessage.addProps");
|
|
21
|
+
const deleteText = texts?.delete ?? t("editableMessage.delete");
|
|
22
|
+
const inputPlaceholderText = texts?.inputPlaceholder ?? t("editableMessage.inputPlaceholder");
|
|
23
|
+
const outputPlaceholderText = texts?.outputPlaceholder ?? t("editableMessage.outputPlaceholder");
|
|
24
|
+
const systemText = texts?.system ?? t("editableMessage.system");
|
|
25
|
+
const inputText = texts?.input ?? t("editableMessage.input");
|
|
26
|
+
const outputText = texts?.output ?? t("editableMessage.output");
|
|
17
27
|
useEffect(() => {
|
|
18
28
|
if (!isEqual(dataSources, chatMessages)) onChange?.(chatMessages);
|
|
19
29
|
}, [chatMessages]);
|
|
@@ -36,15 +46,15 @@ const EditableMessageList = memo(({ disabled, dataSources, onChange }) => {
|
|
|
36
46
|
},
|
|
37
47
|
options: [
|
|
38
48
|
{
|
|
39
|
-
label:
|
|
49
|
+
label: systemText,
|
|
40
50
|
value: "system"
|
|
41
51
|
},
|
|
42
52
|
{
|
|
43
|
-
label:
|
|
53
|
+
label: inputText,
|
|
44
54
|
value: "user"
|
|
45
55
|
},
|
|
46
56
|
{
|
|
47
|
-
label:
|
|
57
|
+
label: outputText,
|
|
48
58
|
value: "assistant"
|
|
49
59
|
}
|
|
50
60
|
],
|
|
@@ -61,7 +71,7 @@ const EditableMessageList = memo(({ disabled, dataSources, onChange }) => {
|
|
|
61
71
|
type: "updateMessage"
|
|
62
72
|
});
|
|
63
73
|
},
|
|
64
|
-
placeholder: item.role === "user" ?
|
|
74
|
+
placeholder: item.role === "user" ? inputPlaceholderText : outputPlaceholderText,
|
|
65
75
|
value: item.content
|
|
66
76
|
}),
|
|
67
77
|
/* @__PURE__ */ jsx(ActionIcon_default, {
|
|
@@ -72,7 +82,7 @@ const EditableMessageList = memo(({ disabled, dataSources, onChange }) => {
|
|
|
72
82
|
type: "deleteMessage"
|
|
73
83
|
});
|
|
74
84
|
},
|
|
75
|
-
title:
|
|
85
|
+
title: deleteText,
|
|
76
86
|
variant: "filled"
|
|
77
87
|
})
|
|
78
88
|
]
|
|
@@ -89,7 +99,7 @@ const EditableMessageList = memo(({ disabled, dataSources, onChange }) => {
|
|
|
89
99
|
type: "addMessage"
|
|
90
100
|
});
|
|
91
101
|
},
|
|
92
|
-
children:
|
|
102
|
+
children: addPropsText
|
|
93
103
|
})]
|
|
94
104
|
}) : void 0;
|
|
95
105
|
}, isEqual);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableMessageList.mjs","names":["Flexbox","Select","ControlInput","ActionIcon","Button"],"sources":["../../../src/chat/EditableMessageList/EditableMessageList.tsx"],"sourcesContent":["'use client';\n\nimport isEqual from 'fast-deep-equal';\nimport { Plus, Trash } from 'lucide-react';\nimport { memo, useEffect, useReducer } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport Button from '@/Button';\nimport ControlInput from '@/EditableText/ControlInput';\nimport { Flexbox } from '@/Flex';\nimport Select from '@/Select';\n\nimport { messagesReducer } from './messageReducer';\nimport type { EditableMessageListProps } from './type';\n\nconst EditableMessageList = memo<EditableMessageListProps>(\n ({ disabled, dataSources, onChange }) => {\n const [chatMessages, dispatch] = useReducer(messagesReducer, dataSources);\n\n useEffect(() => {\n if (!isEqual(dataSources, chatMessages)) {\n onChange?.(chatMessages);\n }\n }, [chatMessages]);\n\n return dataSources ? (\n <Flexbox gap={12}>\n {chatMessages.map((item, index) => (\n <Flexbox\n align={'center'}\n gap={8}\n horizontal\n key={`${index}-${item.content}`}\n width={'100%'}\n >\n <Select\n disabled={disabled}\n onChange={(value) => {\n dispatch({ index, role: value, type: 'updateMessageRole' });\n }}\n options={[\n { label:
|
|
1
|
+
{"version":3,"file":"EditableMessageList.mjs","names":["editableMessageMessages","Flexbox","Select","ControlInput","ActionIcon","Button"],"sources":["../../../src/chat/EditableMessageList/EditableMessageList.tsx"],"sourcesContent":["'use client';\n\nimport isEqual from 'fast-deep-equal';\nimport { Plus, Trash } from 'lucide-react';\nimport { memo, useEffect, useReducer } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport Button from '@/Button';\nimport ControlInput from '@/EditableText/ControlInput';\nimport { Flexbox } from '@/Flex';\nimport Select from '@/Select';\nimport editableMessageMessages from '@/i18n/resources/en/editableMessage';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport { messagesReducer } from './messageReducer';\nimport type { EditableMessageListProps } from './type';\n\nconst EditableMessageList = memo<EditableMessageListProps>(\n ({ disabled, dataSources, onChange, texts }) => {\n const [chatMessages, dispatch] = useReducer(messagesReducer, dataSources);\n const { t } = useTranslation(editableMessageMessages);\n\n const addPropsText = texts?.addProps ?? t('editableMessage.addProps');\n const deleteText = texts?.delete ?? t('editableMessage.delete');\n const inputPlaceholderText = texts?.inputPlaceholder ?? t('editableMessage.inputPlaceholder');\n const outputPlaceholderText =\n texts?.outputPlaceholder ?? t('editableMessage.outputPlaceholder');\n const systemText = texts?.system ?? t('editableMessage.system');\n const inputText = texts?.input ?? t('editableMessage.input');\n const outputText = texts?.output ?? t('editableMessage.output');\n\n useEffect(() => {\n if (!isEqual(dataSources, chatMessages)) {\n onChange?.(chatMessages);\n }\n }, [chatMessages]);\n\n return dataSources ? (\n <Flexbox gap={12}>\n {chatMessages.map((item, index) => (\n <Flexbox\n align={'center'}\n gap={8}\n horizontal\n key={`${index}-${item.content}`}\n width={'100%'}\n >\n <Select\n disabled={disabled}\n onChange={(value) => {\n dispatch({ index, role: value, type: 'updateMessageRole' });\n }}\n options={[\n { label: systemText, value: 'system' },\n { label: inputText, value: 'user' },\n { label: outputText, value: 'assistant' },\n ]}\n style={{ width: 120 }}\n styles={{ popup: { root: { zIndex: 100 } } }}\n value={item.role}\n />\n <ControlInput\n disabled={disabled}\n onChange={(e) => {\n dispatch({ index, message: e, type: 'updateMessage' });\n }}\n placeholder={item.role === 'user' ? inputPlaceholderText : outputPlaceholderText}\n value={item.content}\n />\n <ActionIcon\n icon={Trash}\n onClick={() => {\n dispatch({ index, type: 'deleteMessage' });\n }}\n title={deleteText}\n variant={'filled'}\n />\n </Flexbox>\n ))}\n\n <Button\n block\n disabled={disabled}\n icon={Plus}\n onClick={() => {\n const lastMeg = chatMessages.at(-1);\n\n dispatch({\n message: { content: '', role: lastMeg?.role === 'user' ? 'assistant' : 'user' },\n type: 'addMessage',\n });\n }}\n >\n {addPropsText}\n </Button>\n </Flexbox>\n ) : undefined;\n },\n isEqual,\n);\n\nEditableMessageList.displayName = 'EditableMessageList';\n\nexport default EditableMessageList;\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAM,sBAAsB,MACzB,EAAE,UAAU,aAAa,UAAU,YAAY;CAC9C,MAAM,CAAC,cAAc,YAAY,WAAW,iBAAiB,YAAY;CACzE,MAAM,EAAE,MAAM,eAAeA,wBAAwB;CAErD,MAAM,eAAe,OAAO,YAAY,EAAE,2BAA2B;CACrE,MAAM,aAAa,OAAO,UAAU,EAAE,yBAAyB;CAC/D,MAAM,uBAAuB,OAAO,oBAAoB,EAAE,mCAAmC;CAC7F,MAAM,wBACJ,OAAO,qBAAqB,EAAE,oCAAoC;CACpE,MAAM,aAAa,OAAO,UAAU,EAAE,yBAAyB;CAC/D,MAAM,YAAY,OAAO,SAAS,EAAE,wBAAwB;CAC5D,MAAM,aAAa,OAAO,UAAU,EAAE,yBAAyB;AAE/D,iBAAgB;AACd,MAAI,CAAC,QAAQ,aAAa,aAAa,CACrC,YAAW,aAAa;IAEzB,CAAC,aAAa,CAAC;AAElB,QAAO,cACL,qBAACC;EAAQ,KAAK;aACX,aAAa,KAAK,MAAM,UACvB,qBAACA;GACC,OAAO;GACP,KAAK;GACL;GAEA,OAAO;;IAEP,oBAACC;KACW;KACV,WAAW,UAAU;AACnB,eAAS;OAAE;OAAO,MAAM;OAAO,MAAM;OAAqB,CAAC;;KAE7D,SAAS;MACP;OAAE,OAAO;OAAY,OAAO;OAAU;MACtC;OAAE,OAAO;OAAW,OAAO;OAAQ;MACnC;OAAE,OAAO;OAAY,OAAO;OAAa;MAC1C;KACD,OAAO,EAAE,OAAO,KAAK;KACrB,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,KAAK,EAAE,EAAE;KAC5C,OAAO,KAAK;MACZ;IACF,oBAACC;KACW;KACV,WAAW,MAAM;AACf,eAAS;OAAE;OAAO,SAAS;OAAG,MAAM;OAAiB,CAAC;;KAExD,aAAa,KAAK,SAAS,SAAS,uBAAuB;KAC3D,OAAO,KAAK;MACZ;IACF,oBAACC;KACC,MAAM;KACN,eAAe;AACb,eAAS;OAAE;OAAO,MAAM;OAAiB,CAAC;;KAE5C,OAAO;KACP,SAAS;MACT;;KAhCG,GAAG,MAAM,GAAG,KAAK,UAiCd,CACV,EAEF,oBAACC;GACC;GACU;GACV,MAAM;GACN,eAAe;AAGb,aAAS;KACP,SAAS;MAAE,SAAS;MAAI,MAHV,aAAa,GAAG,GAAG,EAGM,SAAS,SAAS,cAAc;MAAQ;KAC/E,MAAM;KACP,CAAC;;aAGH;IACM;GACD,GACR;GAEN,QACD;AAED,oBAAoB,cAAc;AAElC,kCAAe"}
|
|
@@ -6,6 +6,15 @@ interface EditableMessageListProps {
|
|
|
6
6
|
dataSources: LLMMessage[];
|
|
7
7
|
disabled?: boolean;
|
|
8
8
|
onChange?: (chatMessages: LLMMessage[]) => void;
|
|
9
|
+
texts?: {
|
|
10
|
+
addProps?: string;
|
|
11
|
+
delete?: string;
|
|
12
|
+
input?: string;
|
|
13
|
+
inputPlaceholder?: string;
|
|
14
|
+
output?: string;
|
|
15
|
+
outputPlaceholder?: string;
|
|
16
|
+
system?: string;
|
|
17
|
+
};
|
|
9
18
|
}
|
|
10
19
|
//#endregion
|
|
11
20
|
export { EditableMessageListProps };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { MessageInputProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react111 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/chat/MessageInput/MessageInput.d.ts
|
|
5
|
-
declare const MessageInput:
|
|
5
|
+
declare const MessageInput: react111.NamedExoticComponent<MessageInputProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { MessageInput };
|
|
8
8
|
//# sourceMappingURL=MessageInput.d.mts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { MessageModalProps } from "./type.mjs";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react114 from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/chat/MessageModal/MessageModal.d.ts
|
|
5
|
-
declare const MessageModal:
|
|
5
|
+
declare const MessageModal: react114.NamedExoticComponent<MessageModalProps>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { MessageModal };
|
|
8
8
|
//# sourceMappingURL=MessageModal.d.mts.map
|
|
@@ -4,9 +4,11 @@ import FlexBasic_default from "../../Flex/FlexBasic.mjs";
|
|
|
4
4
|
import Button_default from "../../Button/Button.mjs";
|
|
5
5
|
import CodeEditor_default from "../../CodeEditor/CodeEditor.mjs";
|
|
6
6
|
import TextArea_default from "../../Input/TextArea.mjs";
|
|
7
|
+
import { useTranslation } from "../../i18n/useTranslation.mjs";
|
|
7
8
|
import Modal_default from "../../Modal/Modal.mjs";
|
|
8
9
|
import Markdown_default from "../../Markdown/Markdown.mjs";
|
|
9
10
|
import { useStyles } from "../MessageInput/style.mjs";
|
|
11
|
+
import messageModal_default from "../../i18n/resources/en/messageModal.mjs";
|
|
10
12
|
import { memo, useState } from "react";
|
|
11
13
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
12
14
|
import useMergeState from "use-merge-value";
|
|
@@ -16,6 +18,7 @@ import { useResponsive } from "antd-style";
|
|
|
16
18
|
const MessageModal = memo(({ panelRef, editing, open, height = "75vh", onOpenChange, onEditingChange, placeholder, value, language = "markdown", onChange, text, footer, extra }) => {
|
|
17
19
|
const { mobile } = useResponsive();
|
|
18
20
|
const { styles: textStyles } = useStyles();
|
|
21
|
+
const { t } = useTranslation(messageModal_default);
|
|
19
22
|
const [isEdit, setTyping] = useMergeState(false, {
|
|
20
23
|
onChange: onEditingChange,
|
|
21
24
|
value: editing
|
|
@@ -25,32 +28,34 @@ const MessageModal = memo(({ panelRef, editing, open, height = "75vh", onOpenCha
|
|
|
25
28
|
value: open
|
|
26
29
|
});
|
|
27
30
|
const [temporaryValue, setMessage] = useState(value);
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
children: [/* @__PURE__ */ jsx(Button_default, {
|
|
32
|
-
onClick: () => {
|
|
33
|
-
setTyping(false);
|
|
34
|
-
onChange?.(temporaryValue);
|
|
35
|
-
setMessage(value);
|
|
36
|
-
},
|
|
37
|
-
type: "primary",
|
|
38
|
-
children: text?.confirm || "Confirm"
|
|
39
|
-
}), /* @__PURE__ */ jsx(Button_default, {
|
|
40
|
-
onClick: () => {
|
|
41
|
-
setTyping(false);
|
|
42
|
-
setMessage(value);
|
|
43
|
-
},
|
|
44
|
-
children: text?.cancel || "Cancel"
|
|
45
|
-
})]
|
|
46
|
-
}) : footer;
|
|
31
|
+
const confirmText = text?.confirm ?? t("messageModal.confirm");
|
|
32
|
+
const cancelText = text?.cancel ?? t("messageModal.cancel");
|
|
33
|
+
const editText = text?.edit ?? t("messageModal.edit");
|
|
47
34
|
return /* @__PURE__ */ jsx(Modal_default, {
|
|
48
35
|
allowFullscreen: true,
|
|
49
|
-
cancelText
|
|
36
|
+
cancelText,
|
|
50
37
|
destroyOnHidden: true,
|
|
51
|
-
footer:
|
|
38
|
+
footer: isEdit ? /* @__PURE__ */ jsxs(FlexBasic_default, {
|
|
39
|
+
direction: "horizontal-reverse",
|
|
40
|
+
gap: 8,
|
|
41
|
+
children: [/* @__PURE__ */ jsx(Button_default, {
|
|
42
|
+
onClick: () => {
|
|
43
|
+
setTyping(false);
|
|
44
|
+
onChange?.(temporaryValue);
|
|
45
|
+
setMessage(value);
|
|
46
|
+
},
|
|
47
|
+
type: "primary",
|
|
48
|
+
children: confirmText
|
|
49
|
+
}), /* @__PURE__ */ jsx(Button_default, {
|
|
50
|
+
onClick: () => {
|
|
51
|
+
setTyping(false);
|
|
52
|
+
setMessage(value);
|
|
53
|
+
},
|
|
54
|
+
children: cancelText
|
|
55
|
+
})]
|
|
56
|
+
}) : footer,
|
|
52
57
|
height,
|
|
53
|
-
okText:
|
|
58
|
+
okText: editText,
|
|
54
59
|
onCancel: () => {
|
|
55
60
|
setShowModal(false);
|
|
56
61
|
setTyping(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageModal.mjs","names":["useTextStyles","useControlledState","
|
|
1
|
+
{"version":3,"file":"MessageModal.mjs","names":["useTextStyles","messageModalMessages","useControlledState","Modal","Flexbox","Button","TextArea","value","CodeEditor","Markdown"],"sources":["../../../src/chat/MessageModal/MessageModal.tsx"],"sourcesContent":["'use client';\n\nimport { useResponsive } from 'antd-style';\nimport { memo, useState } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport Button from '@/Button';\nimport CodeEditor from '@/CodeEditor';\nimport { Flexbox } from '@/Flex';\nimport TextArea from '@/Input/TextArea';\nimport Markdown from '@/Markdown';\nimport Modal from '@/Modal';\nimport { useStyles as useTextStyles } from '@/chat/MessageInput/style';\nimport messageModalMessages from '@/i18n/resources/en/messageModal';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport type { MessageModalProps } from './type';\n\nconst MessageModal = memo<MessageModalProps>(\n ({\n panelRef,\n editing,\n open,\n height = '75vh',\n onOpenChange,\n onEditingChange,\n placeholder,\n value,\n language = 'markdown',\n onChange,\n text,\n footer,\n extra,\n }) => {\n const { mobile } = useResponsive();\n const { styles: textStyles } = useTextStyles();\n const { t } = useTranslation(messageModalMessages);\n const [isEdit, setTyping] = useControlledState(false, {\n onChange: onEditingChange,\n value: editing,\n });\n\n const [showModal, setShowModal] = useControlledState(false, {\n onChange: onOpenChange,\n value: open,\n });\n\n const [temporaryValue, setMessage] = useState(value);\n\n const confirmText = text?.confirm ?? t('messageModal.confirm');\n const cancelText = text?.cancel ?? t('messageModal.cancel');\n const editText = text?.edit ?? t('messageModal.edit');\n\n const modalFooter = isEdit ? (\n <Flexbox direction={'horizontal-reverse'} gap={8}>\n <Button\n onClick={() => {\n setTyping(false);\n onChange?.(temporaryValue);\n setMessage(value);\n }}\n type=\"primary\"\n >\n {confirmText}\n </Button>\n <Button\n onClick={() => {\n setTyping(false);\n setMessage(value);\n }}\n >\n {cancelText}\n </Button>\n </Flexbox>\n ) : (\n footer\n );\n\n return (\n <Modal\n allowFullscreen\n cancelText={cancelText}\n destroyOnHidden\n footer={modalFooter}\n height={height}\n okText={editText}\n onCancel={() => {\n setShowModal(false);\n setTyping(false);\n setMessage(value);\n }}\n onOk={() => setTyping(true)}\n open={showModal}\n panelRef={panelRef}\n title={text?.title}\n >\n {isEdit ? (\n mobile ? (\n <TextArea\n autoSize\n className={textStyles}\n defaultValue={temporaryValue}\n onBlur={(e) => setMessage(e.target.value)}\n onChange={(value) => setMessage(value.target.value)}\n placeholder={placeholder}\n value={temporaryValue}\n variant={'borderless'}\n />\n ) : (\n <CodeEditor\n className={textStyles}\n defaultValue={temporaryValue}\n language={language}\n onBlur={(e) => setMessage(e.target.value)}\n onValueChange={(value) => setMessage(value)}\n placeholder={placeholder}\n value={temporaryValue}\n variant={'borderless'}\n />\n )\n ) : (\n <>\n {extra}\n <Markdown variant={'chat'}>{String(value || placeholder)}</Markdown>\n </>\n )}\n </Modal>\n );\n },\n);\n\nMessageModal.displayName = 'MessageModal';\n\nexport default MessageModal;\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAM,eAAe,MAClB,EACC,UACA,SACA,MACA,SAAS,QACT,cACA,iBACA,aACA,OACA,WAAW,YACX,UACA,MACA,QACA,YACI;CACJ,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,EAAE,QAAQ,eAAeA,WAAe;CAC9C,MAAM,EAAE,MAAM,eAAeC,qBAAqB;CAClD,MAAM,CAAC,QAAQ,aAAaC,cAAmB,OAAO;EACpD,UAAU;EACV,OAAO;EACR,CAAC;CAEF,MAAM,CAAC,WAAW,gBAAgBA,cAAmB,OAAO;EAC1D,UAAU;EACV,OAAO;EACR,CAAC;CAEF,MAAM,CAAC,gBAAgB,cAAc,SAAS,MAAM;CAEpD,MAAM,cAAc,MAAM,WAAW,EAAE,uBAAuB;CAC9D,MAAM,aAAa,MAAM,UAAU,EAAE,sBAAsB;CAC3D,MAAM,WAAW,MAAM,QAAQ,EAAE,oBAAoB;AA2BrD,QACE,oBAACC;EACC;EACY;EACZ;EACA,QA9BgB,SAClB,qBAACC;GAAQ,WAAW;GAAsB,KAAK;cAC7C,oBAACC;IACC,eAAe;AACb,eAAU,MAAM;AAChB,gBAAW,eAAe;AAC1B,gBAAW,MAAM;;IAEnB,MAAK;cAEJ;KACM,EACT,oBAACA;IACC,eAAe;AACb,eAAU,MAAM;AAChB,gBAAW,MAAM;;cAGlB;KACM;IACD,GAEV;EASU;EACR,QAAQ;EACR,gBAAgB;AACd,gBAAa,MAAM;AACnB,aAAU,MAAM;AAChB,cAAW,MAAM;;EAEnB,YAAY,UAAU,KAAK;EAC3B,MAAM;EACI;EACV,OAAO,MAAM;YAEZ,SACC,SACE,oBAACC;GACC;GACA,WAAW;GACX,cAAc;GACd,SAAS,MAAM,WAAW,EAAE,OAAO,MAAM;GACzC,WAAW,YAAU,WAAWC,QAAM,OAAO,MAAM;GACtC;GACb,OAAO;GACP,SAAS;IACT,GAEF,oBAACC;GACC,WAAW;GACX,cAAc;GACJ;GACV,SAAS,MAAM,WAAW,EAAE,OAAO,MAAM;GACzC,gBAAgB,YAAU,WAAWD,QAAM;GAC9B;GACb,OAAO;GACP,SAAS;IACT,GAGJ,8CACG,OACD,oBAACE;GAAS,SAAS;aAAS,OAAO,SAAS,YAAY;IAAY,IACnE;GAEC;EAGb;AAED,aAAa,cAAc;AAE3B,2BAAe"}
|