Skip to content

Commit 87fb73c

Browse files
committed
fixed: build errors
1 parent 186d5df commit 87fb73c

11 files changed

Lines changed: 167 additions & 103 deletions

File tree

backend/knexfile.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import "dotenv/config";
33
/** @type {import('knex').Knex.Config} */
44
const config = {
55
client: "pg",
6-
connection: process.env.DATABASE_URL,
6+
connection: {
7+
connectionString: process.env.DATABASE_URL,
8+
ssl: process.env.DATABASE_URL?.includes("supabase.co")
9+
? { rejectUnauthorized: false }
10+
: false,
11+
},
712
migrations: {
813
directory: "./migrations",
914
extension: "js",

backend/scripts/check-env.js

Whitespace-only changes.

backend/src/lib/webhooks.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,9 @@ export function sanitizeCustomHeaders(raw) {
224224
"content-type",
225225
"user-agent",
226226
"pluto-signature",
227+
"stellar-signature",
228+
"pluto-timestamp",
229+
"stellar-timestamp",
227230
]);
228231

229232
const result = {};

frontend/src/app/(authenticated)/settings/page.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import { useCallback, useEffect, useState } from "react";
44
import { useDropzone } from "react-dropzone";
55
import Link from "next/link";
6+
import Image from "next/image";
67
import CopyButton from "@/components/CopyButton";
78
import { toast } from "sonner";
89
import {
@@ -730,10 +731,13 @@ export default function SettingsPage() {
730731
<input {...getInputProps()} />
731732
{branding.logo_url ? (
732733
<div className="group relative flex flex-col items-center gap-3 p-4">
733-
<img
734+
<Image
734735
src={branding.logo_url}
735736
alt="Logo preview"
736-
className="h-16 w-16 object-contain"
737+
width={64}
738+
height={64}
739+
className="object-contain"
740+
unoptimized
737741
/>
738742
<span className="text-xs text-slate-500 group-hover:text-slate-300">
739743
Click or drag to change logo
@@ -850,10 +854,13 @@ export default function SettingsPage() {
850854
</p>
851855
{branding.logo_url && (
852856
<div className="mb-4 flex justify-center">
853-
<img
857+
<Image
854858
src={branding.logo_url}
855859
alt="Logo preview"
860+
width={120}
861+
height={48}
856862
className="h-12 w-auto object-contain"
863+
unoptimized
857864
/>
858865
</div>
859866
)}

frontend/src/app/(public)/page.tsx

Lines changed: 116 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import GuestGuard from "@/components/GuestGuard";
44
import SystemStatus from "@/components/SystemStatus";
55
import Link from "next/link";
6-
import { motion } from "framer-motion";
6+
import { motion, Variants } from "framer-motion";
77
import { useState } from "react";
88

99
function Section({
@@ -20,7 +20,7 @@ function Section({
2020
initial={{ opacity: 0, y: 20 }}
2121
whileInView={{ opacity: 1, y: 0 }}
2222
viewport={{ once: true, amount: 0.2 }}
23-
transition={{ duration: 0.65, ease: [0.22, 1, 0.36, 1], delay }}
23+
transition={{ duration: 0.65, ease: "easeOut", delay }}
2424
className={className}
2525
>
2626
{children}
@@ -42,7 +42,7 @@ function FadeUp({
4242
initial={{ opacity: 0, y: 20 }}
4343
whileInView={{ opacity: 1, y: 0 }}
4444
viewport={{ once: true, amount: 0.2 }}
45-
transition={{ duration: 0.6, ease: [0.22, 1, 0.36, 1], delay }}
45+
transition={{ duration: 0.6, ease: "easeOut", delay }}
4646
className={className}
4747
>
4848
{children}
@@ -117,6 +117,25 @@ function IconCheck() {
117117
);
118118
}
119119

120+
const containerVariants: Variants = {
121+
hidden: { opacity: 0 },
122+
visible: {
123+
opacity: 1,
124+
transition: {
125+
staggerChildren: 0.1,
126+
delayChildren: 0.1
127+
}
128+
}
129+
};
130+
131+
const itemVariants: Variants = {
132+
hidden: { opacity: 0, y: 30 },
133+
visible: {
134+
opacity: 1,
135+
y: 0,
136+
transition: { duration: 0.8, ease: [0.16, 1, 0.3, 1] as any }
137+
}
138+
};
120139

121140
const FEATURES = [
122141
{
@@ -166,53 +185,68 @@ function HeroSection() {
166185
return (
167186
<Section className="relative flex flex-col items-center px-6 pb-24 pt-32 text-center lg:pt-48">
168187
<motion.div
169-
initial={{ opacity: 0, y: 30 }}
170-
animate={{ opacity: 1, y: 0 }}
171-
transition={{ duration: 1, ease: [0.16, 1, 0.3, 1] }}
188+
variants={containerVariants}
189+
initial="hidden"
190+
animate="visible"
172191
className="relative z-10 flex flex-col items-center gap-6"
173192
>
174-
<span className="inline-flex items-center gap-2 rounded-full border border-[#E8E8E8] bg-[#F9F9F9] px-5 py-2 font-bold text-[10px] uppercase tracking-[0.2em] text-[#6B6B6B]">
193+
<motion.span
194+
variants={itemVariants}
195+
className="inline-flex items-center gap-2 rounded-full border border-[#E8E8E8] bg-[#F9F9F9] px-5 py-2 font-bold text-[10px] uppercase tracking-[0.2em] text-[#6B6B6B]"
196+
>
175197
<span className="h-1.5 w-1.5 rounded-full bg-[#0A0A0A]" />
176198
Surgical Precision Payments
177-
</span>
199+
</motion.span>
178200

179-
<h1 className="max-w-5xl text-7xl font-bold leading-[0.9] tracking-tighter text-[#0A0A0A] sm:text-9xl lg:text-[12rem]">
201+
<motion.h1
202+
variants={itemVariants}
203+
className="max-w-5xl text-7xl font-bold leading-[0.9] tracking-tighter text-[#0A0A0A] sm:text-9xl lg:text-[12rem] font-display uppercase"
204+
>
180205
PLUTO
181-
</h1>
206+
</motion.h1>
182207

183-
<h2 className="max-w-4xl text-4xl font-bold leading-tight tracking-tight text-[#0A0A0A] sm:text-6xl lg:text-7xl">
208+
<motion.h2
209+
variants={itemVariants}
210+
className="max-w-4xl text-4xl font-bold leading-tight tracking-tight text-[#0A0A0A] sm:text-6xl lg:text-7xl font-display uppercase"
211+
>
184212
The Infrastructure for{" "}
185213
<span className="text-[#6B6B6B]">
186214
Modern Commerce
187215
</span>
188-
</h2>
216+
</motion.h2>
189217

190-
<p className="max-w-xl font-sans text-base font-medium leading-relaxed text-[#6B6B6B] sm:text-lg">
218+
<motion.p
219+
variants={itemVariants}
220+
className="max-w-xl font-sans text-base font-medium leading-relaxed text-[#6B6B6B] sm:text-lg"
221+
>
191222
Build high-performance payment experiences on Stellar.
192223
Unmatched speed. Near-zero fees. Global scale.
193-
</p>
194-
</motion.div>
224+
</motion.p>
195225

196-
<motion.div
197-
initial={{ opacity: 0, y: 16 }}
198-
animate={{ opacity: 1, y: 0 }}
199-
transition={{ duration: 0.8, ease: [0.16, 1, 0.3, 1], delay: 0.15 }}
200-
className="relative z-10 mt-12 flex flex-col items-center gap-6 sm:flex-row"
201-
>
202-
<Link
203-
href="/register"
204-
className="group relative inline-flex items-center gap-2 rounded-lg bg-[#0A0A0A] px-12 py-5 text-sm font-bold uppercase tracking-widest text-white transition-all hover:bg-black active:scale-[0.98]"
226+
<motion.div
227+
variants={itemVariants}
228+
className="mt-6 flex flex-col items-center gap-6 sm:flex-row"
205229
>
206-
Get Started
207-
<IconArrow />
208-
</Link>
230+
<Link
231+
href="/register"
232+
className="group relative inline-flex items-center gap-2 rounded-lg bg-[#0A0A0A] px-12 py-5 text-sm font-bold uppercase tracking-widest text-white transition-all hover:bg-black active:scale-[0.98] shadow-2xl shadow-black/10"
233+
>
234+
Get Started
235+
<motion.div
236+
animate={{ x: [0, 4, 0] }}
237+
transition={{ repeat: Infinity, duration: 1.5, ease: "easeInOut" }}
238+
>
239+
<IconArrow />
240+
</motion.div>
241+
</Link>
209242

210-
<Link
211-
href="/login"
212-
className="inline-flex items-center gap-2 rounded-lg border border-[#E8E8E8] bg-white px-12 py-5 text-sm font-bold uppercase tracking-widest text-[#0A0A0A] transition-all hover:bg-[#F5F5F5]"
213-
>
214-
Sign In
215-
</Link>
243+
<Link
244+
href="/login"
245+
className="inline-flex items-center gap-2 rounded-lg border border-[#E8E8E8] bg-white px-12 py-5 text-sm font-bold uppercase tracking-widest text-[#0A0A0A] transition-all hover:bg-[#F5F5F5] active:scale-[0.98]"
246+
>
247+
Sign In
248+
</Link>
249+
</motion.div>
216250
</motion.div>
217251

218252
<motion.div
@@ -246,25 +280,34 @@ function FeaturesSection() {
246280
</h2>
247281
</Section>
248282

249-
<div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
283+
<motion.div
284+
variants={containerVariants}
285+
initial="hidden"
286+
whileInView="visible"
287+
viewport={{ once: true, amount: 0.1 }}
288+
className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3"
289+
>
250290
{FEATURES.map((f, i) => (
251-
<FadeUp key={f.title} delay={i * 0.1}>
252-
<div className="group relative flex h-full flex-col gap-8 overflow-hidden rounded-lg border border-[#E8E8E8] bg-white p-10 transition-all duration-500 hover:border-[#0A0A0A]">
253-
<div className="flex items-center justify-between">
254-
<div className="text-[#0A0A0A]">{f.icon}</div>
255-
<span className="rounded-full border border-[#E8E8E8] px-4 py-1.5 font-bold text-[10px] uppercase tracking-widest text-[#6B6B6B]">
256-
{f.tag}
257-
</span>
258-
</div>
259-
260-
<h3 className="text-2xl font-bold text-[#0A0A0A]">{f.title}</h3>
261-
<p className="font-sans text-sm font-medium leading-relaxed text-[#6B6B6B]">
262-
{f.description}
263-
</p>
291+
<motion.div
292+
key={f.title}
293+
variants={itemVariants}
294+
whileHover={{ y: -8, transition: { duration: 0.3 } }}
295+
className="group relative flex h-full flex-col gap-8 overflow-hidden rounded-[2rem] border border-[#E8E8E8] bg-white p-10 transition-all duration-500 hover:border-[#0A0A0A] hover:shadow-[0_20px_60px_rgba(0,0,0,0.06)]"
296+
>
297+
<div className="flex items-center justify-between">
298+
<div className="text-[#0A0A0A] transition-transform duration-500 group-hover:scale-110">{f.icon}</div>
299+
<span className="rounded-full border border-[#E8E8E8] px-4 py-1.5 font-bold text-[10px] uppercase tracking-widest text-[#6B6B6B]">
300+
{f.tag}
301+
</span>
264302
</div>
265-
</FadeUp>
303+
304+
<h3 className="text-2xl font-bold text-[#0A0A0A] tracking-tight">{f.title}</h3>
305+
<p className="font-sans text-sm font-medium leading-relaxed text-[#6B6B6B]">
306+
{f.description}
307+
</p>
308+
</motion.div>
266309
))}
267-
</div>
310+
</motion.div>
268311
</div>
269312
);
270313
}
@@ -448,21 +491,32 @@ function HowItWorksSection() {
448491
</h2>
449492
</Section>
450493

451-
<div className="grid gap-16 sm:grid-cols-2 lg:grid-cols-4">
494+
<motion.div
495+
variants={containerVariants}
496+
initial="hidden"
497+
whileInView="visible"
498+
viewport={{ once: true, amount: 0.1 }}
499+
className="grid gap-16 sm:grid-cols-2 lg:grid-cols-4"
500+
>
452501
{steps.map((step, i) => (
453-
<FadeUp key={step.title} delay={i * 0.1}>
454-
<div className="relative flex flex-col items-center text-center">
455-
<div className="mb-8 flex h-20 w-20 items-center justify-center rounded-[2.5rem] bg-white border border-[#E8E8E8] shadow-[0_10px_40px_rgb(0,0,0,0.03)] text-2xl font-bold text-[#0A0A0A]">
456-
{i + 1}
457-
</div>
458-
<h3 className="mb-4 text-xl font-bold text-[#0A0A0A] uppercase tracking-widest">{step.title}</h3>
459-
<p className="font-sans text-sm font-medium leading-relaxed text-[#6B6B6B]">
460-
{step.description}
461-
</p>
462-
</div>
463-
</FadeUp>
502+
<motion.div
503+
key={step.title}
504+
variants={itemVariants}
505+
className="group relative flex flex-col items-center text-center"
506+
>
507+
<motion.div
508+
whileHover={{ scale: 1.05, rotate: 5 }}
509+
className="mb-8 flex h-24 w-24 items-center justify-center rounded-[3rem] bg-white border border-[#E8E8E8] shadow-[0_10px_40px_rgb(0,0,0,0.03)] text-2xl font-bold text-[#0A0A0A] transition-all group-hover:border-[#0A0A0A]"
510+
>
511+
<span className="font-display">0{i + 1}</span>
512+
</motion.div>
513+
<h3 className="mb-4 text-[10px] font-bold text-[#0A0A0A] uppercase tracking-[0.4em]">{step.title}</h3>
514+
<p className="font-sans text-sm font-medium leading-relaxed text-[#6B6B6B]">
515+
{step.description}
516+
</p>
517+
</motion.div>
464518
))}
465-
</div>
519+
</motion.div>
466520
</div>
467521
);
468522
}

frontend/src/app/globals.css

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
@tailwind components;
33
@tailwind utilities;
44

5-
@import url('https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@100..900&display=swap');
65

76
* {
87
box-sizing: border-box;
@@ -48,8 +47,8 @@ html {
4847
--surface-subtle: #F9F9F9;
4948
--accent: #000000;
5049

51-
--font-sans: "YWFT Formation", "Geist", system-ui, sans-serif;
52-
--font-display: "Instrument Serif", serif;
50+
--font-sans: "Inconsolata", monospace, sans-serif;
51+
--font-display: "Space Mono", monospace, serif;
5352

5453
/* Spacing Scale */
5554
--space-1: 4px;

frontend/src/app/layout.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import "./globals.css";
2-
import { Outfit, Instrument_Serif, Space_Mono } from "next/font/google";
2+
import { Inconsolata, Space_Mono } from "next/font/google";
33
import { NextIntlClientProvider } from "next-intl";
44
import { getLocale, getMessages } from "next-intl/server";
55
import ThemeProvider from "@/components/ThemeProvider";
@@ -11,8 +11,8 @@ import { WalletContextProvider } from "@/lib/wallet-context";
1111
import { DisplayPreferencesProvider } from "@/lib/display-preferences";
1212
import { Metadata, Viewport } from "next";
1313

14-
const displayFont = Instrument_Serif({ subsets: ["latin"], weight: ["400"], variable: "--font-display", display: "swap" });
15-
const sansFont = Outfit({ subsets: ["latin"], variable: "--font-sans", display: "swap" });
14+
const sansFont = Inconsolata({ subsets: ["latin"], weight: ["400", "500", "600", "700"], variable: "--font-inconsolata", display: "swap" });
15+
const displayFont = Space_Mono({ subsets: ["latin"], weight: ["400", "700"], variable: "--font-space-mono", display: "swap" });
1616
const monoFont = Space_Mono({ subsets: ["latin"], weight: ["400", "700"], variable: "--font-mono", display: "swap" });
1717

1818
export const metadata: Metadata = {
@@ -42,7 +42,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo
4242
<head>
4343
<meta name="theme-color" content="#FFFFFF" />
4444
</head>
45-
<body className={`${displayFont.variable} ${sansFont.variable} ${monoFont.variable} min-h-screen font-sans bg-white text-[#0A0A0A]`}>
45+
<body className={`${sansFont.variable} ${displayFont.variable} ${monoFont.variable} min-h-screen font-sans bg-white text-[#0A0A0A]`}>
4646
<NextIntlClientProvider locale={locale} messages={messages}>
4747
<ThemeProvider>
4848
<DisplayPreferencesProvider>

frontend/src/components/ActivityFeed.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"use client";
22

33
import { useEffect, useState, useCallback } from "react";
4-
import { motion, AnimatePresence } from "framer-motion";
54
import Link from "next/link";
65
import { useLocale } from "next-intl";
76
import {

frontend/src/components/AuthGuard.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,8 @@ import { useRouter, usePathname } from "next/navigation";
55
import { useMerchantHydrated, useMerchantSession } from "@/lib/merchant-store";
66

77
export default function AuthGuard({ children }: { children: React.ReactNode }) {
8-
const hydrated = useMerchantHydrated();
9-
const session = useMerchantSession();
10-
const router = useRouter();
11-
const pathname = usePathname();
12-
const [mounted, setMounted] = useState(false);
13-
148
useEffect(() => {
15-
setMounted(true);
9+
// Component mounted
1610
}, []);
1711

1812
// useEffect(() => {

0 commit comments

Comments
 (0)