diff --git a/.env.example b/.env.example index 50e04a86..84b16ff8 100644 --- a/.env.example +++ b/.env.example @@ -22,12 +22,18 @@ NEXT_PUBLIC_GOOGLE_CLIENT_ID="" NEXT_PUBLIC_HORIZON_PUBLIC_URL="https://horizon.stellar.org" NEXT_PUBLIC_HORIZON_TESTNET_URL="https://horizon-testnet.stellar.org" NEXT_PUBLIC_STELLAR_NETWORK="testnet" +# Smart Wallet (Passkey) — OpenZeppelin smart accounts via smart-account-kit +NEXT_PUBLIC_STELLAR_RPC_URL="https://soroban-testnet.stellar.org" +NEXT_PUBLIC_STELLAR_NETWORK_PASSPHRASE="Test SDF Network ; September 2015" +NEXT_PUBLIC_SMART_ACCOUNT_WASM_HASH="a12e8fa9621efd20315753bd4007d974390e31fbcb4a7ddc4dd0a0dec728bf2e" +NEXT_PUBLIC_WEBAUTHN_VERIFIER_ADDRESS="CBSHV66WG7UV6FQVUTB67P3DZUEJ2KJ5X6JKQH5MFRAAFNFJUAJVXJYV" +NEXT_PUBLIC_NATIVE_TOKEN_CONTRACT="CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC" NEXT_PUBLIC_TRUSTLESS_WORK_API_KEY="" NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID="your_wallet_connect_project_id" # Error reporting (optional). When set, errors are sent to Sentry. NEXT_PUBLIC_SENTRY_DSN="" SENTRY_DSN="" SENTRY_ORG="" -SENTRY_PROJECT="boundless-next" -SENTRY_AUTH_TOKEN="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" +SENTRY_PROJECT="" +SENTRY_AUTH_TOKEN="" NODE_ENV="dev" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 925a8879..6ce85daf 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# Sentry Config File +.env.sentry-build-plugin diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..41583e36 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@jsr:registry=https://npm.jsr.io diff --git a/app/(landing)/about/AboutUsHero.tsx b/app/(landing)/about/AboutUsHero.tsx index 53c6af0f..fa29f109 100644 --- a/app/(landing)/about/AboutUsHero.tsx +++ b/app/(landing)/about/AboutUsHero.tsx @@ -88,7 +88,7 @@ export default function AboutUsHero() { />
- ++ Project:{' '} + + {project.project.title} + +
+ • ++ {project.contributors.length}{' '} + {project.contributors.length === 1 + ? 'Contributor' + : 'Contributors'} +
+Failed to load contributions
++ The requested milestone could not be found. +
+- + Go to home
diff --git a/app/globals.css b/app/globals.css index 9d5ab0c8..d45d8a75 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,24 +1,22 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap'); @import 'tailwindcss'; @import 'tw-animate-css'; @plugin "@tailwindcss/typography"; @custom-variant dark (&:is(.dark *)); -/* Prose (Tailwind Typography) dark theme overrides for blog content */ @layer base { .prose { --tw-prose-body: #d1d5db; --tw-prose-headings: #ffffff; --tw-prose-lead: #d1d5db; - --tw-prose-links: #a7f950; + --tw-prose-links: #2eedaa; --tw-prose-bold: #ffffff; --tw-prose-counters: #b5b5b5; --tw-prose-bullets: #b5b5b5; --tw-prose-hr: #374151; --tw-prose-quotes: #d1d5db; - --tw-prose-quote-borders: #a7f950; + --tw-prose-quote-borders: #2eedaa; --tw-prose-captions: #9ca3af; - --tw-prose-code: #a7f950; + --tw-prose-code: #2eedaa; --tw-prose-pre-code: #e5e7eb; --tw-prose-pre-bg: var(--color-background-card); --tw-prose-th-borders: #374151; @@ -28,6 +26,8 @@ @theme { --font-inter: 'Inter', sans-serif; + --font-gilroy: var(--font-gilroy); + --font-francy: var(--font-francy); --color-gray-50: #f7f7f7; --color-gray-75: #f2f2f2; --color-gray-100: #ececec; @@ -92,14 +92,22 @@ --color-error-800: #800501; --color-error-900: #591000; - --color-active-bg: rgba(167, 249, 80, 0.08); - --color-active-bg2: rgba(167, 249, 80, 0.32); + --color-active-bg: rgba(46, 237, 170, 0.08); + --color-active-bg2: rgba(46, 237, 170, 0.32); - --color-background-main-bg: #030303; + --color-background-main-bg: #0a0b07; - --color-inactive: #171717; - --color-section: #1c1c1c; - --color-background-card: #101010; + --color-inactive: #151611; + --color-section: #1c1e13; + --color-background-card: #0f100d; + + /* Brand Secondary Colors */ + --color-brand-purple: #602ded; + --color-brand-yellow: #eddd2d; + --color-brand-orange: #ed512d; + --color-brand-blue: #2db2ed; + --color-brand-green: #4c6662; + --color-brand-red: #ed302d; --color-modal: #f5b546; --color-faint: #f5b546; } @@ -178,8 +186,9 @@ body { --color-stepper-border-active: var(--stepper-border-active); --color-stepper-border: var(--stepper-border); --color-placeholder: var(--placeholder); - --font-sans: var(--font-inter); + --font-sans: var(--font-gilroy); --font-mono: var(--font-inter); + --font-display: var(--font-francy); --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); @@ -223,7 +232,6 @@ body { --color-success-green-darker: var(--success-green-darker); --color-error-status: var(--error-status); - /* Custom breakpoints for 4K screens */ --breakpoint-4xl: 2560px; } @@ -235,9 +243,9 @@ body { --card-foreground: oklch(0.985 0 0); --popover: oklch(0.205 0 0); --popover-foreground: oklch(0.145 0 0); - --primary: #a7f950; - --primary-foreground: oklch(0.205 0 0); - --primary-shadow: 0 2px 8px rgba(167, 249, 80, 0.2); + --primary: #2eedaa; + --primary-foreground: #1c1e13; + --primary-shadow: 0 2px 8px rgba(46, 237, 170, 0.2); --secondary: oklch(0.269 0 0); --secondary-foreground: oklch(0.985 0 0); --muted: oklch(0.269 0 0); @@ -332,7 +340,7 @@ body { } body { - @apply bg-background text-foreground; + @apply bg-background text-foreground font-sans; } } @@ -374,7 +382,13 @@ input[type='number'] { -webkit-text-fill-color: transparent; } .font-inter { - font-family: 'Inter', sans-serif; + font-family: var(--font-inter); +} +.font-gilroy { + font-family: var(--font-gilroy); +} +.font-francy { + font-family: var(--font-francy); } /* Dropdown menu item animations */ @keyframes dropdownItemSlideIn { @@ -414,10 +428,10 @@ input[type='number'] { /* Navbar active state – brand color via CSS variables (Tailwind-safe) */ :root { - --nav-active-bg: rgba(167, 249, 80, 0.1); - --nav-active-color: #a7f950; - --nav-active-border: rgba(167, 249, 80, 0.2); - --nav-active-shadow: 0 1px 2px rgba(167, 249, 80, 0.05); + --nav-active-bg: rgba(46, 237, 170, 0.1); + --nav-active-color: #2eedaa; + --nav-active-border: rgba(46, 237, 170, 0.2); + --nav-active-shadow: 0 1px 2px rgba(46, 237, 170, 0.05); } .navbar-link-active { @@ -476,7 +490,7 @@ input[type='number'] { /* Enhanced gradient text effects */ .gradient-text-3d { - background: linear-gradient(45deg, #a7f950, #3ae6b2, #69726d); + background: linear-gradient(45deg, #2eedaa, #1c1e13, #4c6662); background-size: 200% 200%; -webkit-background-clip: text; background-clip: text; @@ -497,12 +511,12 @@ input[type='number'] { /* Enhanced text glow effects */ .text-glow { - filter: drop-shadow(0 0 20px rgba(167, 249, 80, 0.4)); + filter: drop-shadow(0 0 20px rgba(46, 237, 170, 0.4)); transition: filter 0.3s ease; } .text-glow:hover { - filter: drop-shadow(0 0 30px rgba(167, 249, 80, 0.6)); + filter: drop-shadow(0 0 30px rgba(46, 237, 170, 0.6)); } /* Particle trail effect */ @@ -519,7 +533,7 @@ input[type='number'] { bottom: 0; background: radial-gradient( circle, - rgba(167, 249, 80, 0.1) 0%, + rgba(46, 237, 170, 0.1) 0%, transparent 70% ); opacity: 0; @@ -550,8 +564,8 @@ input[type='number'] { .gradient-text { background-image: linear-gradient( 273deg, - rgba(167, 249, 80, 0.5) 13.84%, - #3ae6b2 73.28% + rgba(46, 237, 170, 0.5) 13.84%, + #2eedaa 73.28% ); -webkit-background-clip: text; background-clip: text; @@ -568,8 +582,8 @@ input[type='number'] { .gradient-text-3 { background: linear-gradient( 273deg, - rgba(167, 249, 80, 0.5) 13.84%, - #3ae6b2 73.28% + rgba(46, 237, 170, 0.5) 13.84%, + #2eedaa 73.28% ); background-clip: text; -webkit-background-clip: text; @@ -618,3 +632,8 @@ input:-webkit-autofill:active { -webkit-text-fill-color: white !important; /* Optional: Customize text color */ transition: background-color 5000s ease-in-out 0s; /* Optional: Smooth transition */ } + +/* ── Sonner toast overrides — Linear / Vercel inspired ── */ + +/* Base toast surface */ +/* /* [data- */ diff --git a/app/layout.tsx b/app/layout.tsx index dfc4d536..aef42ba6 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,6 +1,5 @@ import React from 'react'; import type { Metadata } from 'next'; -import { Inter } from 'next/font/google'; import './globals.css'; import { Toaster } from 'sonner'; import { Providers } from './providers'; @@ -12,12 +11,58 @@ import { } from '@/lib/structured-data'; import NextTopLoader from 'nextjs-toploader'; import DevelopmentStatusModal from '@/components/DevelopmentStatusModal'; +import localFont from 'next/font/local'; -const inter = Inter({ - variable: '--font-inter', - subsets: ['latin'], +const gilroy = localFont({ + src: [ + { + path: '../public/fonts/Gilroy/Fonts/Gilroy-Light.ttf', + weight: '300', + style: 'normal', + }, + { + path: '../public/fonts/Gilroy/Fonts/Gilroy-Regular.ttf', + weight: '400', + style: 'normal', + }, + { + path: '../public/fonts/Gilroy/Fonts/Gilroy-Medium.ttf', + weight: '500', + style: 'normal', + }, + { + path: '../public/fonts/Gilroy/Fonts/Gilroy-SemiBold.ttf', + weight: '600', + style: 'normal', + }, + { + path: '../public/fonts/Gilroy/Fonts/Gilroy-Bold.ttf', + weight: '700', + style: 'normal', + }, + { + path: '../public/fonts/Gilroy/Fonts/Gilroy-ExtraBold.ttf', + weight: '800', + style: 'normal', + }, + { + path: '../public/fonts/Gilroy/Fonts/Gilroy-Black.ttf', + weight: '900', + style: 'normal', + }, + ], + variable: '--font-gilroy', +}); +const francy = localFont({ + src: [ + { + path: '../public/fonts/Francy/Francy.otf', + weight: '400', + style: 'normal', + }, + ], + variable: '--font-francy', }); - export const metadata: Metadata = { title: 'Boundless - Ideas Made Boundless', description: @@ -75,8 +120,13 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - + + - -{project.title}
+Major change detected
++ Changing the project title or category requires admin review. Your + project will be temporarily moved to "In Review" status + until approved. +
++ {formData.tagline.length}/120 +
+Loading project...
+Failed to load project
+ ++ Projects with status "{project.status}" cannot be edited. + {project.status === 'REJECTED' && + ' Please create a new project or contact support.'} +
+ ++ This project is currently being reviewed. You can edit it once the + review is complete. +
+ +- Manage your personal information and public profile -
-+ Manage your account, preferences, and security +
++ Manage your smart wallet, signers, external wallets, and authorization + rules. +
++ On-chain authorization rules that define who can perform what + operations on your smart wallet. +
++ No context rules found. Context rules are created automatically when + your smart wallet is deployed, or you can add them manually. +
+ ++ {credId + ? `${credId.slice(0, 20)}...` + : 'tag' in signer && + signer.tag === 'Delegated' && + signer.values + ? `${String(signer.values[0]).slice(0, 8)}...${String(signer.values[0]).slice(-8)}` + : 'Unknown'} +
++ No signers configured +
+ )} ++ No policies attached +
+ )} ++ Connect Stellar wallets (Freighter, Lobstr, etc.) as delegated + signers for multi-signature operations. +
++ No external wallets connected. Connect a Stellar wallet to use it as + a signer for multi-signature transactions. +
+ ++ {wallet.address.slice(0, 8)}... + {wallet.address.slice(-8)} +
++ WebAuthn credentials stored in your browser for signing transactions. +
++ No passkeys found. Passkeys are created when you register or connect + a smart wallet. +
++ ID: {cred.credentialId.slice(0, 16)}... +
+ {cred.contractId && ( ++ Contract: {cred.contractId.slice(0, 8)}... + {cred.contractId.slice(-8)} +
+ )} + {cred.createdAt && ( ++ Signers authorized to act on your smart wallet via context rules. +
++ No signers found. Signers are added through context rules on your + smart wallet contract. +
++ {getSignerDisplay(signer)} +
++ {walletType === 'smart' + ? 'Passkey-secured Soroban smart account' + : 'Platform-managed Stellar wallet'} +
+No balances found
+ )} ++ Create a passkey-secured smart account on Soroban. No seed phrases + needed — your wallet is secured by your device's biometrics. +
+Failed to load project
+ +Loading project...
++ Click the button below, and view the sample error on the Sentry{' '} + + Issues Page + + . For more details about setting up Sentry,{' '} + + read our docs + + . +
+ + + + {hasSentError ? ( +Error sent to Sentry.
+ ) : !isConnected ? ( ++ It looks like network requests to Sentry are being blocked, which + will prevent errors from being captured. Try disabling your + ad-blocker to complete the test. +
+