2026-03-09 21:29:03 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* ChatScreen 样式定义
|
2026-04-01 16:30:44 +08:00
|
|
|
|
* 支持响应式布局和动态聊天设置
|
2026-03-09 21:29:03 +08:00
|
|
|
|
*/
|
|
|
|
|
|
|
2026-03-25 05:16:54 +08:00
|
|
|
|
import { useMemo } from 'react';
|
2026-03-09 21:29:03 +08:00
|
|
|
|
import { StyleSheet, Dimensions } from 'react-native';
|
2026-03-25 05:16:54 +08:00
|
|
|
|
import { spacing, shadows, useAppColors, type AppColors } from '../../../../theme';
|
2026-04-13 04:56:58 +08:00
|
|
|
|
import { useChatSettingsStore, CHAT_THEMES } from '../../../../stores/settings';
|
2026-03-09 21:29:03 +08:00
|
|
|
|
|
|
|
|
|
|
const { width: SCREEN_WIDTH } = Dimensions.get('window');
|
|
|
|
|
|
|
|
|
|
|
|
// 响应式断点
|
|
|
|
|
|
const BREAKPOINTS = {
|
|
|
|
|
|
tablet: 768,
|
|
|
|
|
|
desktop: 1024,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 判断是否为宽屏
|
|
|
|
|
|
const isWideScreen = SCREEN_WIDTH >= BREAKPOINTS.desktop;
|
|
|
|
|
|
const isTablet = SCREEN_WIDTH >= BREAKPOINTS.tablet;
|
|
|
|
|
|
|
2026-04-01 16:30:44 +08:00
|
|
|
|
// Hook 获取动态样式参数
|
|
|
|
|
|
export function useChatDynamicStyles() {
|
|
|
|
|
|
const fontSize = useChatSettingsStore((s) => s.fontSize);
|
|
|
|
|
|
const messageRadius = useChatSettingsStore((s) => s.messageRadius);
|
|
|
|
|
|
const themeIndex = useChatSettingsStore((s) => s.themeIndex);
|
2026-04-02 17:55:56 +08:00
|
|
|
|
const nightMode = useChatSettingsStore((s) => s.nightMode);
|
2026-04-01 16:30:44 +08:00
|
|
|
|
const theme = CHAT_THEMES[themeIndex];
|
2026-04-02 17:55:56 +08:00
|
|
|
|
const colors = useAppColors();
|
|
|
|
|
|
|
|
|
|
|
|
// 夜间模式优先:当开启夜间模式时,使用系统暗色,忽略主题设置
|
|
|
|
|
|
// 判断是否为暗色模式:chat.nightMode 设置 或 系统暗色模式(背景色为暗色)
|
|
|
|
|
|
const isSystemDarkMode = (colors.chat.screen as string).startsWith('#0') ||
|
|
|
|
|
|
(colors.chat.screen as string) === '#0A0A0A' ||
|
|
|
|
|
|
(colors.chat.screen as string) === '#121212';
|
|
|
|
|
|
const isNightMode = nightMode || isSystemDarkMode;
|
2026-04-01 16:30:44 +08:00
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
fontSize,
|
|
|
|
|
|
messageRadius,
|
2026-04-02 17:55:56 +08:00
|
|
|
|
// 夜间模式时使用系统暗色,否则使用主题色
|
|
|
|
|
|
outgoingBubbleColor: isNightMode ? colors.chat.bubbleOutgoing : theme.bubble,
|
2026-04-04 00:02:22 +08:00
|
|
|
|
// 对方消息气泡背景色 - 使用纯白以区分header和背景
|
|
|
|
|
|
theirBubbleBackgroundColor: isNightMode ? colors.chat.card : '#FFFFFF',
|
2026-04-01 16:30:44 +08:00
|
|
|
|
// 背景色
|
2026-04-02 17:55:56 +08:00
|
|
|
|
chatBackgroundColor: isNightMode ? colors.chat.screen : theme.secondary,
|
2026-04-04 00:02:22 +08:00
|
|
|
|
// 卡片/头部背景色 - 使用主题次级色(稍深)
|
|
|
|
|
|
cardBackgroundColor: isNightMode ? colors.chat.card : theme.secondary,
|
|
|
|
|
|
// 输入框背景色 - 使用纯白以保持对比度
|
|
|
|
|
|
inputBackgroundColor: isNightMode ? colors.chat.surfaceRaised : '#FFFFFF',
|
2026-04-01 16:30:44 +08:00
|
|
|
|
// 面板背景色
|
2026-04-02 17:55:56 +08:00
|
|
|
|
panelBackgroundColor: isNightMode ? colors.chat.surfaceMuted : theme.panelBg,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
// 主要文字颜色
|
2026-04-02 17:55:56 +08:00
|
|
|
|
textPrimaryColor: isNightMode ? colors.chat.textPrimary : theme.textPrimary,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
// 次要文字颜色
|
2026-04-02 17:55:56 +08:00
|
|
|
|
textSecondaryColor: isNightMode ? colors.chat.textSecondary : theme.textSecondary,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
};
|
2026-04-04 00:02:22 +08:00
|
|
|
|
};
|
2026-04-01 16:30:44 +08:00
|
|
|
|
|
|
|
|
|
|
export function createChatScreenStyles(colors: AppColors, dynamicStyles?: {
|
|
|
|
|
|
fontSize?: number;
|
|
|
|
|
|
messageRadius?: number;
|
|
|
|
|
|
outgoingBubbleColor?: string;
|
2026-04-04 00:02:22 +08:00
|
|
|
|
theirBubbleBackgroundColor?: string;
|
2026-04-01 16:30:44 +08:00
|
|
|
|
chatBackgroundColor?: string;
|
|
|
|
|
|
cardBackgroundColor?: string;
|
|
|
|
|
|
inputBackgroundColor?: string;
|
|
|
|
|
|
panelBackgroundColor?: string;
|
|
|
|
|
|
textPrimaryColor?: string;
|
|
|
|
|
|
textSecondaryColor?: string;
|
|
|
|
|
|
}) {
|
|
|
|
|
|
const fontSize = dynamicStyles?.fontSize ?? 16;
|
|
|
|
|
|
const messageRadius = dynamicStyles?.messageRadius ?? 12;
|
|
|
|
|
|
|
|
|
|
|
|
// 主题颜色(优先使用主题色,否则使用默认色)
|
|
|
|
|
|
const myBubbleBg = dynamicStyles?.outgoingBubbleColor || colors.chat.bubbleOutgoing;
|
2026-04-04 00:02:22 +08:00
|
|
|
|
const theirBubbleBg = dynamicStyles?.theirBubbleBackgroundColor || colors.chat.card;
|
2026-04-01 16:30:44 +08:00
|
|
|
|
const screenBgColor = dynamicStyles?.chatBackgroundColor || colors.chat.screen;
|
|
|
|
|
|
const cardBgColor = dynamicStyles?.cardBackgroundColor || colors.chat.card;
|
|
|
|
|
|
const inputBgColor = dynamicStyles?.inputBackgroundColor || colors.chat.surfaceRaised;
|
|
|
|
|
|
const panelBgColor = dynamicStyles?.panelBackgroundColor || colors.chat.surfaceMuted;
|
|
|
|
|
|
const textPrimary = dynamicStyles?.textPrimaryColor || colors.chat.textPrimary;
|
|
|
|
|
|
const textSecondary = dynamicStyles?.textSecondaryColor || colors.chat.textSecondary;
|
|
|
|
|
|
|
2026-03-25 05:16:54 +08:00
|
|
|
|
return StyleSheet.create({
|
2026-03-09 21:29:03 +08:00
|
|
|
|
// 容器
|
|
|
|
|
|
container: {
|
|
|
|
|
|
flex: 1,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: screenBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 头部
|
|
|
|
|
|
headerContainer: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
borderBottomWidth: StyleSheet.hairlineWidth,
|
|
|
|
|
|
borderBottomColor: colors.chat.border,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
header: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.sm + 2,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
height: 56,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
2026-04-27 01:02:39 +08:00
|
|
|
|
headerLeft: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
gap: spacing.xs,
|
|
|
|
|
|
zIndex: 2,
|
|
|
|
|
|
},
|
2026-03-09 21:29:03 +08:00
|
|
|
|
backButton: {
|
2026-04-25 00:39:40 +08:00
|
|
|
|
width: 40,
|
|
|
|
|
|
height: 40,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
2026-04-25 00:39:40 +08:00
|
|
|
|
marginLeft: -12,
|
|
|
|
|
|
padding: 0,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
headerCenter: {
|
2026-04-27 01:02:39 +08:00
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
left: 0,
|
|
|
|
|
|
right: 0,
|
|
|
|
|
|
top: 0,
|
|
|
|
|
|
bottom: 0,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
alignItems: 'center',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
paddingHorizontal: 50,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
titleRow: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
2026-03-29 03:04:54 +08:00
|
|
|
|
paddingVertical: spacing.xs,
|
|
|
|
|
|
borderRadius: 8,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
2026-03-29 03:04:54 +08:00
|
|
|
|
groupAvatar: {
|
|
|
|
|
|
width: 36,
|
|
|
|
|
|
height: 36,
|
|
|
|
|
|
borderRadius: 10,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
titleContent: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
minWidth: 0,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
alignItems: 'center',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
subtitleRow: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
marginTop: 2,
|
|
|
|
|
|
gap: spacing.xs,
|
|
|
|
|
|
minHeight: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
headerName: {
|
2026-03-29 03:04:54 +08:00
|
|
|
|
fontWeight: '600',
|
2026-04-01 16:30:44 +08:00
|
|
|
|
color: textPrimary,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
fontSize: 16,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
letterSpacing: -0.3,
|
|
|
|
|
|
},
|
|
|
|
|
|
memberCount: {
|
|
|
|
|
|
fontSize: 12,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
color: textSecondary,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
fontWeight: '400',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
typingHint: {
|
|
|
|
|
|
fontSize: 12,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
color: colors.primary.main,
|
|
|
|
|
|
fontWeight: '500',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
moreButton: {
|
2026-03-29 03:04:54 +08:00
|
|
|
|
width: 36,
|
|
|
|
|
|
height: 36,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
2026-03-29 03:04:54 +08:00
|
|
|
|
borderRadius: 10,
|
2026-03-27 17:12:19 +08:00
|
|
|
|
backgroundColor: 'transparent',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
2026-03-27 17:12:19 +08:00
|
|
|
|
headerActions: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
gap: spacing.xs,
|
|
|
|
|
|
},
|
|
|
|
|
|
callButton: {
|
|
|
|
|
|
width: 38,
|
|
|
|
|
|
height: 38,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
borderRadius: 19,
|
|
|
|
|
|
backgroundColor: `${colors.primary.main}12`,
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-09 21:29:03 +08:00
|
|
|
|
// 消息列表
|
|
|
|
|
|
messageListContainer: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
},
|
2026-03-25 05:16:54 +08:00
|
|
|
|
// 回到底部(Telegram 式浮动条)
|
|
|
|
|
|
jumpToLatestFab: {
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
right: 14,
|
|
|
|
|
|
bottom: 10,
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
gap: 6,
|
|
|
|
|
|
paddingHorizontal: 12,
|
|
|
|
|
|
paddingVertical: 8,
|
|
|
|
|
|
borderRadius: 20,
|
|
|
|
|
|
backgroundColor: 'rgba(255, 255, 255, 0.96)',
|
|
|
|
|
|
borderWidth: StyleSheet.hairlineWidth,
|
|
|
|
|
|
borderColor: 'rgba(0, 0, 0, 0.08)',
|
|
|
|
|
|
shadowColor: colors.chat.shadow,
|
|
|
|
|
|
shadowOffset: { width: 0, height: 2 },
|
|
|
|
|
|
shadowOpacity: 0.12,
|
|
|
|
|
|
shadowRadius: 6,
|
|
|
|
|
|
elevation: 4,
|
|
|
|
|
|
},
|
|
|
|
|
|
jumpToLatestFabText: {
|
|
|
|
|
|
fontSize: 13,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
color: colors.primary.main,
|
|
|
|
|
|
},
|
2026-03-09 21:29:03 +08:00
|
|
|
|
listContent: {
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingTop: spacing.md,
|
|
|
|
|
|
paddingBottom: spacing.xl,
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-25 05:16:54 +08:00
|
|
|
|
// 时间分隔 - 轻量胶囊(弱化字重,接近 Telegram 日期条)
|
2026-03-09 21:29:03 +08:00
|
|
|
|
timeContainer: {
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
marginVertical: spacing.lg,
|
|
|
|
|
|
},
|
|
|
|
|
|
timeText: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: 'rgba(142, 142, 147, 0.95)',
|
|
|
|
|
|
fontSize: 11,
|
|
|
|
|
|
backgroundColor: 'rgba(142, 142, 147, 0.1)',
|
|
|
|
|
|
paddingHorizontal: spacing.sm + 4,
|
|
|
|
|
|
paddingVertical: 5,
|
|
|
|
|
|
borderRadius: 12,
|
|
|
|
|
|
fontWeight: '500',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
overflow: 'hidden',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
letterSpacing: 0.2,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 系统通知
|
|
|
|
|
|
systemNoticeContainer: {
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
marginVertical: spacing.sm,
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
},
|
|
|
|
|
|
systemNoticeText: {
|
|
|
|
|
|
fontSize: 12,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textSecondary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
backgroundColor: 'rgba(142, 142, 147, 0.12)',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.xs,
|
|
|
|
|
|
borderRadius: 12,
|
|
|
|
|
|
overflow: 'hidden',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 消息行
|
|
|
|
|
|
messageRow: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
marginBottom: spacing.md,
|
2026-04-25 15:25:42 +08:00
|
|
|
|
alignItems: 'flex-start',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
myMessageRow: {
|
|
|
|
|
|
justifyContent: 'flex-end',
|
|
|
|
|
|
},
|
|
|
|
|
|
theirMessageRow: {
|
|
|
|
|
|
justifyContent: 'flex-start',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-26 03:41:43 +08:00
|
|
|
|
// 头像 - 更大一点
|
2026-03-09 21:29:03 +08:00
|
|
|
|
avatarWrapper: {
|
|
|
|
|
|
marginHorizontal: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowOffset: { width: 0, height: 1 },
|
|
|
|
|
|
shadowOpacity: 0.08,
|
|
|
|
|
|
shadowRadius: 2,
|
|
|
|
|
|
elevation: 2,
|
|
|
|
|
|
},
|
|
|
|
|
|
groupAvatarWrapper: {
|
|
|
|
|
|
marginHorizontal: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowOffset: { width: 0, height: 1 },
|
|
|
|
|
|
shadowOpacity: 0.08,
|
|
|
|
|
|
shadowRadius: 2,
|
|
|
|
|
|
elevation: 2,
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 消息内容 - 自适应宽度,限制最大宽度
|
|
|
|
|
|
messageContent: {
|
|
|
|
|
|
maxWidth: '75%',
|
|
|
|
|
|
marginHorizontal: spacing.xs,
|
|
|
|
|
|
alignItems: 'flex-start',
|
|
|
|
|
|
},
|
|
|
|
|
|
senderName: {
|
2026-03-26 03:41:43 +08:00
|
|
|
|
fontSize: 14,
|
2026-03-26 03:51:26 +08:00
|
|
|
|
color: colors.chat.textSecondary, // 使用主题次要文字颜色
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginBottom: 4,
|
|
|
|
|
|
marginLeft: 4,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
},
|
2026-04-25 15:25:42 +08:00
|
|
|
|
mySenderName: {
|
|
|
|
|
|
marginLeft: 0,
|
|
|
|
|
|
marginRight: 4,
|
|
|
|
|
|
alignSelf: 'flex-end',
|
|
|
|
|
|
},
|
2026-03-09 21:29:03 +08:00
|
|
|
|
|
2026-04-01 16:30:44 +08:00
|
|
|
|
// 消息气泡 - 动态圆角支持
|
2026-03-25 05:16:54 +08:00
|
|
|
|
messageBubbleOuter: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
borderRadius: messageRadius,
|
2026-03-26 03:41:43 +08:00
|
|
|
|
minWidth: 44,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-26 03:41:43 +08:00
|
|
|
|
shadowOffset: { width: 0, height: 1 },
|
|
|
|
|
|
shadowOpacity: 0.06,
|
|
|
|
|
|
shadowRadius: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
elevation: 1,
|
|
|
|
|
|
},
|
|
|
|
|
|
myBubbleOuter: {
|
2026-04-25 15:25:42 +08:00
|
|
|
|
borderTopRightRadius: Math.max(4, messageRadius * 0.3), // 箭头在右上
|
2026-03-25 05:16:54 +08:00
|
|
|
|
},
|
|
|
|
|
|
theirBubbleOuter: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
borderTopLeftRadius: Math.max(4, messageRadius * 0.3),
|
2026-03-25 05:16:54 +08:00
|
|
|
|
},
|
2026-04-01 16:30:44 +08:00
|
|
|
|
// 内层:动态圆角支持
|
2026-03-25 05:16:54 +08:00
|
|
|
|
messageBubbleInner: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
borderRadius: messageRadius,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
overflow: 'hidden',
|
2026-03-26 03:41:43 +08:00
|
|
|
|
paddingHorizontal: 10, // 微信:更窄的左右边距
|
|
|
|
|
|
paddingVertical: 7, // 微信:更紧的上下边距
|
|
|
|
|
|
minWidth: 44,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
2026-03-25 05:16:54 +08:00
|
|
|
|
myBubbleInner: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: myBubbleBg,
|
2026-04-25 15:25:42 +08:00
|
|
|
|
borderTopRightRadius: Math.max(4, messageRadius * 0.3),
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
2026-03-25 05:16:54 +08:00
|
|
|
|
theirBubbleInner: {
|
2026-04-04 00:02:22 +08:00
|
|
|
|
backgroundColor: theirBubbleBg,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
borderTopLeftRadius: Math.max(4, messageRadius * 0.3),
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
recalledBubble: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: panelBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderWidth: 1,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderColor: colors.chat.border,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderStyle: 'dashed',
|
|
|
|
|
|
},
|
|
|
|
|
|
myBubbleText: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
color: textPrimary, // 使用主题文字颜色
|
|
|
|
|
|
fontSize,
|
|
|
|
|
|
lineHeight: Math.round(fontSize * 1.4),
|
2026-03-26 03:41:43 +08:00
|
|
|
|
letterSpacing: 0.1,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '400',
|
|
|
|
|
|
},
|
|
|
|
|
|
theirBubbleText: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
color: textPrimary, // 使用主题文字颜色
|
|
|
|
|
|
fontSize,
|
|
|
|
|
|
lineHeight: Math.round(fontSize * 1.4),
|
2026-03-26 03:41:43 +08:00
|
|
|
|
letterSpacing: 0.1,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '400',
|
|
|
|
|
|
},
|
|
|
|
|
|
// 选中状态
|
|
|
|
|
|
selectedBubble: {
|
|
|
|
|
|
borderWidth: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderColor: colors.chat.replyBorder,
|
2026-03-24 14:21:31 +08:00
|
|
|
|
},
|
2026-03-25 05:16:54 +08:00
|
|
|
|
// 仅对齐右侧,不再套一层浅色底,避免与气泡叠色产生「边缘多出一块蓝」
|
2026-03-24 14:21:31 +08:00
|
|
|
|
myMessageContentPanel: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
alignItems: 'flex-end',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
mySelectedBubble: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.replyTintActive,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderWidth: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderColor: colors.chat.replyBorder,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
theirSelectedBubble: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.menuHighlight,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderWidth: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderColor: colors.chat.replyBorder,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
selectedText: {
|
|
|
|
|
|
// 文本选中时的样式
|
|
|
|
|
|
},
|
|
|
|
|
|
recalledText: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textSecondary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontStyle: 'italic',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-26 03:41:43 +08:00
|
|
|
|
// 图片消息 - QQ/微信风格:更大的圆角,更柔和的阴影
|
2026-03-09 21:29:03 +08:00
|
|
|
|
imageBubble: {
|
|
|
|
|
|
borderRadius: 18,
|
|
|
|
|
|
overflow: 'hidden',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowOffset: { width: 0, height: 3 },
|
2026-03-26 03:41:43 +08:00
|
|
|
|
shadowOpacity: 0.12,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowRadius: 6,
|
2026-03-26 03:41:43 +08:00
|
|
|
|
elevation: 4,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
myImageBubble: {
|
2026-04-25 15:25:42 +08:00
|
|
|
|
borderTopRightRadius: 8,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
theirImageBubble: {
|
2026-03-26 03:41:43 +08:00
|
|
|
|
borderTopLeftRadius: 8,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
messageImage: {
|
|
|
|
|
|
width: 220,
|
|
|
|
|
|
height: 220,
|
|
|
|
|
|
borderRadius: 18,
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 已读状态
|
|
|
|
|
|
readStatusContainer: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
alignSelf: 'flex-end',
|
|
|
|
|
|
marginTop: 2,
|
|
|
|
|
|
marginRight: 2,
|
|
|
|
|
|
gap: 2,
|
|
|
|
|
|
},
|
|
|
|
|
|
readStatusText: {
|
|
|
|
|
|
fontSize: 10,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textSecondary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
readStatusTextRead: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.success,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-25 05:16:54 +08:00
|
|
|
|
// 输入框区域 - 与列表背景同色底栏,顶部细分隔
|
2026-03-09 21:29:03 +08:00
|
|
|
|
inputWrapper: {
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderTopWidth: StyleSheet.hairlineWidth,
|
2026-04-27 01:02:39 +08:00
|
|
|
|
borderTopColor: colors.chat.borderHairline,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
inputContainer: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: 'transparent',
|
|
|
|
|
|
borderWidth: 0,
|
|
|
|
|
|
borderRadius: 0,
|
|
|
|
|
|
marginHorizontal: 10,
|
2026-04-27 01:02:39 +08:00
|
|
|
|
marginBottom: 6,
|
|
|
|
|
|
marginTop: 6,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
paddingHorizontal: spacing.sm,
|
|
|
|
|
|
paddingVertical: spacing.sm,
|
2026-03-16 17:47:10 +08:00
|
|
|
|
shadowColor: 'transparent',
|
|
|
|
|
|
shadowOffset: { width: 0, height: 0 },
|
|
|
|
|
|
shadowOpacity: 0,
|
|
|
|
|
|
shadowRadius: 0,
|
|
|
|
|
|
elevation: 0,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
inputInner: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: colors.chat.surfaceRaised,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderRadius: 20,
|
|
|
|
|
|
paddingHorizontal: spacing.xs,
|
|
|
|
|
|
paddingVertical: 4,
|
|
|
|
|
|
minHeight: 44,
|
2026-03-16 17:47:10 +08:00
|
|
|
|
// 移除阴影效果
|
|
|
|
|
|
shadowColor: 'transparent',
|
|
|
|
|
|
shadowOffset: { width: 0, height: 0 },
|
|
|
|
|
|
shadowOpacity: 0,
|
|
|
|
|
|
shadowRadius: 0,
|
|
|
|
|
|
elevation: 0,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
inputInnerMuted: {
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: colors.chat.surfaceMuted,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
opacity: 0.7,
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 禁言提示
|
|
|
|
|
|
mutedBanner: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.warningBg,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
paddingVertical: spacing.xs,
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
marginBottom: spacing.xs,
|
|
|
|
|
|
borderRadius: 8,
|
|
|
|
|
|
gap: 6,
|
|
|
|
|
|
},
|
|
|
|
|
|
mutedBannerText: {
|
|
|
|
|
|
fontSize: 13,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.danger,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 图标按钮
|
|
|
|
|
|
iconButton: {
|
|
|
|
|
|
width: 38,
|
|
|
|
|
|
height: 30,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
borderRadius: 15,
|
|
|
|
|
|
},
|
|
|
|
|
|
iconButtonActive: {
|
|
|
|
|
|
backgroundColor: `${colors.primary.main}20`,
|
|
|
|
|
|
transform: [{ translateY: -1 }],
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-30 17:53:30 +08:00
|
|
|
|
// 发送按钮 - QQ/微信风格
|
2026-03-09 21:29:03 +08:00
|
|
|
|
sendButtonActive: {
|
2026-03-30 17:53:30 +08:00
|
|
|
|
width: 36,
|
|
|
|
|
|
height: 36,
|
|
|
|
|
|
borderRadius: 18, // 正圆形
|
2026-03-09 21:29:03 +08:00
|
|
|
|
backgroundColor: colors.primary.main,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
2026-03-30 17:53:30 +08:00
|
|
|
|
// 微信风格:轻微阴影,不夸张
|
|
|
|
|
|
shadowColor: colors.primary.main,
|
|
|
|
|
|
shadowOffset: { width: 0, height: 1 },
|
|
|
|
|
|
shadowOpacity: 0.2,
|
|
|
|
|
|
shadowRadius: 3,
|
|
|
|
|
|
elevation: 2,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
sendButtonDisabled: {
|
2026-03-30 17:53:30 +08:00
|
|
|
|
opacity: 0.4,
|
|
|
|
|
|
},
|
|
|
|
|
|
// 发送按钮光泽层(叠加在按钮上模拟渐变)
|
|
|
|
|
|
sendButtonShine: {
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
top: 0,
|
|
|
|
|
|
left: 0,
|
|
|
|
|
|
right: 0,
|
|
|
|
|
|
height: '50%',
|
|
|
|
|
|
borderTopLeftRadius: 18,
|
|
|
|
|
|
borderTopRightRadius: 18,
|
|
|
|
|
|
backgroundColor: 'rgba(255, 255, 255, 0.08)',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 输入框
|
|
|
|
|
|
inputBox: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
paddingHorizontal: spacing.xs,
|
|
|
|
|
|
maxHeight: 100,
|
|
|
|
|
|
justifyContent: 'center',
|
2026-03-16 17:47:10 +08:00
|
|
|
|
// 移除阴影
|
|
|
|
|
|
shadowColor: 'transparent',
|
|
|
|
|
|
shadowOffset: { width: 0, height: 0 },
|
|
|
|
|
|
shadowOpacity: 0,
|
|
|
|
|
|
shadowRadius: 0,
|
|
|
|
|
|
elevation: 0,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
input: {
|
|
|
|
|
|
fontSize: 16,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textPrimary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
paddingTop: 8,
|
|
|
|
|
|
paddingBottom: 8,
|
|
|
|
|
|
maxHeight: 100,
|
|
|
|
|
|
lineHeight: 20,
|
|
|
|
|
|
},
|
|
|
|
|
|
inputMuted: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.iconMuted,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
inputTransparent: {
|
|
|
|
|
|
color: 'transparent',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 输入框@高亮
|
|
|
|
|
|
inputHighlightOverlay: {
|
|
|
|
|
|
...StyleSheet.absoluteFillObject,
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
|
paddingTop: 8,
|
|
|
|
|
|
paddingBottom: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
inputHighlightText: {
|
|
|
|
|
|
fontSize: 16,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textPrimary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
lineHeight: 20,
|
|
|
|
|
|
},
|
|
|
|
|
|
inputHighlightMention: {
|
|
|
|
|
|
color: colors.primary.main,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 加载状态
|
|
|
|
|
|
loadingContainer: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingVertical: spacing.xl * 2,
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 面板
|
|
|
|
|
|
panelWrapper: {
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
|
|
|
|
|
borderTopWidth: StyleSheet.hairlineWidth,
|
|
|
|
|
|
borderTopColor: colors.chat.borderHairline,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
// 表情面板包装器 - 底部 tab 栏是白色,安全区域也用白色填充
|
|
|
|
|
|
emojiPanelWrapper: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
panelContainer: {
|
|
|
|
|
|
flex: 1,
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
|
|
|
|
|
},
|
|
|
|
|
|
morePanelBackground: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 表情面板
|
|
|
|
|
|
emojiGrid: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingTop: spacing.md,
|
|
|
|
|
|
paddingBottom: spacing.xl,
|
|
|
|
|
|
alignItems: 'flex-start',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
emojiItem: {
|
|
|
|
|
|
width: '12.5%',
|
|
|
|
|
|
height: 52,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
emojiText: {
|
|
|
|
|
|
fontSize: 28,
|
|
|
|
|
|
lineHeight: 34,
|
|
|
|
|
|
},
|
|
|
|
|
|
panelFooter: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
justifyContent: 'flex-end',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.sm,
|
|
|
|
|
|
borderTopWidth: 1,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderTopColor: colors.chat.border,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 面板内容区域
|
|
|
|
|
|
panelContent: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-04-27 01:02:39 +08:00
|
|
|
|
// Tab 栏 - 底部横向导航条(QQ/微信风格)
|
2026-03-09 21:29:03 +08:00
|
|
|
|
panelTabBar: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
2026-03-29 03:04:54 +08:00
|
|
|
|
justifyContent: 'space-between',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
paddingHorizontal: 0,
|
|
|
|
|
|
paddingVertical: 0,
|
|
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
borderTopWidth: StyleSheet.hairlineWidth,
|
|
|
|
|
|
borderTopColor: colors.chat.borderHairline,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
2026-04-27 01:02:39 +08:00
|
|
|
|
panelTabScroll: {
|
|
|
|
|
|
flex: 1,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
paddingHorizontal: spacing.sm,
|
|
|
|
|
|
gap: spacing.sm,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
},
|
2026-04-27 01:02:39 +08:00
|
|
|
|
panelTabItem: {
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
width: 48,
|
|
|
|
|
|
height: 44,
|
|
|
|
|
|
borderBottomWidth: 2.5,
|
|
|
|
|
|
borderBottomColor: 'transparent',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
2026-04-27 01:02:39 +08:00
|
|
|
|
panelTabItemActive: {
|
|
|
|
|
|
borderBottomColor: colors.primary.main,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
2026-03-29 03:04:54 +08:00
|
|
|
|
panelCloseButton: {
|
2026-04-27 01:02:39 +08:00
|
|
|
|
width: 44,
|
|
|
|
|
|
height: 44,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
marginRight: spacing.sm,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
},
|
2026-03-09 21:29:03 +08:00
|
|
|
|
|
|
|
|
|
|
// 自定义表情面板
|
|
|
|
|
|
stickerLoadingContainer: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
stickerEmptyContainer: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
padding: spacing.xl,
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
stickerEmptyText: {
|
|
|
|
|
|
fontSize: 16,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textTertiary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginTop: spacing.md,
|
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
stickerEmptySubText: {
|
|
|
|
|
|
fontSize: 13,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textMuted,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginTop: spacing.xs,
|
|
|
|
|
|
},
|
|
|
|
|
|
stickerGrid: {
|
2026-04-26 12:04:27 +08:00
|
|
|
|
flex: 1,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingTop: spacing.md,
|
|
|
|
|
|
paddingBottom: spacing.xl,
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
stickerItem: {
|
|
|
|
|
|
width: (SCREEN_WIDTH - spacing.md * 2) / 4 - 8,
|
|
|
|
|
|
height: (SCREEN_WIDTH - spacing.md * 2) / 4 - 8,
|
|
|
|
|
|
margin: 4,
|
|
|
|
|
|
borderRadius: 8,
|
|
|
|
|
|
overflow: 'hidden',
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: inputBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
stickerImage: {
|
|
|
|
|
|
width: '100%',
|
|
|
|
|
|
height: '100%',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-29 03:04:54 +08:00
|
|
|
|
// 更多功能面板 - 现代扁平化设计
|
2026-03-09 21:29:03 +08:00
|
|
|
|
moreGrid: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
flexWrap: 'wrap',
|
2026-03-29 03:04:54 +08:00
|
|
|
|
paddingHorizontal: spacing.lg + 4,
|
2026-04-27 01:02:39 +08:00
|
|
|
|
paddingTop: spacing.md,
|
2026-03-29 03:04:54 +08:00
|
|
|
|
paddingBottom: spacing.xl,
|
|
|
|
|
|
justifyContent: 'flex-start',
|
2026-04-27 01:02:39 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
moreItem: {
|
2026-03-29 03:04:54 +08:00
|
|
|
|
width: (SCREEN_WIDTH - spacing.lg * 2 - 8) / 4,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignItems: 'center',
|
2026-03-29 03:04:54 +08:00
|
|
|
|
marginBottom: spacing.lg + 4,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
moreIconContainer: {
|
2026-03-29 03:04:54 +08:00
|
|
|
|
width: 56,
|
|
|
|
|
|
height: 56,
|
|
|
|
|
|
borderRadius: 18,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
2026-03-29 03:04:54 +08:00
|
|
|
|
marginBottom: spacing.sm + 2,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowOffset: { width: 0, height: 2 },
|
2026-03-29 03:04:54 +08:00
|
|
|
|
shadowOpacity: 0.06,
|
|
|
|
|
|
shadowRadius: 6,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
elevation: 2,
|
|
|
|
|
|
},
|
2026-03-29 03:04:54 +08:00
|
|
|
|
moreIconGradient: {
|
|
|
|
|
|
width: 56,
|
|
|
|
|
|
height: 56,
|
|
|
|
|
|
borderRadius: 18,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
marginBottom: spacing.sm + 2,
|
|
|
|
|
|
overflow: 'hidden',
|
|
|
|
|
|
},
|
|
|
|
|
|
moreIconInner: {
|
|
|
|
|
|
width: 56,
|
|
|
|
|
|
height: 56,
|
|
|
|
|
|
borderRadius: 18,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
},
|
2026-03-09 21:29:03 +08:00
|
|
|
|
moreItemText: {
|
2026-03-29 03:04:54 +08:00
|
|
|
|
fontSize: 12,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
color: textSecondary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
2026-03-29 03:04:54 +08:00
|
|
|
|
letterSpacing: 0.3,
|
|
|
|
|
|
},
|
2026-03-09 21:29:03 +08:00
|
|
|
|
// @成员选择浮层 - 绝对定位浮在输入框上方
|
|
|
|
|
|
mentionPanelFloat: {
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
left: 12,
|
|
|
|
|
|
right: 12,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderRadius: 18,
|
|
|
|
|
|
shadowColor: colors.primary.main,
|
|
|
|
|
|
shadowOffset: { width: 0, height: -3 },
|
|
|
|
|
|
shadowOpacity: 0.12,
|
|
|
|
|
|
shadowRadius: 16,
|
|
|
|
|
|
elevation: 24,
|
|
|
|
|
|
zIndex: 100,
|
|
|
|
|
|
borderWidth: 1,
|
|
|
|
|
|
borderColor: 'rgba(255, 107, 53, 0.08)',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// @成员选择面板
|
|
|
|
|
|
mentionPanelContainer: {
|
|
|
|
|
|
flex: 1,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderRadius: 18,
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionPanelDragHandle: {
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingTop: 8,
|
|
|
|
|
|
paddingBottom: 2,
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionPanelDragBar: {
|
|
|
|
|
|
width: 32,
|
|
|
|
|
|
height: 3,
|
|
|
|
|
|
borderRadius: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.sheetGrip,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
mentionPanelHeader: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingTop: 4,
|
|
|
|
|
|
paddingBottom: 8,
|
|
|
|
|
|
borderBottomWidth: StyleSheet.hairlineWidth,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderBottomColor: colors.chat.borderHairline,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
mentionPanelTitle: {
|
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
|
fontWeight: '600',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textPlaceholder,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
letterSpacing: 0.5,
|
|
|
|
|
|
textTransform: 'uppercase',
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionPanelCloseBtn: {
|
|
|
|
|
|
width: 26,
|
|
|
|
|
|
height: 26,
|
|
|
|
|
|
borderRadius: 13,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: inputBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionList: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionItem: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: 9,
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionItemAll: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: 9,
|
|
|
|
|
|
backgroundColor: 'rgba(255, 107, 53, 0.04)',
|
|
|
|
|
|
borderBottomWidth: StyleSheet.hairlineWidth,
|
|
|
|
|
|
borderBottomColor: 'rgba(255, 107, 53, 0.12)',
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionAllIcon: {
|
|
|
|
|
|
width: 38,
|
|
|
|
|
|
height: 38,
|
|
|
|
|
|
borderRadius: 19,
|
|
|
|
|
|
backgroundColor: colors.primary.main,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
shadowColor: colors.primary.main,
|
|
|
|
|
|
shadowOffset: { width: 0, height: 2 },
|
|
|
|
|
|
shadowOpacity: 0.3,
|
|
|
|
|
|
shadowRadius: 4,
|
|
|
|
|
|
elevation: 3,
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionItemInfo: {
|
|
|
|
|
|
marginLeft: 10,
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionItemName: {
|
|
|
|
|
|
fontSize: 15,
|
|
|
|
|
|
fontWeight: '500',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textPrimary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
mentionItemNameAll: {
|
|
|
|
|
|
fontSize: 15,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
color: colors.primary.main,
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionItemSub: {
|
|
|
|
|
|
fontSize: 12,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.iconMuted,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginTop: 1,
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionItemRole: {
|
|
|
|
|
|
fontSize: 11,
|
|
|
|
|
|
color: colors.primary.main,
|
|
|
|
|
|
marginTop: 2,
|
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionEmpty: {
|
|
|
|
|
|
paddingVertical: spacing.xl,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
mentionEmptyText: {
|
|
|
|
|
|
fontSize: 14,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.iconSoft,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 长按菜单 - 底部横条形式(类似QQ)
|
|
|
|
|
|
menuOverlay: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
backgroundColor: 'rgba(0, 0, 0, 0.4)',
|
|
|
|
|
|
justifyContent: 'flex-end',
|
|
|
|
|
|
},
|
|
|
|
|
|
// 旧版菜单样式(保留兼容)
|
|
|
|
|
|
menuContainer: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderRadius: 12,
|
|
|
|
|
|
minWidth: 160,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowOffset: { width: 0, height: 4 },
|
|
|
|
|
|
shadowOpacity: 0.15,
|
|
|
|
|
|
shadowRadius: 12,
|
|
|
|
|
|
elevation: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
menuItem: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
paddingHorizontal: 16,
|
|
|
|
|
|
paddingVertical: 12,
|
|
|
|
|
|
gap: 12,
|
|
|
|
|
|
},
|
|
|
|
|
|
menuItemBorder: {
|
|
|
|
|
|
borderBottomWidth: 1,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderBottomColor: colors.chat.borderHairline,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
menuItemText: {
|
|
|
|
|
|
fontSize: 15,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
color: textPrimary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
// 底部菜单容器
|
|
|
|
|
|
bottomMenuContainer: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderTopLeftRadius: 20,
|
|
|
|
|
|
borderTopRightRadius: 20,
|
|
|
|
|
|
paddingTop: spacing.md,
|
|
|
|
|
|
paddingBottom: spacing.xl,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowOffset: { width: 0, height: -4 },
|
|
|
|
|
|
shadowOpacity: 0.1,
|
|
|
|
|
|
shadowRadius: 8,
|
|
|
|
|
|
elevation: 16,
|
|
|
|
|
|
},
|
|
|
|
|
|
// 消息预览区域
|
|
|
|
|
|
messagePreviewContainer: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: panelBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginHorizontal: spacing.md,
|
|
|
|
|
|
marginBottom: spacing.md,
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.sm,
|
|
|
|
|
|
borderRadius: 12,
|
|
|
|
|
|
maxHeight: 80,
|
|
|
|
|
|
},
|
|
|
|
|
|
messagePreviewText: {
|
|
|
|
|
|
fontSize: 14,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textTertiary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
lineHeight: 20,
|
|
|
|
|
|
},
|
|
|
|
|
|
// 操作按钮横条
|
|
|
|
|
|
menuActionsRow: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
justifyContent: 'space-around',
|
|
|
|
|
|
alignItems: 'flex-start',
|
|
|
|
|
|
paddingHorizontal: spacing.sm,
|
|
|
|
|
|
paddingVertical: spacing.md,
|
|
|
|
|
|
borderBottomWidth: 1,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderBottomColor: colors.chat.borderHairline,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginBottom: spacing.md,
|
|
|
|
|
|
},
|
|
|
|
|
|
menuActionItem: {
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
minWidth: 64,
|
|
|
|
|
|
},
|
|
|
|
|
|
menuActionItemLast: {
|
|
|
|
|
|
marginRight: 0,
|
|
|
|
|
|
},
|
|
|
|
|
|
menuActionIconContainer: {
|
|
|
|
|
|
width: 56,
|
|
|
|
|
|
height: 56,
|
|
|
|
|
|
borderRadius: 16,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.overlayQuote,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
marginBottom: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
menuActionLabel: {
|
|
|
|
|
|
fontSize: 13,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
color: textPrimary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
// 取消按钮
|
|
|
|
|
|
menuCancelButton: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: panelBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.md,
|
|
|
|
|
|
borderRadius: 12,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
menuCancelText: {
|
|
|
|
|
|
fontSize: 16,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
color: textPrimary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// QQ风格长按菜单
|
|
|
|
|
|
qqMenuOverlay: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
backgroundColor: 'transparent',
|
|
|
|
|
|
},
|
|
|
|
|
|
qqMenuContainer: {
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
backgroundColor: 'rgba(0, 0, 0, 0.9)',
|
|
|
|
|
|
borderRadius: 6,
|
|
|
|
|
|
paddingVertical: 6,
|
|
|
|
|
|
paddingHorizontal: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowOffset: { width: 0, height: 2 },
|
|
|
|
|
|
shadowOpacity: 0.3,
|
|
|
|
|
|
shadowRadius: 4,
|
|
|
|
|
|
elevation: 10,
|
|
|
|
|
|
},
|
|
|
|
|
|
qqMenuItemsRow: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
qqMenuItem: {
|
|
|
|
|
|
flexDirection: 'column',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
paddingHorizontal: 10,
|
|
|
|
|
|
paddingVertical: 2,
|
|
|
|
|
|
minWidth: 52,
|
|
|
|
|
|
},
|
|
|
|
|
|
qqMenuItemWithBorder: {
|
|
|
|
|
|
borderRightWidth: 1,
|
|
|
|
|
|
borderRightColor: 'rgba(255, 255, 255, 0.15)',
|
|
|
|
|
|
},
|
|
|
|
|
|
qqMenuItemLabelContainer: {
|
|
|
|
|
|
marginTop: 4,
|
|
|
|
|
|
},
|
|
|
|
|
|
qqMenuItemLabel: {
|
|
|
|
|
|
fontSize: 11,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.primary.contrast,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-25 05:16:54 +08:00
|
|
|
|
// 回复预览(输入区)- 与气泡内引用同色条
|
2026-03-09 21:29:03 +08:00
|
|
|
|
replyPreviewContainer: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: 'rgba(74, 136, 199, 0.08)',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.sm,
|
|
|
|
|
|
borderLeftWidth: 3,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderLeftColor: colors.chat.link,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginBottom: spacing.xs,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderRadius: 8,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
replyPreviewContent: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
gap: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
replyPreviewText: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
},
|
|
|
|
|
|
replyPreviewName: {
|
|
|
|
|
|
fontSize: 13,
|
|
|
|
|
|
color: colors.primary.main,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
},
|
|
|
|
|
|
replyPreviewMessage: {
|
|
|
|
|
|
fontSize: 12,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textSecondary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginTop: 2,
|
|
|
|
|
|
},
|
|
|
|
|
|
replyPreviewClose: {
|
|
|
|
|
|
padding: 4,
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 遮罩层
|
|
|
|
|
|
overlay: {
|
|
|
|
|
|
...StyleSheet.absoluteFillObject,
|
|
|
|
|
|
backgroundColor: 'rgba(0, 0, 0, 0.5)',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
zIndex: 1000,
|
|
|
|
|
|
},
|
|
|
|
|
|
overlayContent: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
padding: spacing.xl,
|
|
|
|
|
|
borderRadius: 16,
|
|
|
|
|
|
alignItems: 'center',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
shadowColor: colors.chat.shadow,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
shadowOffset: { width: 0, height: 4 },
|
|
|
|
|
|
shadowOpacity: 0.15,
|
|
|
|
|
|
shadowRadius: 12,
|
|
|
|
|
|
elevation: 8,
|
|
|
|
|
|
},
|
|
|
|
|
|
overlayText: {
|
|
|
|
|
|
marginTop: spacing.md,
|
|
|
|
|
|
fontSize: 15,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textTertiary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 表情包添加按钮(管理界面第一位)
|
|
|
|
|
|
stickerAddButton: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderWidth: 1.5,
|
|
|
|
|
|
borderColor: colors.primary.main,
|
|
|
|
|
|
borderStyle: 'dashed',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
stickerAddContent: {
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
stickerAddText: {
|
|
|
|
|
|
fontSize: 11,
|
|
|
|
|
|
marginTop: 4,
|
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 表情包管理按钮(表情面板第一位)
|
|
|
|
|
|
stickerManageButton: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderWidth: 1,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderColor: colors.chat.border,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderStyle: 'dashed',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
stickerManageContent: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
stickerManageText: {
|
|
|
|
|
|
fontSize: 12,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textTertiary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
marginTop: 4,
|
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 表情管理模态框(2/3高度)
|
|
|
|
|
|
manageModalOverlay: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
justifyContent: 'flex-end',
|
|
|
|
|
|
},
|
|
|
|
|
|
manageModalBackdrop: {
|
|
|
|
|
|
...StyleSheet.absoluteFillObject,
|
|
|
|
|
|
backgroundColor: 'rgba(0, 0, 0, 0.4)',
|
|
|
|
|
|
},
|
|
|
|
|
|
manageModalHandle: {
|
|
|
|
|
|
width: 36,
|
|
|
|
|
|
height: 5,
|
|
|
|
|
|
borderRadius: 3,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.sheetGrip,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignSelf: 'center',
|
|
|
|
|
|
marginTop: 8,
|
|
|
|
|
|
marginBottom: 4,
|
|
|
|
|
|
},
|
|
|
|
|
|
manageHeaderDivider: {
|
|
|
|
|
|
height: StyleSheet.hairlineWidth,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.borderHairline,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 表情包选择状态
|
|
|
|
|
|
stickerItemSelected: {
|
|
|
|
|
|
borderWidth: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderColor: colors.chat.replyBorder,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
stickerCheckOverlay: {
|
|
|
|
|
|
...StyleSheet.absoluteFillObject,
|
2026-03-24 14:21:31 +08:00
|
|
|
|
backgroundColor: 'rgba(127, 182, 230, 0.14)',
|
2026-03-09 21:29:03 +08:00
|
|
|
|
alignItems: 'flex-end',
|
|
|
|
|
|
justifyContent: 'flex-start',
|
|
|
|
|
|
padding: 4,
|
|
|
|
|
|
},
|
|
|
|
|
|
stickerCheckBox: {
|
|
|
|
|
|
width: 22,
|
|
|
|
|
|
height: 22,
|
|
|
|
|
|
borderRadius: 11,
|
|
|
|
|
|
borderWidth: 2,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderColor: colors.chat.card,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
backgroundColor: 'rgba(255, 255, 255, 0.8)',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
stickerCheckBoxSelected: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.replyBorder,
|
|
|
|
|
|
borderColor: colors.chat.replyBorder,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 表情管理模态框
|
|
|
|
|
|
manageModalContainer: {
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: panelBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderTopLeftRadius: 20,
|
|
|
|
|
|
borderTopRightRadius: 20,
|
|
|
|
|
|
overflow: 'hidden',
|
|
|
|
|
|
},
|
|
|
|
|
|
manageModalHeader: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.md,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderBottomWidth: 1,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderBottomColor: colors.chat.border,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
manageHeaderButton: {
|
|
|
|
|
|
minWidth: 60,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
manageModalTitle: {
|
|
|
|
|
|
fontSize: 17,
|
|
|
|
|
|
fontWeight: '600',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textPrimary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
manageDoneText: {
|
|
|
|
|
|
fontSize: 16,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.link,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
manageSelectText: {
|
|
|
|
|
|
fontSize: 16,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.link,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
manageInfoBar: {
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.sm,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderBottomWidth: 1,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderBottomColor: colors.chat.border,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
manageInfoText: {
|
|
|
|
|
|
fontSize: 13,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textSecondary,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
manageStickerGrid: {
|
2026-04-26 12:04:27 +08:00
|
|
|
|
flex: 1,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingTop: spacing.md,
|
|
|
|
|
|
paddingBottom: spacing.xl,
|
|
|
|
|
|
},
|
|
|
|
|
|
manageBottomBar: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.md,
|
2026-04-01 16:30:44 +08:00
|
|
|
|
backgroundColor: cardBgColor,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
borderTopWidth: 1,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
borderTopColor: colors.chat.border,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
paddingBottom: 34, // 安全区域
|
|
|
|
|
|
},
|
|
|
|
|
|
manageSelectAllButton: {
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.sm,
|
|
|
|
|
|
},
|
|
|
|
|
|
manageSelectAllText: {
|
|
|
|
|
|
fontSize: 15,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.link,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
},
|
|
|
|
|
|
manageDeleteButton: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.danger,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
paddingHorizontal: spacing.lg,
|
|
|
|
|
|
paddingVertical: spacing.sm + 2,
|
|
|
|
|
|
borderRadius: 20,
|
|
|
|
|
|
gap: 6,
|
|
|
|
|
|
},
|
|
|
|
|
|
manageDeleteButtonDisabled: {
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.iconMuted,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
manageDeleteText: {
|
|
|
|
|
|
fontSize: 15,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.primary.contrast,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
},
|
|
|
|
|
|
manageTipBar: {
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
paddingHorizontal: spacing.md,
|
|
|
|
|
|
paddingVertical: spacing.sm,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
backgroundColor: colors.chat.tipBg,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
gap: 6,
|
|
|
|
|
|
},
|
|
|
|
|
|
manageTipText: {
|
|
|
|
|
|
fontSize: 12,
|
2026-03-25 05:16:54 +08:00
|
|
|
|
color: colors.chat.textMuted,
|
2026-03-09 21:29:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 管理界面空状态
|
|
|
|
|
|
manageEmptyContainer: {
|
|
|
|
|
|
flex: 1,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
paddingHorizontal: spacing.xl,
|
|
|
|
|
|
paddingVertical: spacing['4xl'],
|
|
|
|
|
|
},
|
|
|
|
|
|
manageEmptyIconBg: {
|
|
|
|
|
|
width: 88,
|
|
|
|
|
|
height: 88,
|
|
|
|
|
|
borderRadius: 44,
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
|
marginBottom: spacing.lg,
|
|
|
|
|
|
},
|
|
|
|
|
|
manageEmptyTitle: {
|
|
|
|
|
|
fontSize: 17,
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
marginBottom: spacing.sm,
|
|
|
|
|
|
},
|
|
|
|
|
|
manageEmptyDesc: {
|
|
|
|
|
|
fontSize: 14,
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
2026-03-25 05:16:54 +08:00
|
|
|
|
}
|
2026-03-09 21:29:03 +08:00
|
|
|
|
|
2026-03-25 05:16:54 +08:00
|
|
|
|
export function useChatScreenStyles() {
|
|
|
|
|
|
const colors = useAppColors();
|
2026-04-01 16:30:44 +08:00
|
|
|
|
const dynamicStyles = useChatDynamicStyles();
|
|
|
|
|
|
return useMemo(() => createChatScreenStyles(colors, dynamicStyles), [colors, dynamicStyles]);
|
2026-03-25 05:16:54 +08:00
|
|
|
|
}
|