@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.d.mts +152 -7
- package/dist/index.d.ts +152 -7
- package/dist/index.js +682 -191
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +612 -126
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -2
package/dist/index.mjs
CHANGED
|
@@ -13,11 +13,11 @@ import {
|
|
|
13
13
|
SizableStack,
|
|
14
14
|
ThemeableStack,
|
|
15
15
|
Frame,
|
|
16
|
-
XStack as
|
|
17
|
-
YStack as
|
|
16
|
+
XStack as XStack44,
|
|
17
|
+
YStack as YStack49,
|
|
18
18
|
ZStack,
|
|
19
19
|
ScrollView as ScrollView7,
|
|
20
|
-
Circle as
|
|
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
|
|
41
|
+
SizableText as SizableText51,
|
|
42
42
|
Text,
|
|
43
43
|
Label,
|
|
44
|
-
Button as
|
|
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
|
|
63
|
-
Dialog,
|
|
62
|
+
Sheet as Sheet5,
|
|
63
|
+
Dialog as Dialog2,
|
|
64
64
|
AlertDialog as AlertDialog3,
|
|
65
|
-
Popover as
|
|
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
|
|
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: "$
|
|
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
|
-
|
|
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: "$
|
|
1113
|
-
|
|
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((
|
|
1121
|
-
|
|
1122
|
-
/* @__PURE__ */
|
|
1123
|
-
|
|
1124
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
1182
|
-
|
|
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
|
-
|
|
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: "$
|
|
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
|
-
|
|
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:
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
-
|
|
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__ */
|
|
1429
|
-
|
|
1430
|
-
|
|
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
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3726
|
+
Sheet5 as Sheet,
|
|
3241
3727
|
SizableStack,
|
|
3242
|
-
|
|
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
|
-
|
|
3759
|
+
XStack44 as XStack,
|
|
3274
3760
|
YGroup,
|
|
3275
|
-
|
|
3761
|
+
YStack49 as YStack,
|
|
3276
3762
|
ZStack,
|
|
3277
3763
|
addTheme,
|
|
3278
3764
|
blinkConfig,
|