@naculus/connect-native 0.9.0 → 0.11.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.
package/dist/ui/index.cjs CHANGED
@@ -301,8 +301,10 @@ var import_jsx_runtime3 = require("react/jsx-runtime");
301
301
  function AuthorizationConsentNative({
302
302
  authorization,
303
303
  assets = {},
304
+ trustedAssets,
304
305
  locale,
305
306
  now,
307
+ enforcement,
306
308
  requester,
307
309
  preview,
308
310
  onApprove,
@@ -312,7 +314,13 @@ function AuthorizationConsentNative({
312
314
  theme: themeProp
313
315
  }) {
314
316
  const theme = useNativePaymentTheme(themeProp);
315
- const description = "expiry" in authorization ? authorization : (0, import_connect_appkit_core.describeAuthorization)(authorization, { assets, locale, now });
317
+ const description = "expiry" in authorization ? authorization : (0, import_connect_appkit_core.describeAuthorization)(authorization, {
318
+ assets,
319
+ trustedAssets,
320
+ locale,
321
+ now,
322
+ enforcement
323
+ });
316
324
  const muted = { color: theme.mutedForeground };
317
325
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.View, { style: [styles2.root, { backgroundColor: theme.background }], children: [
318
326
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.ScrollView, { contentContainerStyle: styles2.content, children: [
@@ -384,6 +392,7 @@ function AuthorizationConsentNative({
384
392
  ],
385
393
  children: [
386
394
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles2.assetLabel, { color: theme.foreground }], children: grant.assetLabel }),
395
+ grant.assetTrust === "unverified" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Callout, { tone: "warning", glyph: "\u26A0", role: "alert", theme, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: styles2.strong, children: "Unverified token \u2014 not on the trusted list" }) }),
387
396
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.View, { style: styles2.limits, children: [
388
397
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.View, { style: styles2.limit, children: [
389
398
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles.label, muted], children: "Per payment" }),
@@ -394,6 +403,20 @@ function AuthorizationConsentNative({
394
403
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles2.amount, { color: theme.foreground }], children: grant.total.formatted })
395
404
  ] })
396
405
  ] }),
406
+ grant.period && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.View, { children: [
407
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles2.term, { color: theme.foreground }], children: "Period limit" }),
408
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.Text, { style: [styles2.amount, { color: theme.foreground }], children: [
409
+ "Up to ",
410
+ grant.period.amount.formatted,
411
+ " every",
412
+ " ",
413
+ grant.period.every
414
+ ] }),
415
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.Text, { style: [styles2.small, muted], children: [
416
+ "Starts ",
417
+ grant.period.startsAt
418
+ ] })
419
+ ] }),
397
420
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles2.term, { color: theme.foreground }], children: "Recipients" }),
398
421
  grant.recipients.length ? grant.recipients.map((recipient) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
399
422
  CopyableValue,
@@ -423,6 +446,7 @@ function AuthorizationConsentNative({
423
446
  },
424
447
  `${grant.asset}:${grant.recipients.map((r) => r.full).join(",")}:${grant.perPayment.formatted}:${grant.total.formatted}`
425
448
  )),
449
+ description.enforcementLabel && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles2.strong, { color: theme.foreground }], children: description.enforcementLabel }),
426
450
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.View, { style: [styles2.expiry, { backgroundColor: theme.muted }], children: [
427
451
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.Text, { style: [styles2.strong, { color: theme.foreground }], children: [
428
452
  "Expires ",
@@ -555,9 +579,11 @@ function StatusBadge({
555
579
  function AuthorizationListNative({
556
580
  entries: input,
557
581
  assets = {},
582
+ trustedAssets,
558
583
  onRevoke,
559
584
  revokingId,
560
585
  locale,
586
+ getEnforcement,
561
587
  onCopy,
562
588
  theme: themeProp
563
589
  }) {
@@ -572,7 +598,12 @@ function AuthorizationListNative({
572
598
  setOnChain((current) => new Set(current).add(entry.keyId));
573
599
  });
574
600
  const renderItem = ({ item: entry }) => {
575
- const view = (0, import_connect_appkit_core2.describeAuthorization)(entry, { assets, locale });
601
+ const view = (0, import_connect_appkit_core2.describeAuthorization)(entry, {
602
+ assets,
603
+ trustedAssets,
604
+ locale,
605
+ enforcement: getEnforcement?.(entry)
606
+ });
576
607
  const busy = revokingId === entry.keyId;
577
608
  const live = entry.status === "active" || entry.status === "pending";
578
609
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
@@ -602,6 +633,7 @@ function AuthorizationListNative({
602
633
  style: [styles3.grant, { backgroundColor: theme.muted }],
603
634
  children: [
604
635
  view.label && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native4.Text, { style: [styles3.strong, { color: theme.foreground }], children: grant.assetLabel }),
636
+ grant.assetTrust === "unverified" && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Callout, { tone: "warning", glyph: "\u26A0", role: "alert", theme, children: "Unverified token \u2014 not on the trusted list" }),
605
637
  grant.recipients.map((recipient) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
606
638
  CopyableValue,
607
639
  {
@@ -612,12 +644,28 @@ function AuthorizationListNative({
612
644
  },
613
645
  recipient.full
614
646
  )),
647
+ grant.period && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.View, { children: [
648
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.Text, { style: [styles3.strong, { color: theme.foreground }], children: [
649
+ "Up to ",
650
+ grant.period.amount.formatted,
651
+ " every",
652
+ " ",
653
+ grant.period.every
654
+ ] }),
655
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.Text, { style: [styles3.small, muted], children: [
656
+ "Starts ",
657
+ grant.period.startsAt
658
+ ] })
659
+ ] }),
615
660
  spent !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.View, { children: [
616
661
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.View, { style: styles3.spentRow, children: [
617
662
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.Text, { style: [styles3.small, { color: theme.foreground }], children: [
618
663
  "Spent",
619
664
  " ",
620
- (0, import_connect_appkit_core2.formatAuthorizationAmount)(spent, assets[grant.asset]).formatted
665
+ (0, import_connect_appkit_core2.formatAuthorizationAmount)(
666
+ spent,
667
+ grant.assetTrust === "unverified" ? void 0 : assets[grant.asset]
668
+ ).formatted
621
669
  ] }),
622
670
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.Text, { style: [styles3.small, { color: theme.foreground }], children: [
623
671
  "Total ",
@@ -654,6 +702,7 @@ function AuthorizationListNative({
654
702
  grant.asset
655
703
  );
656
704
  }),
705
+ view.enforcementLabel && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native4.Text, { style: [styles3.strong, { color: theme.foreground }], children: view.enforcementLabel }),
657
706
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.Text, { style: [styles3.small, muted], children: [
658
707
  entry.status === "expired" ? "Expired" : entry.status === "revoked" ? "Revoked" : `Expires ${view.expiry.relative}`,
659
708
  " ",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/index.ts","../../src/ui/AuthorizationConsentNative.tsx","../../src/ui/parts.tsx","../../src/ui/theme.tsx","../../src/ui/AuthorizationListNative.tsx","../../src/ui/PaymentReceiptNative.tsx"],"sourcesContent":["/**\n * React Native payment UI, published as `@naculus/connect-native/ui` so apps\n * that only need the wallet connectors do not load it.\n */\nexport {\n AuthorizationConsentNative,\n type AuthorizationConsentNativeProps,\n} from \"./AuthorizationConsentNative\";\nexport {\n AuthorizationListNative,\n type AuthorizationListNativeProps,\n} from \"./AuthorizationListNative\";\nexport {\n PaymentReceiptNative,\n type PaymentReceiptNativeProps,\n} from \"./PaymentReceiptNative\";\nexport {\n darkPaymentTheme,\n lightPaymentTheme,\n type NativePaymentTheme,\n NativePaymentThemeProvider,\n useNativePaymentTheme,\n} from \"./theme\";\n","import {\n type AuthorizationAssetMetadata,\n type AuthorizationDescription,\n describeAuthorization,\n type SpendExplanation,\n} from \"@naculus/connect-appkit-core\";\nimport type { Authorization, ListedAuthorization } from \"@naculus/connect-core\";\nimport { Image, ScrollView, StyleSheet, Text, View } from \"react-native\";\nimport {\n ActionButton,\n Callout,\n CopyableValue,\n styles as shared,\n} from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface AuthorizationConsentNativeProps {\n /** Who asks: shown as \"Allow {name} to pay?\". */\n requester: { name: string; icon?: string; origin?: string };\n /** A raw authorization, or a description already built by the caller. */\n authorization: Authorization | ListedAuthorization | AuthorizationDescription;\n assets?: Record<string, AuthorizationAssetMetadata>;\n /** `explainSpend` result for the payment that triggered this consent. */\n preview?: SpendExplanation;\n onApprove: () => void;\n onDecline: () => void;\n /** Disables Approve and shows \"Approving…\". */\n busy?: boolean;\n /** Copies a recipient address; the copy button shows only when set. */\n onCopy?: (text: string) => void;\n /** BCP 47 locale for the expiry; English when omitted. */\n locale?: string;\n /** Unix timestamp in seconds, for a stable relative expiry. */\n now?: number;\n theme?: NativePaymentTheme;\n}\n\n/** React Native counterpart of the web `AuthorizationConsent`. */\nexport function AuthorizationConsentNative({\n authorization,\n assets = {},\n locale,\n now,\n requester,\n preview,\n onApprove,\n onDecline,\n busy = false,\n onCopy,\n theme: themeProp,\n}: AuthorizationConsentNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const description =\n \"expiry\" in authorization\n ? authorization\n : describeAuthorization(authorization, { assets, locale, now });\n const muted = { color: theme.mutedForeground };\n\n return (\n <View style={[styles.root, { backgroundColor: theme.background }]}>\n <ScrollView contentContainerStyle={styles.content}>\n <View style={styles.requester}>\n {requester.icon ? (\n <Image\n accessibilityIgnoresInvertColors\n source={{ uri: requester.icon }}\n style={styles.avatar}\n />\n ) : (\n <View\n importantForAccessibility=\"no\"\n style={[styles.avatar, { backgroundColor: theme.muted }]}\n >\n <Text style={[styles.initial, { color: theme.foreground }]}>\n {requester.name.slice(0, 1).toUpperCase()}\n </Text>\n </View>\n )}\n <View style={styles.flexShrink}>\n <Text\n accessibilityRole=\"header\"\n style={[shared.heading, { color: theme.foreground }]}\n >\n Allow {requester.name} to pay?\n </Text>\n {requester.origin && (\n <Text style={[styles.small, muted]}>{requester.origin}</Text>\n )}\n </View>\n </View>\n\n {description.warnings.map((warning) => (\n <Callout\n key={warning}\n tone=\"warning\"\n glyph=\"⚠\"\n role=\"alert\"\n theme={theme}\n >\n <Text style={styles.strong}>{warning}</Text>\n </Callout>\n ))}\n\n {preview && (\n <Callout\n tone={preview.allowed ? \"success\" : \"danger\"}\n glyph={preview.allowed ? \"✓\" : \"✕\"}\n theme={theme}\n >\n <Text style={styles.strong}>\n {preview.allowed ? \"Allowed\" : \"Blocked\"}.\n </Text>{\" \"}\n {preview.sentence}\n </Callout>\n )}\n\n {description.grants.map((grant) => (\n <View\n key={`${grant.asset}:${grant.recipients.map((r) => r.full).join(\",\")}:${grant.perPayment.formatted}:${grant.total.formatted}`}\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <Text style={[styles.assetLabel, { color: theme.foreground }]}>\n {grant.assetLabel}\n </Text>\n <View style={styles.limits}>\n <View style={styles.limit}>\n <Text style={[shared.label, muted]}>Per payment</Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n {grant.perPayment.formatted}\n </Text>\n </View>\n <View style={styles.limit}>\n <Text style={[shared.label, muted]}>Total limit</Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n {grant.total.formatted}\n </Text>\n </View>\n </View>\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Recipients\n </Text>\n {grant.recipients.length ? (\n grant.recipients.map((recipient) => (\n <CopyableValue\n key={recipient.full}\n value={recipient.full}\n display={recipient.shortened}\n onCopy={onCopy}\n theme={theme}\n />\n ))\n ) : (\n <Text style={[styles.strong, { color: theme.dangerForeground }]}>\n No recipient restriction is displayed\n </Text>\n )}\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Payment count\n </Text>\n <Text style={[styles.small, muted]}>\n {grant.count === null ? \"No count limit\" : `Up to ${grant.count}`}\n </Text>\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Payment methods\n </Text>\n <View style={styles.chips}>\n {grant.rails.map((rail) => (\n <View\n key={rail}\n style={[\n shared.chip,\n { backgroundColor: theme.muted, borderColor: theme.border },\n ]}\n >\n <Text style={[shared.chipText, { color: theme.foreground }]}>\n {rail}\n </Text>\n </View>\n ))}\n </View>\n </View>\n ))}\n\n <View style={[styles.expiry, { backgroundColor: theme.muted }]}>\n <Text style={[styles.strong, { color: theme.foreground }]}>\n Expires {description.expiry.relative}\n </Text>\n <Text style={[styles.small, muted]}>\n {description.expiry.absolute}\n </Text>\n </View>\n </ScrollView>\n\n {/* Outside the ScrollView so it stays on screen on short landscape phones. */}\n <View\n testID=\"payment-actions\"\n style={[\n styles.footer,\n { borderTopColor: theme.border, backgroundColor: theme.background },\n ]}\n >\n <ActionButton\n label=\"Decline\"\n variant=\"secondary\"\n onPress={onDecline}\n theme={theme}\n />\n <ActionButton\n label={busy ? \"Approving…\" : \"Approve\"}\n onPress={onApprove}\n disabled={busy}\n busy={busy}\n theme={theme}\n />\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n content: { padding: 16, gap: 12 },\n requester: { flexDirection: \"row\", alignItems: \"center\", gap: 12 },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 12,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n initial: { fontSize: 18, fontWeight: \"600\" },\n flexShrink: { flexShrink: 1 },\n small: { fontSize: 12 },\n strong: { fontWeight: \"700\" },\n card: { borderWidth: 1, borderRadius: 12, padding: 16, gap: 6 },\n assetLabel: { fontSize: 14, fontWeight: \"600\" },\n limits: { flexDirection: \"row\", gap: 12, marginVertical: 6 },\n limit: { flex: 1 },\n amount: {\n fontSize: 22,\n fontWeight: \"600\",\n fontVariant: [\"tabular-nums\"],\n },\n term: { fontSize: 14, fontWeight: \"500\", marginTop: 8 },\n chips: { flexDirection: \"row\", flexWrap: \"wrap\", gap: 6 },\n expiry: { borderRadius: 10, padding: 12, gap: 2 },\n footer: {\n flexDirection: \"row\",\n gap: 12,\n paddingHorizontal: 16,\n paddingVertical: 12,\n borderTopWidth: 1,\n },\n});\n","import { type ReactNode, useState } from \"react\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport type { NativePaymentTheme } from \"./theme\";\n\nexport type Tone = \"success\" | \"danger\" | \"warning\" | \"neutral\";\n\n/** Fill, border and text color of a tone. */\nexport function toneColors(theme: NativePaymentTheme, tone: Tone) {\n if (tone === \"success\")\n return {\n backgroundColor: theme.successBackground,\n borderColor: theme.successBorder,\n color: theme.successForeground,\n };\n if (tone === \"danger\")\n return {\n backgroundColor: theme.dangerBackground,\n borderColor: theme.dangerBorder,\n color: theme.dangerForeground,\n };\n if (tone === \"warning\")\n return {\n backgroundColor: theme.warningBackground,\n borderColor: theme.warningBorder,\n color: theme.warningForeground,\n };\n return {\n backgroundColor: theme.muted,\n borderColor: theme.border,\n color: theme.foreground,\n };\n}\n\n/** Decorative glyph, hidden from screen readers. */\nexport function Glyph({\n children,\n color,\n}: {\n children: string;\n color: string;\n}) {\n return (\n <Text\n accessible={false}\n importantForAccessibility=\"no\"\n accessibilityElementsHidden\n style={[styles.glyph, { color }]}\n >\n {children}\n </Text>\n );\n}\n\nexport function ActionButton({\n label,\n onPress,\n theme,\n variant = \"primary\",\n disabled = false,\n busy = false,\n}: {\n label: string;\n onPress: () => void;\n theme: NativePaymentTheme;\n variant?: \"primary\" | \"secondary\";\n disabled?: boolean;\n busy?: boolean;\n}) {\n const primary = variant === \"primary\";\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled, busy }}\n disabled={disabled}\n onPress={onPress}\n style={({ pressed }) => [\n styles.button,\n {\n backgroundColor: primary ? theme.primary : theme.background,\n borderColor: primary ? theme.primary : theme.border,\n opacity: disabled ? 0.55 : pressed ? 0.8 : 1,\n },\n ]}\n >\n <Text\n style={[\n styles.buttonLabel,\n { color: primary ? theme.primaryForeground : theme.foreground },\n ]}\n >\n {label}\n </Text>\n </Pressable>\n );\n}\n\n/**\n * An address or hash with an icon-only copy action. The app supplies\n * `onCopy` (Expo Clipboard, RN Clipboard, …); without it no button shows.\n */\nexport function CopyableValue({\n value,\n display,\n onCopy,\n theme,\n color = theme.foreground,\n}: {\n value: string;\n /** Shortened form from the view model; else truncated in the middle. */\n display?: string;\n onCopy?: (text: string) => void;\n theme: NativePaymentTheme;\n color?: string;\n}) {\n const [copied, setCopied] = useState(false);\n return (\n <View style={styles.copyRow}>\n <Text\n accessibilityLabel={value}\n numberOfLines={1}\n ellipsizeMode=\"middle\"\n style={[styles.mono, { color }]}\n >\n {display ?? value}\n </Text>\n {onCopy && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? `Copied ${value}` : `Copy ${value}`}\n hitSlop={6}\n onPress={() => {\n onCopy(value);\n setCopied(true);\n }}\n style={({ pressed }) => [\n styles.iconButton,\n { borderColor: theme.border, opacity: pressed ? 0.7 : 1 },\n ]}\n >\n <Glyph color={theme.foreground}>{copied ? \"✓\" : \"⧉\"}</Glyph>\n </Pressable>\n )}\n </View>\n );\n}\n\n/** A colored callout: warnings, preview verdicts, notices. */\nexport function Callout({\n tone,\n glyph,\n theme,\n role,\n children,\n}: {\n tone: Tone;\n glyph: string;\n theme: NativePaymentTheme;\n role?: \"alert\";\n children: ReactNode;\n}) {\n const colors = toneColors(theme, tone);\n return (\n <View\n accessibilityRole={role}\n style={[\n styles.callout,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{glyph}</Glyph>\n <Text style={[styles.calloutText, { color: colors.color }]}>\n {children}\n </Text>\n </View>\n );\n}\n\nexport const styles = StyleSheet.create({\n glyph: { fontSize: 16, lineHeight: 20, fontWeight: \"700\" },\n button: {\n flex: 1,\n minHeight: 48,\n minWidth: 44,\n borderRadius: 10,\n borderWidth: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 16,\n },\n buttonLabel: { fontSize: 16, fontWeight: \"600\" },\n copyRow: { flexDirection: \"row\", alignItems: \"center\", gap: 6 },\n mono: { flexShrink: 1, fontFamily: \"monospace\", fontSize: 13 },\n iconButton: {\n width: 32,\n height: 32,\n borderRadius: 8,\n borderWidth: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n callout: {\n flexDirection: \"row\",\n gap: 8,\n borderWidth: 1,\n borderRadius: 10,\n padding: 12,\n },\n calloutText: { flex: 1, fontSize: 14, lineHeight: 20 },\n label: { fontSize: 12, fontWeight: \"500\" },\n heading: { fontSize: 18, fontWeight: \"600\" },\n chip: {\n borderWidth: 1,\n borderRadius: 999,\n paddingHorizontal: 10,\n paddingVertical: 4,\n },\n chipText: { fontSize: 12 },\n});\n","import { createContext, type ReactNode, useContext } from \"react\";\nimport { useColorScheme } from \"react-native\";\n\n/**\n * Colors for the payment components. The values come from the appkit tokens\n * (`packages/ui/src/styles/tokens.css`, converted from HSL to hex). Where a\n * token pair falls below 4.5:1 on a payment surface — muted text on the muted\n * fill, the light destructive red as text — the text color is the darker\n * (light) or lighter (dark) step of the same hue, so every text/background\n * pair the components use meets WCAG AA.\n */\nexport interface NativePaymentTheme {\n scheme: \"light\" | \"dark\";\n background: string;\n foreground: string;\n card: string;\n border: string;\n muted: string;\n mutedForeground: string;\n primary: string;\n primaryForeground: string;\n /** Verified receipts and allowed previews only. */\n successBackground: string;\n successBorder: string;\n successForeground: string;\n /** Mismatch / failed receipts, blocked previews, missing restrictions. */\n dangerBackground: string;\n dangerBorder: string;\n dangerForeground: string;\n /** Non-dismissible warnings. */\n warningBackground: string;\n warningBorder: string;\n warningForeground: string;\n}\n\nexport const lightPaymentTheme: NativePaymentTheme = {\n scheme: \"light\",\n background: \"#ffffff\", // --background 0 0% 100%\n foreground: \"#020817\", // --foreground 222.2 84% 4.9%\n card: \"#ffffff\", // --card\n border: \"#e2e8f0\", // --border 214.3 31.8% 91.4%\n muted: \"#f1f5f9\", // --muted 210 40% 96.1%\n mutedForeground: \"#475569\", // --muted-foreground hue, one step darker\n primary: \"#0f172a\", // --primary 222.2 47.4% 11.2%\n primaryForeground: \"#f8fafc\", // --primary-foreground 210 40% 98%\n successBackground: \"#ecfdf5\",\n successBorder: \"#047857\",\n successForeground: \"#064e3b\",\n dangerBackground: \"#fef2f2\",\n dangerBorder: \"#ef4444\", // --destructive 0 84.2% 60.2%\n dangerForeground: \"#991b1b\",\n warningBackground: \"#fffbeb\",\n warningBorder: \"#b45309\",\n warningForeground: \"#451a03\",\n};\n\nexport const darkPaymentTheme: NativePaymentTheme = {\n scheme: \"dark\",\n background: \"#020817\", // .dark --background\n foreground: \"#f8fafc\", // .dark --foreground\n card: \"#020817\", // .dark --card\n border: \"#1e293b\", // .dark --border 217.2 32.6% 17.5%\n muted: \"#1e293b\", // .dark --muted\n mutedForeground: \"#94a3b8\", // .dark --muted-foreground 215 20.2% 65.1%\n primary: \"#f8fafc\", // .dark --primary\n primaryForeground: \"#0f172a\", // .dark --primary-foreground\n successBackground: \"#022c22\",\n successBorder: \"#10b981\",\n successForeground: \"#d1fae5\",\n dangerBackground: \"#450a0a\",\n dangerBorder: \"#f87171\",\n dangerForeground: \"#fecaca\",\n warningBackground: \"#451a03\",\n warningBorder: \"#f59e0b\",\n warningForeground: \"#fef3c7\",\n};\n\nconst ThemeContext = createContext<NativePaymentTheme | undefined>(undefined);\n\nexport function NativePaymentThemeProvider({\n theme,\n children,\n}: {\n theme: NativePaymentTheme;\n children: ReactNode;\n}) {\n return (\n <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>\n );\n}\n\n/** The `theme` prop, else the provider's theme, else the system scheme. */\nexport function useNativePaymentTheme(\n override?: NativePaymentTheme,\n): NativePaymentTheme {\n const provided = useContext(ThemeContext);\n const scheme = useColorScheme();\n return (\n override ??\n provided ??\n (scheme === \"dark\" ? darkPaymentTheme : lightPaymentTheme)\n );\n}\n","import {\n type AuthorizationAssetMetadata,\n describeAuthorization,\n formatAuthorizationAmount,\n} from \"@naculus/connect-appkit-core\";\nimport type {\n ListedAuthorization,\n ListedAuthorizationStatus,\n RevokeListedAuthorizationResult,\n} from \"@naculus/connect-core\";\nimport { useState } from \"react\";\nimport { FlatList, StyleSheet, Text, View } from \"react-native\";\nimport {\n ActionButton,\n Callout,\n CopyableValue,\n Glyph,\n styles as shared,\n toneColors,\n} from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface AuthorizationListNativeProps {\n entries: ListedAuthorization[] | { entries: ListedAuthorization[] };\n assets?: Record<string, AuthorizationAssetMetadata>;\n onRevoke: (\n entry: ListedAuthorization,\n ) =>\n | RevokeListedAuthorizationResult\n | Promise<RevokeListedAuthorizationResult>;\n /** keyId of the entry being revoked. */\n revokingId?: string;\n /** BCP 47 locale for expiry dates; English when omitted. */\n locale?: string;\n onCopy?: (text: string) => void;\n theme?: NativePaymentTheme;\n}\n\nconst ENFORCER_LABELS: Record<string, string> = {\n \"evm-session\": \"EVM session key\",\n \"solana-session\": \"Solana session key\",\n \"mpp-voucher\": \"MPP channel key\",\n};\n\nconst STATUS_GLYPHS: Record<ListedAuthorizationStatus, string> = {\n active: \"●\",\n pending: \"◐\",\n revoked: \"✕\",\n expired: \"○\",\n};\n\nfunction StatusBadge({\n status,\n theme,\n}: {\n status: ListedAuthorizationStatus;\n theme: NativePaymentTheme;\n}) {\n const colors =\n status === \"active\"\n ? {\n backgroundColor: theme.primary,\n borderColor: theme.primary,\n color: theme.primaryForeground,\n }\n : status === \"pending\"\n ? {\n backgroundColor: theme.background,\n borderColor: theme.foreground,\n color: theme.foreground,\n }\n : status === \"revoked\"\n ? toneColors(theme, \"danger\")\n : {\n backgroundColor: theme.muted,\n borderColor: theme.border,\n color: theme.mutedForeground,\n };\n return (\n <View\n accessibilityLabel={`Status: ${status}`}\n style={[\n shared.chip,\n styles.badge,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{STATUS_GLYPHS[status]}</Glyph>\n <Text style={[styles.badgeText, { color: colors.color }]}>{status}</Text>\n </View>\n );\n}\n\n/** React Native counterpart of the web `AuthorizationList`. */\nexport function AuthorizationListNative({\n entries: input,\n assets = {},\n onRevoke,\n revokingId,\n locale,\n onCopy,\n theme: themeProp,\n}: AuthorizationListNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const entries = Array.isArray(input) ? input : input.entries;\n const [confirming, setConfirming] = useState<string | null>(null);\n const [onChain, setOnChain] = useState<ReadonlySet<string>>(new Set());\n const muted = { color: theme.mutedForeground };\n\n const revoke = (entry: ListedAuthorization) =>\n void Promise.resolve(onRevoke(entry)).then((result) => {\n setConfirming(null);\n if (result.onChainRevocationRequired)\n setOnChain((current) => new Set(current).add(entry.keyId));\n });\n\n const renderItem = ({ item: entry }: { item: ListedAuthorization }) => {\n const view = describeAuthorization(entry, { assets, locale });\n const busy = revokingId === entry.keyId;\n const live = entry.status === \"active\" || entry.status === \"pending\";\n return (\n <View\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.cardHeader}>\n <View style={styles.flexShrink}>\n <Text style={[styles.title, { color: theme.foreground }]}>\n {view.label ?? view.grants.map((g) => g.assetLabel).join(\", \")}\n </Text>\n <Text style={[styles.small, muted]}>\n {ENFORCER_LABELS[entry.enforcer] ??\n entry.enforcer.replaceAll(\"-\", \" \")}\n </Text>\n </View>\n <StatusBadge status={entry.status} theme={theme} />\n </View>\n\n {view.grants.map((grant) => {\n const spent = entry.spent?.[grant.asset];\n const total = entry.grants.find(\n (g) => g.asset === grant.asset,\n )?.maxTotal;\n const percent =\n spent !== undefined && total && total > 0n\n ? Math.min(Number((spent * 100n) / total), 100)\n : 0;\n return (\n <View\n key={grant.asset}\n style={[styles.grant, { backgroundColor: theme.muted }]}\n >\n {view.label && (\n <Text style={[styles.strong, { color: theme.foreground }]}>\n {grant.assetLabel}\n </Text>\n )}\n {grant.recipients.map((recipient) => (\n <CopyableValue\n key={recipient.full}\n value={recipient.full}\n display={recipient.shortened}\n onCopy={onCopy}\n theme={theme}\n />\n ))}\n {spent !== undefined && (\n <View>\n <View style={styles.spentRow}>\n <Text style={[styles.small, { color: theme.foreground }]}>\n Spent{\" \"}\n {\n formatAuthorizationAmount(spent, assets[grant.asset])\n .formatted\n }\n </Text>\n <Text style={[styles.small, { color: theme.foreground }]}>\n Total {grant.total.formatted}\n </Text>\n </View>\n <View\n accessibilityRole=\"progressbar\"\n accessibilityLabel={`${grant.assetLabel} spent`}\n accessibilityValue={{ min: 0, max: 100, now: percent }}\n style={[\n styles.track,\n { backgroundColor: theme.background },\n ]}\n >\n <View\n style={[\n styles.fill,\n {\n width: `${percent}%`,\n backgroundColor: theme.primary,\n },\n ]}\n />\n </View>\n </View>\n )}\n </View>\n );\n })}\n\n <Text style={[styles.small, muted]}>\n {entry.status === \"expired\"\n ? \"Expired\"\n : entry.status === \"revoked\"\n ? \"Revoked\"\n : `Expires ${view.expiry.relative}`}{\" \"}\n · {view.expiry.absolute}\n </Text>\n\n {view.warnings.map((warning) => (\n <Callout\n key={warning}\n tone=\"warning\"\n glyph=\"⚠\"\n role=\"alert\"\n theme={theme}\n >\n {warning}\n </Callout>\n ))}\n\n {onChain.has(entry.keyId) && (\n <Callout tone=\"warning\" glyph=\"⛓\" theme={theme}>\n Local access is revoked. Complete the on-chain revocation to stop\n this authorization on chain.\n </Callout>\n )}\n\n {live && (\n <View style={[styles.actions, { borderTopColor: theme.border }]}>\n {confirming === entry.keyId ? (\n <>\n <ActionButton\n label=\"Cancel\"\n variant=\"secondary\"\n onPress={() => setConfirming(null)}\n theme={theme}\n />\n <ActionButton\n label={busy ? \"Revoking…\" : \"Confirm revoke\"}\n disabled={busy}\n busy={busy}\n onPress={() => revoke(entry)}\n theme={theme}\n />\n </>\n ) : (\n <ActionButton\n label=\"Revoke\"\n variant=\"secondary\"\n onPress={() => setConfirming(entry.keyId)}\n theme={theme}\n />\n )}\n </View>\n )}\n </View>\n );\n };\n\n return (\n <FlatList\n data={entries}\n keyExtractor={(entry) => entry.keyId}\n renderItem={renderItem}\n extraData={[confirming, onChain, revokingId, theme]}\n contentContainerStyle={styles.list}\n style={{ backgroundColor: theme.background }}\n ListHeaderComponent={\n entries.length ? (\n <Text\n accessibilityRole=\"header\"\n style={[shared.heading, { color: theme.foreground }]}\n >\n Payment authorizations\n </Text>\n ) : undefined\n }\n ListEmptyComponent={\n <View style={[styles.empty, { borderColor: theme.border }]}>\n <Text\n accessibilityRole=\"header\"\n style={[styles.title, { color: theme.foreground }]}\n >\n No payment authorizations\n </Text>\n <Text style={[styles.body, muted]}>\n Approvals you create will appear here.\n </Text>\n </View>\n }\n />\n );\n}\n\nconst styles = StyleSheet.create({\n list: { padding: 16, gap: 12 },\n card: { borderWidth: 1, borderRadius: 12, padding: 16, gap: 10 },\n cardHeader: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: 8,\n },\n flexShrink: { flexShrink: 1 },\n title: { fontSize: 16, fontWeight: \"600\" },\n small: { fontSize: 12 },\n body: { fontSize: 14, textAlign: \"center\" },\n strong: { fontSize: 14, fontWeight: \"500\" },\n badge: { flexDirection: \"row\", alignItems: \"center\", gap: 4 },\n badgeText: { fontSize: 12, fontWeight: \"600\", textTransform: \"capitalize\" },\n grant: { borderRadius: 10, padding: 12, gap: 6 },\n spentRow: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n gap: 8,\n },\n track: { height: 8, borderRadius: 4, overflow: \"hidden\", marginTop: 4 },\n fill: { height: \"100%\" },\n actions: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n gap: 8,\n borderTopWidth: 1,\n paddingTop: 12,\n },\n empty: {\n borderWidth: 1,\n borderStyle: \"dashed\",\n borderRadius: 12,\n padding: 32,\n alignItems: \"center\",\n gap: 4,\n },\n});\n","import {\n type AuthorizationAssetMetadata,\n formatAuthorizationAmount,\n type PaymentRecord,\n type PaymentVerificationStatus,\n} from \"@naculus/connect-appkit-core\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport { CopyableValue, Glyph, type Tone, toneColors } from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface PaymentReceiptNativeProps {\n record: PaymentRecord;\n assets?: Record<string, AuthorizationAssetMetadata>;\n /**\n * Accepted for parity with the other payment components; the receipt has\n * no locale-dependent text yet (amounts use the core formatter).\n */\n locale?: string;\n /** Shows \"View on explorer\" when set and the record has a reference. */\n onOpenExplorer?: (record: PaymentRecord) => void;\n /** Copies the recipient or settlement reference. */\n onCopy?: (text: string) => void;\n theme?: NativePaymentTheme;\n}\n\nconst VERIFICATION: Record<\n PaymentVerificationStatus,\n { title: string; detail: string; glyph: string; tone: Tone }\n> = {\n unverified: {\n title: \"Unverified\",\n detail: \"Reported by the server, not yet checked.\",\n glyph: \"?\",\n tone: \"neutral\",\n },\n pending: {\n title: \"Checking\",\n detail: \"Checking on chain.\",\n glyph: \"…\",\n tone: \"neutral\",\n },\n verified: {\n title: \"Verified\",\n detail: \"Verified on chain.\",\n glyph: \"✓\",\n tone: \"success\",\n },\n mismatch: {\n title: \"Mismatch\",\n detail: \"The on-chain settlement does not match this payment.\",\n glyph: \"!\",\n tone: \"danger\",\n },\n failed: {\n title: \"Verification failed\",\n detail: \"The settlement could not be verified.\",\n glyph: \"!\",\n tone: \"danger\",\n },\n unavailable: {\n title: \"Verification unavailable\",\n detail: \"On-chain checking is unavailable. Retry later.\",\n glyph: \"?\",\n tone: \"neutral\",\n },\n};\n\n/** React Native counterpart of the web `PaymentReceipt`. */\nexport function PaymentReceiptNative({\n record,\n assets = {},\n onOpenExplorer,\n onCopy,\n theme: themeProp,\n}: PaymentReceiptNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const status = record.verification.status;\n const state = VERIFICATION[status];\n const colors = toneColors(theme, state.tone);\n const muted = { color: theme.mutedForeground };\n const amount =\n record.amount === null\n ? \"Amount not reported\"\n : /^\\d+$/.test(record.amount)\n ? formatAuthorizationAmount(\n BigInt(record.amount),\n record.asset ? assets[record.asset] : undefined,\n ).formatted\n : `${record.amount} base units`;\n\n return (\n <View\n testID={`verification-${status}`}\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.header}>\n <Text style={[styles.eyebrow, muted]}>PAYMENT RECEIPT</Text>\n <Text\n accessibilityRole=\"header\"\n style={[styles.amount, { color: theme.foreground }]}\n >\n {amount}\n </Text>\n <Text style={[styles.small, muted]}>\n {record.asset\n ? (assets[record.asset]?.symbol ?? record.asset)\n : \"Asset not reported\"}\n </Text>\n </View>\n\n <View\n testID=\"verification-panel\"\n accessibilityLiveRegion=\"polite\"\n accessible\n accessibilityLabel={`${state.title}. ${state.detail}${record.verification.reason ? ` Reason: ${record.verification.reason}` : \"\"}`}\n style={[\n styles.panel,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{state.glyph}</Glyph>\n <View style={styles.flexShrink}>\n <Text style={[styles.badge, { color: colors.color }]}>\n {state.title}\n </Text>\n <Text style={[styles.body, { color: colors.color }]}>\n {state.detail}\n </Text>\n {record.verification.reason && (\n <Text\n numberOfLines={2}\n style={[styles.body, styles.strong, { color: colors.color }]}\n >\n Reason: {record.verification.reason}\n </Text>\n )}\n </View>\n </View>\n\n <View style={styles.field}>\n <Text style={[styles.small, muted]}>Recipient</Text>\n {record.payTo ? (\n <CopyableValue value={record.payTo} onCopy={onCopy} theme={theme} />\n ) : (\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not reported\n </Text>\n )}\n </View>\n <View style={styles.row}>\n <View style={styles.cell}>\n <Text style={[styles.small, muted]}>Protocol</Text>\n <Text style={[styles.body, { color: theme.foreground }]}>\n {record.protocol === \"mpp\" ? \"MPP\" : record.protocol}\n </Text>\n </View>\n <View style={styles.cell}>\n <Text style={[styles.small, muted]}>Time</Text>\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not recorded\n </Text>\n </View>\n </View>\n <View style={styles.field}>\n <Text style={[styles.small, muted]}>Settlement reference</Text>\n {record.reference ? (\n <>\n <CopyableValue\n value={record.reference}\n onCopy={onCopy}\n theme={theme}\n />\n {onOpenExplorer && (\n <Pressable\n accessibilityRole=\"link\"\n accessibilityLabel=\"View on explorer\"\n onPress={() => onOpenExplorer(record)}\n style={styles.link}\n >\n <Text style={[styles.linkText, { color: theme.foreground }]}>\n View on explorer ↗\n </Text>\n </Pressable>\n )}\n </>\n ) : (\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not reported\n </Text>\n )}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderWidth: 1, borderRadius: 16, padding: 20, gap: 16 },\n header: { alignItems: \"center\", gap: 4 },\n eyebrow: { fontSize: 12, fontWeight: \"500\", letterSpacing: 0.6 },\n amount: {\n fontSize: 32,\n fontWeight: \"600\",\n fontVariant: [\"tabular-nums\"],\n textAlign: \"center\",\n },\n small: { fontSize: 12 },\n body: { fontSize: 14, lineHeight: 20 },\n strong: { fontWeight: \"600\" },\n // Fixed height: badge, explanation and a two-line reason fit, so the card\n // does not jump as verification moves from pending to its final state.\n panel: {\n height: 128,\n flexDirection: \"row\",\n gap: 8,\n borderWidth: 1,\n borderRadius: 10,\n padding: 12,\n overflow: \"hidden\",\n },\n flexShrink: { flexShrink: 1 },\n badge: { fontSize: 13, fontWeight: \"700\", marginBottom: 2 },\n field: { gap: 4 },\n row: { flexDirection: \"row\", gap: 12 },\n cell: { flex: 1, gap: 4 },\n link: { minHeight: 44, minWidth: 44, justifyContent: \"center\" },\n linkText: {\n fontSize: 13,\n fontWeight: \"500\",\n textDecorationLine: \"underline\",\n },\n});\n"],"mappings":"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","names":["import_react_native","import_react","import_react_native","import_jsx_runtime","import_jsx_runtime","styles","import_connect_appkit_core","import_react","import_react_native","import_jsx_runtime","styles","import_connect_appkit_core","import_react_native","import_jsx_runtime","styles"]}
1
+ {"version":3,"sources":["../../src/ui/index.ts","../../src/ui/AuthorizationConsentNative.tsx","../../src/ui/parts.tsx","../../src/ui/theme.tsx","../../src/ui/AuthorizationListNative.tsx","../../src/ui/PaymentReceiptNative.tsx"],"sourcesContent":["/**\n * React Native payment UI, published as `@naculus/connect-native/ui` so apps\n * that only need the wallet connectors do not load it.\n */\nexport {\n AuthorizationConsentNative,\n type AuthorizationConsentNativeProps,\n} from \"./AuthorizationConsentNative\";\nexport {\n AuthorizationListNative,\n type AuthorizationListNativeProps,\n} from \"./AuthorizationListNative\";\nexport {\n PaymentReceiptNative,\n type PaymentReceiptNativeProps,\n} from \"./PaymentReceiptNative\";\nexport {\n darkPaymentTheme,\n lightPaymentTheme,\n type NativePaymentTheme,\n NativePaymentThemeProvider,\n useNativePaymentTheme,\n} from \"./theme\";\n","import {\n type AuthorizationAssetMetadata,\n type AuthorizationDescription,\n describeAuthorization,\n type SpendExplanation,\n} from \"@naculus/connect-appkit-core\";\nimport type { Authorization, ListedAuthorization } from \"@naculus/connect-core\";\nimport { Image, ScrollView, StyleSheet, Text, View } from \"react-native\";\nimport {\n ActionButton,\n Callout,\n CopyableValue,\n styles as shared,\n} from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface AuthorizationConsentNativeProps {\n /** Who asks: shown as \"Allow {name} to pay?\". */\n requester: { name: string; icon?: string; origin?: string };\n /** A raw authorization, or a description already built by the caller. */\n authorization: Authorization | ListedAuthorization | AuthorizationDescription;\n assets?: Record<string, AuthorizationAssetMetadata>;\n trustedAssets?: readonly string[];\n /** `explainSpend` result for the payment that triggered this consent. */\n preview?: SpendExplanation;\n onApprove: () => void;\n onDecline: () => void;\n /** Disables Approve and shows \"Approving…\". */\n busy?: boolean;\n /** Copies a recipient address; the copy button shows only when set. */\n onCopy?: (text: string) => void;\n /** BCP 47 locale for the expiry; English when omitted. */\n locale?: string;\n /** Unix timestamp in seconds, for a stable relative expiry. */\n now?: number;\n enforcement?: \"on-chain\" | \"device\";\n theme?: NativePaymentTheme;\n}\n\n/** React Native counterpart of the web `AuthorizationConsent`. */\nexport function AuthorizationConsentNative({\n authorization,\n assets = {},\n trustedAssets,\n locale,\n now,\n enforcement,\n requester,\n preview,\n onApprove,\n onDecline,\n busy = false,\n onCopy,\n theme: themeProp,\n}: AuthorizationConsentNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const description =\n \"expiry\" in authorization\n ? authorization\n : describeAuthorization(authorization, {\n assets,\n trustedAssets,\n locale,\n now,\n enforcement,\n });\n const muted = { color: theme.mutedForeground };\n\n return (\n <View style={[styles.root, { backgroundColor: theme.background }]}>\n <ScrollView contentContainerStyle={styles.content}>\n <View style={styles.requester}>\n {requester.icon ? (\n <Image\n accessibilityIgnoresInvertColors\n source={{ uri: requester.icon }}\n style={styles.avatar}\n />\n ) : (\n <View\n importantForAccessibility=\"no\"\n style={[styles.avatar, { backgroundColor: theme.muted }]}\n >\n <Text style={[styles.initial, { color: theme.foreground }]}>\n {requester.name.slice(0, 1).toUpperCase()}\n </Text>\n </View>\n )}\n <View style={styles.flexShrink}>\n <Text\n accessibilityRole=\"header\"\n style={[shared.heading, { color: theme.foreground }]}\n >\n Allow {requester.name} to pay?\n </Text>\n {requester.origin && (\n <Text style={[styles.small, muted]}>{requester.origin}</Text>\n )}\n </View>\n </View>\n\n {description.warnings.map((warning) => (\n <Callout\n key={warning}\n tone=\"warning\"\n glyph=\"⚠\"\n role=\"alert\"\n theme={theme}\n >\n <Text style={styles.strong}>{warning}</Text>\n </Callout>\n ))}\n\n {preview && (\n <Callout\n tone={preview.allowed ? \"success\" : \"danger\"}\n glyph={preview.allowed ? \"✓\" : \"✕\"}\n theme={theme}\n >\n <Text style={styles.strong}>\n {preview.allowed ? \"Allowed\" : \"Blocked\"}.\n </Text>{\" \"}\n {preview.sentence}\n </Callout>\n )}\n\n {description.grants.map((grant) => (\n <View\n key={`${grant.asset}:${grant.recipients.map((r) => r.full).join(\",\")}:${grant.perPayment.formatted}:${grant.total.formatted}`}\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <Text style={[styles.assetLabel, { color: theme.foreground }]}>\n {grant.assetLabel}\n </Text>\n {grant.assetTrust === \"unverified\" && (\n <Callout tone=\"warning\" glyph=\"⚠\" role=\"alert\" theme={theme}>\n <Text style={styles.strong}>\n Unverified token — not on the trusted list\n </Text>\n </Callout>\n )}\n <View style={styles.limits}>\n <View style={styles.limit}>\n <Text style={[shared.label, muted]}>Per payment</Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n {grant.perPayment.formatted}\n </Text>\n </View>\n <View style={styles.limit}>\n <Text style={[shared.label, muted]}>Total limit</Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n {grant.total.formatted}\n </Text>\n </View>\n </View>\n {grant.period && (\n <View>\n <Text style={[styles.term, { color: theme.foreground }]}>\n Period limit\n </Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n Up to {grant.period.amount.formatted} every{\" \"}\n {grant.period.every}\n </Text>\n <Text style={[styles.small, muted]}>\n Starts {grant.period.startsAt}\n </Text>\n </View>\n )}\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Recipients\n </Text>\n {grant.recipients.length ? (\n grant.recipients.map((recipient) => (\n <CopyableValue\n key={recipient.full}\n value={recipient.full}\n display={recipient.shortened}\n onCopy={onCopy}\n theme={theme}\n />\n ))\n ) : (\n <Text style={[styles.strong, { color: theme.dangerForeground }]}>\n No recipient restriction is displayed\n </Text>\n )}\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Payment count\n </Text>\n <Text style={[styles.small, muted]}>\n {grant.count === null ? \"No count limit\" : `Up to ${grant.count}`}\n </Text>\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Payment methods\n </Text>\n <View style={styles.chips}>\n {grant.rails.map((rail) => (\n <View\n key={rail}\n style={[\n shared.chip,\n { backgroundColor: theme.muted, borderColor: theme.border },\n ]}\n >\n <Text style={[shared.chipText, { color: theme.foreground }]}>\n {rail}\n </Text>\n </View>\n ))}\n </View>\n </View>\n ))}\n\n {description.enforcementLabel && (\n <Text style={[styles.strong, { color: theme.foreground }]}>\n {description.enforcementLabel}\n </Text>\n )}\n\n <View style={[styles.expiry, { backgroundColor: theme.muted }]}>\n <Text style={[styles.strong, { color: theme.foreground }]}>\n Expires {description.expiry.relative}\n </Text>\n <Text style={[styles.small, muted]}>\n {description.expiry.absolute}\n </Text>\n </View>\n </ScrollView>\n\n {/* Outside the ScrollView so it stays on screen on short landscape phones. */}\n <View\n testID=\"payment-actions\"\n style={[\n styles.footer,\n { borderTopColor: theme.border, backgroundColor: theme.background },\n ]}\n >\n <ActionButton\n label=\"Decline\"\n variant=\"secondary\"\n onPress={onDecline}\n theme={theme}\n />\n <ActionButton\n label={busy ? \"Approving…\" : \"Approve\"}\n onPress={onApprove}\n disabled={busy}\n busy={busy}\n theme={theme}\n />\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n content: { padding: 16, gap: 12 },\n requester: { flexDirection: \"row\", alignItems: \"center\", gap: 12 },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 12,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n initial: { fontSize: 18, fontWeight: \"600\" },\n flexShrink: { flexShrink: 1 },\n small: { fontSize: 12 },\n strong: { fontWeight: \"700\" },\n card: { borderWidth: 1, borderRadius: 12, padding: 16, gap: 6 },\n assetLabel: { fontSize: 14, fontWeight: \"600\" },\n limits: { flexDirection: \"row\", gap: 12, marginVertical: 6 },\n limit: { flex: 1 },\n amount: {\n fontSize: 22,\n fontWeight: \"600\",\n fontVariant: [\"tabular-nums\"],\n },\n term: { fontSize: 14, fontWeight: \"500\", marginTop: 8 },\n chips: { flexDirection: \"row\", flexWrap: \"wrap\", gap: 6 },\n expiry: { borderRadius: 10, padding: 12, gap: 2 },\n footer: {\n flexDirection: \"row\",\n gap: 12,\n paddingHorizontal: 16,\n paddingVertical: 12,\n borderTopWidth: 1,\n },\n});\n","import { type ReactNode, useState } from \"react\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport type { NativePaymentTheme } from \"./theme\";\n\nexport type Tone = \"success\" | \"danger\" | \"warning\" | \"neutral\";\n\n/** Fill, border and text color of a tone. */\nexport function toneColors(theme: NativePaymentTheme, tone: Tone) {\n if (tone === \"success\")\n return {\n backgroundColor: theme.successBackground,\n borderColor: theme.successBorder,\n color: theme.successForeground,\n };\n if (tone === \"danger\")\n return {\n backgroundColor: theme.dangerBackground,\n borderColor: theme.dangerBorder,\n color: theme.dangerForeground,\n };\n if (tone === \"warning\")\n return {\n backgroundColor: theme.warningBackground,\n borderColor: theme.warningBorder,\n color: theme.warningForeground,\n };\n return {\n backgroundColor: theme.muted,\n borderColor: theme.border,\n color: theme.foreground,\n };\n}\n\n/** Decorative glyph, hidden from screen readers. */\nexport function Glyph({\n children,\n color,\n}: {\n children: string;\n color: string;\n}) {\n return (\n <Text\n accessible={false}\n importantForAccessibility=\"no\"\n accessibilityElementsHidden\n style={[styles.glyph, { color }]}\n >\n {children}\n </Text>\n );\n}\n\nexport function ActionButton({\n label,\n onPress,\n theme,\n variant = \"primary\",\n disabled = false,\n busy = false,\n}: {\n label: string;\n onPress: () => void;\n theme: NativePaymentTheme;\n variant?: \"primary\" | \"secondary\";\n disabled?: boolean;\n busy?: boolean;\n}) {\n const primary = variant === \"primary\";\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled, busy }}\n disabled={disabled}\n onPress={onPress}\n style={({ pressed }) => [\n styles.button,\n {\n backgroundColor: primary ? theme.primary : theme.background,\n borderColor: primary ? theme.primary : theme.border,\n opacity: disabled ? 0.55 : pressed ? 0.8 : 1,\n },\n ]}\n >\n <Text\n style={[\n styles.buttonLabel,\n { color: primary ? theme.primaryForeground : theme.foreground },\n ]}\n >\n {label}\n </Text>\n </Pressable>\n );\n}\n\n/**\n * An address or hash with an icon-only copy action. The app supplies\n * `onCopy` (Expo Clipboard, RN Clipboard, …); without it no button shows.\n */\nexport function CopyableValue({\n value,\n display,\n onCopy,\n theme,\n color = theme.foreground,\n}: {\n value: string;\n /** Shortened form from the view model; else truncated in the middle. */\n display?: string;\n onCopy?: (text: string) => void;\n theme: NativePaymentTheme;\n color?: string;\n}) {\n const [copied, setCopied] = useState(false);\n return (\n <View style={styles.copyRow}>\n <Text\n accessibilityLabel={value}\n numberOfLines={1}\n ellipsizeMode=\"middle\"\n style={[styles.mono, { color }]}\n >\n {display ?? value}\n </Text>\n {onCopy && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? `Copied ${value}` : `Copy ${value}`}\n hitSlop={6}\n onPress={() => {\n onCopy(value);\n setCopied(true);\n }}\n style={({ pressed }) => [\n styles.iconButton,\n { borderColor: theme.border, opacity: pressed ? 0.7 : 1 },\n ]}\n >\n <Glyph color={theme.foreground}>{copied ? \"✓\" : \"⧉\"}</Glyph>\n </Pressable>\n )}\n </View>\n );\n}\n\n/** A colored callout: warnings, preview verdicts, notices. */\nexport function Callout({\n tone,\n glyph,\n theme,\n role,\n children,\n}: {\n tone: Tone;\n glyph: string;\n theme: NativePaymentTheme;\n role?: \"alert\";\n children: ReactNode;\n}) {\n const colors = toneColors(theme, tone);\n return (\n <View\n accessibilityRole={role}\n style={[\n styles.callout,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{glyph}</Glyph>\n <Text style={[styles.calloutText, { color: colors.color }]}>\n {children}\n </Text>\n </View>\n );\n}\n\nexport const styles = StyleSheet.create({\n glyph: { fontSize: 16, lineHeight: 20, fontWeight: \"700\" },\n button: {\n flex: 1,\n minHeight: 48,\n minWidth: 44,\n borderRadius: 10,\n borderWidth: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 16,\n },\n buttonLabel: { fontSize: 16, fontWeight: \"600\" },\n copyRow: { flexDirection: \"row\", alignItems: \"center\", gap: 6 },\n mono: { flexShrink: 1, fontFamily: \"monospace\", fontSize: 13 },\n iconButton: {\n width: 32,\n height: 32,\n borderRadius: 8,\n borderWidth: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n callout: {\n flexDirection: \"row\",\n gap: 8,\n borderWidth: 1,\n borderRadius: 10,\n padding: 12,\n },\n calloutText: { flex: 1, fontSize: 14, lineHeight: 20 },\n label: { fontSize: 12, fontWeight: \"500\" },\n heading: { fontSize: 18, fontWeight: \"600\" },\n chip: {\n borderWidth: 1,\n borderRadius: 999,\n paddingHorizontal: 10,\n paddingVertical: 4,\n },\n chipText: { fontSize: 12 },\n});\n","import { createContext, type ReactNode, useContext } from \"react\";\nimport { useColorScheme } from \"react-native\";\n\n/**\n * Colors for the payment components. The values come from the appkit tokens\n * (`packages/ui/src/styles/tokens.css`, converted from HSL to hex). Where a\n * token pair falls below 4.5:1 on a payment surface — muted text on the muted\n * fill, the light destructive red as text — the text color is the darker\n * (light) or lighter (dark) step of the same hue, so every text/background\n * pair the components use meets WCAG AA.\n */\nexport interface NativePaymentTheme {\n scheme: \"light\" | \"dark\";\n background: string;\n foreground: string;\n card: string;\n border: string;\n muted: string;\n mutedForeground: string;\n primary: string;\n primaryForeground: string;\n /** Verified receipts and allowed previews only. */\n successBackground: string;\n successBorder: string;\n successForeground: string;\n /** Mismatch / failed receipts, blocked previews, missing restrictions. */\n dangerBackground: string;\n dangerBorder: string;\n dangerForeground: string;\n /** Non-dismissible warnings. */\n warningBackground: string;\n warningBorder: string;\n warningForeground: string;\n}\n\nexport const lightPaymentTheme: NativePaymentTheme = {\n scheme: \"light\",\n background: \"#ffffff\", // --background 0 0% 100%\n foreground: \"#020817\", // --foreground 222.2 84% 4.9%\n card: \"#ffffff\", // --card\n border: \"#e2e8f0\", // --border 214.3 31.8% 91.4%\n muted: \"#f1f5f9\", // --muted 210 40% 96.1%\n mutedForeground: \"#475569\", // --muted-foreground hue, one step darker\n primary: \"#0f172a\", // --primary 222.2 47.4% 11.2%\n primaryForeground: \"#f8fafc\", // --primary-foreground 210 40% 98%\n successBackground: \"#ecfdf5\",\n successBorder: \"#047857\",\n successForeground: \"#064e3b\",\n dangerBackground: \"#fef2f2\",\n dangerBorder: \"#ef4444\", // --destructive 0 84.2% 60.2%\n dangerForeground: \"#991b1b\",\n warningBackground: \"#fffbeb\",\n warningBorder: \"#b45309\",\n warningForeground: \"#451a03\",\n};\n\nexport const darkPaymentTheme: NativePaymentTheme = {\n scheme: \"dark\",\n background: \"#020817\", // .dark --background\n foreground: \"#f8fafc\", // .dark --foreground\n card: \"#020817\", // .dark --card\n border: \"#1e293b\", // .dark --border 217.2 32.6% 17.5%\n muted: \"#1e293b\", // .dark --muted\n mutedForeground: \"#94a3b8\", // .dark --muted-foreground 215 20.2% 65.1%\n primary: \"#f8fafc\", // .dark --primary\n primaryForeground: \"#0f172a\", // .dark --primary-foreground\n successBackground: \"#022c22\",\n successBorder: \"#10b981\",\n successForeground: \"#d1fae5\",\n dangerBackground: \"#450a0a\",\n dangerBorder: \"#f87171\",\n dangerForeground: \"#fecaca\",\n warningBackground: \"#451a03\",\n warningBorder: \"#f59e0b\",\n warningForeground: \"#fef3c7\",\n};\n\nconst ThemeContext = createContext<NativePaymentTheme | undefined>(undefined);\n\nexport function NativePaymentThemeProvider({\n theme,\n children,\n}: {\n theme: NativePaymentTheme;\n children: ReactNode;\n}) {\n return (\n <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>\n );\n}\n\n/** The `theme` prop, else the provider's theme, else the system scheme. */\nexport function useNativePaymentTheme(\n override?: NativePaymentTheme,\n): NativePaymentTheme {\n const provided = useContext(ThemeContext);\n const scheme = useColorScheme();\n return (\n override ??\n provided ??\n (scheme === \"dark\" ? darkPaymentTheme : lightPaymentTheme)\n );\n}\n","import {\n type AuthorizationAssetMetadata,\n describeAuthorization,\n formatAuthorizationAmount,\n} from \"@naculus/connect-appkit-core\";\nimport type {\n ListedAuthorization,\n ListedAuthorizationStatus,\n RevokeListedAuthorizationResult,\n} from \"@naculus/connect-core\";\nimport { useState } from \"react\";\nimport { FlatList, StyleSheet, Text, View } from \"react-native\";\nimport {\n ActionButton,\n Callout,\n CopyableValue,\n Glyph,\n styles as shared,\n toneColors,\n} from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface AuthorizationListNativeProps {\n entries: ListedAuthorization[] | { entries: ListedAuthorization[] };\n assets?: Record<string, AuthorizationAssetMetadata>;\n trustedAssets?: readonly string[];\n onRevoke: (\n entry: ListedAuthorization,\n ) =>\n | RevokeListedAuthorizationResult\n | Promise<RevokeListedAuthorizationResult>;\n /** keyId of the entry being revoked. */\n revokingId?: string;\n /** BCP 47 locale for expiry dates; English when omitted. */\n locale?: string;\n getEnforcement?: (\n entry: ListedAuthorization,\n ) => \"on-chain\" | \"device\" | undefined;\n onCopy?: (text: string) => void;\n theme?: NativePaymentTheme;\n}\n\nconst ENFORCER_LABELS: Record<string, string> = {\n \"evm-session\": \"EVM session key\",\n \"solana-session\": \"Solana session key\",\n \"mpp-voucher\": \"MPP channel key\",\n};\n\nconst STATUS_GLYPHS: Record<ListedAuthorizationStatus, string> = {\n active: \"●\",\n pending: \"◐\",\n revoked: \"✕\",\n expired: \"○\",\n};\n\nfunction StatusBadge({\n status,\n theme,\n}: {\n status: ListedAuthorizationStatus;\n theme: NativePaymentTheme;\n}) {\n const colors =\n status === \"active\"\n ? {\n backgroundColor: theme.primary,\n borderColor: theme.primary,\n color: theme.primaryForeground,\n }\n : status === \"pending\"\n ? {\n backgroundColor: theme.background,\n borderColor: theme.foreground,\n color: theme.foreground,\n }\n : status === \"revoked\"\n ? toneColors(theme, \"danger\")\n : {\n backgroundColor: theme.muted,\n borderColor: theme.border,\n color: theme.mutedForeground,\n };\n return (\n <View\n accessibilityLabel={`Status: ${status}`}\n style={[\n shared.chip,\n styles.badge,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{STATUS_GLYPHS[status]}</Glyph>\n <Text style={[styles.badgeText, { color: colors.color }]}>{status}</Text>\n </View>\n );\n}\n\n/** React Native counterpart of the web `AuthorizationList`. */\nexport function AuthorizationListNative({\n entries: input,\n assets = {},\n trustedAssets,\n onRevoke,\n revokingId,\n locale,\n getEnforcement,\n onCopy,\n theme: themeProp,\n}: AuthorizationListNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const entries = Array.isArray(input) ? input : input.entries;\n const [confirming, setConfirming] = useState<string | null>(null);\n const [onChain, setOnChain] = useState<ReadonlySet<string>>(new Set());\n const muted = { color: theme.mutedForeground };\n\n const revoke = (entry: ListedAuthorization) =>\n void Promise.resolve(onRevoke(entry)).then((result) => {\n setConfirming(null);\n if (result.onChainRevocationRequired)\n setOnChain((current) => new Set(current).add(entry.keyId));\n });\n\n const renderItem = ({ item: entry }: { item: ListedAuthorization }) => {\n const view = describeAuthorization(entry, {\n assets,\n trustedAssets,\n locale,\n enforcement: getEnforcement?.(entry),\n });\n const busy = revokingId === entry.keyId;\n const live = entry.status === \"active\" || entry.status === \"pending\";\n return (\n <View\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.cardHeader}>\n <View style={styles.flexShrink}>\n <Text style={[styles.title, { color: theme.foreground }]}>\n {view.label ?? view.grants.map((g) => g.assetLabel).join(\", \")}\n </Text>\n <Text style={[styles.small, muted]}>\n {ENFORCER_LABELS[entry.enforcer] ??\n entry.enforcer.replaceAll(\"-\", \" \")}\n </Text>\n </View>\n <StatusBadge status={entry.status} theme={theme} />\n </View>\n\n {view.grants.map((grant) => {\n const spent = entry.spent?.[grant.asset];\n const total = entry.grants.find(\n (g) => g.asset === grant.asset,\n )?.maxTotal;\n const percent =\n spent !== undefined && total && total > 0n\n ? Math.min(Number((spent * 100n) / total), 100)\n : 0;\n return (\n <View\n key={grant.asset}\n style={[styles.grant, { backgroundColor: theme.muted }]}\n >\n {view.label && (\n <Text style={[styles.strong, { color: theme.foreground }]}>\n {grant.assetLabel}\n </Text>\n )}\n {grant.assetTrust === \"unverified\" && (\n <Callout tone=\"warning\" glyph=\"⚠\" role=\"alert\" theme={theme}>\n Unverified token — not on the trusted list\n </Callout>\n )}\n {grant.recipients.map((recipient) => (\n <CopyableValue\n key={recipient.full}\n value={recipient.full}\n display={recipient.shortened}\n onCopy={onCopy}\n theme={theme}\n />\n ))}\n {grant.period && (\n <View>\n <Text style={[styles.strong, { color: theme.foreground }]}>\n Up to {grant.period.amount.formatted} every{\" \"}\n {grant.period.every}\n </Text>\n <Text style={[styles.small, muted]}>\n Starts {grant.period.startsAt}\n </Text>\n </View>\n )}\n {spent !== undefined && (\n <View>\n <View style={styles.spentRow}>\n <Text style={[styles.small, { color: theme.foreground }]}>\n Spent{\" \"}\n {\n formatAuthorizationAmount(\n spent,\n grant.assetTrust === \"unverified\"\n ? undefined\n : assets[grant.asset],\n ).formatted\n }\n </Text>\n <Text style={[styles.small, { color: theme.foreground }]}>\n Total {grant.total.formatted}\n </Text>\n </View>\n <View\n accessibilityRole=\"progressbar\"\n accessibilityLabel={`${grant.assetLabel} spent`}\n accessibilityValue={{ min: 0, max: 100, now: percent }}\n style={[\n styles.track,\n { backgroundColor: theme.background },\n ]}\n >\n <View\n style={[\n styles.fill,\n {\n width: `${percent}%`,\n backgroundColor: theme.primary,\n },\n ]}\n />\n </View>\n </View>\n )}\n </View>\n );\n })}\n\n {view.enforcementLabel && (\n <Text style={[styles.strong, { color: theme.foreground }]}>\n {view.enforcementLabel}\n </Text>\n )}\n\n <Text style={[styles.small, muted]}>\n {entry.status === \"expired\"\n ? \"Expired\"\n : entry.status === \"revoked\"\n ? \"Revoked\"\n : `Expires ${view.expiry.relative}`}{\" \"}\n · {view.expiry.absolute}\n </Text>\n\n {view.warnings.map((warning) => (\n <Callout\n key={warning}\n tone=\"warning\"\n glyph=\"⚠\"\n role=\"alert\"\n theme={theme}\n >\n {warning}\n </Callout>\n ))}\n\n {onChain.has(entry.keyId) && (\n <Callout tone=\"warning\" glyph=\"⛓\" theme={theme}>\n Local access is revoked. Complete the on-chain revocation to stop\n this authorization on chain.\n </Callout>\n )}\n\n {live && (\n <View style={[styles.actions, { borderTopColor: theme.border }]}>\n {confirming === entry.keyId ? (\n <>\n <ActionButton\n label=\"Cancel\"\n variant=\"secondary\"\n onPress={() => setConfirming(null)}\n theme={theme}\n />\n <ActionButton\n label={busy ? \"Revoking…\" : \"Confirm revoke\"}\n disabled={busy}\n busy={busy}\n onPress={() => revoke(entry)}\n theme={theme}\n />\n </>\n ) : (\n <ActionButton\n label=\"Revoke\"\n variant=\"secondary\"\n onPress={() => setConfirming(entry.keyId)}\n theme={theme}\n />\n )}\n </View>\n )}\n </View>\n );\n };\n\n return (\n <FlatList\n data={entries}\n keyExtractor={(entry) => entry.keyId}\n renderItem={renderItem}\n extraData={[confirming, onChain, revokingId, theme]}\n contentContainerStyle={styles.list}\n style={{ backgroundColor: theme.background }}\n ListHeaderComponent={\n entries.length ? (\n <Text\n accessibilityRole=\"header\"\n style={[shared.heading, { color: theme.foreground }]}\n >\n Payment authorizations\n </Text>\n ) : undefined\n }\n ListEmptyComponent={\n <View style={[styles.empty, { borderColor: theme.border }]}>\n <Text\n accessibilityRole=\"header\"\n style={[styles.title, { color: theme.foreground }]}\n >\n No payment authorizations\n </Text>\n <Text style={[styles.body, muted]}>\n Approvals you create will appear here.\n </Text>\n </View>\n }\n />\n );\n}\n\nconst styles = StyleSheet.create({\n list: { padding: 16, gap: 12 },\n card: { borderWidth: 1, borderRadius: 12, padding: 16, gap: 10 },\n cardHeader: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: 8,\n },\n flexShrink: { flexShrink: 1 },\n title: { fontSize: 16, fontWeight: \"600\" },\n small: { fontSize: 12 },\n body: { fontSize: 14, textAlign: \"center\" },\n strong: { fontSize: 14, fontWeight: \"500\" },\n badge: { flexDirection: \"row\", alignItems: \"center\", gap: 4 },\n badgeText: { fontSize: 12, fontWeight: \"600\", textTransform: \"capitalize\" },\n grant: { borderRadius: 10, padding: 12, gap: 6 },\n spentRow: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n gap: 8,\n },\n track: { height: 8, borderRadius: 4, overflow: \"hidden\", marginTop: 4 },\n fill: { height: \"100%\" },\n actions: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n gap: 8,\n borderTopWidth: 1,\n paddingTop: 12,\n },\n empty: {\n borderWidth: 1,\n borderStyle: \"dashed\",\n borderRadius: 12,\n padding: 32,\n alignItems: \"center\",\n gap: 4,\n },\n});\n","import {\n type AuthorizationAssetMetadata,\n formatAuthorizationAmount,\n type PaymentRecord,\n type PaymentVerificationStatus,\n} from \"@naculus/connect-appkit-core\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport { CopyableValue, Glyph, type Tone, toneColors } from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface PaymentReceiptNativeProps {\n record: PaymentRecord;\n assets?: Record<string, AuthorizationAssetMetadata>;\n /**\n * Accepted for parity with the other payment components; the receipt has\n * no locale-dependent text yet (amounts use the core formatter).\n */\n locale?: string;\n /** Shows \"View on explorer\" when set and the record has a reference. */\n onOpenExplorer?: (record: PaymentRecord) => void;\n /** Copies the recipient or settlement reference. */\n onCopy?: (text: string) => void;\n theme?: NativePaymentTheme;\n}\n\nconst VERIFICATION: Record<\n PaymentVerificationStatus,\n { title: string; detail: string; glyph: string; tone: Tone }\n> = {\n unverified: {\n title: \"Unverified\",\n detail: \"Reported by the server, not yet checked.\",\n glyph: \"?\",\n tone: \"neutral\",\n },\n pending: {\n title: \"Checking\",\n detail: \"Checking on chain.\",\n glyph: \"…\",\n tone: \"neutral\",\n },\n verified: {\n title: \"Verified\",\n detail: \"Verified on chain.\",\n glyph: \"✓\",\n tone: \"success\",\n },\n mismatch: {\n title: \"Mismatch\",\n detail: \"The on-chain settlement does not match this payment.\",\n glyph: \"!\",\n tone: \"danger\",\n },\n failed: {\n title: \"Verification failed\",\n detail: \"The settlement could not be verified.\",\n glyph: \"!\",\n tone: \"danger\",\n },\n unavailable: {\n title: \"Verification unavailable\",\n detail: \"On-chain checking is unavailable. Retry later.\",\n glyph: \"?\",\n tone: \"neutral\",\n },\n};\n\n/** React Native counterpart of the web `PaymentReceipt`. */\nexport function PaymentReceiptNative({\n record,\n assets = {},\n onOpenExplorer,\n onCopy,\n theme: themeProp,\n}: PaymentReceiptNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const status = record.verification.status;\n const state = VERIFICATION[status];\n const colors = toneColors(theme, state.tone);\n const muted = { color: theme.mutedForeground };\n const amount =\n record.amount === null\n ? \"Amount not reported\"\n : /^\\d+$/.test(record.amount)\n ? formatAuthorizationAmount(\n BigInt(record.amount),\n record.asset ? assets[record.asset] : undefined,\n ).formatted\n : `${record.amount} base units`;\n\n return (\n <View\n testID={`verification-${status}`}\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.header}>\n <Text style={[styles.eyebrow, muted]}>PAYMENT RECEIPT</Text>\n <Text\n accessibilityRole=\"header\"\n style={[styles.amount, { color: theme.foreground }]}\n >\n {amount}\n </Text>\n <Text style={[styles.small, muted]}>\n {record.asset\n ? (assets[record.asset]?.symbol ?? record.asset)\n : \"Asset not reported\"}\n </Text>\n </View>\n\n <View\n testID=\"verification-panel\"\n accessibilityLiveRegion=\"polite\"\n accessible\n accessibilityLabel={`${state.title}. ${state.detail}${record.verification.reason ? ` Reason: ${record.verification.reason}` : \"\"}`}\n style={[\n styles.panel,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{state.glyph}</Glyph>\n <View style={styles.flexShrink}>\n <Text style={[styles.badge, { color: colors.color }]}>\n {state.title}\n </Text>\n <Text style={[styles.body, { color: colors.color }]}>\n {state.detail}\n </Text>\n {record.verification.reason && (\n <Text\n numberOfLines={2}\n style={[styles.body, styles.strong, { color: colors.color }]}\n >\n Reason: {record.verification.reason}\n </Text>\n )}\n </View>\n </View>\n\n <View style={styles.field}>\n <Text style={[styles.small, muted]}>Recipient</Text>\n {record.payTo ? (\n <CopyableValue value={record.payTo} onCopy={onCopy} theme={theme} />\n ) : (\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not reported\n </Text>\n )}\n </View>\n <View style={styles.row}>\n <View style={styles.cell}>\n <Text style={[styles.small, muted]}>Protocol</Text>\n <Text style={[styles.body, { color: theme.foreground }]}>\n {record.protocol === \"mpp\" ? \"MPP\" : record.protocol}\n </Text>\n </View>\n <View style={styles.cell}>\n <Text style={[styles.small, muted]}>Time</Text>\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not recorded\n </Text>\n </View>\n </View>\n <View style={styles.field}>\n <Text style={[styles.small, muted]}>Settlement reference</Text>\n {record.reference ? (\n <>\n <CopyableValue\n value={record.reference}\n onCopy={onCopy}\n theme={theme}\n />\n {onOpenExplorer && (\n <Pressable\n accessibilityRole=\"link\"\n accessibilityLabel=\"View on explorer\"\n onPress={() => onOpenExplorer(record)}\n style={styles.link}\n >\n <Text style={[styles.linkText, { color: theme.foreground }]}>\n View on explorer ↗\n </Text>\n </Pressable>\n )}\n </>\n ) : (\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not reported\n </Text>\n )}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderWidth: 1, borderRadius: 16, padding: 20, gap: 16 },\n header: { alignItems: \"center\", gap: 4 },\n eyebrow: { fontSize: 12, fontWeight: \"500\", letterSpacing: 0.6 },\n amount: {\n fontSize: 32,\n fontWeight: \"600\",\n fontVariant: [\"tabular-nums\"],\n textAlign: \"center\",\n },\n small: { fontSize: 12 },\n body: { fontSize: 14, lineHeight: 20 },\n strong: { fontWeight: \"600\" },\n // Fixed height: badge, explanation and a two-line reason fit, so the card\n // does not jump as verification moves from pending to its final state.\n panel: {\n height: 128,\n flexDirection: \"row\",\n gap: 8,\n borderWidth: 1,\n borderRadius: 10,\n padding: 12,\n overflow: \"hidden\",\n },\n flexShrink: { flexShrink: 1 },\n badge: { fontSize: 13, fontWeight: \"700\", marginBottom: 2 },\n field: { gap: 4 },\n row: { flexDirection: \"row\", gap: 12 },\n cell: { flex: 1, gap: 4 },\n link: { minHeight: 44, minWidth: 44, justifyContent: \"center\" },\n linkText: {\n fontSize: 13,\n fontWeight: \"500\",\n textDecorationLine: \"underline\",\n },\n});\n"],"mappings":"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","names":["import_react_native","import_react","import_react_native","import_jsx_runtime","import_jsx_runtime","styles","import_connect_appkit_core","import_react","import_react_native","import_jsx_runtime","styles","import_connect_appkit_core","import_react_native","import_jsx_runtime","styles"]}
@@ -53,6 +53,7 @@ interface AuthorizationConsentNativeProps {
53
53
  /** A raw authorization, or a description already built by the caller. */
54
54
  authorization: Authorization | ListedAuthorization | AuthorizationDescription;
55
55
  assets?: Record<string, AuthorizationAssetMetadata>;
56
+ trustedAssets?: readonly string[];
56
57
  /** `explainSpend` result for the payment that triggered this consent. */
57
58
  preview?: SpendExplanation;
58
59
  onApprove: () => void;
@@ -65,26 +66,29 @@ interface AuthorizationConsentNativeProps {
65
66
  locale?: string;
66
67
  /** Unix timestamp in seconds, for a stable relative expiry. */
67
68
  now?: number;
69
+ enforcement?: "on-chain" | "device";
68
70
  theme?: NativePaymentTheme;
69
71
  }
70
72
  /** React Native counterpart of the web `AuthorizationConsent`. */
71
- declare function AuthorizationConsentNative({ authorization, assets, locale, now, requester, preview, onApprove, onDecline, busy, onCopy, theme: themeProp, }: AuthorizationConsentNativeProps): react.JSX.Element;
73
+ declare function AuthorizationConsentNative({ authorization, assets, trustedAssets, locale, now, enforcement, requester, preview, onApprove, onDecline, busy, onCopy, theme: themeProp, }: AuthorizationConsentNativeProps): react.JSX.Element;
72
74
 
73
75
  interface AuthorizationListNativeProps {
74
76
  entries: ListedAuthorization[] | {
75
77
  entries: ListedAuthorization[];
76
78
  };
77
79
  assets?: Record<string, AuthorizationAssetMetadata>;
80
+ trustedAssets?: readonly string[];
78
81
  onRevoke: (entry: ListedAuthorization) => RevokeListedAuthorizationResult | Promise<RevokeListedAuthorizationResult>;
79
82
  /** keyId of the entry being revoked. */
80
83
  revokingId?: string;
81
84
  /** BCP 47 locale for expiry dates; English when omitted. */
82
85
  locale?: string;
86
+ getEnforcement?: (entry: ListedAuthorization) => "on-chain" | "device" | undefined;
83
87
  onCopy?: (text: string) => void;
84
88
  theme?: NativePaymentTheme;
85
89
  }
86
90
  /** React Native counterpart of the web `AuthorizationList`. */
87
- declare function AuthorizationListNative({ entries: input, assets, onRevoke, revokingId, locale, onCopy, theme: themeProp, }: AuthorizationListNativeProps): react.JSX.Element;
91
+ declare function AuthorizationListNative({ entries: input, assets, trustedAssets, onRevoke, revokingId, locale, getEnforcement, onCopy, theme: themeProp, }: AuthorizationListNativeProps): react.JSX.Element;
88
92
 
89
93
  interface PaymentReceiptNativeProps {
90
94
  record: PaymentRecord;
@@ -53,6 +53,7 @@ interface AuthorizationConsentNativeProps {
53
53
  /** A raw authorization, or a description already built by the caller. */
54
54
  authorization: Authorization | ListedAuthorization | AuthorizationDescription;
55
55
  assets?: Record<string, AuthorizationAssetMetadata>;
56
+ trustedAssets?: readonly string[];
56
57
  /** `explainSpend` result for the payment that triggered this consent. */
57
58
  preview?: SpendExplanation;
58
59
  onApprove: () => void;
@@ -65,26 +66,29 @@ interface AuthorizationConsentNativeProps {
65
66
  locale?: string;
66
67
  /** Unix timestamp in seconds, for a stable relative expiry. */
67
68
  now?: number;
69
+ enforcement?: "on-chain" | "device";
68
70
  theme?: NativePaymentTheme;
69
71
  }
70
72
  /** React Native counterpart of the web `AuthorizationConsent`. */
71
- declare function AuthorizationConsentNative({ authorization, assets, locale, now, requester, preview, onApprove, onDecline, busy, onCopy, theme: themeProp, }: AuthorizationConsentNativeProps): react.JSX.Element;
73
+ declare function AuthorizationConsentNative({ authorization, assets, trustedAssets, locale, now, enforcement, requester, preview, onApprove, onDecline, busy, onCopy, theme: themeProp, }: AuthorizationConsentNativeProps): react.JSX.Element;
72
74
 
73
75
  interface AuthorizationListNativeProps {
74
76
  entries: ListedAuthorization[] | {
75
77
  entries: ListedAuthorization[];
76
78
  };
77
79
  assets?: Record<string, AuthorizationAssetMetadata>;
80
+ trustedAssets?: readonly string[];
78
81
  onRevoke: (entry: ListedAuthorization) => RevokeListedAuthorizationResult | Promise<RevokeListedAuthorizationResult>;
79
82
  /** keyId of the entry being revoked. */
80
83
  revokingId?: string;
81
84
  /** BCP 47 locale for expiry dates; English when omitted. */
82
85
  locale?: string;
86
+ getEnforcement?: (entry: ListedAuthorization) => "on-chain" | "device" | undefined;
83
87
  onCopy?: (text: string) => void;
84
88
  theme?: NativePaymentTheme;
85
89
  }
86
90
  /** React Native counterpart of the web `AuthorizationList`. */
87
- declare function AuthorizationListNative({ entries: input, assets, onRevoke, revokingId, locale, onCopy, theme: themeProp, }: AuthorizationListNativeProps): react.JSX.Element;
91
+ declare function AuthorizationListNative({ entries: input, assets, trustedAssets, onRevoke, revokingId, locale, getEnforcement, onCopy, theme: themeProp, }: AuthorizationListNativeProps): react.JSX.Element;
88
92
 
89
93
  interface PaymentReceiptNativeProps {
90
94
  record: PaymentRecord;
package/dist/ui/index.js CHANGED
@@ -271,8 +271,10 @@ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
271
271
  function AuthorizationConsentNative({
272
272
  authorization,
273
273
  assets = {},
274
+ trustedAssets,
274
275
  locale,
275
276
  now,
277
+ enforcement,
276
278
  requester,
277
279
  preview,
278
280
  onApprove,
@@ -282,7 +284,13 @@ function AuthorizationConsentNative({
282
284
  theme: themeProp
283
285
  }) {
284
286
  const theme = useNativePaymentTheme(themeProp);
285
- const description = "expiry" in authorization ? authorization : describeAuthorization(authorization, { assets, locale, now });
287
+ const description = "expiry" in authorization ? authorization : describeAuthorization(authorization, {
288
+ assets,
289
+ trustedAssets,
290
+ locale,
291
+ now,
292
+ enforcement
293
+ });
286
294
  const muted = { color: theme.mutedForeground };
287
295
  return /* @__PURE__ */ jsxs2(View2, { style: [styles2.root, { backgroundColor: theme.background }], children: [
288
296
  /* @__PURE__ */ jsxs2(ScrollView, { contentContainerStyle: styles2.content, children: [
@@ -354,6 +362,7 @@ function AuthorizationConsentNative({
354
362
  ],
355
363
  children: [
356
364
  /* @__PURE__ */ jsx3(Text2, { style: [styles2.assetLabel, { color: theme.foreground }], children: grant.assetLabel }),
365
+ grant.assetTrust === "unverified" && /* @__PURE__ */ jsx3(Callout, { tone: "warning", glyph: "\u26A0", role: "alert", theme, children: /* @__PURE__ */ jsx3(Text2, { style: styles2.strong, children: "Unverified token \u2014 not on the trusted list" }) }),
357
366
  /* @__PURE__ */ jsxs2(View2, { style: styles2.limits, children: [
358
367
  /* @__PURE__ */ jsxs2(View2, { style: styles2.limit, children: [
359
368
  /* @__PURE__ */ jsx3(Text2, { style: [styles.label, muted], children: "Per payment" }),
@@ -364,6 +373,20 @@ function AuthorizationConsentNative({
364
373
  /* @__PURE__ */ jsx3(Text2, { style: [styles2.amount, { color: theme.foreground }], children: grant.total.formatted })
365
374
  ] })
366
375
  ] }),
376
+ grant.period && /* @__PURE__ */ jsxs2(View2, { children: [
377
+ /* @__PURE__ */ jsx3(Text2, { style: [styles2.term, { color: theme.foreground }], children: "Period limit" }),
378
+ /* @__PURE__ */ jsxs2(Text2, { style: [styles2.amount, { color: theme.foreground }], children: [
379
+ "Up to ",
380
+ grant.period.amount.formatted,
381
+ " every",
382
+ " ",
383
+ grant.period.every
384
+ ] }),
385
+ /* @__PURE__ */ jsxs2(Text2, { style: [styles2.small, muted], children: [
386
+ "Starts ",
387
+ grant.period.startsAt
388
+ ] })
389
+ ] }),
367
390
  /* @__PURE__ */ jsx3(Text2, { style: [styles2.term, { color: theme.foreground }], children: "Recipients" }),
368
391
  grant.recipients.length ? grant.recipients.map((recipient) => /* @__PURE__ */ jsx3(
369
392
  CopyableValue,
@@ -393,6 +416,7 @@ function AuthorizationConsentNative({
393
416
  },
394
417
  `${grant.asset}:${grant.recipients.map((r) => r.full).join(",")}:${grant.perPayment.formatted}:${grant.total.formatted}`
395
418
  )),
419
+ description.enforcementLabel && /* @__PURE__ */ jsx3(Text2, { style: [styles2.strong, { color: theme.foreground }], children: description.enforcementLabel }),
396
420
  /* @__PURE__ */ jsxs2(View2, { style: [styles2.expiry, { backgroundColor: theme.muted }], children: [
397
421
  /* @__PURE__ */ jsxs2(Text2, { style: [styles2.strong, { color: theme.foreground }], children: [
398
422
  "Expires ",
@@ -528,9 +552,11 @@ function StatusBadge({
528
552
  function AuthorizationListNative({
529
553
  entries: input,
530
554
  assets = {},
555
+ trustedAssets,
531
556
  onRevoke,
532
557
  revokingId,
533
558
  locale,
559
+ getEnforcement,
534
560
  onCopy,
535
561
  theme: themeProp
536
562
  }) {
@@ -545,7 +571,12 @@ function AuthorizationListNative({
545
571
  setOnChain((current) => new Set(current).add(entry.keyId));
546
572
  });
547
573
  const renderItem = ({ item: entry }) => {
548
- const view = describeAuthorization2(entry, { assets, locale });
574
+ const view = describeAuthorization2(entry, {
575
+ assets,
576
+ trustedAssets,
577
+ locale,
578
+ enforcement: getEnforcement?.(entry)
579
+ });
549
580
  const busy = revokingId === entry.keyId;
550
581
  const live = entry.status === "active" || entry.status === "pending";
551
582
  return /* @__PURE__ */ jsxs3(
@@ -575,6 +606,7 @@ function AuthorizationListNative({
575
606
  style: [styles3.grant, { backgroundColor: theme.muted }],
576
607
  children: [
577
608
  view.label && /* @__PURE__ */ jsx4(Text3, { style: [styles3.strong, { color: theme.foreground }], children: grant.assetLabel }),
609
+ grant.assetTrust === "unverified" && /* @__PURE__ */ jsx4(Callout, { tone: "warning", glyph: "\u26A0", role: "alert", theme, children: "Unverified token \u2014 not on the trusted list" }),
578
610
  grant.recipients.map((recipient) => /* @__PURE__ */ jsx4(
579
611
  CopyableValue,
580
612
  {
@@ -585,12 +617,28 @@ function AuthorizationListNative({
585
617
  },
586
618
  recipient.full
587
619
  )),
620
+ grant.period && /* @__PURE__ */ jsxs3(View3, { children: [
621
+ /* @__PURE__ */ jsxs3(Text3, { style: [styles3.strong, { color: theme.foreground }], children: [
622
+ "Up to ",
623
+ grant.period.amount.formatted,
624
+ " every",
625
+ " ",
626
+ grant.period.every
627
+ ] }),
628
+ /* @__PURE__ */ jsxs3(Text3, { style: [styles3.small, muted], children: [
629
+ "Starts ",
630
+ grant.period.startsAt
631
+ ] })
632
+ ] }),
588
633
  spent !== void 0 && /* @__PURE__ */ jsxs3(View3, { children: [
589
634
  /* @__PURE__ */ jsxs3(View3, { style: styles3.spentRow, children: [
590
635
  /* @__PURE__ */ jsxs3(Text3, { style: [styles3.small, { color: theme.foreground }], children: [
591
636
  "Spent",
592
637
  " ",
593
- formatAuthorizationAmount(spent, assets[grant.asset]).formatted
638
+ formatAuthorizationAmount(
639
+ spent,
640
+ grant.assetTrust === "unverified" ? void 0 : assets[grant.asset]
641
+ ).formatted
594
642
  ] }),
595
643
  /* @__PURE__ */ jsxs3(Text3, { style: [styles3.small, { color: theme.foreground }], children: [
596
644
  "Total ",
@@ -627,6 +675,7 @@ function AuthorizationListNative({
627
675
  grant.asset
628
676
  );
629
677
  }),
678
+ view.enforcementLabel && /* @__PURE__ */ jsx4(Text3, { style: [styles3.strong, { color: theme.foreground }], children: view.enforcementLabel }),
630
679
  /* @__PURE__ */ jsxs3(Text3, { style: [styles3.small, muted], children: [
631
680
  entry.status === "expired" ? "Expired" : entry.status === "revoked" ? "Revoked" : `Expires ${view.expiry.relative}`,
632
681
  " ",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/AuthorizationConsentNative.tsx","../../src/ui/parts.tsx","../../src/ui/theme.tsx","../../src/ui/AuthorizationListNative.tsx","../../src/ui/PaymentReceiptNative.tsx"],"sourcesContent":["import {\n type AuthorizationAssetMetadata,\n type AuthorizationDescription,\n describeAuthorization,\n type SpendExplanation,\n} from \"@naculus/connect-appkit-core\";\nimport type { Authorization, ListedAuthorization } from \"@naculus/connect-core\";\nimport { Image, ScrollView, StyleSheet, Text, View } from \"react-native\";\nimport {\n ActionButton,\n Callout,\n CopyableValue,\n styles as shared,\n} from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface AuthorizationConsentNativeProps {\n /** Who asks: shown as \"Allow {name} to pay?\". */\n requester: { name: string; icon?: string; origin?: string };\n /** A raw authorization, or a description already built by the caller. */\n authorization: Authorization | ListedAuthorization | AuthorizationDescription;\n assets?: Record<string, AuthorizationAssetMetadata>;\n /** `explainSpend` result for the payment that triggered this consent. */\n preview?: SpendExplanation;\n onApprove: () => void;\n onDecline: () => void;\n /** Disables Approve and shows \"Approving…\". */\n busy?: boolean;\n /** Copies a recipient address; the copy button shows only when set. */\n onCopy?: (text: string) => void;\n /** BCP 47 locale for the expiry; English when omitted. */\n locale?: string;\n /** Unix timestamp in seconds, for a stable relative expiry. */\n now?: number;\n theme?: NativePaymentTheme;\n}\n\n/** React Native counterpart of the web `AuthorizationConsent`. */\nexport function AuthorizationConsentNative({\n authorization,\n assets = {},\n locale,\n now,\n requester,\n preview,\n onApprove,\n onDecline,\n busy = false,\n onCopy,\n theme: themeProp,\n}: AuthorizationConsentNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const description =\n \"expiry\" in authorization\n ? authorization\n : describeAuthorization(authorization, { assets, locale, now });\n const muted = { color: theme.mutedForeground };\n\n return (\n <View style={[styles.root, { backgroundColor: theme.background }]}>\n <ScrollView contentContainerStyle={styles.content}>\n <View style={styles.requester}>\n {requester.icon ? (\n <Image\n accessibilityIgnoresInvertColors\n source={{ uri: requester.icon }}\n style={styles.avatar}\n />\n ) : (\n <View\n importantForAccessibility=\"no\"\n style={[styles.avatar, { backgroundColor: theme.muted }]}\n >\n <Text style={[styles.initial, { color: theme.foreground }]}>\n {requester.name.slice(0, 1).toUpperCase()}\n </Text>\n </View>\n )}\n <View style={styles.flexShrink}>\n <Text\n accessibilityRole=\"header\"\n style={[shared.heading, { color: theme.foreground }]}\n >\n Allow {requester.name} to pay?\n </Text>\n {requester.origin && (\n <Text style={[styles.small, muted]}>{requester.origin}</Text>\n )}\n </View>\n </View>\n\n {description.warnings.map((warning) => (\n <Callout\n key={warning}\n tone=\"warning\"\n glyph=\"⚠\"\n role=\"alert\"\n theme={theme}\n >\n <Text style={styles.strong}>{warning}</Text>\n </Callout>\n ))}\n\n {preview && (\n <Callout\n tone={preview.allowed ? \"success\" : \"danger\"}\n glyph={preview.allowed ? \"✓\" : \"✕\"}\n theme={theme}\n >\n <Text style={styles.strong}>\n {preview.allowed ? \"Allowed\" : \"Blocked\"}.\n </Text>{\" \"}\n {preview.sentence}\n </Callout>\n )}\n\n {description.grants.map((grant) => (\n <View\n key={`${grant.asset}:${grant.recipients.map((r) => r.full).join(\",\")}:${grant.perPayment.formatted}:${grant.total.formatted}`}\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <Text style={[styles.assetLabel, { color: theme.foreground }]}>\n {grant.assetLabel}\n </Text>\n <View style={styles.limits}>\n <View style={styles.limit}>\n <Text style={[shared.label, muted]}>Per payment</Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n {grant.perPayment.formatted}\n </Text>\n </View>\n <View style={styles.limit}>\n <Text style={[shared.label, muted]}>Total limit</Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n {grant.total.formatted}\n </Text>\n </View>\n </View>\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Recipients\n </Text>\n {grant.recipients.length ? (\n grant.recipients.map((recipient) => (\n <CopyableValue\n key={recipient.full}\n value={recipient.full}\n display={recipient.shortened}\n onCopy={onCopy}\n theme={theme}\n />\n ))\n ) : (\n <Text style={[styles.strong, { color: theme.dangerForeground }]}>\n No recipient restriction is displayed\n </Text>\n )}\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Payment count\n </Text>\n <Text style={[styles.small, muted]}>\n {grant.count === null ? \"No count limit\" : `Up to ${grant.count}`}\n </Text>\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Payment methods\n </Text>\n <View style={styles.chips}>\n {grant.rails.map((rail) => (\n <View\n key={rail}\n style={[\n shared.chip,\n { backgroundColor: theme.muted, borderColor: theme.border },\n ]}\n >\n <Text style={[shared.chipText, { color: theme.foreground }]}>\n {rail}\n </Text>\n </View>\n ))}\n </View>\n </View>\n ))}\n\n <View style={[styles.expiry, { backgroundColor: theme.muted }]}>\n <Text style={[styles.strong, { color: theme.foreground }]}>\n Expires {description.expiry.relative}\n </Text>\n <Text style={[styles.small, muted]}>\n {description.expiry.absolute}\n </Text>\n </View>\n </ScrollView>\n\n {/* Outside the ScrollView so it stays on screen on short landscape phones. */}\n <View\n testID=\"payment-actions\"\n style={[\n styles.footer,\n { borderTopColor: theme.border, backgroundColor: theme.background },\n ]}\n >\n <ActionButton\n label=\"Decline\"\n variant=\"secondary\"\n onPress={onDecline}\n theme={theme}\n />\n <ActionButton\n label={busy ? \"Approving…\" : \"Approve\"}\n onPress={onApprove}\n disabled={busy}\n busy={busy}\n theme={theme}\n />\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n content: { padding: 16, gap: 12 },\n requester: { flexDirection: \"row\", alignItems: \"center\", gap: 12 },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 12,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n initial: { fontSize: 18, fontWeight: \"600\" },\n flexShrink: { flexShrink: 1 },\n small: { fontSize: 12 },\n strong: { fontWeight: \"700\" },\n card: { borderWidth: 1, borderRadius: 12, padding: 16, gap: 6 },\n assetLabel: { fontSize: 14, fontWeight: \"600\" },\n limits: { flexDirection: \"row\", gap: 12, marginVertical: 6 },\n limit: { flex: 1 },\n amount: {\n fontSize: 22,\n fontWeight: \"600\",\n fontVariant: [\"tabular-nums\"],\n },\n term: { fontSize: 14, fontWeight: \"500\", marginTop: 8 },\n chips: { flexDirection: \"row\", flexWrap: \"wrap\", gap: 6 },\n expiry: { borderRadius: 10, padding: 12, gap: 2 },\n footer: {\n flexDirection: \"row\",\n gap: 12,\n paddingHorizontal: 16,\n paddingVertical: 12,\n borderTopWidth: 1,\n },\n});\n","import { type ReactNode, useState } from \"react\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport type { NativePaymentTheme } from \"./theme\";\n\nexport type Tone = \"success\" | \"danger\" | \"warning\" | \"neutral\";\n\n/** Fill, border and text color of a tone. */\nexport function toneColors(theme: NativePaymentTheme, tone: Tone) {\n if (tone === \"success\")\n return {\n backgroundColor: theme.successBackground,\n borderColor: theme.successBorder,\n color: theme.successForeground,\n };\n if (tone === \"danger\")\n return {\n backgroundColor: theme.dangerBackground,\n borderColor: theme.dangerBorder,\n color: theme.dangerForeground,\n };\n if (tone === \"warning\")\n return {\n backgroundColor: theme.warningBackground,\n borderColor: theme.warningBorder,\n color: theme.warningForeground,\n };\n return {\n backgroundColor: theme.muted,\n borderColor: theme.border,\n color: theme.foreground,\n };\n}\n\n/** Decorative glyph, hidden from screen readers. */\nexport function Glyph({\n children,\n color,\n}: {\n children: string;\n color: string;\n}) {\n return (\n <Text\n accessible={false}\n importantForAccessibility=\"no\"\n accessibilityElementsHidden\n style={[styles.glyph, { color }]}\n >\n {children}\n </Text>\n );\n}\n\nexport function ActionButton({\n label,\n onPress,\n theme,\n variant = \"primary\",\n disabled = false,\n busy = false,\n}: {\n label: string;\n onPress: () => void;\n theme: NativePaymentTheme;\n variant?: \"primary\" | \"secondary\";\n disabled?: boolean;\n busy?: boolean;\n}) {\n const primary = variant === \"primary\";\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled, busy }}\n disabled={disabled}\n onPress={onPress}\n style={({ pressed }) => [\n styles.button,\n {\n backgroundColor: primary ? theme.primary : theme.background,\n borderColor: primary ? theme.primary : theme.border,\n opacity: disabled ? 0.55 : pressed ? 0.8 : 1,\n },\n ]}\n >\n <Text\n style={[\n styles.buttonLabel,\n { color: primary ? theme.primaryForeground : theme.foreground },\n ]}\n >\n {label}\n </Text>\n </Pressable>\n );\n}\n\n/**\n * An address or hash with an icon-only copy action. The app supplies\n * `onCopy` (Expo Clipboard, RN Clipboard, …); without it no button shows.\n */\nexport function CopyableValue({\n value,\n display,\n onCopy,\n theme,\n color = theme.foreground,\n}: {\n value: string;\n /** Shortened form from the view model; else truncated in the middle. */\n display?: string;\n onCopy?: (text: string) => void;\n theme: NativePaymentTheme;\n color?: string;\n}) {\n const [copied, setCopied] = useState(false);\n return (\n <View style={styles.copyRow}>\n <Text\n accessibilityLabel={value}\n numberOfLines={1}\n ellipsizeMode=\"middle\"\n style={[styles.mono, { color }]}\n >\n {display ?? value}\n </Text>\n {onCopy && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? `Copied ${value}` : `Copy ${value}`}\n hitSlop={6}\n onPress={() => {\n onCopy(value);\n setCopied(true);\n }}\n style={({ pressed }) => [\n styles.iconButton,\n { borderColor: theme.border, opacity: pressed ? 0.7 : 1 },\n ]}\n >\n <Glyph color={theme.foreground}>{copied ? \"✓\" : \"⧉\"}</Glyph>\n </Pressable>\n )}\n </View>\n );\n}\n\n/** A colored callout: warnings, preview verdicts, notices. */\nexport function Callout({\n tone,\n glyph,\n theme,\n role,\n children,\n}: {\n tone: Tone;\n glyph: string;\n theme: NativePaymentTheme;\n role?: \"alert\";\n children: ReactNode;\n}) {\n const colors = toneColors(theme, tone);\n return (\n <View\n accessibilityRole={role}\n style={[\n styles.callout,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{glyph}</Glyph>\n <Text style={[styles.calloutText, { color: colors.color }]}>\n {children}\n </Text>\n </View>\n );\n}\n\nexport const styles = StyleSheet.create({\n glyph: { fontSize: 16, lineHeight: 20, fontWeight: \"700\" },\n button: {\n flex: 1,\n minHeight: 48,\n minWidth: 44,\n borderRadius: 10,\n borderWidth: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 16,\n },\n buttonLabel: { fontSize: 16, fontWeight: \"600\" },\n copyRow: { flexDirection: \"row\", alignItems: \"center\", gap: 6 },\n mono: { flexShrink: 1, fontFamily: \"monospace\", fontSize: 13 },\n iconButton: {\n width: 32,\n height: 32,\n borderRadius: 8,\n borderWidth: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n callout: {\n flexDirection: \"row\",\n gap: 8,\n borderWidth: 1,\n borderRadius: 10,\n padding: 12,\n },\n calloutText: { flex: 1, fontSize: 14, lineHeight: 20 },\n label: { fontSize: 12, fontWeight: \"500\" },\n heading: { fontSize: 18, fontWeight: \"600\" },\n chip: {\n borderWidth: 1,\n borderRadius: 999,\n paddingHorizontal: 10,\n paddingVertical: 4,\n },\n chipText: { fontSize: 12 },\n});\n","import { createContext, type ReactNode, useContext } from \"react\";\nimport { useColorScheme } from \"react-native\";\n\n/**\n * Colors for the payment components. The values come from the appkit tokens\n * (`packages/ui/src/styles/tokens.css`, converted from HSL to hex). Where a\n * token pair falls below 4.5:1 on a payment surface — muted text on the muted\n * fill, the light destructive red as text — the text color is the darker\n * (light) or lighter (dark) step of the same hue, so every text/background\n * pair the components use meets WCAG AA.\n */\nexport interface NativePaymentTheme {\n scheme: \"light\" | \"dark\";\n background: string;\n foreground: string;\n card: string;\n border: string;\n muted: string;\n mutedForeground: string;\n primary: string;\n primaryForeground: string;\n /** Verified receipts and allowed previews only. */\n successBackground: string;\n successBorder: string;\n successForeground: string;\n /** Mismatch / failed receipts, blocked previews, missing restrictions. */\n dangerBackground: string;\n dangerBorder: string;\n dangerForeground: string;\n /** Non-dismissible warnings. */\n warningBackground: string;\n warningBorder: string;\n warningForeground: string;\n}\n\nexport const lightPaymentTheme: NativePaymentTheme = {\n scheme: \"light\",\n background: \"#ffffff\", // --background 0 0% 100%\n foreground: \"#020817\", // --foreground 222.2 84% 4.9%\n card: \"#ffffff\", // --card\n border: \"#e2e8f0\", // --border 214.3 31.8% 91.4%\n muted: \"#f1f5f9\", // --muted 210 40% 96.1%\n mutedForeground: \"#475569\", // --muted-foreground hue, one step darker\n primary: \"#0f172a\", // --primary 222.2 47.4% 11.2%\n primaryForeground: \"#f8fafc\", // --primary-foreground 210 40% 98%\n successBackground: \"#ecfdf5\",\n successBorder: \"#047857\",\n successForeground: \"#064e3b\",\n dangerBackground: \"#fef2f2\",\n dangerBorder: \"#ef4444\", // --destructive 0 84.2% 60.2%\n dangerForeground: \"#991b1b\",\n warningBackground: \"#fffbeb\",\n warningBorder: \"#b45309\",\n warningForeground: \"#451a03\",\n};\n\nexport const darkPaymentTheme: NativePaymentTheme = {\n scheme: \"dark\",\n background: \"#020817\", // .dark --background\n foreground: \"#f8fafc\", // .dark --foreground\n card: \"#020817\", // .dark --card\n border: \"#1e293b\", // .dark --border 217.2 32.6% 17.5%\n muted: \"#1e293b\", // .dark --muted\n mutedForeground: \"#94a3b8\", // .dark --muted-foreground 215 20.2% 65.1%\n primary: \"#f8fafc\", // .dark --primary\n primaryForeground: \"#0f172a\", // .dark --primary-foreground\n successBackground: \"#022c22\",\n successBorder: \"#10b981\",\n successForeground: \"#d1fae5\",\n dangerBackground: \"#450a0a\",\n dangerBorder: \"#f87171\",\n dangerForeground: \"#fecaca\",\n warningBackground: \"#451a03\",\n warningBorder: \"#f59e0b\",\n warningForeground: \"#fef3c7\",\n};\n\nconst ThemeContext = createContext<NativePaymentTheme | undefined>(undefined);\n\nexport function NativePaymentThemeProvider({\n theme,\n children,\n}: {\n theme: NativePaymentTheme;\n children: ReactNode;\n}) {\n return (\n <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>\n );\n}\n\n/** The `theme` prop, else the provider's theme, else the system scheme. */\nexport function useNativePaymentTheme(\n override?: NativePaymentTheme,\n): NativePaymentTheme {\n const provided = useContext(ThemeContext);\n const scheme = useColorScheme();\n return (\n override ??\n provided ??\n (scheme === \"dark\" ? darkPaymentTheme : lightPaymentTheme)\n );\n}\n","import {\n type AuthorizationAssetMetadata,\n describeAuthorization,\n formatAuthorizationAmount,\n} from \"@naculus/connect-appkit-core\";\nimport type {\n ListedAuthorization,\n ListedAuthorizationStatus,\n RevokeListedAuthorizationResult,\n} from \"@naculus/connect-core\";\nimport { useState } from \"react\";\nimport { FlatList, StyleSheet, Text, View } from \"react-native\";\nimport {\n ActionButton,\n Callout,\n CopyableValue,\n Glyph,\n styles as shared,\n toneColors,\n} from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface AuthorizationListNativeProps {\n entries: ListedAuthorization[] | { entries: ListedAuthorization[] };\n assets?: Record<string, AuthorizationAssetMetadata>;\n onRevoke: (\n entry: ListedAuthorization,\n ) =>\n | RevokeListedAuthorizationResult\n | Promise<RevokeListedAuthorizationResult>;\n /** keyId of the entry being revoked. */\n revokingId?: string;\n /** BCP 47 locale for expiry dates; English when omitted. */\n locale?: string;\n onCopy?: (text: string) => void;\n theme?: NativePaymentTheme;\n}\n\nconst ENFORCER_LABELS: Record<string, string> = {\n \"evm-session\": \"EVM session key\",\n \"solana-session\": \"Solana session key\",\n \"mpp-voucher\": \"MPP channel key\",\n};\n\nconst STATUS_GLYPHS: Record<ListedAuthorizationStatus, string> = {\n active: \"●\",\n pending: \"◐\",\n revoked: \"✕\",\n expired: \"○\",\n};\n\nfunction StatusBadge({\n status,\n theme,\n}: {\n status: ListedAuthorizationStatus;\n theme: NativePaymentTheme;\n}) {\n const colors =\n status === \"active\"\n ? {\n backgroundColor: theme.primary,\n borderColor: theme.primary,\n color: theme.primaryForeground,\n }\n : status === \"pending\"\n ? {\n backgroundColor: theme.background,\n borderColor: theme.foreground,\n color: theme.foreground,\n }\n : status === \"revoked\"\n ? toneColors(theme, \"danger\")\n : {\n backgroundColor: theme.muted,\n borderColor: theme.border,\n color: theme.mutedForeground,\n };\n return (\n <View\n accessibilityLabel={`Status: ${status}`}\n style={[\n shared.chip,\n styles.badge,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{STATUS_GLYPHS[status]}</Glyph>\n <Text style={[styles.badgeText, { color: colors.color }]}>{status}</Text>\n </View>\n );\n}\n\n/** React Native counterpart of the web `AuthorizationList`. */\nexport function AuthorizationListNative({\n entries: input,\n assets = {},\n onRevoke,\n revokingId,\n locale,\n onCopy,\n theme: themeProp,\n}: AuthorizationListNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const entries = Array.isArray(input) ? input : input.entries;\n const [confirming, setConfirming] = useState<string | null>(null);\n const [onChain, setOnChain] = useState<ReadonlySet<string>>(new Set());\n const muted = { color: theme.mutedForeground };\n\n const revoke = (entry: ListedAuthorization) =>\n void Promise.resolve(onRevoke(entry)).then((result) => {\n setConfirming(null);\n if (result.onChainRevocationRequired)\n setOnChain((current) => new Set(current).add(entry.keyId));\n });\n\n const renderItem = ({ item: entry }: { item: ListedAuthorization }) => {\n const view = describeAuthorization(entry, { assets, locale });\n const busy = revokingId === entry.keyId;\n const live = entry.status === \"active\" || entry.status === \"pending\";\n return (\n <View\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.cardHeader}>\n <View style={styles.flexShrink}>\n <Text style={[styles.title, { color: theme.foreground }]}>\n {view.label ?? view.grants.map((g) => g.assetLabel).join(\", \")}\n </Text>\n <Text style={[styles.small, muted]}>\n {ENFORCER_LABELS[entry.enforcer] ??\n entry.enforcer.replaceAll(\"-\", \" \")}\n </Text>\n </View>\n <StatusBadge status={entry.status} theme={theme} />\n </View>\n\n {view.grants.map((grant) => {\n const spent = entry.spent?.[grant.asset];\n const total = entry.grants.find(\n (g) => g.asset === grant.asset,\n )?.maxTotal;\n const percent =\n spent !== undefined && total && total > 0n\n ? Math.min(Number((spent * 100n) / total), 100)\n : 0;\n return (\n <View\n key={grant.asset}\n style={[styles.grant, { backgroundColor: theme.muted }]}\n >\n {view.label && (\n <Text style={[styles.strong, { color: theme.foreground }]}>\n {grant.assetLabel}\n </Text>\n )}\n {grant.recipients.map((recipient) => (\n <CopyableValue\n key={recipient.full}\n value={recipient.full}\n display={recipient.shortened}\n onCopy={onCopy}\n theme={theme}\n />\n ))}\n {spent !== undefined && (\n <View>\n <View style={styles.spentRow}>\n <Text style={[styles.small, { color: theme.foreground }]}>\n Spent{\" \"}\n {\n formatAuthorizationAmount(spent, assets[grant.asset])\n .formatted\n }\n </Text>\n <Text style={[styles.small, { color: theme.foreground }]}>\n Total {grant.total.formatted}\n </Text>\n </View>\n <View\n accessibilityRole=\"progressbar\"\n accessibilityLabel={`${grant.assetLabel} spent`}\n accessibilityValue={{ min: 0, max: 100, now: percent }}\n style={[\n styles.track,\n { backgroundColor: theme.background },\n ]}\n >\n <View\n style={[\n styles.fill,\n {\n width: `${percent}%`,\n backgroundColor: theme.primary,\n },\n ]}\n />\n </View>\n </View>\n )}\n </View>\n );\n })}\n\n <Text style={[styles.small, muted]}>\n {entry.status === \"expired\"\n ? \"Expired\"\n : entry.status === \"revoked\"\n ? \"Revoked\"\n : `Expires ${view.expiry.relative}`}{\" \"}\n · {view.expiry.absolute}\n </Text>\n\n {view.warnings.map((warning) => (\n <Callout\n key={warning}\n tone=\"warning\"\n glyph=\"⚠\"\n role=\"alert\"\n theme={theme}\n >\n {warning}\n </Callout>\n ))}\n\n {onChain.has(entry.keyId) && (\n <Callout tone=\"warning\" glyph=\"⛓\" theme={theme}>\n Local access is revoked. Complete the on-chain revocation to stop\n this authorization on chain.\n </Callout>\n )}\n\n {live && (\n <View style={[styles.actions, { borderTopColor: theme.border }]}>\n {confirming === entry.keyId ? (\n <>\n <ActionButton\n label=\"Cancel\"\n variant=\"secondary\"\n onPress={() => setConfirming(null)}\n theme={theme}\n />\n <ActionButton\n label={busy ? \"Revoking…\" : \"Confirm revoke\"}\n disabled={busy}\n busy={busy}\n onPress={() => revoke(entry)}\n theme={theme}\n />\n </>\n ) : (\n <ActionButton\n label=\"Revoke\"\n variant=\"secondary\"\n onPress={() => setConfirming(entry.keyId)}\n theme={theme}\n />\n )}\n </View>\n )}\n </View>\n );\n };\n\n return (\n <FlatList\n data={entries}\n keyExtractor={(entry) => entry.keyId}\n renderItem={renderItem}\n extraData={[confirming, onChain, revokingId, theme]}\n contentContainerStyle={styles.list}\n style={{ backgroundColor: theme.background }}\n ListHeaderComponent={\n entries.length ? (\n <Text\n accessibilityRole=\"header\"\n style={[shared.heading, { color: theme.foreground }]}\n >\n Payment authorizations\n </Text>\n ) : undefined\n }\n ListEmptyComponent={\n <View style={[styles.empty, { borderColor: theme.border }]}>\n <Text\n accessibilityRole=\"header\"\n style={[styles.title, { color: theme.foreground }]}\n >\n No payment authorizations\n </Text>\n <Text style={[styles.body, muted]}>\n Approvals you create will appear here.\n </Text>\n </View>\n }\n />\n );\n}\n\nconst styles = StyleSheet.create({\n list: { padding: 16, gap: 12 },\n card: { borderWidth: 1, borderRadius: 12, padding: 16, gap: 10 },\n cardHeader: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: 8,\n },\n flexShrink: { flexShrink: 1 },\n title: { fontSize: 16, fontWeight: \"600\" },\n small: { fontSize: 12 },\n body: { fontSize: 14, textAlign: \"center\" },\n strong: { fontSize: 14, fontWeight: \"500\" },\n badge: { flexDirection: \"row\", alignItems: \"center\", gap: 4 },\n badgeText: { fontSize: 12, fontWeight: \"600\", textTransform: \"capitalize\" },\n grant: { borderRadius: 10, padding: 12, gap: 6 },\n spentRow: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n gap: 8,\n },\n track: { height: 8, borderRadius: 4, overflow: \"hidden\", marginTop: 4 },\n fill: { height: \"100%\" },\n actions: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n gap: 8,\n borderTopWidth: 1,\n paddingTop: 12,\n },\n empty: {\n borderWidth: 1,\n borderStyle: \"dashed\",\n borderRadius: 12,\n padding: 32,\n alignItems: \"center\",\n gap: 4,\n },\n});\n","import {\n type AuthorizationAssetMetadata,\n formatAuthorizationAmount,\n type PaymentRecord,\n type PaymentVerificationStatus,\n} from \"@naculus/connect-appkit-core\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport { CopyableValue, Glyph, type Tone, toneColors } from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface PaymentReceiptNativeProps {\n record: PaymentRecord;\n assets?: Record<string, AuthorizationAssetMetadata>;\n /**\n * Accepted for parity with the other payment components; the receipt has\n * no locale-dependent text yet (amounts use the core formatter).\n */\n locale?: string;\n /** Shows \"View on explorer\" when set and the record has a reference. */\n onOpenExplorer?: (record: PaymentRecord) => void;\n /** Copies the recipient or settlement reference. */\n onCopy?: (text: string) => void;\n theme?: NativePaymentTheme;\n}\n\nconst VERIFICATION: Record<\n PaymentVerificationStatus,\n { title: string; detail: string; glyph: string; tone: Tone }\n> = {\n unverified: {\n title: \"Unverified\",\n detail: \"Reported by the server, not yet checked.\",\n glyph: \"?\",\n tone: \"neutral\",\n },\n pending: {\n title: \"Checking\",\n detail: \"Checking on chain.\",\n glyph: \"…\",\n tone: \"neutral\",\n },\n verified: {\n title: \"Verified\",\n detail: \"Verified on chain.\",\n glyph: \"✓\",\n tone: \"success\",\n },\n mismatch: {\n title: \"Mismatch\",\n detail: \"The on-chain settlement does not match this payment.\",\n glyph: \"!\",\n tone: \"danger\",\n },\n failed: {\n title: \"Verification failed\",\n detail: \"The settlement could not be verified.\",\n glyph: \"!\",\n tone: \"danger\",\n },\n unavailable: {\n title: \"Verification unavailable\",\n detail: \"On-chain checking is unavailable. Retry later.\",\n glyph: \"?\",\n tone: \"neutral\",\n },\n};\n\n/** React Native counterpart of the web `PaymentReceipt`. */\nexport function PaymentReceiptNative({\n record,\n assets = {},\n onOpenExplorer,\n onCopy,\n theme: themeProp,\n}: PaymentReceiptNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const status = record.verification.status;\n const state = VERIFICATION[status];\n const colors = toneColors(theme, state.tone);\n const muted = { color: theme.mutedForeground };\n const amount =\n record.amount === null\n ? \"Amount not reported\"\n : /^\\d+$/.test(record.amount)\n ? formatAuthorizationAmount(\n BigInt(record.amount),\n record.asset ? assets[record.asset] : undefined,\n ).formatted\n : `${record.amount} base units`;\n\n return (\n <View\n testID={`verification-${status}`}\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.header}>\n <Text style={[styles.eyebrow, muted]}>PAYMENT RECEIPT</Text>\n <Text\n accessibilityRole=\"header\"\n style={[styles.amount, { color: theme.foreground }]}\n >\n {amount}\n </Text>\n <Text style={[styles.small, muted]}>\n {record.asset\n ? (assets[record.asset]?.symbol ?? record.asset)\n : \"Asset not reported\"}\n </Text>\n </View>\n\n <View\n testID=\"verification-panel\"\n accessibilityLiveRegion=\"polite\"\n accessible\n accessibilityLabel={`${state.title}. ${state.detail}${record.verification.reason ? ` Reason: ${record.verification.reason}` : \"\"}`}\n style={[\n styles.panel,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{state.glyph}</Glyph>\n <View style={styles.flexShrink}>\n <Text style={[styles.badge, { color: colors.color }]}>\n {state.title}\n </Text>\n <Text style={[styles.body, { color: colors.color }]}>\n {state.detail}\n </Text>\n {record.verification.reason && (\n <Text\n numberOfLines={2}\n style={[styles.body, styles.strong, { color: colors.color }]}\n >\n Reason: {record.verification.reason}\n </Text>\n )}\n </View>\n </View>\n\n <View style={styles.field}>\n <Text style={[styles.small, muted]}>Recipient</Text>\n {record.payTo ? (\n <CopyableValue value={record.payTo} onCopy={onCopy} theme={theme} />\n ) : (\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not reported\n </Text>\n )}\n </View>\n <View style={styles.row}>\n <View style={styles.cell}>\n <Text style={[styles.small, muted]}>Protocol</Text>\n <Text style={[styles.body, { color: theme.foreground }]}>\n {record.protocol === \"mpp\" ? \"MPP\" : record.protocol}\n </Text>\n </View>\n <View style={styles.cell}>\n <Text style={[styles.small, muted]}>Time</Text>\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not recorded\n </Text>\n </View>\n </View>\n <View style={styles.field}>\n <Text style={[styles.small, muted]}>Settlement reference</Text>\n {record.reference ? (\n <>\n <CopyableValue\n value={record.reference}\n onCopy={onCopy}\n theme={theme}\n />\n {onOpenExplorer && (\n <Pressable\n accessibilityRole=\"link\"\n accessibilityLabel=\"View on explorer\"\n onPress={() => onOpenExplorer(record)}\n style={styles.link}\n >\n <Text style={[styles.linkText, { color: theme.foreground }]}>\n View on explorer ↗\n </Text>\n </Pressable>\n )}\n </>\n ) : (\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not reported\n </Text>\n )}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderWidth: 1, borderRadius: 16, padding: 20, gap: 16 },\n header: { alignItems: \"center\", gap: 4 },\n eyebrow: { fontSize: 12, fontWeight: \"500\", letterSpacing: 0.6 },\n amount: {\n fontSize: 32,\n fontWeight: \"600\",\n fontVariant: [\"tabular-nums\"],\n textAlign: \"center\",\n },\n small: { fontSize: 12 },\n body: { fontSize: 14, lineHeight: 20 },\n strong: { fontWeight: \"600\" },\n // Fixed height: badge, explanation and a two-line reason fit, so the card\n // does not jump as verification moves from pending to its final state.\n panel: {\n height: 128,\n flexDirection: \"row\",\n gap: 8,\n borderWidth: 1,\n borderRadius: 10,\n padding: 12,\n overflow: \"hidden\",\n },\n flexShrink: { flexShrink: 1 },\n badge: { fontSize: 13, fontWeight: \"700\", marginBottom: 2 },\n field: { gap: 4 },\n row: { flexDirection: \"row\", gap: 12 },\n cell: { flex: 1, gap: 4 },\n link: { minHeight: 44, minWidth: 44, justifyContent: \"center\" },\n linkText: {\n fontSize: 13,\n fontWeight: \"500\",\n textDecorationLine: \"underline\",\n },\n});\n"],"mappings":"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","names":["StyleSheet","Text","View","jsx","jsx","jsxs","View","styles","Text","StyleSheet","describeAuthorization","useState","StyleSheet","Text","View","jsx","jsxs","View","styles","Text","useState","describeAuthorization","StyleSheet","formatAuthorizationAmount","Pressable","StyleSheet","Text","View","Fragment","jsx","jsxs","formatAuthorizationAmount","View","styles","Text","Pressable","StyleSheet"]}
1
+ {"version":3,"sources":["../../src/ui/AuthorizationConsentNative.tsx","../../src/ui/parts.tsx","../../src/ui/theme.tsx","../../src/ui/AuthorizationListNative.tsx","../../src/ui/PaymentReceiptNative.tsx"],"sourcesContent":["import {\n type AuthorizationAssetMetadata,\n type AuthorizationDescription,\n describeAuthorization,\n type SpendExplanation,\n} from \"@naculus/connect-appkit-core\";\nimport type { Authorization, ListedAuthorization } from \"@naculus/connect-core\";\nimport { Image, ScrollView, StyleSheet, Text, View } from \"react-native\";\nimport {\n ActionButton,\n Callout,\n CopyableValue,\n styles as shared,\n} from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface AuthorizationConsentNativeProps {\n /** Who asks: shown as \"Allow {name} to pay?\". */\n requester: { name: string; icon?: string; origin?: string };\n /** A raw authorization, or a description already built by the caller. */\n authorization: Authorization | ListedAuthorization | AuthorizationDescription;\n assets?: Record<string, AuthorizationAssetMetadata>;\n trustedAssets?: readonly string[];\n /** `explainSpend` result for the payment that triggered this consent. */\n preview?: SpendExplanation;\n onApprove: () => void;\n onDecline: () => void;\n /** Disables Approve and shows \"Approving…\". */\n busy?: boolean;\n /** Copies a recipient address; the copy button shows only when set. */\n onCopy?: (text: string) => void;\n /** BCP 47 locale for the expiry; English when omitted. */\n locale?: string;\n /** Unix timestamp in seconds, for a stable relative expiry. */\n now?: number;\n enforcement?: \"on-chain\" | \"device\";\n theme?: NativePaymentTheme;\n}\n\n/** React Native counterpart of the web `AuthorizationConsent`. */\nexport function AuthorizationConsentNative({\n authorization,\n assets = {},\n trustedAssets,\n locale,\n now,\n enforcement,\n requester,\n preview,\n onApprove,\n onDecline,\n busy = false,\n onCopy,\n theme: themeProp,\n}: AuthorizationConsentNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const description =\n \"expiry\" in authorization\n ? authorization\n : describeAuthorization(authorization, {\n assets,\n trustedAssets,\n locale,\n now,\n enforcement,\n });\n const muted = { color: theme.mutedForeground };\n\n return (\n <View style={[styles.root, { backgroundColor: theme.background }]}>\n <ScrollView contentContainerStyle={styles.content}>\n <View style={styles.requester}>\n {requester.icon ? (\n <Image\n accessibilityIgnoresInvertColors\n source={{ uri: requester.icon }}\n style={styles.avatar}\n />\n ) : (\n <View\n importantForAccessibility=\"no\"\n style={[styles.avatar, { backgroundColor: theme.muted }]}\n >\n <Text style={[styles.initial, { color: theme.foreground }]}>\n {requester.name.slice(0, 1).toUpperCase()}\n </Text>\n </View>\n )}\n <View style={styles.flexShrink}>\n <Text\n accessibilityRole=\"header\"\n style={[shared.heading, { color: theme.foreground }]}\n >\n Allow {requester.name} to pay?\n </Text>\n {requester.origin && (\n <Text style={[styles.small, muted]}>{requester.origin}</Text>\n )}\n </View>\n </View>\n\n {description.warnings.map((warning) => (\n <Callout\n key={warning}\n tone=\"warning\"\n glyph=\"⚠\"\n role=\"alert\"\n theme={theme}\n >\n <Text style={styles.strong}>{warning}</Text>\n </Callout>\n ))}\n\n {preview && (\n <Callout\n tone={preview.allowed ? \"success\" : \"danger\"}\n glyph={preview.allowed ? \"✓\" : \"✕\"}\n theme={theme}\n >\n <Text style={styles.strong}>\n {preview.allowed ? \"Allowed\" : \"Blocked\"}.\n </Text>{\" \"}\n {preview.sentence}\n </Callout>\n )}\n\n {description.grants.map((grant) => (\n <View\n key={`${grant.asset}:${grant.recipients.map((r) => r.full).join(\",\")}:${grant.perPayment.formatted}:${grant.total.formatted}`}\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <Text style={[styles.assetLabel, { color: theme.foreground }]}>\n {grant.assetLabel}\n </Text>\n {grant.assetTrust === \"unverified\" && (\n <Callout tone=\"warning\" glyph=\"⚠\" role=\"alert\" theme={theme}>\n <Text style={styles.strong}>\n Unverified token — not on the trusted list\n </Text>\n </Callout>\n )}\n <View style={styles.limits}>\n <View style={styles.limit}>\n <Text style={[shared.label, muted]}>Per payment</Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n {grant.perPayment.formatted}\n </Text>\n </View>\n <View style={styles.limit}>\n <Text style={[shared.label, muted]}>Total limit</Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n {grant.total.formatted}\n </Text>\n </View>\n </View>\n {grant.period && (\n <View>\n <Text style={[styles.term, { color: theme.foreground }]}>\n Period limit\n </Text>\n <Text style={[styles.amount, { color: theme.foreground }]}>\n Up to {grant.period.amount.formatted} every{\" \"}\n {grant.period.every}\n </Text>\n <Text style={[styles.small, muted]}>\n Starts {grant.period.startsAt}\n </Text>\n </View>\n )}\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Recipients\n </Text>\n {grant.recipients.length ? (\n grant.recipients.map((recipient) => (\n <CopyableValue\n key={recipient.full}\n value={recipient.full}\n display={recipient.shortened}\n onCopy={onCopy}\n theme={theme}\n />\n ))\n ) : (\n <Text style={[styles.strong, { color: theme.dangerForeground }]}>\n No recipient restriction is displayed\n </Text>\n )}\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Payment count\n </Text>\n <Text style={[styles.small, muted]}>\n {grant.count === null ? \"No count limit\" : `Up to ${grant.count}`}\n </Text>\n\n <Text style={[styles.term, { color: theme.foreground }]}>\n Payment methods\n </Text>\n <View style={styles.chips}>\n {grant.rails.map((rail) => (\n <View\n key={rail}\n style={[\n shared.chip,\n { backgroundColor: theme.muted, borderColor: theme.border },\n ]}\n >\n <Text style={[shared.chipText, { color: theme.foreground }]}>\n {rail}\n </Text>\n </View>\n ))}\n </View>\n </View>\n ))}\n\n {description.enforcementLabel && (\n <Text style={[styles.strong, { color: theme.foreground }]}>\n {description.enforcementLabel}\n </Text>\n )}\n\n <View style={[styles.expiry, { backgroundColor: theme.muted }]}>\n <Text style={[styles.strong, { color: theme.foreground }]}>\n Expires {description.expiry.relative}\n </Text>\n <Text style={[styles.small, muted]}>\n {description.expiry.absolute}\n </Text>\n </View>\n </ScrollView>\n\n {/* Outside the ScrollView so it stays on screen on short landscape phones. */}\n <View\n testID=\"payment-actions\"\n style={[\n styles.footer,\n { borderTopColor: theme.border, backgroundColor: theme.background },\n ]}\n >\n <ActionButton\n label=\"Decline\"\n variant=\"secondary\"\n onPress={onDecline}\n theme={theme}\n />\n <ActionButton\n label={busy ? \"Approving…\" : \"Approve\"}\n onPress={onApprove}\n disabled={busy}\n busy={busy}\n theme={theme}\n />\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n content: { padding: 16, gap: 12 },\n requester: { flexDirection: \"row\", alignItems: \"center\", gap: 12 },\n avatar: {\n width: 44,\n height: 44,\n borderRadius: 12,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n initial: { fontSize: 18, fontWeight: \"600\" },\n flexShrink: { flexShrink: 1 },\n small: { fontSize: 12 },\n strong: { fontWeight: \"700\" },\n card: { borderWidth: 1, borderRadius: 12, padding: 16, gap: 6 },\n assetLabel: { fontSize: 14, fontWeight: \"600\" },\n limits: { flexDirection: \"row\", gap: 12, marginVertical: 6 },\n limit: { flex: 1 },\n amount: {\n fontSize: 22,\n fontWeight: \"600\",\n fontVariant: [\"tabular-nums\"],\n },\n term: { fontSize: 14, fontWeight: \"500\", marginTop: 8 },\n chips: { flexDirection: \"row\", flexWrap: \"wrap\", gap: 6 },\n expiry: { borderRadius: 10, padding: 12, gap: 2 },\n footer: {\n flexDirection: \"row\",\n gap: 12,\n paddingHorizontal: 16,\n paddingVertical: 12,\n borderTopWidth: 1,\n },\n});\n","import { type ReactNode, useState } from \"react\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport type { NativePaymentTheme } from \"./theme\";\n\nexport type Tone = \"success\" | \"danger\" | \"warning\" | \"neutral\";\n\n/** Fill, border and text color of a tone. */\nexport function toneColors(theme: NativePaymentTheme, tone: Tone) {\n if (tone === \"success\")\n return {\n backgroundColor: theme.successBackground,\n borderColor: theme.successBorder,\n color: theme.successForeground,\n };\n if (tone === \"danger\")\n return {\n backgroundColor: theme.dangerBackground,\n borderColor: theme.dangerBorder,\n color: theme.dangerForeground,\n };\n if (tone === \"warning\")\n return {\n backgroundColor: theme.warningBackground,\n borderColor: theme.warningBorder,\n color: theme.warningForeground,\n };\n return {\n backgroundColor: theme.muted,\n borderColor: theme.border,\n color: theme.foreground,\n };\n}\n\n/** Decorative glyph, hidden from screen readers. */\nexport function Glyph({\n children,\n color,\n}: {\n children: string;\n color: string;\n}) {\n return (\n <Text\n accessible={false}\n importantForAccessibility=\"no\"\n accessibilityElementsHidden\n style={[styles.glyph, { color }]}\n >\n {children}\n </Text>\n );\n}\n\nexport function ActionButton({\n label,\n onPress,\n theme,\n variant = \"primary\",\n disabled = false,\n busy = false,\n}: {\n label: string;\n onPress: () => void;\n theme: NativePaymentTheme;\n variant?: \"primary\" | \"secondary\";\n disabled?: boolean;\n busy?: boolean;\n}) {\n const primary = variant === \"primary\";\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled, busy }}\n disabled={disabled}\n onPress={onPress}\n style={({ pressed }) => [\n styles.button,\n {\n backgroundColor: primary ? theme.primary : theme.background,\n borderColor: primary ? theme.primary : theme.border,\n opacity: disabled ? 0.55 : pressed ? 0.8 : 1,\n },\n ]}\n >\n <Text\n style={[\n styles.buttonLabel,\n { color: primary ? theme.primaryForeground : theme.foreground },\n ]}\n >\n {label}\n </Text>\n </Pressable>\n );\n}\n\n/**\n * An address or hash with an icon-only copy action. The app supplies\n * `onCopy` (Expo Clipboard, RN Clipboard, …); without it no button shows.\n */\nexport function CopyableValue({\n value,\n display,\n onCopy,\n theme,\n color = theme.foreground,\n}: {\n value: string;\n /** Shortened form from the view model; else truncated in the middle. */\n display?: string;\n onCopy?: (text: string) => void;\n theme: NativePaymentTheme;\n color?: string;\n}) {\n const [copied, setCopied] = useState(false);\n return (\n <View style={styles.copyRow}>\n <Text\n accessibilityLabel={value}\n numberOfLines={1}\n ellipsizeMode=\"middle\"\n style={[styles.mono, { color }]}\n >\n {display ?? value}\n </Text>\n {onCopy && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? `Copied ${value}` : `Copy ${value}`}\n hitSlop={6}\n onPress={() => {\n onCopy(value);\n setCopied(true);\n }}\n style={({ pressed }) => [\n styles.iconButton,\n { borderColor: theme.border, opacity: pressed ? 0.7 : 1 },\n ]}\n >\n <Glyph color={theme.foreground}>{copied ? \"✓\" : \"⧉\"}</Glyph>\n </Pressable>\n )}\n </View>\n );\n}\n\n/** A colored callout: warnings, preview verdicts, notices. */\nexport function Callout({\n tone,\n glyph,\n theme,\n role,\n children,\n}: {\n tone: Tone;\n glyph: string;\n theme: NativePaymentTheme;\n role?: \"alert\";\n children: ReactNode;\n}) {\n const colors = toneColors(theme, tone);\n return (\n <View\n accessibilityRole={role}\n style={[\n styles.callout,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{glyph}</Glyph>\n <Text style={[styles.calloutText, { color: colors.color }]}>\n {children}\n </Text>\n </View>\n );\n}\n\nexport const styles = StyleSheet.create({\n glyph: { fontSize: 16, lineHeight: 20, fontWeight: \"700\" },\n button: {\n flex: 1,\n minHeight: 48,\n minWidth: 44,\n borderRadius: 10,\n borderWidth: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 16,\n },\n buttonLabel: { fontSize: 16, fontWeight: \"600\" },\n copyRow: { flexDirection: \"row\", alignItems: \"center\", gap: 6 },\n mono: { flexShrink: 1, fontFamily: \"monospace\", fontSize: 13 },\n iconButton: {\n width: 32,\n height: 32,\n borderRadius: 8,\n borderWidth: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n callout: {\n flexDirection: \"row\",\n gap: 8,\n borderWidth: 1,\n borderRadius: 10,\n padding: 12,\n },\n calloutText: { flex: 1, fontSize: 14, lineHeight: 20 },\n label: { fontSize: 12, fontWeight: \"500\" },\n heading: { fontSize: 18, fontWeight: \"600\" },\n chip: {\n borderWidth: 1,\n borderRadius: 999,\n paddingHorizontal: 10,\n paddingVertical: 4,\n },\n chipText: { fontSize: 12 },\n});\n","import { createContext, type ReactNode, useContext } from \"react\";\nimport { useColorScheme } from \"react-native\";\n\n/**\n * Colors for the payment components. The values come from the appkit tokens\n * (`packages/ui/src/styles/tokens.css`, converted from HSL to hex). Where a\n * token pair falls below 4.5:1 on a payment surface — muted text on the muted\n * fill, the light destructive red as text — the text color is the darker\n * (light) or lighter (dark) step of the same hue, so every text/background\n * pair the components use meets WCAG AA.\n */\nexport interface NativePaymentTheme {\n scheme: \"light\" | \"dark\";\n background: string;\n foreground: string;\n card: string;\n border: string;\n muted: string;\n mutedForeground: string;\n primary: string;\n primaryForeground: string;\n /** Verified receipts and allowed previews only. */\n successBackground: string;\n successBorder: string;\n successForeground: string;\n /** Mismatch / failed receipts, blocked previews, missing restrictions. */\n dangerBackground: string;\n dangerBorder: string;\n dangerForeground: string;\n /** Non-dismissible warnings. */\n warningBackground: string;\n warningBorder: string;\n warningForeground: string;\n}\n\nexport const lightPaymentTheme: NativePaymentTheme = {\n scheme: \"light\",\n background: \"#ffffff\", // --background 0 0% 100%\n foreground: \"#020817\", // --foreground 222.2 84% 4.9%\n card: \"#ffffff\", // --card\n border: \"#e2e8f0\", // --border 214.3 31.8% 91.4%\n muted: \"#f1f5f9\", // --muted 210 40% 96.1%\n mutedForeground: \"#475569\", // --muted-foreground hue, one step darker\n primary: \"#0f172a\", // --primary 222.2 47.4% 11.2%\n primaryForeground: \"#f8fafc\", // --primary-foreground 210 40% 98%\n successBackground: \"#ecfdf5\",\n successBorder: \"#047857\",\n successForeground: \"#064e3b\",\n dangerBackground: \"#fef2f2\",\n dangerBorder: \"#ef4444\", // --destructive 0 84.2% 60.2%\n dangerForeground: \"#991b1b\",\n warningBackground: \"#fffbeb\",\n warningBorder: \"#b45309\",\n warningForeground: \"#451a03\",\n};\n\nexport const darkPaymentTheme: NativePaymentTheme = {\n scheme: \"dark\",\n background: \"#020817\", // .dark --background\n foreground: \"#f8fafc\", // .dark --foreground\n card: \"#020817\", // .dark --card\n border: \"#1e293b\", // .dark --border 217.2 32.6% 17.5%\n muted: \"#1e293b\", // .dark --muted\n mutedForeground: \"#94a3b8\", // .dark --muted-foreground 215 20.2% 65.1%\n primary: \"#f8fafc\", // .dark --primary\n primaryForeground: \"#0f172a\", // .dark --primary-foreground\n successBackground: \"#022c22\",\n successBorder: \"#10b981\",\n successForeground: \"#d1fae5\",\n dangerBackground: \"#450a0a\",\n dangerBorder: \"#f87171\",\n dangerForeground: \"#fecaca\",\n warningBackground: \"#451a03\",\n warningBorder: \"#f59e0b\",\n warningForeground: \"#fef3c7\",\n};\n\nconst ThemeContext = createContext<NativePaymentTheme | undefined>(undefined);\n\nexport function NativePaymentThemeProvider({\n theme,\n children,\n}: {\n theme: NativePaymentTheme;\n children: ReactNode;\n}) {\n return (\n <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>\n );\n}\n\n/** The `theme` prop, else the provider's theme, else the system scheme. */\nexport function useNativePaymentTheme(\n override?: NativePaymentTheme,\n): NativePaymentTheme {\n const provided = useContext(ThemeContext);\n const scheme = useColorScheme();\n return (\n override ??\n provided ??\n (scheme === \"dark\" ? darkPaymentTheme : lightPaymentTheme)\n );\n}\n","import {\n type AuthorizationAssetMetadata,\n describeAuthorization,\n formatAuthorizationAmount,\n} from \"@naculus/connect-appkit-core\";\nimport type {\n ListedAuthorization,\n ListedAuthorizationStatus,\n RevokeListedAuthorizationResult,\n} from \"@naculus/connect-core\";\nimport { useState } from \"react\";\nimport { FlatList, StyleSheet, Text, View } from \"react-native\";\nimport {\n ActionButton,\n Callout,\n CopyableValue,\n Glyph,\n styles as shared,\n toneColors,\n} from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface AuthorizationListNativeProps {\n entries: ListedAuthorization[] | { entries: ListedAuthorization[] };\n assets?: Record<string, AuthorizationAssetMetadata>;\n trustedAssets?: readonly string[];\n onRevoke: (\n entry: ListedAuthorization,\n ) =>\n | RevokeListedAuthorizationResult\n | Promise<RevokeListedAuthorizationResult>;\n /** keyId of the entry being revoked. */\n revokingId?: string;\n /** BCP 47 locale for expiry dates; English when omitted. */\n locale?: string;\n getEnforcement?: (\n entry: ListedAuthorization,\n ) => \"on-chain\" | \"device\" | undefined;\n onCopy?: (text: string) => void;\n theme?: NativePaymentTheme;\n}\n\nconst ENFORCER_LABELS: Record<string, string> = {\n \"evm-session\": \"EVM session key\",\n \"solana-session\": \"Solana session key\",\n \"mpp-voucher\": \"MPP channel key\",\n};\n\nconst STATUS_GLYPHS: Record<ListedAuthorizationStatus, string> = {\n active: \"●\",\n pending: \"◐\",\n revoked: \"✕\",\n expired: \"○\",\n};\n\nfunction StatusBadge({\n status,\n theme,\n}: {\n status: ListedAuthorizationStatus;\n theme: NativePaymentTheme;\n}) {\n const colors =\n status === \"active\"\n ? {\n backgroundColor: theme.primary,\n borderColor: theme.primary,\n color: theme.primaryForeground,\n }\n : status === \"pending\"\n ? {\n backgroundColor: theme.background,\n borderColor: theme.foreground,\n color: theme.foreground,\n }\n : status === \"revoked\"\n ? toneColors(theme, \"danger\")\n : {\n backgroundColor: theme.muted,\n borderColor: theme.border,\n color: theme.mutedForeground,\n };\n return (\n <View\n accessibilityLabel={`Status: ${status}`}\n style={[\n shared.chip,\n styles.badge,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{STATUS_GLYPHS[status]}</Glyph>\n <Text style={[styles.badgeText, { color: colors.color }]}>{status}</Text>\n </View>\n );\n}\n\n/** React Native counterpart of the web `AuthorizationList`. */\nexport function AuthorizationListNative({\n entries: input,\n assets = {},\n trustedAssets,\n onRevoke,\n revokingId,\n locale,\n getEnforcement,\n onCopy,\n theme: themeProp,\n}: AuthorizationListNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const entries = Array.isArray(input) ? input : input.entries;\n const [confirming, setConfirming] = useState<string | null>(null);\n const [onChain, setOnChain] = useState<ReadonlySet<string>>(new Set());\n const muted = { color: theme.mutedForeground };\n\n const revoke = (entry: ListedAuthorization) =>\n void Promise.resolve(onRevoke(entry)).then((result) => {\n setConfirming(null);\n if (result.onChainRevocationRequired)\n setOnChain((current) => new Set(current).add(entry.keyId));\n });\n\n const renderItem = ({ item: entry }: { item: ListedAuthorization }) => {\n const view = describeAuthorization(entry, {\n assets,\n trustedAssets,\n locale,\n enforcement: getEnforcement?.(entry),\n });\n const busy = revokingId === entry.keyId;\n const live = entry.status === \"active\" || entry.status === \"pending\";\n return (\n <View\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.cardHeader}>\n <View style={styles.flexShrink}>\n <Text style={[styles.title, { color: theme.foreground }]}>\n {view.label ?? view.grants.map((g) => g.assetLabel).join(\", \")}\n </Text>\n <Text style={[styles.small, muted]}>\n {ENFORCER_LABELS[entry.enforcer] ??\n entry.enforcer.replaceAll(\"-\", \" \")}\n </Text>\n </View>\n <StatusBadge status={entry.status} theme={theme} />\n </View>\n\n {view.grants.map((grant) => {\n const spent = entry.spent?.[grant.asset];\n const total = entry.grants.find(\n (g) => g.asset === grant.asset,\n )?.maxTotal;\n const percent =\n spent !== undefined && total && total > 0n\n ? Math.min(Number((spent * 100n) / total), 100)\n : 0;\n return (\n <View\n key={grant.asset}\n style={[styles.grant, { backgroundColor: theme.muted }]}\n >\n {view.label && (\n <Text style={[styles.strong, { color: theme.foreground }]}>\n {grant.assetLabel}\n </Text>\n )}\n {grant.assetTrust === \"unverified\" && (\n <Callout tone=\"warning\" glyph=\"⚠\" role=\"alert\" theme={theme}>\n Unverified token — not on the trusted list\n </Callout>\n )}\n {grant.recipients.map((recipient) => (\n <CopyableValue\n key={recipient.full}\n value={recipient.full}\n display={recipient.shortened}\n onCopy={onCopy}\n theme={theme}\n />\n ))}\n {grant.period && (\n <View>\n <Text style={[styles.strong, { color: theme.foreground }]}>\n Up to {grant.period.amount.formatted} every{\" \"}\n {grant.period.every}\n </Text>\n <Text style={[styles.small, muted]}>\n Starts {grant.period.startsAt}\n </Text>\n </View>\n )}\n {spent !== undefined && (\n <View>\n <View style={styles.spentRow}>\n <Text style={[styles.small, { color: theme.foreground }]}>\n Spent{\" \"}\n {\n formatAuthorizationAmount(\n spent,\n grant.assetTrust === \"unverified\"\n ? undefined\n : assets[grant.asset],\n ).formatted\n }\n </Text>\n <Text style={[styles.small, { color: theme.foreground }]}>\n Total {grant.total.formatted}\n </Text>\n </View>\n <View\n accessibilityRole=\"progressbar\"\n accessibilityLabel={`${grant.assetLabel} spent`}\n accessibilityValue={{ min: 0, max: 100, now: percent }}\n style={[\n styles.track,\n { backgroundColor: theme.background },\n ]}\n >\n <View\n style={[\n styles.fill,\n {\n width: `${percent}%`,\n backgroundColor: theme.primary,\n },\n ]}\n />\n </View>\n </View>\n )}\n </View>\n );\n })}\n\n {view.enforcementLabel && (\n <Text style={[styles.strong, { color: theme.foreground }]}>\n {view.enforcementLabel}\n </Text>\n )}\n\n <Text style={[styles.small, muted]}>\n {entry.status === \"expired\"\n ? \"Expired\"\n : entry.status === \"revoked\"\n ? \"Revoked\"\n : `Expires ${view.expiry.relative}`}{\" \"}\n · {view.expiry.absolute}\n </Text>\n\n {view.warnings.map((warning) => (\n <Callout\n key={warning}\n tone=\"warning\"\n glyph=\"⚠\"\n role=\"alert\"\n theme={theme}\n >\n {warning}\n </Callout>\n ))}\n\n {onChain.has(entry.keyId) && (\n <Callout tone=\"warning\" glyph=\"⛓\" theme={theme}>\n Local access is revoked. Complete the on-chain revocation to stop\n this authorization on chain.\n </Callout>\n )}\n\n {live && (\n <View style={[styles.actions, { borderTopColor: theme.border }]}>\n {confirming === entry.keyId ? (\n <>\n <ActionButton\n label=\"Cancel\"\n variant=\"secondary\"\n onPress={() => setConfirming(null)}\n theme={theme}\n />\n <ActionButton\n label={busy ? \"Revoking…\" : \"Confirm revoke\"}\n disabled={busy}\n busy={busy}\n onPress={() => revoke(entry)}\n theme={theme}\n />\n </>\n ) : (\n <ActionButton\n label=\"Revoke\"\n variant=\"secondary\"\n onPress={() => setConfirming(entry.keyId)}\n theme={theme}\n />\n )}\n </View>\n )}\n </View>\n );\n };\n\n return (\n <FlatList\n data={entries}\n keyExtractor={(entry) => entry.keyId}\n renderItem={renderItem}\n extraData={[confirming, onChain, revokingId, theme]}\n contentContainerStyle={styles.list}\n style={{ backgroundColor: theme.background }}\n ListHeaderComponent={\n entries.length ? (\n <Text\n accessibilityRole=\"header\"\n style={[shared.heading, { color: theme.foreground }]}\n >\n Payment authorizations\n </Text>\n ) : undefined\n }\n ListEmptyComponent={\n <View style={[styles.empty, { borderColor: theme.border }]}>\n <Text\n accessibilityRole=\"header\"\n style={[styles.title, { color: theme.foreground }]}\n >\n No payment authorizations\n </Text>\n <Text style={[styles.body, muted]}>\n Approvals you create will appear here.\n </Text>\n </View>\n }\n />\n );\n}\n\nconst styles = StyleSheet.create({\n list: { padding: 16, gap: 12 },\n card: { borderWidth: 1, borderRadius: 12, padding: 16, gap: 10 },\n cardHeader: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: 8,\n },\n flexShrink: { flexShrink: 1 },\n title: { fontSize: 16, fontWeight: \"600\" },\n small: { fontSize: 12 },\n body: { fontSize: 14, textAlign: \"center\" },\n strong: { fontSize: 14, fontWeight: \"500\" },\n badge: { flexDirection: \"row\", alignItems: \"center\", gap: 4 },\n badgeText: { fontSize: 12, fontWeight: \"600\", textTransform: \"capitalize\" },\n grant: { borderRadius: 10, padding: 12, gap: 6 },\n spentRow: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n gap: 8,\n },\n track: { height: 8, borderRadius: 4, overflow: \"hidden\", marginTop: 4 },\n fill: { height: \"100%\" },\n actions: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n gap: 8,\n borderTopWidth: 1,\n paddingTop: 12,\n },\n empty: {\n borderWidth: 1,\n borderStyle: \"dashed\",\n borderRadius: 12,\n padding: 32,\n alignItems: \"center\",\n gap: 4,\n },\n});\n","import {\n type AuthorizationAssetMetadata,\n formatAuthorizationAmount,\n type PaymentRecord,\n type PaymentVerificationStatus,\n} from \"@naculus/connect-appkit-core\";\nimport { Pressable, StyleSheet, Text, View } from \"react-native\";\nimport { CopyableValue, Glyph, type Tone, toneColors } from \"./parts\";\nimport { type NativePaymentTheme, useNativePaymentTheme } from \"./theme\";\n\nexport interface PaymentReceiptNativeProps {\n record: PaymentRecord;\n assets?: Record<string, AuthorizationAssetMetadata>;\n /**\n * Accepted for parity with the other payment components; the receipt has\n * no locale-dependent text yet (amounts use the core formatter).\n */\n locale?: string;\n /** Shows \"View on explorer\" when set and the record has a reference. */\n onOpenExplorer?: (record: PaymentRecord) => void;\n /** Copies the recipient or settlement reference. */\n onCopy?: (text: string) => void;\n theme?: NativePaymentTheme;\n}\n\nconst VERIFICATION: Record<\n PaymentVerificationStatus,\n { title: string; detail: string; glyph: string; tone: Tone }\n> = {\n unverified: {\n title: \"Unverified\",\n detail: \"Reported by the server, not yet checked.\",\n glyph: \"?\",\n tone: \"neutral\",\n },\n pending: {\n title: \"Checking\",\n detail: \"Checking on chain.\",\n glyph: \"…\",\n tone: \"neutral\",\n },\n verified: {\n title: \"Verified\",\n detail: \"Verified on chain.\",\n glyph: \"✓\",\n tone: \"success\",\n },\n mismatch: {\n title: \"Mismatch\",\n detail: \"The on-chain settlement does not match this payment.\",\n glyph: \"!\",\n tone: \"danger\",\n },\n failed: {\n title: \"Verification failed\",\n detail: \"The settlement could not be verified.\",\n glyph: \"!\",\n tone: \"danger\",\n },\n unavailable: {\n title: \"Verification unavailable\",\n detail: \"On-chain checking is unavailable. Retry later.\",\n glyph: \"?\",\n tone: \"neutral\",\n },\n};\n\n/** React Native counterpart of the web `PaymentReceipt`. */\nexport function PaymentReceiptNative({\n record,\n assets = {},\n onOpenExplorer,\n onCopy,\n theme: themeProp,\n}: PaymentReceiptNativeProps) {\n const theme = useNativePaymentTheme(themeProp);\n const status = record.verification.status;\n const state = VERIFICATION[status];\n const colors = toneColors(theme, state.tone);\n const muted = { color: theme.mutedForeground };\n const amount =\n record.amount === null\n ? \"Amount not reported\"\n : /^\\d+$/.test(record.amount)\n ? formatAuthorizationAmount(\n BigInt(record.amount),\n record.asset ? assets[record.asset] : undefined,\n ).formatted\n : `${record.amount} base units`;\n\n return (\n <View\n testID={`verification-${status}`}\n style={[\n styles.card,\n { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n >\n <View style={styles.header}>\n <Text style={[styles.eyebrow, muted]}>PAYMENT RECEIPT</Text>\n <Text\n accessibilityRole=\"header\"\n style={[styles.amount, { color: theme.foreground }]}\n >\n {amount}\n </Text>\n <Text style={[styles.small, muted]}>\n {record.asset\n ? (assets[record.asset]?.symbol ?? record.asset)\n : \"Asset not reported\"}\n </Text>\n </View>\n\n <View\n testID=\"verification-panel\"\n accessibilityLiveRegion=\"polite\"\n accessible\n accessibilityLabel={`${state.title}. ${state.detail}${record.verification.reason ? ` Reason: ${record.verification.reason}` : \"\"}`}\n style={[\n styles.panel,\n {\n backgroundColor: colors.backgroundColor,\n borderColor: colors.borderColor,\n },\n ]}\n >\n <Glyph color={colors.color}>{state.glyph}</Glyph>\n <View style={styles.flexShrink}>\n <Text style={[styles.badge, { color: colors.color }]}>\n {state.title}\n </Text>\n <Text style={[styles.body, { color: colors.color }]}>\n {state.detail}\n </Text>\n {record.verification.reason && (\n <Text\n numberOfLines={2}\n style={[styles.body, styles.strong, { color: colors.color }]}\n >\n Reason: {record.verification.reason}\n </Text>\n )}\n </View>\n </View>\n\n <View style={styles.field}>\n <Text style={[styles.small, muted]}>Recipient</Text>\n {record.payTo ? (\n <CopyableValue value={record.payTo} onCopy={onCopy} theme={theme} />\n ) : (\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not reported\n </Text>\n )}\n </View>\n <View style={styles.row}>\n <View style={styles.cell}>\n <Text style={[styles.small, muted]}>Protocol</Text>\n <Text style={[styles.body, { color: theme.foreground }]}>\n {record.protocol === \"mpp\" ? \"MPP\" : record.protocol}\n </Text>\n </View>\n <View style={styles.cell}>\n <Text style={[styles.small, muted]}>Time</Text>\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not recorded\n </Text>\n </View>\n </View>\n <View style={styles.field}>\n <Text style={[styles.small, muted]}>Settlement reference</Text>\n {record.reference ? (\n <>\n <CopyableValue\n value={record.reference}\n onCopy={onCopy}\n theme={theme}\n />\n {onOpenExplorer && (\n <Pressable\n accessibilityRole=\"link\"\n accessibilityLabel=\"View on explorer\"\n onPress={() => onOpenExplorer(record)}\n style={styles.link}\n >\n <Text style={[styles.linkText, { color: theme.foreground }]}>\n View on explorer ↗\n </Text>\n </Pressable>\n )}\n </>\n ) : (\n <Text style={[styles.body, { color: theme.foreground }]}>\n Not reported\n </Text>\n )}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { borderWidth: 1, borderRadius: 16, padding: 20, gap: 16 },\n header: { alignItems: \"center\", gap: 4 },\n eyebrow: { fontSize: 12, fontWeight: \"500\", letterSpacing: 0.6 },\n amount: {\n fontSize: 32,\n fontWeight: \"600\",\n fontVariant: [\"tabular-nums\"],\n textAlign: \"center\",\n },\n small: { fontSize: 12 },\n body: { fontSize: 14, lineHeight: 20 },\n strong: { fontWeight: \"600\" },\n // Fixed height: badge, explanation and a two-line reason fit, so the card\n // does not jump as verification moves from pending to its final state.\n panel: {\n height: 128,\n flexDirection: \"row\",\n gap: 8,\n borderWidth: 1,\n borderRadius: 10,\n padding: 12,\n overflow: \"hidden\",\n },\n flexShrink: { flexShrink: 1 },\n badge: { fontSize: 13, fontWeight: \"700\", marginBottom: 2 },\n field: { gap: 4 },\n row: { flexDirection: \"row\", gap: 12 },\n cell: { flex: 1, gap: 4 },\n link: { minHeight: 44, minWidth: 44, justifyContent: \"center\" },\n linkText: {\n fontSize: 13,\n fontWeight: \"500\",\n textDecorationLine: \"underline\",\n },\n});\n"],"mappings":"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","names":["StyleSheet","Text","View","jsx","jsx","jsxs","View","styles","Text","StyleSheet","describeAuthorization","useState","StyleSheet","Text","View","jsx","jsxs","View","styles","Text","useState","describeAuthorization","StyleSheet","formatAuthorizationAmount","Pressable","StyleSheet","Text","View","Fragment","jsx","jsxs","formatAuthorizationAmount","View","styles","Text","Pressable","StyleSheet"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naculus/connect-native",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -21,10 +21,10 @@
21
21
  "dist"
22
22
  ],
23
23
  "peerDependencies": {
24
- "@naculus/connect-appkit-core": "^0.9.0",
25
- "@naculus/connect-core": "^0.8.0",
26
- "@naculus/connect-appkit-react": "^0.9.0",
27
- "@naculus/wallet-engine": "^0.8.0",
24
+ "@naculus/connect-appkit-core": "^0.11.0",
25
+ "@naculus/connect-core": "^0.10.0",
26
+ "@naculus/connect-appkit-react": "^0.11.0",
27
+ "@naculus/wallet-engine": "^0.10.0",
28
28
  "react-native": "*",
29
29
  "@react-native-async-storage/async-storage": "*",
30
30
  "@walletconnect/react-native-compat": "*",
@@ -33,12 +33,12 @@
33
33
  "expo-secure-store": "*"
34
34
  },
35
35
  "devDependencies": {
36
- "@naculus/connect-core": "^0.8.0",
37
- "@naculus/wallet-engine": "^0.8.0",
36
+ "@naculus/connect-core": "^0.10.0",
37
+ "@naculus/wallet-engine": "^0.10.0",
38
38
  "tsup": "^8.5.1",
39
39
  "typescript": "^6.0.3",
40
- "@naculus/connect-appkit-react": "0.9.0",
41
- "@naculus/connect-appkit-core": "0.9.0"
40
+ "@naculus/connect-appkit-react": "0.11.0",
41
+ "@naculus/connect-appkit-core": "0.11.0"
42
42
  },
43
43
  "publishConfig": {
44
44
  "access": "public",