@farcaster/snap 1.6.0 → 1.7.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.
Files changed (65) hide show
  1. package/dist/dataStore.d.ts +1 -4
  2. package/dist/dataStore.js +4 -17
  3. package/dist/index.d.ts +1 -1
  4. package/dist/react-native/catalog-renderer.d.ts +5 -0
  5. package/dist/react-native/catalog-renderer.js +36 -0
  6. package/dist/react-native/components/snap-action-button.d.ts +2 -0
  7. package/dist/react-native/components/snap-action-button.js +68 -0
  8. package/dist/react-native/components/snap-badge.d.ts +2 -0
  9. package/dist/react-native/components/snap-badge.js +38 -0
  10. package/dist/react-native/components/snap-icon.d.ts +5 -0
  11. package/dist/react-native/components/snap-icon.js +56 -0
  12. package/dist/react-native/components/snap-image.d.ts +2 -0
  13. package/dist/react-native/components/snap-image.js +24 -0
  14. package/dist/react-native/components/snap-input.d.ts +2 -0
  15. package/dist/react-native/components/snap-input.js +36 -0
  16. package/dist/react-native/components/snap-item-group.d.ts +5 -0
  17. package/dist/react-native/components/snap-item-group.js +23 -0
  18. package/dist/react-native/components/snap-item.d.ts +5 -0
  19. package/dist/react-native/components/snap-item.js +45 -0
  20. package/dist/react-native/components/snap-progress.d.ts +2 -0
  21. package/dist/react-native/components/snap-progress.js +26 -0
  22. package/dist/react-native/components/snap-separator.d.ts +2 -0
  23. package/dist/react-native/components/snap-separator.js +23 -0
  24. package/dist/react-native/components/snap-slider.d.ts +2 -0
  25. package/dist/react-native/components/snap-slider.js +42 -0
  26. package/dist/react-native/components/snap-stack.d.ts +5 -0
  27. package/dist/react-native/components/snap-stack.js +49 -0
  28. package/dist/react-native/components/snap-switch.d.ts +2 -0
  29. package/dist/react-native/components/snap-switch.js +30 -0
  30. package/dist/react-native/components/snap-text.d.ts +2 -0
  31. package/dist/react-native/components/snap-text.js +37 -0
  32. package/dist/react-native/components/snap-toggle-group.d.ts +2 -0
  33. package/dist/react-native/components/snap-toggle-group.js +100 -0
  34. package/dist/react-native/index.d.ts +52 -0
  35. package/dist/react-native/index.js +155 -0
  36. package/dist/react-native/theme.d.ts +21 -0
  37. package/dist/react-native/theme.js +37 -0
  38. package/dist/react-native/use-snap-palette.d.ts +13 -0
  39. package/dist/react-native/use-snap-palette.js +48 -0
  40. package/dist/ui/badge.d.ts +2 -2
  41. package/dist/ui/button.d.ts +2 -2
  42. package/dist/ui/catalog.d.ts +7 -7
  43. package/dist/ui/icon.d.ts +2 -2
  44. package/dist/ui/schema.d.ts +1 -1
  45. package/package.json +7 -2
  46. package/src/dataStore.ts +5 -29
  47. package/src/index.ts +0 -1
  48. package/src/react-native/catalog-renderer.tsx +37 -0
  49. package/src/react-native/components/snap-action-button.tsx +92 -0
  50. package/src/react-native/components/snap-badge.tsx +57 -0
  51. package/src/react-native/components/snap-icon.tsx +102 -0
  52. package/src/react-native/components/snap-image.tsx +38 -0
  53. package/src/react-native/components/snap-input.tsx +57 -0
  54. package/src/react-native/components/snap-item-group.tsx +43 -0
  55. package/src/react-native/components/snap-item.tsx +70 -0
  56. package/src/react-native/components/snap-progress.tsx +40 -0
  57. package/src/react-native/components/snap-separator.tsx +32 -0
  58. package/src/react-native/components/snap-slider.tsx +82 -0
  59. package/src/react-native/components/snap-stack.tsx +66 -0
  60. package/src/react-native/components/snap-switch.tsx +45 -0
  61. package/src/react-native/components/snap-text.tsx +53 -0
  62. package/src/react-native/components/snap-toggle-group.tsx +128 -0
  63. package/src/react-native/index.tsx +267 -0
  64. package/src/react-native/theme.tsx +73 -0
  65. package/src/react-native/use-snap-palette.ts +64 -0
@@ -0,0 +1,73 @@
1
+ import { createContext, useContext, useMemo, type ReactNode } from "react";
2
+
3
+ // ─── Color tokens ─────────────────────────────────────
4
+
5
+ export type SnapNativeColors = {
6
+ bg: string;
7
+ surface: string;
8
+ text: string;
9
+ textSecondary: string;
10
+ border: string;
11
+ inputBg: string;
12
+ muted: string;
13
+ };
14
+
15
+ const DEFAULT_LIGHT: SnapNativeColors = {
16
+ bg: "#dfe3e8",
17
+ surface: "#ffffff",
18
+ text: "#111111",
19
+ textSecondary: "#6b7280",
20
+ border: "#d1d5db",
21
+ inputBg: "#ffffff",
22
+ muted: "#f9fafb",
23
+ };
24
+
25
+ const DEFAULT_DARK: SnapNativeColors = {
26
+ bg: "#111318",
27
+ surface: "#1a1d24",
28
+ text: "#fafafa",
29
+ textSecondary: "#a1a1aa",
30
+ border: "#374151",
31
+ inputBg: "#1a1d24",
32
+ muted: "#27272a",
33
+ };
34
+
35
+ // ─── Context ──────────────────────────────────────────
36
+
37
+ interface SnapThemeValue {
38
+ mode: "light" | "dark";
39
+ colors: SnapNativeColors;
40
+ }
41
+
42
+ const SnapThemeContext = createContext<SnapThemeValue>({
43
+ mode: "dark",
44
+ colors: DEFAULT_DARK,
45
+ });
46
+
47
+ export function SnapThemeProvider({
48
+ appearance,
49
+ colors,
50
+ children,
51
+ }: {
52
+ appearance: "light" | "dark";
53
+ colors?: Partial<SnapNativeColors>;
54
+ children: ReactNode;
55
+ }) {
56
+ const value = useMemo<SnapThemeValue>(() => {
57
+ const defaults = appearance === "dark" ? DEFAULT_DARK : DEFAULT_LIGHT;
58
+ return {
59
+ mode: appearance,
60
+ colors: colors ? { ...defaults, ...colors } : defaults,
61
+ };
62
+ }, [appearance, colors]);
63
+
64
+ return (
65
+ <SnapThemeContext.Provider value={value}>
66
+ {children}
67
+ </SnapThemeContext.Provider>
68
+ );
69
+ }
70
+
71
+ export function useSnapTheme(): SnapThemeValue {
72
+ return useContext(SnapThemeContext);
73
+ }
@@ -0,0 +1,64 @@
1
+ import {
2
+ DEFAULT_THEME_ACCENT,
3
+ PALETTE_COLOR_VALUES,
4
+ PALETTE_LIGHT_HEX,
5
+ PALETTE_DARK_HEX,
6
+ type PaletteColor,
7
+ } from "@farcaster/snap";
8
+ import { useStateStore } from "@json-render/react-native";
9
+ import { useSnapTheme } from "./theme";
10
+
11
+ function resolveHex(name: string, appearance: "light" | "dark"): string {
12
+ const map = appearance === "dark" ? PALETTE_DARK_HEX : PALETTE_LIGHT_HEX;
13
+ if (Object.hasOwn(map, name)) {
14
+ return map[name as PaletteColor];
15
+ }
16
+ return map.purple;
17
+ }
18
+
19
+ function isPaletteColor(s: string): s is PaletteColor {
20
+ return (PALETTE_COLOR_VALUES as readonly string[]).includes(s);
21
+ }
22
+
23
+ function themeAccentFromStore(get: (path: string) => unknown): PaletteColor {
24
+ const raw = get("/theme/accent");
25
+ if (typeof raw === "string" && isPaletteColor(raw)) {
26
+ return raw;
27
+ }
28
+ return DEFAULT_THEME_ACCENT;
29
+ }
30
+
31
+ export function useSnapPalette() {
32
+ const { mode } = useSnapTheme();
33
+ const { get } = useStateStore();
34
+ const accentName = themeAccentFromStore(get);
35
+ const accentHex = resolveHex(accentName, mode);
36
+
37
+ const hex = (semantic: string) =>
38
+ semantic === "accent" ? accentHex : resolveHex(semantic, mode);
39
+
40
+ return { appearance: mode, accentName, accentHex, hex };
41
+ }
42
+
43
+ /** `#RRGGBB` + alpha → `rgba(...)` for React Native styles. */
44
+ export function hexToRgba(hex: string, alpha: number): string {
45
+ const m = /^#([0-9a-fA-F]{6})$/.exec(hex.trim());
46
+ if (!m) {
47
+ return `rgba(0,0,0,${alpha})`;
48
+ }
49
+ const n = Number.parseInt(m[1]!, 16);
50
+ const r = (n >> 16) & 255;
51
+ const g = (n >> 8) & 255;
52
+ const b = n & 255;
53
+ return `rgba(${r},${g},${b},${alpha})`;
54
+ }
55
+
56
+ export function useSnapPreviewChromePalette(themeAccent: string | undefined) {
57
+ const { mode } = useSnapTheme();
58
+ const accentName =
59
+ typeof themeAccent === "string" && isPaletteColor(themeAccent)
60
+ ? themeAccent
61
+ : DEFAULT_THEME_ACCENT;
62
+ const accentHex = resolveHex(accentName, mode);
63
+ return { appearance: mode, accentName, accentHex };
64
+ }