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.
@@ -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/mode-toggle.tsx
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, import_jsx_runtime16.jsx)(
1008
- import_react_native14.Pressable,
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, import_jsx_runtime16.jsx)(import_react_native14.View, { children: icon(mode, theme.text.primary, Math.round(size * 0.5)) })
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,
@@ -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 };
@@ -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 };
@@ -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 Pressable4, View as View12 } from "react-native";
945
- import { jsx as jsx16 } from "react/jsx-runtime";
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__ */ jsx16(
949
- Pressable4,
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__ */ jsx16(View12, { children: icon(mode, theme.text.primary, Math.round(size * 0.5)) })
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kaleido-ui",
3
- "version": "0.1.52",
3
+ "version": "0.1.54",
4
4
  "description": "KaleidoSwap shared UI library — design tokens, web components (Tailwind + Radix), and React Native components extending WDK UI Kit",
5
5
  "license": "MIT",
6
6
  "type": "module",