Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
ed75968
fix: fixed theme toggle and wallet address position
miss-yusrah Feb 11, 2026
d7c4d19
Merge pull request #42 from miss-yusrah/feat/bank-details
kelly-musk Feb 11, 2026
7379c58
feat(offramp): refactor bank details flow with client components and …
kelly-musk Feb 21, 2026
8689fd5
Implement the dynamic payment form system for Aframp.
gabito1451 Feb 21, 2026
be2561f
Merge branch 'main' into #32
gabito1451 Feb 21, 2026
be78d46
Merge pull request #43 from gabito1451/#32
kelly-musk Feb 21, 2026
0135f4c
refactor(offramp): improve code readability and maintainability
kelly-musk Feb 21, 2026
914d982
feat(bills): fix linting errors and remove unused imports
rayeberechi Feb 21, 2026
7396456
Merge pull request #44 from rayeberechi/feat/category-page-31
kelly-musk Feb 23, 2026
489cd1c
portfoliopagedesign
Sundayabel222 Feb 23, 2026
53f6185
feat: swap interface ui
Damidesign Feb 23, 2026
9f36e60
feat: implement recieve and send page in app routes
olathedev Feb 23, 2026
cdc1bcd
feat: ui transaction
Damidesign Feb 23, 2026
a3a7626
feat: ui wallet connection
Damidesign Feb 23, 2026
9cd0c66
feat: ui setting page
Damidesign Feb 23, 2026
97cbf2e
feat: ui transcation state
Damidesign Feb 24, 2026
f5bd570
referralpage
Sundayabel222 Feb 24, 2026
d2e5585
Error UI
Hahfyeex Feb 24, 2026
a9d0cd7
Onboarding
Hahfyeex Feb 24, 2026
6d95de1
feat: ui help center
Damidesign Feb 24, 2026
4ab0f9a
feat: add referral program design documentation
Sundayabel222 Feb 24, 2026
86b8ce2
feat: add mobile navigation design documentation
Sundayabel222 Feb 24, 2026
5537548
feat: ui price alert
Damidesign Feb 24, 2026
902ec2e
feat: implement business ui design
zeekman Feb 24, 2026
8c66acb
Merge pull request #63 from Sundayabel222/main
kelly-musk Feb 24, 2026
30e1d05
Merge pull request #64 from Damidesign/main
kelly-musk Feb 24, 2026
38ee64b
Merge pull request #76 from zeekman/main
kelly-musk Feb 24, 2026
336acdc
Merge pull request #75 from Damidesign/priceui
kelly-musk Feb 24, 2026
857959c
Merge pull request #67 from Damidesign/connection
kelly-musk Feb 24, 2026
63e2bce
Merge pull request #66 from Damidesign/transaction
kelly-musk Feb 24, 2026
f4e7546
Merge pull request #68 from Damidesign/setting
kelly-musk Feb 24, 2026
22d96c8
Merge pull request #73 from Sundayabel222/feature/referral-program-de…
kelly-musk Feb 24, 2026
5467447
Merge pull request #69 from Damidesign/loading
kelly-musk Feb 24, 2026
dcaa5fc
refactor: simplify CI workflow by removing coverage checks and securi…
kelly-musk Feb 24, 2026
20ef87f
feat: add empty states design documentation
Sundayabel222 Feb 24, 2026
35c37d3
feat: add bill payments dashboard design documentation
Sundayabel222 Feb 24, 2026
57f6dc5
Merge pull request #72 from Damidesign/helpcenter
kelly-musk Feb 24, 2026
5e95daf
Merge pull request #78 from Sundayabel222/feature/bill-payments-dashb…
kelly-musk Feb 24, 2026
77ad976
Merge branch 'main' into ErrorUI
kelly-musk Feb 24, 2026
d5d30fc
Merge pull request #74 from Sundayabel222/feature/mobile-navigation-d…
kelly-musk Feb 24, 2026
7d82a25
Merge pull request #65 from olathedev/feat/issue-50-send-recieve-page
kelly-musk Feb 24, 2026
d8a1327
Merge branch 'main' into Onboarding
kelly-musk Feb 24, 2026
16748bc
Merge pull request #77 from Sundayabel222/feature/empty-states-design
kelly-musk Feb 24, 2026
41f00e7
Merge pull request #70 from Hahfyeex/ErrorUI
kelly-musk Feb 24, 2026
540edb7
Merge pull request #71 from Hahfyeex/Onboarding
kelly-musk Feb 24, 2026
e046f7b
feat: add onramp flow documentation
Sundayabel222 Feb 24, 2026
a2811fc
feat: add offramp flow documentation
Sundayabel222 Feb 24, 2026
75fdaeb
Merge pull request #79 from Sundayabel222/feature/onramp-flow
kelly-musk Feb 25, 2026
b35a5ad
Merge pull request #80 from Sundayabel222/feature/offramp-flow
kelly-musk Feb 25, 2026
93569cf
feat: add highlights carousel
jxsonyx Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"permissions": {
"allow": ["Bash(npx eslint:*)"]
}
}
77 changes: 4 additions & 73 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,8 @@ jobs:
- name: TypeScript Check
run: npm run type-check

- name: Security Audit
run: npm audit --audit-level=high

test:
name: Tests & Coverage
name: Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand All @@ -47,40 +44,11 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Run tests with coverage
run: npm run test:coverage -- --watchAll=false

- name: Check coverage threshold (≥70%)
run: |
COVERAGE=$(cat coverage/coverage-summary.json | jq '.total.lines.pct')
echo "Coverage: $COVERAGE%"
if (( $(echo "$COVERAGE < 70" | bc -l) )); then
echo "❌ Coverage $COVERAGE% is below 70% threshold"
exit 1
fi
echo "✅ Coverage $COVERAGE% meets threshold"

- name: Comment coverage on PR
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const coverage = JSON.parse(fs.readFileSync('coverage/coverage-summary.json', 'utf8'));
const lines = coverage.total.lines.pct.toFixed(2);
const branches = coverage.total.branches.pct.toFixed(2);
const functions = coverage.total.functions.pct.toFixed(2);
const statements = coverage.total.statements.pct.toFixed(2);

github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `## 📊 Coverage Report\n\n| Metric | Coverage | Status |\n|--------|----------|--------|\n| Lines | ${lines}% | ${lines >= 70 ? '✅' : '❌'} |\n| Branches | ${branches}% | ${branches >= 70 ? '✅' : '❌'} |\n| Functions | ${functions}% | ${functions >= 70 ? '✅' : '❌'} |\n| Statements | ${statements}% | ${statements >= 70 ? '✅' : '❌'} |\n\n**Threshold:** ≥70% | **Status:** ${lines >= 70 ? '✅ PASSED' : '❌ FAILED'}`
});
- name: Run tests
run: npm test -- --watchAll=false

build:
name: Build & Bundle Size
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand All @@ -99,40 +67,3 @@ jobs:
env:
NEXT_PUBLIC_API_URL: ${{ secrets.NEXT_PUBLIC_API_URL }}
NEXT_PUBLIC_STELLAR_NETWORK: TESTNET

- name: Check bundle size
run: npx size-limit

- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: build
path: .next
retention-days: 1

lighthouse:
name: Lighthouse (Performance ≥80, Accessibility ≥90)
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Download build
uses: actions/download-artifact@v4
with:
name: build
path: .next

- name: Run Lighthouse CI
run: npm run lighthouse
env:
LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}
11 changes: 10 additions & 1 deletion .husky/commit-msg
Original file line number Diff line number Diff line change
@@ -1 +1,10 @@
npx --no -- commitlint --edit ${1}
#!/usr/bin/env sh
set -e

if [ -x "./node_modules/.bin/commitlint" ]; then
./node_modules/.bin/commitlint --edit "$1"
elif command -v commitlint >/dev/null 2>&1; then
commitlint --edit "$1"
else
echo "husky(commit-msg): commitlint not found; skipping. Install dependencies to re-enable."
fi
11 changes: 10 additions & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1 +1,10 @@
npx lint-staged
#!/usr/bin/env sh
set -e

if [ -x "./node_modules/.bin/lint-staged" ]; then
./node_modules/.bin/lint-staged
elif command -v lint-staged >/dev/null 2>&1; then
lint-staged
else
echo "husky(pre-commit): lint-staged not found; skipping. Install dependencies to re-enable."
fi
11 changes: 10 additions & 1 deletion .husky/pre-push
Original file line number Diff line number Diff line change
@@ -1 +1,10 @@
npm run test -- --watchAll=false --passWithNoTests
#!/usr/bin/env sh
set -e

if [ -x "./node_modules/.bin/jest" ]; then
./node_modules/.bin/jest --watchAll=false --passWithNoTests
elif command -v jest >/dev/null 2>&1; then
jest --watchAll=false --passWithNoTests
else
echo "husky(pre-push): jest not found; skipping. Install dependencies to re-enable."
fi
19 changes: 19 additions & 0 deletions AFRAMP BRANDING/AFRAMP DASHBOARD FLOWS/Onboarding Ui.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
I worked on the Aframp Design System, architecting the Feedback & Notifications framework to standardize system communication, error handling, and user encouragement.

I worked on the end-to-end mobile onboarding experience for Aframp, focusing on user education and building trust through secure digital wallet features.

I worked on designing the Wallet Setup flow, specifically engineering the 12-word recovery phrase system to prioritize asset security and user education.

I worked on the First Purchase Tutorial for Aframp, creating a low-stakes simulation environment to help new users feel confident during their first trade.

🛠️ Design & Technical Contributions
Interaction Design: I worked on defining the interaction rules for toast notifications, including auto-dismissal logic, stackability, and keyboard accessibility.

Validation Logic: I worked on the form validation patterns for the Aframp ecosystem, ensuring clear real-time feedback and high-contrast error states.

Security UX: I worked on the protective overlays and warning systems within the wallet setup to ensure users never compromise their recovery phrases.

Visual Language: I worked on the "emerald on obsidian" visual theme, maintaining consistency across both desktop documentation and mobile application interfaces.

https://www.figma.com/design/aqOcUCBjWiXzSWVpL7NU1j/Aframp-UI-and-Branding?node-id=0-1&p=f&t=JjuPIte56oBJWkeT-0

3 changes: 3 additions & 0 deletions AFRAMP BRANDING/AFRAMP DASHBOARD FLOWS/ror Ui.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
A high-fidelity UI design for an 'Error State' screen, following the Aframp design system style: dark mode background, neon red and deep charcoal accents. The screen features a centered, stylized 404 or connection error illustration with a 'broken circuit' theme. Below it, clear typography says 'Connection Interrupted' with a sub-text 'We couldn't reach the server. Please check your internet connection and try again.' There is a prominent 'Retry Connection' button in a vibrant neon red outline style, and a secondary 'Go to Dashboard' button in a muted ghost style. The layout is clean, professional, and consistent with the Aframp feedback and notifications aesthetic."

figma link https://fictional-space-enigma-6r5vp5qx6pvc5pjv.github.dev/
3 changes: 3 additions & 0 deletions AFRAMP BRANDING/ror Ui.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
A high-fidelity UI design for an 'Error State' screen, following the Aframp design system style: dark mode background, neon red and deep charcoal accents. The screen features a centered, stylized 404 or connection error illustration with a 'broken circuit' theme. Below it, clear typography says 'Connection Interrupted' with a sub-text 'We couldn't reach the server. Please check your internet connection and try again.' There is a prominent 'Retry Connection' button in a vibrant neon red outline style, and a secondary 'Go to Dashboard' button in a muted ghost style. The layout is clean, professional, and consistent with the Aframp feedback and notifications aesthetic."

figma link https://fictional-space-enigma-6r5vp5qx6pvc5pjv.github.dev/
Empty file.
Empty file.
1 change: 1 addition & 0 deletions Design/Pricealert
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://www.figma.com/design/vkVY2BjXOdV2Ll3XoEFWTZ/-62-Price-Alert---Watchlist-Design?m=auto&t=lb5MIC96Y4UKkobv-6
1 change: 1 addition & 0 deletions Design/Transaction History
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://www.figma.com/design/8AKBqCA6TUMFSTFniNKQMx/-51-Transaction-History-Page-Design?m=auto&t=w4hBZmmlwukX9OwT-6
1 change: 1 addition & 0 deletions Design/helpcenter
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://www.figma.com/design/9DVzmxlHeAkVnYhfAHm3o7/-60-Help-Center-Design?m=auto&t=lb5MIC96Y4UKkobv-6
1 change: 1 addition & 0 deletions Design/loadingstate
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://www.figma.com/design/po0o8Lp28aCjEORrYuSz1Q/-56-Loading-States---Skeletons?m=auto&t=lb5MIC96Y4UKkobv-6
1 change: 1 addition & 0 deletions Design/setting
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://www.figma.com/design/po0o8Lp28aCjEORrYuSz1Q/Untitled?m=auto&t=w4hBZmmlwukX9OwT-6
1 change: 1 addition & 0 deletions Design/swapinterface
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://www.figma.com/design/GlBWqHBQdEQdNQDs4BRe6e/-49-Swap-Interface-Design?m=auto&t=w4hBZmmlwukX9OwT-6
1 change: 1 addition & 0 deletions Design/wallet
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://www.figma.com/design/aPnxMsjJ4wjJ4rTFBAvT3K/-53-Wallet-Connection-Modal-Design?m=auto&t=w4hBZmmlwukX9OwT-6
Empty file added Empty States Design.txt
Empty file.
Empty file added Moblie Navigation Design.txt
Empty file.
Empty file added Offramp Flow.txt
Empty file.
Empty file added Onramp Flow.txt
Empty file.
12 changes: 12 additions & 0 deletions app/bills/[category]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { CategoryPageClient } from '@/components/bills/category-page-client'

export function generateStaticParams() {
const categories = ['electricity', 'internet', 'mobile', 'water', 'education', 'insurance']
return categories.map((cat) => ({
category: cat,
}))
}

export default function Page({ params }: { params: { category: string } }) {
return <CategoryPageClient categorySlug={params.category} />
}
7 changes: 0 additions & 7 deletions app/bills/page.tsx

This file was deleted.

92 changes: 92 additions & 0 deletions app/bills/pay/[billerId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
'use client'

import { use } from 'react'
import { motion } from 'framer-motion'
import { ArrowLeft, ShieldCheck, Zap } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { PaymentForm } from '@/components/bills/payment-form'
import { BILLER_SCHEMAS } from '@/lib/biller-schemas'
import Link from 'next/link'

interface PageProps {
params: Promise<{ billerId: string }>
}

export default function BillerPaymentPage({ params }: PageProps) {
const { billerId } = use(params)
const schema = BILLER_SCHEMAS[billerId]

if (!schema) {
return (
<div className="min-h-screen bg-background flex items-center justify-center p-4">
<div className="text-center space-y-4">
<h1 className="text-2xl font-bold">Biller Not Found</h1>
<p className="text-muted-foreground">The biller you are looking for does not exist or is not supported yet.</p>
<Button asChild>
<Link href="/bills">Back to Bills</Link>
</Button>
</div>
</div>
)
}

return (
<div className="min-h-screen bg-background">
{/* Header */}
<header className="sticky top-0 z-50 border-b border-border bg-card/80 backdrop-blur-md">
<div className="container mx-auto px-4 py-4 max-w-2xl text-center relative">
<Link
href="/bills"
className="absolute left-4 top-1/2 -translate-y-1/2 p-2 hover:bg-muted rounded-full transition-colors"
>
<ArrowLeft className="w-5 h-5 text-muted-foreground" />
</Link>
<h1 className="text-lg font-bold font-cal-sans">Pay {schema.name}</h1>
</div>
</header>

<main className="container mx-auto px-4 py-8 max-w-2xl">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
className="space-y-8"
>
{/* Biller Info */}
<div className="flex flex-col items-center text-center space-y-4">
<div className="w-20 h-20 rounded-3xl bg-primary/10 flex items-center justify-center text-4xl shadow-inner">
{schema.logo}
</div>
<div>
<h2 className="text-2xl font-bold tracking-tight">{schema.name}</h2>
<p className="text-muted-foreground text-sm">Fill in the details below to complete your payment.</p>
</div>
</div>

{/* Secure Payment Badge */}
<div className="flex items-center justify-center gap-6 py-2 border-y border-border/50">
<div className="flex items-center gap-1.5 text-[10px] font-medium text-muted-foreground uppercase tracking-wider">
<ShieldCheck className="w-3.5 h-3.5 text-success" />
<span>Secure Transaction</span>
</div>
<div className="flex items-center gap-1.5 text-[10px] font-medium text-muted-foreground uppercase tracking-wider">
<Zap className="w-3.5 h-3.5 text-warning" />
<span>Instant Confirmation</span>
</div>
</div>

{/* Dynamic Form */}
<div className="bg-card border border-border rounded-[2.5rem] p-6 sm:p-8 shadow-sm">
<PaymentForm schema={schema} />
</div>

{/* Help/Support */}
<div className="text-center">
<p className="text-sm text-muted-foreground">
Having issues? <button className="text-primary font-medium hover:underline">Contact Support</button>
</p>
</div>
</motion.div>
</main>
</div>
)
}
16 changes: 16 additions & 0 deletions app/feature-highlights/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
'use client'

import { useRouter } from 'next/navigation'
import { FeatureHighlightsCarousel } from '@/components/onboarding/feature-highlights-carousel'

export default function FeatureHighlightsPage() {
const router = useRouter()

return (
<FeatureHighlightsCarousel
onBack={() => router.push('/welcome')}
onComplete={() => router.push('/wallet-setup')}
onSkip={() => router.push('/wallet-setup')}
/>
)
}
Loading
Loading