kaleido-ui 0.1.52 → 0.1.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/native/index.cjs +146 -4
- package/dist/native/index.d.cts +29 -1
- package/dist/native/index.d.ts +29 -1
- package/dist/native/index.js +145 -5
- package/package.json +1 -1
package/dist/native/index.cjs
CHANGED
|
@@ -36,6 +36,7 @@ __export(native_exports, {
|
|
|
36
36
|
AssetSelector: () => import_wdk_uikit_react_native2.AssetSelector,
|
|
37
37
|
Balance: () => import_wdk_uikit_react_native2.Balance,
|
|
38
38
|
BalanceCard: () => BalanceCard,
|
|
39
|
+
ChatBubble: () => ChatBubble,
|
|
39
40
|
CryptoAddressInput: () => import_wdk_uikit_react_native2.CryptoAddressInput,
|
|
40
41
|
EmptyState: () => EmptyState,
|
|
41
42
|
KButton: () => KButton,
|
|
@@ -56,6 +57,7 @@ __export(native_exports, {
|
|
|
56
57
|
ThemeProvider: () => import_wdk_uikit_react_native2.ThemeProvider,
|
|
57
58
|
TransactionItem: () => import_wdk_uikit_react_native2.TransactionItem,
|
|
58
59
|
TransactionList: () => import_wdk_uikit_react_native2.TransactionList,
|
|
60
|
+
TypingDots: () => TypingDots,
|
|
59
61
|
colors: () => colors,
|
|
60
62
|
fontFamily: () => fontFamily,
|
|
61
63
|
fontWeight: () => fontWeight,
|
|
@@ -999,13 +1001,151 @@ function EmptyState({ title, description, icon, action, style, ...rest }) {
|
|
|
999
1001
|
] });
|
|
1000
1002
|
}
|
|
1001
1003
|
|
|
1002
|
-
// src/native/components/
|
|
1004
|
+
// src/native/components/typing-dots.tsx
|
|
1005
|
+
var import_react3 = require("react");
|
|
1003
1006
|
var import_react_native14 = require("react-native");
|
|
1004
1007
|
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
1008
|
+
function TypingDots({ label, color, style }) {
|
|
1009
|
+
const { theme, fontFamily: fontFamily2 } = useKaleidoTheme();
|
|
1010
|
+
const dots = (0, import_react3.useRef)([new import_react_native14.Animated.Value(0), new import_react_native14.Animated.Value(0), new import_react_native14.Animated.Value(0)]).current;
|
|
1011
|
+
(0, import_react3.useEffect)(() => {
|
|
1012
|
+
const make = (v) => import_react_native14.Animated.loop(
|
|
1013
|
+
import_react_native14.Animated.sequence([
|
|
1014
|
+
import_react_native14.Animated.timing(v, { toValue: 1, duration: 420, useNativeDriver: true }),
|
|
1015
|
+
import_react_native14.Animated.timing(v, { toValue: 0, duration: 420, useNativeDriver: true }),
|
|
1016
|
+
import_react_native14.Animated.delay(240)
|
|
1017
|
+
])
|
|
1018
|
+
);
|
|
1019
|
+
const loops = dots.map(make);
|
|
1020
|
+
const timers = dots.map((_, i) => setTimeout(() => loops[i].start(), i * 160));
|
|
1021
|
+
return () => {
|
|
1022
|
+
timers.forEach(clearTimeout);
|
|
1023
|
+
loops.forEach((l) => l.stop());
|
|
1024
|
+
};
|
|
1025
|
+
}, [dots]);
|
|
1026
|
+
const dotColor = color ?? theme.primary;
|
|
1027
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react_native14.View, { style: [styles5.row, style], children: [
|
|
1028
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native14.View, { style: styles5.dotsRow, children: dots.map((v, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
1029
|
+
import_react_native14.Animated.View,
|
|
1030
|
+
{
|
|
1031
|
+
style: {
|
|
1032
|
+
width: 7,
|
|
1033
|
+
height: 7,
|
|
1034
|
+
borderRadius: 3.5,
|
|
1035
|
+
marginHorizontal: 2.5,
|
|
1036
|
+
backgroundColor: dotColor,
|
|
1037
|
+
opacity: v.interpolate({ inputRange: [0, 1], outputRange: [0.35, 1] }),
|
|
1038
|
+
transform: [
|
|
1039
|
+
{ translateY: v.interpolate({ inputRange: [0, 1], outputRange: [0, -5] }) },
|
|
1040
|
+
{ scale: v.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1.1] }) }
|
|
1041
|
+
]
|
|
1042
|
+
}
|
|
1043
|
+
},
|
|
1044
|
+
i
|
|
1045
|
+
)) }),
|
|
1046
|
+
label ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native14.Text, { style: [styles5.label, { color: theme.text.secondary, fontFamily: fontFamily2 }], children: label }) : null
|
|
1047
|
+
] });
|
|
1048
|
+
}
|
|
1049
|
+
var styles5 = import_react_native14.StyleSheet.create({
|
|
1050
|
+
row: { flexDirection: "row", alignItems: "center" },
|
|
1051
|
+
dotsRow: { flexDirection: "row", alignItems: "center", height: 12 },
|
|
1052
|
+
label: { fontSize: 13, marginLeft: 10, fontWeight: "500" }
|
|
1053
|
+
});
|
|
1054
|
+
|
|
1055
|
+
// src/native/components/chat-bubble.tsx
|
|
1056
|
+
var import_react4 = require("react");
|
|
1057
|
+
var import_react_native15 = require("react-native");
|
|
1058
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
1059
|
+
function ChatBubble({
|
|
1060
|
+
role,
|
|
1061
|
+
avatar,
|
|
1062
|
+
time,
|
|
1063
|
+
animateOnMount = true,
|
|
1064
|
+
onLongPress,
|
|
1065
|
+
maxWidth = "78%",
|
|
1066
|
+
style,
|
|
1067
|
+
children
|
|
1068
|
+
}) {
|
|
1069
|
+
const { theme, fontFamily: fontFamily2 } = useKaleidoTheme();
|
|
1070
|
+
const isUser = role === "user";
|
|
1071
|
+
const enter = (0, import_react4.useRef)(new import_react_native15.Animated.Value(animateOnMount ? 0 : 1)).current;
|
|
1072
|
+
(0, import_react4.useEffect)(() => {
|
|
1073
|
+
if (!animateOnMount) return;
|
|
1074
|
+
import_react_native15.Animated.spring(enter, { toValue: 1, tension: 120, friction: 9, useNativeDriver: true }).start();
|
|
1075
|
+
}, [enter, animateOnMount]);
|
|
1076
|
+
const bubble = /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
1077
|
+
import_react_native15.Pressable,
|
|
1078
|
+
{
|
|
1079
|
+
onLongPress,
|
|
1080
|
+
delayLongPress: 300,
|
|
1081
|
+
style: [
|
|
1082
|
+
styles6.bubble,
|
|
1083
|
+
{ maxWidth },
|
|
1084
|
+
isUser ? { backgroundColor: theme.primary } : {
|
|
1085
|
+
backgroundColor: theme.card,
|
|
1086
|
+
shadowColor: theme.background,
|
|
1087
|
+
shadowOffset: { width: 0, height: 4 },
|
|
1088
|
+
shadowOpacity: 0.3,
|
|
1089
|
+
shadowRadius: 6,
|
|
1090
|
+
elevation: 3
|
|
1091
|
+
},
|
|
1092
|
+
style
|
|
1093
|
+
],
|
|
1094
|
+
children: [
|
|
1095
|
+
children,
|
|
1096
|
+
time ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1097
|
+
import_react_native15.Text,
|
|
1098
|
+
{
|
|
1099
|
+
style: [
|
|
1100
|
+
styles6.time,
|
|
1101
|
+
{
|
|
1102
|
+
color: isUser ? theme.text.onAccent : theme.text.muted,
|
|
1103
|
+
fontFamily: fontFamily2,
|
|
1104
|
+
textAlign: isUser ? "right" : "left"
|
|
1105
|
+
}
|
|
1106
|
+
],
|
|
1107
|
+
children: time
|
|
1108
|
+
}
|
|
1109
|
+
) : null
|
|
1110
|
+
]
|
|
1111
|
+
}
|
|
1112
|
+
);
|
|
1113
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
1114
|
+
import_react_native15.Animated.View,
|
|
1115
|
+
{
|
|
1116
|
+
style: [
|
|
1117
|
+
styles6.row,
|
|
1118
|
+
{ justifyContent: isUser ? "flex-end" : "flex-start" },
|
|
1119
|
+
{
|
|
1120
|
+
opacity: enter,
|
|
1121
|
+
transform: [
|
|
1122
|
+
{ translateY: enter.interpolate({ inputRange: [0, 1], outputRange: [14, 0] }) },
|
|
1123
|
+
{ translateX: enter.interpolate({ inputRange: [0, 1], outputRange: [isUser ? 22 : -22, 0] }) },
|
|
1124
|
+
{ scale: enter.interpolate({ inputRange: [0, 1], outputRange: [0.96, 1] }) }
|
|
1125
|
+
]
|
|
1126
|
+
}
|
|
1127
|
+
],
|
|
1128
|
+
children: [
|
|
1129
|
+
!isUser && avatar,
|
|
1130
|
+
bubble,
|
|
1131
|
+
isUser && avatar
|
|
1132
|
+
]
|
|
1133
|
+
}
|
|
1134
|
+
);
|
|
1135
|
+
}
|
|
1136
|
+
var styles6 = import_react_native15.StyleSheet.create({
|
|
1137
|
+
row: { flexDirection: "row", alignItems: "flex-end", width: "100%", marginBottom: 16 },
|
|
1138
|
+
bubble: { borderRadius: 24, padding: 16, overflow: "hidden" },
|
|
1139
|
+
time: { fontSize: 12, marginTop: 8, fontWeight: "500" }
|
|
1140
|
+
});
|
|
1141
|
+
|
|
1142
|
+
// src/native/components/mode-toggle.tsx
|
|
1143
|
+
var import_react_native16 = require("react-native");
|
|
1144
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
1005
1145
|
function ModeToggle({ icon, size = 40, onToggle }) {
|
|
1006
1146
|
const { theme, mode, toggleMode } = useKaleidoTheme();
|
|
1007
|
-
return /* @__PURE__ */ (0,
|
|
1008
|
-
|
|
1147
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
1148
|
+
import_react_native16.Pressable,
|
|
1009
1149
|
{
|
|
1010
1150
|
accessibilityRole: "switch",
|
|
1011
1151
|
accessibilityState: { checked: mode === "dark" },
|
|
@@ -1025,7 +1165,7 @@ function ModeToggle({ icon, size = 40, onToggle }) {
|
|
|
1025
1165
|
justifyContent: "center",
|
|
1026
1166
|
opacity: pressed ? 0.85 : 1
|
|
1027
1167
|
}),
|
|
1028
|
-
children: /* @__PURE__ */ (0,
|
|
1168
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native16.View, { children: icon(mode, theme.text.primary, Math.round(size * 0.5)) })
|
|
1029
1169
|
}
|
|
1030
1170
|
);
|
|
1031
1171
|
}
|
|
@@ -1104,6 +1244,7 @@ var transition = {
|
|
|
1104
1244
|
AssetSelector,
|
|
1105
1245
|
Balance,
|
|
1106
1246
|
BalanceCard,
|
|
1247
|
+
ChatBubble,
|
|
1107
1248
|
CryptoAddressInput,
|
|
1108
1249
|
EmptyState,
|
|
1109
1250
|
KButton,
|
|
@@ -1124,6 +1265,7 @@ var transition = {
|
|
|
1124
1265
|
ThemeProvider,
|
|
1125
1266
|
TransactionItem,
|
|
1126
1267
|
TransactionList,
|
|
1268
|
+
TypingDots,
|
|
1127
1269
|
colors,
|
|
1128
1270
|
fontFamily,
|
|
1129
1271
|
fontWeight,
|
package/dist/native/index.d.cts
CHANGED
|
@@ -370,6 +370,34 @@ interface EmptyStateProps extends ViewProps {
|
|
|
370
370
|
}
|
|
371
371
|
declare function EmptyState({ title, description, icon, action, style, ...rest }: EmptyStateProps): react_jsx_runtime.JSX.Element;
|
|
372
372
|
|
|
373
|
+
interface TypingDotsProps {
|
|
374
|
+
/** Optional caption shown next to the dots (e.g. "Thinking on-device…"). */
|
|
375
|
+
label?: string;
|
|
376
|
+
/** Dot color override. Defaults to the brand green (`theme.primary`). */
|
|
377
|
+
color?: string;
|
|
378
|
+
style?: ViewStyle;
|
|
379
|
+
}
|
|
380
|
+
declare function TypingDots({ label, color, style }: TypingDotsProps): react_jsx_runtime.JSX.Element;
|
|
381
|
+
|
|
382
|
+
type ChatRole = 'user' | 'assistant';
|
|
383
|
+
interface ChatBubbleProps {
|
|
384
|
+
role: ChatRole;
|
|
385
|
+
/** Consumer-owned avatar node (icon, gradient, image) rendered beside the bubble. */
|
|
386
|
+
avatar?: ReactNode;
|
|
387
|
+
/** Timestamp label rendered at the bubble foot. */
|
|
388
|
+
time?: string;
|
|
389
|
+
/** Run the spring entrance animation on mount (default true). */
|
|
390
|
+
animateOnMount?: boolean;
|
|
391
|
+
onLongPress?: () => void;
|
|
392
|
+
/** Max bubble width relative to the row (default '78%'). */
|
|
393
|
+
maxWidth?: ViewStyle['maxWidth'];
|
|
394
|
+
/** Style applied to the bubble container. */
|
|
395
|
+
style?: ViewStyle;
|
|
396
|
+
/** Message body — consumer renders text / markdown / cards / typing dots. */
|
|
397
|
+
children: ReactNode;
|
|
398
|
+
}
|
|
399
|
+
declare function ChatBubble({ role, avatar, time, animateOnMount, onLongPress, maxWidth, style, children, }: ChatBubbleProps): react_jsx_runtime.JSX.Element;
|
|
400
|
+
|
|
373
401
|
interface ModeToggleProps {
|
|
374
402
|
icon: (mode: ThemeMode, color: string, size: number) => React.ReactNode;
|
|
375
403
|
size?: number;
|
|
@@ -563,4 +591,4 @@ declare const transition: {
|
|
|
563
591
|
readonly slow: "300ms ease-out";
|
|
564
592
|
};
|
|
565
593
|
|
|
566
|
-
export { ActionButton, type ActionButtonProps, AlertBanner, BalanceCard, type BalanceCardProps, EmptyState, type EmptyStateProps, KButton, type KButtonProps, KCard, type KCardProps, KScreen, type KScreenProps, KText, type KTextProps, type KaleidoTheme, KaleidoThemeProvider, KaleidoUIProvider, type KaleidoUIProviderProps, ModeToggle, type ModeToggleProps, type NativeTypeLevel, NetworkBadge, NetworkChip, type NetworkChipProps, type NetworkKey, type NetworkType, QrCode, type QrCodeProps, SectionLabel, StatusBadge, type StatusType, type ThemeMode, colors, fontFamily, fontWeight, kaleidoswapBrandConfig, kaleidoswapTokens, makeTheme, nativeType, radius, shadow, themes, transition, typeScale, useKaleidoTheme };
|
|
594
|
+
export { ActionButton, type ActionButtonProps, AlertBanner, BalanceCard, type BalanceCardProps, ChatBubble, type ChatBubbleProps, type ChatRole, EmptyState, type EmptyStateProps, KButton, type KButtonProps, KCard, type KCardProps, KScreen, type KScreenProps, KText, type KTextProps, type KaleidoTheme, KaleidoThemeProvider, KaleidoUIProvider, type KaleidoUIProviderProps, ModeToggle, type ModeToggleProps, type NativeTypeLevel, NetworkBadge, NetworkChip, type NetworkChipProps, type NetworkKey, type NetworkType, QrCode, type QrCodeProps, SectionLabel, StatusBadge, type StatusType, type ThemeMode, TypingDots, type TypingDotsProps, colors, fontFamily, fontWeight, kaleidoswapBrandConfig, kaleidoswapTokens, makeTheme, nativeType, radius, shadow, themes, transition, typeScale, useKaleidoTheme };
|
package/dist/native/index.d.ts
CHANGED
|
@@ -370,6 +370,34 @@ interface EmptyStateProps extends ViewProps {
|
|
|
370
370
|
}
|
|
371
371
|
declare function EmptyState({ title, description, icon, action, style, ...rest }: EmptyStateProps): react_jsx_runtime.JSX.Element;
|
|
372
372
|
|
|
373
|
+
interface TypingDotsProps {
|
|
374
|
+
/** Optional caption shown next to the dots (e.g. "Thinking on-device…"). */
|
|
375
|
+
label?: string;
|
|
376
|
+
/** Dot color override. Defaults to the brand green (`theme.primary`). */
|
|
377
|
+
color?: string;
|
|
378
|
+
style?: ViewStyle;
|
|
379
|
+
}
|
|
380
|
+
declare function TypingDots({ label, color, style }: TypingDotsProps): react_jsx_runtime.JSX.Element;
|
|
381
|
+
|
|
382
|
+
type ChatRole = 'user' | 'assistant';
|
|
383
|
+
interface ChatBubbleProps {
|
|
384
|
+
role: ChatRole;
|
|
385
|
+
/** Consumer-owned avatar node (icon, gradient, image) rendered beside the bubble. */
|
|
386
|
+
avatar?: ReactNode;
|
|
387
|
+
/** Timestamp label rendered at the bubble foot. */
|
|
388
|
+
time?: string;
|
|
389
|
+
/** Run the spring entrance animation on mount (default true). */
|
|
390
|
+
animateOnMount?: boolean;
|
|
391
|
+
onLongPress?: () => void;
|
|
392
|
+
/** Max bubble width relative to the row (default '78%'). */
|
|
393
|
+
maxWidth?: ViewStyle['maxWidth'];
|
|
394
|
+
/** Style applied to the bubble container. */
|
|
395
|
+
style?: ViewStyle;
|
|
396
|
+
/** Message body — consumer renders text / markdown / cards / typing dots. */
|
|
397
|
+
children: ReactNode;
|
|
398
|
+
}
|
|
399
|
+
declare function ChatBubble({ role, avatar, time, animateOnMount, onLongPress, maxWidth, style, children, }: ChatBubbleProps): react_jsx_runtime.JSX.Element;
|
|
400
|
+
|
|
373
401
|
interface ModeToggleProps {
|
|
374
402
|
icon: (mode: ThemeMode, color: string, size: number) => React.ReactNode;
|
|
375
403
|
size?: number;
|
|
@@ -563,4 +591,4 @@ declare const transition: {
|
|
|
563
591
|
readonly slow: "300ms ease-out";
|
|
564
592
|
};
|
|
565
593
|
|
|
566
|
-
export { ActionButton, type ActionButtonProps, AlertBanner, BalanceCard, type BalanceCardProps, EmptyState, type EmptyStateProps, KButton, type KButtonProps, KCard, type KCardProps, KScreen, type KScreenProps, KText, type KTextProps, type KaleidoTheme, KaleidoThemeProvider, KaleidoUIProvider, type KaleidoUIProviderProps, ModeToggle, type ModeToggleProps, type NativeTypeLevel, NetworkBadge, NetworkChip, type NetworkChipProps, type NetworkKey, type NetworkType, QrCode, type QrCodeProps, SectionLabel, StatusBadge, type StatusType, type ThemeMode, colors, fontFamily, fontWeight, kaleidoswapBrandConfig, kaleidoswapTokens, makeTheme, nativeType, radius, shadow, themes, transition, typeScale, useKaleidoTheme };
|
|
594
|
+
export { ActionButton, type ActionButtonProps, AlertBanner, BalanceCard, type BalanceCardProps, ChatBubble, type ChatBubbleProps, type ChatRole, EmptyState, type EmptyStateProps, KButton, type KButtonProps, KCard, type KCardProps, KScreen, type KScreenProps, KText, type KTextProps, type KaleidoTheme, KaleidoThemeProvider, KaleidoUIProvider, type KaleidoUIProviderProps, ModeToggle, type ModeToggleProps, type NativeTypeLevel, NetworkBadge, NetworkChip, type NetworkChipProps, type NetworkKey, type NetworkType, QrCode, type QrCodeProps, SectionLabel, StatusBadge, type StatusType, type ThemeMode, TypingDots, type TypingDotsProps, colors, fontFamily, fontWeight, kaleidoswapBrandConfig, kaleidoswapTokens, makeTheme, nativeType, radius, shadow, themes, transition, typeScale, useKaleidoTheme };
|
package/dist/native/index.js
CHANGED
|
@@ -940,13 +940,151 @@ function EmptyState({ title, description, icon, action, style, ...rest }) {
|
|
|
940
940
|
] });
|
|
941
941
|
}
|
|
942
942
|
|
|
943
|
+
// src/native/components/typing-dots.tsx
|
|
944
|
+
import { useEffect, useRef } from "react";
|
|
945
|
+
import { View as View12, Text as Text6, StyleSheet as StyleSheet5, Animated } from "react-native";
|
|
946
|
+
import { jsx as jsx16, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
947
|
+
function TypingDots({ label, color, style }) {
|
|
948
|
+
const { theme, fontFamily: fontFamily2 } = useKaleidoTheme();
|
|
949
|
+
const dots = useRef([new Animated.Value(0), new Animated.Value(0), new Animated.Value(0)]).current;
|
|
950
|
+
useEffect(() => {
|
|
951
|
+
const make = (v) => Animated.loop(
|
|
952
|
+
Animated.sequence([
|
|
953
|
+
Animated.timing(v, { toValue: 1, duration: 420, useNativeDriver: true }),
|
|
954
|
+
Animated.timing(v, { toValue: 0, duration: 420, useNativeDriver: true }),
|
|
955
|
+
Animated.delay(240)
|
|
956
|
+
])
|
|
957
|
+
);
|
|
958
|
+
const loops = dots.map(make);
|
|
959
|
+
const timers = dots.map((_, i) => setTimeout(() => loops[i].start(), i * 160));
|
|
960
|
+
return () => {
|
|
961
|
+
timers.forEach(clearTimeout);
|
|
962
|
+
loops.forEach((l) => l.stop());
|
|
963
|
+
};
|
|
964
|
+
}, [dots]);
|
|
965
|
+
const dotColor = color ?? theme.primary;
|
|
966
|
+
return /* @__PURE__ */ jsxs8(View12, { style: [styles5.row, style], children: [
|
|
967
|
+
/* @__PURE__ */ jsx16(View12, { style: styles5.dotsRow, children: dots.map((v, i) => /* @__PURE__ */ jsx16(
|
|
968
|
+
Animated.View,
|
|
969
|
+
{
|
|
970
|
+
style: {
|
|
971
|
+
width: 7,
|
|
972
|
+
height: 7,
|
|
973
|
+
borderRadius: 3.5,
|
|
974
|
+
marginHorizontal: 2.5,
|
|
975
|
+
backgroundColor: dotColor,
|
|
976
|
+
opacity: v.interpolate({ inputRange: [0, 1], outputRange: [0.35, 1] }),
|
|
977
|
+
transform: [
|
|
978
|
+
{ translateY: v.interpolate({ inputRange: [0, 1], outputRange: [0, -5] }) },
|
|
979
|
+
{ scale: v.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1.1] }) }
|
|
980
|
+
]
|
|
981
|
+
}
|
|
982
|
+
},
|
|
983
|
+
i
|
|
984
|
+
)) }),
|
|
985
|
+
label ? /* @__PURE__ */ jsx16(Text6, { style: [styles5.label, { color: theme.text.secondary, fontFamily: fontFamily2 }], children: label }) : null
|
|
986
|
+
] });
|
|
987
|
+
}
|
|
988
|
+
var styles5 = StyleSheet5.create({
|
|
989
|
+
row: { flexDirection: "row", alignItems: "center" },
|
|
990
|
+
dotsRow: { flexDirection: "row", alignItems: "center", height: 12 },
|
|
991
|
+
label: { fontSize: 13, marginLeft: 10, fontWeight: "500" }
|
|
992
|
+
});
|
|
993
|
+
|
|
994
|
+
// src/native/components/chat-bubble.tsx
|
|
995
|
+
import { useEffect as useEffect2, useRef as useRef2 } from "react";
|
|
996
|
+
import { Text as Text7, StyleSheet as StyleSheet6, Animated as Animated2, Pressable as Pressable4 } from "react-native";
|
|
997
|
+
import { jsx as jsx17, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
998
|
+
function ChatBubble({
|
|
999
|
+
role,
|
|
1000
|
+
avatar,
|
|
1001
|
+
time,
|
|
1002
|
+
animateOnMount = true,
|
|
1003
|
+
onLongPress,
|
|
1004
|
+
maxWidth = "78%",
|
|
1005
|
+
style,
|
|
1006
|
+
children
|
|
1007
|
+
}) {
|
|
1008
|
+
const { theme, fontFamily: fontFamily2 } = useKaleidoTheme();
|
|
1009
|
+
const isUser = role === "user";
|
|
1010
|
+
const enter = useRef2(new Animated2.Value(animateOnMount ? 0 : 1)).current;
|
|
1011
|
+
useEffect2(() => {
|
|
1012
|
+
if (!animateOnMount) return;
|
|
1013
|
+
Animated2.spring(enter, { toValue: 1, tension: 120, friction: 9, useNativeDriver: true }).start();
|
|
1014
|
+
}, [enter, animateOnMount]);
|
|
1015
|
+
const bubble = /* @__PURE__ */ jsxs9(
|
|
1016
|
+
Pressable4,
|
|
1017
|
+
{
|
|
1018
|
+
onLongPress,
|
|
1019
|
+
delayLongPress: 300,
|
|
1020
|
+
style: [
|
|
1021
|
+
styles6.bubble,
|
|
1022
|
+
{ maxWidth },
|
|
1023
|
+
isUser ? { backgroundColor: theme.primary } : {
|
|
1024
|
+
backgroundColor: theme.card,
|
|
1025
|
+
shadowColor: theme.background,
|
|
1026
|
+
shadowOffset: { width: 0, height: 4 },
|
|
1027
|
+
shadowOpacity: 0.3,
|
|
1028
|
+
shadowRadius: 6,
|
|
1029
|
+
elevation: 3
|
|
1030
|
+
},
|
|
1031
|
+
style
|
|
1032
|
+
],
|
|
1033
|
+
children: [
|
|
1034
|
+
children,
|
|
1035
|
+
time ? /* @__PURE__ */ jsx17(
|
|
1036
|
+
Text7,
|
|
1037
|
+
{
|
|
1038
|
+
style: [
|
|
1039
|
+
styles6.time,
|
|
1040
|
+
{
|
|
1041
|
+
color: isUser ? theme.text.onAccent : theme.text.muted,
|
|
1042
|
+
fontFamily: fontFamily2,
|
|
1043
|
+
textAlign: isUser ? "right" : "left"
|
|
1044
|
+
}
|
|
1045
|
+
],
|
|
1046
|
+
children: time
|
|
1047
|
+
}
|
|
1048
|
+
) : null
|
|
1049
|
+
]
|
|
1050
|
+
}
|
|
1051
|
+
);
|
|
1052
|
+
return /* @__PURE__ */ jsxs9(
|
|
1053
|
+
Animated2.View,
|
|
1054
|
+
{
|
|
1055
|
+
style: [
|
|
1056
|
+
styles6.row,
|
|
1057
|
+
{ justifyContent: isUser ? "flex-end" : "flex-start" },
|
|
1058
|
+
{
|
|
1059
|
+
opacity: enter,
|
|
1060
|
+
transform: [
|
|
1061
|
+
{ translateY: enter.interpolate({ inputRange: [0, 1], outputRange: [14, 0] }) },
|
|
1062
|
+
{ translateX: enter.interpolate({ inputRange: [0, 1], outputRange: [isUser ? 22 : -22, 0] }) },
|
|
1063
|
+
{ scale: enter.interpolate({ inputRange: [0, 1], outputRange: [0.96, 1] }) }
|
|
1064
|
+
]
|
|
1065
|
+
}
|
|
1066
|
+
],
|
|
1067
|
+
children: [
|
|
1068
|
+
!isUser && avatar,
|
|
1069
|
+
bubble,
|
|
1070
|
+
isUser && avatar
|
|
1071
|
+
]
|
|
1072
|
+
}
|
|
1073
|
+
);
|
|
1074
|
+
}
|
|
1075
|
+
var styles6 = StyleSheet6.create({
|
|
1076
|
+
row: { flexDirection: "row", alignItems: "flex-end", width: "100%", marginBottom: 16 },
|
|
1077
|
+
bubble: { borderRadius: 24, padding: 16, overflow: "hidden" },
|
|
1078
|
+
time: { fontSize: 12, marginTop: 8, fontWeight: "500" }
|
|
1079
|
+
});
|
|
1080
|
+
|
|
943
1081
|
// src/native/components/mode-toggle.tsx
|
|
944
|
-
import { Pressable as
|
|
945
|
-
import { jsx as
|
|
1082
|
+
import { Pressable as Pressable5, View as View14 } from "react-native";
|
|
1083
|
+
import { jsx as jsx18 } from "react/jsx-runtime";
|
|
946
1084
|
function ModeToggle({ icon, size = 40, onToggle }) {
|
|
947
1085
|
const { theme, mode, toggleMode } = useKaleidoTheme();
|
|
948
|
-
return /* @__PURE__ */
|
|
949
|
-
|
|
1086
|
+
return /* @__PURE__ */ jsx18(
|
|
1087
|
+
Pressable5,
|
|
950
1088
|
{
|
|
951
1089
|
accessibilityRole: "switch",
|
|
952
1090
|
accessibilityState: { checked: mode === "dark" },
|
|
@@ -966,7 +1104,7 @@ function ModeToggle({ icon, size = 40, onToggle }) {
|
|
|
966
1104
|
justifyContent: "center",
|
|
967
1105
|
opacity: pressed ? 0.85 : 1
|
|
968
1106
|
}),
|
|
969
|
-
children: /* @__PURE__ */
|
|
1107
|
+
children: /* @__PURE__ */ jsx18(View14, { children: icon(mode, theme.text.primary, Math.round(size * 0.5)) })
|
|
970
1108
|
}
|
|
971
1109
|
);
|
|
972
1110
|
}
|
|
@@ -1044,6 +1182,7 @@ export {
|
|
|
1044
1182
|
AssetSelector,
|
|
1045
1183
|
Balance,
|
|
1046
1184
|
BalanceCard,
|
|
1185
|
+
ChatBubble,
|
|
1047
1186
|
CryptoAddressInput,
|
|
1048
1187
|
EmptyState,
|
|
1049
1188
|
KButton,
|
|
@@ -1064,6 +1203,7 @@ export {
|
|
|
1064
1203
|
ThemeProvider2 as ThemeProvider,
|
|
1065
1204
|
TransactionItem,
|
|
1066
1205
|
TransactionList,
|
|
1206
|
+
TypingDots,
|
|
1067
1207
|
colors,
|
|
1068
1208
|
fontFamily,
|
|
1069
1209
|
fontWeight,
|
package/package.json
CHANGED