@vvedantb/native-ui 0.17.2 → 0.18.0

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.
Files changed (220) hide show
  1. package/dist/AlertDialog.jsx +123 -0
  2. package/dist/AmbientBackground.jsx +73 -0
  3. package/dist/ArtifactList.jsx +59 -0
  4. package/dist/Avatar.jsx +285 -0
  5. package/dist/Badge.jsx +154 -0
  6. package/dist/BottomSheetContainer.jsx +208 -0
  7. package/dist/BulkActionBar.jsx +717 -0
  8. package/dist/Button.jsx +344 -0
  9. package/dist/CaptureButton.jsx +104 -0
  10. package/dist/Card.jsx +371 -0
  11. package/dist/Checkbox.jsx +177 -0
  12. package/dist/Chip.jsx +79 -0
  13. package/dist/ColorSwatches.jsx +159 -0
  14. package/dist/ConfirmDialog.jsx +157 -0
  15. package/dist/DateTimeField.jsx +204 -0
  16. package/dist/Dialog.jsx +614 -0
  17. package/dist/DividedList.jsx +120 -0
  18. package/dist/DropdownMenu.jsx +849 -0
  19. package/dist/EmptyState.jsx +434 -0
  20. package/dist/ExpoWebRoot.jsx +134 -0
  21. package/dist/FloatingFAB.jsx +95 -0
  22. package/dist/FloatingSurface.jsx +226 -0
  23. package/dist/FloatingTabBar.jsx +403 -0
  24. package/dist/HeaderIconButton.jsx +53 -0
  25. package/dist/IconButton.jsx +157 -0
  26. package/dist/Input.jsx +96 -0
  27. package/dist/Label.jsx +96 -0
  28. package/dist/LabeledSwitchRow.jsx +170 -0
  29. package/dist/LiquidGlass.jsx +2 -0
  30. package/dist/ListRow.jsx +281 -0
  31. package/dist/LoadingState.jsx +205 -0
  32. package/dist/PageIndicator.jsx +128 -0
  33. package/dist/PageTitle.jsx +205 -0
  34. package/dist/Pager.jsx +105 -0
  35. package/dist/PasswordInput.jsx +120 -0
  36. package/dist/PillTabs.jsx +300 -0
  37. package/dist/PinnedBotTile.jsx +212 -0
  38. package/dist/Progress.jsx +147 -0
  39. package/dist/SafeAreaContainer.jsx +38 -0
  40. package/dist/ScreenContainer.jsx +117 -0
  41. package/dist/SearchInput.jsx +150 -0
  42. package/dist/SectionLabel.jsx +128 -0
  43. package/dist/Select.jsx +223 -0
  44. package/dist/Separator.jsx +95 -0
  45. package/dist/Sheet.jsx +343 -0
  46. package/dist/SheetRow.jsx +198 -0
  47. package/dist/Skeleton.jsx +311 -0
  48. package/dist/Spinner.jsx +195 -0
  49. package/dist/StackPageHeader.jsx +160 -0
  50. package/dist/StatGrid.jsx +74 -0
  51. package/dist/StatusDot.jsx +129 -0
  52. package/dist/SurfaceRow.jsx +143 -0
  53. package/dist/SwipeableRow.jsx +50 -0
  54. package/dist/Switch.jsx +130 -0
  55. package/dist/Tabs.jsx +385 -0
  56. package/dist/Textarea.jsx +103 -0
  57. package/dist/ThemeToggle.jsx +78 -0
  58. package/dist/Toast.jsx +396 -0
  59. package/dist/ai/activity-step-detail.jsx +179 -0
  60. package/dist/ai/activity-step-label.js +816 -0
  61. package/dist/ai/activity-step-types.js +14 -0
  62. package/dist/ai/activity-step.jsx +98 -0
  63. package/dist/ai/activity-tasks-utils.js +172 -0
  64. package/dist/ai/activity-timeline.js +47 -0
  65. package/dist/ai/attachments.jsx +258 -0
  66. package/dist/ai/card-button.jsx +188 -0
  67. package/dist/ai/chain-of-thought.jsx +459 -0
  68. package/dist/ai/chat-jump-rail.jsx +57 -0
  69. package/dist/ai/chat-text.js +44 -0
  70. package/dist/ai/chat-thread.jsx +135 -0
  71. package/dist/ai/choice-question.jsx +925 -0
  72. package/dist/ai/code-block.jsx +574 -0
  73. package/dist/ai/collapsible.jsx +275 -0
  74. package/dist/ai/conversation.jsx +723 -0
  75. package/dist/ai/file-chip.jsx +198 -0
  76. package/dist/ai/icon-button.jsx +179 -0
  77. package/dist/ai/index.js +37 -0
  78. package/dist/ai/message-action-sheet.jsx +408 -0
  79. package/dist/ai/message-quote.jsx +241 -0
  80. package/dist/ai/message.jsx +739 -0
  81. package/dist/ai/prompt-input-menu.jsx +365 -0
  82. package/dist/ai/prompt-input.jsx +626 -0
  83. package/dist/ai/reasoning.jsx +446 -0
  84. package/dist/ai/reply-quote-chip.jsx +278 -0
  85. package/dist/ai/response-text.jsx +130 -0
  86. package/dist/ai/shimmer.jsx +149 -0
  87. package/dist/ai/sources.jsx +260 -0
  88. package/dist/ai/subagent-cards.jsx +645 -0
  89. package/dist/ai/suggestion.jsx +186 -0
  90. package/dist/ai/tool-approval-card.jsx +359 -0
  91. package/dist/ai/trace.jsx +728 -0
  92. package/dist/ai/unified-diff.jsx +280 -0
  93. package/dist/ai/use-streaming-disclosure.js +70 -0
  94. package/dist/auth/AuthProviders.jsx +27 -0
  95. package/dist/auth/AuthScreen.jsx +292 -0
  96. package/dist/auth/GoogleSignInButton.jsx +188 -0
  97. package/dist/auth/SecondFactorScreen.jsx +133 -0
  98. package/dist/auth/SignInScreen.jsx +482 -0
  99. package/dist/auth/authErrors.js +131 -0
  100. package/dist/auth/index.js +11 -0
  101. package/dist/auth/totp.js +378 -0
  102. package/dist/blur.js +36 -0
  103. package/dist/brand/AppIcons.jsx +118 -0
  104. package/dist/brand/AppMark.jsx +128 -0
  105. package/dist/brand/AppWordmark.jsx +138 -0
  106. package/dist/brand/GoogleMark.jsx +71 -0
  107. package/dist/brand/ProviderIcon.jsx +192 -0
  108. package/dist/brand/familyApps.js +33 -0
  109. package/dist/brand/index.js +11 -0
  110. package/dist/brand/svg.js +252 -0
  111. package/dist/brand/vProAppBenefits.js +19 -0
  112. package/dist/cn.js +5 -0
  113. package/dist/colors.js +15 -0
  114. package/dist/configureTheme.js +72 -0
  115. package/dist/controlStyles.js +520 -0
  116. package/dist/definiteSize.js +12 -0
  117. package/dist/dialogLayout.js +18 -0
  118. package/dist/entries/ai.js +4 -0
  119. package/dist/entries/ambient.js +3 -0
  120. package/dist/entries/auth.js +5 -0
  121. package/dist/entries/bottom-sheet.js +2 -0
  122. package/dist/entries/brand.js +2 -0
  123. package/dist/entries/button.js +2 -0
  124. package/dist/entries/date-time.js +3 -0
  125. package/dist/entries/expo-router.js +4 -0
  126. package/dist/entries/expo-web-root.js +3 -0
  127. package/dist/entries/floating.js +7 -0
  128. package/dist/entries/gesture-handler.js +4 -0
  129. package/dist/entries/keyboard-controller.js +4 -0
  130. package/dist/entries/layout.js +16 -0
  131. package/dist/entries/markdown.js +4 -0
  132. package/dist/entries/marketing.js +3 -0
  133. package/dist/entries/page-title.js +7 -0
  134. package/dist/entries/password-input.js +3 -0
  135. package/dist/entries/primitives.js +57 -0
  136. package/dist/entries/search-input.js +3 -0
  137. package/dist/entries/tab-bar.js +4 -0
  138. package/dist/entries/theme.js +7 -0
  139. package/dist/entries/toast.js +5 -0
  140. package/dist/entries/video.js +3 -0
  141. package/dist/entries/webview.js +4 -0
  142. package/dist/examples/AiChatGallery.jsx +509 -0
  143. package/dist/examples/ParityGallery.jsx +1307 -0
  144. package/dist/floating.js +62 -0
  145. package/dist/glassBlur.jsx +145 -0
  146. package/dist/gradient.js +17 -0
  147. package/dist/haptics.js +44 -0
  148. package/dist/highlight.js +382 -0
  149. package/dist/index.js +85 -0
  150. package/dist/initials.js +4 -0
  151. package/dist/loadingGrid.js +81 -0
  152. package/dist/markdown/Markdown.jsx +515 -0
  153. package/dist/markdown/MarkdownTable.jsx +443 -0
  154. package/dist/markdown/tableText.js +68 -0
  155. package/dist/marketing/PricingModal.jsx +608 -0
  156. package/dist/marketing/UpgradeToProCard.jsx +164 -0
  157. package/dist/marketing/pricing.js +34 -0
  158. package/dist/media/ImageGallery.jsx +580 -0
  159. package/dist/media/MediaCard.jsx +162 -0
  160. package/dist/media/imageGrid.js +54 -0
  161. package/dist/motion.js +33 -0
  162. package/dist/pagerSwipe.js +104 -0
  163. package/dist/palette.js +104 -0
  164. package/dist/primitives/button.jsx +127 -0
  165. package/dist/primitives/card.jsx +249 -0
  166. package/dist/primitives/icon.jsx +37 -0
  167. package/dist/primitives/input.jsx +56 -0
  168. package/dist/primitives/keyboard-controller.jsx +207 -0
  169. package/dist/primitives/keyboard-parts.jsx +75 -0
  170. package/dist/primitives/native-only-animated-view.jsx +68 -0
  171. package/dist/primitives/overlay.jsx +391 -0
  172. package/dist/primitives/pager-gesture.jsx +131 -0
  173. package/dist/primitives/select-host.jsx +103 -0
  174. package/dist/primitives/select.jsx +555 -0
  175. package/dist/primitives/sheet-drag.jsx +420 -0
  176. package/dist/primitives/sheet-gesture.jsx +219 -0
  177. package/dist/primitives/swipe-row-gesture.jsx +341 -0
  178. package/dist/primitives/switch.jsx +105 -0
  179. package/dist/primitives/text.jsx +145 -0
  180. package/dist/primitives/toast-drag-gesture.jsx +94 -0
  181. package/dist/primitives/use-controllable-state.js +40 -0
  182. package/dist/primitives/web-click-guard.js +69 -0
  183. package/dist/push.js +166 -0
  184. package/dist/relativeTime.js +70 -0
  185. package/dist/router/RouterStackPageHeader.jsx +53 -0
  186. package/dist/selectA11y.js +32 -0
  187. package/dist/settings/MoreFromProjectV.jsx +168 -0
  188. package/dist/settings/SettingsEmptyState.jsx +102 -0
  189. package/dist/settings/SettingsField.jsx +49 -0
  190. package/dist/settings/SettingsSection.jsx +101 -0
  191. package/dist/settings/SettingsStack.jsx +17 -0
  192. package/dist/settings/SettingsToggleRow.jsx +163 -0
  193. package/dist/settings/projectVMobileApps.js +126 -0
  194. package/dist/settings/relaxedSizeStyle.js +11 -0
  195. package/dist/sheetDrag.js +76 -0
  196. package/dist/svgA11y.js +46 -0
  197. package/dist/swipeRow.js +161 -0
  198. package/dist/tabBarRoutes.js +41 -0
  199. package/dist/tabIndicator.js +139 -0
  200. package/dist/tailwind-preset.cjs +255 -0
  201. package/dist/tailwind-preset.d.cts +55 -0
  202. package/dist/theme.jsx +62 -0
  203. package/dist/toastChrome.js +110 -0
  204. package/dist/toastDrag.js +51 -0
  205. package/dist/toastStore.js +54 -0
  206. package/dist/tokens.js +70 -0
  207. package/dist/typography.js +40 -0
  208. package/dist/useReduceMotion.js +32 -0
  209. package/dist/useReduceTransparency.js +27 -0
  210. package/dist/useScheme.js +15 -0
  211. package/dist/video/InlineVideo.jsx +115 -0
  212. package/dist/webview/HtmlView.jsx +169 -0
  213. package/dist/webview/HtmlView.web.jsx +63 -0
  214. package/dist/webview/htmlView.js +43 -0
  215. package/package.json +70 -33
  216. package/src/DropdownMenu.tsx +28 -16
  217. package/src/FloatingTabBar.tsx +78 -41
  218. package/src/ai/conversation.tsx +12 -8
  219. package/src/glassBlur.tsx +47 -22
  220. package/src/primitives/swipe-row-gesture.tsx +11 -2
@@ -0,0 +1,849 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as Slot from "@rn-primitives/slot";
3
+ import { createContext, useContext, useRef, useState } from "react";
4
+ import { Modal, Pressable, ScrollView, StyleSheet, Text, View, useWindowDimensions } from "react-native";
5
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
6
+ import { IconCheck } from "@tabler/icons-react-native";
7
+ import { FloatingSurface } from "./FloatingSurface";
8
+ import { cn } from "./cn";
9
+ import { sizeStyle, typeStyle } from "./controlStyles";
10
+ import { selectionHaptic } from "./haptics";
11
+ import { palette } from "./palette";
12
+ import { useLargerText } from "./theme";
13
+ import { tokens } from "./tokens";
14
+ import { useReduceMotion } from "./useReduceMotion";
15
+ import { useScheme } from "./useScheme";
16
+ import { useControllableState } from "./primitives/use-controllable-state";
17
+
18
+ /**
19
+ * Sizes from the web menu classes (`_menu-classes.ts`): content `min-w-[12rem]
20
+ * p-1.5 rounded-lg`, `sideOffset` 4 and `collisionPadding` 8; items `px-2.5
21
+ * py-3 rounded-menu-item` (8) with a 16 icon `gap-2`; radio items `pl-8` with
22
+ * the check at `left-2.5`; the label `px-2.5 py-1.5`; the separator `-mx-1.5
23
+ * my-1 h-px`. Items are at least 48 high, a phone menu row (the web
24
+ * `max-sm:min-h-10` is 40).
25
+ */
26
+ export const DROPDOWN_MENU = {
27
+ minWidth: 192,
28
+ padding: 6,
29
+ radius: tokens.radius.lg,
30
+ sideOffset: 4,
31
+ edge: 8,
32
+ itemHeight: 48,
33
+ itemRadius: 8,
34
+ itemPaddingX: 10,
35
+ itemPaddingY: 12,
36
+ itemGap: 8,
37
+ indicatorInset: 32,
38
+ indicatorLeft: 10,
39
+ labelPaddingY: 6,
40
+ separatorMargin: 4
41
+ };
42
+
43
+ /** A view's box in window coordinates, from `measureInWindow`. */
44
+
45
+ const MenuContext = createContext(null);
46
+ function useMenu(part) {
47
+ const context = useContext(MenuContext);
48
+ if (!context) {
49
+ throw new Error(`${part} must be inside a DropdownMenu.`);
50
+ }
51
+ return context;
52
+ }
53
+ /**
54
+ * A small menu anchored to its trigger, the native `DropdownMenu`: holds the
55
+ * open state (controlled with `open` / `onOpenChange`, or `defaultOpen`) and
56
+ * renders no view.
57
+ */
58
+ export function DropdownMenu(t0) {
59
+ const $ = _c(11);
60
+ const {
61
+ open,
62
+ defaultOpen: t1,
63
+ onOpenChange,
64
+ children
65
+ } = t0;
66
+ const defaultOpen = t1 === undefined ? false : t1;
67
+ let t2;
68
+ if ($[0] !== defaultOpen || $[1] !== onOpenChange || $[2] !== open) {
69
+ t2 = {
70
+ value: open,
71
+ defaultValue: defaultOpen,
72
+ onChange: onOpenChange
73
+ };
74
+ $[0] = defaultOpen;
75
+ $[1] = onOpenChange;
76
+ $[2] = open;
77
+ $[3] = t2;
78
+ } else {
79
+ t2 = $[3];
80
+ }
81
+ const [value, setValue] = useControllableState(t2);
82
+ const [trigger, setTrigger] = useState(null);
83
+ let t3;
84
+ if ($[4] !== setValue || $[5] !== trigger || $[6] !== value) {
85
+ t3 = {
86
+ open: value,
87
+ setOpen: setValue,
88
+ trigger,
89
+ setTrigger
90
+ };
91
+ $[4] = setValue;
92
+ $[5] = trigger;
93
+ $[6] = value;
94
+ $[7] = t3;
95
+ } else {
96
+ t3 = $[7];
97
+ }
98
+ let t4;
99
+ if ($[8] !== children || $[9] !== t3) {
100
+ t4 = <MenuContext.Provider value={t3}>{children}</MenuContext.Provider>;
101
+ $[8] = children;
102
+ $[9] = t3;
103
+ $[10] = t4;
104
+ } else {
105
+ t4 = $[10];
106
+ }
107
+ return t4;
108
+ }
109
+ /**
110
+ * Opens the menu, or closes it when open. On press it measures itself
111
+ * (`measureInWindow`) and the menu opens under it. Reports `expanded`.
112
+ */
113
+ export function DropdownMenuTrigger(t0) {
114
+ const $ = _c(18);
115
+ let accessibilityState;
116
+ let asChild;
117
+ let onPress;
118
+ let props;
119
+ if ($[0] !== t0) {
120
+ ({
121
+ asChild,
122
+ onPress,
123
+ accessibilityState,
124
+ ...props
125
+ } = t0);
126
+ $[0] = t0;
127
+ $[1] = accessibilityState;
128
+ $[2] = asChild;
129
+ $[3] = onPress;
130
+ $[4] = props;
131
+ } else {
132
+ accessibilityState = $[1];
133
+ asChild = $[2];
134
+ onPress = $[3];
135
+ props = $[4];
136
+ }
137
+ const {
138
+ open,
139
+ setOpen,
140
+ setTrigger
141
+ } = useMenu("DropdownMenuTrigger");
142
+ const ref = useRef(null);
143
+ const Component = asChild ? Slot.Pressable : Pressable;
144
+ let t1;
145
+ if ($[5] !== accessibilityState || $[6] !== open) {
146
+ t1 = {
147
+ ...accessibilityState,
148
+ expanded: open
149
+ };
150
+ $[5] = accessibilityState;
151
+ $[6] = open;
152
+ $[7] = t1;
153
+ } else {
154
+ t1 = $[7];
155
+ }
156
+ let t2;
157
+ if ($[8] !== onPress || $[9] !== open || $[10] !== setOpen || $[11] !== setTrigger) {
158
+ t2 = event => {
159
+ onPress?.(event);
160
+ if (open) {
161
+ return setOpen(false);
162
+ }
163
+ const view = ref.current;
164
+ if (!view) {
165
+ return setOpen(true);
166
+ }
167
+ view.measureInWindow((x, y, width, height) => {
168
+ setTrigger({
169
+ x,
170
+ y,
171
+ width,
172
+ height
173
+ });
174
+ setOpen(true);
175
+ });
176
+ };
177
+ $[8] = onPress;
178
+ $[9] = open;
179
+ $[10] = setOpen;
180
+ $[11] = setTrigger;
181
+ $[12] = t2;
182
+ } else {
183
+ t2 = $[12];
184
+ }
185
+ let t3;
186
+ if ($[13] !== Component || $[14] !== props || $[15] !== t1 || $[16] !== t2) {
187
+ t3 = <Component ref={ref} accessibilityRole="button" {...props} accessibilityState={t1} onPress={t2} />;
188
+ $[13] = Component;
189
+ $[14] = props;
190
+ $[15] = t1;
191
+ $[16] = t2;
192
+ $[17] = t3;
193
+ } else {
194
+ t3 = $[17];
195
+ }
196
+ return t3;
197
+ }
198
+ /**
199
+ * Where the menu goes: under the trigger, `sideOffset` away, its start edge on
200
+ * the trigger's start (`"start"`) or its end edge on the trigger's end
201
+ * (`"end"`), kept 8 inside the safe area. It flips above the trigger when its
202
+ * content does not fit below and there is more room above. Without a trigger
203
+ * box it sits at the top of the safe area.
204
+ */
205
+ export function dropdownMenuPosition({
206
+ trigger,
207
+ window,
208
+ insets,
209
+ align,
210
+ sideOffset = DROPDOWN_MENU.sideOffset,
211
+ contentHeight
212
+ }) {
213
+ const edge = DROPDOWN_MENU.edge;
214
+ const minTop = insets.top + edge;
215
+ const maxBottom = window.height - insets.bottom - edge;
216
+ const minLeft = insets.left + edge;
217
+ const minRight = insets.right + edge;
218
+ if (!trigger) return {
219
+ top: minTop,
220
+ left: minLeft,
221
+ maxHeight: maxBottom - minTop
222
+ };
223
+ const horizontal = align === "end" ? {
224
+ right: Math.max(minRight, window.width - (trigger.x + trigger.width))
225
+ } : {
226
+ left: Math.max(minLeft, trigger.x)
227
+ };
228
+ const below = trigger.y + trigger.height + sideOffset;
229
+ const above = trigger.y - sideOffset;
230
+ const roomBelow = maxBottom - below;
231
+ const roomAbove = above - minTop;
232
+ if (contentHeight > roomBelow && roomAbove > roomBelow) {
233
+ return {
234
+ ...horizontal,
235
+ bottom: window.height - above,
236
+ maxHeight: roomAbove
237
+ };
238
+ }
239
+ return {
240
+ ...horizontal,
241
+ top: below,
242
+ maxHeight: roomBelow
243
+ };
244
+ }
245
+ /**
246
+ * The menu in a transparent RN `Modal`: the opaque overlay surface of
247
+ * `Dialog` and `Sheet` (`FloatingSurface` without blur, with the floating
248
+ * shadow) at radius 16, at least 192 wide, `p-1.5`, scrolling when taller than
249
+ * the room. A tap outside, Android back and the VoiceOver escape gesture close
250
+ * it. With Reduce Motion on, the fade is off.
251
+ */
252
+ export function DropdownMenuContent(t0) {
253
+ const $ = _c(49);
254
+ let children;
255
+ let className;
256
+ let props;
257
+ let sideOffset;
258
+ let style;
259
+ let t1;
260
+ if ($[0] !== t0) {
261
+ ({
262
+ align: t1,
263
+ sideOffset,
264
+ className,
265
+ style,
266
+ children,
267
+ ...props
268
+ } = t0);
269
+ $[0] = t0;
270
+ $[1] = children;
271
+ $[2] = className;
272
+ $[3] = props;
273
+ $[4] = sideOffset;
274
+ $[5] = style;
275
+ $[6] = t1;
276
+ } else {
277
+ children = $[1];
278
+ className = $[2];
279
+ props = $[3];
280
+ sideOffset = $[4];
281
+ style = $[5];
282
+ t1 = $[6];
283
+ }
284
+ const align = t1 === undefined ? "start" : t1;
285
+ const {
286
+ open,
287
+ setOpen,
288
+ trigger
289
+ } = useMenu("DropdownMenuContent");
290
+ const window = useWindowDimensions();
291
+ const insets = useSafeAreaInsets();
292
+ const reduceMotion = useReduceMotion();
293
+ const [contentHeight, setContentHeight] = useState(null);
294
+ let t2;
295
+ if ($[7] !== setOpen) {
296
+ t2 = () => setOpen(false);
297
+ $[7] = setOpen;
298
+ $[8] = t2;
299
+ } else {
300
+ t2 = $[8];
301
+ }
302
+ const close = t2;
303
+ const t3 = contentHeight ?? 0;
304
+ let t4;
305
+ if ($[9] !== align || $[10] !== insets || $[11] !== sideOffset || $[12] !== t3 || $[13] !== trigger || $[14] !== window) {
306
+ t4 = dropdownMenuPosition({
307
+ trigger,
308
+ window,
309
+ insets,
310
+ align,
311
+ sideOffset,
312
+ contentHeight: t3
313
+ });
314
+ $[9] = align;
315
+ $[10] = insets;
316
+ $[11] = sideOffset;
317
+ $[12] = t3;
318
+ $[13] = trigger;
319
+ $[14] = window;
320
+ $[15] = t4;
321
+ } else {
322
+ t4 = $[15];
323
+ }
324
+ const position = t4;
325
+ const t5 = reduceMotion ? "none" : "fade";
326
+ let t6;
327
+ if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
328
+ t6 = {
329
+ flex: 1
330
+ };
331
+ $[16] = t6;
332
+ } else {
333
+ t6 = $[16];
334
+ }
335
+ let t7;
336
+ if ($[17] !== close) {
337
+ t7 = <Pressable testID="DropdownMenu-backdrop" accessibilityRole="button" accessibilityLabel="Close menu" onPress={close} style={StyleSheet.absoluteFill} />;
338
+ $[17] = close;
339
+ $[18] = t7;
340
+ } else {
341
+ t7 = $[18];
342
+ }
343
+ const t8 = window.width - insets.left - insets.right - 2 * DROPDOWN_MENU.edge;
344
+ const t9 = contentHeight === null ? 0 : 1;
345
+ let t10;
346
+ if ($[19] !== position || $[20] !== t8 || $[21] !== t9) {
347
+ t10 = {
348
+ position: "absolute",
349
+ ...position,
350
+ minWidth: DROPDOWN_MENU.minWidth,
351
+ maxWidth: t8,
352
+ opacity: t9
353
+ };
354
+ $[19] = position;
355
+ $[20] = t8;
356
+ $[21] = t9;
357
+ $[22] = t10;
358
+ } else {
359
+ t10 = $[22];
360
+ }
361
+ let t11;
362
+ if ($[23] !== position.maxHeight) {
363
+ t11 = {
364
+ maxHeight: position.maxHeight
365
+ };
366
+ $[23] = position.maxHeight;
367
+ $[24] = t11;
368
+ } else {
369
+ t11 = $[24];
370
+ }
371
+ let t12;
372
+ let t13;
373
+ if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
374
+ t12 = (_width, height) => setContentHeight(height);
375
+ t13 = {
376
+ padding: DROPDOWN_MENU.padding
377
+ };
378
+ $[25] = t12;
379
+ $[26] = t13;
380
+ } else {
381
+ t12 = $[25];
382
+ t13 = $[26];
383
+ }
384
+ let t14;
385
+ if ($[27] !== className) {
386
+ t14 = cn(className);
387
+ $[27] = className;
388
+ $[28] = t14;
389
+ } else {
390
+ t14 = $[28];
391
+ }
392
+ let t15;
393
+ if ($[29] !== children || $[30] !== props || $[31] !== style || $[32] !== t14) {
394
+ t15 = <ScrollView bounces={false} showsVerticalScrollIndicator={false} onContentSizeChange={t12} contentContainerStyle={t13}><View className={t14} style={style} {...props}>{children}</View></ScrollView>;
395
+ $[29] = children;
396
+ $[30] = props;
397
+ $[31] = style;
398
+ $[32] = t14;
399
+ $[33] = t15;
400
+ } else {
401
+ t15 = $[33];
402
+ }
403
+ let t16;
404
+ if ($[34] !== t11 || $[35] !== t15) {
405
+ t16 = <FloatingSurface blur={false} radius={DROPDOWN_MENU.radius} style={t11}>{t15}</FloatingSurface>;
406
+ $[34] = t11;
407
+ $[35] = t15;
408
+ $[36] = t16;
409
+ } else {
410
+ t16 = $[36];
411
+ }
412
+ let t17;
413
+ if ($[37] !== close || $[38] !== t10 || $[39] !== t16) {
414
+ t17 = <View accessibilityRole="menu" accessibilityViewIsModal={true} onAccessibilityEscape={close} style={t10}>{t16}</View>;
415
+ $[37] = close;
416
+ $[38] = t10;
417
+ $[39] = t16;
418
+ $[40] = t17;
419
+ } else {
420
+ t17 = $[40];
421
+ }
422
+ let t18;
423
+ if ($[41] !== t17 || $[42] !== t7) {
424
+ t18 = <View style={t6} pointerEvents="box-none">{t7}{t17}</View>;
425
+ $[41] = t17;
426
+ $[42] = t7;
427
+ $[43] = t18;
428
+ } else {
429
+ t18 = $[43];
430
+ }
431
+ let t19;
432
+ if ($[44] !== close || $[45] !== open || $[46] !== t18 || $[47] !== t5) {
433
+ t19 = <Modal visible={open} transparent={true} animationType={t5} statusBarTranslucent={true} onRequestClose={close}>{t18}</Modal>;
434
+ $[44] = close;
435
+ $[45] = open;
436
+ $[46] = t18;
437
+ $[47] = t5;
438
+ $[48] = t19;
439
+ } else {
440
+ t19 = $[48];
441
+ }
442
+ return t19;
443
+ }
444
+
445
+ /** Item type and icon size: the web `text-sm` with a 16 icon in 48 rows, or `text-lg` with a 22 icon and 56 rows with larger text. */
446
+ function itemMetrics(largerText) {
447
+ return largerText ? {
448
+ text: sizeStyle("text-lg"),
449
+ icon: 22,
450
+ minHeight: 56
451
+ } : {
452
+ text: sizeStyle("text-sm"),
453
+ icon: 16,
454
+ minHeight: DROPDOWN_MENU.itemHeight
455
+ };
456
+ }
457
+ function MenuRow(t0) {
458
+ const $ = _c(47);
459
+ let accessibilityState;
460
+ let checked;
461
+ let children;
462
+ let className;
463
+ let color;
464
+ let disabled;
465
+ let itemRole;
466
+ let leading;
467
+ let onSelect;
468
+ let paddingLeft;
469
+ let part;
470
+ let props;
471
+ let t1;
472
+ if ($[0] !== t0) {
473
+ ({
474
+ part,
475
+ itemRole,
476
+ checked,
477
+ color,
478
+ paddingLeft,
479
+ leading,
480
+ children,
481
+ onSelect,
482
+ closeOnSelect: t1,
483
+ disabled,
484
+ className,
485
+ accessibilityState,
486
+ ...props
487
+ } = t0);
488
+ $[0] = t0;
489
+ $[1] = accessibilityState;
490
+ $[2] = checked;
491
+ $[3] = children;
492
+ $[4] = className;
493
+ $[5] = color;
494
+ $[6] = disabled;
495
+ $[7] = itemRole;
496
+ $[8] = leading;
497
+ $[9] = onSelect;
498
+ $[10] = paddingLeft;
499
+ $[11] = part;
500
+ $[12] = props;
501
+ $[13] = t1;
502
+ } else {
503
+ accessibilityState = $[1];
504
+ checked = $[2];
505
+ children = $[3];
506
+ className = $[4];
507
+ color = $[5];
508
+ disabled = $[6];
509
+ itemRole = $[7];
510
+ leading = $[8];
511
+ onSelect = $[9];
512
+ paddingLeft = $[10];
513
+ part = $[11];
514
+ props = $[12];
515
+ t1 = $[13];
516
+ }
517
+ const closeOnSelect = t1 === undefined ? true : t1;
518
+ const {
519
+ setOpen
520
+ } = useMenu(part);
521
+ const scheme = useScheme();
522
+ const t2 = useLargerText();
523
+ let t3;
524
+ if ($[14] !== t2) {
525
+ t3 = itemMetrics(t2);
526
+ $[14] = t2;
527
+ $[15] = t3;
528
+ } else {
529
+ t3 = $[15];
530
+ }
531
+ const metrics = t3;
532
+ const t4 = Boolean(disabled);
533
+ let t5;
534
+ if ($[16] !== checked) {
535
+ t5 = checked === undefined ? null : {
536
+ checked
537
+ };
538
+ $[16] = checked;
539
+ $[17] = t5;
540
+ } else {
541
+ t5 = $[17];
542
+ }
543
+ let t6;
544
+ if ($[18] !== accessibilityState || $[19] !== t4 || $[20] !== t5) {
545
+ t6 = {
546
+ ...accessibilityState,
547
+ disabled: t4,
548
+ ...t5
549
+ };
550
+ $[18] = accessibilityState;
551
+ $[19] = t4;
552
+ $[20] = t5;
553
+ $[21] = t6;
554
+ } else {
555
+ t6 = $[21];
556
+ }
557
+ let t7;
558
+ if ($[22] !== checked || $[23] !== closeOnSelect || $[24] !== onSelect || $[25] !== setOpen) {
559
+ t7 = () => {
560
+ if (checked === false) {
561
+ selectionHaptic();
562
+ }
563
+ onSelect?.();
564
+ if (closeOnSelect) {
565
+ setOpen(false);
566
+ }
567
+ };
568
+ $[22] = checked;
569
+ $[23] = closeOnSelect;
570
+ $[24] = onSelect;
571
+ $[25] = setOpen;
572
+ $[26] = t7;
573
+ } else {
574
+ t7 = $[26];
575
+ }
576
+ const t8 = disabled ? 0.5 : 1;
577
+ let t9;
578
+ if ($[27] !== metrics.minHeight || $[28] !== paddingLeft || $[29] !== t8) {
579
+ t9 = {
580
+ flexDirection: "row",
581
+ alignItems: "center",
582
+ minHeight: metrics.minHeight,
583
+ gap: DROPDOWN_MENU.itemGap,
584
+ paddingLeft,
585
+ paddingRight: DROPDOWN_MENU.itemPaddingX,
586
+ paddingVertical: DROPDOWN_MENU.itemPaddingY,
587
+ borderRadius: DROPDOWN_MENU.itemRadius,
588
+ opacity: t8
589
+ };
590
+ $[27] = metrics.minHeight;
591
+ $[28] = paddingLeft;
592
+ $[29] = t8;
593
+ $[30] = t9;
594
+ } else {
595
+ t9 = $[30];
596
+ }
597
+ let t10;
598
+ if ($[31] !== children || $[32] !== className || $[33] !== color || $[34] !== disabled || $[35] !== leading || $[36] !== metrics.text || $[37] !== scheme) {
599
+ t10 = t11 => {
600
+ const {
601
+ pressed
602
+ } = t11;
603
+ return <>{pressed && !disabled ? <View pointerEvents="none" style={[StyleSheet.absoluteFill, {
604
+ borderRadius: DROPDOWN_MENU.itemRadius,
605
+ backgroundColor: palette.default[scheme]
606
+ }]} /> : null}{leading}<View className={cn("min-w-0 flex-1 flex-row items-center", className)}>{typeof children === "string" ? <Text className="flex-1 font-instrument-sans" style={[metrics.text, {
607
+ color
608
+ }]}>{children}</Text> : children}</View></>;
609
+ };
610
+ $[31] = children;
611
+ $[32] = className;
612
+ $[33] = color;
613
+ $[34] = disabled;
614
+ $[35] = leading;
615
+ $[36] = metrics.text;
616
+ $[37] = scheme;
617
+ $[38] = t10;
618
+ } else {
619
+ t10 = $[38];
620
+ }
621
+ let t11;
622
+ if ($[39] !== disabled || $[40] !== itemRole || $[41] !== props || $[42] !== t10 || $[43] !== t6 || $[44] !== t7 || $[45] !== t9) {
623
+ t11 = <Pressable accessibilityRole={itemRole} {...props} disabled={disabled} accessibilityState={t6} onPress={t7} style={t9}>{t10}</Pressable>;
624
+ $[39] = disabled;
625
+ $[40] = itemRole;
626
+ $[41] = props;
627
+ $[42] = t10;
628
+ $[43] = t6;
629
+ $[44] = t7;
630
+ $[45] = t9;
631
+ $[46] = t11;
632
+ } else {
633
+ t11 = $[46];
634
+ }
635
+ return t11;
636
+ }
637
+ /** One action row (`menuitem`): an optional icon and the label. */
638
+ export function DropdownMenuItem(t0) {
639
+ const $ = _c(15);
640
+ let Icon;
641
+ let destructive;
642
+ let props;
643
+ let warning;
644
+ if ($[0] !== t0) {
645
+ ({
646
+ icon: Icon,
647
+ destructive,
648
+ warning,
649
+ ...props
650
+ } = t0);
651
+ $[0] = t0;
652
+ $[1] = Icon;
653
+ $[2] = destructive;
654
+ $[3] = props;
655
+ $[4] = warning;
656
+ } else {
657
+ Icon = $[1];
658
+ destructive = $[2];
659
+ props = $[3];
660
+ warning = $[4];
661
+ }
662
+ const scheme = useScheme();
663
+ const t1 = useLargerText();
664
+ let t2;
665
+ if ($[5] !== t1) {
666
+ t2 = itemMetrics(t1);
667
+ $[5] = t1;
668
+ $[6] = t2;
669
+ } else {
670
+ t2 = $[6];
671
+ }
672
+ const metrics = t2;
673
+ const color = destructive ? palette.danger[scheme] : warning ? palette.warning[scheme] : palette.overlayForeground[scheme];
674
+ let t3;
675
+ if ($[7] !== Icon || $[8] !== color || $[9] !== metrics) {
676
+ t3 = Icon ? <Icon size={metrics.icon} color={color} /> : null;
677
+ $[7] = Icon;
678
+ $[8] = color;
679
+ $[9] = metrics;
680
+ $[10] = t3;
681
+ } else {
682
+ t3 = $[10];
683
+ }
684
+ let t4;
685
+ if ($[11] !== color || $[12] !== props || $[13] !== t3) {
686
+ t4 = <MenuRow part="DropdownMenuItem" itemRole="menuitem" color={color} paddingLeft={DROPDOWN_MENU.itemPaddingX} leading={t3} {...props} />;
687
+ $[11] = color;
688
+ $[12] = props;
689
+ $[13] = t3;
690
+ $[14] = t4;
691
+ } else {
692
+ t4 = $[14];
693
+ }
694
+ return t4;
695
+ }
696
+ /**
697
+ * One choice of a set (`radio`, reporting `checked`): the label inset `pl-8`
698
+ * with a 16 check at `left-2.5` when `checked`.
699
+ */
700
+ export function DropdownMenuRadioItem(t0) {
701
+ const $ = _c(15);
702
+ let checked;
703
+ let props;
704
+ if ($[0] !== t0) {
705
+ ({
706
+ checked,
707
+ ...props
708
+ } = t0);
709
+ $[0] = t0;
710
+ $[1] = checked;
711
+ $[2] = props;
712
+ } else {
713
+ checked = $[1];
714
+ props = $[2];
715
+ }
716
+ const scheme = useScheme();
717
+ const t1 = useLargerText();
718
+ let t2;
719
+ if ($[3] !== t1) {
720
+ t2 = itemMetrics(t1);
721
+ $[3] = t1;
722
+ $[4] = t2;
723
+ } else {
724
+ t2 = $[4];
725
+ }
726
+ const metrics = t2;
727
+ const color = palette.overlayForeground[scheme];
728
+ const t3 = DROPDOWN_MENU.indicatorInset + (metrics.icon - 16);
729
+ let t4;
730
+ if ($[5] !== checked || $[6] !== color || $[7] !== metrics.icon) {
731
+ t4 = checked ? <View accessible={false} style={{
732
+ position: "absolute",
733
+ left: DROPDOWN_MENU.indicatorLeft,
734
+ top: 0,
735
+ bottom: 0,
736
+ justifyContent: "center"
737
+ }}><IconCheck size={metrics.icon} color={color} /></View> : null;
738
+ $[5] = checked;
739
+ $[6] = color;
740
+ $[7] = metrics.icon;
741
+ $[8] = t4;
742
+ } else {
743
+ t4 = $[8];
744
+ }
745
+ let t5;
746
+ if ($[9] !== checked || $[10] !== color || $[11] !== props || $[12] !== t3 || $[13] !== t4) {
747
+ t5 = <MenuRow part="DropdownMenuRadioItem" itemRole="radio" checked={checked} color={color} paddingLeft={t3} leading={t4} {...props} />;
748
+ $[9] = checked;
749
+ $[10] = color;
750
+ $[11] = props;
751
+ $[12] = t3;
752
+ $[13] = t4;
753
+ $[14] = t5;
754
+ } else {
755
+ t5 = $[14];
756
+ }
757
+ return t5;
758
+ }
759
+ /** A group heading: the web `text-xs font-semibold uppercase tracking-widest text-muted-foreground`, `px-2.5 py-1.5`. */
760
+ export function DropdownMenuLabel(t0) {
761
+ const $ = _c(15);
762
+ const {
763
+ children,
764
+ className
765
+ } = t0;
766
+ const scheme = useScheme();
767
+ const t1 = useLargerText() ? "text-base" : "text-xs";
768
+ let t2;
769
+ if ($[0] !== t1) {
770
+ t2 = sizeStyle(t1);
771
+ $[0] = t1;
772
+ $[1] = t2;
773
+ } else {
774
+ t2 = $[1];
775
+ }
776
+ const text = t2;
777
+ let t3;
778
+ if ($[2] !== className) {
779
+ t3 = cn("font-instrument-sans-semibold uppercase", className);
780
+ $[2] = className;
781
+ $[3] = t3;
782
+ } else {
783
+ t3 = $[3];
784
+ }
785
+ let t4;
786
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
787
+ t4 = typeStyle("semibold");
788
+ $[4] = t4;
789
+ } else {
790
+ t4 = $[4];
791
+ }
792
+ const t5 = text.fontSize / 10;
793
+ const t6 = tokens.color.muted[scheme];
794
+ let t7;
795
+ if ($[5] !== t5 || $[6] !== t6) {
796
+ t7 = {
797
+ letterSpacing: t5,
798
+ color: t6,
799
+ paddingHorizontal: DROPDOWN_MENU.itemPaddingX,
800
+ paddingVertical: DROPDOWN_MENU.labelPaddingY
801
+ };
802
+ $[5] = t5;
803
+ $[6] = t6;
804
+ $[7] = t7;
805
+ } else {
806
+ t7 = $[7];
807
+ }
808
+ let t8;
809
+ if ($[8] !== t7 || $[9] !== text) {
810
+ t8 = [text, t4, t7];
811
+ $[8] = t7;
812
+ $[9] = text;
813
+ $[10] = t8;
814
+ } else {
815
+ t8 = $[10];
816
+ }
817
+ let t9;
818
+ if ($[11] !== children || $[12] !== t3 || $[13] !== t8) {
819
+ t9 = <Text accessibilityRole="header" className={t3} style={t8}>{children}</Text>;
820
+ $[11] = children;
821
+ $[12] = t3;
822
+ $[13] = t8;
823
+ $[14] = t9;
824
+ } else {
825
+ t9 = $[14];
826
+ }
827
+ return t9;
828
+ }
829
+
830
+ /** A 1-high `separator` line across the menu, `-mx-1.5 my-1`. */
831
+ export function DropdownMenuSeparator() {
832
+ const $ = _c(2);
833
+ const scheme = useScheme();
834
+ const t0 = tokens.color.separator[scheme];
835
+ let t1;
836
+ if ($[0] !== t0) {
837
+ t1 = <View accessible={false} importantForAccessibility="no" style={{
838
+ height: 1,
839
+ marginHorizontal: -DROPDOWN_MENU.padding,
840
+ marginVertical: DROPDOWN_MENU.separatorMargin,
841
+ backgroundColor: t0
842
+ }} />;
843
+ $[0] = t0;
844
+ $[1] = t1;
845
+ } else {
846
+ t1 = $[1];
847
+ }
848
+ return t1;
849
+ }