@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,123 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { Button } from "./Button";
3
+ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "./Dialog";
4
+ import { useOverlay } from "./primitives/overlay";
5
+ /** A `Dialog` whose content blocks backdrop taps. Android back still closes it, as Escape does on the web. */
6
+ export function AlertDialog(props) {
7
+ const $ = _c(2);
8
+ let t0;
9
+ if ($[0] !== props) {
10
+ t0 = <Dialog {...props} />;
11
+ $[0] = props;
12
+ $[1] = t0;
13
+ } else {
14
+ t0 = $[1];
15
+ }
16
+ return t0;
17
+ }
18
+ export const AlertDialogTrigger = DialogTrigger;
19
+ /** `DialogContent` with no backdrop dismiss and, by default, no close button. */
20
+ export function AlertDialogContent(t0) {
21
+ const $ = _c(6);
22
+ let props;
23
+ let t1;
24
+ if ($[0] !== t0) {
25
+ ({
26
+ hideCloseButton: t1,
27
+ ...props
28
+ } = t0);
29
+ $[0] = t0;
30
+ $[1] = props;
31
+ $[2] = t1;
32
+ } else {
33
+ props = $[1];
34
+ t1 = $[2];
35
+ }
36
+ const hideCloseButton = t1 === undefined ? true : t1;
37
+ let t2;
38
+ if ($[3] !== hideCloseButton || $[4] !== props) {
39
+ t2 = <DialogContent hideCloseButton={hideCloseButton} dismissible={false} {...props} />;
40
+ $[3] = hideCloseButton;
41
+ $[4] = props;
42
+ $[5] = t2;
43
+ } else {
44
+ t2 = $[5];
45
+ }
46
+ return t2;
47
+ }
48
+ export const AlertDialogHeader = DialogHeader;
49
+ export const AlertDialogFooter = DialogFooter;
50
+ export const AlertDialogTitle = DialogTitle;
51
+ export const AlertDialogDescription = DialogDescription;
52
+
53
+ /**
54
+ * Confirm button. As on the web it does not close the dialog: close it in
55
+ * `onPress` (set `open` to false). Not full width by default, for the row
56
+ * footer; full width in the stacked footer of the compact sheet.
57
+ */
58
+ export function AlertDialogAction(props) {
59
+ const $ = _c(2);
60
+ let t0;
61
+ if ($[0] !== props) {
62
+ t0 = <Button shadowType="flat" fullWidth={false} {...props} />;
63
+ $[0] = props;
64
+ $[1] = t0;
65
+ } else {
66
+ t0 = $[1];
67
+ }
68
+ return t0;
69
+ }
70
+
71
+ /**
72
+ * Cancel button: runs `onPress`, then closes the dialog. Default variant
73
+ * `outline`, as on the web. Not full width, except in the stacked footer of
74
+ * the compact sheet.
75
+ */
76
+ export function AlertDialogCancel(t0) {
77
+ const $ = _c(11);
78
+ let onPress;
79
+ let props;
80
+ let t1;
81
+ if ($[0] !== t0) {
82
+ ({
83
+ variant: t1,
84
+ onPress,
85
+ ...props
86
+ } = t0);
87
+ $[0] = t0;
88
+ $[1] = onPress;
89
+ $[2] = props;
90
+ $[3] = t1;
91
+ } else {
92
+ onPress = $[1];
93
+ props = $[2];
94
+ t1 = $[3];
95
+ }
96
+ const variant = t1 === undefined ? "outline" : t1;
97
+ const {
98
+ setOpen
99
+ } = useOverlay("AlertDialogCancel");
100
+ let t2;
101
+ if ($[4] !== onPress || $[5] !== setOpen) {
102
+ t2 = () => {
103
+ onPress?.();
104
+ setOpen(false);
105
+ };
106
+ $[4] = onPress;
107
+ $[5] = setOpen;
108
+ $[6] = t2;
109
+ } else {
110
+ t2 = $[6];
111
+ }
112
+ let t3;
113
+ if ($[7] !== props || $[8] !== t2 || $[9] !== variant) {
114
+ t3 = <Button variant={variant} shadowType="flat" fullWidth={false} {...props} onPress={t2} />;
115
+ $[7] = props;
116
+ $[8] = t2;
117
+ $[9] = variant;
118
+ $[10] = t3;
119
+ } else {
120
+ t3 = $[10];
121
+ }
122
+ return t3;
123
+ }
@@ -0,0 +1,73 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { StyleSheet, View } from "react-native";
3
+ import { cn } from "./cn";
4
+ import { loadLinearGradient } from "./gradient";
5
+ import { tokens } from "./tokens";
6
+ import { useScheme } from "./useScheme";
7
+ const LIGHT = ["#f6f6f7", "#fde8f0", "#f4f5f7"];
8
+ const DARK = ["#1c1c1e", "#2a1820", "#1a1a1c"];
9
+
10
+ /**
11
+ * A soft gradient behind the screen. Without the optional
12
+ * `expo-linear-gradient` peer it draws the solid `tokens.color.background`.
13
+ */
14
+ export function AmbientBackground(t0) {
15
+ const $ = _c(13);
16
+ let children;
17
+ let className;
18
+ let props;
19
+ if ($[0] !== t0) {
20
+ ({
21
+ children,
22
+ className,
23
+ ...props
24
+ } = t0);
25
+ $[0] = t0;
26
+ $[1] = children;
27
+ $[2] = className;
28
+ $[3] = props;
29
+ } else {
30
+ children = $[1];
31
+ className = $[2];
32
+ props = $[3];
33
+ }
34
+ const scheme = useScheme();
35
+ const LinearGradient = loadLinearGradient()?.LinearGradient;
36
+ let t1;
37
+ if ($[4] !== className) {
38
+ t1 = cn("flex-1", className);
39
+ $[4] = className;
40
+ $[5] = t1;
41
+ } else {
42
+ t1 = $[5];
43
+ }
44
+ let t2;
45
+ if ($[6] !== scheme) {
46
+ t2 = LinearGradient ? <LinearGradient pointerEvents="none" colors={[...(scheme === "dark" ? DARK : LIGHT)]} start={{
47
+ x: 0.05,
48
+ y: 0
49
+ }} end={{
50
+ x: 0.95,
51
+ y: 1
52
+ }} style={StyleSheet.absoluteFill} /> : <View pointerEvents="none" style={{
53
+ ...StyleSheet.absoluteFill,
54
+ backgroundColor: tokens.color.background[scheme]
55
+ }} />;
56
+ $[6] = scheme;
57
+ $[7] = t2;
58
+ } else {
59
+ t2 = $[7];
60
+ }
61
+ let t3;
62
+ if ($[8] !== children || $[9] !== props || $[10] !== t1 || $[11] !== t2) {
63
+ t3 = <View className={t1} {...props}>{t2}{children}</View>;
64
+ $[8] = children;
65
+ $[9] = props;
66
+ $[10] = t1;
67
+ $[11] = t2;
68
+ $[12] = t3;
69
+ } else {
70
+ t3 = $[12];
71
+ }
72
+ return t3;
73
+ }
@@ -0,0 +1,59 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { View } from "react-native";
3
+ import { DividedList } from "./DividedList";
4
+ import { ListRow } from "./ListRow";
5
+ /**
6
+ * Artifacts as pressable `ListRow`s under hairlines (`DividedList`): the title
7
+ * and an optional description line. A row is a button named by its title.
8
+ * `empty` stands in for an empty list.
9
+ */
10
+ export function ArtifactList(t0) {
11
+ const $ = _c(12);
12
+ const {
13
+ rows,
14
+ onOpen,
15
+ empty,
16
+ className,
17
+ testID
18
+ } = t0;
19
+ if (rows.length === 0) {
20
+ let t1;
21
+ if ($[0] !== empty || $[1] !== testID) {
22
+ t1 = empty != null ? <View testID={testID}>{empty}</View> : null;
23
+ $[0] = empty;
24
+ $[1] = testID;
25
+ $[2] = t1;
26
+ } else {
27
+ t1 = $[2];
28
+ }
29
+ return t1;
30
+ }
31
+ let t1;
32
+ if ($[3] !== onOpen || $[4] !== rows) {
33
+ let t2;
34
+ if ($[6] !== onOpen) {
35
+ t2 = row => <ListRow key={row.id} testID={`artifact-${row.id}`} title={row.title} meta={row.description} onPress={() => onOpen(row.id)} />;
36
+ $[6] = onOpen;
37
+ $[7] = t2;
38
+ } else {
39
+ t2 = $[7];
40
+ }
41
+ t1 = rows.map(t2);
42
+ $[3] = onOpen;
43
+ $[4] = rows;
44
+ $[5] = t1;
45
+ } else {
46
+ t1 = $[5];
47
+ }
48
+ let t2;
49
+ if ($[8] !== className || $[9] !== t1 || $[10] !== testID) {
50
+ t2 = <DividedList className={className} testID={testID}>{t1}</DividedList>;
51
+ $[8] = className;
52
+ $[9] = t1;
53
+ $[10] = testID;
54
+ $[11] = t2;
55
+ } else {
56
+ t2 = $[11];
57
+ }
58
+ return t2;
59
+ }
@@ -0,0 +1,285 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { createContext, useContext, useEffect, useRef, useState } from "react";
3
+ import { Image, StyleSheet, Text, View } from "react-native";
4
+ import { cn } from "./cn";
5
+ import { typeStyle } from "./controlStyles";
6
+ import { palette } from "./palette";
7
+ import { tokens } from "./tokens";
8
+ import { useScheme } from "./useScheme";
9
+ const AvatarContext = createContext(null);
10
+ function useAvatar(part) {
11
+ const context = useContext(AvatarContext);
12
+ if (!context) {
13
+ throw new Error(`${part} must be inside an Avatar.`);
14
+ }
15
+ return context;
16
+ }
17
+ /** Round frame for `AvatarImage` and `AvatarFallback`, as the web `Avatar`. The fallback shows until the image loads, and stays if it fails. */
18
+ export function Avatar(t0) {
19
+ const $ = _c(27);
20
+ let children;
21
+ let className;
22
+ let props;
23
+ let style;
24
+ let t1;
25
+ if ($[0] !== t0) {
26
+ ({
27
+ size: t1,
28
+ className,
29
+ style,
30
+ children,
31
+ ...props
32
+ } = t0);
33
+ $[0] = t0;
34
+ $[1] = children;
35
+ $[2] = className;
36
+ $[3] = props;
37
+ $[4] = style;
38
+ $[5] = t1;
39
+ } else {
40
+ children = $[1];
41
+ className = $[2];
42
+ props = $[3];
43
+ style = $[4];
44
+ t1 = $[5];
45
+ }
46
+ const size = t1 === undefined ? 40 : t1;
47
+ const scheme = useScheme();
48
+ const [status, setStatus] = useState("idle");
49
+ let t2;
50
+ if ($[6] !== size || $[7] !== status) {
51
+ t2 = {
52
+ size,
53
+ status,
54
+ setStatus
55
+ };
56
+ $[6] = size;
57
+ $[7] = status;
58
+ $[8] = t2;
59
+ } else {
60
+ t2 = $[8];
61
+ }
62
+ let t3;
63
+ if ($[9] !== className) {
64
+ t3 = cn("relative shrink-0 overflow-hidden border", className);
65
+ $[9] = className;
66
+ $[10] = t3;
67
+ } else {
68
+ t3 = $[10];
69
+ }
70
+ const t4 = size / 2;
71
+ const t5 = tokens.color.border[scheme];
72
+ const t6 = tokens.color.surfaceSecondary[scheme];
73
+ let t7;
74
+ if ($[11] !== size || $[12] !== t4 || $[13] !== t5 || $[14] !== t6) {
75
+ t7 = {
76
+ width: size,
77
+ height: size,
78
+ borderRadius: t4,
79
+ borderColor: t5,
80
+ backgroundColor: t6
81
+ };
82
+ $[11] = size;
83
+ $[12] = t4;
84
+ $[13] = t5;
85
+ $[14] = t6;
86
+ $[15] = t7;
87
+ } else {
88
+ t7 = $[15];
89
+ }
90
+ let t8;
91
+ if ($[16] !== style || $[17] !== t7) {
92
+ t8 = [t7, style];
93
+ $[16] = style;
94
+ $[17] = t7;
95
+ $[18] = t8;
96
+ } else {
97
+ t8 = $[18];
98
+ }
99
+ let t9;
100
+ if ($[19] !== children || $[20] !== props || $[21] !== t3 || $[22] !== t8) {
101
+ t9 = <View className={t3} style={t8} {...props}>{children}</View>;
102
+ $[19] = children;
103
+ $[20] = props;
104
+ $[21] = t3;
105
+ $[22] = t8;
106
+ $[23] = t9;
107
+ } else {
108
+ t9 = $[23];
109
+ }
110
+ let t10;
111
+ if ($[24] !== t2 || $[25] !== t9) {
112
+ t10 = <AvatarContext.Provider value={t2}>{t9}</AvatarContext.Provider>;
113
+ $[24] = t2;
114
+ $[25] = t9;
115
+ $[26] = t10;
116
+ } else {
117
+ t10 = $[26];
118
+ }
119
+ return t10;
120
+ }
121
+ export function AvatarImage(t0) {
122
+ const $ = _c(15);
123
+ const {
124
+ onLoad,
125
+ onError,
126
+ className,
127
+ ...props
128
+ } = t0;
129
+ const {
130
+ status,
131
+ setStatus
132
+ } = useAvatar("AvatarImage");
133
+ const sourceKey = JSON.stringify(props.source);
134
+ const previousSource = useRef(sourceKey);
135
+ let t1;
136
+ let t2;
137
+ if ($[0] !== setStatus || $[1] !== sourceKey) {
138
+ t1 = () => {
139
+ if (previousSource.current === sourceKey) {
140
+ return;
141
+ }
142
+ previousSource.current = sourceKey;
143
+ setStatus("idle");
144
+ };
145
+ t2 = [sourceKey, setStatus];
146
+ $[0] = setStatus;
147
+ $[1] = sourceKey;
148
+ $[2] = t1;
149
+ $[3] = t2;
150
+ } else {
151
+ t1 = $[2];
152
+ t2 = $[3];
153
+ }
154
+ useEffect(t1, t2);
155
+ if (status === "error") {
156
+ return null;
157
+ }
158
+ let t3;
159
+ if ($[4] !== onLoad || $[5] !== setStatus) {
160
+ t3 = event => {
161
+ setStatus("loaded");
162
+ onLoad?.(event);
163
+ };
164
+ $[4] = onLoad;
165
+ $[5] = setStatus;
166
+ $[6] = t3;
167
+ } else {
168
+ t3 = $[6];
169
+ }
170
+ let t4;
171
+ if ($[7] !== onError || $[8] !== setStatus) {
172
+ t4 = event_0 => {
173
+ setStatus("error");
174
+ onError?.(event_0);
175
+ };
176
+ $[7] = onError;
177
+ $[8] = setStatus;
178
+ $[9] = t4;
179
+ } else {
180
+ t4 = $[9];
181
+ }
182
+ let t5;
183
+ if ($[10] !== className || $[11] !== props || $[12] !== t3 || $[13] !== t4) {
184
+ t5 = <Image resizeMode="cover" className={className} style={StyleSheet.absoluteFill} onLoad={t3} onError={t4} {...props} />;
185
+ $[10] = className;
186
+ $[11] = props;
187
+ $[12] = t3;
188
+ $[13] = t4;
189
+ $[14] = t5;
190
+ } else {
191
+ t5 = $[14];
192
+ }
193
+ return t5;
194
+ }
195
+ export function AvatarFallback(t0) {
196
+ const $ = _c(23);
197
+ let children;
198
+ let className;
199
+ let props;
200
+ let style;
201
+ let textClassName;
202
+ if ($[0] !== t0) {
203
+ ({
204
+ children,
205
+ className,
206
+ textClassName,
207
+ style,
208
+ ...props
209
+ } = t0);
210
+ $[0] = t0;
211
+ $[1] = children;
212
+ $[2] = className;
213
+ $[3] = props;
214
+ $[4] = style;
215
+ $[5] = textClassName;
216
+ } else {
217
+ children = $[1];
218
+ className = $[2];
219
+ props = $[3];
220
+ style = $[4];
221
+ textClassName = $[5];
222
+ }
223
+ const {
224
+ size,
225
+ status
226
+ } = useAvatar("AvatarFallback");
227
+ const scheme = useScheme();
228
+ if (status === "loaded") {
229
+ return null;
230
+ }
231
+ let t1;
232
+ if ($[6] !== className) {
233
+ t1 = cn("absolute inset-0 items-center justify-center", className);
234
+ $[6] = className;
235
+ $[7] = t1;
236
+ } else {
237
+ t1 = $[7];
238
+ }
239
+ const t2 = palette.default[scheme];
240
+ let t3;
241
+ if ($[8] !== t2) {
242
+ t3 = {
243
+ backgroundColor: t2
244
+ };
245
+ $[8] = t2;
246
+ $[9] = t3;
247
+ } else {
248
+ t3 = $[9];
249
+ }
250
+ let t4;
251
+ if ($[10] !== style || $[11] !== t3) {
252
+ t4 = [t3, style];
253
+ $[10] = style;
254
+ $[11] = t3;
255
+ $[12] = t4;
256
+ } else {
257
+ t4 = $[12];
258
+ }
259
+ let t5;
260
+ if ($[13] !== children || $[14] !== scheme || $[15] !== size || $[16] !== textClassName) {
261
+ t5 = typeof children === "string" ? <Text numberOfLines={1} className={cn("font-instrument-sans-semibold", textClassName)} style={[{
262
+ fontSize: Math.round(size * 0.4),
263
+ color: palette.defaultForeground[scheme]
264
+ }, typeStyle("semibold")]}>{children}</Text> : children;
265
+ $[13] = children;
266
+ $[14] = scheme;
267
+ $[15] = size;
268
+ $[16] = textClassName;
269
+ $[17] = t5;
270
+ } else {
271
+ t5 = $[17];
272
+ }
273
+ let t6;
274
+ if ($[18] !== props || $[19] !== t1 || $[20] !== t4 || $[21] !== t5) {
275
+ t6 = <View className={t1} style={t4} {...props}>{t5}</View>;
276
+ $[18] = props;
277
+ $[19] = t1;
278
+ $[20] = t4;
279
+ $[21] = t5;
280
+ $[22] = t6;
281
+ } else {
282
+ t6 = $[22];
283
+ }
284
+ return t6;
285
+ }
package/dist/Badge.jsx ADDED
@@ -0,0 +1,154 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { Text, View } from "react-native";
3
+ import { cn } from "./cn";
4
+ import { typeStyle } from "./controlStyles";
5
+ import { palette, withAlpha } from "./palette";
6
+ import { tokens } from "./tokens";
7
+ import { useLargerText } from "./theme";
8
+ import { useScheme } from "./useScheme";
9
+
10
+ /** The web `Badge` variants. */
11
+
12
+ /** Border, fill and text colours per variant, from the web classes (`border-danger/25 bg-danger/12 text-danger` and so on). */
13
+ export function badgeColors(variant, scheme) {
14
+ const tone = (hex, border, fill) => ({
15
+ borderColor: withAlpha(hex, border),
16
+ backgroundColor: withAlpha(hex, fill),
17
+ color: hex
18
+ });
19
+ switch (variant) {
20
+ case "secondary":
21
+ return {
22
+ borderColor: tokens.color.separator[scheme],
23
+ backgroundColor: palette.default[scheme],
24
+ color: palette.defaultForeground[scheme]
25
+ };
26
+ case "destructive":
27
+ return tone(palette.danger[scheme], 0.25, 0.12);
28
+ case "destructive-soft":
29
+ return {
30
+ borderColor: tokens.color.border[scheme],
31
+ backgroundColor: withAlpha(palette.danger[scheme], 0.1),
32
+ color: palette.danger[scheme]
33
+ };
34
+ case "outline":
35
+ return {
36
+ borderColor: tokens.color.separator[scheme],
37
+ backgroundColor: "transparent",
38
+ color: tokens.color.muted[scheme]
39
+ };
40
+ case "success":
41
+ return tone(palette.success[scheme], 0.25, 0.12);
42
+ case "warning":
43
+ return tone(palette.warning[scheme], 0.25, 0.12);
44
+ default:
45
+ return {
46
+ borderColor: tokens.color.border[scheme],
47
+ backgroundColor: palette.default[scheme],
48
+ color: tokens.color.foreground[scheme]
49
+ };
50
+ }
51
+ }
52
+
53
+ /** Small rounded status label, with the web `Badge` variant names and colours. */
54
+ export function Badge(t0) {
55
+ const $ = _c(28);
56
+ let children;
57
+ let className;
58
+ let props;
59
+ let style;
60
+ let t1;
61
+ let textClassName;
62
+ if ($[0] !== t0) {
63
+ ({
64
+ variant: t1,
65
+ className,
66
+ textClassName,
67
+ children,
68
+ style,
69
+ ...props
70
+ } = t0);
71
+ $[0] = t0;
72
+ $[1] = children;
73
+ $[2] = className;
74
+ $[3] = props;
75
+ $[4] = style;
76
+ $[5] = t1;
77
+ $[6] = textClassName;
78
+ } else {
79
+ children = $[1];
80
+ className = $[2];
81
+ props = $[3];
82
+ style = $[4];
83
+ t1 = $[5];
84
+ textClassName = $[6];
85
+ }
86
+ const variant = t1 === undefined ? "default" : t1;
87
+ const scheme = useScheme();
88
+ const largerText = useLargerText();
89
+ let t2;
90
+ if ($[7] !== scheme || $[8] !== variant) {
91
+ t2 = badgeColors(variant, scheme);
92
+ $[7] = scheme;
93
+ $[8] = variant;
94
+ $[9] = t2;
95
+ } else {
96
+ t2 = $[9];
97
+ }
98
+ let color;
99
+ let frame;
100
+ if ($[10] !== t2) {
101
+ ({
102
+ color,
103
+ ...frame
104
+ } = t2);
105
+ $[10] = t2;
106
+ $[11] = color;
107
+ $[12] = frame;
108
+ } else {
109
+ color = $[11];
110
+ frame = $[12];
111
+ }
112
+ let t3;
113
+ if ($[13] !== className) {
114
+ t3 = cn("flex-row items-center gap-1 self-start rounded-full border px-2.5 py-1", className);
115
+ $[13] = className;
116
+ $[14] = t3;
117
+ } else {
118
+ t3 = $[14];
119
+ }
120
+ let t4;
121
+ if ($[15] !== frame || $[16] !== style) {
122
+ t4 = [frame, style];
123
+ $[15] = frame;
124
+ $[16] = style;
125
+ $[17] = t4;
126
+ } else {
127
+ t4 = $[17];
128
+ }
129
+ let t5;
130
+ if ($[18] !== children || $[19] !== color || $[20] !== largerText || $[21] !== textClassName) {
131
+ t5 = typeof children === "string" || typeof children === "number" ? <Text className={cn("font-instrument-sans-medium", largerText ? "text-base" : "text-sm", textClassName)} style={[{
132
+ color
133
+ }, typeStyle("medium")]}>{children}</Text> : children;
134
+ $[18] = children;
135
+ $[19] = color;
136
+ $[20] = largerText;
137
+ $[21] = textClassName;
138
+ $[22] = t5;
139
+ } else {
140
+ t5 = $[22];
141
+ }
142
+ let t6;
143
+ if ($[23] !== props || $[24] !== t3 || $[25] !== t4 || $[26] !== t5) {
144
+ t6 = <View className={t3} style={t4} {...props}>{t5}</View>;
145
+ $[23] = props;
146
+ $[24] = t3;
147
+ $[25] = t4;
148
+ $[26] = t5;
149
+ $[27] = t6;
150
+ } else {
151
+ t6 = $[27];
152
+ }
153
+ return t6;
154
+ }