@blinkdotnew/mobile-ui 2.0.0-alpha.14 → 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.js CHANGED
@@ -20,16 +20,16 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- Accordion: () => import_tamagui67.Accordion,
23
+ Accordion: () => import_tamagui69.Accordion,
24
24
  ActionSheet: () => ActionSheet,
25
- Adapt: () => import_tamagui67.Adapt,
26
- AlertDialog: () => import_tamagui67.AlertDialog,
27
- Anchor: () => import_tamagui67.Anchor,
28
- AnimatePresence: () => import_tamagui67.AnimatePresence,
25
+ Adapt: () => import_tamagui69.Adapt,
26
+ AlertDialog: () => import_tamagui69.AlertDialog,
27
+ Anchor: () => import_tamagui69.Anchor,
28
+ AnimatePresence: () => import_tamagui69.AnimatePresence,
29
29
  AppHeader: () => AppHeader,
30
- Article: () => import_tamagui67.Article,
31
- Aside: () => import_tamagui67.Aside,
32
- Avatar: () => import_tamagui67.Avatar,
30
+ Article: () => import_tamagui69.Article,
31
+ Aside: () => import_tamagui69.Aside,
32
+ Avatar: () => import_tamagui69.Avatar,
33
33
  AvatarGroup: () => AvatarGroup,
34
34
  Badge: () => Badge,
35
35
  BlinkAccordion: () => BlinkAccordion,
@@ -39,7 +39,7 @@ __export(index_exports, {
39
39
  BlinkDialog: () => BlinkDialog,
40
40
  BlinkInput: () => Input,
41
41
  BlinkPopover: () => BlinkPopover,
42
- BlinkProvider: () => import_tamagui67.TamaguiProvider,
42
+ BlinkProvider: () => import_tamagui69.TamaguiProvider,
43
43
  BlinkSelect: () => BlinkSelect,
44
44
  BlinkTabs: () => BlinkTabs,
45
45
  BlinkText: () => BlinkText,
@@ -47,160 +47,162 @@ __export(index_exports, {
47
47
  BlinkToggleGroup: () => BlinkToggleGroup,
48
48
  BlinkTooltip: () => BlinkTooltip,
49
49
  BottomSheet: () => BottomSheet,
50
- Button: () => import_tamagui67.Button,
51
- Card: () => import_tamagui67.Card,
50
+ Button: () => import_tamagui69.Button,
51
+ Card: () => import_tamagui69.Card,
52
52
  Carousel: () => Carousel,
53
53
  ChatBubble: () => ChatBubble,
54
- Checkbox: () => import_tamagui67.Checkbox,
54
+ Checkbox: () => import_tamagui69.Checkbox,
55
55
  Chip: () => Chip,
56
56
  ChipGroup: () => ChipGroup,
57
- Circle: () => import_tamagui67.Circle,
57
+ Circle: () => import_tamagui69.Circle,
58
58
  ConfirmDialog: () => ConfirmDialog,
59
59
  Container: () => Container,
60
60
  CountdownBanner: () => CountdownBanner,
61
61
  DataTable: () => DataTable,
62
62
  DatePicker: () => DatePicker,
63
- Dialog: () => import_tamagui67.Dialog,
63
+ Dialog: () => import_tamagui69.Dialog,
64
64
  DialogProvider: () => DialogProvider,
65
65
  Divider: () => Divider,
66
66
  EmptyState: () => EmptyState,
67
- EnsureFlexed: () => import_tamagui67.EnsureFlexed,
67
+ EnsureFlexed: () => import_tamagui69.EnsureFlexed,
68
68
  EventCard: () => EventCard,
69
- Fieldset: () => import_tamagui67.Fieldset,
69
+ Fieldset: () => import_tamagui69.Fieldset,
70
+ FinanceDashboard: () => FinanceDashboard,
70
71
  FloatingActionButton: () => FloatingActionButton,
71
- Footer: () => import_tamagui67.Footer,
72
- Form: () => import_tamagui67.Form,
72
+ Footer: () => import_tamagui69.Footer,
73
+ Form: () => import_tamagui69.Form,
73
74
  FormField: () => FormField,
74
- Frame: () => import_tamagui67.Frame,
75
+ Frame: () => import_tamagui69.Frame,
75
76
  GlassCard: () => GlassCard,
76
77
  Grid: () => Grid,
77
- Group: () => import_tamagui67.Group,
78
- H1: () => import_tamagui67.H1,
79
- H2: () => import_tamagui67.H2,
80
- H3: () => import_tamagui67.H3,
81
- H4: () => import_tamagui67.H4,
82
- H5: () => import_tamagui67.H5,
83
- H6: () => import_tamagui67.H6,
84
- Header: () => import_tamagui67.Header,
85
- Heading: () => import_tamagui67.Heading,
78
+ Group: () => import_tamagui69.Group,
79
+ H1: () => import_tamagui69.H1,
80
+ H2: () => import_tamagui69.H2,
81
+ H3: () => import_tamagui69.H3,
82
+ H4: () => import_tamagui69.H4,
83
+ H5: () => import_tamagui69.H5,
84
+ H6: () => import_tamagui69.H6,
85
+ Header: () => import_tamagui69.Header,
86
+ Heading: () => import_tamagui69.Heading,
86
87
  ICONS: () => ICONS,
87
88
  Icon: () => Icon,
88
89
  Image: () => Image2,
89
- Input: () => import_tamagui67.Input,
90
+ ImmersiveMediaScreen: () => ImmersiveMediaScreen,
91
+ Input: () => import_tamagui69.Input,
90
92
  KeyboardStickyFooter: () => KeyboardStickyFooter,
91
- Label: () => import_tamagui67.Label,
93
+ Label: () => import_tamagui69.Label,
92
94
  ListItem: () => ListItem,
93
95
  LoginScreen: () => LoginScreen,
94
- Main: () => import_tamagui67.Main,
96
+ Main: () => import_tamagui69.Main,
95
97
  MediaCard: () => MediaCard,
96
- Nav: () => import_tamagui67.Nav,
98
+ Nav: () => import_tamagui69.Nav,
97
99
  NotificationBanner: () => NotificationBanner,
98
100
  OTPInput: () => OTPInput,
99
101
  OnboardingCarousel: () => OnboardingCarousel,
100
102
  PageContainer: () => PageContainer,
101
103
  PageMainContainer: () => PageMainContainer,
102
- Paragraph: () => import_tamagui67.Paragraph,
104
+ Paragraph: () => import_tamagui69.Paragraph,
103
105
  PasswordInput: () => PasswordInput,
104
106
  PaywallScreen: () => PaywallScreen,
105
- Popover: () => import_tamagui67.Popover,
106
- Portal: () => import_tamagui67.Portal,
107
- PortalHost: () => import_tamagui67.PortalHost,
108
- PortalItem: () => import_tamagui67.PortalItem,
109
- PortalProvider: () => import_tamagui67.PortalProvider,
107
+ Popover: () => import_tamagui69.Popover,
108
+ Portal: () => import_tamagui69.Portal,
109
+ PortalHost: () => import_tamagui69.PortalHost,
110
+ PortalItem: () => import_tamagui69.PortalItem,
111
+ PortalProvider: () => import_tamagui69.PortalProvider,
110
112
  Pressable: () => Pressable,
111
113
  PricingTable: () => PricingTable,
112
114
  ProductCard: () => ProductCard,
113
115
  ProfileHeader: () => ProfileHeader,
114
- Progress: () => import_tamagui67.Progress,
116
+ Progress: () => import_tamagui69.Progress,
115
117
  ProgressSteps: () => ProgressSteps,
116
118
  PullToRefresh: () => PullToRefresh,
117
- RadioGroup: () => import_tamagui67.RadioGroup,
119
+ RadioGroup: () => import_tamagui69.RadioGroup,
118
120
  SafeArea: () => SafeArea,
119
121
  ScreenLayout: () => ScreenLayout,
120
- ScrollView: () => import_tamagui67.ScrollView,
122
+ ScrollView: () => import_tamagui69.ScrollView,
121
123
  SearchBar: () => SearchBar,
122
124
  Section: () => Section,
123
- Select: () => import_tamagui67.Select,
125
+ Select: () => import_tamagui69.Select,
124
126
  SepHeading: () => SepHeading,
125
- Separator: () => import_tamagui67.Separator,
127
+ Separator: () => import_tamagui69.Separator,
126
128
  SettingsScreen: () => SettingsScreen,
127
- Sheet: () => import_tamagui67.Sheet,
128
- SizableStack: () => import_tamagui67.SizableStack,
129
- SizableText: () => import_tamagui67.SizableText,
129
+ Sheet: () => import_tamagui69.Sheet,
130
+ SizableStack: () => import_tamagui69.SizableStack,
131
+ SizableText: () => import_tamagui69.SizableText,
130
132
  Skeleton: () => Skeleton,
131
- Slider: () => import_tamagui67.Slider,
132
- Spacer: () => import_tamagui67.Spacer,
133
- Spinner: () => import_tamagui67.Spinner,
134
- Square: () => import_tamagui67.Square,
135
- Stack: () => import_tamagui67.Stack,
133
+ Slider: () => import_tamagui69.Slider,
134
+ Spacer: () => import_tamagui69.Spacer,
135
+ Spinner: () => import_tamagui69.Spinner,
136
+ Square: () => import_tamagui69.Square,
137
+ Stack: () => import_tamagui69.Stack,
136
138
  StatusBadge: () => StatusBadge,
137
139
  StepPageLayout: () => StepPageLayout,
138
140
  SubHeading: () => SubHeading,
139
141
  SwipeCards: () => SwipeCards,
140
142
  SwipeableRow: () => SwipeableRow,
141
- Switch: () => import_tamagui67.Switch,
143
+ Switch: () => import_tamagui69.Switch,
142
144
  TabBar: () => TabBar,
143
- Tabs: () => import_tamagui67.Tabs,
144
- TamaguiImage: () => import_tamagui67.Image,
145
- TamaguiListItem: () => import_tamagui67.ListItem,
146
- TamaguiProvider: () => import_tamagui67.TamaguiProvider,
147
- TestimonialCard: () => TestimonialCard,
148
- Text: () => import_tamagui67.Text,
149
- TextArea: () => import_tamagui67.TextArea,
150
- Theme: () => import_tamagui67.Theme,
151
- ThemeableStack: () => import_tamagui67.ThemeableStack,
152
- ToggleGroup: () => import_tamagui67.ToggleGroup,
153
- Tooltip: () => import_tamagui67.Tooltip,
154
- TooltipSimple: () => import_tamagui67.TooltipSimple,
155
- Unspaced: () => import_tamagui67.Unspaced,
145
+ Tabs: () => import_tamagui69.Tabs,
146
+ TamaguiImage: () => import_tamagui69.Image,
147
+ TamaguiListItem: () => import_tamagui69.ListItem,
148
+ TamaguiProvider: () => import_tamagui69.TamaguiProvider,
149
+ TestimonialCard: () => TestimonialCard2,
150
+ Text: () => import_tamagui69.Text,
151
+ TextArea: () => import_tamagui69.TextArea,
152
+ Theme: () => import_tamagui69.Theme,
153
+ ThemeableStack: () => import_tamagui69.ThemeableStack,
154
+ ToggleGroup: () => import_tamagui69.ToggleGroup,
155
+ Tooltip: () => import_tamagui69.Tooltip,
156
+ TooltipSimple: () => import_tamagui69.TooltipSimple,
157
+ Unspaced: () => import_tamagui69.Unspaced,
156
158
  UserPreferences: () => UserPreferences,
157
- View: () => import_tamagui67.View,
158
- VisuallyHidden: () => import_tamagui67.VisuallyHidden,
159
- XGroup: () => import_tamagui67.XGroup,
160
- XStack: () => import_tamagui67.XStack,
161
- YGroup: () => import_tamagui67.YGroup,
162
- YStack: () => import_tamagui67.YStack,
163
- ZStack: () => import_tamagui67.ZStack,
164
- addTheme: () => import_tamagui67.addTheme,
159
+ View: () => import_tamagui69.View,
160
+ VisuallyHidden: () => import_tamagui69.VisuallyHidden,
161
+ XGroup: () => import_tamagui69.XGroup,
162
+ XStack: () => import_tamagui69.XStack,
163
+ YGroup: () => import_tamagui69.YGroup,
164
+ YStack: () => import_tamagui69.YStack,
165
+ ZStack: () => import_tamagui69.ZStack,
166
+ addTheme: () => import_tamagui69.addTheme,
165
167
  blinkConfig: () => blinkConfig,
166
- composeEventHandlers: () => import_tamagui67.composeEventHandlers,
167
- composeRefs: () => import_tamagui67.composeRefs,
168
- createFont: () => import_tamagui67.createFont,
169
- createMedia: () => import_tamagui67.createMedia,
170
- createStyledContext: () => import_tamagui67.createStyledContext,
171
- createTamagui: () => import_tamagui67.createTamagui,
172
- createTheme: () => import_tamagui67.createTheme,
173
- createTokens: () => import_tamagui67.createTokens,
174
- createVariable: () => import_tamagui67.createVariable,
168
+ composeEventHandlers: () => import_tamagui69.composeEventHandlers,
169
+ composeRefs: () => import_tamagui69.composeRefs,
170
+ createFont: () => import_tamagui69.createFont,
171
+ createMedia: () => import_tamagui69.createMedia,
172
+ createStyledContext: () => import_tamagui69.createStyledContext,
173
+ createTamagui: () => import_tamagui69.createTamagui,
174
+ createTheme: () => import_tamagui69.createTheme,
175
+ createTokens: () => import_tamagui69.createTokens,
176
+ createVariable: () => import_tamagui69.createVariable,
175
177
  dialogConfirm: () => dialogConfirm,
176
- getConfig: () => import_tamagui67.getConfig,
177
- getToken: () => import_tamagui67.getToken,
178
- getTokenValue: () => import_tamagui67.getTokenValue,
179
- getTokens: () => import_tamagui67.getTokens,
180
- isClient: () => import_tamagui67.isClient,
181
- isWeb: () => import_tamagui67.isWeb,
182
- replaceTheme: () => import_tamagui67.replaceTheme,
178
+ getConfig: () => import_tamagui69.getConfig,
179
+ getToken: () => import_tamagui69.getToken,
180
+ getTokenValue: () => import_tamagui69.getTokenValue,
181
+ getTokens: () => import_tamagui69.getTokens,
182
+ isClient: () => import_tamagui69.isClient,
183
+ isWeb: () => import_tamagui69.isWeb,
184
+ replaceTheme: () => import_tamagui69.replaceTheme,
183
185
  showError: () => showError,
184
- styled: () => import_tamagui67.styled,
186
+ styled: () => import_tamagui69.styled,
185
187
  tamaguiDefaultConfig: () => import_v52.defaultConfig,
186
188
  toast: () => toast,
187
- updateTheme: () => import_tamagui67.updateTheme,
189
+ updateTheme: () => import_tamagui69.updateTheme,
188
190
  useBlinkToast: () => useBlinkToast,
189
- useComposedRefs: () => import_tamagui67.useComposedRefs,
190
- useControllableState: () => import_tamagui67.useControllableState,
191
- useDebounce: () => import_tamagui67.useDebounce,
192
- useDebounceValue: () => import_tamagui67.useDebounceValue,
193
- useDidFinishSSR: () => import_tamagui67.useDidFinishSSR,
194
- useEvent: () => import_tamagui67.useEvent,
195
- useForceUpdate: () => import_tamagui67.useForceUpdate,
196
- useIsPresent: () => import_tamagui67.useIsPresent,
197
- useIsomorphicLayoutEffect: () => import_tamagui67.useIsomorphicLayoutEffect,
198
- useMedia: () => import_tamagui67.useMedia,
199
- usePresence: () => import_tamagui67.usePresence,
200
- useTheme: () => import_tamagui67.useTheme,
201
- useThemeName: () => import_tamagui67.useThemeName,
202
- useWindowDimensions: () => import_tamagui67.useWindowDimensions,
203
- withStaticProperties: () => import_tamagui67.withStaticProperties
191
+ useComposedRefs: () => import_tamagui69.useComposedRefs,
192
+ useControllableState: () => import_tamagui69.useControllableState,
193
+ useDebounce: () => import_tamagui69.useDebounce,
194
+ useDebounceValue: () => import_tamagui69.useDebounceValue,
195
+ useDidFinishSSR: () => import_tamagui69.useDidFinishSSR,
196
+ useEvent: () => import_tamagui69.useEvent,
197
+ useForceUpdate: () => import_tamagui69.useForceUpdate,
198
+ useIsPresent: () => import_tamagui69.useIsPresent,
199
+ useIsomorphicLayoutEffect: () => import_tamagui69.useIsomorphicLayoutEffect,
200
+ useMedia: () => import_tamagui69.useMedia,
201
+ usePresence: () => import_tamagui69.usePresence,
202
+ useTheme: () => import_tamagui69.useTheme,
203
+ useThemeName: () => import_tamagui69.useThemeName,
204
+ useWindowDimensions: () => import_tamagui69.useWindowDimensions,
205
+ withStaticProperties: () => import_tamagui69.withStaticProperties
204
206
  });
205
207
  module.exports = __toCommonJS(index_exports);
206
208
 
@@ -213,7 +215,7 @@ var blinkConfig = (0, import_tamagui.createTamagui)({
213
215
 
214
216
  // src/index.ts
215
217
  var import_v52 = require("@tamagui/config/v5");
216
- var import_tamagui67 = require("tamagui");
218
+ var import_tamagui69 = require("tamagui");
217
219
 
218
220
  // src/primitives/Button.tsx
219
221
  var import_tamagui2 = require("tamagui");
@@ -1150,39 +1152,93 @@ function useCountdown(minutes) {
1150
1152
  const ss = String(seconds % 60).padStart(2, "0");
1151
1153
  return { display: `${mm}:${ss}`, expired: seconds <= 0 };
1152
1154
  }
1153
- function PlanCard({ plan, selected, onPress }) {
1155
+ function normalizeFeature(feature) {
1156
+ return typeof feature === "string" ? { title: feature } : feature;
1157
+ }
1158
+ function ComparisonIcon({ enabled }) {
1159
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.Circle, { size: 22, backgroundColor: enabled ? "$green3" : "$color4", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: enabled ? "$green10" : "$color8", fontWeight: "700", children: enabled ? "\u2713" : "\u2014" }) });
1160
+ }
1161
+ function TestimonialCard({ testimonial }) {
1162
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { flex: 1, minWidth: 220, backgroundColor: "$color2", borderRadius: "$6", padding: "$3", gap: "$2", children: [
1163
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.SizableText, { size: "$3", color: "$color11", children: [
1164
+ "\u201C",
1165
+ testimonial.quote,
1166
+ "\u201D"
1167
+ ] }),
1168
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { children: [
1169
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", fontWeight: "700", children: testimonial.author }),
1170
+ testimonial.meta ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color10", children: testimonial.meta }) : null
1171
+ ] })
1172
+ ] });
1173
+ }
1174
+ function CreatorHeader({ creator }) {
1175
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { alignItems: "center", justifyContent: "center", gap: "$3", children: [
1176
+ creator.avatar ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1177
+ import_tamagui28.YStack,
1178
+ {
1179
+ width: 72,
1180
+ height: 72,
1181
+ borderRadius: "$10",
1182
+ overflow: "hidden",
1183
+ alignItems: "center",
1184
+ justifyContent: "center",
1185
+ backgroundColor: "$color3",
1186
+ children: creator.avatar
1187
+ }
1188
+ ) : null,
1189
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { alignItems: "center", gap: "$1", children: [
1190
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$6", fontWeight: "800", children: creator.name }),
1191
+ creator.meta ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$3", color: "$color10", children: creator.meta }) : null
1192
+ ] })
1193
+ ] });
1194
+ }
1195
+ function PlanCard({
1196
+ plan,
1197
+ selected,
1198
+ onPress,
1199
+ stacked,
1200
+ dark
1201
+ }) {
1154
1202
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1155
1203
  import_tamagui28.YStack,
1156
1204
  {
1157
- flex: 1,
1205
+ flex: stacked ? void 0 : 1,
1206
+ width: stacked ? "100%" : void 0,
1158
1207
  padding: "$3",
1159
1208
  borderRadius: "$5",
1160
1209
  borderWidth: 2,
1161
- borderColor: selected ? "$color9" : "$color5",
1162
- backgroundColor: selected ? "$color3" : "$color1",
1210
+ borderColor: selected ? "$color9" : dark ? "$color6" : "$color5",
1211
+ backgroundColor: selected ? "$color3" : dark ? "$color2" : "$color1",
1163
1212
  pressStyle: { scale: 0.97, opacity: 0.9 },
1164
1213
  animation: "quick",
1165
1214
  onPress,
1166
1215
  cursor: "pointer",
1167
1216
  position: "relative",
1168
1217
  gap: "$1.5",
1169
- alignItems: "center",
1218
+ alignItems: stacked ? "flex-start" : "center",
1170
1219
  children: [
1171
1220
  plan.popular && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { position: "absolute", top: -10, backgroundColor: "$color9", paddingHorizontal: "$2", paddingVertical: 2, borderRadius: "$10", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$1", color: "white", fontWeight: "700", children: "BEST VALUE" }) }),
1172
1221
  plan.savings && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { position: "absolute", top: plan.popular ? -24 : -10, right: 6, backgroundColor: "$green9", paddingHorizontal: "$1.5", paddingVertical: 2, borderRadius: "$10", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$1", color: "white", fontWeight: "700", children: plan.savings }) }),
1173
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", fontWeight: "600", color: "$color11", paddingTop: plan.popular ? "$1" : 0, children: plan.name }),
1174
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$7", fontWeight: "800", children: plan.price }),
1222
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", fontWeight: "600", color: dark ? "$color12" : "$color11", paddingTop: plan.popular ? "$1" : 0, children: plan.name }),
1223
+ plan.tagline ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color10", children: plan.tagline }) : null,
1224
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$7", fontWeight: "800", color: dark ? "$color12" : void 0, children: plan.price }),
1175
1225
  /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.SizableText, { size: "$2", color: "$color9", children: [
1176
1226
  "/",
1177
1227
  plan.period
1178
1228
  ] }),
1179
1229
  plan.pricePerWeek && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$1", color: "$color10", children: plan.pricePerWeek }),
1180
- plan.trial && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { backgroundColor: "$green3", paddingHorizontal: "$2", paddingVertical: 2, borderRadius: "$10", marginTop: "$1", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$1", color: "$green9", fontWeight: "700", children: plan.trial }) })
1230
+ plan.trial && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { backgroundColor: "$green3", paddingHorizontal: "$2", paddingVertical: 2, borderRadius: "$10", marginTop: "$1", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$1", color: "$green9", fontWeight: "700", children: plan.trial }) }),
1231
+ stacked && plan.features?.length ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { gap: "$1", width: "100%", paddingTop: "$1", children: plan.features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { gap: "$2", alignItems: "center", children: [
1232
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$green9", children: "\u2713" }),
1233
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color10", children: feature })
1234
+ ] }, feature)) }) : null
1181
1235
  ]
1182
1236
  }
1183
1237
  );
1184
1238
  }
1185
1239
  function PaywallScreen({
1240
+ variant = "default",
1241
+ eyebrow,
1186
1242
  title = "Unlock Premium",
1187
1243
  subtitle,
1188
1244
  features = [],
@@ -1199,29 +1255,71 @@ function PaywallScreen({
1199
1255
  hero,
1200
1256
  socialProof,
1201
1257
  countdownMinutes,
1202
- badge
1258
+ badge,
1259
+ comparisonRows = [],
1260
+ testimonials = [],
1261
+ creator,
1262
+ topSlot,
1263
+ footerSlot
1203
1264
  }) {
1204
1265
  const selected = selectedPlan ?? plans.find((p) => p.popular)?.id ?? plans[0]?.id;
1205
1266
  const countdown = useCountdown(countdownMinutes);
1206
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { flex: 1, backgroundColor: "$background", children: [
1267
+ const dark = variant === "immersive-dark";
1268
+ const stackedPlans = variant === "comparison" || variant === "creator-sheet";
1269
+ const backgroundColor = dark ? "$color1" : "$background";
1270
+ const toneColor = dark ? "$color12" : "$color11";
1271
+ const mutedColor = dark ? "$color10" : "$color10";
1272
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { flex: 1, backgroundColor, children: [
1207
1273
  onClose && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.XStack, { position: "absolute", top: "$4", right: "$4", zIndex: 10, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.Button, { size: "$3", circular: true, chromeless: true, onPress: onClose, pressStyle: { opacity: 0.6 }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$5", color: "$color9", children: "\u2715" }) }) }),
1208
1274
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.ScrollView, { flex: 1, contentContainerStyle: { paddingBottom: 220 }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { padding: "$4", gap: "$4", paddingTop: "$8", children: [
1275
+ topSlot,
1276
+ creator && variant === "creator-sheet" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CreatorHeader, { creator }) : null,
1209
1277
  hero && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { alignItems: "center", paddingVertical: "$3", children: hero }),
1210
1278
  badge && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.XStack, { justifyContent: "center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { backgroundColor: "$color9", paddingHorizontal: "$3", paddingVertical: "$1", borderRadius: "$10", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "white", fontWeight: "700", children: badge }) }) }),
1211
1279
  /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { gap: "$1.5", alignItems: "center", children: [
1212
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$9", fontWeight: "800", textAlign: "center", children: title }),
1213
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: "$color10", textAlign: "center", children: subtitle }),
1280
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", fontWeight: "700", color: "$color9", textTransform: "uppercase", children: eyebrow }) : null,
1281
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$9", fontWeight: "800", textAlign: "center", color: toneColor, children: title }),
1282
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: mutedColor, textAlign: "center", children: subtitle }),
1214
1283
  socialProof && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$3", color: "$color9", fontWeight: "600", textAlign: "center", children: socialProof })
1215
1284
  ] }),
1216
1285
  countdownMinutes && !countdown.expired && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { justifyContent: "center", padding: "$2", backgroundColor: "$red3", borderRadius: "$4", alignSelf: "center", paddingHorizontal: "$4", gap: "$2", alignItems: "center", children: [
1217
1286
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$red9", fontWeight: "600", children: "Offer ends in" }),
1218
1287
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$5", color: "$red9", fontWeight: "800", fontFamily: "$mono", children: countdown.display })
1219
1288
  ] }),
1220
- features.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { gap: "$2.5", paddingHorizontal: "$2", children: features.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { gap: "$2.5", alignItems: "center", children: [
1221
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: "$green9", children: "\u2713" }),
1222
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: "$color11", flex: 1, children: f })
1223
- ] }, i)) }),
1224
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.XStack, { gap: "$3", paddingTop: "$1", children: plans.map((plan) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(PlanCard, { plan, selected: selected === plan.id, onPress: () => onSelectPlan?.(plan.id) }, plan.id)) })
1289
+ features.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { gap: "$2.5", paddingHorizontal: "$2", children: features.map((feature, i) => {
1290
+ const item = normalizeFeature(feature);
1291
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { gap: "$2.5", alignItems: "center", children: [
1292
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { minWidth: 24, alignItems: "center", children: item.icon ?? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: "$green9", children: "\u2713" }) }),
1293
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { flex: 1, gap: "$1", children: [
1294
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: toneColor, flex: 1, children: item.title }),
1295
+ item.description ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: mutedColor, children: item.description }) : null
1296
+ ] })
1297
+ ] }, i);
1298
+ }) }),
1299
+ variant === "social-proof" && testimonials.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.XStack, { gap: "$3", children: testimonials.map((testimonial, index) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(TestimonialCard, { testimonial }, `${testimonial.author}-${index}`)) }) }) : null,
1300
+ variant === "comparison" && comparisonRows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { backgroundColor: dark ? "$color2" : "$color1", borderRadius: "$6", padding: "$3", gap: "$2", borderWidth: 1, borderColor: "$color4", children: [
1301
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { alignItems: "center", children: [
1302
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { flex: 1, size: "$2", fontWeight: "700", color: "$color10", children: "Feature" }),
1303
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { width: 64, size: "$2", fontWeight: "700", textAlign: "center", color: "$color10", children: "Free" }),
1304
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { width: 84, size: "$2", fontWeight: "700", textAlign: "center", color: "$color10", children: "Premium" })
1305
+ ] }),
1306
+ comparisonRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { alignItems: "center", paddingVertical: "$1.5", children: [
1307
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { flex: 1, size: "$3", color: toneColor, children: row.label }),
1308
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.XStack, { width: 64, justifyContent: "center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ComparisonIcon, { enabled: row.free }) }),
1309
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.XStack, { width: 84, justifyContent: "center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ComparisonIcon, { enabled: row.premium }) })
1310
+ ] }, row.label))
1311
+ ] }) : null,
1312
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.XStack, { gap: "$3", paddingTop: "$1", flexWrap: "wrap", children: plans.map((plan) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1313
+ PlanCard,
1314
+ {
1315
+ plan,
1316
+ selected: selected === plan.id,
1317
+ onPress: () => onSelectPlan?.(plan.id),
1318
+ stacked: stackedPlans,
1319
+ dark
1320
+ },
1321
+ plan.id
1322
+ )) })
1225
1323
  ] }) }),
1226
1324
  /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1227
1325
  import_tamagui28.YStack,
@@ -1232,7 +1330,7 @@ function PaywallScreen({
1232
1330
  right: 0,
1233
1331
  padding: "$4",
1234
1332
  paddingBottom: "$6",
1235
- backgroundColor: "$background",
1333
+ backgroundColor,
1236
1334
  borderTopWidth: 1,
1237
1335
  borderTopColor: "$color4",
1238
1336
  gap: "$2.5",
@@ -1256,7 +1354,8 @@ function PaywallScreen({
1256
1354
  onRestore && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color8", onPress: onRestore, pressStyle: { opacity: 0.6 }, children: "Restore" }),
1257
1355
  onTerms && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color8", onPress: onTerms, pressStyle: { opacity: 0.6 }, children: "Terms" }),
1258
1356
  onPrivacy && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color8", onPress: onPrivacy, pressStyle: { opacity: 0.6 }, children: "Privacy" })
1259
- ] })
1357
+ ] }),
1358
+ footerSlot
1260
1359
  ]
1261
1360
  }
1262
1361
  )
@@ -1269,21 +1368,64 @@ var import_tamagui29 = require("tamagui");
1269
1368
  var import_jsx_runtime21 = require("react/jsx-runtime");
1270
1369
  function OnboardingCarousel({
1271
1370
  steps,
1371
+ variant = "default",
1372
+ brand,
1373
+ topLeading,
1272
1374
  onComplete,
1273
1375
  onSkip,
1274
1376
  completeLabel = "Get Started",
1275
1377
  skipLabel = "Skip",
1276
- nextLabel = "Next"
1378
+ nextLabel = "Next",
1379
+ footerSlot
1277
1380
  }) {
1278
1381
  const [current, setCurrent] = (0, import_react8.useState)(0);
1382
+ if (steps.length === 0) {
1383
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.YStack, { flex: 1, backgroundColor: "$background", padding: "$4", alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.SizableText, { size: "$5", color: "$color10", textAlign: "center", children: "Add at least one onboarding step." }) });
1384
+ }
1279
1385
  const isLast = current === steps.length - 1;
1280
1386
  const step = steps[current];
1281
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_tamagui29.YStack, { flex: 1, backgroundColor: "$background", padding: "$4", justifyContent: "space-between", children: [
1282
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.XStack, { justifyContent: "flex-end", paddingTop: "$4", children: !isLast && onSkip && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.Button, { chromeless: true, onPress: onSkip, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.SizableText, { size: "$4", color: "$color9", children: skipLabel }) }) }),
1387
+ const hero = step?.hero ?? step?.icon;
1388
+ const isEditorial = variant === "editorial";
1389
+ const isSelection = variant === "selection-step";
1390
+ const isPermission = variant === "permission-prompt";
1391
+ const topPadding = isEditorial ? "$6" : "$4";
1392
+ const titleSize = isEditorial ? "$10" : "$9";
1393
+ const backgroundColor = variant === "calm-gradient" ? "$color2" : "$background";
1394
+ const heroBackground = isPermission ? "$color3" : isSelection ? "$color1" : "$color2";
1395
+ const heroRadius = variant === "card-tilt" || isSelection ? "$8" : "$10";
1396
+ const buttonTone = variant === "editorial" ? "$color12" : "$color9";
1397
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_tamagui29.YStack, { flex: 1, backgroundColor, padding: "$4", justifyContent: "space-between", children: [
1398
+ step?.background ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.YStack, { position: "absolute", left: 0, right: 0, top: 0, bottom: 0, children: step.background }) : null,
1399
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_tamagui29.XStack, { justifyContent: "space-between", alignItems: "center", paddingTop: topPadding, children: [
1400
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.XStack, { minWidth: 40, children: topLeading }),
1401
+ brand ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.YStack, { alignItems: "center", flex: 1, children: brand }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.YStack, { flex: 1 }),
1402
+ !isLast && onSkip && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.Button, { chromeless: true, onPress: onSkip, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.SizableText, { size: "$4", color: "$color9", children: skipLabel }) })
1403
+ ] }),
1283
1404
  /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_tamagui29.YStack, { flex: 1, alignItems: "center", justifyContent: "center", gap: "$5", paddingHorizontal: "$4", children: [
1284
- step?.icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.Circle, { size: 120, backgroundColor: "$color2", alignItems: "center", justifyContent: "center", children: step.icon }),
1405
+ hero ? variant === "card-tilt" || isSelection ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1406
+ import_tamagui29.YStack,
1407
+ {
1408
+ width: "100%",
1409
+ maxWidth: 340,
1410
+ minHeight: 260,
1411
+ borderRadius: heroRadius,
1412
+ backgroundColor: heroBackground,
1413
+ padding: "$3",
1414
+ alignItems: "center",
1415
+ justifyContent: "center",
1416
+ borderWidth: variant === "card-tilt" ? 3 : 1,
1417
+ borderColor: "$color4",
1418
+ shadowColor: "$shadowColor",
1419
+ shadowOpacity: 0.14,
1420
+ shadowRadius: 18,
1421
+ shadowOffset: { width: 0, height: 10 },
1422
+ style: variant === "card-tilt" ? { transform: [{ rotate: "-5deg" }] } : void 0,
1423
+ children: hero
1424
+ }
1425
+ ) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.Circle, { size: isPermission ? 140 : 120, backgroundColor: heroBackground, alignItems: "center", justifyContent: "center", children: hero }) : null,
1285
1426
  /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_tamagui29.YStack, { gap: "$3", alignItems: "center", children: [
1286
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.SizableText, { size: "$9", fontWeight: "700", textAlign: "center", children: step?.title }),
1427
+ step?.eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.SizableText, { size: "$2", color: "$color9", fontWeight: "700", textTransform: "uppercase", children: step.eyebrow }) : null,
1428
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.SizableText, { size: titleSize, fontWeight: "700", textAlign: "center", children: step?.title }),
1287
1429
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.SizableText, { size: "$4", color: "$color10", textAlign: "center", maxWidth: 300, children: step?.description })
1288
1430
  ] })
1289
1431
  ] }),
@@ -1291,8 +1433,10 @@ function OnboardingCarousel({
1291
1433
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_tamagui29.XStack, { justifyContent: "center", gap: "$2", children: steps.map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1292
1434
  import_tamagui29.Circle,
1293
1435
  {
1294
- size: 8,
1436
+ size: variant === "card-tilt" ? 10 : 8,
1437
+ width: i === current && variant !== "default" ? 24 : void 0,
1295
1438
  backgroundColor: i === current ? "$color9" : "$color4",
1439
+ borderRadius: "$10",
1296
1440
  animation: "quick"
1297
1441
  },
1298
1442
  i
@@ -1301,15 +1445,16 @@ function OnboardingCarousel({
1301
1445
  import_tamagui29.Button,
1302
1446
  {
1303
1447
  size: "$5",
1304
- backgroundColor: "$color9",
1448
+ backgroundColor: buttonTone,
1305
1449
  color: "$color1",
1306
- borderRadius: "$5",
1307
- hoverStyle: { backgroundColor: "$color10" },
1450
+ borderRadius: variant === "editorial" ? "$10" : "$5",
1451
+ hoverStyle: { backgroundColor: variant === "editorial" ? "$color11" : "$color10" },
1308
1452
  pressStyle: { backgroundColor: "$color8" },
1309
1453
  onPress: () => isLast ? onComplete?.() : setCurrent((c) => c + 1),
1310
- children: isLast ? completeLabel : nextLabel
1454
+ children: isLast ? step?.ctaLabel ?? completeLabel : step?.ctaLabel ?? nextLabel
1311
1455
  }
1312
- )
1456
+ ),
1457
+ footerSlot
1313
1458
  ] })
1314
1459
  ] });
1315
1460
  }
@@ -1521,63 +1666,118 @@ function BottomSheet({ open, onOpenChange, title, children, snapPoints = [85], d
1521
1666
  var import_react9 = require("react");
1522
1667
  var import_tamagui36 = require("tamagui");
1523
1668
  var import_jsx_runtime28 = require("react/jsx-runtime");
1524
- function LoginScreen({ title = "Welcome", subtitle = "Sign in to continue", logo, providers = [], onProviderPress, showEmailForm, onEmailSubmit, onForgotPassword, onCreateAccount, onTerms, onPrivacy, loading }) {
1669
+ var BRAND_STYLES = {
1670
+ google: { backgroundColor: "$color1", borderColor: "$color5", textColor: "$color12", label: "G" },
1671
+ apple: { backgroundColor: "$color12", borderColor: "$color12", textColor: "$color1", label: "\uF8FF" },
1672
+ github: { backgroundColor: "$color12", borderColor: "$color12", textColor: "$color1", label: "\u25CE" },
1673
+ microsoft: { backgroundColor: "$color1", borderColor: "$color5", textColor: "$color12", label: "\u25A0" },
1674
+ custom: { backgroundColor: "$color1", borderColor: "$color5", textColor: "$color12", label: "\u2022" }
1675
+ };
1676
+ function ProviderBadge({ provider, buttonStyle }) {
1677
+ const brand = provider.brand ?? "custom";
1678
+ const tone = BRAND_STYLES[brand];
1679
+ if (provider.icon) return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_jsx_runtime28.Fragment, { children: provider.icon });
1680
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.Circle, { size: 28, backgroundColor: buttonStyle === "brand" ? "$color2" : "$color3", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$3", fontWeight: "700", color: tone.textColor, children: tone.label }) });
1681
+ }
1682
+ function LoginScreen({
1683
+ variant = "default",
1684
+ title = "Welcome",
1685
+ subtitle = "Sign in to continue",
1686
+ logo,
1687
+ providers = [],
1688
+ hero,
1689
+ backgroundSlot,
1690
+ footerSlot,
1691
+ providerButtonStyle = "brand",
1692
+ onProviderPress,
1693
+ showEmailForm,
1694
+ onEmailSubmit,
1695
+ onForgotPassword,
1696
+ onCreateAccount,
1697
+ onTerms,
1698
+ onPrivacy,
1699
+ loading
1700
+ }) {
1525
1701
  const [email, setEmail] = (0, import_react9.useState)("");
1526
1702
  const [password, setPassword] = (0, import_react9.useState)("");
1703
+ const isEditorial = variant === "editorial";
1704
+ const isCenteredCard = variant === "centered-card";
1527
1705
  return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.YStack, { flex: 1, padding: "$4", gap: "$5", backgroundColor: "$background", justifyContent: "center", children: [
1528
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.YStack, { alignItems: "center", gap: "$2", children: [
1529
- logo && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.YStack, { paddingBottom: "$3", children: logo }),
1530
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$9", fontWeight: "700", textAlign: "center", children: title }),
1531
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$4", color: "$color10", textAlign: "center", children: subtitle })
1532
- ] }),
1533
- providers.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.YStack, { gap: "$2.5", children: providers.map((p) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1534
- import_tamagui36.Button,
1706
+ backgroundSlot ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.YStack, { position: "absolute", left: 0, right: 0, top: 0, bottom: 0, children: backgroundSlot }) : null,
1707
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
1708
+ import_tamagui36.YStack,
1535
1709
  {
1536
- size: "$5",
1537
- borderWidth: 1.5,
1538
- borderColor: "$color5",
1539
- backgroundColor: "$color1",
1540
- borderRadius: "$4",
1541
- disabled: loading,
1542
- onPress: () => onProviderPress?.(p.id),
1543
- hoverStyle: { backgroundColor: "$color2" },
1544
- pressStyle: { backgroundColor: "$color3" },
1545
- children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.XStack, { alignItems: "center", gap: "$2", children: [
1546
- p.icon,
1547
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$4", fontWeight: "500", children: p.name })
1548
- ] })
1549
- },
1550
- p.id
1551
- )) }),
1552
- showEmailForm && providers.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Divider, { label: "or" }),
1553
- showEmailForm && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.YStack, { gap: "$3", children: [
1554
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Input, { label: "Email", placeholder: "your@email.com", value: email, onChangeText: setEmail, keyboardType: "email-address", autoCapitalize: "none" }),
1555
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Input, { label: "Password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", value: password, onChangeText: setPassword, secureTextEntry: true }),
1556
- onForgotPassword && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.XStack, { justifyContent: "flex-end", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$3", color: "$color9", onPress: onForgotPassword, children: "Forgot password?" }) }),
1557
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1558
- import_tamagui36.Button,
1559
- {
1560
- size: "$5",
1561
- backgroundColor: "$color9",
1562
- color: "$color1",
1563
- borderRadius: "$5",
1564
- disabled: loading,
1565
- onPress: () => onEmailSubmit?.(email, password),
1566
- hoverStyle: { backgroundColor: "$color10" },
1567
- pressStyle: { backgroundColor: "$color8" },
1568
- icon: loading ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.Spinner, { size: "small", color: "$color1" }) : void 0,
1569
- children: "Sign In"
1570
- }
1571
- ),
1572
- onCreateAccount && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.Button, { size: "$3", chromeless: true, onPress: onCreateAccount, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$3", color: "$color9", children: "Create Account" }) })
1573
- ] }),
1574
- (onTerms || onPrivacy) && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.YStack, { paddingTop: "$2", alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.SizableText, { size: "$2", color: "$color8", textAlign: "center", children: [
1575
- "By continuing you agree to our",
1576
- " ",
1577
- onTerms && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$2", color: "$color9", onPress: onTerms, children: "Terms of Service" }),
1578
- onTerms && onPrivacy && " & ",
1579
- onPrivacy && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$2", color: "$color9", onPress: onPrivacy, children: "Privacy Policy" })
1580
- ] }) })
1710
+ gap: "$5",
1711
+ backgroundColor: isCenteredCard ? "$color1" : "transparent",
1712
+ borderRadius: isCenteredCard ? "$7" : void 0,
1713
+ padding: isCenteredCard ? "$4" : void 0,
1714
+ borderWidth: isCenteredCard ? 1 : 0,
1715
+ borderColor: isCenteredCard ? "$color4" : void 0,
1716
+ children: [
1717
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.YStack, { alignItems: "center", gap: "$2", children: [
1718
+ logo && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.YStack, { paddingBottom: "$3", children: logo }),
1719
+ hero ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.YStack, { paddingBottom: "$2", children: hero }) : null,
1720
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: isEditorial ? "$10" : "$9", fontWeight: "700", textAlign: "center", fontFamily: isEditorial ? "$heading" : void 0, children: title }),
1721
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$4", color: "$color10", textAlign: "center", children: subtitle })
1722
+ ] }),
1723
+ providers.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.YStack, { gap: "$2.5", children: providers.map((p) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1724
+ import_tamagui36.Button,
1725
+ {
1726
+ size: "$5",
1727
+ borderWidth: 1.5,
1728
+ borderColor: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].borderColor : "$color5",
1729
+ backgroundColor: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].backgroundColor : "$color1",
1730
+ borderRadius: isEditorial ? "$6" : "$4",
1731
+ disabled: loading,
1732
+ onPress: () => onProviderPress?.(p.id),
1733
+ hoverStyle: { backgroundColor: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].backgroundColor : "$color2" },
1734
+ pressStyle: { backgroundColor: "$color3" },
1735
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.XStack, { alignItems: "center", justifyContent: "space-between", width: "100%", gap: "$2", children: [
1736
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.XStack, { alignItems: "center", gap: "$2.5", children: [
1737
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ProviderBadge, { provider: p, buttonStyle: providerButtonStyle }),
1738
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.YStack, { alignItems: "flex-start", children: [
1739
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$4", fontWeight: "600", color: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].textColor : void 0, children: p.name }),
1740
+ p.description ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$2", color: "$color10", children: p.description }) : null
1741
+ ] })
1742
+ ] }),
1743
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$4", color: providerButtonStyle === "brand" ? BRAND_STYLES[p.brand ?? "custom"].textColor : "$color9", children: "\u2192" })
1744
+ ] })
1745
+ },
1746
+ p.id
1747
+ )) }),
1748
+ showEmailForm && providers.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Divider, { label: "or" }),
1749
+ showEmailForm && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.YStack, { gap: "$3", children: [
1750
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Input, { label: "Email", placeholder: "your@email.com", value: email, onChangeText: setEmail, keyboardType: "email-address", autoCapitalize: "none" }),
1751
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Input, { label: "Password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", value: password, onChangeText: setPassword, secureTextEntry: true }),
1752
+ onForgotPassword && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.XStack, { justifyContent: "flex-end", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$3", color: "$color9", onPress: onForgotPassword, children: "Forgot password?" }) }),
1753
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1754
+ import_tamagui36.Button,
1755
+ {
1756
+ size: "$5",
1757
+ backgroundColor: "$color9",
1758
+ color: "$color1",
1759
+ borderRadius: "$5",
1760
+ disabled: loading,
1761
+ onPress: () => onEmailSubmit?.(email, password),
1762
+ hoverStyle: { backgroundColor: "$color10" },
1763
+ pressStyle: { backgroundColor: "$color8" },
1764
+ icon: loading ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.Spinner, { size: "small", color: "$color1" }) : void 0,
1765
+ children: "Sign In"
1766
+ }
1767
+ ),
1768
+ onCreateAccount && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.Button, { size: "$3", chromeless: true, onPress: onCreateAccount, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$3", color: "$color9", children: "Create Account" }) })
1769
+ ] }),
1770
+ (onTerms || onPrivacy) && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.YStack, { paddingTop: "$2", alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.SizableText, { size: "$2", color: "$color8", textAlign: "center", children: [
1771
+ "By continuing you agree to our",
1772
+ " ",
1773
+ onTerms && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$2", color: "$color9", onPress: onTerms, children: "Terms of Service" }),
1774
+ onTerms && onPrivacy && " & ",
1775
+ onPrivacy && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_tamagui36.SizableText, { size: "$2", color: "$color9", onPress: onPrivacy, children: "Privacy Policy" })
1776
+ ] }) }),
1777
+ footerSlot
1778
+ ]
1779
+ }
1780
+ )
1581
1781
  ] });
1582
1782
  }
1583
1783
 
@@ -2192,7 +2392,7 @@ function AuthorRow({ author, role, avatar }) {
2192
2392
  ] })
2193
2393
  ] });
2194
2394
  }
2195
- function TestimonialCard({ quote, author, role, avatar, rating, variant = "card" }) {
2395
+ function TestimonialCard2({ quote, author, role, avatar, rating, variant = "card" }) {
2196
2396
  if (variant === "minimal") {
2197
2397
  return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_tamagui51.YStack, { gap: "$3", paddingVertical: "$2", children: [
2198
2398
  /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(Stars2, { count: rating }),
@@ -3244,34 +3444,38 @@ function BlinkSelect({
3244
3444
  value,
3245
3445
  onValueChange,
3246
3446
  placeholder = "Select...",
3447
+ label,
3247
3448
  size = "$4",
3248
3449
  disabled,
3249
3450
  width = "100%"
3250
3451
  }) {
3251
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
3252
- import_tamagui63.Select,
3253
- {
3254
- value,
3255
- onValueChange,
3256
- disablePreventBodyScroll: true,
3257
- ...disabled ? { disabled: true } : {},
3258
- children: [
3259
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.Trigger, { width, iconAfter: () => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { children: "\u25BC" }), size, children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.Value, { placeholder }) }),
3260
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Adapt, { when: "maxMd", platform: "touch", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_tamagui63.Sheet, { modal: true, dismissOnSnapToBottom: true, snapPointsMode: "fit", children: [
3261
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Sheet.Frame, { padding: "$4", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Adapt.Contents, {}) }),
3262
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Sheet.Overlay, {})
3263
- ] }) }),
3264
- /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_tamagui63.Select.Content, { zIndex: 2e5, children: [
3265
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.ScrollUpButton, { alignItems: "center", justifyContent: "center", height: "$3", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { children: "\u25B2" }) }),
3266
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.Viewport, { minWidth: 200, children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.Group, { children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_tamagui63.Select.Item, { index: i, value: item.value, children: [
3267
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.ItemText, { children: item.label }),
3268
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.ItemIndicator, { marginLeft: "auto", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { children: "\u2713" }) })
3269
- ] }, item.value)) }) }),
3270
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.ScrollDownButton, { alignItems: "center", justifyContent: "center", height: "$3", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { children: "\u25BC" }) })
3271
- ] })
3272
- ]
3273
- }
3274
- );
3452
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_tamagui63.YStack, { gap: "$1.5", width, children: [
3453
+ label ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { size: "$3", fontWeight: "600", children: label }) : null,
3454
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
3455
+ import_tamagui63.Select,
3456
+ {
3457
+ value,
3458
+ onValueChange,
3459
+ disablePreventBodyScroll: true,
3460
+ ...disabled ? { disabled: true } : {},
3461
+ children: [
3462
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.Trigger, { width: "100%", iconAfter: () => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { children: "\u25BC" }), size, children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.Value, { placeholder }) }),
3463
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Adapt, { when: "maxMd", platform: "touch", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_tamagui63.Sheet, { modal: true, dismissOnSnapToBottom: true, snapPointsMode: "fit", children: [
3464
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Sheet.Frame, { padding: "$4", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Adapt.Contents, {}) }),
3465
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Sheet.Overlay, {})
3466
+ ] }) }),
3467
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_tamagui63.Select.Content, { zIndex: 2e5, children: [
3468
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.ScrollUpButton, { alignItems: "center", justifyContent: "center", height: "$3", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { children: "\u25B2" }) }),
3469
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.Viewport, { minWidth: 200, children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.Group, { children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_tamagui63.Select.Item, { index: i, value: item.value, children: [
3470
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.ItemText, { children: item.label }),
3471
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.ItemIndicator, { marginLeft: "auto", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { children: "\u2713" }) })
3472
+ ] }, item.value)) }) }),
3473
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.Select.ScrollDownButton, { alignItems: "center", justifyContent: "center", height: "$3", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_tamagui63.SizableText, { children: "\u25BC" }) })
3474
+ ] })
3475
+ ]
3476
+ }
3477
+ )
3478
+ ] });
3275
3479
  }
3276
3480
 
3277
3481
  // src/patterns/BlinkDialog.tsx
@@ -3366,6 +3570,154 @@ function BlinkPopover({
3366
3570
  )
3367
3571
  ] });
3368
3572
  }
3573
+
3574
+ // src/patterns/ImmersiveMediaScreen.tsx
3575
+ var import_tamagui66 = require("tamagui");
3576
+ var import_jsx_runtime58 = require("react/jsx-runtime");
3577
+ function ImmersiveMediaScreen({
3578
+ variant = "reel",
3579
+ media,
3580
+ title,
3581
+ subtitle,
3582
+ topLeft,
3583
+ topCenter,
3584
+ topRight,
3585
+ actions = [],
3586
+ bottomMeta,
3587
+ inputPlaceholder,
3588
+ onInputPress,
3589
+ sheetContent
3590
+ }) {
3591
+ const showSheet = variant === "sheet";
3592
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_tamagui66.YStack, { flex: 1, backgroundColor: "$color1", children: [
3593
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_tamagui66.YStack, { flex: 1, position: "relative", children: [
3594
+ media,
3595
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_tamagui66.XStack, { position: "absolute", top: "$5", left: "$4", right: "$4", justifyContent: "space-between", alignItems: "center", children: [
3596
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.XStack, { minWidth: 56, children: topLeft }),
3597
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.YStack, { alignItems: "center", flex: 1, children: topCenter }),
3598
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.XStack, { minWidth: 56, justifyContent: "flex-end", children: topRight })
3599
+ ] }),
3600
+ actions.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.YStack, { position: "absolute", right: "$3", bottom: showSheet ? "$20" : "$10", gap: "$3", alignItems: "center", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_tamagui66.YStack, { gap: "$1", alignItems: "center", onPress: action.onPress, children: [
3601
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
3602
+ import_tamagui66.YStack,
3603
+ {
3604
+ width: 44,
3605
+ height: 44,
3606
+ borderRadius: "$10",
3607
+ backgroundColor: "rgba(0,0,0,0.55)",
3608
+ alignItems: "center",
3609
+ justifyContent: "center",
3610
+ children: action.icon ?? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.SizableText, { size: "$5", color: "white", children: "\u2022" })
3611
+ }
3612
+ ),
3613
+ action.value ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.SizableText, { size: "$2", color: "white", children: action.value }) : null,
3614
+ action.label ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.SizableText, { size: "$1", color: "rgba(255,255,255,0.8)", children: action.label }) : null
3615
+ ] }, action.id)) }) : null,
3616
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_tamagui66.YStack, { position: "absolute", left: "$4", right: "$4", bottom: showSheet ? "$20" : "$6", gap: "$2", children: [
3617
+ title ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.SizableText, { size: "$6", fontWeight: "800", color: "white", children: title }) : null,
3618
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.SizableText, { size: "$3", color: "rgba(255,255,255,0.82)", children: subtitle }) : null,
3619
+ bottomMeta,
3620
+ variant === "story" && inputPlaceholder ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
3621
+ import_tamagui66.XStack,
3622
+ {
3623
+ onPress: onInputPress,
3624
+ alignItems: "center",
3625
+ paddingHorizontal: "$4",
3626
+ paddingVertical: "$3",
3627
+ borderRadius: "$10",
3628
+ backgroundColor: "rgba(255,255,255,0.14)",
3629
+ borderWidth: 1,
3630
+ borderColor: "rgba(255,255,255,0.25)",
3631
+ children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.SizableText, { size: "$3", color: "rgba(255,255,255,0.82)", children: inputPlaceholder })
3632
+ }
3633
+ ) : null
3634
+ ] })
3635
+ ] }),
3636
+ showSheet ? /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_tamagui66.YStack, { padding: "$4", gap: "$3", backgroundColor: "$background", borderTopLeftRadius: "$8", borderTopRightRadius: "$8", marginTop: -18, children: [
3637
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.XStack, { alignSelf: "center", width: 48, height: 5, borderRadius: "$10", backgroundColor: "$color5" }),
3638
+ sheetContent,
3639
+ inputPlaceholder ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_tamagui66.Button, { size: "$5", backgroundColor: "$color9", color: "$color1", onPress: onInputPress, children: inputPlaceholder }) : null
3640
+ ] }) : null
3641
+ ] });
3642
+ }
3643
+
3644
+ // src/patterns/FinanceDashboard.tsx
3645
+ var import_tamagui67 = require("tamagui");
3646
+ var import_jsx_runtime59 = require("react/jsx-runtime");
3647
+ function FinanceDashboard({
3648
+ title = "Overview",
3649
+ balanceLabel = "Available balance",
3650
+ balance,
3651
+ rangeLabel,
3652
+ metrics = [],
3653
+ quickActions = [],
3654
+ sections = [],
3655
+ chartSlot,
3656
+ topRight
3657
+ }) {
3658
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_tamagui67.YStack, { flex: 1, backgroundColor: "$background", padding: "$4", gap: "$4", children: [
3659
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_tamagui67.XStack, { justifyContent: "space-between", alignItems: "center", paddingTop: "$4", children: [
3660
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_tamagui67.YStack, { gap: "$1", children: [
3661
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$6", fontWeight: "700", children: title }),
3662
+ rangeLabel ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$2", color: "$color9", children: rangeLabel }) : null
3663
+ ] }),
3664
+ topRight
3665
+ ] }),
3666
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_tamagui67.YStack, { backgroundColor: "$color1", borderRadius: "$7", padding: "$4", gap: "$2", borderWidth: 1, borderColor: "$color4", children: [
3667
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$3", color: "$color10", children: balanceLabel }),
3668
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$11", fontWeight: "800", children: balance }),
3669
+ chartSlot ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.YStack, { marginTop: "$2", children: chartSlot }) : null
3670
+ ] }),
3671
+ metrics.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.XStack, { gap: "$3", flexWrap: "wrap", children: metrics.map((metric) => /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_tamagui67.YStack, { flex: 1, minWidth: 120, backgroundColor: "$color1", borderRadius: "$6", padding: "$3", gap: "$1", borderWidth: 1, borderColor: "$color4", children: [
3672
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$2", color: "$color10", children: metric.label }),
3673
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$7", fontWeight: "800", children: metric.value }),
3674
+ metric.change ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$2", color: "$color9", children: metric.change }) : null
3675
+ ] }, metric.label)) }) : null,
3676
+ quickActions.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.XStack, { gap: "$3", flexWrap: "wrap", children: quickActions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
3677
+ import_tamagui67.YStack,
3678
+ {
3679
+ flex: 1,
3680
+ minWidth: 88,
3681
+ backgroundColor: "$color1",
3682
+ borderRadius: "$6",
3683
+ padding: "$3",
3684
+ gap: "$2",
3685
+ alignItems: "center",
3686
+ justifyContent: "center",
3687
+ borderWidth: 1,
3688
+ borderColor: "$color4",
3689
+ onPress: action.onPress,
3690
+ children: [
3691
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.YStack, { width: 36, height: 36, borderRadius: "$10", backgroundColor: "$color3", alignItems: "center", justifyContent: "center", children: action.icon ?? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$4", children: "\u2022" }) }),
3692
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$2", textAlign: "center", children: action.label })
3693
+ ]
3694
+ },
3695
+ action.id
3696
+ )) }) : null,
3697
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.YStack, { gap: "$3", children: sections.map((section, index) => /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_tamagui67.YStack, { backgroundColor: "$color1", borderRadius: "$6", borderWidth: 1, borderColor: "$color4", overflow: "hidden", children: [
3698
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.XStack, { padding: "$3", justifyContent: "space-between", alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$4", fontWeight: "700", children: section.title }) }),
3699
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.YStack, { children: section.rows.map((row, index2) => /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
3700
+ import_tamagui67.XStack,
3701
+ {
3702
+ padding: "$3",
3703
+ gap: "$3",
3704
+ alignItems: "center",
3705
+ borderTopWidth: index2 === 0 ? 0 : 1,
3706
+ borderTopColor: "$color4",
3707
+ children: [
3708
+ row.leading ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.YStack, { width: 32, height: 32, borderRadius: "$8", backgroundColor: "$color3", alignItems: "center", justifyContent: "center", children: row.leading }) : null,
3709
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_tamagui67.YStack, { flex: 1, children: [
3710
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$3", fontWeight: "600", children: row.title }),
3711
+ row.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$2", color: "$color10", children: row.subtitle }) : null
3712
+ ] }),
3713
+ row.value ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_tamagui67.SizableText, { size: "$3", color: "$color11", children: row.value }) : null
3714
+ ]
3715
+ },
3716
+ row.id
3717
+ )) })
3718
+ ] }, section.id ?? `${section.title}-${index}`)) })
3719
+ ] });
3720
+ }
3369
3721
  // Annotate the CommonJS export names for ESM import in node:
3370
3722
  0 && (module.exports = {
3371
3723
  Accordion,
@@ -3415,6 +3767,7 @@ function BlinkPopover({
3415
3767
  EnsureFlexed,
3416
3768
  EventCard,
3417
3769
  Fieldset,
3770
+ FinanceDashboard,
3418
3771
  FloatingActionButton,
3419
3772
  Footer,
3420
3773
  Form,
@@ -3434,6 +3787,7 @@ function BlinkPopover({
3434
3787
  ICONS,
3435
3788
  Icon,
3436
3789
  Image,
3790
+ ImmersiveMediaScreen,
3437
3791
  Input,
3438
3792
  KeyboardStickyFooter,
3439
3793
  Label,