Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
2a9ca85
feat: Card Pioneers waitlist frontend implementation
Hugo0 Jan 29, 2026
4f191ce
fix: update CardDetailsScreen to handle purchase flow
Hugo0 Jan 29, 2026
d8a3a5c
fix: add missing heading prop to FAQsPanel in CardLandingPage
Hugo0 Jan 29, 2026
64568f2
fix: handle null username in useWebSocket call
Hugo0 Jan 29, 2026
a22d2fd
fix(card): fix E2E tests and update Card Pioneers feature
Hugo0 Feb 2, 2026
aca7ae5
Merge branch 'peanut-wallet-dev' into card-pioneers-frontend
Hugo0 Feb 2, 2026
43bc336
fix(card): address CodeRabbit review issues
Hugo0 Feb 2, 2026
03e83cd
feat(card): add backwards compat redirect and clean POST proxy
Hugo0 Feb 2, 2026
0681612
refactor: remove body mutation from proxy, delete redundant /post proxy
Hugo0 Feb 2, 2026
c29911d
fix: CardPioneerModal props and re-enable dismissal logic
Hugo0 Feb 2, 2026
b60dde1
fix: resolve TypeScript errors for PR build
Hugo0 Feb 2, 2026
08f4077
ci: add submodules checkout for animations
Hugo0 Feb 2, 2026
e2aa2da
fix(tests): update E2E tests to match /setup redirect behavior
Hugo0 Feb 2, 2026
e5c7bf7
last fixess gn
Hugo0 Feb 2, 2026
068c1a7
fix(tests): use waitForURL for client-side auth redirects
Hugo0 Feb 2, 2026
239b200
refactor: reuse logout logic in BackendErrorScreen
Hugo0 Feb 2, 2026
a6f7481
fix: remove duplicate error display in UserDetailsForm
jjramirezn Feb 4, 2026
4291152
Merge pull request #1666 from peanutprotocol/fix/double-error-display
jjramirezn Feb 4, 2026
7facbf3
feat: add third-party deposit warning to Manteca deposit details
jjramirezn Feb 4, 2026
d77432b
Merge pull request #1667 from peanutprotocol/feat/manteca-deposit-war…
jjramirezn Feb 4, 2026
1febb51
feat: enable coral v2
jjramirezn Feb 5, 2026
be20aca
fix: squidId
jjramirezn Feb 5, 2026
2db941b
temp
Hugo0 Feb 5, 2026
a0fe99b
fix: squid quote id status
jjramirezn Feb 5, 2026
032be22
fix: sentry filters all configs
jjramirezn Feb 5, 2026
da99e4a
Merge pull request #1670 from peanutprotocol/fix/sentry-filters-all-c…
jjramirezn Feb 5, 2026
7cb2b11
fix: better sentry
jjramirezn Feb 5, 2026
60ca8fa
fix: ignore vercel analytics errors
jjramirezn Feb 5, 2026
b96bfe7
fix: prettier
jjramirezn Feb 5, 2026
48e1fa0
Merge pull request #1671 from peanutprotocol/fix/sentry-filters-all-c…
jjramirezn Feb 5, 2026
5fc2004
Merge pull request #1669 from peanutprotocol/feat/squid-quote-id-status
jjramirezn Feb 9, 2026
5f81ad9
feature flag to disable card pioneers waitlist
Hugo0 Feb 10, 2026
2286a68
merge peanut-wallet-dev, resolve conflicts
Hugo0 Feb 10, 2026
c10ced6
fix: wrap logoutUser in arrow fn to fix TypeScript onClick type mismatch
Hugo0 Feb 10, 2026
64bd916
re-enable card
Hugo0 Feb 10, 2026
ddf553d
🐛 QA fixes: design system alignment, layout centering, modal priority…
Hugo0 Feb 12, 2026
78ed529
🐛 fix: prettier formatting
Hugo0 Feb 12, 2026
505c00a
📚 add pre-push checklist to .cursorrules
Hugo0 Feb 12, 2026
4ad9eba
🐛 address CodeRabbit review: security, cleanup, card interaction fixes
Hugo0 Feb 12, 2026
6830d7f
✨ allow all /dev routes on staging, block on peanut.me only
Hugo0 Feb 12, 2026
8b9fce7
🐛 fix ActionModal prop name in dev showcase, add typecheck script
Hugo0 Feb 12, 2026
4139dee
🐛 fix dev route guard for Vercel previews, fix 404 page layout and na…
Hugo0 Feb 12, 2026
030986f
✨ QA polish: credit card icon, geo screen shadow, card crossfade, git…
Hugo0 Feb 16, 2026
6c13368
Merge pull request #1654 from peanutprotocol/card-pioneers-frontend
Hugo0 Feb 16, 2026
25f310d
style: bring marketing/SEO pages in line with Peanut design system
Hugo0 Feb 16, 2026
3fbc449
feat: programmatic SEO pages, i18n, DS showcase, LP refactor
Hugo0 Feb 16, 2026
5c147f9
Add image support and draft/published filtering to content loaders
Hugo0 Feb 16, 2026
e488e6a
fix: prettier formatting, dynamicParams, content caching
Hugo0 Feb 16, 2026
c7f377c
Merge peanut-wallet (production) into peanut-wallet-dev
Hugo0 Feb 17, 2026
71fe5d3
fix: kernel client ready state + transaction query key bug
Hugo0 Feb 17, 2026
f24d698
Add retry logic before kernel client logout
Hugo0 Feb 17, 2026
79e5c6f
Move state updates after primary client check to prevent UI flicker
Hugo0 Feb 17, 2026
0d48306
Merge pull request #1681 from peanutprotocol/merge/production-sync-130
Hugo0 Feb 17, 2026
3d786b4
✏️ update cashback tooltip and fix comment path
Hugo0 Feb 18, 2026
70c98dd
chore: disable Card Pioneers waitlist
Hugo0 Feb 18, 2026
c06a550
cashback fixes
Hugo0 Feb 18, 2026
cb49019
fix: add shadow to share invite buttons on points page
Hugo0 Feb 18, 2026
111faa3
fix: hide My Card menu item in profile when card pioneers is disabled
Hugo0 Feb 18, 2026
931a050
✨ V3 transitivity UI + binary cashback + points animations
Hugo0 Feb 18, 2026
2e79309
fix: useCountUp render loop causing flickering animation
Hugo0 Feb 18, 2026
e821397
style: fix prettier formatting
Hugo0 Feb 18, 2026
e6b966f
zerodev package update
Hugo0 Feb 19, 2026
2dbe78f
feat: MDX content rendering pipeline with interactive components
Hugo0 Feb 21, 2026
ac8534e
fix: CI auth for private content submodule, publish argentina
Hugo0 Feb 22, 2026
bd0e575
feat: MDX-first rendering for all marketing pages + cleanup
Hugo0 Feb 22, 2026
8e2694f
feat: SEO improvements — breadcrumbs, FAQ schema, sitemap dates, ping…
Hugo0 Feb 22, 2026
546bfe1
feat: add support for GBP(sort-code) based bridge on/off-ramps
kushagrasarathe Feb 23, 2026
21d672a
fix: tests, gbp ex. rate and min withdraw check
kushagrasarathe Feb 23, 2026
bb407e8
fix: cr comments
kushagrasarathe Feb 23, 2026
7f7c8be
Merge pull request #1688 from peanutprotocol/feat/bridge-gbp
kushagrasarathe Feb 24, 2026
46053e2
Merge branch 'feat/seo' into release/prod-2025-02-25
Hugo0 Feb 24, 2026
9dd6178
merge prod hotfixes into release (hotfix/loading-screen #1685)
Hugo0 Feb 25, 2026
533d245
merge V3 transitivity UI + points animations into release
Hugo0 Feb 25, 2026
3f305a0
chore: gitignore .claude directory
Hugo0 Feb 25, 2026
05a104d
fix: use hasCashbackLeft (boolean) in CashCard, matching BE response
Hugo0 Feb 25, 2026
25f385f
chore: point content submodule to main (new content pages)
Hugo0 Feb 25, 2026
8b70a98
fix: publish all SEO content + guard corridor loader against undefine…
Hugo0 Feb 25, 2026
d28d85a
fix: SEO page polish — breadcrumbs, flags, hero, exchange widget, con…
Hugo0 Feb 25, 2026
9e07236
fix: ExchangeWidget overflow + bulk migrate content to inline widget
Hugo0 Feb 25, 2026
580887b
fix: SEO audit — OG URL, robots.txt locales, deduplicate extractors, …
Hugo0 Feb 25, 2026
848151c
chore: remove thin programmatic pages, unpublish blog/team from produ…
Hugo0 Feb 25, 2026
3b47bdd
fix: scroll freeze on mobile, modal bug, null guards, small fixes
Hugo0 Feb 25, 2026
1a0c833
fix: update content submodule — escape <20 in MDX tables
Hugo0 Feb 25, 2026
c9561fa
ci: retrigger after pushing content submodule
Hugo0 Feb 25, 2026
f314e48
fix: show loading spinner on sign test tx button while user data loads
Hugo0 Feb 26, 2026
2c054ff
style: run prettier on all files
Hugo0 Feb 26, 2026
c536f83
docs: add CI and tech stack badges to README
Hugo0 Feb 26, 2026
d509eb7
fix: prevent withdraw success screen from redirecting away from /home
Hugo0 Feb 26, 2026
0421615
fix: prevent infinite loading from stale SW-cached auth responses
Hugo0 Feb 26, 2026
4e48a4c
fix: refresh JWT cookie maxAge only on successful auth
Hugo0 Feb 26, 2026
33a6fe0
fix: typo "friends your friends" and document blog dynamicParams gotcha
Hugo0 Feb 26, 2026
3da3330
ci: add SUBMODULE_TOKEN to preview workflow for private content submo…
Hugo0 Feb 26, 2026
5f2745b
test: add unit tests for get-user-from-cookie auth cookie lifecycle
Hugo0 Feb 26, 2026
ce45dd0
chore: remove one-shot migration script, stale TODO doc, deprecated a…
Hugo0 Feb 26, 2026
9f29a47
ci: add --archive=tgz to vercel deploy to handle >15k files
Hugo0 Feb 26, 2026
3d25321
fix: sanitize blog slug to prevent stored XSS (CodeQL high)
Hugo0 Feb 26, 2026
5a251a7
fix: restore lockfile to zerodev 5.5.7, revert CashCard threshold (BE…
Hugo0 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
52 changes: 52 additions & 0 deletions .cursorrules
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
- **Do not generate .md files** unless explicity told to do so.
- **Comments** should always be made in all lowercase and simple english
- **Error messages**, any error being shown in the ui should be user friendly and easy to understand, and any error being logged in consoles and sentry should be descriptive for developers to help with debugging
- **Never add AI co-author to commits** - do not add "Co-Authored-By" lines for AI assistants in git commits

## 💻 Code Quality

Expand Down Expand Up @@ -78,6 +79,57 @@
- **Service Worker cache version** - only bump `NEXT_PUBLIC_API_VERSION` for breaking API changes (see JSDoc in `src/app/sw.ts`). Users auto-migrate.
- **Gate heavy features in dev** - prefetching, precompiling, or eager loading of routes can add 5-10s to dev cold starts. wrap with `process.env.NODE_ENV !== 'development'` (e.g. `<link rel="prefetch" href="/qr-pay" />` in layout.tsx).

## 🎨 Design System

- **Live showcase**: visit `/dev/components` to see all components rendered with all variants and copy-paste code
- **Three layers**: Bruddle primitives (`src/components/0_Bruddle/`), Global shared components (`src/components/Global/`), and Tailwind custom classes (`tailwind.config.js`)

### Bruddle Primitives (`0_Bruddle/`)
- Button, Card (named export), BaseInput, BaseSelect, Checkbox, Divider, Title, Toast, PageContainer, CloudsBackground

### Global Shared Components (`Global/`)
- **Navigation**: NavHeader (back button + title), TopNavbar, Footer
- **Modals**: Modal (base @headlessui Dialog), ActionModal (with buttons/checkboxes/icons), Drawer (vaul bottom sheet)
- **Loading**: Loading (spinner), PeanutLoading (branded), PeanutFactsLoading (with fun facts)
- **Cards**: Card (with position prop for stacked lists), InfoCard, PeanutActionCard
- **Status**: StatusPill, StatusBadge, ErrorAlert, ProgressBar
- **Icons**: Icon component with 50+ icons — `<Icon name="check" size={20} />`
- **Inputs**: AmountInput, ValidatedInput, CopyField, GeneralRecipientInput, TokenSelector
- **Utilities**: CopyToClipboard, AddressLink, ExternalWalletButton, ShareButton, Banner, MarqueeWrapper

### Color Names (misleading!)
- `purple-1` / `primary-1` = `#FF90E8` (pink, not purple)
- `primary-3` = `#EFE4FF` (lavender)
- `yellow-1` / `secondary-1` = `#FFC900`
- `green-1` = `#98E9AB`

### Key Rules
- **Button sizing trap**: `size="large"` is `h-10` (40px) — SHORTER than default `h-13` (52px). never use for primary CTAs
- **Primary CTA**: `<Button variant="purple" shadowSize="4" className="w-full">` — no size prop
- **Secondary CTA**: `<Button variant="stroke" className="w-full">`
- **Shadows**: always black `#000000`. use `shadowSize="4"` for action buttons
- **Border radius**: always `rounded-sm` (not rounded-lg or rounded-md)
- **Border stroke**: `border border-n-1` (1px black)
- **Links**: `text-black underline` — never `text-purple-1` (pink)
- **Text hierarchy**: `text-n-1` primary, `text-grey-1` secondary
- **Two Card components**: `0_Bruddle/Card` (standalone containers, named export) vs `Global/Card` (stacked list items, default export)
- **Backgrounds**: `bg-peanut-repeat-normal` for waving peanut pattern
- **Messaging**: use "starter balance" for card deposits — never "card balance" or "Peanut rewards"

### Page Layouts

- **Outer shell**: `flex min-h-[inherit] flex-col gap-8` — NavHeader is first child
- **Centered content + CTA** (default): wrap content AND CTA in `<div className="my-auto flex flex-col gap-6">`. CTA must be INSIDE this div, never a sibling
- **Pinned footer CTA**: add `justify-between` to outer div, CTA as last child outside content
- **Never** use `space-y-*` on the outer flex div (conflicts with centering) — use `gap-*` instead

## ✅ Before Pushing

- **Format**: `pnpm prettier --write <changed-files>` then verify with `pnpm prettier --check .`
- **Typecheck**: `npm run typecheck` — catches type errors that tests miss (tests don't run tsc)
- **Test**: `npm test` (fast, ~5s) — all 17 suites must pass
- **Build** (if touching imports/types): `npm run build` to catch compile errors

## 📝 Commits

- **Be descriptive**
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/preview.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ jobs:
- uses: actions/checkout@v4
with:
submodules: true
token: ${{ secrets.SUBMODULE_TOKEN }}
- uses: pnpm/action-setup@v4
with:
version: 9
Expand All @@ -24,4 +25,4 @@ jobs:
- name: Build Project Artifacts
run: vercel build --target=preview --token=${{ secrets.VERCEL_TOKEN }}
- name: Deploy Project Artifacts to Vercel
run: vercel deploy --prebuilt --target=preview --token=${{ secrets.VERCEL_TOKEN }}
run: vercel deploy --prebuilt --archive=tgz --target=preview --token=${{ secrets.VERCEL_TOKEN }}
18 changes: 17 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
token: ${{ secrets.SUBMODULE_TOKEN }}

- uses: actions/setup-node@v4
with:
Expand All @@ -24,11 +27,24 @@ jobs:
- name: Check formatting
run: pnpm prettier --check .

- name: Run Tests
- name: Run Unit Tests
run: pnpm test

- name: Install Playwright Browsers
run: npx playwright install --with-deps chromium

- name: Run E2E Tests
run: pnpm test:e2e

- name: Upload Coverage
uses: actions/upload-artifact@v4
with:
name: coverage
path: coverage/

- name: Upload Playwright Report
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: playwright-report/
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ PR.md

# testing
/coverage
/test-results/
/playwright-report/
/playwright/.cache/

# next.js
/.next/
Expand Down Expand Up @@ -70,3 +73,7 @@ public/sw*
public/swe-worker*

.idea

# mobile POC
android/
.claude/
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[submodule "src/assets/animations"]
path = src/assets/animations
url = https://github.com/peanutprotocol/peanut-animations.git
[submodule "src/content"]
path = src/content
url = https://github.com/peanutprotocol/peanut-content.git
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
# Peanut UI

[![Tests](https://github.com/peanutprotocol/peanut-ui/actions/workflows/tests.yml/badge.svg)](https://github.com/peanutprotocol/peanut-ui/actions/workflows/tests.yml)
[![Code Formatting](https://github.com/peanutprotocol/peanut-ui/actions/workflows/prettier.yml/badge.svg)](https://github.com/peanutprotocol/peanut-ui/actions/workflows/prettier.yml)
[![CodeQL](https://github.com/peanutprotocol/peanut-ui/actions/workflows/codeql.yml/badge.svg)](https://github.com/peanutprotocol/peanut-ui/actions/workflows/codeql.yml)
[![Next.js](https://img.shields.io/badge/Next.js-16-black?logo=next.js)](https://nextjs.org/)
[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react)](https://react.dev/)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.6-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![Tailwind CSS](https://img.shields.io/badge/Tailwind-4-06B6D4?logo=tailwindcss&logoColor=white)](https://tailwindcss.com/)
[![i18n](https://img.shields.io/badge/i18n-5_locales-blue)](https://peanut.me)
[![PWA Ready](https://img.shields.io/badge/PWA-ready-5A0FC8?logo=pwa)](https://peanut.me)

Live at: [peanut.me](https://peanut.me) | [staging.peanut.me](https://staging.peanut.me)

## Getting Started
Expand Down
170 changes: 170 additions & 0 deletions docs/TESTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
# Testing Philosophy

## Overview

peanut-ui uses a focused testing strategy that prioritizes **high-value tests** over coverage theater. We test critical paths that catch real bugs, not to hit arbitrary coverage percentages.

## Test Types

### 1. Unit Tests (Jest)

**Location**: Tests live with the code they test (e.g. `src/utils/foo.test.ts`)

**What we test**:
- Pure business logic (calculations, validations, transformations)
- Complex utility functions
- Critical algorithms (e.g. point calculations, country eligibility)

**What we DON'T test**:
- React components (brittle, low ROI)
- API service wrappers (thin fetch calls)
- Hooks that just wrap react-query (already tested upstream)
- JSX/UI layout (visual QA better)

**Run tests**:
- `npm test` - Run all unit tests
- `npm run test:watch` - Run tests in watch mode

### 2. E2E Tests (Playwright)

**Location**: Tests live with features they test (e.g. `src/features/card-pioneer/card-pioneer.e2e.test.ts`)

**What we test**:
- ✅ Multi-step navigation flows
- ✅ Form validation and error states
- ✅ URL state management (nuqs integration)
- ✅ Auth flows (signup, login, logout)
- ✅ UI interactions without external dependencies

**What we DON'T test**:
- ❌ Payment flows (require real transactions)
- ❌ KYC flows (external API dependencies)
- ❌ Bank transfers (real money, manual QA required)
- ❌ Wallet connections (MetaMask/WalletConnect popups)

**Why this split?**
External dependencies (payments, KYC, banks) are better tested manually because:
1. They require real credentials and real money
2. They have complex state (KYC approval status, bank account verification)
3. They involve third-party UIs (wallet popups, bank OAuth)
4. Manual QA catches edge cases E2E can't simulate

**Run tests**:
- `npm run test:e2e` - Run all E2E tests (headless)
- `npm run test:e2e:headed` - Run with browser visible
- `npm run test:e2e:ui` - Run in interactive UI mode
- `npx playwright test --grep "Card Pioneer"` - Run specific test suite
- `npx playwright test --list` - List all tests without running

## Testing Principles

### 1. Test Critical Paths Only

Focus on code that:
- Has financial impact (payment calculations, point multipliers)
- Has legal requirements (sanctions compliance, geo restrictions)
- Has security implications (reference parsing, user ID extraction)
- Is complex or hard to verify manually (date logic, ISO code mappings)

### 2. Fast Tests

- Unit tests run in ~5s
- E2E tests focus on minimal, high-value flows
- No unnecessary setup/teardown
- Mock external APIs but keep mocks simple

### 3. Tests Live With Code

Per .cursorrules: tests live where the code they test is, not in a separate folder.

```
src/
utils/
geo.ts
geo.test.ts ← unit test
features/
card-pioneer/
card-pioneer.tsx
card-pioneer.e2e.test.ts ← e2e test
```

### 4. DRY in Tests

Reuse test utilities, shared fixtures, and helper functions. Less code is better code.

## Example Test Scenarios

### Unit Test Example

```typescript
// src/utils/country-codes.test.ts
describe('convertIso3ToIso2', () => {
it('should convert USA to US', () => {
expect(convertIso3ToIso2('USA')).toBe('US')
})

it('should handle sanctioned countries', () => {
expect(convertIso3ToIso2('CUB')).toBe('CU') // Cuba
expect(convertIso3ToIso2('VEN')).toBe('VE') // Venezuela
})
})
```

### E2E Test Example

```typescript
// src/features/card-pioneer/card-pioneer.e2e.test.ts
test('user can navigate card pioneer flow', async ({ page }) => {
await page.goto('/card-pioneer')

// step 1: info screen
await expect(page.getByRole('heading', { name: /card pioneer/i })).toBeVisible()
await page.getByRole('button', { name: /get started/i }).click()

// step 2: details screen (check URL state)
await expect(page).toHaveURL(/step=details/)
await page.getByRole('button', { name: /continue/i }).click()

// step 3: geo check
await expect(page).toHaveURL(/step=geo/)
})
```

## When to Add Tests

Add tests when:
1. Implementing new financial logic
2. Handling compliance requirements
3. Complex algorithms or data transformations
4. Bug fixes (regression tests)

Skip tests when:
1. Just rendering JSX
2. Thin wrappers around libraries
3. Purely visual changes
4. Code that's easier to verify manually

## CI Integration

- Unit tests run on every PR
- E2E tests run on PR to main
- Fail fast: first failure stops the build

## Maintenance

Keep tests:
- **Concise** - no verbose setup or comments
- **Focused** - one concern per test
- **Stable** - avoid flaky selectors or timing issues
- **Up-to-date** - delete tests for removed features

When tests fail:
1. Fix the bug (if test caught a real issue)
2. Update the test (if behavior intentionally changed)
3. Delete the test (if feature was removed)

## Resources

- Jest: https://jestjs.io/
- Playwright: https://playwright.dev/
- Testing Library: https://testing-library.com/ (for React unit tests if needed)
19 changes: 17 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,15 @@
"knip": "knip",
"format": "prettier --write .",
"analyze": "ANALYZE=true next build",
"typecheck": "tsc --noEmit",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"script": "NODE_OPTIONS=\"--experimental-json-modules\" tsx"
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"test:e2e:headed": "playwright test --headed",
"script": "NODE_OPTIONS=\"--experimental-json-modules\" tsx",
"validate-content": "tsx scripts/validate-content.ts"
},
"dependencies": {
"@dicebear/collection": "^9.2.2",
Expand Down Expand Up @@ -48,19 +53,22 @@
"@vercel/analytics": "^1.4.1",
"@wagmi/core": "2.19.0",
"@zerodev/passkey-validator": "^5.6.0",
"@zerodev/sdk": "5.5.0",
"@zerodev/sdk": "5.5.7",
"autoprefixer": "^10.4.20",
"canvas-confetti": "^1.9.3",
"classnames": "^2.5.1",
"d3-force": "^3.0.0",
"embla-carousel-react": "^8.6.0",
"ethers": "5.7.2",
"framer-motion": "^11.11.17",
"gray-matter": "^4.0.3",
"i18n-iso-countries": "^7.13.0",
"iban-to-bic": "^1.4.0",
"js-cookie": "^3.0.5",
"jsqr": "^1.4.0",
"marked": "^17.0.2",
"next": "16.0.10",
"next-mdx-remote": "^6.0.0",
"nuqs": "^2.8.6",
"pix-utils": "^2.8.2",
"pulltorefreshjs": "^0.1.22",
Expand All @@ -75,6 +83,8 @@
"react-redux": "^9.2.0",
"react-tooltip": "^5.28.0",
"redux": "^5.0.1",
"remark-gfm": "^4.0.1",
"shiki": "^3.22.0",
"siwe": "^2.3.2",
"tailwind-merge": "^1.14.0",
"tailwind-scrollbar": "^3.1.0",
Expand All @@ -86,6 +96,7 @@
},
"devDependencies": {
"@next/bundle-analyzer": "^16.1.1",
"@playwright/test": "^1.58.0",
"@serwist/build": "^9.0.10",
"@size-limit/preset-app": "^11.2.0",
"@testing-library/jest-dom": "^6.4.2",
Expand Down Expand Up @@ -147,6 +158,10 @@
"**/__tests__/**/*.test.[jt]s?(x)",
"**/?(*.)+(spec|test).[jt]s?(x)"
],
"testPathIgnorePatterns": [
"/node_modules/",
"\\.e2e\\.test\\.(ts|tsx)$"
],
"extensionsToTreatAsEsm": [
".ts",
".tsx"
Expand Down
Loading
Loading