@blinkdotnew/mobile-ui 2.0.0-alpha.6 → 2.0.0-alpha.7

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,17 +20,23 @@ 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: () => Accordion,
23
+ Accordion: () => import_tamagui49.Accordion,
24
24
  ActionSheet: () => ActionSheet,
25
+ Adapt: () => import_tamagui49.Adapt,
25
26
  AlertDialog: () => import_tamagui49.AlertDialog,
27
+ Anchor: () => import_tamagui49.Anchor,
26
28
  AppHeader: () => AppHeader,
27
29
  Avatar: () => import_tamagui49.Avatar,
28
30
  Badge: () => Badge,
31
+ BlinkAccordion: () => BlinkAccordion,
29
32
  BlinkAvatar: () => Avatar,
30
33
  BlinkButton: () => Button,
31
34
  BlinkCard: () => Card,
32
35
  BlinkInput: () => Input,
36
+ BlinkTabs: () => BlinkTabs,
33
37
  BlinkText: () => BlinkText,
38
+ BlinkToastProvider: () => BlinkToastProvider,
39
+ BlinkToggleGroup: () => BlinkToggleGroup,
34
40
  BlinkTooltip: () => BlinkTooltip,
35
41
  BottomSheet: () => BottomSheet,
36
42
  Button: () => import_tamagui49.Button,
@@ -44,7 +50,9 @@ __export(index_exports, {
44
50
  DialogProvider: () => DialogProvider,
45
51
  Divider: () => Divider,
46
52
  EmptyState: () => EmptyState,
53
+ Fieldset: () => import_tamagui49.Fieldset,
47
54
  FloatingActionButton: () => FloatingActionButton,
55
+ Form: () => import_tamagui49.Form,
48
56
  FormField: () => FormField,
49
57
  Grid: () => Grid,
50
58
  H1: () => import_tamagui49.H1,
@@ -69,6 +77,7 @@ __export(index_exports, {
69
77
  Paragraph: () => import_tamagui49.Paragraph,
70
78
  PaywallScreen: () => PaywallScreen,
71
79
  Popover: () => import_tamagui49.Popover,
80
+ PortalProvider: () => import_tamagui49.PortalProvider,
72
81
  Pressable: () => Pressable,
73
82
  ProfileHeader: () => ProfileHeader,
74
83
  Progress: () => import_tamagui49.Progress,
@@ -89,22 +98,28 @@ __export(index_exports, {
89
98
  Skeleton: () => Skeleton,
90
99
  Slider: () => import_tamagui49.Slider,
91
100
  Spinner: () => import_tamagui49.Spinner,
101
+ Square: () => import_tamagui49.Square,
92
102
  StepPageLayout: () => StepPageLayout,
93
103
  SubHeading: () => SubHeading,
94
104
  SwipeableRow: () => SwipeableRow,
95
105
  Switch: () => import_tamagui49.Switch,
96
106
  TabBar: () => TabBar,
97
- Tabs: () => Tabs,
107
+ Tabs: () => import_tamagui49.Tabs,
98
108
  TamaguiImage: () => import_tamagui49.Image,
109
+ TamaguiListItem: () => import_tamagui49.ListItem,
99
110
  TamaguiProvider: () => import_tamagui49.TamaguiProvider,
100
111
  Text: () => import_tamagui49.Text,
101
112
  TextArea: () => import_tamagui49.TextArea,
102
113
  Theme: () => import_tamagui49.Theme,
103
- ToastProvider: () => ToastProvider,
104
- ToggleGroup: () => ToggleGroup,
114
+ ToggleGroup: () => import_tamagui49.ToggleGroup,
105
115
  Tooltip: () => import_tamagui49.Tooltip,
116
+ TooltipSimple: () => import_tamagui49.TooltipSimple,
117
+ Unspaced: () => import_tamagui49.Unspaced,
106
118
  View: () => import_tamagui49.View,
119
+ VisuallyHidden: () => import_tamagui49.VisuallyHidden,
120
+ XGroup: () => import_tamagui49.XGroup,
107
121
  XStack: () => import_tamagui49.XStack,
122
+ YGroup: () => import_tamagui49.YGroup,
108
123
  YStack: () => import_tamagui49.YStack,
109
124
  ZStack: () => import_tamagui49.ZStack,
110
125
  blinkConfig: () => blinkConfig,
@@ -112,10 +127,10 @@ __export(index_exports, {
112
127
  showError: () => showError,
113
128
  styled: () => import_tamagui49.styled,
114
129
  toast: () => toast,
130
+ useBlinkToast: () => useBlinkToast,
115
131
  useMedia: () => import_tamagui49.useMedia,
116
132
  useTheme: () => import_tamagui49.useTheme,
117
133
  useThemeName: () => import_tamagui49.useThemeName,
118
- useToast: () => useToast,
119
134
  withStaticProperties: () => import_tamagui49.withStaticProperties
120
135
  });
121
136
  module.exports = __toCommonJS(index_exports);
@@ -653,26 +668,15 @@ var ICONS = {
653
668
  chevronRight: "\u203A"
654
669
  };
655
670
  function Icon({ name, size = 20, color = "$color12" }) {
656
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
657
- import_tamagui13.SizableText,
658
- {
659
- fontSize: size,
660
- lineHeight: size,
661
- color,
662
- textAlign: "center",
663
- width: size,
664
- height: size,
665
- children: ICONS[name]
666
- }
667
- );
671
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_tamagui13.SizableText, { fontSize: size, lineHeight: size, color, textAlign: "center", width: size, height: size, children: ICONS[name] });
668
672
  }
669
673
 
670
- // src/interface/Accordion.tsx
674
+ // src/interface/BlinkAccordion.tsx
671
675
  var import_react3 = require("react");
672
676
  var import_tamagui14 = require("tamagui");
673
677
  var import_jsx_runtime7 = require("react/jsx-runtime");
674
- function Accordion({ items, defaultOpen, allowMultiple = false }) {
675
- const [openIds, setOpenIds] = (0, import_react3.useState)(defaultOpen ? [defaultOpen] : []);
678
+ function BlinkAccordion({ items, defaultOpen, allowMultiple = false }) {
679
+ const [openIds, setOpenIds] = (0, import_react3.useState)(defaultOpen ?? []);
676
680
  const toggle = (id) => {
677
681
  setOpenIds((prev) => {
678
682
  if (prev.includes(id)) return prev.filter((i) => i !== id);
@@ -704,59 +708,55 @@ function Accordion({ items, defaultOpen, allowMultiple = false }) {
704
708
  }) });
705
709
  }
706
710
 
707
- // src/interface/Tabs.tsx
711
+ // src/interface/BlinkTabs.tsx
708
712
  var import_react4 = require("react");
709
713
  var import_react_native = require("react-native");
710
714
  var import_tamagui15 = require("tamagui");
711
715
  var import_jsx_runtime8 = require("react/jsx-runtime");
712
- function Tabs({ tabs, activeTab, onTabChange, variant = "underline" }) {
713
- const [internalActive, setInternalActive] = (0, import_react4.useState)(tabs[0]?.id ?? "");
716
+ function BlinkTabs({ tabs, activeTab, onTabChange, variant = "underline" }) {
717
+ const [internalActive, setInternalActive] = (0, import_react4.useState)(tabs[0]?.key ?? "");
714
718
  const current = activeTab ?? internalActive;
715
- const handlePress = (id) => {
716
- if (!activeTab) setInternalActive(id);
717
- onTabChange?.(id);
719
+ const handlePress = (key) => {
720
+ if (!activeTab) setInternalActive(key);
721
+ onTabChange?.(key);
718
722
  };
719
- const activeContent = tabs.find((t) => t.id === current)?.content;
720
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_tamagui15.YStack, { flex: 1, children: [
721
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_tamagui15.XStack, { gap: "$2", paddingHorizontal: "$2", paddingBottom: "$2", children: tabs.map((tab) => {
722
- const isActive = tab.id === current;
723
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
724
- import_tamagui15.YStack,
725
- {
726
- paddingVertical: "$2",
727
- paddingHorizontal: "$3",
728
- borderRadius: variant === "pill" ? "$4" : "$0",
729
- backgroundColor: variant === "pill" && isActive ? "$color9" : "transparent",
730
- borderBottomWidth: variant === "underline" ? 2 : 0,
731
- borderBottomColor: variant === "underline" && isActive ? "$color9" : "transparent",
732
- pressStyle: { opacity: 0.7 },
733
- onPress: () => handlePress(tab.id),
734
- cursor: "pointer",
735
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
736
- import_tamagui15.SizableText,
737
- {
738
- size: "$3",
739
- fontWeight: isActive ? "600" : "400",
740
- color: variant === "pill" && isActive ? "$color1" : isActive ? "$color12" : "$color10",
741
- children: tab.label
742
- }
743
- )
744
- },
745
- tab.id
746
- );
747
- }) }) }),
748
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_tamagui15.YStack, { flex: 1, paddingTop: "$2", children: activeContent })
749
- ] });
723
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_tamagui15.YStack, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native.ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_tamagui15.XStack, { gap: "$2", paddingHorizontal: "$2", paddingBottom: "$2", children: tabs.map((tab) => {
724
+ const isActive = tab.key === current;
725
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
726
+ import_tamagui15.YStack,
727
+ {
728
+ paddingVertical: "$2",
729
+ paddingHorizontal: "$3",
730
+ borderRadius: variant === "pill" ? "$4" : "$0",
731
+ backgroundColor: variant === "pill" && isActive ? "$color9" : "transparent",
732
+ borderBottomWidth: variant === "underline" ? 2 : 0,
733
+ borderBottomColor: variant === "underline" && isActive ? "$color9" : "transparent",
734
+ pressStyle: { opacity: 0.7 },
735
+ onPress: () => handlePress(tab.key),
736
+ cursor: "pointer",
737
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
738
+ import_tamagui15.SizableText,
739
+ {
740
+ size: "$3",
741
+ fontWeight: isActive ? "600" : "400",
742
+ color: variant === "pill" && isActive ? "$color1" : isActive ? "$color12" : "$color10",
743
+ children: tab.label
744
+ }
745
+ )
746
+ },
747
+ tab.key
748
+ );
749
+ }) }) }) });
750
750
  }
751
751
 
752
- // src/interface/ToggleGroup.tsx
752
+ // src/interface/BlinkToggleGroup.tsx
753
753
  var import_tamagui16 = require("tamagui");
754
754
  var import_jsx_runtime9 = require("react/jsx-runtime");
755
755
  var sizeMap = { sm: "$2", md: "$3", lg: "$4" };
756
- function ToggleGroup({ options, value, onValueChange, size = "md" }) {
756
+ function BlinkToggleGroup({ options, value, onValueChange, size = "md" }) {
757
757
  const textSize = sizeMap[size];
758
758
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_tamagui16.XStack, { borderRadius: "$4", overflow: "hidden", backgroundColor: "$color2", children: options.map((option, index) => {
759
- const isActive = option.id === value;
759
+ const isActive = option.value === value;
760
760
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
761
761
  import_tamagui16.XStack,
762
762
  {
@@ -769,16 +769,16 @@ function ToggleGroup({ options, value, onValueChange, size = "md" }) {
769
769
  borderLeftWidth: index > 0 ? 1 : 0,
770
770
  borderLeftColor: isActive ? "$color9" : "$color4",
771
771
  pressStyle: { opacity: 0.7 },
772
- onPress: () => onValueChange(option.id),
772
+ onPress: () => onValueChange(option.value),
773
773
  cursor: "pointer",
774
774
  children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_tamagui16.SizableText, { size: textSize, fontWeight: isActive ? "600" : "400", color: isActive ? "$color1" : "$color11", children: option.label })
775
775
  },
776
- option.id
776
+ option.value
777
777
  );
778
778
  }) });
779
779
  }
780
780
 
781
- // src/interface/Toast.tsx
781
+ // src/interface/BlinkToast.tsx
782
782
  var import_react5 = require("react");
783
783
  var import_tamagui17 = require("tamagui");
784
784
  var import_jsx_runtime10 = require("react/jsx-runtime");
@@ -792,9 +792,9 @@ var variantColors = {
792
792
  var globalToastShow = null;
793
793
  var toast = (message, variant, duration) => {
794
794
  if (globalToastShow) globalToastShow(message, variant, duration);
795
- else console.warn("ToastProvider not mounted");
795
+ else console.warn("BlinkToastProvider not mounted");
796
796
  };
797
- function ToastProvider({ children }) {
797
+ function BlinkToastProvider({ children }) {
798
798
  const [toasts, setToasts] = (0, import_react5.useState)([]);
799
799
  const show = (0, import_react5.useCallback)((message, variant = "default", duration = 3e3) => {
800
800
  const id = Math.random().toString(36).slice(2, 9);
@@ -809,40 +809,27 @@ function ToastProvider({ children }) {
809
809
  }, [show]);
810
810
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(ToastContext.Provider, { value: { show }, children: [
811
811
  children,
812
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
812
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_tamagui17.YStack, { position: "absolute", top: 60, left: 0, right: 0, alignItems: "center", gap: "$2", pointerEvents: "none", zIndex: 1e5, children: toasts.map((t) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
813
813
  import_tamagui17.YStack,
814
814
  {
815
- position: "absolute",
816
- top: 60,
817
- left: 0,
818
- right: 0,
819
- alignItems: "center",
820
- gap: "$2",
821
- pointerEvents: "none",
822
- zIndex: 1e5,
823
- children: toasts.map((t) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
824
- import_tamagui17.YStack,
825
- {
826
- backgroundColor: variantColors[t.variant ?? "default"],
827
- paddingHorizontal: "$4",
828
- paddingVertical: "$2.5",
829
- borderRadius: "$4",
830
- enterStyle: { opacity: 0, y: -10 },
831
- exitStyle: { opacity: 0, y: -10 },
832
- opacity: 1,
833
- y: 0,
834
- animation: "quick",
835
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_tamagui17.SizableText, { size: "$3", color: "white", fontWeight: "600", children: t.message })
836
- },
837
- t.id
838
- ))
839
- }
840
- )
815
+ backgroundColor: variantColors[t.variant ?? "default"],
816
+ paddingHorizontal: "$4",
817
+ paddingVertical: "$2.5",
818
+ borderRadius: "$4",
819
+ enterStyle: { opacity: 0, y: -10 },
820
+ exitStyle: { opacity: 0, y: -10 },
821
+ opacity: 1,
822
+ y: 0,
823
+ animation: "quick",
824
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_tamagui17.SizableText, { size: "$3", color: "white", fontWeight: "600", children: t.message })
825
+ },
826
+ t.id
827
+ )) })
841
828
  ] });
842
829
  }
843
- function useToast() {
830
+ function useBlinkToast() {
844
831
  const ctx = (0, import_react5.useContext)(ToastContext);
845
- if (!ctx) throw new Error("useToast must be used within ToastProvider");
832
+ if (!ctx) throw new Error("useBlinkToast must be used within BlinkToastProvider");
846
833
  return ctx;
847
834
  }
848
835
 
@@ -1017,126 +1004,69 @@ function Container({ children, maxWidth = 500, centered = true }) {
1017
1004
  var import_tamagui28 = require("tamagui");
1018
1005
  var import_jsx_runtime20 = require("react/jsx-runtime");
1019
1006
  function PaywallScreen({
1020
- title = "Unlock Premium",
1021
- subtitle,
1022
- features = [],
1007
+ title = "Upgrade Your Experience",
1008
+ subtitle = "Choose the plan that works for you",
1023
1009
  plans,
1024
1010
  selectedPlan,
1025
1011
  onSelectPlan,
1026
1012
  onContinue,
1027
- onClose,
1028
1013
  onRestore,
1029
- onTerms,
1030
- onPrivacy,
1031
- continueLabel = "Continue",
1032
- reassurance = "Cancel anytime",
1033
- hero,
1034
- socialProof
1014
+ continueLabel = "Continue"
1035
1015
  }) {
1036
- const selected = selectedPlan ?? plans.find((p) => p.popular)?.id ?? plans[0]?.id;
1037
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { flex: 1, backgroundColor: "$background", children: [
1038
- 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)(
1039
- import_tamagui28.Button,
1040
- {
1041
- size: "$3",
1042
- circular: true,
1043
- chromeless: true,
1044
- onPress: onClose,
1045
- pressStyle: { opacity: 0.6 },
1046
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$5", color: "$color9", children: "\u2715" })
1047
- }
1048
- ) }),
1049
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.ScrollView, { flex: 1, contentContainerStyle: { paddingBottom: 200 }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { padding: "$4", gap: "$5", paddingTop: "$8", children: [
1050
- hero && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { alignItems: "center", paddingVertical: "$4", children: hero }),
1051
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { gap: "$2", alignItems: "center", children: [
1052
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$9", fontWeight: "800", textAlign: "center", children: title }),
1053
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: "$color10", textAlign: "center", children: subtitle }),
1054
- socialProof && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$3", color: "$color9", textAlign: "center", paddingTop: "$1", children: socialProof })
1055
- ] }),
1056
- features.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { gap: "$2.5", paddingHorizontal: "$2", children: features.map((feature, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { gap: "$2.5", alignItems: "center", children: [
1057
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: "$green9", children: "\u2713" }),
1058
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: "$color11", children: feature })
1059
- ] }, i)) }),
1060
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.XStack, { gap: "$3", paddingTop: "$2", children: plans.map((plan) => {
1061
- const isSelected = selected === plan.id;
1062
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1063
- import_tamagui28.YStack,
1064
- {
1065
- flex: 1,
1066
- padding: "$3.5",
1067
- borderRadius: "$5",
1068
- borderWidth: 2,
1069
- borderColor: isSelected ? "$color9" : "$color5",
1070
- backgroundColor: isSelected ? "$color2" : "$color1",
1071
- pressStyle: { scale: 0.97 },
1072
- onPress: () => onSelectPlan?.(plan.id),
1073
- cursor: "pointer",
1074
- position: "relative",
1075
- gap: "$1.5",
1076
- children: [
1077
- plan.savings && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1078
- import_tamagui28.YStack,
1079
- {
1080
- position: "absolute",
1081
- top: -10,
1082
- right: 8,
1083
- backgroundColor: "$green9",
1084
- paddingHorizontal: "$2",
1085
- paddingVertical: "$1",
1086
- borderRadius: "$10",
1087
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$1", color: "white", fontWeight: "700", children: plan.savings })
1088
- }
1089
- ),
1090
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$3", fontWeight: "600", color: "$color11", children: plan.name }),
1091
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$7", fontWeight: "800", children: plan.price }),
1092
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.SizableText, { size: "$2", color: "$color9", children: [
1093
- "/",
1094
- plan.period
1095
- ] }),
1096
- plan.pricePerWeek && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color10", paddingTop: "$1", children: plan.pricePerWeek }),
1097
- plan.trial && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$green9", fontWeight: "600", paddingTop: "$1", children: plan.trial })
1098
- ]
1099
- },
1100
- plan.id
1101
- );
1102
- }) })
1103
- ] }) }),
1104
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1016
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { flex: 1, padding: "$4", gap: "$5", backgroundColor: "$background", children: [
1017
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { gap: "$2", paddingTop: "$6", children: [
1018
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$9", fontWeight: "700", textAlign: "center", children: title }),
1019
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$4", color: "$color10", textAlign: "center", children: subtitle })
1020
+ ] }),
1021
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { gap: "$3", flex: 1, children: plans.map((plan) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1105
1022
  import_tamagui28.YStack,
1106
1023
  {
1107
- position: "absolute",
1108
- bottom: 0,
1109
- left: 0,
1110
- right: 0,
1111
1024
  padding: "$4",
1112
- paddingBottom: "$6",
1113
- backgroundColor: "$background",
1114
- borderTopWidth: 1,
1115
- borderTopColor: "$color4",
1116
- gap: "$3",
1025
+ borderRadius: "$5",
1026
+ borderWidth: 2,
1027
+ borderColor: selectedPlan === plan.id ? "$color9" : "$color4",
1028
+ backgroundColor: selectedPlan === plan.id ? "$color2" : "$color1",
1029
+ pressStyle: { scale: 0.98 },
1030
+ onPress: () => onSelectPlan?.(plan.id),
1031
+ cursor: "pointer",
1117
1032
  children: [
1118
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1119
- import_tamagui28.Button,
1120
- {
1121
- size: "$5",
1122
- backgroundColor: "$color9",
1123
- color: "$color1",
1124
- onPress: onContinue,
1125
- pressStyle: { backgroundColor: "$color8" },
1126
- borderRadius: "$10",
1127
- fontWeight: "700",
1128
- children: continueLabel
1129
- }
1130
- ),
1131
- reassurance && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color9", textAlign: "center", children: reassurance }),
1132
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { justifyContent: "center", gap: "$3", children: [
1133
- onRestore && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color8", onPress: onRestore, children: "Restore" }),
1134
- onTerms && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color8", onPress: onTerms, children: "Terms" }),
1135
- onPrivacy && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$2", color: "$color8", onPress: onPrivacy, children: "Privacy" })
1136
- ] })
1033
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { justifyContent: "space-between", alignItems: "center", children: [
1034
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { children: [
1035
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$5", fontWeight: "600", children: plan.name }),
1036
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { alignItems: "baseline", gap: "$1", children: [
1037
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$8", fontWeight: "700", children: plan.price }),
1038
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.SizableText, { size: "$3", color: "$color9", children: [
1039
+ "/",
1040
+ plan.period
1041
+ ] })
1042
+ ] })
1043
+ ] }),
1044
+ plan.popular && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { backgroundColor: "$color9", paddingHorizontal: "$2", paddingVertical: "$1", borderRadius: "$10", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$1", color: "$color1", fontWeight: "600", children: "POPULAR" }) })
1045
+ ] }),
1046
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.YStack, { gap: "$2", paddingTop: "$3", children: plan.features.map((feature, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.XStack, { gap: "$2", alignItems: "center", children: [
1047
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.Circle, { size: 6, backgroundColor: "$green9" }),
1048
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$3", color: "$color11", children: feature })
1049
+ ] }, i)) })
1137
1050
  ]
1138
- }
1139
- )
1051
+ },
1052
+ plan.id
1053
+ )) }),
1054
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_tamagui28.YStack, { gap: "$3", paddingBottom: "$4", children: [
1055
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1056
+ import_tamagui28.Button,
1057
+ {
1058
+ size: "$5",
1059
+ backgroundColor: "$color9",
1060
+ color: "$color1",
1061
+ onPress: onContinue,
1062
+ hoverStyle: { backgroundColor: "$color10" },
1063
+ pressStyle: { backgroundColor: "$color8" },
1064
+ borderRadius: "$5",
1065
+ children: continueLabel
1066
+ }
1067
+ ),
1068
+ onRestore && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.Button, { size: "$3", chromeless: true, onPress: onRestore, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_tamagui28.SizableText, { size: "$3", color: "$color9", children: "Restore Purchases" }) })
1069
+ ] })
1140
1070
  ] });
1141
1071
  }
1142
1072
 
@@ -1323,32 +1253,10 @@ function ProfileHeader({ name, subtitle, avatar, stats, actions }) {
1323
1253
  // src/patterns/AppHeader.tsx
1324
1254
  var import_tamagui34 = require("tamagui");
1325
1255
  var import_jsx_runtime26 = require("react/jsx-runtime");
1326
- function AppHeader({
1327
- title,
1328
- subtitle,
1329
- variant = "simple",
1330
- onBack,
1331
- avatar,
1332
- left,
1333
- right,
1334
- transparent,
1335
- borderless
1336
- }) {
1256
+ function AppHeader({ title, subtitle, variant = "simple", onBack, avatar, left, right, transparent, borderless }) {
1337
1257
  const leftContent = (() => {
1338
- if (variant === "back")
1339
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1340
- import_tamagui34.SizableText,
1341
- {
1342
- size: "$6",
1343
- paddingRight: "$2",
1344
- onPress: onBack,
1345
- pressStyle: { opacity: 0.6 },
1346
- cursor: "pointer",
1347
- children: "\u2039"
1348
- }
1349
- );
1350
- if (variant === "profile")
1351
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Avatar, { uri: avatar, name: title, size: "sm" });
1258
+ if (variant === "back") return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_tamagui34.SizableText, { size: "$6", paddingRight: "$2", onPress: onBack, pressStyle: { opacity: 0.6 }, cursor: "pointer", children: "\u2039" });
1259
+ if (variant === "profile") return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Avatar, { uri: avatar, name: title, size: "sm" });
1352
1260
  if (variant === "centered") return left ?? null;
1353
1261
  return null;
1354
1262
  })();
@@ -1360,30 +1268,14 @@ function AppHeader({
1360
1268
  backgroundColor: transparent ? "transparent" : "$background",
1361
1269
  borderBottomWidth: borderless ? 0 : 1,
1362
1270
  borderBottomColor: "$borderColor",
1363
- children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1364
- import_tamagui34.XStack,
1365
- {
1366
- height: 56,
1367
- alignItems: "center",
1368
- paddingHorizontal: "$4",
1369
- gap: "$3",
1370
- children: [
1371
- leftContent,
1372
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1373
- import_tamagui34.YStack,
1374
- {
1375
- flex: 1,
1376
- alignItems: variant === "centered" ? "center" : "flex-start",
1377
- children: [
1378
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_tamagui34.SizableText, { size: "$6", fontWeight: "700", numberOfLines: 1, children: title }),
1379
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_tamagui34.SizableText, { size: "$2", color: "$color9", numberOfLines: 1, children: subtitle })
1380
- ]
1381
- }
1382
- ),
1383
- rightContent
1384
- ]
1385
- }
1386
- )
1271
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_tamagui34.XStack, { height: 56, alignItems: "center", paddingHorizontal: "$4", gap: "$3", children: [
1272
+ leftContent,
1273
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_tamagui34.YStack, { flex: 1, alignItems: variant === "centered" ? "center" : "flex-start", children: [
1274
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_tamagui34.SizableText, { size: "$6", fontWeight: "700", numberOfLines: 1, children: title }),
1275
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_tamagui34.SizableText, { size: "$2", color: "$color9", numberOfLines: 1, children: subtitle })
1276
+ ] }),
1277
+ rightContent
1278
+ ] })
1387
1279
  }
1388
1280
  );
1389
1281
  }
@@ -1392,81 +1284,38 @@ function AppHeader({
1392
1284
  var import_tamagui35 = require("tamagui");
1393
1285
  var import_react_native2 = require("react-native");
1394
1286
  var import_jsx_runtime27 = require("react/jsx-runtime");
1395
- function BottomSheet({
1396
- open,
1397
- onOpenChange,
1398
- title,
1399
- children,
1400
- snapPoints = [85],
1401
- dismissOnSnapToBottom = true,
1402
- showHandle = true,
1403
- showClose = false
1404
- }) {
1405
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
1406
- import_tamagui35.Sheet,
1407
- {
1408
- modal: true,
1409
- open,
1410
- onOpenChange,
1411
- snapPoints,
1412
- dismissOnSnapToBottom,
1413
- animation: "medium",
1414
- children: [
1415
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.Sheet.Overlay, { animation: "lazy", enterStyle: { opacity: 0 }, exitStyle: { opacity: 0 } }),
1416
- showHandle && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.Sheet.Handle, {}),
1417
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_tamagui35.Sheet.Frame, { borderTopLeftRadius: "$6", borderTopRightRadius: "$6", backgroundColor: "$background", children: [
1418
- (title || showClose) && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
1419
- import_tamagui35.XStack,
1420
- {
1421
- paddingHorizontal: "$4",
1422
- paddingTop: "$3",
1423
- paddingBottom: "$2",
1424
- alignItems: "center",
1425
- justifyContent: "space-between",
1426
- children: [
1427
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.SizableText, { size: "$6", fontWeight: "600", flexShrink: 1, children: title }),
1428
- showClose && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1429
- import_tamagui35.XStack,
1430
- {
1431
- width: 28,
1432
- height: 28,
1433
- borderRadius: "$10",
1434
- backgroundColor: "$color4",
1435
- alignItems: "center",
1436
- justifyContent: "center",
1437
- pressStyle: { opacity: 0.7 },
1438
- onPress: () => onOpenChange(false),
1439
- children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.SizableText, { size: "$3", color: "$color10", fontWeight: "600", children: "\u2715" })
1440
- }
1441
- )
1442
- ]
1443
- }
1444
- ),
1445
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_native2.ScrollView, { contentContainerStyle: { paddingBottom: 40 }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.YStack, { padding: "$4", children }) })
1446
- ] })
1447
- ]
1448
- }
1449
- );
1287
+ function BottomSheet({ open, onOpenChange, title, children, snapPoints = [85], dismissOnSnapToBottom = true, showHandle = true, showClose = false }) {
1288
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_tamagui35.Sheet, { modal: true, open, onOpenChange, snapPoints, dismissOnSnapToBottom, animation: "medium", children: [
1289
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.Sheet.Overlay, { animation: "lazy", enterStyle: { opacity: 0 }, exitStyle: { opacity: 0 } }),
1290
+ showHandle && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.Sheet.Handle, {}),
1291
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_tamagui35.Sheet.Frame, { borderTopLeftRadius: "$6", borderTopRightRadius: "$6", backgroundColor: "$background", children: [
1292
+ (title || showClose) && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_tamagui35.XStack, { paddingHorizontal: "$4", paddingTop: "$3", paddingBottom: "$2", alignItems: "center", justifyContent: "space-between", children: [
1293
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.SizableText, { size: "$6", fontWeight: "600", flexShrink: 1, children: title }),
1294
+ showClose && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1295
+ import_tamagui35.XStack,
1296
+ {
1297
+ width: 28,
1298
+ height: 28,
1299
+ borderRadius: "$10",
1300
+ backgroundColor: "$color4",
1301
+ alignItems: "center",
1302
+ justifyContent: "center",
1303
+ pressStyle: { opacity: 0.7 },
1304
+ onPress: () => onOpenChange(false),
1305
+ children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.SizableText, { size: "$3", color: "$color10", fontWeight: "600", children: "\u2715" })
1306
+ }
1307
+ )
1308
+ ] }),
1309
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_native2.ScrollView, { contentContainerStyle: { paddingBottom: 40 }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_tamagui35.YStack, { padding: "$4", children }) })
1310
+ ] })
1311
+ ] });
1450
1312
  }
1451
1313
 
1452
1314
  // src/patterns/LoginScreen.tsx
1453
1315
  var import_react7 = require("react");
1454
1316
  var import_tamagui36 = require("tamagui");
1455
1317
  var import_jsx_runtime28 = require("react/jsx-runtime");
1456
- function LoginScreen({
1457
- title = "Welcome",
1458
- subtitle = "Sign in to continue",
1459
- logo,
1460
- providers = [],
1461
- onProviderPress,
1462
- showEmailForm,
1463
- onEmailSubmit,
1464
- onForgotPassword,
1465
- onCreateAccount,
1466
- onTerms,
1467
- onPrivacy,
1468
- loading
1469
- }) {
1318
+ function LoginScreen({ title = "Welcome", subtitle = "Sign in to continue", logo, providers = [], onProviderPress, showEmailForm, onEmailSubmit, onForgotPassword, onCreateAccount, onTerms, onPrivacy, loading }) {
1470
1319
  const [email, setEmail] = (0, import_react7.useState)("");
1471
1320
  const [password, setPassword] = (0, import_react7.useState)("");
1472
1321
  return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.YStack, { flex: 1, padding: "$4", gap: "$5", backgroundColor: "$background", justifyContent: "center", children: [
@@ -1496,27 +1345,8 @@ function LoginScreen({
1496
1345
  )) }),
1497
1346
  showEmailForm && providers.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Divider, { label: "or" }),
1498
1347
  showEmailForm && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_tamagui36.YStack, { gap: "$3", children: [
1499
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1500
- Input,
1501
- {
1502
- label: "Email",
1503
- placeholder: "your@email.com",
1504
- value: email,
1505
- onChangeText: setEmail,
1506
- keyboardType: "email-address",
1507
- autoCapitalize: "none"
1508
- }
1509
- ),
1510
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1511
- Input,
1512
- {
1513
- label: "Password",
1514
- placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
1515
- value: password,
1516
- onChangeText: setPassword,
1517
- secureTextEntry: true
1518
- }
1519
- ),
1348
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Input, { label: "Email", placeholder: "your@email.com", value: email, onChangeText: setEmail, keyboardType: "email-address", autoCapitalize: "none" }),
1349
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Input, { label: "Password", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", value: password, onChangeText: setPassword, secureTextEntry: true }),
1520
1350
  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?" }) }),
1521
1351
  /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1522
1352
  import_tamagui36.Button,
@@ -1549,71 +1379,50 @@ function LoginScreen({
1549
1379
  var import_tamagui37 = require("tamagui");
1550
1380
  var import_jsx_runtime29 = require("react/jsx-runtime");
1551
1381
  function TabBar({ tabs, activeTab, onTabPress, showLabels = true }) {
1552
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1553
- import_tamagui37.XStack,
1554
- {
1555
- height: 56,
1556
- borderTopWidth: 1,
1557
- borderTopColor: "$borderColor",
1558
- backgroundColor: "$background",
1559
- paddingBottom: "$2",
1560
- children: tabs.map((tab) => {
1561
- const active = tab.id === activeTab;
1562
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
1563
- import_tamagui37.YStack,
1564
- {
1565
- flex: 1,
1566
- alignItems: "center",
1567
- justifyContent: "center",
1568
- gap: "$1",
1569
- pressStyle: { opacity: 0.6 },
1570
- onPress: () => onTabPress(tab.id),
1571
- children: [
1572
- tab.icon && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_tamagui37.SizableText, { size: "$5", color: active ? "$color9" : "$color8", children: tab.icon }),
1573
- showLabels && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_tamagui37.SizableText, { size: "$1", color: active ? "$color9" : "$color8", fontWeight: active ? "600" : "400", children: tab.label })
1574
- ]
1575
- },
1576
- tab.id
1577
- );
1578
- })
1579
- }
1580
- );
1382
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_tamagui37.XStack, { height: 56, borderTopWidth: 1, borderTopColor: "$borderColor", backgroundColor: "$background", paddingBottom: "$2", children: tabs.map((tab) => {
1383
+ const active = tab.id === activeTab;
1384
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
1385
+ import_tamagui37.YStack,
1386
+ {
1387
+ flex: 1,
1388
+ alignItems: "center",
1389
+ justifyContent: "center",
1390
+ gap: "$1",
1391
+ pressStyle: { opacity: 0.6 },
1392
+ onPress: () => onTabPress(tab.id),
1393
+ children: [
1394
+ tab.icon && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_tamagui37.SizableText, { size: "$5", color: active ? "$color9" : "$color8", children: tab.icon }),
1395
+ showLabels && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_tamagui37.SizableText, { size: "$1", color: active ? "$color9" : "$color8", fontWeight: active ? "600" : "400", children: tab.label })
1396
+ ]
1397
+ },
1398
+ tab.id
1399
+ );
1400
+ }) });
1581
1401
  }
1582
1402
 
1583
1403
  // src/patterns/SearchBar.tsx
1584
1404
  var import_tamagui38 = require("tamagui");
1585
1405
  var import_jsx_runtime30 = require("react/jsx-runtime");
1586
1406
  function SearchBar({ value, onChangeText, placeholder = "Search\u2026", onFilter, onCancel, autoFocus }) {
1587
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
1588
- import_tamagui38.XStack,
1589
- {
1590
- height: 44,
1591
- borderRadius: "$10",
1592
- backgroundColor: "$color2",
1593
- alignItems: "center",
1594
- paddingHorizontal: "$3",
1595
- gap: "$2",
1596
- children: [
1597
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_tamagui38.SizableText, { size: "$4", color: "$color8", children: "\u2315" }),
1598
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1599
- import_tamagui38.Input,
1600
- {
1601
- flex: 1,
1602
- size: "$4",
1603
- value,
1604
- onChangeText,
1605
- placeholder,
1606
- placeholderTextColor: "$color8",
1607
- backgroundColor: "transparent",
1608
- borderWidth: 0,
1609
- autoFocus
1610
- }
1611
- ),
1612
- onFilter && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_tamagui38.SizableText, { size: "$4", color: "$color9", pressStyle: { opacity: 0.6 }, onPress: onFilter, children: "\u2ACF" }),
1613
- onCancel && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_tamagui38.SizableText, { size: "$3", color: "$color9", pressStyle: { opacity: 0.6 }, onPress: onCancel, children: "Cancel" })
1614
- ]
1615
- }
1616
- );
1407
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_tamagui38.XStack, { height: 44, borderRadius: "$10", backgroundColor: "$color2", alignItems: "center", paddingHorizontal: "$3", gap: "$2", children: [
1408
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_tamagui38.SizableText, { size: "$4", color: "$color8", children: "\u2315" }),
1409
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1410
+ import_tamagui38.Input,
1411
+ {
1412
+ flex: 1,
1413
+ size: "$4",
1414
+ value,
1415
+ onChangeText,
1416
+ placeholder,
1417
+ placeholderTextColor: "$color8",
1418
+ backgroundColor: "transparent",
1419
+ borderWidth: 0,
1420
+ autoFocus
1421
+ }
1422
+ ),
1423
+ onFilter && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_tamagui38.SizableText, { size: "$4", color: "$color9", pressStyle: { opacity: 0.6 }, onPress: onFilter, children: "\u2ACF" }),
1424
+ onCancel && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_tamagui38.SizableText, { size: "$3", color: "$color9", pressStyle: { opacity: 0.6 }, onPress: onCancel, children: "Cancel" })
1425
+ ] });
1617
1426
  }
1618
1427
 
1619
1428
  // src/patterns/FloatingActionButton.tsx
@@ -1655,73 +1464,55 @@ function FloatingActionButton({ icon, label, onPress, position = "bottom-right",
1655
1464
  // src/patterns/ActionSheet.tsx
1656
1465
  var import_tamagui40 = require("tamagui");
1657
1466
  var import_jsx_runtime32 = require("react/jsx-runtime");
1658
- function ActionSheet({
1659
- open,
1660
- onOpenChange,
1661
- title,
1662
- items,
1663
- onSelect,
1664
- cancelLabel = "Cancel"
1665
- }) {
1666
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1667
- import_tamagui40.Sheet,
1668
- {
1669
- modal: true,
1670
- open,
1671
- onOpenChange,
1672
- snapPoints: [50],
1673
- dismissOnSnapToBottom: true,
1674
- animation: "medium",
1675
- children: [
1676
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.Sheet.Overlay, { animation: "lazy", enterStyle: { opacity: 0 }, exitStyle: { opacity: 0 } }),
1677
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.Sheet.Handle, {}),
1678
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_tamagui40.Sheet.Frame, { borderTopLeftRadius: "$6", borderTopRightRadius: "$6", backgroundColor: "$background", children: [
1679
- title && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.SizableText, { size: "$3", color: "$color8", textAlign: "center", paddingTop: "$3", paddingBottom: "$1", children: title }),
1680
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.YStack, { paddingHorizontal: "$3", paddingTop: "$2", children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1681
- import_tamagui40.XStack,
1682
- {
1683
- height: 52,
1684
- alignItems: "center",
1685
- gap: "$3",
1686
- paddingHorizontal: "$3",
1687
- borderRadius: "$4",
1688
- pressStyle: { backgroundColor: "$color3" },
1689
- onPress: () => {
1690
- onSelect(item.id);
1691
- onOpenChange(false);
1692
- },
1693
- children: [
1694
- item.icon && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.SizableText, { size: "$5", children: item.icon }),
1695
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1696
- import_tamagui40.SizableText,
1697
- {
1698
- size: "$5",
1699
- flex: 1,
1700
- color: item.destructive ? "$red9" : "$color12",
1701
- fontWeight: item.destructive ? "600" : "400",
1702
- children: item.label
1703
- }
1704
- )
1705
- ]
1706
- },
1707
- item.id
1708
- )) }),
1709
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.YStack, { paddingHorizontal: "$3", paddingVertical: "$3", borderTopWidth: 1, borderTopColor: "$borderColor", marginTop: "$2", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1710
- import_tamagui40.XStack,
1711
- {
1712
- height: 48,
1713
- alignItems: "center",
1714
- justifyContent: "center",
1715
- borderRadius: "$4",
1716
- pressStyle: { backgroundColor: "$color3" },
1717
- onPress: () => onOpenChange(false),
1718
- children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.SizableText, { size: "$5", fontWeight: "600", color: "$color9", children: cancelLabel })
1719
- }
1720
- ) })
1721
- ] })
1722
- ]
1723
- }
1724
- );
1467
+ function ActionSheet({ open, onOpenChange, title, items, onSelect, cancelLabel = "Cancel" }) {
1468
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_tamagui40.Sheet, { modal: true, open, onOpenChange, snapPoints: [50], dismissOnSnapToBottom: true, animation: "medium", children: [
1469
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.Sheet.Overlay, { animation: "lazy", enterStyle: { opacity: 0 }, exitStyle: { opacity: 0 } }),
1470
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.Sheet.Handle, {}),
1471
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_tamagui40.Sheet.Frame, { borderTopLeftRadius: "$6", borderTopRightRadius: "$6", backgroundColor: "$background", children: [
1472
+ title && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.SizableText, { size: "$3", color: "$color8", textAlign: "center", paddingTop: "$3", paddingBottom: "$1", children: title }),
1473
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.YStack, { paddingHorizontal: "$3", paddingTop: "$2", children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1474
+ import_tamagui40.XStack,
1475
+ {
1476
+ height: 52,
1477
+ alignItems: "center",
1478
+ gap: "$3",
1479
+ paddingHorizontal: "$3",
1480
+ borderRadius: "$4",
1481
+ pressStyle: { backgroundColor: "$color3" },
1482
+ onPress: () => {
1483
+ onSelect(item.id);
1484
+ onOpenChange(false);
1485
+ },
1486
+ children: [
1487
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.SizableText, { size: "$5", children: item.icon }),
1488
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1489
+ import_tamagui40.SizableText,
1490
+ {
1491
+ size: "$5",
1492
+ flex: 1,
1493
+ color: item.destructive ? "$red9" : "$color12",
1494
+ fontWeight: item.destructive ? "600" : "400",
1495
+ children: item.label
1496
+ }
1497
+ )
1498
+ ]
1499
+ },
1500
+ item.id
1501
+ )) }),
1502
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.YStack, { paddingHorizontal: "$3", paddingVertical: "$3", borderTopWidth: 1, borderTopColor: "$borderColor", marginTop: "$2", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1503
+ import_tamagui40.XStack,
1504
+ {
1505
+ height: 48,
1506
+ alignItems: "center",
1507
+ justifyContent: "center",
1508
+ borderRadius: "$4",
1509
+ pressStyle: { backgroundColor: "$color3" },
1510
+ onPress: () => onOpenChange(false),
1511
+ children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_tamagui40.SizableText, { size: "$5", fontWeight: "600", color: "$color9", children: cancelLabel })
1512
+ }
1513
+ ) })
1514
+ ] })
1515
+ ] });
1725
1516
  }
1726
1517
 
1727
1518
  // src/patterns/Skeleton.tsx
@@ -1732,19 +1523,7 @@ function Skeleton({ width, height, borderRadius, variant = "rectangular" }) {
1732
1523
  const w = variant === "text" ? width ?? "100%" : width;
1733
1524
  const h = variant === "text" ? height ?? 16 : size;
1734
1525
  const r = variant === "circular" ? 9999 : borderRadius ?? 8;
1735
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1736
- import_tamagui41.YStack,
1737
- {
1738
- width: w,
1739
- height: h,
1740
- borderRadius: r,
1741
- backgroundColor: "$color3",
1742
- opacity: 0.6,
1743
- animation: "slow",
1744
- enterStyle: { opacity: 0.3 },
1745
- exitStyle: { opacity: 0.3 }
1746
- }
1747
- );
1526
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_tamagui41.YStack, { width: w, height: h, borderRadius: r, backgroundColor: "$color3", opacity: 0.6, animation: "slow", enterStyle: { opacity: 0.3 }, exitStyle: { opacity: 0.3 } });
1748
1527
  }
1749
1528
 
1750
1529
  // src/patterns/NotificationBanner.tsx
@@ -1756,14 +1535,7 @@ var variantColors2 = {
1756
1535
  warning: { bg: "$yellow3", text: "$yellow11" },
1757
1536
  error: { bg: "$red3", text: "$red11" }
1758
1537
  };
1759
- function NotificationBanner({
1760
- title,
1761
- message,
1762
- variant = "info",
1763
- onPress,
1764
- onDismiss,
1765
- icon
1766
- }) {
1538
+ function NotificationBanner({ title, message, variant = "info", onPress, onDismiss, icon }) {
1767
1539
  const colors = variantColors2[variant];
1768
1540
  return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
1769
1541
  import_tamagui42.XStack,
@@ -1800,26 +1572,10 @@ function ProgressSteps({ steps, currentStep, variant = "dots" }) {
1800
1572
  }
1801
1573
  return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_tamagui43.XStack, { alignItems: "center", justifyContent: "center", gap: "$0", children: steps.map((label, i) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_tamagui43.XStack, { alignItems: "center", gap: "$0", children: [
1802
1574
  /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_tamagui43.YStack, { alignItems: "center", gap: "$1.5", children: [
1803
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1804
- import_tamagui43.Circle,
1805
- {
1806
- size: variant === "numbered" ? 28 : 10,
1807
- backgroundColor: i <= currentStep ? "$color9" : "$color4",
1808
- animation: "quick",
1809
- children: variant === "numbered" && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_tamagui43.SizableText, { size: "$2", fontWeight: "600", color: i <= currentStep ? "$color1" : "$color8", children: i + 1 })
1810
- }
1811
- ),
1575
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_tamagui43.Circle, { size: variant === "numbered" ? 28 : 10, backgroundColor: i <= currentStep ? "$color9" : "$color4", animation: "quick", children: variant === "numbered" && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_tamagui43.SizableText, { size: "$2", fontWeight: "600", color: i <= currentStep ? "$color1" : "$color8", children: i + 1 }) }),
1812
1576
  /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_tamagui43.SizableText, { size: "$1", color: i <= currentStep ? "$color11" : "$color8", numberOfLines: 1, children: label })
1813
1577
  ] }),
1814
- i < steps.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1815
- import_tamagui43.YStack,
1816
- {
1817
- height: 2,
1818
- width: 32,
1819
- backgroundColor: i < currentStep ? "$color9" : "$color4",
1820
- marginBottom: "$4"
1821
- }
1822
- )
1578
+ i < steps.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_tamagui43.YStack, { height: 2, width: 32, backgroundColor: i < currentStep ? "$color9" : "$color4", marginBottom: "$4" })
1823
1579
  ] }, i)) });
1824
1580
  }
1825
1581
 
@@ -1832,14 +1588,7 @@ function SwipeableRow({ children, leftActions, rightActions }) {
1832
1588
  const actions = [...leftActions ?? [], ...rightActions ?? []];
1833
1589
  if (actions.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_jsx_runtime36.Fragment, { children });
1834
1590
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_tamagui44.YStack, { children: [
1835
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1836
- import_tamagui44.YStack,
1837
- {
1838
- onLongPress: () => setShowActions((v) => !v),
1839
- pressStyle: { opacity: 0.9 },
1840
- children
1841
- }
1842
- ),
1591
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_tamagui44.YStack, { onLongPress: () => setShowActions((v) => !v), pressStyle: { opacity: 0.9 }, children }),
1843
1592
  showActions && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_tamagui44.XStack, { gap: "$2", padding: "$2", animation: "quick", enterStyle: { opacity: 0, scale: 0.95 }, children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1844
1593
  import_tamagui44.Button,
1845
1594
  {
@@ -1862,15 +1611,7 @@ function SwipeableRow({ children, leftActions, rightActions }) {
1862
1611
  var import_tamagui45 = require("tamagui");
1863
1612
  var import_linear_gradient = require("tamagui/linear-gradient");
1864
1613
  var import_jsx_runtime37 = require("react/jsx-runtime");
1865
- function MediaCard({
1866
- image,
1867
- title,
1868
- subtitle,
1869
- overlay = "gradient",
1870
- aspectRatio = 16 / 9,
1871
- onPress,
1872
- badge
1873
- }) {
1614
+ function MediaCard({ image, title, subtitle, overlay = "gradient", aspectRatio = 16 / 9, onPress, badge }) {
1874
1615
  return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1875
1616
  import_tamagui45.YStack,
1876
1617
  {
@@ -1895,7 +1636,19 @@ function MediaCard({
1895
1636
  }
1896
1637
  ),
1897
1638
  overlay === "dark" && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_tamagui45.YStack, { position: "absolute", fullscreen: true, backgroundColor: "rgba(0,0,0,0.4)" }),
1898
- badge && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_tamagui45.XStack, { position: "absolute", top: "$2", right: "$2", backgroundColor: "$color9", paddingHorizontal: "$2", paddingVertical: "$1", borderRadius: "$2", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_tamagui45.SizableText, { size: "$1", fontWeight: "600", color: "$color1", children: badge }) }),
1639
+ badge && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1640
+ import_tamagui45.XStack,
1641
+ {
1642
+ position: "absolute",
1643
+ top: "$2",
1644
+ right: "$2",
1645
+ backgroundColor: "$color9",
1646
+ paddingHorizontal: "$2",
1647
+ paddingVertical: "$1",
1648
+ borderRadius: "$2",
1649
+ children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_tamagui45.SizableText, { size: "$1", fontWeight: "600", color: "$color1", children: badge })
1650
+ }
1651
+ ),
1899
1652
  /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_tamagui45.YStack, { position: "absolute", bottom: 0, left: 0, right: 0, padding: "$3", gap: "$1", children: [
1900
1653
  /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_tamagui45.SizableText, { size: "$5", fontWeight: "600", color: "white", children: title }),
1901
1654
  subtitle && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_tamagui45.SizableText, { size: "$3", color: "rgba(255,255,255,0.8)", children: subtitle })
@@ -1913,6 +1666,7 @@ var import_jsx_runtime38 = require("react/jsx-runtime");
1913
1666
  function Carousel({ children, gap = "$3", snapToInterval, showIndicators = false }) {
1914
1667
  const [activeIndex, setActiveIndex] = (0, import_react9.useState)(0);
1915
1668
  const count = import_react9.Children.count(children);
1669
+ const gapPx = gap === "$2" ? 8 : gap === "$3" ? 12 : 16;
1916
1670
  return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_tamagui46.YStack, { gap: "$3", children: [
1917
1671
  /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
1918
1672
  import_react_native3.ScrollView,
@@ -1921,24 +1675,14 @@ function Carousel({ children, gap = "$3", snapToInterval, showIndicators = false
1921
1675
  showsHorizontalScrollIndicator: false,
1922
1676
  snapToInterval,
1923
1677
  decelerationRate: "fast",
1924
- contentContainerStyle: { gap: gap === "$2" ? 8 : gap === "$3" ? 12 : 16, paddingHorizontal: 16 },
1678
+ contentContainerStyle: { gap: gapPx, paddingHorizontal: 16 },
1925
1679
  onMomentumScrollEnd: (e) => {
1926
- if (snapToInterval) {
1927
- setActiveIndex(Math.round(e.nativeEvent.contentOffset.x / snapToInterval));
1928
- }
1680
+ if (snapToInterval) setActiveIndex(Math.round(e.nativeEvent.contentOffset.x / snapToInterval));
1929
1681
  },
1930
1682
  children
1931
1683
  }
1932
1684
  ),
1933
- showIndicators && count > 1 && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_tamagui46.XStack, { justifyContent: "center", gap: "$1.5", children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
1934
- import_tamagui46.Circle,
1935
- {
1936
- size: 6,
1937
- backgroundColor: i === activeIndex ? "$color9" : "$color4",
1938
- animation: "quick"
1939
- },
1940
- i
1941
- )) })
1685
+ showIndicators && count > 1 && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_tamagui46.XStack, { justifyContent: "center", gap: "$1.5", children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_tamagui46.Circle, { size: 6, backgroundColor: i === activeIndex ? "$color9" : "$color4", animation: "quick" }, i)) })
1942
1686
  ] });
1943
1687
  }
1944
1688
 
@@ -1960,15 +1704,21 @@ function PullToRefresh({ children, onRefresh, refreshing = false }) {
1960
1704
  0 && (module.exports = {
1961
1705
  Accordion,
1962
1706
  ActionSheet,
1707
+ Adapt,
1963
1708
  AlertDialog,
1709
+ Anchor,
1964
1710
  AppHeader,
1965
1711
  Avatar,
1966
1712
  Badge,
1713
+ BlinkAccordion,
1967
1714
  BlinkAvatar,
1968
1715
  BlinkButton,
1969
1716
  BlinkCard,
1970
1717
  BlinkInput,
1718
+ BlinkTabs,
1971
1719
  BlinkText,
1720
+ BlinkToastProvider,
1721
+ BlinkToggleGroup,
1972
1722
  BlinkTooltip,
1973
1723
  BottomSheet,
1974
1724
  Button,
@@ -1982,7 +1732,9 @@ function PullToRefresh({ children, onRefresh, refreshing = false }) {
1982
1732
  DialogProvider,
1983
1733
  Divider,
1984
1734
  EmptyState,
1735
+ Fieldset,
1985
1736
  FloatingActionButton,
1737
+ Form,
1986
1738
  FormField,
1987
1739
  Grid,
1988
1740
  H1,
@@ -2007,6 +1759,7 @@ function PullToRefresh({ children, onRefresh, refreshing = false }) {
2007
1759
  Paragraph,
2008
1760
  PaywallScreen,
2009
1761
  Popover,
1762
+ PortalProvider,
2010
1763
  Pressable,
2011
1764
  ProfileHeader,
2012
1765
  Progress,
@@ -2027,6 +1780,7 @@ function PullToRefresh({ children, onRefresh, refreshing = false }) {
2027
1780
  Skeleton,
2028
1781
  Slider,
2029
1782
  Spinner,
1783
+ Square,
2030
1784
  StepPageLayout,
2031
1785
  SubHeading,
2032
1786
  SwipeableRow,
@@ -2034,15 +1788,20 @@ function PullToRefresh({ children, onRefresh, refreshing = false }) {
2034
1788
  TabBar,
2035
1789
  Tabs,
2036
1790
  TamaguiImage,
1791
+ TamaguiListItem,
2037
1792
  TamaguiProvider,
2038
1793
  Text,
2039
1794
  TextArea,
2040
1795
  Theme,
2041
- ToastProvider,
2042
1796
  ToggleGroup,
2043
1797
  Tooltip,
1798
+ TooltipSimple,
1799
+ Unspaced,
2044
1800
  View,
1801
+ VisuallyHidden,
1802
+ XGroup,
2045
1803
  XStack,
1804
+ YGroup,
2046
1805
  YStack,
2047
1806
  ZStack,
2048
1807
  blinkConfig,
@@ -2050,10 +1809,10 @@ function PullToRefresh({ children, onRefresh, refreshing = false }) {
2050
1809
  showError,
2051
1810
  styled,
2052
1811
  toast,
1812
+ useBlinkToast,
2053
1813
  useMedia,
2054
1814
  useTheme,
2055
1815
  useThemeName,
2056
- useToast,
2057
1816
  withStaticProperties
2058
1817
  });
2059
1818
  //# sourceMappingURL=index.js.map