@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,138 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { Pressable, Text, View } from "react-native";
3
+ import { cn } from "../cn";
4
+ import { tokens } from "../tokens";
5
+ import { WORDMARK } from "../typography";
6
+ import { useScheme } from "../useScheme";
7
+ import { APP_ICONS } from "./AppIcons";
8
+
9
+ /** The five product apps. `projectv` keeps its Michroma wordmark and never uses `AppWordmark`. `eva` and `bee` are icons only. */
10
+
11
+ /**
12
+ * Wordmark for a product app: the `APP_ICONS` glyph, then the lowercase name in
13
+ * Instrument Sans 500 (`font-instrument-sans-medium`) with -0.02em letter
14
+ * spacing, as the web `AppWordmark`. No serif, no italic.
15
+ */
16
+ export function AppWordmark(t0) {
17
+ const $ = _c(33);
18
+ const {
19
+ app,
20
+ size: t1,
21
+ icon: t2,
22
+ color,
23
+ onPress,
24
+ accessibilityLabel,
25
+ className,
26
+ testID
27
+ } = t0;
28
+ const size = t1 === undefined ? 24 : t1;
29
+ const icon = t2 === undefined ? true : t2;
30
+ const scheme = useScheme();
31
+ const Icon = APP_ICONS[app];
32
+ const fg = color ?? tokens.color.foreground[scheme];
33
+ let t3;
34
+ if ($[0] !== Icon || $[1] !== fg || $[2] !== icon || $[3] !== size) {
35
+ t3 = icon ? <Icon size={Math.round(size * WORDMARK.iconScale)} color={fg} /> : null;
36
+ $[0] = Icon;
37
+ $[1] = fg;
38
+ $[2] = icon;
39
+ $[3] = size;
40
+ $[4] = t3;
41
+ } else {
42
+ t3 = $[4];
43
+ }
44
+ const t4 = size * WORDMARK.letterSpacingEm;
45
+ let t5;
46
+ if ($[5] !== fg || $[6] !== size || $[7] !== t4) {
47
+ t5 = {
48
+ fontSize: size,
49
+ lineHeight: size,
50
+ letterSpacing: t4,
51
+ fontWeight: WORDMARK.fontWeight,
52
+ color: fg,
53
+ includeFontPadding: false
54
+ };
55
+ $[5] = fg;
56
+ $[6] = size;
57
+ $[7] = t4;
58
+ $[8] = t5;
59
+ } else {
60
+ t5 = $[8];
61
+ }
62
+ let t6;
63
+ if ($[9] !== app || $[10] !== t5) {
64
+ t6 = <Text className={WORDMARK.fontClass} style={t5}>{app}</Text>;
65
+ $[9] = app;
66
+ $[10] = t5;
67
+ $[11] = t6;
68
+ } else {
69
+ t6 = $[11];
70
+ }
71
+ let t7;
72
+ if ($[12] !== t3 || $[13] !== t6) {
73
+ t7 = <>{t3}{t6}</>;
74
+ $[12] = t3;
75
+ $[13] = t6;
76
+ $[14] = t7;
77
+ } else {
78
+ t7 = $[14];
79
+ }
80
+ const content = t7;
81
+ let rowClassName;
82
+ let rowStyle;
83
+ let t8;
84
+ if ($[15] !== accessibilityLabel || $[16] !== app || $[17] !== className || $[18] !== content || $[19] !== onPress || $[20] !== size || $[21] !== testID) {
85
+ t8 = Symbol.for("react.early_return_sentinel");
86
+ bb0: {
87
+ rowClassName = cn("flex-row items-center", className);
88
+ const t9 = size * WORDMARK.gapEm;
89
+ let t10;
90
+ if ($[25] !== t9) {
91
+ t10 = {
92
+ gap: t9
93
+ };
94
+ $[25] = t9;
95
+ $[26] = t10;
96
+ } else {
97
+ t10 = $[26];
98
+ }
99
+ rowStyle = t10;
100
+ if (onPress) {
101
+ t8 = <Pressable testID={testID} accessibilityRole="link" accessibilityLabel={accessibilityLabel ?? app} onPress={onPress} className={cn(rowClassName, "active:opacity-70")} style={rowStyle}>{content}</Pressable>;
102
+ break bb0;
103
+ }
104
+ }
105
+ $[15] = accessibilityLabel;
106
+ $[16] = app;
107
+ $[17] = className;
108
+ $[18] = content;
109
+ $[19] = onPress;
110
+ $[20] = size;
111
+ $[21] = testID;
112
+ $[22] = rowClassName;
113
+ $[23] = rowStyle;
114
+ $[24] = t8;
115
+ } else {
116
+ rowClassName = $[22];
117
+ rowStyle = $[23];
118
+ t8 = $[24];
119
+ }
120
+ if (t8 !== Symbol.for("react.early_return_sentinel")) {
121
+ return t8;
122
+ }
123
+ const t9 = accessibilityLabel ?? app;
124
+ let t10;
125
+ if ($[27] !== content || $[28] !== rowClassName || $[29] !== rowStyle || $[30] !== t9 || $[31] !== testID) {
126
+ t10 = <View testID={testID} accessible={true} accessibilityLabel={t9} className={rowClassName} style={rowStyle}>{content}</View>;
127
+ $[27] = content;
128
+ $[28] = rowClassName;
129
+ $[29] = rowStyle;
130
+ $[30] = t9;
131
+ $[31] = testID;
132
+ $[32] = t10;
133
+ } else {
134
+ t10 = $[32];
135
+ }
136
+ return t10;
137
+ }
138
+ AppWordmark.displayName = "AppWordmark";
@@ -0,0 +1,71 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { Platform } from "react-native";
3
+ import Svg, { Path } from "react-native-svg";
4
+ import { svgA11yProps } from "../svgA11y";
5
+ /** The four paths of the Google "G" on the 24 grid, each in its brand colour. */
6
+ const GOOGLE_G = [{
7
+ fill: "#4285F4",
8
+ d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"
9
+ }, {
10
+ fill: "#34A853",
11
+ d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
12
+ }, {
13
+ fill: "#FBBC05",
14
+ d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
15
+ }, {
16
+ fill: "#EA4335",
17
+ d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
18
+ }];
19
+
20
+ /**
21
+ * The multicolour Google "G", for a "Continue with Google" button:
22
+ * `<Button variant="outline" leftIcon={<GoogleMark />}>`. The four colours are
23
+ * Google's and fixed, so it takes no `color`.
24
+ */
25
+ export function GoogleMark(t0) {
26
+ const $ = _c(8);
27
+ const {
28
+ size: t1,
29
+ title,
30
+ testID,
31
+ style
32
+ } = t0;
33
+ const size = t1 === undefined ? 18 : t1;
34
+ let t2;
35
+ if ($[0] !== testID || $[1] !== title) {
36
+ t2 = svgA11yProps({
37
+ title,
38
+ testID
39
+ }, Platform.OS);
40
+ $[0] = testID;
41
+ $[1] = title;
42
+ $[2] = t2;
43
+ } else {
44
+ t2 = $[2];
45
+ }
46
+ let t3;
47
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
48
+ t3 = GOOGLE_G.map(_temp);
49
+ $[3] = t3;
50
+ } else {
51
+ t3 = $[3];
52
+ }
53
+ let t4;
54
+ if ($[4] !== size || $[5] !== style || $[6] !== t2) {
55
+ t4 = <Svg width={size} height={size} viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet" {...t2} style={style}>{t3}</Svg>;
56
+ $[4] = size;
57
+ $[5] = style;
58
+ $[6] = t2;
59
+ $[7] = t4;
60
+ } else {
61
+ t4 = $[7];
62
+ }
63
+ return t4;
64
+ }
65
+ function _temp(t0) {
66
+ const {
67
+ fill,
68
+ d
69
+ } = t0;
70
+ return <Path key={fill} d={d} fill={fill} />;
71
+ }
@@ -0,0 +1,192 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { Platform } from "react-native";
3
+ import Svg, { Path, Rect } from "react-native-svg";
4
+ import { svgA11yProps } from "../svgA11y";
5
+ import { useScheme } from "../useScheme";
6
+
7
+ /** A fill that follows the colour scheme, as the web `text-black dark:text-white`. */
8
+
9
+ /** Providers with a mark. Any other provider draws the Claude mark, as the web. */
10
+
11
+ /**
12
+ * The provider marks of the web `ProviderIcon` (`@vvedantb/ui`
13
+ * `ai-elements/provider-icon.tsx`): the same path data, viewBoxes and fills.
14
+ * A test checks them against the web source.
15
+ */
16
+ export const PROVIDER_MARKS = {
17
+ claude: {
18
+ viewBox: "0 0 24 24",
19
+ layers: [{
20
+ fill: "#D97757",
21
+ d: "m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"
22
+ }]
23
+ },
24
+ codex: {
25
+ viewBox: "0 0 256 260",
26
+ layers: [{
27
+ fill: {
28
+ light: "#000",
29
+ dark: "#fff"
30
+ },
31
+ d: "M239.184 106.203a64.716 64.716 0 0 0-5.576-53.103C219.452 28.459 191 15.784 163.213 21.74A65.586 65.586 0 0 0 52.096 45.22a64.716 64.716 0 0 0-43.23 31.36c-14.31 24.602-11.061 55.634 8.033 76.74a64.665 64.665 0 0 0 5.525 53.102c14.174 24.65 42.644 37.324 70.446 31.36a64.72 64.72 0 0 0 48.754 21.744c28.481.025 53.714-18.361 62.414-45.481a64.767 64.767 0 0 0 43.229-31.36c14.137-24.558 10.875-55.423-8.083-76.483Zm-97.56 136.338a48.397 48.397 0 0 1-31.105-11.255l1.535-.87 51.67-29.825a8.595 8.595 0 0 0 4.247-7.367v-72.85l21.845 12.636c.218.111.37.32.409.563v60.367c-.056 26.818-21.783 48.545-48.601 48.601Zm-104.466-44.61a48.345 48.345 0 0 1-5.781-32.589l1.534.921 51.722 29.826a8.339 8.339 0 0 0 8.441 0l63.181-36.425v25.221a.87.87 0 0 1-.358.665l-52.335 30.184c-23.257 13.398-52.97 5.431-66.404-17.803ZM23.549 85.38a48.499 48.499 0 0 1 25.58-21.333v61.39a8.288 8.288 0 0 0 4.195 7.316l62.874 36.272-21.845 12.636a.819.819 0 0 1-.767 0L41.353 151.53c-23.211-13.454-31.171-43.144-17.804-66.405v.256Zm179.466 41.695-63.08-36.63L161.73 77.86a.819.819 0 0 1 .768 0l52.233 30.184a48.6 48.6 0 0 1-7.316 87.635v-61.391a8.544 8.544 0 0 0-4.4-7.213Zm21.742-32.69-1.535-.922-51.619-30.081a8.39 8.39 0 0 0-8.492 0L99.98 99.808V74.587a.716.716 0 0 1 .307-.665l52.233-30.133a48.652 48.652 0 0 1 72.236 50.391v.205ZM88.061 139.097l-21.845-12.585a.87.87 0 0 1-.41-.614V65.685a48.652 48.652 0 0 1 79.757-37.346l-1.535.87-51.67 29.825a8.595 8.595 0 0 0-4.246 7.367l-.051 72.697Zm11.868-25.58 28.138-16.217 28.188 16.218v32.434l-28.086 16.218-28.188-16.218-.052-32.434Z"
32
+ }]
33
+ },
34
+ opencode: {
35
+ viewBox: "0 0 512 512",
36
+ layers: [{
37
+ square: 512,
38
+ fill: "#FDFCFC"
39
+ }, {
40
+ d: "M320 224V352H192V224H320Z",
41
+ fill: "#E6E5E6"
42
+ }, {
43
+ d: "M384 416H128V96H384V416ZM320 160H192V352H320V160Z",
44
+ fill: "#17181C",
45
+ evenOdd: true
46
+ }]
47
+ },
48
+ cursor: {
49
+ viewBox: "0 0 466.73 532.09",
50
+ layers: [{
51
+ fill: {
52
+ light: "#26251E",
53
+ dark: "#EDECEC"
54
+ },
55
+ d: "M457.43,125.94L244.42,2.96c-6.84-3.95-15.28-3.95-22.12,0L9.3,125.94c-5.75,3.32-9.3,9.46-9.3,16.11v247.99c0,6.65,3.55,12.79,9.3,16.11l213.01,122.98c6.84,3.95,15.28,3.95,22.12,0l213.01-122.98c5.75-3.32,9.3-9.46,9.3-16.11v-247.99c0-6.65-3.55-12.79-9.3-16.11h-.01ZM444.05,151.99l-205.63,356.16c-1.39,2.4-5.06,1.42-5.06-1.36v-233.21c0-4.66-2.49-8.97-6.53-11.31L24.87,145.67c-2.4-1.39-1.42-5.06,1.36-5.06h411.26c5.84,0,9.49,6.33,6.57,11.39h-.01Z"
56
+ }]
57
+ }
58
+ };
59
+
60
+ /** The mark for `provider`, the Claude mark for an unknown one (web `ProviderIcon` default). */
61
+ export function providerMark(provider) {
62
+ switch (provider) {
63
+ case "codex":
64
+ case "opencode":
65
+ case "cursor":
66
+ return PROVIDER_MARKS[provider];
67
+ default:
68
+ return PROVIDER_MARKS.claude;
69
+ }
70
+ }
71
+
72
+ /**
73
+ * The provider's name in a model picker, as the web `getProviderLabel`
74
+ * (`ai-elements/model-picker-types.ts`): "Claude", "GPT" for Codex,
75
+ * "Opencode", "Cursor", and any other provider as given.
76
+ */
77
+ export function providerLabel(provider) {
78
+ switch (provider) {
79
+ case "claude":
80
+ return "Claude";
81
+ case "codex":
82
+ return "GPT";
83
+ case "opencode":
84
+ return "Opencode";
85
+ case "cursor":
86
+ return "Cursor";
87
+ default:
88
+ return provider;
89
+ }
90
+ }
91
+ /**
92
+ * The brand mark of an AI provider, as the web `ProviderIcon`. The marks keep
93
+ * their brand colours; the OpenAI and Cursor marks switch with the scheme.
94
+ */
95
+ export function ProviderIcon(t0) {
96
+ const $ = _c(28);
97
+ const {
98
+ provider,
99
+ size: t1,
100
+ title,
101
+ testID,
102
+ style
103
+ } = t0;
104
+ const size = t1 === undefined ? 14 : t1;
105
+ const scheme = useScheme();
106
+ let T0;
107
+ let t2;
108
+ let t3;
109
+ let t4;
110
+ let t5;
111
+ let t6;
112
+ let t7;
113
+ if ($[0] !== provider || $[1] !== scheme || $[2] !== size || $[3] !== style || $[4] !== testID || $[5] !== title) {
114
+ const {
115
+ viewBox,
116
+ layers
117
+ } = providerMark(provider);
118
+ let t8;
119
+ if ($[13] !== scheme) {
120
+ t8 = fill => typeof fill === "string" ? fill : fill[scheme];
121
+ $[13] = scheme;
122
+ $[14] = t8;
123
+ } else {
124
+ t8 = $[14];
125
+ }
126
+ const paint = t8;
127
+ T0 = Svg;
128
+ t2 = size;
129
+ t3 = size;
130
+ t4 = viewBox;
131
+ if ($[15] !== testID || $[16] !== title) {
132
+ t5 = svgA11yProps({
133
+ title,
134
+ testID
135
+ }, Platform.OS);
136
+ $[15] = testID;
137
+ $[16] = title;
138
+ $[17] = t5;
139
+ } else {
140
+ t5 = $[17];
141
+ }
142
+ t6 = style;
143
+ let t9;
144
+ if ($[18] !== paint) {
145
+ t9 = (layer, index) => "square" in layer ? <Rect key={index} width={layer.square} height={layer.square} fill={paint(layer.fill)} /> : <Path key={index} d={layer.d} fill={paint(layer.fill)} {...layer.evenOdd ? {
146
+ fillRule: "evenodd",
147
+ clipRule: "evenodd"
148
+ } : {}} />;
149
+ $[18] = paint;
150
+ $[19] = t9;
151
+ } else {
152
+ t9 = $[19];
153
+ }
154
+ t7 = layers.map(t9);
155
+ $[0] = provider;
156
+ $[1] = scheme;
157
+ $[2] = size;
158
+ $[3] = style;
159
+ $[4] = testID;
160
+ $[5] = title;
161
+ $[6] = T0;
162
+ $[7] = t2;
163
+ $[8] = t3;
164
+ $[9] = t4;
165
+ $[10] = t5;
166
+ $[11] = t6;
167
+ $[12] = t7;
168
+ } else {
169
+ T0 = $[6];
170
+ t2 = $[7];
171
+ t3 = $[8];
172
+ t4 = $[9];
173
+ t5 = $[10];
174
+ t6 = $[11];
175
+ t7 = $[12];
176
+ }
177
+ let t8;
178
+ if ($[20] !== T0 || $[21] !== t2 || $[22] !== t3 || $[23] !== t4 || $[24] !== t5 || $[25] !== t6 || $[26] !== t7) {
179
+ t8 = <T0 width={t2} height={t3} viewBox={t4} {...t5} style={t6}>{t7}</T0>;
180
+ $[20] = T0;
181
+ $[21] = t2;
182
+ $[22] = t3;
183
+ $[23] = t4;
184
+ $[24] = t5;
185
+ $[25] = t6;
186
+ $[26] = t7;
187
+ $[27] = t8;
188
+ } else {
189
+ t8 = $[27];
190
+ }
191
+ return t8;
192
+ }
@@ -0,0 +1,33 @@
1
+ /** Apps in the Project V family. `eva` and `bee` have marks and icons but are not family apps. */
2
+
3
+ /** Single source for family app display names and sites, in display order. */
4
+ export const FAMILY_APPS = [{
5
+ app: "vibot",
6
+ name: "vibot",
7
+ url: "https://vibot.projectv.uk"
8
+ }, {
9
+ app: "verve",
10
+ name: "Verve",
11
+ url: "https://verve.projectv.uk"
12
+ }, {
13
+ app: "velth",
14
+ name: "Velth",
15
+ url: "https://velth.projectv.uk"
16
+ }, {
17
+ app: "vmem",
18
+ name: "vmem",
19
+ url: "https://vmem.projectv.uk"
20
+ }, {
21
+ app: "vhub",
22
+ name: "vhub",
23
+ url: "https://vhub.projectv.uk"
24
+ }, {
25
+ app: "projectv",
26
+ name: "Project V",
27
+ url: "https://projectv.uk"
28
+ }];
29
+
30
+ /** Entry of `FAMILY_APPS` for an app. */
31
+ export function familyApp(app) {
32
+ return FAMILY_APPS.find(entry => entry.app === app);
33
+ }
@@ -0,0 +1,11 @@
1
+ // `svg.ts`, `familyApps.ts` and `vProAppBenefits.ts` are byte-identical copies of
2
+ // `@vvedantb/ui` `src/brand/` (pure data, no imports beyond each other). A test
3
+ // in this package fails when they differ: change both together.
4
+ export { APP_ICONS, IconBee, IconEva, IconProjectV, IconVelth, IconVerve, IconVhub, IconVibot, IconVmem } from "./AppIcons";
5
+ export { AppMark } from "./AppMark";
6
+ export { AppWordmark } from "./AppWordmark";
7
+ export { GoogleMark } from "./GoogleMark";
8
+ export { PROVIDER_MARKS, ProviderIcon, providerLabel, providerMark } from "./ProviderIcon";
9
+ export { APP_MARKS, APP_MARK_CROP_VIEWBOX, APP_MARK_VIEWBOX, APP_MARK_VIEWBOX_START, PROJECTV_MARK_VIEWBOX, APP_MARK_SVG, APP_NAMES, APP_TILE_LIGHT_SVG, APP_TILE_SVG, appAdaptiveSvg, appExtension128Svg, appMarkSvg, appTileSvg, markAspect, markBBox, markLinecap, markStrokeWidth, pathBBox } from "./svg";
10
+ export { FAMILY_APPS, familyApp } from "./familyApps";
11
+ export { V_PRO_APP_BENEFITS } from "./vProAppBenefits";