@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,281 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { Pressable, Text, View } from "react-native";
3
+ import { NEUTRAL_500 } from "./colors";
4
+ import { cn } from "./cn";
5
+ import { textStyle, typeStyle } from "./controlStyles";
6
+ import { FLOATING_ROW_RADIUS } from "./floating";
7
+ import { useLargerText } from "./theme";
8
+ import { tokens } from "./tokens";
9
+ import { useScheme } from "./useScheme";
10
+ /**
11
+ * A list row: an icon or `leading` node, a title with optional `titleEnd`,
12
+ * `meta` and `detail` lines, and `right` content. With `onPress` or
13
+ * `onLongPress` the row is a button named by `title`. A `control` sits beside
14
+ * the pressable area, not in it.
15
+ */
16
+ export function ListRow(t0) {
17
+ const $ = _c(86);
18
+ const {
19
+ title,
20
+ meta,
21
+ detail,
22
+ icon: Icon,
23
+ iconColor: t1,
24
+ leading,
25
+ titleEnd,
26
+ right,
27
+ control,
28
+ onPress,
29
+ onLongPress,
30
+ accessibilityLabel,
31
+ onCanvas: t2,
32
+ testID
33
+ } = t0;
34
+ const iconColor = t1 === undefined ? NEUTRAL_500 : t1;
35
+ const onCanvas = t2 === undefined ? false : t2;
36
+ const largerText = useLargerText();
37
+ const scheme = useScheme();
38
+ const t3 = largerText ? "text-xl" : "text-lg";
39
+ const t4 = titleEnd != null && "min-w-0 flex-1";
40
+ let t5;
41
+ if ($[0] !== t3 || $[1] !== t4) {
42
+ t5 = cn("font-instrument-sans-semibold", t3, t4);
43
+ $[0] = t3;
44
+ $[1] = t4;
45
+ $[2] = t5;
46
+ } else {
47
+ t5 = $[2];
48
+ }
49
+ let t6;
50
+ if ($[3] !== scheme) {
51
+ t6 = textStyle("foreground", scheme);
52
+ $[3] = scheme;
53
+ $[4] = t6;
54
+ } else {
55
+ t6 = $[4];
56
+ }
57
+ let t7;
58
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
59
+ t7 = typeStyle("semibold");
60
+ $[5] = t7;
61
+ } else {
62
+ t7 = $[5];
63
+ }
64
+ let t8;
65
+ if ($[6] !== t6) {
66
+ t8 = [t6, t7];
67
+ $[6] = t6;
68
+ $[7] = t8;
69
+ } else {
70
+ t8 = $[7];
71
+ }
72
+ let t9;
73
+ if ($[8] !== t5 || $[9] !== t8 || $[10] !== title) {
74
+ t9 = <Text numberOfLines={2} className={t5} style={t8}>{title}</Text>;
75
+ $[8] = t5;
76
+ $[9] = t8;
77
+ $[10] = title;
78
+ $[11] = t9;
79
+ } else {
80
+ t9 = $[11];
81
+ }
82
+ const titleText = t9;
83
+ let t10;
84
+ if ($[12] !== Icon || $[13] !== iconColor || $[14] !== largerText || $[15] !== leading) {
85
+ t10 = leading != null ? <View className="shrink-0">{leading}</View> : Icon ? <Icon size={largerText ? 30 : 26} color={iconColor} /> : null;
86
+ $[12] = Icon;
87
+ $[13] = iconColor;
88
+ $[14] = largerText;
89
+ $[15] = leading;
90
+ $[16] = t10;
91
+ } else {
92
+ t10 = $[16];
93
+ }
94
+ let t11;
95
+ if ($[17] !== titleEnd || $[18] !== titleText) {
96
+ t11 = titleEnd != null ? <View className="flex-row items-center gap-2">{titleText}<View className="shrink-0">{titleEnd}</View></View> : titleText;
97
+ $[17] = titleEnd;
98
+ $[18] = titleText;
99
+ $[19] = t11;
100
+ } else {
101
+ t11 = $[19];
102
+ }
103
+ let t12;
104
+ if ($[20] !== largerText || $[21] !== meta || $[22] !== scheme) {
105
+ t12 = meta ? <Text className={cn("font-instrument-sans", largerText ? "text-lg" : "text-base")} style={textStyle("muted", scheme)}>{meta}</Text> : null;
106
+ $[20] = largerText;
107
+ $[21] = meta;
108
+ $[22] = scheme;
109
+ $[23] = t12;
110
+ } else {
111
+ t12 = $[23];
112
+ }
113
+ let t13;
114
+ if ($[24] !== detail || $[25] !== t11 || $[26] !== t12) {
115
+ t13 = <View className="min-w-0 flex-1">{t11}{t12}{detail}</View>;
116
+ $[24] = detail;
117
+ $[25] = t11;
118
+ $[26] = t12;
119
+ $[27] = t13;
120
+ } else {
121
+ t13 = $[27];
122
+ }
123
+ let t14;
124
+ if ($[28] !== right || $[29] !== t10 || $[30] !== t13) {
125
+ t14 = <>{t10}{t13}{right}</>;
126
+ $[28] = right;
127
+ $[29] = t10;
128
+ $[30] = t13;
129
+ $[31] = t14;
130
+ } else {
131
+ t14 = $[31];
132
+ }
133
+ const content = t14;
134
+ const pressable = Boolean(onPress || onLongPress);
135
+ const height = largerText ? "min-h-[72px]" : "min-h-16";
136
+ const paddingY = largerText ? "py-4" : "py-3";
137
+ const t15 = tokens.color[onCanvas ? "surface" : "surfaceSecondary"][scheme];
138
+ let t16;
139
+ if ($[32] !== t15) {
140
+ t16 = {
141
+ backgroundColor: t15,
142
+ borderRadius: FLOATING_ROW_RADIUS
143
+ };
144
+ $[32] = t15;
145
+ $[33] = t16;
146
+ } else {
147
+ t16 = $[33];
148
+ }
149
+ const rowStyle = t16;
150
+ if (control != null) {
151
+ let T0;
152
+ let t17;
153
+ let t18;
154
+ let t19;
155
+ if ($[34] !== accessibilityLabel || $[35] !== content || $[36] !== height || $[37] !== onLongPress || $[38] !== onPress || $[39] !== paddingY || $[40] !== pressable || $[41] !== rowStyle || $[42] !== testID || $[43] !== title) {
156
+ const bodyClassName = cn("min-w-0 flex-1 flex-row items-center gap-3 self-stretch pl-4 pr-3", paddingY);
157
+ T0 = View;
158
+ if ($[48] !== height) {
159
+ t17 = cn("flex-row items-center", height);
160
+ $[48] = height;
161
+ $[49] = t17;
162
+ } else {
163
+ t17 = $[49];
164
+ }
165
+ t18 = rowStyle;
166
+ t19 = pressable ? <Pressable testID={testID} accessibilityRole="button" accessibilityLabel={accessibilityLabel ?? title} onPress={onPress} onLongPress={onLongPress} className={cn(bodyClassName, "active:opacity-70")}>{content}</Pressable> : <View testID={testID} className={bodyClassName}>{content}</View>;
167
+ $[34] = accessibilityLabel;
168
+ $[35] = content;
169
+ $[36] = height;
170
+ $[37] = onLongPress;
171
+ $[38] = onPress;
172
+ $[39] = paddingY;
173
+ $[40] = pressable;
174
+ $[41] = rowStyle;
175
+ $[42] = testID;
176
+ $[43] = title;
177
+ $[44] = T0;
178
+ $[45] = t17;
179
+ $[46] = t18;
180
+ $[47] = t19;
181
+ } else {
182
+ T0 = $[44];
183
+ t17 = $[45];
184
+ t18 = $[46];
185
+ t19 = $[47];
186
+ }
187
+ let t20;
188
+ if ($[50] !== control) {
189
+ t20 = <View className="shrink-0 pr-4">{control}</View>;
190
+ $[50] = control;
191
+ $[51] = t20;
192
+ } else {
193
+ t20 = $[51];
194
+ }
195
+ let t21;
196
+ if ($[52] !== T0 || $[53] !== t17 || $[54] !== t18 || $[55] !== t19 || $[56] !== t20) {
197
+ t21 = <T0 className={t17} style={t18}>{t19}{t20}</T0>;
198
+ $[52] = T0;
199
+ $[53] = t17;
200
+ $[54] = t18;
201
+ $[55] = t19;
202
+ $[56] = t20;
203
+ $[57] = t21;
204
+ } else {
205
+ t21 = $[57];
206
+ }
207
+ return t21;
208
+ }
209
+ let T0;
210
+ let t17;
211
+ let t18;
212
+ let t19;
213
+ let t20;
214
+ let t21;
215
+ let t22;
216
+ let t23;
217
+ if ($[58] !== accessibilityLabel || $[59] !== content || $[60] !== height || $[61] !== onLongPress || $[62] !== onPress || $[63] !== paddingY || $[64] !== pressable || $[65] !== rowStyle || $[66] !== testID || $[67] !== title) {
218
+ t23 = Symbol.for("react.early_return_sentinel");
219
+ bb0: {
220
+ const className = cn("flex-row items-center gap-3 px-4", height, paddingY);
221
+ if (!pressable) {
222
+ t23 = <View testID={testID} className={className} style={rowStyle}>{content}</View>;
223
+ break bb0;
224
+ }
225
+ T0 = Pressable;
226
+ t17 = testID;
227
+ t18 = "button";
228
+ t19 = accessibilityLabel ?? title;
229
+ t20 = onPress;
230
+ t21 = onLongPress;
231
+ t22 = cn(className, "active:opacity-70");
232
+ }
233
+ $[58] = accessibilityLabel;
234
+ $[59] = content;
235
+ $[60] = height;
236
+ $[61] = onLongPress;
237
+ $[62] = onPress;
238
+ $[63] = paddingY;
239
+ $[64] = pressable;
240
+ $[65] = rowStyle;
241
+ $[66] = testID;
242
+ $[67] = title;
243
+ $[68] = T0;
244
+ $[69] = t17;
245
+ $[70] = t18;
246
+ $[71] = t19;
247
+ $[72] = t20;
248
+ $[73] = t21;
249
+ $[74] = t22;
250
+ $[75] = t23;
251
+ } else {
252
+ T0 = $[68];
253
+ t17 = $[69];
254
+ t18 = $[70];
255
+ t19 = $[71];
256
+ t20 = $[72];
257
+ t21 = $[73];
258
+ t22 = $[74];
259
+ t23 = $[75];
260
+ }
261
+ if (t23 !== Symbol.for("react.early_return_sentinel")) {
262
+ return t23;
263
+ }
264
+ let t24;
265
+ if ($[76] !== T0 || $[77] !== content || $[78] !== rowStyle || $[79] !== t17 || $[80] !== t18 || $[81] !== t19 || $[82] !== t20 || $[83] !== t21 || $[84] !== t22) {
266
+ t24 = <T0 testID={t17} accessibilityRole={t18} accessibilityLabel={t19} onPress={t20} onLongPress={t21} className={t22} style={rowStyle}>{content}</T0>;
267
+ $[76] = T0;
268
+ $[77] = content;
269
+ $[78] = rowStyle;
270
+ $[79] = t17;
271
+ $[80] = t18;
272
+ $[81] = t19;
273
+ $[82] = t20;
274
+ $[83] = t21;
275
+ $[84] = t22;
276
+ $[85] = t24;
277
+ } else {
278
+ t24 = $[85];
279
+ }
280
+ return t24;
281
+ }
@@ -0,0 +1,205 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { View } from "react-native";
3
+ import Animated, { useAnimatedStyle, useFrameCallback, useSharedValue } from "react-native-reanimated";
4
+ import { DRIVE_DELAYS, DRIVE_SIZES, DRIVE_STILL_FRAME_MS, driveCellOpacity } from "./loadingGrid";
5
+ import { tokens } from "./tokens";
6
+ import { useReduceMotion } from "./useReduceMotion";
7
+ import { useScheme } from "./useScheme";
8
+ /**
9
+ * The web `LoadingState` with `variant="Drive"` and `iconOnly`: a 3x3 pixel
10
+ * grid whose chevron wavefront drives right. Same cells, delays, 650 ms
11
+ * cycle and keyframes as the web (see `loadingGrid.ts`). One frame clock per
12
+ * grid on the UI thread, started on mount as the web WAAPI pulse is. With
13
+ * Reduce Motion, or `paused`, it holds a still chevron frame and runs no
14
+ * clock. The labelled form (label and elapsed timer) and the `Dots` and
15
+ * `Orbit` variants are not ported.
16
+ */
17
+ export function LoadingState(t0) {
18
+ const $ = _c(12);
19
+ const {
20
+ label: t1,
21
+ size: t2,
22
+ color,
23
+ colors,
24
+ paused: t3
25
+ } = t0;
26
+ const label = t1 === undefined ? "Working" : t1;
27
+ const size = t2 === undefined ? "default" : t2;
28
+ const paused = t3 === undefined ? false : t3;
29
+ const scheme = useScheme();
30
+ const reduceMotion = useReduceMotion();
31
+ const single = color ?? tokens.color.muted[scheme];
32
+ let t4;
33
+ if ($[0] !== colors || $[1] !== single) {
34
+ t4 = colors ?? [single, single, single];
35
+ $[0] = colors;
36
+ $[1] = single;
37
+ $[2] = t4;
38
+ } else {
39
+ t4 = $[2];
40
+ }
41
+ const fill = t4;
42
+ const still = reduceMotion || paused;
43
+ let t5;
44
+ let t6;
45
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
46
+ t5 = {
47
+ busy: true
48
+ };
49
+ t6 = {
50
+ alignSelf: "flex-start"
51
+ };
52
+ $[3] = t5;
53
+ $[4] = t6;
54
+ } else {
55
+ t5 = $[3];
56
+ t6 = $[4];
57
+ }
58
+ let t7;
59
+ if ($[5] !== fill || $[6] !== size || $[7] !== still) {
60
+ t7 = still ? <DriveGrid size={size} fill={fill} elapsed={undefined} /> : <RunningDriveGrid size={size} fill={fill} />;
61
+ $[5] = fill;
62
+ $[6] = size;
63
+ $[7] = still;
64
+ $[8] = t7;
65
+ } else {
66
+ t7 = $[8];
67
+ }
68
+ let t8;
69
+ if ($[9] !== label || $[10] !== t7) {
70
+ t8 = <View accessible={true} accessibilityRole="progressbar" accessibilityLabel={label} accessibilityState={t5} style={t6}>{t7}</View>;
71
+ $[9] = label;
72
+ $[10] = t7;
73
+ $[11] = t8;
74
+ } else {
75
+ t8 = $[11];
76
+ }
77
+ return t8;
78
+ }
79
+
80
+ /** Column colours, left to right. */
81
+
82
+ /** Owns the clock, so unmounting it (Reduce Motion, `paused`) stops the frame callback. */
83
+ function RunningDriveGrid(t0) {
84
+ const $ = _c(4);
85
+ const {
86
+ size,
87
+ fill
88
+ } = t0;
89
+ const elapsed = useSharedValue(0);
90
+ useFrameCallback(frame => {
91
+ "worklet";
92
+
93
+ elapsed.set(frame.timeSinceFirstFrame);
94
+ }, true);
95
+ let t1;
96
+ if ($[0] !== elapsed || $[1] !== fill || $[2] !== size) {
97
+ t1 = <DriveGrid size={size} fill={fill} elapsed={elapsed} />;
98
+ $[0] = elapsed;
99
+ $[1] = fill;
100
+ $[2] = size;
101
+ $[3] = t1;
102
+ } else {
103
+ t1 = $[3];
104
+ }
105
+ return t1;
106
+ }
107
+
108
+ /** The nine cells. No `elapsed`: the still frame. */
109
+ function DriveGrid(t0) {
110
+ const $ = _c(11);
111
+ const {
112
+ size,
113
+ fill,
114
+ elapsed
115
+ } = t0;
116
+ const {
117
+ gap
118
+ } = DRIVE_SIZES[size];
119
+ let t1;
120
+ if ($[0] !== gap) {
121
+ t1 = {
122
+ gap
123
+ };
124
+ $[0] = gap;
125
+ $[1] = t1;
126
+ } else {
127
+ t1 = $[1];
128
+ }
129
+ let t2;
130
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
131
+ t2 = [0, 1, 2];
132
+ $[2] = t2;
133
+ } else {
134
+ t2 = $[2];
135
+ }
136
+ let t3;
137
+ if ($[3] !== elapsed || $[4] !== fill || $[5] !== gap || $[6] !== size) {
138
+ t3 = t2.map(row => <View key={row} style={{
139
+ flexDirection: "row",
140
+ gap
141
+ }}>{DRIVE_DELAYS.slice(row * 3, row * 3 + 3).map((delay, column) => elapsed ? <DriveCell key={column} size={size} fill={fill[column] ?? fill[0]} delay={delay} elapsed={elapsed} /> : <View key={column} style={[cellStyle(size, fill[column] ?? fill[0]), {
142
+ opacity: driveCellOpacity(DRIVE_STILL_FRAME_MS, delay)
143
+ }]} />)}</View>);
144
+ $[3] = elapsed;
145
+ $[4] = fill;
146
+ $[5] = gap;
147
+ $[6] = size;
148
+ $[7] = t3;
149
+ } else {
150
+ t3 = $[7];
151
+ }
152
+ let t4;
153
+ if ($[8] !== t1 || $[9] !== t3) {
154
+ t4 = <View style={t1}>{t3}</View>;
155
+ $[8] = t1;
156
+ $[9] = t3;
157
+ $[10] = t4;
158
+ } else {
159
+ t4 = $[10];
160
+ }
161
+ return t4;
162
+ }
163
+ function DriveCell(t0) {
164
+ const $ = _c(6);
165
+ const {
166
+ size,
167
+ fill,
168
+ delay,
169
+ elapsed
170
+ } = t0;
171
+ const pulse = useAnimatedStyle(() => ({
172
+ opacity: driveCellOpacity(elapsed.get(), delay)
173
+ }));
174
+ let t1;
175
+ if ($[0] !== fill || $[1] !== size) {
176
+ t1 = cellStyle(size, fill);
177
+ $[0] = fill;
178
+ $[1] = size;
179
+ $[2] = t1;
180
+ } else {
181
+ t1 = $[2];
182
+ }
183
+ let t2;
184
+ if ($[3] !== pulse || $[4] !== t1) {
185
+ t2 = <Animated.View style={[t1, pulse]} />;
186
+ $[3] = pulse;
187
+ $[4] = t1;
188
+ $[5] = t2;
189
+ } else {
190
+ t2 = $[5];
191
+ }
192
+ return t2;
193
+ }
194
+ function cellStyle(size, fill) {
195
+ const {
196
+ cell,
197
+ radius
198
+ } = DRIVE_SIZES[size];
199
+ return {
200
+ width: cell,
201
+ height: cell,
202
+ borderRadius: radius,
203
+ backgroundColor: fill
204
+ };
205
+ }
@@ -0,0 +1,128 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { Pressable, View } from "react-native";
3
+ import { MIN_TOUCH_TARGET } from "./controlStyles";
4
+ import { palette, withAlpha } from "./palette";
5
+ import { useLargerText } from "./theme";
6
+ import { tokens } from "./tokens";
7
+ import { useScheme } from "./useScheme";
8
+ /** Dot sizes: the web `CarouselDots` (`h-1.5`, active `w-4`, `gap-1.5`), a step up with larger text. */
9
+ export function pageDotSize(largerText) {
10
+ return largerText ? {
11
+ height: 8,
12
+ active: 20,
13
+ gap: 8
14
+ } : {
15
+ height: 6,
16
+ active: 16,
17
+ gap: 6
18
+ };
19
+ }
20
+
21
+ /**
22
+ * Page dots, as the web `CarouselDots`: the current page is a wider dot in
23
+ * `palette.primary`, the others muted at 30%. Nothing for a single page.
24
+ * Without `onChange` it is one element that reads "Page 2 of 5". With it each
25
+ * dot is a 44 button named "Page 2 of 5", `selected` on the current page; the
26
+ * dots then sit 44 apart, so each has a whole target.
27
+ */
28
+ export function PageIndicator(t0) {
29
+ const $ = _c(19);
30
+ const {
31
+ count,
32
+ index,
33
+ onChange,
34
+ testID
35
+ } = t0;
36
+ const scheme = useScheme();
37
+ const largerText = useLargerText();
38
+ if (count <= 1) {
39
+ return null;
40
+ }
41
+ const current = Math.min(Math.max(index, 0), count - 1);
42
+ let t1;
43
+ if ($[0] !== largerText) {
44
+ t1 = pageDotSize(largerText);
45
+ $[0] = largerText;
46
+ $[1] = t1;
47
+ } else {
48
+ t1 = $[1];
49
+ }
50
+ const size = t1;
51
+ let t2;
52
+ if ($[2] !== count) {
53
+ t2 = page => `Page ${page + 1} of ${count}`;
54
+ $[2] = count;
55
+ $[3] = t2;
56
+ } else {
57
+ t2 = $[3];
58
+ }
59
+ const pageLabel = t2;
60
+ let t3;
61
+ if ($[4] !== current || $[5] !== scheme || $[6] !== size) {
62
+ t3 = page_0 => {
63
+ const selected = page_0 === current;
64
+ return <View key={page_0} style={{
65
+ height: size.height,
66
+ width: selected ? size.active : size.height,
67
+ borderRadius: size.height / 2,
68
+ backgroundColor: selected ? palette.primary[scheme] : withAlpha(tokens.color.muted[scheme], 0.3)
69
+ }} />;
70
+ };
71
+ $[4] = current;
72
+ $[5] = scheme;
73
+ $[6] = size;
74
+ $[7] = t3;
75
+ } else {
76
+ t3 = $[7];
77
+ }
78
+ const dot = t3;
79
+ let t4;
80
+ let t5;
81
+ if ($[8] !== count || $[9] !== current || $[10] !== dot || $[11] !== onChange || $[12] !== pageLabel || $[13] !== size || $[14] !== testID) {
82
+ t5 = Symbol.for("react.early_return_sentinel");
83
+ bb0: {
84
+ const pages = Array.from({
85
+ length: count
86
+ }, _temp);
87
+ if (!onChange) {
88
+ let t6;
89
+ if ($[17] !== size.gap) {
90
+ t6 = {
91
+ gap: size.gap
92
+ };
93
+ $[17] = size.gap;
94
+ $[18] = t6;
95
+ } else {
96
+ t6 = $[18];
97
+ }
98
+ t5 = <View testID={testID} accessible={true} accessibilityLabel={pageLabel(current)} className="flex-row items-center justify-center" style={t6}>{pages.map(page_2 => dot(page_2))}</View>;
99
+ break bb0;
100
+ }
101
+ t4 = <View testID={testID} className="flex-row items-center justify-center">{pages.map(page_3 => <Pressable key={page_3} testID={testID ? `${testID}-${page_3}` : undefined} accessibilityRole="button" accessibilityLabel={pageLabel(page_3)} accessibilityState={{
102
+ selected: page_3 === current
103
+ }} onPress={() => onChange(page_3)} className="items-center justify-center active:opacity-70" style={{
104
+ minWidth: MIN_TOUCH_TARGET,
105
+ height: MIN_TOUCH_TARGET
106
+ }}>{dot(page_3)}</Pressable>)}</View>;
107
+ }
108
+ $[8] = count;
109
+ $[9] = current;
110
+ $[10] = dot;
111
+ $[11] = onChange;
112
+ $[12] = pageLabel;
113
+ $[13] = size;
114
+ $[14] = testID;
115
+ $[15] = t4;
116
+ $[16] = t5;
117
+ } else {
118
+ t4 = $[15];
119
+ t5 = $[16];
120
+ }
121
+ if (t5 !== Symbol.for("react.early_return_sentinel")) {
122
+ return t5;
123
+ }
124
+ return t4;
125
+ }
126
+ function _temp(_, page_1) {
127
+ return page_1;
128
+ }