@blinkdotnew/mobile-ui 2.0.0-alpha.12 → 2.0.0-alpha.14

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,179 +20,187 @@ 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_tamagui60.Accordion,
23
+ Accordion: () => import_tamagui67.Accordion,
24
24
  ActionSheet: () => ActionSheet,
25
- Adapt: () => import_tamagui60.Adapt,
26
- AlertDialog: () => import_tamagui60.AlertDialog,
27
- Anchor: () => import_tamagui60.Anchor,
28
- AnimatePresence: () => import_tamagui60.AnimatePresence,
25
+ Adapt: () => import_tamagui67.Adapt,
26
+ AlertDialog: () => import_tamagui67.AlertDialog,
27
+ Anchor: () => import_tamagui67.Anchor,
28
+ AnimatePresence: () => import_tamagui67.AnimatePresence,
29
29
  AppHeader: () => AppHeader,
30
- Article: () => import_tamagui60.Article,
31
- Aside: () => import_tamagui60.Aside,
32
- Avatar: () => import_tamagui60.Avatar,
30
+ Article: () => import_tamagui67.Article,
31
+ Aside: () => import_tamagui67.Aside,
32
+ Avatar: () => import_tamagui67.Avatar,
33
33
  AvatarGroup: () => AvatarGroup,
34
34
  Badge: () => Badge,
35
35
  BlinkAccordion: () => BlinkAccordion,
36
36
  BlinkAvatar: () => Avatar,
37
37
  BlinkButton: () => Button,
38
38
  BlinkCard: () => Card,
39
+ BlinkDialog: () => BlinkDialog,
39
40
  BlinkInput: () => Input,
40
- BlinkProvider: () => import_tamagui60.TamaguiProvider,
41
+ BlinkPopover: () => BlinkPopover,
42
+ BlinkProvider: () => import_tamagui67.TamaguiProvider,
43
+ BlinkSelect: () => BlinkSelect,
41
44
  BlinkTabs: () => BlinkTabs,
42
45
  BlinkText: () => BlinkText,
43
46
  BlinkToastProvider: () => BlinkToastProvider,
44
47
  BlinkToggleGroup: () => BlinkToggleGroup,
45
48
  BlinkTooltip: () => BlinkTooltip,
46
49
  BottomSheet: () => BottomSheet,
47
- Button: () => import_tamagui60.Button,
48
- Card: () => import_tamagui60.Card,
50
+ Button: () => import_tamagui67.Button,
51
+ Card: () => import_tamagui67.Card,
49
52
  Carousel: () => Carousel,
50
53
  ChatBubble: () => ChatBubble,
51
- Checkbox: () => import_tamagui60.Checkbox,
54
+ Checkbox: () => import_tamagui67.Checkbox,
52
55
  Chip: () => Chip,
53
56
  ChipGroup: () => ChipGroup,
54
- Circle: () => import_tamagui60.Circle,
57
+ Circle: () => import_tamagui67.Circle,
55
58
  ConfirmDialog: () => ConfirmDialog,
56
59
  Container: () => Container,
57
60
  CountdownBanner: () => CountdownBanner,
58
- Dialog: () => import_tamagui60.Dialog,
61
+ DataTable: () => DataTable,
62
+ DatePicker: () => DatePicker,
63
+ Dialog: () => import_tamagui67.Dialog,
59
64
  DialogProvider: () => DialogProvider,
60
65
  Divider: () => Divider,
61
66
  EmptyState: () => EmptyState,
62
- EnsureFlexed: () => import_tamagui60.EnsureFlexed,
63
- Fieldset: () => import_tamagui60.Fieldset,
67
+ EnsureFlexed: () => import_tamagui67.EnsureFlexed,
68
+ EventCard: () => EventCard,
69
+ Fieldset: () => import_tamagui67.Fieldset,
64
70
  FloatingActionButton: () => FloatingActionButton,
65
- Footer: () => import_tamagui60.Footer,
66
- Form: () => import_tamagui60.Form,
71
+ Footer: () => import_tamagui67.Footer,
72
+ Form: () => import_tamagui67.Form,
67
73
  FormField: () => FormField,
68
- Frame: () => import_tamagui60.Frame,
74
+ Frame: () => import_tamagui67.Frame,
69
75
  GlassCard: () => GlassCard,
70
76
  Grid: () => Grid,
71
- Group: () => import_tamagui60.Group,
72
- H1: () => import_tamagui60.H1,
73
- H2: () => import_tamagui60.H2,
74
- H3: () => import_tamagui60.H3,
75
- H4: () => import_tamagui60.H4,
76
- H5: () => import_tamagui60.H5,
77
- H6: () => import_tamagui60.H6,
78
- Header: () => import_tamagui60.Header,
79
- Heading: () => import_tamagui60.Heading,
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,
80
86
  ICONS: () => ICONS,
81
87
  Icon: () => Icon,
82
88
  Image: () => Image2,
83
- Input: () => import_tamagui60.Input,
89
+ Input: () => import_tamagui67.Input,
84
90
  KeyboardStickyFooter: () => KeyboardStickyFooter,
85
- Label: () => import_tamagui60.Label,
91
+ Label: () => import_tamagui67.Label,
86
92
  ListItem: () => ListItem,
87
93
  LoginScreen: () => LoginScreen,
88
- Main: () => import_tamagui60.Main,
94
+ Main: () => import_tamagui67.Main,
89
95
  MediaCard: () => MediaCard,
90
- Nav: () => import_tamagui60.Nav,
96
+ Nav: () => import_tamagui67.Nav,
91
97
  NotificationBanner: () => NotificationBanner,
92
98
  OTPInput: () => OTPInput,
93
99
  OnboardingCarousel: () => OnboardingCarousel,
94
100
  PageContainer: () => PageContainer,
95
101
  PageMainContainer: () => PageMainContainer,
96
- Paragraph: () => import_tamagui60.Paragraph,
102
+ Paragraph: () => import_tamagui67.Paragraph,
97
103
  PasswordInput: () => PasswordInput,
98
104
  PaywallScreen: () => PaywallScreen,
99
- Popover: () => import_tamagui60.Popover,
100
- Portal: () => import_tamagui60.Portal,
101
- PortalHost: () => import_tamagui60.PortalHost,
102
- PortalItem: () => import_tamagui60.PortalItem,
103
- PortalProvider: () => import_tamagui60.PortalProvider,
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,
104
110
  Pressable: () => Pressable,
105
111
  PricingTable: () => PricingTable,
106
112
  ProductCard: () => ProductCard,
107
113
  ProfileHeader: () => ProfileHeader,
108
- Progress: () => import_tamagui60.Progress,
114
+ Progress: () => import_tamagui67.Progress,
109
115
  ProgressSteps: () => ProgressSteps,
110
116
  PullToRefresh: () => PullToRefresh,
111
- RadioGroup: () => import_tamagui60.RadioGroup,
117
+ RadioGroup: () => import_tamagui67.RadioGroup,
112
118
  SafeArea: () => SafeArea,
113
119
  ScreenLayout: () => ScreenLayout,
114
- ScrollView: () => import_tamagui60.ScrollView,
120
+ ScrollView: () => import_tamagui67.ScrollView,
115
121
  SearchBar: () => SearchBar,
116
122
  Section: () => Section,
117
- Select: () => import_tamagui60.Select,
123
+ Select: () => import_tamagui67.Select,
118
124
  SepHeading: () => SepHeading,
119
- Separator: () => import_tamagui60.Separator,
125
+ Separator: () => import_tamagui67.Separator,
120
126
  SettingsScreen: () => SettingsScreen,
121
- Sheet: () => import_tamagui60.Sheet,
122
- SizableStack: () => import_tamagui60.SizableStack,
123
- SizableText: () => import_tamagui60.SizableText,
127
+ Sheet: () => import_tamagui67.Sheet,
128
+ SizableStack: () => import_tamagui67.SizableStack,
129
+ SizableText: () => import_tamagui67.SizableText,
124
130
  Skeleton: () => Skeleton,
125
- Slider: () => import_tamagui60.Slider,
126
- Spacer: () => import_tamagui60.Spacer,
127
- Spinner: () => import_tamagui60.Spinner,
128
- Square: () => import_tamagui60.Square,
129
- Stack: () => import_tamagui60.Stack,
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,
136
+ StatusBadge: () => StatusBadge,
130
137
  StepPageLayout: () => StepPageLayout,
131
138
  SubHeading: () => SubHeading,
132
139
  SwipeCards: () => SwipeCards,
133
140
  SwipeableRow: () => SwipeableRow,
134
- Switch: () => import_tamagui60.Switch,
141
+ Switch: () => import_tamagui67.Switch,
135
142
  TabBar: () => TabBar,
136
- Tabs: () => import_tamagui60.Tabs,
137
- TamaguiImage: () => import_tamagui60.Image,
138
- TamaguiListItem: () => import_tamagui60.ListItem,
139
- TamaguiProvider: () => import_tamagui60.TamaguiProvider,
143
+ Tabs: () => import_tamagui67.Tabs,
144
+ TamaguiImage: () => import_tamagui67.Image,
145
+ TamaguiListItem: () => import_tamagui67.ListItem,
146
+ TamaguiProvider: () => import_tamagui67.TamaguiProvider,
140
147
  TestimonialCard: () => TestimonialCard,
141
- Text: () => import_tamagui60.Text,
142
- TextArea: () => import_tamagui60.TextArea,
143
- Theme: () => import_tamagui60.Theme,
144
- ThemeableStack: () => import_tamagui60.ThemeableStack,
145
- ToggleGroup: () => import_tamagui60.ToggleGroup,
146
- Tooltip: () => import_tamagui60.Tooltip,
147
- TooltipSimple: () => import_tamagui60.TooltipSimple,
148
- Unspaced: () => import_tamagui60.Unspaced,
149
- View: () => import_tamagui60.View,
150
- VisuallyHidden: () => import_tamagui60.VisuallyHidden,
151
- XGroup: () => import_tamagui60.XGroup,
152
- XStack: () => import_tamagui60.XStack,
153
- YGroup: () => import_tamagui60.YGroup,
154
- YStack: () => import_tamagui60.YStack,
155
- ZStack: () => import_tamagui60.ZStack,
156
- addTheme: () => import_tamagui60.addTheme,
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,
156
+ 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,
157
165
  blinkConfig: () => blinkConfig,
158
- composeEventHandlers: () => import_tamagui60.composeEventHandlers,
159
- composeRefs: () => import_tamagui60.composeRefs,
160
- createFont: () => import_tamagui60.createFont,
161
- createMedia: () => import_tamagui60.createMedia,
162
- createStyledContext: () => import_tamagui60.createStyledContext,
163
- createTamagui: () => import_tamagui60.createTamagui,
164
- createTheme: () => import_tamagui60.createTheme,
165
- createTokens: () => import_tamagui60.createTokens,
166
- createVariable: () => import_tamagui60.createVariable,
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,
167
175
  dialogConfirm: () => dialogConfirm,
168
- getConfig: () => import_tamagui60.getConfig,
169
- getToken: () => import_tamagui60.getToken,
170
- getTokenValue: () => import_tamagui60.getTokenValue,
171
- getTokens: () => import_tamagui60.getTokens,
172
- isClient: () => import_tamagui60.isClient,
173
- isWeb: () => import_tamagui60.isWeb,
174
- replaceTheme: () => import_tamagui60.replaceTheme,
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,
175
183
  showError: () => showError,
176
- styled: () => import_tamagui60.styled,
184
+ styled: () => import_tamagui67.styled,
177
185
  tamaguiDefaultConfig: () => import_v52.defaultConfig,
178
186
  toast: () => toast,
179
- updateTheme: () => import_tamagui60.updateTheme,
187
+ updateTheme: () => import_tamagui67.updateTheme,
180
188
  useBlinkToast: () => useBlinkToast,
181
- useComposedRefs: () => import_tamagui60.useComposedRefs,
182
- useControllableState: () => import_tamagui60.useControllableState,
183
- useDebounce: () => import_tamagui60.useDebounce,
184
- useDebounceValue: () => import_tamagui60.useDebounceValue,
185
- useDidFinishSSR: () => import_tamagui60.useDidFinishSSR,
186
- useEvent: () => import_tamagui60.useEvent,
187
- useForceUpdate: () => import_tamagui60.useForceUpdate,
188
- useIsPresent: () => import_tamagui60.useIsPresent,
189
- useIsomorphicLayoutEffect: () => import_tamagui60.useIsomorphicLayoutEffect,
190
- useMedia: () => import_tamagui60.useMedia,
191
- usePresence: () => import_tamagui60.usePresence,
192
- useTheme: () => import_tamagui60.useTheme,
193
- useThemeName: () => import_tamagui60.useThemeName,
194
- useWindowDimensions: () => import_tamagui60.useWindowDimensions,
195
- withStaticProperties: () => import_tamagui60.withStaticProperties
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
196
204
  });
197
205
  module.exports = __toCommonJS(index_exports);
198
206
 
@@ -205,7 +213,7 @@ var blinkConfig = (0, import_tamagui.createTamagui)({
205
213
 
206
214
  // src/index.ts
207
215
  var import_v52 = require("@tamagui/config/v5");
208
- var import_tamagui60 = require("tamagui");
216
+ var import_tamagui67 = require("tamagui");
209
217
 
210
218
  // src/primitives/Button.tsx
211
219
  var import_tamagui2 = require("tamagui");
@@ -2404,20 +2412,25 @@ function ChipGroup({ chips, selected = [], onSelectionChange, multiSelect = true
2404
2412
 
2405
2413
  // src/patterns/OTPInput.tsx
2406
2414
  var import_react14 = require("react");
2415
+ var import_react_native5 = require("react-native");
2407
2416
  var import_tamagui54 = require("tamagui");
2408
2417
  var import_jsx_runtime46 = require("react/jsx-runtime");
2409
2418
  function OTPInput({ length = 6, value = "", onChange, onComplete, error, autoFocus, secureEntry }) {
2410
2419
  const inputRef = (0, import_react14.useRef)(null);
2420
+ const [focused, setFocused] = (0, import_react14.useState)(false);
2411
2421
  const digits = value.padEnd(length, " ").slice(0, length);
2412
2422
  const handleChange = (0, import_react14.useCallback)((text) => {
2413
2423
  const cleaned = text.replace(/\D/g, "").slice(0, length);
2414
2424
  onChange?.(cleaned);
2415
2425
  if (cleaned.length === length) onComplete?.(cleaned);
2416
2426
  }, [length, onChange, onComplete]);
2417
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_tamagui54.YStack, { children: [
2418
- /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_tamagui54.XStack, { gap: "$2", justifyContent: "center", onPress: () => inputRef.current?.focus(), children: Array.from({ length }, (_, i) => {
2427
+ const focusInput = (0, import_react14.useCallback)(() => {
2428
+ inputRef.current?.focus();
2429
+ }, []);
2430
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_tamagui54.YStack, { position: "relative", children: [
2431
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_tamagui54.XStack, { gap: "$2", justifyContent: "center", children: Array.from({ length }, (_, i) => {
2419
2432
  const char = digits[i]?.trim();
2420
- const focused = value.length === i;
2433
+ const isCursor = focused && value.length === i;
2421
2434
  return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
2422
2435
  import_tamagui54.YStack,
2423
2436
  {
@@ -2425,20 +2438,59 @@ function OTPInput({ length = 6, value = "", onChange, onComplete, error, autoFoc
2425
2438
  height: 56,
2426
2439
  borderRadius: "$3",
2427
2440
  borderWidth: 2,
2428
- borderColor: error ? "$red9" : focused ? "$color9" : "$color6",
2429
- backgroundColor: error ? "$red2" : "$color2",
2441
+ borderColor: error ? "$red9" : isCursor ? "$color9" : char ? "$color7" : "$color5",
2442
+ backgroundColor: error ? "$red2" : isCursor ? "$color2" : "$color1",
2430
2443
  alignItems: "center",
2431
2444
  justifyContent: "center",
2432
2445
  animation: "quick",
2446
+ pointerEvents: "none",
2433
2447
  children: [
2434
2448
  /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_tamagui54.SizableText, { size: "$7", fontWeight: "600", color: "$color12", children: char ? secureEntry ? "\u25CF" : char : "" }),
2435
- focused && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_tamagui54.YStack, { position: "absolute", bottom: 10, width: 20, height: 2, backgroundColor: "$color9", animation: "quick" })
2449
+ isCursor && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2450
+ import_tamagui54.YStack,
2451
+ {
2452
+ position: "absolute",
2453
+ bottom: 10,
2454
+ width: 20,
2455
+ height: 2,
2456
+ backgroundColor: "$color9",
2457
+ animation: "quick"
2458
+ }
2459
+ )
2436
2460
  ]
2437
2461
  },
2438
2462
  i
2439
2463
  );
2440
2464
  }) }),
2441
- /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2465
+ import_react_native5.Platform.OS === "web" ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2466
+ "input",
2467
+ {
2468
+ ref: inputRef,
2469
+ type: "text",
2470
+ inputMode: "numeric",
2471
+ pattern: "[0-9]*",
2472
+ autoComplete: "one-time-code",
2473
+ maxLength: length,
2474
+ value,
2475
+ autoFocus,
2476
+ onChange: (e) => handleChange(e.target.value),
2477
+ onFocus: () => setFocused(true),
2478
+ onBlur: () => setFocused(false),
2479
+ style: {
2480
+ position: "absolute",
2481
+ top: 0,
2482
+ left: 0,
2483
+ right: 0,
2484
+ bottom: 0,
2485
+ width: "100%",
2486
+ height: "100%",
2487
+ opacity: 0,
2488
+ fontSize: 16,
2489
+ caretColor: "transparent",
2490
+ cursor: "pointer"
2491
+ }
2492
+ }
2493
+ ) : /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2442
2494
  import_tamagui54.Input,
2443
2495
  {
2444
2496
  ref: inputRef,
@@ -2447,10 +2499,15 @@ function OTPInput({ length = 6, value = "", onChange, onComplete, error, autoFoc
2447
2499
  keyboardType: "number-pad",
2448
2500
  maxLength: length,
2449
2501
  autoFocus,
2502
+ onFocus: () => setFocused(true),
2503
+ onBlur: () => setFocused(false),
2450
2504
  position: "absolute",
2505
+ top: 0,
2506
+ left: 0,
2507
+ right: 0,
2508
+ bottom: 0,
2451
2509
  opacity: 0,
2452
- width: 1,
2453
- height: 1
2510
+ fontSize: 16
2454
2511
  }
2455
2512
  )
2456
2513
  ] });
@@ -2742,6 +2799,573 @@ function GlassCard({
2742
2799
  }
2743
2800
  );
2744
2801
  }
2802
+
2803
+ // src/patterns/DataTable.tsx
2804
+ var import_react17 = require("react");
2805
+ var import_tamagui59 = require("tamagui");
2806
+ var import_jsx_runtime51 = require("react/jsx-runtime");
2807
+ var TH = (0, import_tamagui59.styled)(import_tamagui59.View, { padding: "$3", justifyContent: "center" });
2808
+ var TD = (0, import_tamagui59.styled)(import_tamagui59.View, { padding: "$3", justifyContent: "center" });
2809
+ function StatusBadge({ status }) {
2810
+ const isActive = status.toLowerCase() === "active";
2811
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_tamagui59.XStack, { gap: "$2", alignItems: "center", children: [
2812
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
2813
+ import_tamagui59.View,
2814
+ {
2815
+ width: 8,
2816
+ height: 8,
2817
+ borderRadius: 4,
2818
+ backgroundColor: isActive ? "$green9" : "$orange9"
2819
+ }
2820
+ ),
2821
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.SizableText, { size: "$3", color: "$color11", children: status })
2822
+ ] });
2823
+ }
2824
+ function HeaderCell({ col, sort, onSort }) {
2825
+ const active = sort?.key === col.key;
2826
+ const indicator = active ? sort.dir === "asc" ? " \u25B2" : " \u25BC" : "";
2827
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
2828
+ TH,
2829
+ {
2830
+ width: col.width,
2831
+ flexDirection: "row",
2832
+ alignItems: "center",
2833
+ cursor: col.sortable ? "pointer" : void 0,
2834
+ onPress: col.sortable ? onSort : void 0,
2835
+ pressStyle: col.sortable ? { opacity: 0.7 } : void 0,
2836
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
2837
+ import_tamagui59.SizableText,
2838
+ {
2839
+ size: "$2",
2840
+ fontWeight: "700",
2841
+ color: active ? "$color12" : "$color9",
2842
+ textTransform: "uppercase",
2843
+ letterSpacing: 0.5,
2844
+ children: [
2845
+ col.header,
2846
+ indicator
2847
+ ]
2848
+ }
2849
+ )
2850
+ },
2851
+ col.key
2852
+ );
2853
+ }
2854
+ function TableRow({ row, columns, onPress, odd }) {
2855
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
2856
+ import_tamagui59.XStack,
2857
+ {
2858
+ backgroundColor: odd ? "$color2" : "transparent",
2859
+ borderBottomWidth: 0.5,
2860
+ borderColor: "$color4",
2861
+ hoverStyle: { backgroundColor: "$color3" },
2862
+ cursor: onPress ? "pointer" : void 0,
2863
+ onPress: onPress ? () => onPress(row) : void 0,
2864
+ pressStyle: onPress ? { opacity: 0.85 } : void 0,
2865
+ animation: "quick",
2866
+ children: columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(TD, { width: col.width, flex: col.width ? void 0 : 1, children: col.render ? col.render(row[col.key], row) : /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.SizableText, { size: "$3", color: "$color11", children: String(row[col.key] ?? "") }) }, col.key))
2867
+ }
2868
+ );
2869
+ }
2870
+ function CardRow({ row, columns, onPress }) {
2871
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
2872
+ import_tamagui59.YStack,
2873
+ {
2874
+ backgroundColor: "$color1",
2875
+ borderRadius: "$4",
2876
+ borderWidth: 1,
2877
+ borderColor: "$color4",
2878
+ padding: "$3",
2879
+ gap: "$2",
2880
+ onPress: onPress ? () => onPress(row) : void 0,
2881
+ pressStyle: onPress ? { scale: 0.98, opacity: 0.9 } : void 0,
2882
+ animation: "quick",
2883
+ children: columns.map((col, i) => /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_tamagui59.YStack, { children: [
2884
+ i > 0 && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.Separator, { marginVertical: "$1.5", borderColor: "$color4" }),
2885
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_tamagui59.XStack, { justifyContent: "space-between", alignItems: "center", children: [
2886
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.SizableText, { size: "$2", color: "$color9", fontWeight: "600", children: col.header }),
2887
+ col.render ? col.render(row[col.key], row) : /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.SizableText, { size: "$3", color: "$color11", children: String(row[col.key] ?? "") })
2888
+ ] })
2889
+ ] }, col.key))
2890
+ }
2891
+ );
2892
+ }
2893
+ function DataTable({ columns, data, onRowPress, emptyMessage = "No data" }) {
2894
+ const [sort, setSort] = (0, import_react17.useState)(null);
2895
+ const media = (0, import_tamagui59.useMedia)();
2896
+ const isSmall = media.sm;
2897
+ const sorted = (0, import_react17.useMemo)(() => {
2898
+ if (!sort) return data;
2899
+ return [...data].sort((a, b) => {
2900
+ const av = a[sort.key], bv = b[sort.key];
2901
+ const cmp = typeof av === "number" && typeof bv === "number" ? av - bv : String(av ?? "").localeCompare(String(bv ?? ""));
2902
+ return sort.dir === "asc" ? cmp : -cmp;
2903
+ });
2904
+ }, [data, sort]);
2905
+ const toggleSort = (key) => setSort((s) => s?.key === key ? { key, dir: s.dir === "asc" ? "desc" : "asc" } : { key, dir: "asc" });
2906
+ if (!data.length) {
2907
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.YStack, { padding: "$6", alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.SizableText, { size: "$4", color: "$color9", children: emptyMessage }) });
2908
+ }
2909
+ if (isSmall) {
2910
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.YStack, { gap: "$3", children: sorted.map((row, i) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(CardRow, { row, columns, onPress: onRowPress }, i)) });
2911
+ }
2912
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_tamagui59.YStack, { borderWidth: 1, borderColor: "$color4", borderRadius: "$4", overflow: "hidden", children: [
2913
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tamagui59.XStack, { backgroundColor: "$color1", borderBottomWidth: 1, borderColor: "$color4", children: columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(HeaderCell, { col, sort, onSort: () => toggleSort(col.key) }, col.key)) }),
2914
+ sorted.map((row, i) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(TableRow, { row, columns, onPress: onRowPress, odd: i % 2 === 1 }, i))
2915
+ ] });
2916
+ }
2917
+
2918
+ // src/patterns/DatePicker.tsx
2919
+ var import_react18 = require("react");
2920
+ var import_tamagui60 = require("tamagui");
2921
+ var import_jsx_runtime52 = require("react/jsx-runtime");
2922
+ var MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
2923
+ var DAY_LABELS_SUN = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
2924
+ var DAY_LABELS_MON = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
2925
+ function daysInMonth(year, month) {
2926
+ return new Date(year, month + 1, 0).getDate();
2927
+ }
2928
+ function sameDay(a, b) {
2929
+ return a ? a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate() : false;
2930
+ }
2931
+ function buildGrid(year, month, startDay) {
2932
+ const total = daysInMonth(year, month);
2933
+ const firstWeekday = new Date(year, month, 1).getDay();
2934
+ const offset = (firstWeekday - startDay + 7) % 7;
2935
+ const prevTotal = daysInMonth(year, month - 1);
2936
+ const cells = [];
2937
+ for (let i = offset - 1; i >= 0; i--)
2938
+ cells.push({ day: prevTotal - i, month: month - 1, year: month === 0 ? year - 1 : year, outside: true });
2939
+ for (let d = 1; d <= total; d++)
2940
+ cells.push({ day: d, month, year, outside: false });
2941
+ while (cells.length < 42)
2942
+ cells.push({ day: cells.length - offset - total + 1, month: month + 1, year: month === 11 ? year + 1 : year, outside: true });
2943
+ return cells;
2944
+ }
2945
+ function NavButton({ label, onPress }) {
2946
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
2947
+ import_tamagui60.XStack,
2948
+ {
2949
+ width: 36,
2950
+ height: 36,
2951
+ borderRadius: "$10",
2952
+ alignItems: "center",
2953
+ justifyContent: "center",
2954
+ backgroundColor: "$color3",
2955
+ pressStyle: { scale: 0.92, backgroundColor: "$color5" },
2956
+ animation: "quick",
2957
+ onPress,
2958
+ cursor: "pointer",
2959
+ children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_tamagui60.SizableText, { size: "$5", color: "$color11", fontWeight: "600", children: label })
2960
+ }
2961
+ );
2962
+ }
2963
+ function DatePicker({ value, onDateChange, minDate, maxDate, startDay = 1 }) {
2964
+ const today = (0, import_react18.useMemo)(() => /* @__PURE__ */ new Date(), []);
2965
+ const [viewMonth, setViewMonth] = (0, import_react18.useState)(value?.getMonth() ?? today.getMonth());
2966
+ const [viewYear, setViewYear] = (0, import_react18.useState)(value?.getFullYear() ?? today.getFullYear());
2967
+ const headers = startDay === 1 ? DAY_LABELS_MON : DAY_LABELS_SUN;
2968
+ const grid = (0, import_react18.useMemo)(() => buildGrid(viewYear, viewMonth, startDay), [viewYear, viewMonth, startDay]);
2969
+ const navigate = (0, import_react18.useCallback)((dir) => {
2970
+ setViewMonth((m) => {
2971
+ const next = m + dir;
2972
+ if (next < 0) {
2973
+ setViewYear((y) => y - 1);
2974
+ return 11;
2975
+ }
2976
+ if (next > 11) {
2977
+ setViewYear((y) => y + 1);
2978
+ return 0;
2979
+ }
2980
+ return next;
2981
+ });
2982
+ }, []);
2983
+ const isDisabled = (0, import_react18.useCallback)((d) => {
2984
+ if (minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) return true;
2985
+ if (maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate())) return true;
2986
+ return false;
2987
+ }, [minDate, maxDate]);
2988
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_tamagui60.YStack, { backgroundColor: "$color2", borderRadius: "$4", padding: "$3", gap: "$2", animation: "quick", children: [
2989
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_tamagui60.XStack, { alignItems: "center", justifyContent: "space-between", children: [
2990
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(NavButton, { label: "\u2039", onPress: () => navigate(-1) }),
2991
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_tamagui60.SizableText, { size: "$4", fontWeight: "700", color: "$color12", children: [
2992
+ MONTH_NAMES[viewMonth],
2993
+ " ",
2994
+ viewYear
2995
+ ] }),
2996
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(NavButton, { label: "\u203A", onPress: () => navigate(1) })
2997
+ ] }),
2998
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_tamagui60.XStack, { children: headers.map((h) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_tamagui60.SizableText, { size: "$2", color: "$color8", fontWeight: "600", textAlign: "center", flex: 1, children: h }, h)) }),
2999
+ Array.from({ length: Math.ceil(grid.length / 7) }, (_, row) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_tamagui60.XStack, { children: grid.slice(row * 7, row * 7 + 7).map((cell, i) => {
3000
+ const date = new Date(cell.year, cell.month, cell.day);
3001
+ const selected = sameDay(value, date);
3002
+ const isToday = sameDay(today, date);
3003
+ const disabled = cell.outside || isDisabled(date);
3004
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_tamagui60.YStack, { flex: 1, alignItems: "center", paddingVertical: "$0.5", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3005
+ import_tamagui60.XStack,
3006
+ {
3007
+ width: 40,
3008
+ height: 40,
3009
+ borderRadius: "$10",
3010
+ alignItems: "center",
3011
+ justifyContent: "center",
3012
+ backgroundColor: selected ? "$color9" : "transparent",
3013
+ borderWidth: isToday && !selected ? 1.5 : 0,
3014
+ borderColor: "$color9",
3015
+ pressStyle: disabled ? void 0 : { scale: 0.9, backgroundColor: selected ? "$color10" : "$color4" },
3016
+ animation: "quick",
3017
+ opacity: disabled ? 0.35 : 1,
3018
+ cursor: disabled ? "default" : "pointer",
3019
+ onPress: disabled ? void 0 : () => onDateChange?.(date),
3020
+ children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3021
+ import_tamagui60.SizableText,
3022
+ {
3023
+ size: "$3",
3024
+ fontWeight: selected || isToday ? "700" : "400",
3025
+ color: selected ? "white" : cell.outside ? "$color5" : "$color12",
3026
+ children: cell.day
3027
+ }
3028
+ )
3029
+ }
3030
+ ) }, `${row}-${i}`);
3031
+ }) }, row))
3032
+ ] });
3033
+ }
3034
+
3035
+ // src/patterns/EventCard.tsx
3036
+ var import_tamagui61 = require("tamagui");
3037
+ var import_jsx_runtime53 = require("react/jsx-runtime");
3038
+ var THEME_MAP = {
3039
+ purple: "purple",
3040
+ green: "green",
3041
+ blue: "blue",
3042
+ orange: "orange",
3043
+ red: "red",
3044
+ pink: "pink"
3045
+ };
3046
+ function ParticipantDots({ count, max }) {
3047
+ const dots = Math.min(count, 5);
3048
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_tamagui61.XStack, { alignItems: "center", gap: "$1.5", children: [
3049
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.XStack, { children: Array.from({ length: dots }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
3050
+ import_tamagui61.YStack,
3051
+ {
3052
+ width: 22,
3053
+ height: 22,
3054
+ borderRadius: 11,
3055
+ backgroundColor: "$color7",
3056
+ borderWidth: 2,
3057
+ borderColor: "$color4",
3058
+ marginLeft: i > 0 ? -8 : 0,
3059
+ alignItems: "center",
3060
+ justifyContent: "center",
3061
+ children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.SizableText, { size: "$1", color: "$color1", fontWeight: "700", children: String.fromCharCode(65 + i) })
3062
+ },
3063
+ i
3064
+ )) }),
3065
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_tamagui61.SizableText, { size: "$2", color: "$color11", fontWeight: "500", children: [
3066
+ count,
3067
+ max ? `/${max}` : ""
3068
+ ] })
3069
+ ] });
3070
+ }
3071
+ function CardInner({ title, subtitle, time, location, label, participants, maxParticipants, onPress, actions }) {
3072
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
3073
+ import_tamagui61.YStack,
3074
+ {
3075
+ backgroundColor: "$color4",
3076
+ borderRadius: "$5",
3077
+ padding: "$4",
3078
+ gap: "$3",
3079
+ borderWidth: 1,
3080
+ borderColor: "$color7",
3081
+ onPress,
3082
+ animation: "quick",
3083
+ pressStyle: onPress ? { scale: 0.97, opacity: 0.9 } : void 0,
3084
+ cursor: onPress ? "pointer" : void 0,
3085
+ children: [
3086
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_tamagui61.XStack, { justifyContent: "space-between", alignItems: "flex-start", children: [
3087
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_tamagui61.YStack, { flex: 1, gap: "$1", children: [
3088
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.SizableText, { size: "$6", fontWeight: "700", color: "$color12", children: title }),
3089
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.SizableText, { size: "$3", color: "$color11", opacity: 0.8, children: subtitle })
3090
+ ] }),
3091
+ time && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.YStack, { backgroundColor: "$color6", paddingHorizontal: "$2.5", paddingVertical: "$1.5", borderRadius: "$3", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.SizableText, { size: "$2", fontWeight: "600", color: "$color12", children: time }) })
3092
+ ] }),
3093
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_tamagui61.XStack, { gap: "$4", alignItems: "center", flexWrap: "wrap", children: [
3094
+ location && /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_tamagui61.XStack, { gap: "$1.5", alignItems: "center", children: [
3095
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.SizableText, { size: "$3", children: "\u{1F4CD}" }),
3096
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.SizableText, { size: "$3", color: "$color11", children: location })
3097
+ ] }),
3098
+ participants !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ParticipantDots, { count: participants, max: maxParticipants })
3099
+ ] }),
3100
+ (label || actions) && /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_tamagui61.XStack, { justifyContent: "space-between", alignItems: "center", children: [
3101
+ label ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.XStack, { backgroundColor: "$color6", paddingHorizontal: "$2.5", paddingVertical: "$1", borderRadius: "$10", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.SizableText, { size: "$2", fontWeight: "600", color: "$color11", children: label }) }) : /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.YStack, {}),
3102
+ actions
3103
+ ] })
3104
+ ]
3105
+ }
3106
+ );
3107
+ }
3108
+ function EventCard({ theme = "purple", ...props }) {
3109
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_tamagui61.Theme, { name: THEME_MAP[theme], children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(CardInner, { ...props }) });
3110
+ }
3111
+
3112
+ // src/patterns/UserPreferences.tsx
3113
+ var import_tamagui62 = require("tamagui");
3114
+ var import_jsx_runtime54 = require("react/jsx-runtime");
3115
+ function ItemLabel({ title, description, color }) {
3116
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_tamagui62.YStack, { flex: 1, gap: "$1", children: [
3117
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.SizableText, { size: "$4", fontWeight: "500", color: color ?? "$color12", children: title }),
3118
+ description && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.SizableText, { size: "$2", color: "$color9", children: description })
3119
+ ] });
3120
+ }
3121
+ function ToggleRow({ item }) {
3122
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_tamagui62.XStack, { alignItems: "center", gap: "$3", paddingVertical: "$3", paddingHorizontal: "$4", children: [
3123
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ItemLabel, { title: item.title, description: item.description }),
3124
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.Switch, { size: "$3", checked: item.value, onCheckedChange: item.onValueChange, children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.Switch.Thumb, { animation: "quick" }) })
3125
+ ] });
3126
+ }
3127
+ function SelectRow({ item }) {
3128
+ const current = item.options.find((o) => o.value === item.value);
3129
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
3130
+ import_tamagui62.XStack,
3131
+ {
3132
+ alignItems: "center",
3133
+ gap: "$3",
3134
+ paddingVertical: "$3",
3135
+ paddingHorizontal: "$4",
3136
+ pressStyle: { backgroundColor: "$color3" },
3137
+ animation: "quick",
3138
+ cursor: "pointer",
3139
+ onPress: () => {
3140
+ const idx = item.options.findIndex((o) => o.value === item.value);
3141
+ const next = item.options[(idx + 1) % item.options.length];
3142
+ if (next) item.onValueChange(next.value);
3143
+ },
3144
+ children: [
3145
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ItemLabel, { title: item.title, description: item.description }),
3146
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.SizableText, { size: "$3", color: "$color9", fontWeight: "500", children: current?.label ?? item.value }),
3147
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.SizableText, { size: "$4", color: "$color8", children: "\u203A" })
3148
+ ]
3149
+ }
3150
+ );
3151
+ }
3152
+ function SliderRow({ item }) {
3153
+ const min = item.min ?? 0;
3154
+ const max = item.max ?? 100;
3155
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_tamagui62.YStack, { gap: "$2", paddingVertical: "$3", paddingHorizontal: "$4", children: [
3156
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_tamagui62.XStack, { justifyContent: "space-between", alignItems: "center", children: [
3157
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ItemLabel, { title: item.title, description: item.description }),
3158
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.SizableText, { size: "$3", fontWeight: "600", color: "$color11", children: item.value })
3159
+ ] }),
3160
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
3161
+ import_tamagui62.Slider,
3162
+ {
3163
+ value: [item.value],
3164
+ min,
3165
+ max,
3166
+ step: 1,
3167
+ onValueChange: ([v]) => {
3168
+ if (v !== void 0) item.onValueChange(v);
3169
+ },
3170
+ children: [
3171
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.Slider.Track, { backgroundColor: "$color4", height: 4, children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.Slider.TrackActive, { backgroundColor: "$color9" }) }),
3172
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.Slider.Thumb, { index: 0, size: "$1.5", backgroundColor: "$color9", borderWidth: 0, circular: true })
3173
+ ]
3174
+ }
3175
+ )
3176
+ ] });
3177
+ }
3178
+ function ActionRow({ item }) {
3179
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
3180
+ import_tamagui62.XStack,
3181
+ {
3182
+ alignItems: "center",
3183
+ gap: "$3",
3184
+ paddingVertical: "$3",
3185
+ paddingHorizontal: "$4",
3186
+ pressStyle: { backgroundColor: "$color3" },
3187
+ animation: "quick",
3188
+ cursor: "pointer",
3189
+ onPress: item.onPress,
3190
+ children: [
3191
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3192
+ ItemLabel,
3193
+ {
3194
+ title: item.title,
3195
+ description: item.description,
3196
+ color: item.destructive ? "$red10" : void 0
3197
+ }
3198
+ ),
3199
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.SizableText, { size: "$4", color: "$color8", children: "\u203A" })
3200
+ ]
3201
+ }
3202
+ );
3203
+ }
3204
+ function PreferenceRow({ item }) {
3205
+ switch (item.type) {
3206
+ case "toggle":
3207
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ToggleRow, { item });
3208
+ case "select":
3209
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(SelectRow, { item });
3210
+ case "slider":
3211
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(SliderRow, { item });
3212
+ case "action":
3213
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ActionRow, { item });
3214
+ }
3215
+ }
3216
+ function UserPreferences({ sections }) {
3217
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.YStack, { gap: "$5", children: sections.map((section, si) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_tamagui62.YStack, { gap: "$2", children: [
3218
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_tamagui62.YStack, { paddingHorizontal: "$1", gap: "$0.5", children: [
3219
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.SizableText, { size: "$2", fontWeight: "600", color: "$color9", textTransform: "uppercase", children: section.title }),
3220
+ section.description && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.SizableText, { size: "$2", color: "$color8", children: section.description })
3221
+ ] }),
3222
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3223
+ import_tamagui62.YStack,
3224
+ {
3225
+ backgroundColor: "$color2",
3226
+ borderRadius: "$4",
3227
+ overflow: "hidden",
3228
+ borderWidth: 1,
3229
+ borderColor: "$color4",
3230
+ children: section.items.map((item, ii) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_tamagui62.YStack, { children: [
3231
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(PreferenceRow, { item }),
3232
+ ii < section.items.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_tamagui62.Separator, { borderColor: "$color4" })
3233
+ ] }, item.id))
3234
+ }
3235
+ )
3236
+ ] }, si)) });
3237
+ }
3238
+
3239
+ // src/patterns/BlinkSelect.tsx
3240
+ var import_tamagui63 = require("tamagui");
3241
+ var import_jsx_runtime55 = require("react/jsx-runtime");
3242
+ function BlinkSelect({
3243
+ items,
3244
+ value,
3245
+ onValueChange,
3246
+ placeholder = "Select...",
3247
+ size = "$4",
3248
+ disabled,
3249
+ width = "100%"
3250
+ }) {
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
+ );
3275
+ }
3276
+
3277
+ // src/patterns/BlinkDialog.tsx
3278
+ var import_tamagui64 = require("tamagui");
3279
+ var import_jsx_runtime56 = require("react/jsx-runtime");
3280
+ function BlinkDialog({
3281
+ open,
3282
+ onOpenChange,
3283
+ trigger,
3284
+ title,
3285
+ description,
3286
+ children,
3287
+ confirmLabel = "Confirm",
3288
+ cancelLabel = "Cancel",
3289
+ onConfirm,
3290
+ onCancel,
3291
+ confirmTheme = "active"
3292
+ }) {
3293
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_tamagui64.Dialog, { modal: true, open, onOpenChange, children: [
3294
+ trigger && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Dialog.Trigger, { asChild: true, children: trigger }),
3295
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Adapt, { when: "maxMd", platform: "touch", children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_tamagui64.Sheet, { modal: true, dismissOnSnapToBottom: true, snapPointsMode: "fit", children: [
3296
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Sheet.Frame, { padding: "$4", gap: "$4", children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Adapt.Contents, {}) }),
3297
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Sheet.Overlay, {})
3298
+ ] }) }),
3299
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_tamagui64.Dialog.Portal, { children: [
3300
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
3301
+ import_tamagui64.Dialog.Overlay,
3302
+ {
3303
+ animation: "quick",
3304
+ opacity: 0.5,
3305
+ enterStyle: { opacity: 0 },
3306
+ exitStyle: { opacity: 0 }
3307
+ },
3308
+ "overlay"
3309
+ ),
3310
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
3311
+ import_tamagui64.Dialog.Content,
3312
+ {
3313
+ bordered: true,
3314
+ elevate: true,
3315
+ animateOnly: ["transform", "opacity"],
3316
+ animation: ["quick", { opacity: { overshootClamping: true } }],
3317
+ enterStyle: { x: 0, y: -20, opacity: 0, scale: 0.9 },
3318
+ exitStyle: { x: 0, y: 10, opacity: 0, scale: 0.95 },
3319
+ gap: "$4",
3320
+ children: [
3321
+ title && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Dialog.Title, { children: title }),
3322
+ description && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Dialog.Description, { size: "$3", color: "$color10", children: description }),
3323
+ children,
3324
+ (onConfirm || onCancel) && /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_tamagui64.XStack, { justifyContent: "flex-end", gap: "$3", children: [
3325
+ onCancel && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Dialog.Close, { displayWhenAdapted: true, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Button, { variant: "outlined", onPress: onCancel, children: cancelLabel }) }),
3326
+ onConfirm && /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Dialog.Close, { displayWhenAdapted: true, asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_tamagui64.Button, { theme: confirmTheme, onPress: onConfirm, children: confirmLabel }) })
3327
+ ] })
3328
+ ]
3329
+ },
3330
+ "content"
3331
+ )
3332
+ ] })
3333
+ ] });
3334
+ }
3335
+
3336
+ // src/patterns/BlinkPopover.tsx
3337
+ var import_tamagui65 = require("tamagui");
3338
+ var import_jsx_runtime57 = require("react/jsx-runtime");
3339
+ function BlinkPopover({
3340
+ trigger,
3341
+ children,
3342
+ placement = "bottom",
3343
+ allowFlip = true,
3344
+ size = "$5"
3345
+ }) {
3346
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_tamagui65.Popover, { size, allowFlip, placement, children: [
3347
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_tamagui65.Popover.Trigger, { asChild: true, children: trigger }),
3348
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_tamagui65.Adapt, { when: "maxMd", platform: "touch", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_tamagui65.Popover.Sheet, { modal: true, dismissOnSnapToBottom: true, snapPointsMode: "fit", children: [
3349
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_tamagui65.Popover.Sheet.Frame, { padding: "$4", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_tamagui65.Adapt.Contents, {}) }),
3350
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_tamagui65.Popover.Sheet.Overlay, {})
3351
+ ] }) }),
3352
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
3353
+ import_tamagui65.Popover.Content,
3354
+ {
3355
+ borderWidth: 1,
3356
+ borderColor: "$borderColor",
3357
+ enterStyle: { y: -10, opacity: 0 },
3358
+ exitStyle: { y: -10, opacity: 0 },
3359
+ elevate: true,
3360
+ animation: ["quick", { opacity: { overshootClamping: true } }],
3361
+ children: [
3362
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_tamagui65.Popover.Arrow, { borderWidth: 1, borderColor: "$borderColor" }),
3363
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_tamagui65.YStack, { gap: "$3", padding: "$3", children })
3364
+ ]
3365
+ }
3366
+ )
3367
+ ] });
3368
+ }
2745
3369
  // Annotate the CommonJS export names for ESM import in node:
2746
3370
  0 && (module.exports = {
2747
3371
  Accordion,
@@ -2760,8 +3384,11 @@ function GlassCard({
2760
3384
  BlinkAvatar,
2761
3385
  BlinkButton,
2762
3386
  BlinkCard,
3387
+ BlinkDialog,
2763
3388
  BlinkInput,
3389
+ BlinkPopover,
2764
3390
  BlinkProvider,
3391
+ BlinkSelect,
2765
3392
  BlinkTabs,
2766
3393
  BlinkText,
2767
3394
  BlinkToastProvider,
@@ -2779,11 +3406,14 @@ function GlassCard({
2779
3406
  ConfirmDialog,
2780
3407
  Container,
2781
3408
  CountdownBanner,
3409
+ DataTable,
3410
+ DatePicker,
2782
3411
  Dialog,
2783
3412
  DialogProvider,
2784
3413
  Divider,
2785
3414
  EmptyState,
2786
3415
  EnsureFlexed,
3416
+ EventCard,
2787
3417
  Fieldset,
2788
3418
  FloatingActionButton,
2789
3419
  Footer,
@@ -2851,6 +3481,7 @@ function GlassCard({
2851
3481
  Spinner,
2852
3482
  Square,
2853
3483
  Stack,
3484
+ StatusBadge,
2854
3485
  StepPageLayout,
2855
3486
  SubHeading,
2856
3487
  SwipeCards,
@@ -2870,6 +3501,7 @@ function GlassCard({
2870
3501
  Tooltip,
2871
3502
  TooltipSimple,
2872
3503
  Unspaced,
3504
+ UserPreferences,
2873
3505
  View,
2874
3506
  VisuallyHidden,
2875
3507
  XGroup,