@blinkdotnew/mobile-ui 2.0.0-alpha.13 → 2.0.0-alpha.15

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/index.mjs CHANGED
@@ -13,11 +13,11 @@ import {
13
13
  SizableStack,
14
14
  ThemeableStack,
15
15
  Frame,
16
- XStack as XStack41,
17
- YStack as YStack45,
16
+ XStack as XStack44,
17
+ YStack as YStack49,
18
18
  ZStack,
19
19
  ScrollView as ScrollView7,
20
- Circle as Circle9,
20
+ Circle as Circle11,
21
21
  Square,
22
22
  Spacer,
23
23
  EnsureFlexed,
@@ -38,17 +38,17 @@ import {
38
38
  H6 as H62,
39
39
  Heading,
40
40
  Paragraph,
41
- SizableText as SizableText48,
41
+ SizableText as SizableText51,
42
42
  Text,
43
43
  Label,
44
- Button as Button11,
44
+ Button as Button13,
45
45
  Input as Input5,
46
46
  TextArea,
47
47
  Switch as Switch3,
48
48
  Checkbox,
49
49
  Slider as Slider2,
50
50
  RadioGroup,
51
- Select,
51
+ Select as Select2,
52
52
  Fieldset,
53
53
  Form,
54
54
  Card as Card2,
@@ -59,10 +59,10 @@ import {
59
59
  Spinner as Spinner2,
60
60
  ListItem as ListItem2,
61
61
  Anchor,
62
- Sheet as Sheet3,
63
- Dialog,
62
+ Sheet as Sheet5,
63
+ Dialog as Dialog2,
64
64
  AlertDialog as AlertDialog3,
65
- Popover as Popover2,
65
+ Popover as Popover3,
66
66
  Tooltip,
67
67
  TooltipSimple,
68
68
  Portal,
@@ -73,7 +73,7 @@ import {
73
73
  Accordion,
74
74
  ToggleGroup,
75
75
  AnimatePresence,
76
- Adapt,
76
+ Adapt as Adapt4,
77
77
  VisuallyHidden,
78
78
  Unspaced,
79
79
  Theme as Theme2,
@@ -1036,7 +1036,7 @@ function Container({ children, maxWidth = 500, centered = true, padding = "$4" }
1036
1036
 
1037
1037
  // src/patterns/PaywallScreen.tsx
1038
1038
  import { useState as useState5, useEffect as useEffect3 } from "react";
1039
- import { Button as Button3, SizableText as SizableText17, XStack as XStack10, YStack as YStack14, ScrollView as ScrollView2 } from "tamagui";
1039
+ import { Button as Button3, Circle as Circle2, SizableText as SizableText17, XStack as XStack10, YStack as YStack14, ScrollView as ScrollView2 } from "tamagui";
1040
1040
  import { jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
1041
1041
  function useCountdown(minutes) {
1042
1042
  const [seconds, setSeconds] = useState5((minutes ?? 0) * 60);
@@ -1050,39 +1050,93 @@ function useCountdown(minutes) {
1050
1050
  const ss = String(seconds % 60).padStart(2, "0");
1051
1051
  return { display: `${mm}:${ss}`, expired: seconds <= 0 };
1052
1052
  }
1053
- function PlanCard({ plan, selected, onPress }) {
1053
+ function normalizeFeature(feature) {
1054
+ return typeof feature === "string" ? { title: feature } : feature;
1055
+ }
1056
+ function ComparisonIcon({ enabled }) {
1057
+ return /* @__PURE__ */ jsx20(Circle2, { size: 22, backgroundColor: enabled ? "$green3" : "$color4", children: /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: enabled ? "$green10" : "$color8", fontWeight: "700", children: enabled ? "\u2713" : "\u2014" }) });
1058
+ }
1059
+ function TestimonialCard({ testimonial }) {
1060
+ return /* @__PURE__ */ jsxs13(YStack14, { flex: 1, minWidth: 220, backgroundColor: "$color2", borderRadius: "$6", padding: "$3", gap: "$2", children: [
1061
+ /* @__PURE__ */ jsxs13(SizableText17, { size: "$3", color: "$color11", children: [
1062
+ "\u201C",
1063
+ testimonial.quote,
1064
+ "\u201D"
1065
+ ] }),
1066
+ /* @__PURE__ */ jsxs13(YStack14, { children: [
1067
+ /* @__PURE__ */ jsx20(SizableText17, { size: "$2", fontWeight: "700", children: testimonial.author }),
1068
+ testimonial.meta ? /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "$color10", children: testimonial.meta }) : null
1069
+ ] })
1070
+ ] });
1071
+ }
1072
+ function CreatorHeader({ creator }) {
1073
+ return /* @__PURE__ */ jsxs13(XStack10, { alignItems: "center", justifyContent: "center", gap: "$3", children: [
1074
+ creator.avatar ? /* @__PURE__ */ jsx20(
1075
+ YStack14,
1076
+ {
1077
+ width: 72,
1078
+ height: 72,
1079
+ borderRadius: "$10",
1080
+ overflow: "hidden",
1081
+ alignItems: "center",
1082
+ justifyContent: "center",
1083
+ backgroundColor: "$color3",
1084
+ children: creator.avatar
1085
+ }
1086
+ ) : null,
1087
+ /* @__PURE__ */ jsxs13(YStack14, { alignItems: "center", gap: "$1", children: [
1088
+ /* @__PURE__ */ jsx20(SizableText17, { size: "$6", fontWeight: "800", children: creator.name }),
1089
+ creator.meta ? /* @__PURE__ */ jsx20(SizableText17, { size: "$3", color: "$color10", children: creator.meta }) : null
1090
+ ] })
1091
+ ] });
1092
+ }
1093
+ function PlanCard({
1094
+ plan,
1095
+ selected,
1096
+ onPress,
1097
+ stacked,
1098
+ dark
1099
+ }) {
1054
1100
  return /* @__PURE__ */ jsxs13(
1055
1101
  YStack14,
1056
1102
  {
1057
- flex: 1,
1103
+ flex: stacked ? void 0 : 1,
1104
+ width: stacked ? "100%" : void 0,
1058
1105
  padding: "$3",
1059
1106
  borderRadius: "$5",
1060
1107
  borderWidth: 2,
1061
- borderColor: selected ? "$color9" : "$color5",
1062
- backgroundColor: selected ? "$color3" : "$color1",
1108
+ borderColor: selected ? "$color9" : dark ? "$color6" : "$color5",
1109
+ backgroundColor: selected ? "$color3" : dark ? "$color2" : "$color1",
1063
1110
  pressStyle: { scale: 0.97, opacity: 0.9 },
1064
1111
  animation: "quick",
1065
1112
  onPress,
1066
1113
  cursor: "pointer",
1067
1114
  position: "relative",
1068
1115
  gap: "$1.5",
1069
- alignItems: "center",
1116
+ alignItems: stacked ? "flex-start" : "center",
1070
1117
  children: [
1071
1118
  plan.popular && /* @__PURE__ */ jsx20(YStack14, { position: "absolute", top: -10, backgroundColor: "$color9", paddingHorizontal: "$2", paddingVertical: 2, borderRadius: "$10", children: /* @__PURE__ */ jsx20(SizableText17, { size: "$1", color: "white", fontWeight: "700", children: "BEST VALUE" }) }),
1072
1119
  plan.savings && /* @__PURE__ */ jsx20(YStack14, { position: "absolute", top: plan.popular ? -24 : -10, right: 6, backgroundColor: "$green9", paddingHorizontal: "$1.5", paddingVertical: 2, borderRadius: "$10", children: /* @__PURE__ */ jsx20(SizableText17, { size: "$1", color: "white", fontWeight: "700", children: plan.savings }) }),
1073
- /* @__PURE__ */ jsx20(SizableText17, { size: "$2", fontWeight: "600", color: "$color11", paddingTop: plan.popular ? "$1" : 0, children: plan.name }),
1074
- /* @__PURE__ */ jsx20(SizableText17, { size: "$7", fontWeight: "800", children: plan.price }),
1120
+ /* @__PURE__ */ jsx20(SizableText17, { size: "$2", fontWeight: "600", color: dark ? "$color12" : "$color11", paddingTop: plan.popular ? "$1" : 0, children: plan.name }),
1121
+ plan.tagline ? /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "$color10", children: plan.tagline }) : null,
1122
+ /* @__PURE__ */ jsx20(SizableText17, { size: "$7", fontWeight: "800", color: dark ? "$color12" : void 0, children: plan.price }),
1075
1123
  /* @__PURE__ */ jsxs13(SizableText17, { size: "$2", color: "$color9", children: [
1076
1124
  "/",
1077
1125
  plan.period
1078
1126
  ] }),
1079
1127
  plan.pricePerWeek && /* @__PURE__ */ jsx20(SizableText17, { size: "$1", color: "$color10", children: plan.pricePerWeek }),
1080
- plan.trial && /* @__PURE__ */ jsx20(YStack14, { backgroundColor: "$green3", paddingHorizontal: "$2", paddingVertical: 2, borderRadius: "$10", marginTop: "$1", children: /* @__PURE__ */ jsx20(SizableText17, { size: "$1", color: "$green9", fontWeight: "700", children: plan.trial }) })
1128
+ plan.trial && /* @__PURE__ */ jsx20(YStack14, { backgroundColor: "$green3", paddingHorizontal: "$2", paddingVertical: 2, borderRadius: "$10", marginTop: "$1", children: /* @__PURE__ */ jsx20(SizableText17, { size: "$1", color: "$green9", fontWeight: "700", children: plan.trial }) }),
1129
+ stacked && plan.features?.length ? /* @__PURE__ */ jsx20(YStack14, { gap: "$1", width: "100%", paddingTop: "$1", children: plan.features.map((feature) => /* @__PURE__ */ jsxs13(XStack10, { gap: "$2", alignItems: "center", children: [
1130
+ /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "$green9", children: "\u2713" }),
1131
+ /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "$color10", children: feature })
1132
+ ] }, feature)) }) : null
1081
1133
  ]
1082
1134
  }
1083
1135
  );
1084
1136
  }
1085
1137
  function PaywallScreen({
1138
+ variant = "default",
1139
+ eyebrow,
1086
1140
  title = "Unlock Premium",
1087
1141
  subtitle,
1088
1142
  features = [],
@@ -1099,29 +1153,71 @@ function PaywallScreen({
1099
1153
  hero,
1100
1154
  socialProof,
1101
1155
  countdownMinutes,
1102
- badge
1156
+ badge,
1157
+ comparisonRows = [],
1158
+ testimonials = [],
1159
+ creator,
1160
+ topSlot,
1161
+ footerSlot
1103
1162
  }) {
1104
1163
  const selected = selectedPlan ?? plans.find((p) => p.popular)?.id ?? plans[0]?.id;
1105
1164
  const countdown = useCountdown(countdownMinutes);
1106
- return /* @__PURE__ */ jsxs13(YStack14, { flex: 1, backgroundColor: "$background", children: [
1165
+ const dark = variant === "immersive-dark";
1166
+ const stackedPlans = variant === "comparison" || variant === "creator-sheet";
1167
+ const backgroundColor = dark ? "$color1" : "$background";
1168
+ const toneColor = dark ? "$color12" : "$color11";
1169
+ const mutedColor = dark ? "$color10" : "$color10";
1170
+ return /* @__PURE__ */ jsxs13(YStack14, { flex: 1, backgroundColor, children: [
1107
1171
  onClose && /* @__PURE__ */ jsx20(XStack10, { position: "absolute", top: "$4", right: "$4", zIndex: 10, children: /* @__PURE__ */ jsx20(Button3, { size: "$3", circular: true, chromeless: true, onPress: onClose, pressStyle: { opacity: 0.6 }, children: /* @__PURE__ */ jsx20(SizableText17, { size: "$5", color: "$color9", children: "\u2715" }) }) }),
1108
1172
  /* @__PURE__ */ jsx20(ScrollView2, { flex: 1, contentContainerStyle: { paddingBottom: 220 }, children: /* @__PURE__ */ jsxs13(YStack14, { padding: "$4", gap: "$4", paddingTop: "$8", children: [
1173
+ topSlot,
1174
+ creator && variant === "creator-sheet" ? /* @__PURE__ */ jsx20(CreatorHeader, { creator }) : null,
1109
1175
  hero && /* @__PURE__ */ jsx20(YStack14, { alignItems: "center", paddingVertical: "$3", children: hero }),
1110
1176
  badge && /* @__PURE__ */ jsx20(XStack10, { justifyContent: "center", children: /* @__PURE__ */ jsx20(YStack14, { backgroundColor: "$color9", paddingHorizontal: "$3", paddingVertical: "$1", borderRadius: "$10", children: /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "white", fontWeight: "700", children: badge }) }) }),
1111
1177
  /* @__PURE__ */ jsxs13(YStack14, { gap: "$1.5", alignItems: "center", children: [
1112
- /* @__PURE__ */ jsx20(SizableText17, { size: "$9", fontWeight: "800", textAlign: "center", children: title }),
1113
- subtitle && /* @__PURE__ */ jsx20(SizableText17, { size: "$4", color: "$color10", textAlign: "center", children: subtitle }),
1178
+ eyebrow ? /* @__PURE__ */ jsx20(SizableText17, { size: "$2", fontWeight: "700", color: "$color9", textTransform: "uppercase", children: eyebrow }) : null,
1179
+ /* @__PURE__ */ jsx20(SizableText17, { size: "$9", fontWeight: "800", textAlign: "center", color: toneColor, children: title }),
1180
+ subtitle && /* @__PURE__ */ jsx20(SizableText17, { size: "$4", color: mutedColor, textAlign: "center", children: subtitle }),
1114
1181
  socialProof && /* @__PURE__ */ jsx20(SizableText17, { size: "$3", color: "$color9", fontWeight: "600", textAlign: "center", children: socialProof })
1115
1182
  ] }),
1116
1183
  countdownMinutes && !countdown.expired && /* @__PURE__ */ jsxs13(XStack10, { justifyContent: "center", padding: "$2", backgroundColor: "$red3", borderRadius: "$4", alignSelf: "center", paddingHorizontal: "$4", gap: "$2", alignItems: "center", children: [
1117
1184
  /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "$red9", fontWeight: "600", children: "Offer ends in" }),
1118
1185
  /* @__PURE__ */ jsx20(SizableText17, { size: "$5", color: "$red9", fontWeight: "800", fontFamily: "$mono", children: countdown.display })
1119
1186
  ] }),
1120
- features.length > 0 && /* @__PURE__ */ jsx20(YStack14, { gap: "$2.5", paddingHorizontal: "$2", children: features.map((f, i) => /* @__PURE__ */ jsxs13(XStack10, { gap: "$2.5", alignItems: "center", children: [
1121
- /* @__PURE__ */ jsx20(SizableText17, { size: "$4", color: "$green9", children: "\u2713" }),
1122
- /* @__PURE__ */ jsx20(SizableText17, { size: "$4", color: "$color11", flex: 1, children: f })
1123
- ] }, i)) }),
1124
- /* @__PURE__ */ jsx20(XStack10, { gap: "$3", paddingTop: "$1", children: plans.map((plan) => /* @__PURE__ */ jsx20(PlanCard, { plan, selected: selected === plan.id, onPress: () => onSelectPlan?.(plan.id) }, plan.id)) })
1187
+ features.length > 0 && /* @__PURE__ */ jsx20(YStack14, { gap: "$2.5", paddingHorizontal: "$2", children: features.map((feature, i) => {
1188
+ const item = normalizeFeature(feature);
1189
+ return /* @__PURE__ */ jsxs13(XStack10, { gap: "$2.5", alignItems: "center", children: [
1190
+ /* @__PURE__ */ jsx20(YStack14, { minWidth: 24, alignItems: "center", children: item.icon ?? /* @__PURE__ */ jsx20(SizableText17, { size: "$4", color: "$green9", children: "\u2713" }) }),
1191
+ /* @__PURE__ */ jsxs13(YStack14, { flex: 1, gap: "$1", children: [
1192
+ /* @__PURE__ */ jsx20(SizableText17, { size: "$4", color: toneColor, flex: 1, children: item.title }),
1193
+ item.description ? /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: mutedColor, children: item.description }) : null
1194
+ ] })
1195
+ ] }, i);
1196
+ }) }),
1197
+ variant === "social-proof" && testimonials.length > 0 ? /* @__PURE__ */ jsx20(ScrollView2, { horizontal: true, showsHorizontalScrollIndicator: false, children: /* @__PURE__ */ jsx20(XStack10, { gap: "$3", children: testimonials.map((testimonial, index) => /* @__PURE__ */ jsx20(TestimonialCard, { testimonial }, `${testimonial.author}-${index}`)) }) }) : null,
1198
+ variant === "comparison" && comparisonRows.length > 0 ? /* @__PURE__ */ jsxs13(YStack14, { backgroundColor: dark ? "$color2" : "$color1", borderRadius: "$6", padding: "$3", gap: "$2", borderWidth: 1, borderColor: "$color4", children: [
1199
+ /* @__PURE__ */ jsxs13(XStack10, { alignItems: "center", children: [
1200
+ /* @__PURE__ */ jsx20(SizableText17, { flex: 1, size: "$2", fontWeight: "700", color: "$color10", children: "Feature" }),
1201
+ /* @__PURE__ */ jsx20(SizableText17, { width: 64, size: "$2", fontWeight: "700", textAlign: "center", color: "$color10", children: "Free" }),
1202
+ /* @__PURE__ */ jsx20(SizableText17, { width: 84, size: "$2", fontWeight: "700", textAlign: "center", color: "$color10", children: "Premium" })
1203
+ ] }),
1204
+ comparisonRows.map((row) => /* @__PURE__ */ jsxs13(XStack10, { alignItems: "center", paddingVertical: "$1.5", children: [
1205
+ /* @__PURE__ */ jsx20(SizableText17, { flex: 1, size: "$3", color: toneColor, children: row.label }),
1206
+ /* @__PURE__ */ jsx20(XStack10, { width: 64, justifyContent: "center", children: /* @__PURE__ */ jsx20(ComparisonIcon, { enabled: row.free }) }),
1207
+ /* @__PURE__ */ jsx20(XStack10, { width: 84, justifyContent: "center", children: /* @__PURE__ */ jsx20(ComparisonIcon, { enabled: row.premium }) })
1208
+ ] }, row.label))
1209
+ ] }) : null,
1210
+ /* @__PURE__ */ jsx20(XStack10, { gap: "$3", paddingTop: "$1", flexWrap: "wrap", children: plans.map((plan) => /* @__PURE__ */ jsx20(
1211
+ PlanCard,
1212
+ {
1213
+ plan,
1214
+ selected: selected === plan.id,
1215
+ onPress: () => onSelectPlan?.(plan.id),
1216
+ stacked: stackedPlans,
1217
+ dark
1218
+ },
1219
+ plan.id
1220
+ )) })
1125
1221
  ] }) }),
1126
1222
  /* @__PURE__ */ jsxs13(
1127
1223
  YStack14,
@@ -1132,7 +1228,7 @@ function PaywallScreen({
1132
1228
  right: 0,
1133
1229
  padding: "$4",
1134
1230
  paddingBottom: "$6",
1135
- backgroundColor: "$background",
1231
+ backgroundColor,
1136
1232
  borderTopWidth: 1,
1137
1233
  borderTopColor: "$color4",
1138
1234
  gap: "$2.5",
@@ -1156,7 +1252,8 @@ function PaywallScreen({
1156
1252
  onRestore && /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "$color8", onPress: onRestore, pressStyle: { opacity: 0.6 }, children: "Restore" }),
1157
1253
  onTerms && /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "$color8", onPress: onTerms, pressStyle: { opacity: 0.6 }, children: "Terms" }),
1158
1254
  onPrivacy && /* @__PURE__ */ jsx20(SizableText17, { size: "$2", color: "$color8", onPress: onPrivacy, pressStyle: { opacity: 0.6 }, children: "Privacy" })
1159
- ] })
1255
+ ] }),
1256
+ footerSlot
1160
1257
  ]
1161
1258
  }
1162
1259
  )
@@ -1165,34 +1262,79 @@ function PaywallScreen({
1165
1262
 
1166
1263
  // src/patterns/OnboardingCarousel.tsx
1167
1264
  import { useState as useState6 } from "react";
1168
- import { Button as Button4, SizableText as SizableText18, XStack as XStack11, YStack as YStack15, Circle as Circle2 } from "tamagui";
1265
+ import { Button as Button4, SizableText as SizableText18, XStack as XStack11, YStack as YStack15, Circle as Circle3 } from "tamagui";
1169
1266
  import { jsx as jsx21, jsxs as jsxs14 } from "react/jsx-runtime";
1170
1267
  function OnboardingCarousel({
1171
1268
  steps,
1269
+ variant = "default",
1270
+ brand,
1271
+ topLeading,
1172
1272
  onComplete,
1173
1273
  onSkip,
1174
1274
  completeLabel = "Get Started",
1175
1275
  skipLabel = "Skip",
1176
- nextLabel = "Next"
1276
+ nextLabel = "Next",
1277
+ footerSlot
1177
1278
  }) {
1178
1279
  const [current, setCurrent] = useState6(0);
1280
+ if (steps.length === 0) {
1281
+ return /* @__PURE__ */ jsx21(YStack15, { flex: 1, backgroundColor: "$background", padding: "$4", alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx21(SizableText18, { size: "$5", color: "$color10", textAlign: "center", children: "Add at least one onboarding step." }) });
1282
+ }
1179
1283
  const isLast = current === steps.length - 1;
1180
1284
  const step = steps[current];
1181
- return /* @__PURE__ */ jsxs14(YStack15, { flex: 1, backgroundColor: "$background", padding: "$4", justifyContent: "space-between", children: [
1182
- /* @__PURE__ */ jsx21(XStack11, { justifyContent: "flex-end", paddingTop: "$4", children: !isLast && onSkip && /* @__PURE__ */ jsx21(Button4, { chromeless: true, onPress: onSkip, children: /* @__PURE__ */ jsx21(SizableText18, { size: "$4", color: "$color9", children: skipLabel }) }) }),
1285
+ const hero = step?.hero ?? step?.icon;
1286
+ const isEditorial = variant === "editorial";
1287
+ const isSelection = variant === "selection-step";
1288
+ const isPermission = variant === "permission-prompt";
1289
+ const topPadding = isEditorial ? "$6" : "$4";
1290
+ const titleSize = isEditorial ? "$10" : "$9";
1291
+ const backgroundColor = variant === "calm-gradient" ? "$color2" : "$background";
1292
+ const heroBackground = isPermission ? "$color3" : isSelection ? "$color1" : "$color2";
1293
+ const heroRadius = variant === "card-tilt" || isSelection ? "$8" : "$10";
1294
+ const buttonTone = variant === "editorial" ? "$color12" : "$color9";
1295
+ return /* @__PURE__ */ jsxs14(YStack15, { flex: 1, backgroundColor, padding: "$4", justifyContent: "space-between", children: [
1296
+ step?.background ? /* @__PURE__ */ jsx21(YStack15, { position: "absolute", left: 0, right: 0, top: 0, bottom: 0, children: step.background }) : null,
1297
+ /* @__PURE__ */ jsxs14(XStack11, { justifyContent: "space-between", alignItems: "center", paddingTop: topPadding, children: [
1298
+ /* @__PURE__ */ jsx21(XStack11, { minWidth: 40, children: topLeading }),
1299
+ brand ? /* @__PURE__ */ jsx21(YStack15, { alignItems: "center", flex: 1, children: brand }) : /* @__PURE__ */ jsx21(YStack15, { flex: 1 }),
1300
+ !isLast && onSkip && /* @__PURE__ */ jsx21(Button4, { chromeless: true, onPress: onSkip, children: /* @__PURE__ */ jsx21(SizableText18, { size: "$4", color: "$color9", children: skipLabel }) })
1301
+ ] }),
1183
1302
  /* @__PURE__ */ jsxs14(YStack15, { flex: 1, alignItems: "center", justifyContent: "center", gap: "$5", paddingHorizontal: "$4", children: [
1184
- step?.icon && /* @__PURE__ */ jsx21(Circle2, { size: 120, backgroundColor: "$color2", alignItems: "center", justifyContent: "center", children: step.icon }),
1303
+ hero ? variant === "card-tilt" || isSelection ? /* @__PURE__ */ jsx21(
1304
+ YStack15,
1305
+ {
1306
+ width: "100%",
1307
+ maxWidth: 340,
1308
+ minHeight: 260,
1309
+ borderRadius: heroRadius,
1310
+ backgroundColor: heroBackground,
1311
+ padding: "$3",
1312
+ alignItems: "center",
1313
+ justifyContent: "center",
1314
+ borderWidth: variant === "card-tilt" ? 3 : 1,
1315
+ borderColor: "$color4",
1316
+ shadowColor: "$shadowColor",
1317
+ shadowOpacity: 0.14,
1318
+ shadowRadius: 18,
1319
+ shadowOffset: { width: 0, height: 10 },
1320
+ style: variant === "card-tilt" ? { transform: [{ rotate: "-5deg" }] } : void 0,
1321
+ children: hero
1322
+ }
1323
+ ) : /* @__PURE__ */ jsx21(Circle3, { size: isPermission ? 140 : 120, backgroundColor: heroBackground, alignItems: "center", justifyContent: "center", children: hero }) : null,
1185
1324
  /* @__PURE__ */ jsxs14(YStack15, { gap: "$3", alignItems: "center", children: [
1186
- /* @__PURE__ */ jsx21(SizableText18, { size: "$9", fontWeight: "700", textAlign: "center", children: step?.title }),
1325
+ step?.eyebrow ? /* @__PURE__ */ jsx21(SizableText18, { size: "$2", color: "$color9", fontWeight: "700", textTransform: "uppercase", children: step.eyebrow }) : null,
1326
+ /* @__PURE__ */ jsx21(SizableText18, { size: titleSize, fontWeight: "700", textAlign: "center", children: step?.title }),
1187
1327
  /* @__PURE__ */ jsx21(SizableText18, { size: "$4", color: "$color10", textAlign: "center", maxWidth: 300, children: step?.description })
1188
1328
  ] })
1189
1329
  ] }),
1190
1330
  /* @__PURE__ */ jsxs14(YStack15, { gap: "$3", paddingBottom: "$2", children: [
1191
1331
  /* @__PURE__ */ jsx21(XStack11, { justifyContent: "center", gap: "$2", children: steps.map((_, i) => /* @__PURE__ */ jsx21(
1192
- Circle2,
1332
+ Circle3,
1193
1333
  {
1194
- size: 8,
1334
+ size: variant === "card-tilt" ? 10 : 8,
1335
+ width: i === current && variant !== "default" ? 24 : void 0,
1195
1336
  backgroundColor: i === current ? "$color9" : "$color4",
1337
+ borderRadius: "$10",
1196
1338
  animation: "quick"
1197
1339
  },
1198
1340
  i
@@ -1201,21 +1343,22 @@ function OnboardingCarousel({
1201
1343
  Button4,
1202
1344
  {
1203
1345
  size: "$5",
1204
- backgroundColor: "$color9",
1346
+ backgroundColor: buttonTone,
1205
1347
  color: "$color1",
1206
- borderRadius: "$5",
1207
- hoverStyle: { backgroundColor: "$color10" },
1348
+ borderRadius: variant === "editorial" ? "$10" : "$5",
1349
+ hoverStyle: { backgroundColor: variant === "editorial" ? "$color11" : "$color10" },
1208
1350
  pressStyle: { backgroundColor: "$color8" },
1209
1351
  onPress: () => isLast ? onComplete?.() : setCurrent((c) => c + 1),
1210
- children: isLast ? completeLabel : nextLabel
1352
+ children: isLast ? step?.ctaLabel ?? completeLabel : step?.ctaLabel ?? nextLabel
1211
1353
  }
1212
- )
1354
+ ),
1355
+ footerSlot
1213
1356
  ] })
1214
1357
  ] });
1215
1358
  }
1216
1359
 
1217
1360
  // src/patterns/ChatBubble.tsx
1218
- import { SizableText as SizableText19, XStack as XStack12, YStack as YStack16, Circle as Circle3, Image as Image3 } from "tamagui";
1361
+ import { SizableText as SizableText19, XStack as XStack12, YStack as YStack16, Circle as Circle4, Image as Image3 } from "tamagui";
1219
1362
  import { jsx as jsx22, jsxs as jsxs15 } from "react/jsx-runtime";
1220
1363
  function ChatBubble({ message, showAvatar = true }) {
1221
1364
  const isUser = message.sender === "user";
@@ -1227,7 +1370,7 @@ function ChatBubble({ message, showAvatar = true }) {
1227
1370
  gap: "$2",
1228
1371
  flexDirection: isUser ? "row-reverse" : "row",
1229
1372
  children: [
1230
- showAvatar && !isUser && /* @__PURE__ */ jsx22(Circle3, { size: 32, backgroundColor: "$color4", overflow: "hidden", children: message.avatar ? /* @__PURE__ */ jsx22(Image3, { source: { uri: message.avatar }, width: 32, height: 32, objectFit: "cover" }) : /* @__PURE__ */ jsx22(SizableText19, { size: "$2", fontWeight: "600", color: "$color11", children: message.senderName?.[0]?.toUpperCase() ?? "?" }) }),
1373
+ showAvatar && !isUser && /* @__PURE__ */ jsx22(Circle4, { size: 32, backgroundColor: "$color4", overflow: "hidden", children: message.avatar ? /* @__PURE__ */ jsx22(Image3, { source: { uri: message.avatar }, width: 32, height: 32, objectFit: "cover" }) : /* @__PURE__ */ jsx22(SizableText19, { size: "$2", fontWeight: "600", color: "$color11", children: message.senderName?.[0]?.toUpperCase() ?? "?" }) }),
1231
1374
  /* @__PURE__ */ jsxs15(
1232
1375
  YStack16,
1233
1376
  {
@@ -1326,11 +1469,11 @@ function EmptyState({ icon, title, description, actionLabel, onAction }) {
1326
1469
  }
1327
1470
 
1328
1471
  // src/patterns/ProfileHeader.tsx
1329
- import { Circle as Circle4, Image as Image4, SizableText as SizableText22, XStack as XStack14, YStack as YStack19 } from "tamagui";
1472
+ import { Circle as Circle5, Image as Image4, SizableText as SizableText22, XStack as XStack14, YStack as YStack19 } from "tamagui";
1330
1473
  import { jsx as jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
1331
1474
  function ProfileHeader({ name, subtitle, avatar, stats, actions }) {
1332
1475
  return /* @__PURE__ */ jsxs18(YStack19, { alignItems: "center", gap: "$4", paddingVertical: "$6", paddingHorizontal: "$4", children: [
1333
- /* @__PURE__ */ jsx25(Circle4, { size: 80, backgroundColor: "$color4", overflow: "hidden", children: avatar ? /* @__PURE__ */ jsx25(Image4, { source: { uri: avatar }, width: 80, height: 80, objectFit: "cover" }) : /* @__PURE__ */ jsx25(SizableText22, { size: "$9", fontWeight: "700", color: "$color11", children: name[0]?.toUpperCase() ?? "?" }) }),
1476
+ /* @__PURE__ */ jsx25(Circle5, { size: 80, backgroundColor: "$color4", overflow: "hidden", children: avatar ? /* @__PURE__ */ jsx25(Image4, { source: { uri: avatar }, width: 80, height: 80, objectFit: "cover" }) : /* @__PURE__ */ jsx25(SizableText22, { size: "$9", fontWeight: "700", color: "$color11", children: name[0]?.toUpperCase() ?? "?" }) }),
1334
1477
  /* @__PURE__ */ jsxs18(YStack19, { alignItems: "center", gap: "$1", children: [
1335
1478
  /* @__PURE__ */ jsx25(SizableText22, { size: "$7", fontWeight: "700", children: name }),
1336
1479
  subtitle && /* @__PURE__ */ jsx25(SizableText22, { size: "$4", color: "$color10", children: subtitle })
@@ -1419,65 +1562,120 @@ function BottomSheet({ open, onOpenChange, title, children, snapPoints = [85], d
1419
1562
 
1420
1563
  // src/patterns/LoginScreen.tsx
1421
1564
  import { useState as useState7 } from "react";
1422
- import { Button as Button6, SizableText as SizableText25, Spinner, XStack as XStack17, YStack as YStack22 } from "tamagui";
1423
- import { jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
1424
- function LoginScreen({ title = "Welcome", subtitle = "Sign in to continue", logo, providers = [], onProviderPress, showEmailForm, onEmailSubmit, onForgotPassword, onCreateAccount, onTerms, onPrivacy, loading }) {
1565
+ import { Button as Button6, Circle as Circle6, SizableText as SizableText25, Spinner, XStack as XStack17, YStack as YStack22 } from "tamagui";
1566
+ import { Fragment as Fragment2, jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
1567
+ var BRAND_STYLES = {
1568
+ google: { backgroundColor: "$color1", borderColor: "$color5", textColor: "$color12", label: "G" },
1569
+ apple: { backgroundColor: "$color12", borderColor: "$color12", textColor: "$color1", label: "\uF8FF" },
1570
+ github: { backgroundColor: "$color12", borderColor: "$color12", textColor: "$color1", label: "\u25CE" },
1571
+ microsoft: { backgroundColor: "$color1", borderColor: "$color5", textColor: "$color12", label: "\u25A0" },
1572
+ custom: { backgroundColor: "$color1", borderColor: "$color5", textColor: "$color12", label: "\u2022" }
1573
+ };
1574
+ function ProviderBadge({ provider, buttonStyle }) {
1575
+ const brand = provider.brand ?? "custom";
1576
+ const tone = BRAND_STYLES[brand];
1577
+ if (provider.icon) return /* @__PURE__ */ jsx28(Fragment2, { children: provider.icon });
1578
+ return /* @__PURE__ */ jsx28(Circle6, { size: 28, backgroundColor: buttonStyle === "brand" ? "$color2" : "$color3", children: /* @__PURE__ */ jsx28(SizableText25, { size: "$3", fontWeight: "700", color: tone.textColor, children: tone.label }) });
1579
+ }
1580
+ function LoginScreen({
1581
+ variant = "default",
1582
+ title = "Welcome",
1583
+ subtitle = "Sign in to continue",
1584
+ logo,
1585
+ providers = [],
1586
+ hero,
1587
+ backgroundSlot,
1588
+ footerSlot,
1589
+ providerButtonStyle = "brand",
1590
+ onProviderPress,
1591
+ showEmailForm,
1592
+ onEmailSubmit,
1593
+ onForgotPassword,
1594
+ onCreateAccount,
1595
+ onTerms,
1596
+ onPrivacy,
1597
+ loading
1598
+ }) {
1425
1599
  const [email, setEmail] = useState7("");
1426
1600
  const [password, setPassword] = useState7("");
1601
+ const isEditorial = variant === "editorial";
1602
+ const isCenteredCard = variant === "centered-card";
1427
1603
  return /* @__PURE__ */ jsxs21(YStack22, { flex: 1, padding: "$4", gap: "$5", backgroundColor: "$background", justifyContent: "center", children: [
1428
- /* @__PURE__ */ jsxs21(YStack22, { alignItems: "center", gap: "$2", children: [
1429
- logo && /* @__PURE__ */ jsx28(YStack22, { paddingBottom: "$3", children: logo }),
1430
- /* @__PURE__ */ jsx28(SizableText25, { size: "$9", fontWeight: "700", textAlign: "center", children: title }),
1431
- /* @__PURE__ */ jsx28(SizableText25, { size: "$4", color: "$color10", textAlign: "center", children: subtitle })
1432
- ] }),
1433
- providers.length > 0 && /* @__PURE__ */ jsx28(YStack22, { gap: "$2.5", children: providers.map((p) => /* @__PURE__ */ jsx28(
1434
- Button6,
1604
+ backgroundSlot ? /* @__PURE__ */ jsx28(YStack22, { position: "absolute", left: 0, right: 0, top: 0, bottom: 0, children: backgroundSlot }) : null,
1605
+ /* @__PURE__ */ jsxs21(
1606
+ YStack22,
1435
1607
  {
1436
- size: "$5",
1437
- borderWidth: 1.5,
1438
- borderColor: "$color5",
1439
- backgroundColor: "$color1",
1440
- borderRadius: "$4",
1441
- disabled: loading,
1442
- onPress: () => onProviderPress?.(p.id),
1443
- hoverStyle: { backgroundColor: "$color2" },
1444
- pressStyle: { backgroundColor: "$color3" },
1445
- children: /* @__PURE__ */ jsxs21(XStack17, { alignItems: "center", gap: "$2", children: [
1446
- p.icon,
1447
- /* @__PURE__ */ jsx28(SizableText25, { size: "$4", fontWeight: "500", children: p.name })
1448
- ] })
1449
- },
1450
- p.id
1451
- )) }),
1452
- showEmailForm && providers.length > 0 && /* @__PURE__ */ jsx28(Divider, { label: "or" }),
1453
- showEmailForm && /* @__PURE__ */ jsxs21(YStack22, { gap: "$3", children: [
1454
- /* @__PURE__ */ jsx28(Input, { label: "Email", placeholder: "your@email.com", value: email, onChangeText: setEmail, keyboardType: "email-address", autoCapitalize: "none" }),
1455
- /* @__PURE__ */ jsx28(Input, { label: "Password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", value: password, onChangeText: setPassword, secureTextEntry: true }),
1456
- onForgotPassword && /* @__PURE__ */ jsx28(XStack17, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx28(SizableText25, { size: "$3", color: "$color9", onPress: onForgotPassword, children: "Forgot password?" }) }),
1457
- /* @__PURE__ */ jsx28(
1458
- Button6,
1459
- {
1460
- size: "$5",
1461
- backgroundColor: "$color9",
1462
- color: "$color1",
1463
- borderRadius: "$5",
1464
- disabled: loading,
1465
- onPress: () => onEmailSubmit?.(email, password),
1466
- hoverStyle: { backgroundColor: "$color10" },
1467
- pressStyle: { backgroundColor: "$color8" },
1468
- icon: loading ? /* @__PURE__ */ jsx28(Spinner, { size: "small", color: "$color1" }) : void 0,
1469
- children: "Sign In"
1470
- }
1471
- ),
1472
- onCreateAccount && /* @__PURE__ */ jsx28(Button6, { size: "$3", chromeless: true, onPress: onCreateAccount, children: /* @__PURE__ */ jsx28(SizableText25, { size: "$3", color: "$color9", children: "Create Account" }) })
1473
- ] }),
1474
- (onTerms || onPrivacy) && /* @__PURE__ */ jsx28(YStack22, { paddingTop: "$2", alignItems: "center", children: /* @__PURE__ */ jsxs21(SizableText25, { size: "$2", color: "$color8", textAlign: "center", children: [
1475
- "By continuing you agree to our",
1476
- " ",
1477
- onTerms && /* @__PURE__ */ jsx28(SizableText25, { size: "$2", color: "$color9", onPress: onTerms, children: "Terms of Service" }),
1478
- onTerms && onPrivacy && " & ",
1479
- onPrivacy && /* @__PURE__ */ jsx28(SizableText25, { size: "$2", color: "$color9", onPress: onPrivacy, children: "Privacy Policy" })
1480
- ] }) })
1608
+ gap: "$5",
1609
+ backgroundColor: isCenteredCard ? "$color1" : "transparent",
1610
+ borderRadius: isCenteredCard ? "$7" : void 0,
1611
+ padding: isCenteredCard ? "$4" : void 0,
1612
+ borderWidth: isCenteredCard ? 1 : 0,
1613
+ borderColor: isCenteredCard ? "$color4" : void 0,
1614
+ children: [
1615
+ /* @__PURE__ */ jsxs21(YStack22, { alignItems: "center", gap: "$2", children: [
1616
+ logo && /* @__PURE__ */ jsx28(YStack22, { paddingBottom: "$3", children: logo }),
1617
+ hero ? /* @__PURE__ */ jsx28(YStack22, { paddingBottom: "$2", children: hero }) : null,
1618
+ /* @__PURE__ */ jsx28(SizableText25, { size: isEditorial ? "$10" : "$9", fontWeight: "700", textAlign: "center", fontFamily: isEditorial ? "$heading" : void 0, children: title }),
1619
+ /* @__PURE__ */ jsx28(SizableText25, { size: "$4", color: "$color10", textAlign: "center", children: subtitle })
1620
+ ] }),
1621
+ providers.length > 0 && /* @__PURE__ */ jsx28(YStack22, { gap: "$2.5", children: providers.map((p) => /* @__PURE__ */ jsx28(
1622
+ Button6,
1623
+ {
1624
+ size: "$5",
1625
+ borderWidth: 1.5,
1626
+ borderColor: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].borderColor : "$color5",
1627
+ backgroundColor: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].backgroundColor : "$color1",
1628
+ borderRadius: isEditorial ? "$6" : "$4",
1629
+ disabled: loading,
1630
+ onPress: () => onProviderPress?.(p.id),
1631
+ hoverStyle: { backgroundColor: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].backgroundColor : "$color2" },
1632
+ pressStyle: { backgroundColor: "$color3" },
1633
+ children: /* @__PURE__ */ jsxs21(XStack17, { alignItems: "center", justifyContent: "space-between", width: "100%", gap: "$2", children: [
1634
+ /* @__PURE__ */ jsxs21(XStack17, { alignItems: "center", gap: "$2.5", children: [
1635
+ /* @__PURE__ */ jsx28(ProviderBadge, { provider: p, buttonStyle: providerButtonStyle }),
1636
+ /* @__PURE__ */ jsxs21(YStack22, { alignItems: "flex-start", children: [
1637
+ /* @__PURE__ */ jsx28(SizableText25, { size: "$4", fontWeight: "600", color: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].textColor : void 0, children: p.name }),
1638
+ p.description ? /* @__PURE__ */ jsx28(SizableText25, { size: "$2", color: "$color10", children: p.description }) : null
1639
+ ] })
1640
+ ] }),
1641
+ /* @__PURE__ */ jsx28(SizableText25, { size: "$4", color: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].textColor : "$color9", children: "\u2192" })
1642
+ ] })
1643
+ },
1644
+ p.id
1645
+ )) }),
1646
+ showEmailForm && providers.length > 0 && /* @__PURE__ */ jsx28(Divider, { label: "or" }),
1647
+ showEmailForm && /* @__PURE__ */ jsxs21(YStack22, { gap: "$3", children: [
1648
+ /* @__PURE__ */ jsx28(Input, { label: "Email", placeholder: "your@email.com", value: email, onChangeText: setEmail, keyboardType: "email-address", autoCapitalize: "none" }),
1649
+ /* @__PURE__ */ jsx28(Input, { label: "Password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", value: password, onChangeText: setPassword, secureTextEntry: true }),
1650
+ onForgotPassword && /* @__PURE__ */ jsx28(XStack17, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx28(SizableText25, { size: "$3", color: "$color9", onPress: onForgotPassword, children: "Forgot password?" }) }),
1651
+ /* @__PURE__ */ jsx28(
1652
+ Button6,
1653
+ {
1654
+ size: "$5",
1655
+ backgroundColor: "$color9",
1656
+ color: "$color1",
1657
+ borderRadius: "$5",
1658
+ disabled: loading,
1659
+ onPress: () => onEmailSubmit?.(email, password),
1660
+ hoverStyle: { backgroundColor: "$color10" },
1661
+ pressStyle: { backgroundColor: "$color8" },
1662
+ icon: loading ? /* @__PURE__ */ jsx28(Spinner, { size: "small", color: "$color1" }) : void 0,
1663
+ children: "Sign In"
1664
+ }
1665
+ ),
1666
+ onCreateAccount && /* @__PURE__ */ jsx28(Button6, { size: "$3", chromeless: true, onPress: onCreateAccount, children: /* @__PURE__ */ jsx28(SizableText25, { size: "$3", color: "$color9", children: "Create Account" }) })
1667
+ ] }),
1668
+ (onTerms || onPrivacy) && /* @__PURE__ */ jsx28(YStack22, { paddingTop: "$2", alignItems: "center", children: /* @__PURE__ */ jsxs21(SizableText25, { size: "$2", color: "$color8", textAlign: "center", children: [
1669
+ "By continuing you agree to our",
1670
+ " ",
1671
+ onTerms && /* @__PURE__ */ jsx28(SizableText25, { size: "$2", color: "$color9", onPress: onTerms, children: "Terms of Service" }),
1672
+ onTerms && onPrivacy && " & ",
1673
+ onPrivacy && /* @__PURE__ */ jsx28(SizableText25, { size: "$2", color: "$color9", onPress: onPrivacy, children: "Privacy Policy" })
1674
+ ] }) }),
1675
+ footerSlot
1676
+ ]
1677
+ }
1678
+ )
1481
1679
  ] });
1482
1680
  }
1483
1681
 
@@ -1679,7 +1877,7 @@ function NotificationBanner({ title, message, variant = "info", onPress, onDismi
1679
1877
  }
1680
1878
 
1681
1879
  // src/patterns/ProgressSteps.tsx
1682
- import { Circle as Circle5, SizableText as SizableText31, XStack as XStack23, YStack as YStack27 } from "tamagui";
1880
+ import { Circle as Circle7, SizableText as SizableText31, XStack as XStack23, YStack as YStack27 } from "tamagui";
1683
1881
  import { jsx as jsx35, jsxs as jsxs27 } from "react/jsx-runtime";
1684
1882
  function ProgressSteps({ steps, currentStep, variant = "dots" }) {
1685
1883
  if (variant === "bar") {
@@ -1691,7 +1889,7 @@ function ProgressSteps({ steps, currentStep, variant = "dots" }) {
1691
1889
  }
1692
1890
  return /* @__PURE__ */ jsx35(XStack23, { alignItems: "center", justifyContent: "center", gap: "$0", children: steps.map((label, i) => /* @__PURE__ */ jsxs27(XStack23, { alignItems: "center", gap: "$0", children: [
1693
1891
  /* @__PURE__ */ jsxs27(YStack27, { alignItems: "center", gap: "$1.5", children: [
1694
- /* @__PURE__ */ jsx35(Circle5, { size: variant === "numbered" ? 28 : 10, backgroundColor: i <= currentStep ? "$color9" : "$color4", animation: "quick", children: variant === "numbered" && /* @__PURE__ */ jsx35(SizableText31, { size: "$2", fontWeight: "600", color: i <= currentStep ? "$color1" : "$color8", children: i + 1 }) }),
1892
+ /* @__PURE__ */ jsx35(Circle7, { size: variant === "numbered" ? 28 : 10, backgroundColor: i <= currentStep ? "$color9" : "$color4", animation: "quick", children: variant === "numbered" && /* @__PURE__ */ jsx35(SizableText31, { size: "$2", fontWeight: "600", color: i <= currentStep ? "$color1" : "$color8", children: i + 1 }) }),
1695
1893
  /* @__PURE__ */ jsx35(SizableText31, { size: "$1", color: i <= currentStep ? "$color11" : "$color8", numberOfLines: 1, children: label })
1696
1894
  ] }),
1697
1895
  i < steps.length - 1 && /* @__PURE__ */ jsx35(YStack27, { height: 2, width: 32, backgroundColor: i < currentStep ? "$color9" : "$color4", marginBottom: "$4" })
@@ -1701,11 +1899,11 @@ function ProgressSteps({ steps, currentStep, variant = "dots" }) {
1701
1899
  // src/patterns/SwipeableRow.tsx
1702
1900
  import { useState as useState8 } from "react";
1703
1901
  import { Button as Button7, SizableText as SizableText32, XStack as XStack24, YStack as YStack28 } from "tamagui";
1704
- import { Fragment as Fragment2, jsx as jsx36, jsxs as jsxs28 } from "react/jsx-runtime";
1902
+ import { Fragment as Fragment3, jsx as jsx36, jsxs as jsxs28 } from "react/jsx-runtime";
1705
1903
  function SwipeableRow({ children, leftActions, rightActions }) {
1706
1904
  const [showActions, setShowActions] = useState8(false);
1707
1905
  const actions = [...leftActions ?? [], ...rightActions ?? []];
1708
- if (actions.length === 0) return /* @__PURE__ */ jsx36(Fragment2, { children });
1906
+ if (actions.length === 0) return /* @__PURE__ */ jsx36(Fragment3, { children });
1709
1907
  return /* @__PURE__ */ jsxs28(YStack28, { children: [
1710
1908
  /* @__PURE__ */ jsx36(YStack28, { onLongPress: () => setShowActions((v) => !v), pressStyle: { opacity: 0.9 }, children }),
1711
1909
  showActions && /* @__PURE__ */ jsx36(XStack24, { gap: "$2", padding: "$2", animation: "quick", enterStyle: { opacity: 0, scale: 0.95 }, children: actions.map((action) => /* @__PURE__ */ jsx36(
@@ -1779,7 +1977,7 @@ function MediaCard({ image, title, subtitle, overlay = "gradient", aspectRatio =
1779
1977
 
1780
1978
  // src/patterns/Carousel.tsx
1781
1979
  import { Children as Children2, useState as useState9 } from "react";
1782
- import { Circle as Circle6, XStack as XStack26, YStack as YStack30 } from "tamagui";
1980
+ import { Circle as Circle8, XStack as XStack26, YStack as YStack30 } from "tamagui";
1783
1981
  import { ScrollView as ScrollView4 } from "react-native";
1784
1982
  import { jsx as jsx38, jsxs as jsxs30 } from "react/jsx-runtime";
1785
1983
  function Carousel({ children, gap = "$3", snapToInterval, showIndicators = false }) {
@@ -1801,7 +1999,7 @@ function Carousel({ children, gap = "$3", snapToInterval, showIndicators = false
1801
1999
  children
1802
2000
  }
1803
2001
  ),
1804
- showIndicators && count > 1 && /* @__PURE__ */ jsx38(XStack26, { justifyContent: "center", gap: "$1.5", children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx38(Circle6, { size: 6, backgroundColor: i === activeIndex ? "$color9" : "$color4", animation: "quick" }, i)) })
2002
+ showIndicators && count > 1 && /* @__PURE__ */ jsx38(XStack26, { justifyContent: "center", gap: "$1.5", children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx38(Circle8, { size: 6, backgroundColor: i === activeIndex ? "$color9" : "$color4", animation: "quick" }, i)) })
1805
2003
  ] });
1806
2004
  }
1807
2005
 
@@ -2092,7 +2290,7 @@ function AuthorRow({ author, role, avatar }) {
2092
2290
  ] })
2093
2291
  ] });
2094
2292
  }
2095
- function TestimonialCard({ quote, author, role, avatar, rating, variant = "card" }) {
2293
+ function TestimonialCard2({ quote, author, role, avatar, rating, variant = "card" }) {
2096
2294
  if (variant === "minimal") {
2097
2295
  return /* @__PURE__ */ jsxs34(YStack35, { gap: "$3", paddingVertical: "$2", children: [
2098
2296
  /* @__PURE__ */ jsx43(Stars2, { count: rating }),
@@ -2479,7 +2677,7 @@ function PasswordInput({ value = "", onChangeText, placeholder = "Password", lab
2479
2677
  }
2480
2678
 
2481
2679
  // src/patterns/AvatarGroup.tsx
2482
- import { Circle as Circle7, Image as Image8, SizableText as SizableText42, XStack as XStack35 } from "tamagui";
2680
+ import { Circle as Circle9, Image as Image8, SizableText as SizableText42, XStack as XStack35 } from "tamagui";
2483
2681
  import { jsx as jsx48, jsxs as jsxs39 } from "react/jsx-runtime";
2484
2682
  function getInitials(name) {
2485
2683
  if (!name) return "?";
@@ -2487,7 +2685,7 @@ function getInitials(name) {
2487
2685
  }
2488
2686
  function AvatarItem({ uri, name, color, size }) {
2489
2687
  return /* @__PURE__ */ jsx48(
2490
- Circle7,
2688
+ Circle9,
2491
2689
  {
2492
2690
  size,
2493
2691
  backgroundColor: color ?? "$color4",
@@ -2506,7 +2704,7 @@ function AvatarGroup({ avatars, max = 4, size = 36, overlap = 10 }) {
2506
2704
  return /* @__PURE__ */ jsxs39(XStack35, { alignItems: "center", children: [
2507
2705
  visible.map((avatar, i) => /* @__PURE__ */ jsx48(XStack35, { marginLeft: i === 0 ? 0 : -overlap, zIndex: visible.length - i, children: /* @__PURE__ */ jsx48(AvatarItem, { ...avatar, size }) }, i)),
2508
2706
  remaining > 0 && /* @__PURE__ */ jsx48(XStack35, { marginLeft: -overlap, zIndex: 0, children: /* @__PURE__ */ jsx48(
2509
- Circle7,
2707
+ Circle9,
2510
2708
  {
2511
2709
  size,
2512
2710
  backgroundColor: "$color6",
@@ -2525,7 +2723,7 @@ function AvatarGroup({ avatars, max = 4, size = 36, overlap = 10 }) {
2525
2723
 
2526
2724
  // src/patterns/SwipeCards.tsx
2527
2725
  import { useState as useState13, useCallback as useCallback6 } from "react";
2528
- import { Circle as Circle8, SizableText as SizableText43, XStack as XStack36, YStack as YStack39 } from "tamagui";
2726
+ import { Circle as Circle10, SizableText as SizableText43, XStack as XStack36, YStack as YStack39 } from "tamagui";
2529
2727
  import { jsx as jsx49, jsxs as jsxs40 } from "react/jsx-runtime";
2530
2728
  var STACK_SIZE = 3;
2531
2729
  var CARD_OFFSETS = [
@@ -2629,7 +2827,7 @@ function SwipeCards({
2629
2827
  }) }) }),
2630
2828
  /* @__PURE__ */ jsxs40(XStack36, { justifyContent: "center", gap: "$6", paddingBottom: "$4", children: [
2631
2829
  /* @__PURE__ */ jsx49(
2632
- Circle8,
2830
+ Circle10,
2633
2831
  {
2634
2832
  size: 60,
2635
2833
  backgroundColor: "$red3",
@@ -2644,7 +2842,7 @@ function SwipeCards({
2644
2842
  }
2645
2843
  ),
2646
2844
  /* @__PURE__ */ jsx49(
2647
- Circle8,
2845
+ Circle10,
2648
2846
  {
2649
2847
  size: 60,
2650
2848
  backgroundColor: "$green3",
@@ -3135,10 +3333,293 @@ function UserPreferences({ sections }) {
3135
3333
  )
3136
3334
  ] }, si)) });
3137
3335
  }
3336
+
3337
+ // src/patterns/BlinkSelect.tsx
3338
+ import { Select, Adapt, Sheet as Sheet3, YStack as YStack45, SizableText as SizableText48 } from "tamagui";
3339
+ import { jsx as jsx55, jsxs as jsxs45 } from "react/jsx-runtime";
3340
+ function BlinkSelect({
3341
+ items,
3342
+ value,
3343
+ onValueChange,
3344
+ placeholder = "Select...",
3345
+ label,
3346
+ size = "$4",
3347
+ disabled,
3348
+ width = "100%"
3349
+ }) {
3350
+ return /* @__PURE__ */ jsxs45(YStack45, { gap: "$1.5", width, children: [
3351
+ label ? /* @__PURE__ */ jsx55(SizableText48, { size: "$3", fontWeight: "600", children: label }) : null,
3352
+ /* @__PURE__ */ jsxs45(
3353
+ Select,
3354
+ {
3355
+ value,
3356
+ onValueChange,
3357
+ disablePreventBodyScroll: true,
3358
+ ...disabled ? { disabled: true } : {},
3359
+ children: [
3360
+ /* @__PURE__ */ jsx55(Select.Trigger, { width: "100%", iconAfter: () => /* @__PURE__ */ jsx55(SizableText48, { children: "\u25BC" }), size, children: /* @__PURE__ */ jsx55(Select.Value, { placeholder }) }),
3361
+ /* @__PURE__ */ jsx55(Adapt, { when: "maxMd", platform: "touch", children: /* @__PURE__ */ jsxs45(Sheet3, { modal: true, dismissOnSnapToBottom: true, snapPointsMode: "fit", children: [
3362
+ /* @__PURE__ */ jsx55(Sheet3.Frame, { padding: "$4", children: /* @__PURE__ */ jsx55(Adapt.Contents, {}) }),
3363
+ /* @__PURE__ */ jsx55(Sheet3.Overlay, {})
3364
+ ] }) }),
3365
+ /* @__PURE__ */ jsxs45(Select.Content, { zIndex: 2e5, children: [
3366
+ /* @__PURE__ */ jsx55(Select.ScrollUpButton, { alignItems: "center", justifyContent: "center", height: "$3", children: /* @__PURE__ */ jsx55(SizableText48, { children: "\u25B2" }) }),
3367
+ /* @__PURE__ */ jsx55(Select.Viewport, { minWidth: 200, children: /* @__PURE__ */ jsx55(Select.Group, { children: items.map((item, i) => /* @__PURE__ */ jsxs45(Select.Item, { index: i, value: item.value, children: [
3368
+ /* @__PURE__ */ jsx55(Select.ItemText, { children: item.label }),
3369
+ /* @__PURE__ */ jsx55(Select.ItemIndicator, { marginLeft: "auto", children: /* @__PURE__ */ jsx55(SizableText48, { children: "\u2713" }) })
3370
+ ] }, item.value)) }) }),
3371
+ /* @__PURE__ */ jsx55(Select.ScrollDownButton, { alignItems: "center", justifyContent: "center", height: "$3", children: /* @__PURE__ */ jsx55(SizableText48, { children: "\u25BC" }) })
3372
+ ] })
3373
+ ]
3374
+ }
3375
+ )
3376
+ ] });
3377
+ }
3378
+
3379
+ // src/patterns/BlinkDialog.tsx
3380
+ import { Dialog, Adapt as Adapt2, Sheet as Sheet4, Button as Button11, XStack as XStack41 } from "tamagui";
3381
+ import { jsx as jsx56, jsxs as jsxs46 } from "react/jsx-runtime";
3382
+ function BlinkDialog({
3383
+ open,
3384
+ onOpenChange,
3385
+ trigger,
3386
+ title,
3387
+ description,
3388
+ children,
3389
+ confirmLabel = "Confirm",
3390
+ cancelLabel = "Cancel",
3391
+ onConfirm,
3392
+ onCancel,
3393
+ confirmTheme = "active"
3394
+ }) {
3395
+ return /* @__PURE__ */ jsxs46(Dialog, { modal: true, open, onOpenChange, children: [
3396
+ trigger && /* @__PURE__ */ jsx56(Dialog.Trigger, { asChild: true, children: trigger }),
3397
+ /* @__PURE__ */ jsx56(Adapt2, { when: "maxMd", platform: "touch", children: /* @__PURE__ */ jsxs46(Sheet4, { modal: true, dismissOnSnapToBottom: true, snapPointsMode: "fit", children: [
3398
+ /* @__PURE__ */ jsx56(Sheet4.Frame, { padding: "$4", gap: "$4", children: /* @__PURE__ */ jsx56(Adapt2.Contents, {}) }),
3399
+ /* @__PURE__ */ jsx56(Sheet4.Overlay, {})
3400
+ ] }) }),
3401
+ /* @__PURE__ */ jsxs46(Dialog.Portal, { children: [
3402
+ /* @__PURE__ */ jsx56(
3403
+ Dialog.Overlay,
3404
+ {
3405
+ animation: "quick",
3406
+ opacity: 0.5,
3407
+ enterStyle: { opacity: 0 },
3408
+ exitStyle: { opacity: 0 }
3409
+ },
3410
+ "overlay"
3411
+ ),
3412
+ /* @__PURE__ */ jsxs46(
3413
+ Dialog.Content,
3414
+ {
3415
+ bordered: true,
3416
+ elevate: true,
3417
+ animateOnly: ["transform", "opacity"],
3418
+ animation: ["quick", { opacity: { overshootClamping: true } }],
3419
+ enterStyle: { x: 0, y: -20, opacity: 0, scale: 0.9 },
3420
+ exitStyle: { x: 0, y: 10, opacity: 0, scale: 0.95 },
3421
+ gap: "$4",
3422
+ children: [
3423
+ title && /* @__PURE__ */ jsx56(Dialog.Title, { children: title }),
3424
+ description && /* @__PURE__ */ jsx56(Dialog.Description, { size: "$3", color: "$color10", children: description }),
3425
+ children,
3426
+ (onConfirm || onCancel) && /* @__PURE__ */ jsxs46(XStack41, { justifyContent: "flex-end", gap: "$3", children: [
3427
+ onCancel && /* @__PURE__ */ jsx56(Dialog.Close, { displayWhenAdapted: true, asChild: true, children: /* @__PURE__ */ jsx56(Button11, { variant: "outlined", onPress: onCancel, children: cancelLabel }) }),
3428
+ onConfirm && /* @__PURE__ */ jsx56(Dialog.Close, { displayWhenAdapted: true, asChild: true, children: /* @__PURE__ */ jsx56(Button11, { theme: confirmTheme, onPress: onConfirm, children: confirmLabel }) })
3429
+ ] })
3430
+ ]
3431
+ },
3432
+ "content"
3433
+ )
3434
+ ] })
3435
+ ] });
3436
+ }
3437
+
3438
+ // src/patterns/BlinkPopover.tsx
3439
+ import { Popover as Popover2, Adapt as Adapt3, YStack as YStack46 } from "tamagui";
3440
+ import { jsx as jsx57, jsxs as jsxs47 } from "react/jsx-runtime";
3441
+ function BlinkPopover({
3442
+ trigger,
3443
+ children,
3444
+ placement = "bottom",
3445
+ allowFlip = true,
3446
+ size = "$5"
3447
+ }) {
3448
+ return /* @__PURE__ */ jsxs47(Popover2, { size, allowFlip, placement, children: [
3449
+ /* @__PURE__ */ jsx57(Popover2.Trigger, { asChild: true, children: trigger }),
3450
+ /* @__PURE__ */ jsx57(Adapt3, { when: "maxMd", platform: "touch", children: /* @__PURE__ */ jsxs47(Popover2.Sheet, { modal: true, dismissOnSnapToBottom: true, snapPointsMode: "fit", children: [
3451
+ /* @__PURE__ */ jsx57(Popover2.Sheet.Frame, { padding: "$4", children: /* @__PURE__ */ jsx57(Adapt3.Contents, {}) }),
3452
+ /* @__PURE__ */ jsx57(Popover2.Sheet.Overlay, {})
3453
+ ] }) }),
3454
+ /* @__PURE__ */ jsxs47(
3455
+ Popover2.Content,
3456
+ {
3457
+ borderWidth: 1,
3458
+ borderColor: "$borderColor",
3459
+ enterStyle: { y: -10, opacity: 0 },
3460
+ exitStyle: { y: -10, opacity: 0 },
3461
+ elevate: true,
3462
+ animation: ["quick", { opacity: { overshootClamping: true } }],
3463
+ children: [
3464
+ /* @__PURE__ */ jsx57(Popover2.Arrow, { borderWidth: 1, borderColor: "$borderColor" }),
3465
+ /* @__PURE__ */ jsx57(YStack46, { gap: "$3", padding: "$3", children })
3466
+ ]
3467
+ }
3468
+ )
3469
+ ] });
3470
+ }
3471
+
3472
+ // src/patterns/ImmersiveMediaScreen.tsx
3473
+ import { Button as Button12, SizableText as SizableText49, XStack as XStack42, YStack as YStack47 } from "tamagui";
3474
+ import { jsx as jsx58, jsxs as jsxs48 } from "react/jsx-runtime";
3475
+ function ImmersiveMediaScreen({
3476
+ variant = "reel",
3477
+ media,
3478
+ title,
3479
+ subtitle,
3480
+ topLeft,
3481
+ topCenter,
3482
+ topRight,
3483
+ actions = [],
3484
+ bottomMeta,
3485
+ inputPlaceholder,
3486
+ onInputPress,
3487
+ sheetContent
3488
+ }) {
3489
+ const showSheet = variant === "sheet";
3490
+ return /* @__PURE__ */ jsxs48(YStack47, { flex: 1, backgroundColor: "$color1", children: [
3491
+ /* @__PURE__ */ jsxs48(YStack47, { flex: 1, position: "relative", children: [
3492
+ media,
3493
+ /* @__PURE__ */ jsxs48(XStack42, { position: "absolute", top: "$5", left: "$4", right: "$4", justifyContent: "space-between", alignItems: "center", children: [
3494
+ /* @__PURE__ */ jsx58(XStack42, { minWidth: 56, children: topLeft }),
3495
+ /* @__PURE__ */ jsx58(YStack47, { alignItems: "center", flex: 1, children: topCenter }),
3496
+ /* @__PURE__ */ jsx58(XStack42, { minWidth: 56, justifyContent: "flex-end", children: topRight })
3497
+ ] }),
3498
+ actions.length > 0 ? /* @__PURE__ */ jsx58(YStack47, { position: "absolute", right: "$3", bottom: showSheet ? "$20" : "$10", gap: "$3", alignItems: "center", children: actions.map((action) => /* @__PURE__ */ jsxs48(YStack47, { gap: "$1", alignItems: "center", onPress: action.onPress, children: [
3499
+ /* @__PURE__ */ jsx58(
3500
+ YStack47,
3501
+ {
3502
+ width: 44,
3503
+ height: 44,
3504
+ borderRadius: "$10",
3505
+ backgroundColor: "rgba(0,0,0,0.55)",
3506
+ alignItems: "center",
3507
+ justifyContent: "center",
3508
+ children: action.icon ?? /* @__PURE__ */ jsx58(SizableText49, { size: "$5", color: "white", children: "\u2022" })
3509
+ }
3510
+ ),
3511
+ action.value ? /* @__PURE__ */ jsx58(SizableText49, { size: "$2", color: "white", children: action.value }) : null,
3512
+ action.label ? /* @__PURE__ */ jsx58(SizableText49, { size: "$1", color: "rgba(255,255,255,0.8)", children: action.label }) : null
3513
+ ] }, action.id)) }) : null,
3514
+ /* @__PURE__ */ jsxs48(YStack47, { position: "absolute", left: "$4", right: "$4", bottom: showSheet ? "$20" : "$6", gap: "$2", children: [
3515
+ title ? /* @__PURE__ */ jsx58(SizableText49, { size: "$6", fontWeight: "800", color: "white", children: title }) : null,
3516
+ subtitle ? /* @__PURE__ */ jsx58(SizableText49, { size: "$3", color: "rgba(255,255,255,0.82)", children: subtitle }) : null,
3517
+ bottomMeta,
3518
+ variant === "story" && inputPlaceholder ? /* @__PURE__ */ jsx58(
3519
+ XStack42,
3520
+ {
3521
+ onPress: onInputPress,
3522
+ alignItems: "center",
3523
+ paddingHorizontal: "$4",
3524
+ paddingVertical: "$3",
3525
+ borderRadius: "$10",
3526
+ backgroundColor: "rgba(255,255,255,0.14)",
3527
+ borderWidth: 1,
3528
+ borderColor: "rgba(255,255,255,0.25)",
3529
+ children: /* @__PURE__ */ jsx58(SizableText49, { size: "$3", color: "rgba(255,255,255,0.82)", children: inputPlaceholder })
3530
+ }
3531
+ ) : null
3532
+ ] })
3533
+ ] }),
3534
+ showSheet ? /* @__PURE__ */ jsxs48(YStack47, { padding: "$4", gap: "$3", backgroundColor: "$background", borderTopLeftRadius: "$8", borderTopRightRadius: "$8", marginTop: -18, children: [
3535
+ /* @__PURE__ */ jsx58(XStack42, { alignSelf: "center", width: 48, height: 5, borderRadius: "$10", backgroundColor: "$color5" }),
3536
+ sheetContent,
3537
+ inputPlaceholder ? /* @__PURE__ */ jsx58(Button12, { size: "$5", backgroundColor: "$color9", color: "$color1", onPress: onInputPress, children: inputPlaceholder }) : null
3538
+ ] }) : null
3539
+ ] });
3540
+ }
3541
+
3542
+ // src/patterns/FinanceDashboard.tsx
3543
+ import { SizableText as SizableText50, XStack as XStack43, YStack as YStack48 } from "tamagui";
3544
+ import { jsx as jsx59, jsxs as jsxs49 } from "react/jsx-runtime";
3545
+ function FinanceDashboard({
3546
+ title = "Overview",
3547
+ balanceLabel = "Available balance",
3548
+ balance,
3549
+ rangeLabel,
3550
+ metrics = [],
3551
+ quickActions = [],
3552
+ sections = [],
3553
+ chartSlot,
3554
+ topRight
3555
+ }) {
3556
+ return /* @__PURE__ */ jsxs49(YStack48, { flex: 1, backgroundColor: "$background", padding: "$4", gap: "$4", children: [
3557
+ /* @__PURE__ */ jsxs49(XStack43, { justifyContent: "space-between", alignItems: "center", paddingTop: "$4", children: [
3558
+ /* @__PURE__ */ jsxs49(YStack48, { gap: "$1", children: [
3559
+ /* @__PURE__ */ jsx59(SizableText50, { size: "$6", fontWeight: "700", children: title }),
3560
+ rangeLabel ? /* @__PURE__ */ jsx59(SizableText50, { size: "$2", color: "$color9", children: rangeLabel }) : null
3561
+ ] }),
3562
+ topRight
3563
+ ] }),
3564
+ /* @__PURE__ */ jsxs49(YStack48, { backgroundColor: "$color1", borderRadius: "$7", padding: "$4", gap: "$2", borderWidth: 1, borderColor: "$color4", children: [
3565
+ /* @__PURE__ */ jsx59(SizableText50, { size: "$3", color: "$color10", children: balanceLabel }),
3566
+ /* @__PURE__ */ jsx59(SizableText50, { size: "$11", fontWeight: "800", children: balance }),
3567
+ chartSlot ? /* @__PURE__ */ jsx59(YStack48, { marginTop: "$2", children: chartSlot }) : null
3568
+ ] }),
3569
+ metrics.length > 0 ? /* @__PURE__ */ jsx59(XStack43, { gap: "$3", flexWrap: "wrap", children: metrics.map((metric) => /* @__PURE__ */ jsxs49(YStack48, { flex: 1, minWidth: 120, backgroundColor: "$color1", borderRadius: "$6", padding: "$3", gap: "$1", borderWidth: 1, borderColor: "$color4", children: [
3570
+ /* @__PURE__ */ jsx59(SizableText50, { size: "$2", color: "$color10", children: metric.label }),
3571
+ /* @__PURE__ */ jsx59(SizableText50, { size: "$7", fontWeight: "800", children: metric.value }),
3572
+ metric.change ? /* @__PURE__ */ jsx59(SizableText50, { size: "$2", color: "$color9", children: metric.change }) : null
3573
+ ] }, metric.label)) }) : null,
3574
+ quickActions.length > 0 ? /* @__PURE__ */ jsx59(XStack43, { gap: "$3", flexWrap: "wrap", children: quickActions.map((action) => /* @__PURE__ */ jsxs49(
3575
+ YStack48,
3576
+ {
3577
+ flex: 1,
3578
+ minWidth: 88,
3579
+ backgroundColor: "$color1",
3580
+ borderRadius: "$6",
3581
+ padding: "$3",
3582
+ gap: "$2",
3583
+ alignItems: "center",
3584
+ justifyContent: "center",
3585
+ borderWidth: 1,
3586
+ borderColor: "$color4",
3587
+ onPress: action.onPress,
3588
+ children: [
3589
+ /* @__PURE__ */ jsx59(YStack48, { width: 36, height: 36, borderRadius: "$10", backgroundColor: "$color3", alignItems: "center", justifyContent: "center", children: action.icon ?? /* @__PURE__ */ jsx59(SizableText50, { size: "$4", children: "\u2022" }) }),
3590
+ /* @__PURE__ */ jsx59(SizableText50, { size: "$2", textAlign: "center", children: action.label })
3591
+ ]
3592
+ },
3593
+ action.id
3594
+ )) }) : null,
3595
+ /* @__PURE__ */ jsx59(YStack48, { gap: "$3", children: sections.map((section, index) => /* @__PURE__ */ jsxs49(YStack48, { backgroundColor: "$color1", borderRadius: "$6", borderWidth: 1, borderColor: "$color4", overflow: "hidden", children: [
3596
+ /* @__PURE__ */ jsx59(XStack43, { padding: "$3", justifyContent: "space-between", alignItems: "center", children: /* @__PURE__ */ jsx59(SizableText50, { size: "$4", fontWeight: "700", children: section.title }) }),
3597
+ /* @__PURE__ */ jsx59(YStack48, { children: section.rows.map((row, index2) => /* @__PURE__ */ jsxs49(
3598
+ XStack43,
3599
+ {
3600
+ padding: "$3",
3601
+ gap: "$3",
3602
+ alignItems: "center",
3603
+ borderTopWidth: index2 === 0 ? 0 : 1,
3604
+ borderTopColor: "$color4",
3605
+ children: [
3606
+ row.leading ? /* @__PURE__ */ jsx59(YStack48, { width: 32, height: 32, borderRadius: "$8", backgroundColor: "$color3", alignItems: "center", justifyContent: "center", children: row.leading }) : null,
3607
+ /* @__PURE__ */ jsxs49(YStack48, { flex: 1, children: [
3608
+ /* @__PURE__ */ jsx59(SizableText50, { size: "$3", fontWeight: "600", children: row.title }),
3609
+ row.subtitle ? /* @__PURE__ */ jsx59(SizableText50, { size: "$2", color: "$color10", children: row.subtitle }) : null
3610
+ ] }),
3611
+ row.value ? /* @__PURE__ */ jsx59(SizableText50, { size: "$3", color: "$color11", children: row.value }) : null
3612
+ ]
3613
+ },
3614
+ row.id
3615
+ )) })
3616
+ ] }, section.id ?? `${section.title}-${index}`)) })
3617
+ ] });
3618
+ }
3138
3619
  export {
3139
3620
  Accordion,
3140
3621
  ActionSheet,
3141
- Adapt,
3622
+ Adapt4 as Adapt,
3142
3623
  AlertDialog3 as AlertDialog,
3143
3624
  Anchor,
3144
3625
  AnimatePresence,
@@ -3152,34 +3633,38 @@ export {
3152
3633
  Avatar as BlinkAvatar,
3153
3634
  Button as BlinkButton,
3154
3635
  Card as BlinkCard,
3636
+ BlinkDialog,
3155
3637
  Input as BlinkInput,
3638
+ BlinkPopover,
3156
3639
  TamaguiProvider2 as BlinkProvider,
3640
+ BlinkSelect,
3157
3641
  BlinkTabs,
3158
3642
  BlinkText,
3159
3643
  BlinkToastProvider,
3160
3644
  BlinkToggleGroup,
3161
3645
  BlinkTooltip,
3162
3646
  BottomSheet,
3163
- Button11 as Button,
3647
+ Button13 as Button,
3164
3648
  Card2 as Card,
3165
3649
  Carousel,
3166
3650
  ChatBubble,
3167
3651
  Checkbox,
3168
3652
  Chip,
3169
3653
  ChipGroup,
3170
- Circle9 as Circle,
3654
+ Circle11 as Circle,
3171
3655
  ConfirmDialog,
3172
3656
  Container,
3173
3657
  CountdownBanner,
3174
3658
  DataTable,
3175
3659
  DatePicker,
3176
- Dialog,
3660
+ Dialog2 as Dialog,
3177
3661
  DialogProvider,
3178
3662
  Divider,
3179
3663
  EmptyState,
3180
3664
  EnsureFlexed,
3181
3665
  EventCard,
3182
3666
  Fieldset,
3667
+ FinanceDashboard,
3183
3668
  FloatingActionButton,
3184
3669
  Footer,
3185
3670
  Form,
@@ -3199,6 +3684,7 @@ export {
3199
3684
  ICONS,
3200
3685
  Icon,
3201
3686
  Image2 as Image,
3687
+ ImmersiveMediaScreen,
3202
3688
  Input5 as Input,
3203
3689
  KeyboardStickyFooter,
3204
3690
  Label,
@@ -3215,7 +3701,7 @@ export {
3215
3701
  Paragraph,
3216
3702
  PasswordInput,
3217
3703
  PaywallScreen,
3218
- Popover2 as Popover,
3704
+ Popover3 as Popover,
3219
3705
  Portal,
3220
3706
  PortalHost,
3221
3707
  PortalItem,
@@ -3233,13 +3719,13 @@ export {
3233
3719
  ScrollView7 as ScrollView,
3234
3720
  SearchBar,
3235
3721
  Section,
3236
- Select,
3722
+ Select2 as Select,
3237
3723
  SepHeading,
3238
3724
  Separator7 as Separator,
3239
3725
  SettingsScreen,
3240
- Sheet3 as Sheet,
3726
+ Sheet5 as Sheet,
3241
3727
  SizableStack,
3242
- SizableText48 as SizableText,
3728
+ SizableText51 as SizableText,
3243
3729
  Skeleton,
3244
3730
  Slider2 as Slider,
3245
3731
  Spacer,
@@ -3257,7 +3743,7 @@ export {
3257
3743
  Image9 as TamaguiImage,
3258
3744
  ListItem2 as TamaguiListItem,
3259
3745
  TamaguiProvider,
3260
- TestimonialCard,
3746
+ TestimonialCard2 as TestimonialCard,
3261
3747
  Text,
3262
3748
  TextArea,
3263
3749
  Theme2 as Theme,
@@ -3270,9 +3756,9 @@ export {
3270
3756
  View7 as View,
3271
3757
  VisuallyHidden,
3272
3758
  XGroup,
3273
- XStack41 as XStack,
3759
+ XStack44 as XStack,
3274
3760
  YGroup,
3275
- YStack45 as YStack,
3761
+ YStack49 as YStack,
3276
3762
  ZStack,
3277
3763
  addTheme,
3278
3764
  blinkConfig,