@naculus/connect-native 0.10.0 → 0.11.1

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
@@ -304,6 +304,7 @@ function AuthorizationConsentNative({
304
304
  trustedAssets,
305
305
  locale,
306
306
  now,
307
+ enforcement,
307
308
  requester,
308
309
  preview,
309
310
  onApprove,
@@ -317,7 +318,8 @@ function AuthorizationConsentNative({
317
318
  assets,
318
319
  trustedAssets,
319
320
  locale,
320
- now
321
+ now,
322
+ enforcement
321
323
  });
322
324
  const muted = { color: theme.mutedForeground };
323
325
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.View, { style: [styles2.root, { backgroundColor: theme.background }], children: [
@@ -401,6 +403,20 @@ function AuthorizationConsentNative({
401
403
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles2.amount, { color: theme.foreground }], children: grant.total.formatted })
402
404
  ] })
403
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
+ ] }),
404
420
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles2.term, { color: theme.foreground }], children: "Recipients" }),
405
421
  grant.recipients.length ? grant.recipients.map((recipient) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
406
422
  CopyableValue,
@@ -430,6 +446,7 @@ function AuthorizationConsentNative({
430
446
  },
431
447
  `${grant.asset}:${grant.recipients.map((r) => r.full).join(",")}:${grant.perPayment.formatted}:${grant.total.formatted}`
432
448
  )),
449
+ description.enforcementLabel && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native3.Text, { style: [styles2.strong, { color: theme.foreground }], children: description.enforcementLabel }),
433
450
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.View, { style: [styles2.expiry, { backgroundColor: theme.muted }], children: [
434
451
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react_native3.Text, { style: [styles2.strong, { color: theme.foreground }], children: [
435
452
  "Expires ",
@@ -566,6 +583,7 @@ function AuthorizationListNative({
566
583
  onRevoke,
567
584
  revokingId,
568
585
  locale,
586
+ getEnforcement,
569
587
  onCopy,
570
588
  theme: themeProp
571
589
  }) {
@@ -583,7 +601,8 @@ function AuthorizationListNative({
583
601
  const view = (0, import_connect_appkit_core2.describeAuthorization)(entry, {
584
602
  assets,
585
603
  trustedAssets,
586
- locale
604
+ locale,
605
+ enforcement: getEnforcement?.(entry)
587
606
  });
588
607
  const busy = revokingId === entry.keyId;
589
608
  const live = entry.status === "active" || entry.status === "pending";
@@ -625,6 +644,19 @@ function AuthorizationListNative({
625
644
  },
626
645
  recipient.full
627
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
+ ] }),
628
660
  spent !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.View, { children: [
629
661
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.View, { style: styles3.spentRow, children: [
630
662
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.Text, { style: [styles3.small, { color: theme.foreground }], children: [
@@ -670,6 +702,7 @@ function AuthorizationListNative({
670
702
  grant.asset
671
703
  );
672
704
  }),
705
+ view.enforcementLabel && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native4.Text, { style: [styles3.strong, { color: theme.foreground }], children: view.enforcementLabel }),
673
706
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native4.Text, { style: [styles3.small, muted], children: [
674
707
  entry.status === "expired" ? "Expired" : entry.status === "revoked" ? "Revoked" : `Expires ${view.expiry.relative}`,
675
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 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 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 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 });\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\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 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 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 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 });\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 {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 <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"]}
@@ -66,10 +66,11 @@ interface AuthorizationConsentNativeProps {
66
66
  locale?: string;
67
67
  /** Unix timestamp in seconds, for a stable relative expiry. */
68
68
  now?: number;
69
+ enforcement?: "on-chain" | "device";
69
70
  theme?: NativePaymentTheme;
70
71
  }
71
72
  /** React Native counterpart of the web `AuthorizationConsent`. */
72
- declare function AuthorizationConsentNative({ authorization, assets, trustedAssets, 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;
73
74
 
74
75
  interface AuthorizationListNativeProps {
75
76
  entries: ListedAuthorization[] | {
@@ -82,11 +83,12 @@ interface AuthorizationListNativeProps {
82
83
  revokingId?: string;
83
84
  /** BCP 47 locale for expiry dates; English when omitted. */
84
85
  locale?: string;
86
+ getEnforcement?: (entry: ListedAuthorization) => "on-chain" | "device" | undefined;
85
87
  onCopy?: (text: string) => void;
86
88
  theme?: NativePaymentTheme;
87
89
  }
88
90
  /** React Native counterpart of the web `AuthorizationList`. */
89
- declare function AuthorizationListNative({ entries: input, assets, trustedAssets, 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;
90
92
 
91
93
  interface PaymentReceiptNativeProps {
92
94
  record: PaymentRecord;
@@ -66,10 +66,11 @@ interface AuthorizationConsentNativeProps {
66
66
  locale?: string;
67
67
  /** Unix timestamp in seconds, for a stable relative expiry. */
68
68
  now?: number;
69
+ enforcement?: "on-chain" | "device";
69
70
  theme?: NativePaymentTheme;
70
71
  }
71
72
  /** React Native counterpart of the web `AuthorizationConsent`. */
72
- declare function AuthorizationConsentNative({ authorization, assets, trustedAssets, 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;
73
74
 
74
75
  interface AuthorizationListNativeProps {
75
76
  entries: ListedAuthorization[] | {
@@ -82,11 +83,12 @@ interface AuthorizationListNativeProps {
82
83
  revokingId?: string;
83
84
  /** BCP 47 locale for expiry dates; English when omitted. */
84
85
  locale?: string;
86
+ getEnforcement?: (entry: ListedAuthorization) => "on-chain" | "device" | undefined;
85
87
  onCopy?: (text: string) => void;
86
88
  theme?: NativePaymentTheme;
87
89
  }
88
90
  /** React Native counterpart of the web `AuthorizationList`. */
89
- declare function AuthorizationListNative({ entries: input, assets, trustedAssets, 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;
90
92
 
91
93
  interface PaymentReceiptNativeProps {
92
94
  record: PaymentRecord;
package/dist/ui/index.js CHANGED
@@ -274,6 +274,7 @@ function AuthorizationConsentNative({
274
274
  trustedAssets,
275
275
  locale,
276
276
  now,
277
+ enforcement,
277
278
  requester,
278
279
  preview,
279
280
  onApprove,
@@ -287,7 +288,8 @@ function AuthorizationConsentNative({
287
288
  assets,
288
289
  trustedAssets,
289
290
  locale,
290
- now
291
+ now,
292
+ enforcement
291
293
  });
292
294
  const muted = { color: theme.mutedForeground };
293
295
  return /* @__PURE__ */ jsxs2(View2, { style: [styles2.root, { backgroundColor: theme.background }], children: [
@@ -371,6 +373,20 @@ function AuthorizationConsentNative({
371
373
  /* @__PURE__ */ jsx3(Text2, { style: [styles2.amount, { color: theme.foreground }], children: grant.total.formatted })
372
374
  ] })
373
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
+ ] }),
374
390
  /* @__PURE__ */ jsx3(Text2, { style: [styles2.term, { color: theme.foreground }], children: "Recipients" }),
375
391
  grant.recipients.length ? grant.recipients.map((recipient) => /* @__PURE__ */ jsx3(
376
392
  CopyableValue,
@@ -400,6 +416,7 @@ function AuthorizationConsentNative({
400
416
  },
401
417
  `${grant.asset}:${grant.recipients.map((r) => r.full).join(",")}:${grant.perPayment.formatted}:${grant.total.formatted}`
402
418
  )),
419
+ description.enforcementLabel && /* @__PURE__ */ jsx3(Text2, { style: [styles2.strong, { color: theme.foreground }], children: description.enforcementLabel }),
403
420
  /* @__PURE__ */ jsxs2(View2, { style: [styles2.expiry, { backgroundColor: theme.muted }], children: [
404
421
  /* @__PURE__ */ jsxs2(Text2, { style: [styles2.strong, { color: theme.foreground }], children: [
405
422
  "Expires ",
@@ -539,6 +556,7 @@ function AuthorizationListNative({
539
556
  onRevoke,
540
557
  revokingId,
541
558
  locale,
559
+ getEnforcement,
542
560
  onCopy,
543
561
  theme: themeProp
544
562
  }) {
@@ -556,7 +574,8 @@ function AuthorizationListNative({
556
574
  const view = describeAuthorization2(entry, {
557
575
  assets,
558
576
  trustedAssets,
559
- locale
577
+ locale,
578
+ enforcement: getEnforcement?.(entry)
560
579
  });
561
580
  const busy = revokingId === entry.keyId;
562
581
  const live = entry.status === "active" || entry.status === "pending";
@@ -598,6 +617,19 @@ function AuthorizationListNative({
598
617
  },
599
618
  recipient.full
600
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
+ ] }),
601
633
  spent !== void 0 && /* @__PURE__ */ jsxs3(View3, { children: [
602
634
  /* @__PURE__ */ jsxs3(View3, { style: styles3.spentRow, children: [
603
635
  /* @__PURE__ */ jsxs3(Text3, { style: [styles3.small, { color: theme.foreground }], children: [
@@ -643,6 +675,7 @@ function AuthorizationListNative({
643
675
  grant.asset
644
676
  );
645
677
  }),
678
+ view.enforcementLabel && /* @__PURE__ */ jsx4(Text3, { style: [styles3.strong, { color: theme.foreground }], children: view.enforcementLabel }),
646
679
  /* @__PURE__ */ jsxs3(Text3, { style: [styles3.small, muted], children: [
647
680
  entry.status === "expired" ? "Expired" : entry.status === "revoked" ? "Revoked" : `Expires ${view.expiry.relative}`,
648
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 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 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 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 });\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\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 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 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 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 });\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 {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 <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.10.0",
3
+ "version": "0.11.1",
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.10.0",
25
- "@naculus/connect-core": "^0.9.0",
26
- "@naculus/connect-appkit-react": "^0.10.0",
27
- "@naculus/wallet-engine": "^0.9.0",
24
+ "@naculus/connect-appkit-core": "^0.11.1",
25
+ "@naculus/connect-core": "^0.11.0",
26
+ "@naculus/connect-appkit-react": "^0.11.1",
27
+ "@naculus/wallet-engine": "^0.11.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.9.0",
37
- "@naculus/wallet-engine": "^0.9.0",
36
+ "@naculus/connect-core": "^0.11.0",
37
+ "@naculus/wallet-engine": "^0.11.0",
38
38
  "tsup": "^8.5.1",
39
39
  "typescript": "^6.0.3",
40
- "@naculus/connect-appkit-react": "0.10.0",
41
- "@naculus/connect-appkit-core": "0.10.0"
40
+ "@naculus/connect-appkit-react": "0.11.1",
41
+ "@naculus/connect-appkit-core": "0.11.1"
42
42
  },
43
43
  "publishConfig": {
44
44
  "access": "public",