@lobehub/ui 1.55.2 → 1.57.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.
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import { type AvatarProps as AntAvatarProps } from 'antd';
3
3
  export interface AvatarProps extends AntAvatarProps {
4
+ animation?: boolean;
4
5
  /**
5
6
  * @description The URL or base64 data of the avatar image
6
7
  */
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
- var _excluded = ["className", "avatar", "title", "size", "shape", "background"];
3
+ var _excluded = ["className", "avatar", "title", "animation", "size", "shape", "background"];
4
4
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
5
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
6
  import { Avatar as AntAvatar } from 'antd';
@@ -13,6 +13,7 @@ var Avatar = /*#__PURE__*/memo(function (_ref) {
13
13
  var className = _ref.className,
14
14
  avatar = _ref.avatar,
15
15
  title = _ref.title,
16
+ animation = _ref.animation,
16
17
  _ref$size = _ref.size,
17
18
  size = _ref$size === void 0 ? 40 : _ref$size,
18
19
  _ref$shape = _ref.shape,
@@ -44,7 +45,8 @@ var Avatar = /*#__PURE__*/memo(function (_ref) {
44
45
  }, props), {}, {
45
46
  children: emoji ? /*#__PURE__*/_jsx(FluentEmoji, {
46
47
  emoji: emoji,
47
- size: size * 0.8
48
+ size: size * 0.8,
49
+ type: animation ? 'anim' : '3d'
48
50
  }) : text === null || text === void 0 ? void 0 : text.toUpperCase().slice(0, 2)
49
51
  }));
50
52
  });
@@ -1,5 +1,6 @@
1
1
  import { type AlertProps } from 'antd';
2
2
  import { ReactNode } from 'react';
3
+ import { type EditableMessageProps } from "../EditableMessage";
3
4
  import { MetaData } from "../types/meta";
4
5
  export interface ChatItemProps {
5
6
  /**
@@ -59,6 +60,7 @@ export interface ChatItemProps {
59
60
  * @description Whether to show the title of the chat item
60
61
  */
61
62
  showTitle?: boolean;
63
+ text?: EditableMessageProps['text'];
62
64
  /**
63
65
  * @description The timestamp of the chat item
64
66
  */
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
- var _excluded = ["actions", "className", "primary", "borderSpacing", "loading", "message", "placement", "type", "avatar", "alert", "showTitle", "time", "editing", "onChange", "onEditingChange", "messageExtra", "renderMessage"];
3
+ var _excluded = ["actions", "className", "primary", "borderSpacing", "loading", "message", "placement", "type", "avatar", "alert", "showTitle", "time", "editing", "onChange", "onEditingChange", "messageExtra", "renderMessage", "text"];
4
4
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
5
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
6
  import { Alert } from 'antd';
@@ -35,6 +35,7 @@ var ChatItem = /*#__PURE__*/memo(function (_ref) {
35
35
  onEditingChange = _ref.onEditingChange,
36
36
  messageExtra = _ref.messageExtra,
37
37
  renderMessage = _ref.renderMessage,
38
+ text = _ref.text,
38
39
  properties = _objectWithoutProperties(_ref, _excluded);
39
40
  var _useStyles = useStyles({
40
41
  avatarSize: AVATAR_SIZE,
@@ -54,6 +55,7 @@ var ChatItem = /*#__PURE__*/memo(function (_ref) {
54
55
  editing: editing,
55
56
  onChange: onChange,
56
57
  onEditingChange: onEditingChange,
58
+ text: text,
57
59
  value: String(message || '...')
58
60
  });
59
61
  var messageContent = renderMessage ? renderMessage(content) : content;
@@ -63,6 +65,7 @@ var ChatItem = /*#__PURE__*/memo(function (_ref) {
63
65
  children: [/*#__PURE__*/_jsxs("div", {
64
66
  className: styles.avatarContainer,
65
67
  children: [/*#__PURE__*/_jsx(Avatar, {
68
+ animation: loading,
66
69
  avatar: avatar.avatar,
67
70
  background: avatar.backgroundColor,
68
71
  size: AVATAR_SIZE,
@@ -13,7 +13,7 @@ export var useStyles = createStyles(function (_ref, _ref2) {
13
13
  primary = _ref2.primary,
14
14
  avatarSize = _ref2.avatarSize,
15
15
  showTitle = _ref2.showTitle;
16
- var blockStylish = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 8px 12px;\n background-color: ", ";\n border-radius: ", "px;\n transition: background-color 100ms ", ";\n "])), primary ? isDarkMode ? token.colorFillSecondary : rgba(token.colorPrimary, 0.08) : isDarkMode ? token.colorFillTertiary : token.colorBgContainer, token.borderRadiusLG, token.motionEaseOut);
16
+ var blockStylish = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 8px 12px;\n background-color: ", ";\n border-radius: ", "px;\n transition: background-color 100ms ", ";\n "])), primary ? isDarkMode ? token.colorFill : rgba(token.colorPrimary, 0.08) : isDarkMode ? token.colorFillSecondary : token.colorBgContainer, token.borderRadiusLG, token.motionEaseOut);
17
17
  var pureStylish = css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n padding-top: ", ";\n "])), title ? 0 : '6px');
18
18
  var pureContainerStylish = css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n transition: background-color 100ms ", ";\n "])), token.motionEaseOut);
19
19
  var typeStylish = type === 'block' ? blockStylish : pureStylish;
@@ -22,7 +22,7 @@ export var useStyles = createStyles(function (_ref, _ref2) {
22
22
  alert: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n span[role='img'] {\n align-self: flex-start;\n width: 16px;\n height: 16px;\n margin-top: 3px;\n }\n\n .ant-alert-description {\n text-align: justify;\n word-break: break-all;\n word-wrap: break-word;\n }\n\n &.ant-alert-with-description {\n padding-block: 12px;\n padding-inline: 12px;\n\n .ant-alert-message {\n font-size: 14px;\n font-weight: 600;\n text-align: justify;\n word-break: break-all;\n word-wrap: break-word;\n }\n }\n "]))),
23
23
  avatarContainer: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n position: relative;\n flex: none;\n width: ", "px;\n height: ", "px;\n "])), avatarSize, avatarSize),
24
24
  container: cx(type === 'pure' && pureContainerStylish, css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n position: relative;\n\n display: flex;\n flex-direction: ", ";\n gap: 12px;\n align-items: flex-start;\n justify-content: revert;\n\n width: 100%;\n padding: 12px;\n\n time {\n display: inline-block;\n white-space: nowrap;\n }\n\n div[role='chat-item-actions'] {\n display: flex;\n }\n\n time,\n div[role='chat-item-actions'] {\n pointer-events: none;\n opacity: 0;\n transition: opacity 200ms ", ";\n }\n\n &:hover {\n time,\n div[role='chat-item-actions'] {\n pointer-events: unset;\n opacity: 1;\n }\n }\n "])), placement === 'left' ? 'row' : 'row-reverse', token.motionEaseOut)),
25
- editingContainer: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n padding-block: 8px;\n border: 1px solid ", ";\n\n &:active,\n &:hover {\n border-color: ", ";\n }\n "])), token.colorPrimaryBorder, token.colorPrimary),
25
+ editingContainer: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n padding: 8px 12px 12px;\n border: 1px solid ", ";\n\n &:active,\n &:hover {\n border-color: ", ";\n }\n "])), token.colorBorderSecondary, token.colorBorder),
26
26
  editingInput: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n min-height: 80px;\n "]))),
27
27
  loading: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n position: absolute;\n right: ", ";\n bottom: 0;\n left: ", ";\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 16px;\n height: 16px;\n\n color: ", ";\n\n background: ", ";\n border-radius: 50%;\n "])), placement === 'left' ? '-4px' : 'unset', placement === 'right' ? '-4px' : 'unset', token.colorBgLayout, token.colorPrimary),
28
28
  message: cx(typeStylish, css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n position: relative;\n "])))),
@@ -2,6 +2,12 @@
2
2
  import { type ActionIconGroupProps } from "../ActionIconGroup";
3
3
  export interface ActionsBarProps extends ActionIconGroupProps {
4
4
  primary?: boolean;
5
+ text?: {
6
+ copy?: string;
7
+ delete?: string;
8
+ edit?: string;
9
+ regenerate?: string;
10
+ };
5
11
  }
6
12
  declare const ActionsBar: import("react").NamedExoticComponent<ActionsBarProps>;
7
13
  export default ActionsBar;
@@ -1,7 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
- var _excluded = ["primary", "items", "dropdownMenu"];
4
+ var _excluded = ["primary", "text", "items", "dropdownMenu"];
5
5
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6
6
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
7
7
  import { Copy, Edit, RotateCw, Trash } from 'lucide-react';
@@ -10,6 +10,7 @@ import ActionIconGroup from "../ActionIconGroup";
10
10
  import { jsx as _jsx } from "react/jsx-runtime";
11
11
  var ActionsBar = /*#__PURE__*/memo(function (_ref) {
12
12
  var primary = _ref.primary,
13
+ text = _ref.text,
13
14
  _ref$items = _ref.items,
14
15
  items = _ref$items === void 0 ? [] : _ref$items,
15
16
  _ref$dropdownMenu = _ref.dropdownMenu,
@@ -19,36 +20,36 @@ var ActionsBar = /*#__PURE__*/memo(function (_ref) {
19
20
  return [{
20
21
  icon: RotateCw,
21
22
  key: 'regenerate',
22
- label: 'Regenerate'
23
+ label: (text === null || text === void 0 ? void 0 : text.regenerate) || 'Regenerate'
23
24
  }, primary ? {
24
25
  icon: Edit,
25
26
  key: 'edit',
26
- label: 'Edit'
27
+ label: (text === null || text === void 0 ? void 0 : text.edit) || 'Edit'
27
28
  } : {
28
29
  icon: Copy,
29
30
  key: 'copy',
30
- label: 'Copy'
31
+ label: (text === null || text === void 0 ? void 0 : text.copy) || 'Copy'
31
32
  }].concat(_toConsumableArray(items)).filter(Boolean);
32
33
  }, [primary, items]);
33
34
  var groupDropdownMenu = useMemo(function () {
34
35
  return [].concat(_toConsumableArray(dropdownMenu), [{
35
36
  icon: Edit,
36
37
  key: 'edit',
37
- label: 'Edit'
38
+ label: (text === null || text === void 0 ? void 0 : text.edit) || 'Edit'
38
39
  }, {
39
40
  icon: Copy,
40
41
  key: 'copy',
41
- label: 'Copy'
42
+ label: (text === null || text === void 0 ? void 0 : text.copy) || 'Copy'
42
43
  }, {
43
44
  icon: RotateCw,
44
45
  key: 'regenerate',
45
- label: 'Regenerate'
46
+ label: (text === null || text === void 0 ? void 0 : text.regenerate) || 'Regenerate'
46
47
  }, {
47
48
  type: 'divider'
48
49
  }, {
49
50
  icon: Trash,
50
51
  key: 'delete',
51
- label: 'Delete'
52
+ label: (text === null || text === void 0 ? void 0 : text.delete) || 'Delete'
52
53
  }]);
53
54
  }, [primary, dropdownMenu]);
54
55
  return /*#__PURE__*/_jsx(ActionIconGroup, _objectSpread({
@@ -1,9 +1,21 @@
1
1
  import { ReactNode } from 'react';
2
- import { ChatItemProps } from "../ChatItem";
2
+ import { type ChatItemProps } from "../ChatItem";
3
3
  import type { DivProps } from "../types";
4
4
  import { ChatMessage } from "../types/chatMessage";
5
+ import { type ActionsBarProps } from './ActionsBar';
5
6
  export type MessageExtra = (props: ChatMessage) => ReactNode;
6
7
  export type RenderMessage = (content: ReactNode, message: ChatMessage) => ReactNode;
8
+ export interface ItemProps extends ChatMessage {
9
+ MessageExtra?: MessageExtra;
10
+ onActionClick?: (actionKey: string, messageId: string) => void;
11
+ onMessageChange?: (id: string, content: string) => void;
12
+ renderMessage?: RenderMessage;
13
+ showTitle?: boolean;
14
+ text?: ChatItemProps['text'] & ActionsBarProps['text'] & {
15
+ copySuccess?: string;
16
+ };
17
+ type: 'docs' | 'chat';
18
+ }
7
19
  export interface ChatListProps extends DivProps {
8
20
  /**
9
21
  * @description Data of chat messages to be displayed
@@ -23,19 +35,12 @@ export interface ChatListProps extends DivProps {
23
35
  * @default false
24
36
  */
25
37
  showTitle?: ChatItemProps['showTitle'];
38
+ text?: ItemProps['text'];
26
39
  /**
27
40
  * @description Type of chat list
28
41
  * @default 'chat'
29
42
  */
30
43
  type?: 'docs' | 'chat';
31
44
  }
32
- export interface ItemProps extends ChatMessage {
33
- MessageExtra?: MessageExtra;
34
- onActionClick?: (actionKey: string, messageId: string) => void;
35
- onMessageChange?: (id: string, content: string) => void;
36
- renderMessage?: RenderMessage;
37
- showTitle?: boolean;
38
- type: 'docs' | 'chat';
39
- }
40
45
  declare const ChatList: import("react").NamedExoticComponent<ChatListProps>;
41
46
  export default ChatList;
@@ -1,8 +1,8 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
- var _excluded = ["MessageExtra", "showTitle", "onActionClick", "onMessageChange", "type", "renderMessage"],
5
- _excluded2 = ["onActionClick", "renderMessageExtra", "className", "data", "type", "showTitle", "onMessageChange", "renderMessage"];
4
+ var _excluded = ["MessageExtra", "showTitle", "onActionClick", "onMessageChange", "type", "text", "renderMessage"],
5
+ _excluded2 = ["onActionClick", "renderMessageExtra", "className", "data", "type", "text", "showTitle", "onMessageChange", "renderMessage"];
6
6
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
7
7
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8
8
  import { App } from 'antd';
@@ -18,6 +18,7 @@ var Item = function Item(_ref) {
18
18
  _onActionClick = _ref.onActionClick,
19
19
  onMessageChange = _ref.onMessageChange,
20
20
  type = _ref.type,
21
+ text = _ref.text,
21
22
  renderMessage = _ref.renderMessage,
22
23
  item = _objectWithoutProperties(_ref, _excluded);
23
24
  var renderMessageExtra = MessageExtra ? /*#__PURE__*/_jsx(MessageExtra, _objectSpread({}, item)) : undefined;
@@ -37,18 +38,19 @@ var Item = function Item(_ref) {
37
38
  case 'copy':
38
39
  {
39
40
  copy(item.content);
40
- message.success('复制成功');
41
+ message.success((text === null || text === void 0 ? void 0 : text.copySuccess) || 'Copy Success');
41
42
  break;
42
43
  }
43
44
  case 'edit':
44
45
  {
45
- console.log('editing');
46
46
  setEditing(true);
47
+ break;
47
48
  }
48
49
  }
49
50
  _onActionClick === null || _onActionClick === void 0 ? void 0 : _onActionClick(actionKey, item.id);
50
51
  },
51
- primary: item.role === 'user'
52
+ primary: item.role === 'user',
53
+ text: text
52
54
  }),
53
55
  avatar: item.meta,
54
56
  editing: editing,
@@ -62,6 +64,7 @@ var Item = function Item(_ref) {
62
64
  primary: item.role === 'user',
63
65
  renderMessage: renderMessage ? innerRenderMessage : undefined,
64
66
  showTitle: showTitle,
67
+ text: text,
65
68
  time: item.updateAt || item.createAt,
66
69
  type: type === 'chat' ? 'block' : 'pure'
67
70
  });
@@ -73,6 +76,7 @@ var ChatList = /*#__PURE__*/memo(function (_ref2) {
73
76
  data = _ref2.data,
74
77
  _ref2$type = _ref2.type,
75
78
  type = _ref2$type === void 0 ? 'chat' : _ref2$type,
79
+ text = _ref2.text,
76
80
  showTitle = _ref2.showTitle,
77
81
  onMessageChange = _ref2.onMessageChange,
78
82
  renderMessage = _ref2.renderMessage,
@@ -90,6 +94,7 @@ var ChatList = /*#__PURE__*/memo(function (_ref2) {
90
94
  onMessageChange: onMessageChange,
91
95
  renderMessage: renderMessage,
92
96
  showTitle: showTitle,
97
+ text: text,
93
98
  type: type
94
99
  }, item), item.id);
95
100
  })
@@ -10,7 +10,7 @@ export var useStyles = createStyles(function (_ref, _ref2) {
10
10
  var typeStylish = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 8px 12px;\n\n background-color: ", ";\n border: 1px solid ", ";\n border-radius: ", "px;\n\n transition:\n background-color 100ms ", ",\n border-color 200ms ", ";\n\n &:hover {\n background-color: ", ";\n border-color: ", ";\n }\n "])), type === 'block' ? token.colorFillTertiary : 'transparent', type === 'block' ? 'transparent' : token.colorBorderSecondary, token.borderRadius, token.motionEaseOut, token.motionEaseOut, type === 'block' ? token.colorFillSecondary : token.colorFillQuaternary, token.colorBorder);
11
11
  return {
12
12
  container: cx(type !== 'pure' && typeStylish, css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n overflow-x: hidden;\n overflow-y: auto;\n width: 100%;\n height: fit-content;\n "])))),
13
- editor: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n resize: ", ";\n height: fit-content;\n min-height: 100%;\n font-family: ", " !important;\n\n textarea {\n min-height: 36px !important;\n }\n\n pre {\n min-height: 36px !important;\n word-wrap: break-word;\n white-space: pre-wrap;\n\n &.shiki {\n margin: 0;\n }\n }\n "])), resize ? 'vertical' : 'none', token.fontFamilyCode),
14
- textarea: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n overflow-x: hidden;\n overflow-y: auto;\n\n height: 100% !important;\n\n color: transparent !important;\n\n caret-color: ", ";\n\n -webkit-text-fill-color: unset !important;\n\n &::placeholder {\n color: ", ";\n }\n\n &:focus {\n border: none !important;\n outline: none !important;\n box-shadow: none !important;\n }\n "])), token.colorText, token.colorTextQuaternary)
13
+ editor: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n resize: ", ";\n height: fit-content;\n min-height: 100%;\n font-family: ", " !important;\n\n textarea {\n min-height: 36px !important;\n }\n\n pre {\n min-height: 36px !important;\n\n text-align: justify;\n word-break: break-all;\n word-wrap: break-word;\n white-space: pre-wrap;\n\n &.shiki {\n margin: 0;\n }\n }\n "])), resize ? 'vertical' : 'none', token.fontFamilyCode),
14
+ textarea: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n overflow-x: hidden;\n overflow-y: auto;\n\n height: 100% !important;\n\n color: transparent !important;\n text-align: justify !important;\n word-break: break-all !important;\n word-wrap: break-word !important;\n\n caret-color: ", ";\n\n -webkit-text-fill-color: unset !important;\n\n &::placeholder {\n color: ", ";\n }\n\n &:focus {\n border: none !important;\n outline: none !important;\n box-shadow: none !important;\n }\n "])), token.colorText, token.colorTextQuaternary)
15
15
  };
16
16
  });
@@ -0,0 +1,7 @@
1
+ interface EmojiApi {
2
+ path: string;
3
+ pkg: string;
4
+ version?: string;
5
+ }
6
+ export declare const genEmojiUrl: (type: 'elem' | 'aliyun', config: EmojiApi) => string;
7
+ export {};
@@ -0,0 +1,17 @@
1
+ var ELEM_API = 'https://npm.elemecdn.com';
2
+ var ALIYUN_API = 'https://registry.npmmirror.com';
3
+ var genElemUrl = function genElemUrl(_ref) {
4
+ var pkg = _ref.pkg,
5
+ version = _ref.version,
6
+ path = _ref.path;
7
+ return "".concat(ELEM_API, "/").concat(pkg).concat(version ? "@".concat(version) : '', "/").concat(path);
8
+ };
9
+ var genAliyunUrl = function genAliyunUrl(_ref2) {
10
+ var pkg = _ref2.pkg,
11
+ version = _ref2.version,
12
+ path = _ref2.path;
13
+ return "".concat(ALIYUN_API, "/").concat(pkg).concat(version ? "/".concat(version) : '', "/files/").concat(path);
14
+ };
15
+ export var genEmojiUrl = function genEmojiUrl(type, config) {
16
+ return type === 'elem' ? genElemUrl(config) : genAliyunUrl(config);
17
+ };
@@ -12,9 +12,9 @@ export interface FluentEmojiProps extends DivProps {
12
12
  size?: number;
13
13
  /**
14
14
  * @description The type of the FluentUI emoji set to be used
15
- * @default 'modern'
15
+ * @default '3d'
16
16
  */
17
- type?: 'modern' | 'flat' | 'high-contrast';
17
+ type?: 'modern' | 'flat' | 'high-contrast' | 'anim' | '3d' | 'pure';
18
18
  }
19
19
  declare const FluentEmoji: import("react").NamedExoticComponent<FluentEmojiProps>;
20
20
  export default FluentEmoji;
@@ -3,7 +3,8 @@ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
3
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
4
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
5
5
  import { kebabCase } from 'lodash-es';
6
- import { memo, useEffect, useState } from 'react';
6
+ import { memo, useMemo, useState } from 'react';
7
+ import { genEmojiUrl } from "./genEmojiUrl";
7
8
  import { getEmojiNameByCharacter } from "../utils/getEmojiByCharacter";
8
9
  import { useStyles } from "./style";
9
10
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -12,33 +13,55 @@ var FluentEmoji = /*#__PURE__*/memo(function (_ref) {
12
13
  className = _ref.className,
13
14
  style = _ref.style,
14
15
  _ref$type = _ref.type,
15
- type = _ref$type === void 0 ? 'modern' : _ref$type,
16
+ type = _ref$type === void 0 ? '3d' : _ref$type,
16
17
  _ref$size = _ref.size,
17
18
  size = _ref$size === void 0 ? 40 : _ref$size;
18
19
  var _useState = useState(false),
19
20
  _useState2 = _slicedToArray(_useState, 2),
20
21
  loadingFail = _useState2[0],
21
22
  setLoadingFail = _useState2[1];
22
- var _useState3 = useState({}),
23
- _useState4 = _slicedToArray(_useState3, 2),
24
- emojiUrl = _useState4[0],
25
- setEmojiUrl = _useState4[1];
26
23
  var _useStyles = useStyles(),
27
24
  cx = _useStyles.cx,
28
25
  styles = _useStyles.styles;
29
- useEffect(function () {
30
- if (emojiUrl !== null && emojiUrl !== void 0 && emojiUrl[emoji] || (emojiUrl === null || emojiUrl === void 0 ? void 0 : emojiUrl[emoji]) === 'none') return;
26
+ var emojiUrl = useMemo(function () {
27
+ if (type === 'pure') return;
31
28
  var emojiName = getEmojiNameByCharacter(emoji);
32
- if (emojiName) {
33
- setEmojiUrl(_objectSpread(_objectSpread({}, emojiUrl), {}, _defineProperty({}, emoji, "https://npm.elemecdn.com/fluentui-emoji/icons/".concat(type, "/").concat(kebabCase(emojiName), ".svg"))));
34
- } else {
35
- setEmojiUrl(_objectSpread(_objectSpread({}, emojiUrl), {}, _defineProperty({}, emoji, 'none')));
29
+ if (!emojiName) return;
30
+ switch (type) {
31
+ case 'modern':
32
+ case 'flat':
33
+ case 'high-contrast':
34
+ {
35
+ return genEmojiUrl('elem', {
36
+ path: "icons/".concat(type, "/").concat(kebabCase(emojiName), ".svg"),
37
+ pkg: 'fluentui-emoji'
38
+ });
39
+ }
40
+ case 'anim':
41
+ {
42
+ return genEmojiUrl('aliyun', {
43
+ path: "assets/".concat(emojiName, ".webp"),
44
+ pkg: '@lobehub/assets-emoji-anim',
45
+ version: '1.0.0'
46
+ });
47
+ }
48
+ case '3d':
49
+ {
50
+ return genEmojiUrl('aliyun', {
51
+ path: "assets/".concat(emojiName, ".webp"),
52
+ pkg: '@lobehub/assets-emoji',
53
+ version: '1.3.0'
54
+ });
55
+ }
36
56
  }
37
- }, [emoji, emojiUrl]);
38
- if ((emojiUrl === null || emojiUrl === void 0 ? void 0 : emojiUrl[emoji]) === 'none' || loadingFail) return /*#__PURE__*/_jsx("div", {
57
+ }, [type, emoji]);
58
+ var isFallback = useMemo(function () {
59
+ return type === 'pure' || !emojiUrl || loadingFail;
60
+ }, []);
61
+ if (isFallback) return /*#__PURE__*/_jsx("div", {
39
62
  className: cx(styles.container, className),
40
63
  style: _objectSpread({
41
- fontSize: size,
64
+ fontSize: size * 0.9,
42
65
  height: size,
43
66
  width: size
44
67
  }, style),
@@ -57,7 +80,7 @@ var FluentEmoji = /*#__PURE__*/memo(function (_ref) {
57
80
  onError: function onError() {
58
81
  return setLoadingFail(true);
59
82
  },
60
- src: emojiUrl === null || emojiUrl === void 0 ? void 0 : emojiUrl[emoji],
83
+ src: emojiUrl,
61
84
  width: "100%"
62
85
  })
63
86
  });
@@ -5,7 +5,7 @@ export var useStyles = createStyles(function (_ref) {
5
5
  var css = _ref.css,
6
6
  token = _ref.token;
7
7
  return {
8
- container: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n line-height: 1;\n text-align: center;\n "]))),
8
+ container: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n line-height: 1;\n text-align: center;\n "]))),
9
9
  loading: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: absolute;\n inset: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 100%;\n height: 100%;\n\n color: ", ";\n "])), token.colorText)
10
10
  };
11
11
  });
@@ -8,6 +8,7 @@ import { Button } from 'antd';
8
8
  import { memo, useState } from 'react';
9
9
  import { Flexbox } from 'react-layout-kit';
10
10
  import CodeEditor from "../CodeEditor";
11
+ import { useStyles } from "./style";
11
12
  import { jsx as _jsx } from "react/jsx-runtime";
12
13
  import { Fragment as _Fragment } from "react/jsx-runtime";
13
14
  import { jsxs as _jsxs } from "react/jsx-runtime";
@@ -32,7 +33,11 @@ var MessageInput = /*#__PURE__*/memo(function (_ref) {
32
33
  _useState2 = _slicedToArray(_useState, 2),
33
34
  temporarySystemRole = _useState2[0],
34
35
  setRole = _useState2[1];
35
- return /*#__PURE__*/_jsxs(_Fragment, {
36
+ var _useStyles = useStyles(),
37
+ cx = _useStyles.cx,
38
+ styles = _useStyles.styles;
39
+ return /*#__PURE__*/_jsxs(Flexbox, {
40
+ gap: 8,
36
41
  children: [/*#__PURE__*/_jsx(Flexbox, _objectSpread(_objectSpread({
37
42
  gap: 8,
38
43
  style: {
@@ -41,7 +46,7 @@ var MessageInput = /*#__PURE__*/memo(function (_ref) {
41
46
  }
42
47
  }, props), {}, {
43
48
  children: /*#__PURE__*/_jsx(CodeEditor, {
44
- className: textareaClassname,
49
+ className: cx(styles, textareaClassname),
45
50
  language: "md",
46
51
  onValueChange: function onValueChange(value) {
47
52
  setRole(value);
@@ -52,6 +57,7 @@ var MessageInput = /*#__PURE__*/memo(function (_ref) {
52
57
  height: height,
53
58
  minHeight: '100%'
54
59
  }, textareaStyle),
60
+ textareaClassName: cx(styles, textareaClassname),
55
61
  type: type,
56
62
  value: temporarySystemRole
57
63
  })
@@ -0,0 +1 @@
1
+ export declare const useStyles: (props?: unknown) => import("antd-style").ReturnStyles<import("antd-style").SerializedStyles>;
@@ -0,0 +1,7 @@
1
+ import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
2
+ var _templateObject;
3
+ import { createStyles } from 'antd-style';
4
+ export var useStyles = createStyles(function (_ref) {
5
+ var css = _ref.css;
6
+ return css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n font-size: 14px;\n line-height: 1.8;\n "])));
7
+ });
@@ -7,6 +7,6 @@ export var useStyles = createStyles(function (_ref, type) {
7
7
  token = _ref.token;
8
8
  var typeStylish = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n background-color: ", ";\n border: 1px solid ", ";\n "])), type === 'block' ? token.colorFillTertiary : 'transparent', type === 'block' ? 'transparent' : token.colorBorder);
9
9
  return {
10
- container: cx(typeStylish, css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: relative;\n\n overflow: hidden;\n display: flex;\n gap: 8px;\n align-items: center;\n\n max-width: 100%;\n padding: 0 8px 0 12px;\n\n border-radius: ", "px;\n\n transition: background-color 100ms ", ";\n\n &:hover {\n background-color: ", ";\n }\n\n .ant-highlighter-shiki {\n position: relative;\n overflow: hidden;\n flex: 1;\n }\n\n .prism-code {\n background: none !important;\n }\n\n pre {\n overflow-x: auto !important;\n overflow-y: hidden !important;\n display: flex;\n align-items: center;\n\n width: 100%;\n height: 36px !important;\n margin: 0 !important;\n\n line-height: 1;\n\n background: none !important;\n }\n\n code[class*='language-'] {\n background: none !important;\n }\n "])), token.borderRadius, token.motionEaseOut, token.colorFillTertiary))
10
+ container: cx(typeStylish, css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: relative;\n\n overflow: hidden;\n display: flex;\n gap: 8px;\n align-items: center;\n\n max-width: 100%;\n height: 38px;\n padding: 0 8px 0 12px;\n\n border-radius: ", "px;\n\n transition: background-color 100ms ", ";\n\n &:hover {\n background-color: ", ";\n }\n\n .ant-highlighter-shiki {\n position: relative;\n overflow: hidden;\n flex: 1;\n }\n\n .prism-code {\n background: none !important;\n }\n\n pre {\n overflow-x: auto !important;\n overflow-y: hidden !important;\n display: flex;\n align-items: center;\n\n width: 100%;\n height: 36px !important;\n margin: 0 !important;\n\n line-height: 1;\n\n background: none !important;\n }\n\n code[class*='language-'] {\n background: none !important;\n }\n "])), token.borderRadius, token.motionEaseOut, token.colorFillTertiary))
11
11
  };
12
12
  });
@@ -7,7 +7,7 @@ export var useStyles = createStyles(function (_ref, noPadding) {
7
7
  responsive = _ref.responsive;
8
8
  return {
9
9
  editor: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n align-items: stretch;\n justify-content: stretch;\n\n width: inherit;\n min-height: inherit;\n\n ", " {\n flex-direction: column;\n }\n "])), responsive.mobile),
10
- left: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n overflow: auto;\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n\n ", "\n "])), !noPadding && css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n padding: 40px 24px;\n "])))),
10
+ left: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n overflow: auto;\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n\n position: relative;\n\n ", "\n "])), !noPadding && css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n padding: 40px 24px;\n "])))),
11
11
  leva: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n --leva-sizes-controlWidth: 66%;\n --leva-colors-elevation1: ", ";\n --leva-colors-elevation2: transparent;\n --leva-colors-elevation3: ", ";\n --leva-colors-accent1: ", ";\n --leva-colors-accent2: ", ";\n --leva-colors-accent3: ", ";\n --leva-colors-highlight1: ", ";\n --leva-colors-highlight2: ", ";\n --leva-colors-highlight3: ", ";\n --leva-colors-vivid1: ", ";\n --leva-shadows-level1: unset;\n --leva-shadows-level2: unset;\n --leva-fonts-mono: ", ";\n\n overflow: auto;\n width: 100%;\n height: 100%;\n padding: 6px 0;\n\n > div {\n background: transparent;\n\n > div {\n background: transparent;\n }\n }\n\n input:checked + label > svg {\n stroke: ", ";\n }\n\n button {\n --leva-colors-accent2: ", ";\n }\n "])), token.colorFillSecondary, token.colorFillSecondary, token.colorPrimary, token.colorPrimaryHover, token.colorPrimaryActive, token.colorTextTertiary, token.colorTextSecondary, token.colorText, token.colorWarning, token.fontFamilyCode, token.colorBgLayout, token.colorFillSecondary),
12
12
  right: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n background: ", ";\n\n ", " {\n .draggable-panel-fixed {\n width: 100% !important;\n }\n }\n "])), token.colorBgLayout, responsive.mobile)
13
13
  };
@@ -5,6 +5,10 @@ export interface TokenTagProps extends DivProps {
5
5
  * @description Maximum value for the token
6
6
  */
7
7
  maxValue: number;
8
+ text?: {
9
+ overload?: string;
10
+ tokens?: string;
11
+ };
8
12
  /**
9
13
  * @description Current value of the token
10
14
  */
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
- var _excluded = ["className", "maxValue", "value"];
3
+ var _excluded = ["className", "maxValue", "value", "text"];
4
4
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
5
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
6
  import { forwardRef } from 'react';
@@ -12,6 +12,7 @@ var TokenTag = /*#__PURE__*/forwardRef(function (_ref, ref) {
12
12
  var className = _ref.className,
13
13
  maxValue = _ref.maxValue,
14
14
  value = _ref.value,
15
+ text = _ref.text,
15
16
  props = _objectWithoutProperties(_ref, _excluded);
16
17
  var valueLeft = maxValue - value;
17
18
  var percent = valueLeft / maxValue;
@@ -37,7 +38,7 @@ var TokenTag = /*#__PURE__*/forwardRef(function (_ref, ref) {
37
38
  children: [/*#__PURE__*/_jsx(FluentEmoji, {
38
39
  emoji: emoji,
39
40
  size: ICON_SIZE
40
- }), valueLeft > 0 ? "Tokens ".concat(valueLeft) : "Overload"]
41
+ }), valueLeft > 0 ? (text === null || text === void 0 ? void 0 : text.tokens) || "Tokens ".concat(valueLeft) : (text === null || text === void 0 ? void 0 : text.overload) || 'Overload']
41
42
  }));
42
43
  });
43
44
  export default TokenTag;
package/es/index.d.ts CHANGED
@@ -56,4 +56,4 @@ export { default as Toc, type TocProps } from './Toc';
56
56
  export { default as TokenTag, type TokenTagProps } from './TokenTag';
57
57
  export { default as Tooltip, type TooltipProps } from './Tooltip';
58
58
  export type * from './types';
59
- export { getEmoji } from './utils/getEmojiByCharacter';
59
+ export { getEmoji, getEmojiNameByCharacter } from './utils/getEmojiByCharacter';
package/es/index.js CHANGED
@@ -54,4 +54,4 @@ export { default as ThemeSwitch } from "./ThemeSwitch";
54
54
  export { default as Toc } from "./Toc";
55
55
  export { default as TokenTag } from "./TokenTag";
56
56
  export { default as Tooltip } from "./Tooltip";
57
- export { getEmoji } from "./utils/getEmojiByCharacter";
57
+ export { getEmoji, getEmojiNameByCharacter } from "./utils/getEmojiByCharacter";
@@ -1,5 +1,5 @@
1
+ import emojilib from '@lobehub/emojilib';
1
2
  import emojiRegex from 'emoji-regex';
2
- import emojilib from 'emojilib';
3
3
  export var getEmoji = function getEmoji(emoji) {
4
4
  var _emoji$match;
5
5
  var regex = emojiRegex();
@@ -7,9 +7,8 @@ export var getEmoji = function getEmoji(emoji) {
7
7
  return pureEmoji;
8
8
  };
9
9
  export var getEmojiNameByCharacter = function getEmojiNameByCharacter(emoji) {
10
- var _EmojiLab$pureEmoji;
11
10
  var pureEmoji = getEmoji(emoji);
12
11
  if (!pureEmoji) return;
13
12
  var EmojiLab = emojilib;
14
- return EmojiLab === null || EmojiLab === void 0 ? void 0 : (_EmojiLab$pureEmoji = EmojiLab[pureEmoji]) === null || _EmojiLab$pureEmoji === void 0 ? void 0 : _EmojiLab$pureEmoji[0];
13
+ return EmojiLab === null || EmojiLab === void 0 ? void 0 : EmojiLab[pureEmoji];
15
14
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/ui",
3
- "version": "1.55.2",
3
+ "version": "1.57.0",
4
4
  "description": "Lobe UI is an open-source UI component library for building chatbot web apps",
5
5
  "keywords": [
6
6
  "lobehub",
@@ -28,11 +28,11 @@
28
28
  ],
29
29
  "scripts": {
30
30
  "build": "father build",
31
- "build:watch": "father dev",
32
31
  "ci": "npm run lint && npm run type-check",
33
32
  "clean": "rm -r es lib dist coverage .dumi/tmp .eslintcache node_modules/.cache",
34
- "dev": "dumi dev",
33
+ "dev": "father dev",
35
34
  "docs:build": "dumi build",
35
+ "docs:dev": "dumi dev",
36
36
  "doctor": "father doctor",
37
37
  "lint": "eslint \"{src,tests}/**/*.{js,jsx,ts,tsx}\" --fix",
38
38
  "lint:md": "remark . --quiet --frail --output",
@@ -40,6 +40,7 @@
40
40
  "prepare": "husky install && npm run setup",
41
41
  "prepublishOnly": "father doctor && npm run build",
42
42
  "prettier": "prettier -c --write --no-error-on-unmatched-pattern \"**/**\"",
43
+ "pull": "git pull",
43
44
  "release": "semantic-release",
44
45
  "setup": "dumi setup",
45
46
  "start": "dumi dev",
@@ -73,6 +74,7 @@
73
74
  "@babel/runtime": "^7",
74
75
  "@floating-ui/react": "^0",
75
76
  "@giscus/react": "^2",
77
+ "@lobehub/emojilib": "latest",
76
78
  "@react-spring/web": "^9",
77
79
  "ahooks": "^3",
78
80
  "antd": "^5",
@@ -80,7 +82,6 @@
80
82
  "copy-to-clipboard": "^3",
81
83
  "dayjs": "^1",
82
84
  "emoji-regex": "^10",
83
- "emojilib": "^3",
84
85
  "fast-deep-equal": "^3",
85
86
  "immer": "^10",
86
87
  "leva": "^0",