Pages
DropBilko Frontend — Pages
All pages are insrc/drop-app/src/app/usingFramework: Next.js 15 (AppRouterRouter)file-basedCurrentrouting.State: Fully implemented with mock data Future State: Will require API integration to replace mock data
Page IndexLayouts
/ | | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| |
Page Details
/ — Home / Marketing Page
- File:
app/page.layout.tsx Type:Purpose:ServerRootcomponentHTML(nowrapper,"useappliesclient")Inter font, sets metadataAuth:Metadata:None- Title: "Bilko - Accounting Made Simple"
- Description: "Modern accounting software for Balkan businesses"
Components used:Dependencies:DropLogoFull,InterDropAppIcon,fontLink,fromImage,Googlecustom icons (IconSendMoney, IconQrScan, IconVirtualCard, IconShield, IconFastTransfer, IconCorridors)FontsData:Current State:StaticFullyarraysfeatures(3 items) andstats(3 items) defined inlineSections:Header with DropLogoFull + nav links (Tjenester, Priser, Om oss, Logg inn, Kom i gang)Hero with headline, subtext, CTA buttons, phone mockup placeholderFeatures grid (Send penger, Betal med QR, Virtuelt kort)Stats bar (0.5% Gebyr, <2t Leveringstid, 30+ Land)Trust section (BankID verified, Rask overføring, 30+ land)Merchant CTA sectionFooter with ALAI Holding AS credit
implemented
/loginDashboard — LoginLayout
- Route:
/(dashboard)/* - File:
app/login/page.(dashboard)/layout.tsx Type:Purpose:ClientLayoutcomponentwrapper for all authenticated pagesAuth:Key Components:None- Sidebar (
entrydesktoppoint)persistent, mobile overlay) - TopBar (header with search, notifications, user menu)
- Sidebar (
ComponentsStateused:Management:Image,LocalLink,stateButton,forMail/Lock/Eye/EyeOff/ArrowRightmobile(lucide)sidebar toggleState:Mobile Responsiveness:email,Responsivepassword,sidebarshowPassword,witherror, loadingoverlayDataCurrentfetching:State:POSTFully/api/auth/loginwith{ email, password }Validation:Email regex^[^\s@]+@[^\s@]+\.[^\s@]+$, required fields checkOn success:router.push("/dashboard")Social login buttons:BankID, Vipps (UI only, not functional)Dev mode:Shows demo credentialsimplemented[email protected] / demo1234
Pages
/registerDashboard — Registration(Home)
- Route:
/dashboard - File:
app/register/(dashboard)/dashboard/page.tsx Type:Purpose:ClientFinancialcomponentoverview and quick actionsAuth:Key Components:None- Metric cards (Cash Balance, Revenue MTD, Unpaid Invoices)
- P&L Bar Chart (6-month trend)
- Receivables Aging (stacked bar chart)
- Expenses by Category (donut chart)
- Recent Transactions table
- Quick Actions card
ComponentsDataused:Requirements (Future API):ArrowLeft/ArrowRight/Check/Eye/EyeOff/Phone/Mail/User/Calendar/LockGET /api/metrics— cashBalance, revenueMTD, unpaidInvoices, expensesMTD, profitMTD, cashFlowChangeGET /api/pl/monthly— monthly P&L data (lucide),revenue,Buttonexpenses, profit)GET /api/receivables/aging— receivables breakdown (current, 30d, 60d, 90d+)GET /api/expenses/by-category— expenses grouped by categoryGET /api/transactions/recent?limit=5— recent transactions
- Charts: Recharts (BarChart, PieChart) with responsive containers
- Current State: Mock data from
lib/mock-data.ts - Mobile Responsive: Grid adapts 1/2/3 columns based on breakpoint
Invoices List
- Route:
/invoices - File:
app/(dashboard)/invoices/page.tsx - Purpose: Invoice management with search, filter, sort
- Key Features:
- Status filter (all/draft/sent/paid/overdue)
- Search by customer name or invoice number
- Date range filter (this month, last month, quarter, all)
- Sortable columns (number, customer, date, due date, amount)
- Row actions (view, edit, send, download PDF, delete)
- Summary row with totals by status
- Data Requirements (Future API):
GET /api/invoices?status=X&search=Y&dateRange=Z&sort=field&dir=asc— filtered/sorted invoice listPATCH /api/invoices/:id— update invoiceDELETE /api/invoices/:id— delete invoicePOST /api/invoices/:id/send— send invoice via emailGET /api/invoices/:id/pdf— generate PDF
- Current State: Mock data, client-side filtering/sorting
- Mobile Responsive: Table scrolls horizontally, filters stack vertically
Invoice Creation Wizard
- Route:
/invoices/new - File:
app/(dashboard)/invoices/new/page.tsx - Purpose: 6-step
(1-4),wizardformtofields,createotp,andpin,senderrorsinvoices - Steps:
InfoCustomer Selection —firstName,SelectlastName,existingemail,customerphoneor add new (+47 prefix), dateOfBirth, passworddialog)VerifyInvoice Details —6-digitInvoiceOTPnumber,inputissue/due(MVP:dates,anynet6terms,digits accepted)currencyPINLine Items —4-digitAdd/removePINitemswith(description,customqty,numpadunitUIprice, VAT rate), auto-calculate totalsSuccessCustomization —WelcomeOptional notes and payment terms- Preview — Visual preview of generated invoice
- Send — Email form (to, subject, message,
redirectcopy to/dashboardself) + save/download options
- Data Requirements (Future API):
GET /api/customers— customer list for dropdownPOST /api/customers— create new customerPOST /api/invoices— create invoice (draft)POST /api/invoices/:id/send— send invoice via emailGET /api/invoices/:id/pdf— download PDF
- Form Validation:
AgeStep>=1:18Customer(calculated from dateOfBirth)requiredXSSStepprotection:3:namesAtrejectleast one line item with description required- Step 6: Email address required
- Current State: Mock data, local state, no persistence
- Mobile Responsive: Wizard steps adapt, form fields stack on mobile
Expenses List
- Route:
< > " ' & ; ( ) { } [ ]/expenses Password:File:min 8 chars, must contain letters AND numbersapp/(dashboard)/expenses/page.tsxPhone:Purpose:mustExpensebetracking8withdigitscategorization and approval workflow- Key Features:
- Period filter (
Norwegianthisformat)month, last month, quarter, year) - Category filter (Office, Travel, Meals, Utilities, Marketing, Infrastructure, Software, Professional Services)
- Search by description or vendor
- Status badges (pending, approved, paid)
- Receipt attachment indicator
- Add Expense dialog (with upload placeholder)
- Summary stats (total, pending, approved, paid counts)
- Period filter (
- Data
fetching:Requirements (Future API):GET /api/expenses?period=X&category=Y&search=Z— filtered expense listPOST/api/— create expenseauth/registerexpensesPATCH /api/expenses/:id— update expense statusPOST /api/expenses/:id/receipt— upload receipt (multipart)GET /api/expenses/:id/receipt— download receipt
- Form Fields:
- Amount + currency (EUR, RSD, BAM)
- Category (dropdown)
- Date
- Vendor (searchable input)
- Payment method (Cash, Card, Bank Transfer)
- Receipt upload (placeholder UI)
- Description (optional)
- Current State: Mock data, form submits to console
- Mobile Responsive: Filters stack, table scrolls
/dashboardPurchases — Main Dashboard(Alias)
- Route:
/purchases - File:
app/dashboard/(dashboard)/purchases/page.tsx Type:Purpose:ClientAliascomponentto expenses pageAuth:CurrentYes (useAuth()with redirect)Components used:DropLogo, BottomNav, ScrollArea, Bell/LogOut (lucide)- State:
transactions,Sameloadingcomponent Data fetching:GETas/api/transactions?limit=10expensesInterfaces:Transaction { id, type, status, amount, currency, recipientName, createdAt }Layout:Header: DropLogo + notification bell + logout + avatar initialsBalance card: primary account balance, formatted NOKAction buttons: Send penger (→ /send), Skann QR (→ /scan)Recent transactions list in ScrollAreaBottomNav
/accounts — Bank AccountsBanking
- Route:
/banking - File:
app/accounts/(dashboard)/banking/page.tsx Type:Purpose:ClientBankcomponentaccount management and reconciliationAuth:Key Features:Yes- 3 tabs: Accounts, Reconcile, Transactions
ComponentsAccountsused:Tab:BottomNav,ListCard,ofArrowLeft/Landmark/Plus/ChevronRightbank accounts with balances (lucide)multiple currencies)Data:Reconcile Tab:ReadsUnreconciledtransactionsuser.bankAccountsfromwithauthmatchhookconfidence,(noperiodseparate fetch)selectorLayout:Transactions Tab:- All
PSD2/OpenbankBanking info bannertransactions (blue)chronological)AccountImportcards: bankName, masked accountNumber, balance, currency, isPrimary badgeTotal balance summary"Legg til bankkonto"Transactions button (BankID connection note)placeholder)
- Match actions (approve, link, create new)
(useAuth())- Data Requirements (Future API):
GET /api/bank-accounts— list accountsPOST /api/bank-accounts— add accountGET /api/bank-accounts/:id/transactions?reconciled=false— unreconciled transactionsPOST /api/bank-accounts/:id/import— CSV importPOST /api/bank-accounts/:id/transactions/:txId/reconcile— mark reconciledPOST /api/bank-accounts/:id/transactions/:txId/link?invoiceId=X— link to invoice/expense
- Match Confidence Logic: Visual indicators for 0%, <50%, 50-89%, 90%+
- Current State: Mock data, no reconciliation logic
- Mobile Responsive: Tabs stack, tables scroll
/transactionsReports — Transaction HistoryHub
- Route:
/reports - File:
app/transactions/(dashboard)/reports/page.tsx Type:Purpose:ClientFinancialcomponentreport selection and P&L previewAuth:Report Cards:Yes- Profit & Loss (implemented preview)
- Balance Sheet (coming soon)
- Cash Flow Statement (coming soon)
- VAT/PDV Report (live at
)useAuth()/reports/vat ComponentsTrialused:BottomNav, Tabs/TabsList/TabsTrigger, ArrowLeft/ClockBalance (lucide)coming soon)- General Ledger (coming soon)
State:P&L Preview:transactions,- Expandable
loadingRevenue/Expenses sections - Current month detailed breakdown
- Export buttons (PDF, Excel) — placeholders
filter,- Expandable
- Data
fetching:Requirements (Future API):GET/api/— P&transactions?type={filter}reports/pl?month=YYYY-MMlimit=50L report dataGET /api/reports/balance-sheet?date=YYYY-MM-DD— balance sheetGET /api/reports/cash-flow?period=X— cash flow statement
Filters:Current State:AlleOnly(all),P&LOverforingerand(remittance),VATQR-betalingerreports(qr_payment)implemented, others show "Coming Soon" badgeGrouping:Mobile Responsive:ReportgroupByDate()functioncardsgroupsgridinto: I dag, I gar, Denne uken, EldreDisplay:Amount with +/- prefix and color coding (green for received, red for sent)adapts
/scanVAT — QR ScannerReport
- Route:
/reports/vat - File:
app/scan/(dashboard)/reports/vat/page.tsx Type:Purpose:Client componentAuth:Yes (useAuth())Components used:BottomNav, Button, ArrowLeft/Camera/Check/X/Store (lucide)State:scanState (scanning | payment | paying | success), scannedMerchant, amount, paymentResultInterfaces:ScannedMerchant { id, name, category },PaymentResult { id, status, amount, fee, merchant }Flow:Scanning— Camera viewfinder UI with scan frame, "Simuler skanning" button (demo)Payment— Shows merchant info, amount input, 1% fee calculationPaying— Loading spinnerSuccess— Confirmation with transaction details
Data fetching:POST/api/transactions/qr-paymentwith{ merchantId, amount }Demo merchant:"Ahmetov Kebab" (id: "merchant_001", category: "Restaurant")
/send — Send Money (Remittance)
File:app/send/page.tsxType:Client componentAuth:Yes (useAuth())Components used:Button, ArrowLeft/ArrowRight/Check/ChevronDown/Globe/User (lucide)State:3-step(1-4),VATselectedRecipient,returnamount, recipients, rates, sending, txResultpreparation- Steps:
SelectReconciliationRecipientCheck —ListWarnsfromifGETunreconciled/api/recipients,bankshowstransactionsname + country flagexistEnterVATAmountAudit —NOKTableinput,ofreal-timeallconversionVAT transactions (invoices + expenses) withexchangenet/VATrate, 0.5% fee displayamountsReviewReturn Summary —SummaryVATofreturnrecipient,boxesamount,(Boxrate,1:fee,collected,totalBox Success2:—paid,ConfirmationBoxwith3:referencenetnumberdue)
- Data
fetching:Requirements (Future API):GET/api/recipientsbank-accounts/unreconciled-count(on—mount)reconciliation statusGET/api/ratesvat/transactions?period=YYYY-MM(on—mount)all VAT transactionsGET /api/vat/return?period=YYYY-MM— calculated VAT return dataPOST/api/transactions/remittancevat/submitwith— e-filing (Phase 2){GETrecipientId,/api/vat/export/pdfamountNOK,—targetCurrencyPDF}exportGET /api/vat/export/xml— XML for e-filing
Country flags:Calculations:RSAssumes(Serbia),20%BAstandard(Bosnia),VATTRrate,(Turkey),convertsPKall(Pakistan),currenciesPLto(Poland)EUR equivalentInterface:Current State:TxResultMock{data,id,nostatus,submission,amount,exportfee,placeholders- Mobile
recipientName,Responsive:targetAmount,TabstargetCurrencyadapt,}tables scroll, boxes stack
/profile — User ProfileSettings
- Route:
/settings - File:
app/profile/(dashboard)/settings/page.tsx Type:Client componentAuth:Yes (useAuth())Components used:BottomNav, ArrowLeft/ChevronRight/LogOut/Settings/Shield/HelpCircle/Bell/CreditCard/Landmark (lucide)Data:Readsuserfrom auth hookLayout:User info card with initials avatar (green bg), full name, emailMenu items: Mine kontoer (→ /accounts), Varsler, Innstillinger, Sikkerhet, Hjelp og stotteLogout button with confirmationVersion: "Drop v0.1.0 · ALAI Holding AS"
/withdrawal — Angrerett (Right of Withdrawal)
File:app/withdrawal/page.tsxType:Client componentAuth:NoComponents used:ChevronLeft, RotateCcw, CheckCircle (lucide)State:submitted, loadingPurpose:Norwegian angrerettloven compliance — 14-day right of withdrawal formLayout:Info section explaining angrerett (right to cancel service agreement within 14 days)Warning banner: Angrerett does not apply to completed payment transactions, only to the service agreement itselfForm with optional reason dropdown (not_needed, alternative, not_satisfied, other) and comment textareaSubmit button (red) with AML retention notice (data kept for 5 years per hvitvaskingsloven)Success screen with confirmation message (14-day processing time)
/complaints — Send Complaint
File:app/complaints/page.tsxType:Client componentAuth:Yes (useAuth())Components used:MessageSquare, CheckCircle, ChevronLeft, ExternalLink (lucide)State:submitted, loading, formData (category, subject, description)Data fetching:POST/api/complaintswith{ category, subject, description }- Purpose:
FinansavtalelovenMulti-section§3-53 compliance — formal complaint submission with 15 business day response requirement Layout:Info text: All complaints taken seriously, up to 15 business days processing timeForm with required fields:Category dropdown: transaction, fees, service, privacy, otherSubject text input (max 200 chars)Description textarea (max 2000 chars)
Submit button with POST to/api/complaintsExternal complaint authority section: Finansklagenemnda (FinKN) contact info with link to finansklagenemnda.noSuccess screen: Complaint received, 15 business day review commitment
/privacy — Privacy Policy
File:app/privacy/page.tsxType:Client componentAuth:NoneComponents used:ChevronLeft, Shield (lucide)Purpose:GDPR-compliant privacy policysettings page(Norwegian language)- Sections:
Behandlingsansvarlig:CompanyALAI—HoldingCompanyASprofileas(name,datalegalcontrollerform, address, tax ID, currency, fiscal year)Hvilke opplysninger vi samler inn:UsersIdentification— User management table (name, email,phone,role,BankID)status),Financialinvitedata (bank accounts via Open Banking, transaction history), Technical data (IP, device, app version)buttonFormaalTaxmed&behandlingen:ComplianceTransaction—processingCountry,(PSD2/PISP),VATKYC/AMLregistration,compliance,VATAML/terrorismnumber/rate,prevention,complianceservice improvementremindersRettslig grunnlag:IntegrationsContract— Connected integrations (GDPRIntesa6(1)(b))Bank CSV, Email SMTP),Legalavailableobligationintegrations (6(1)(c))Stripe,forFiken,AML/KYC,GoogleLegitimateSheets,interestSlack,(6(1)(f)) for service improvementDocuSeal)Dine rettigheter:NotificationsInnsyn—(access),EmailRettingand(rectification),in-appSlettingnotification(erasure with 5-year AML retention), Dataportabilitet (portability)preferencesOppbevaring:SecurityMinimum—52FA,yearssessionpertimeout,hvitvaskingsloven,passwordanonymizationpolicy,onauditaccount deletion but AMLlog, dataretainedexport, Kontakt:delete[email protected], complaint to Datatilsynetcompany
Requirements
(Future API):
GET /—termsapi/settings/companyTermscompanyof ServiceFile:dataapp/terms/page.tsxType:PATCHClient/api/settings/companycomponent— update companyAuth:GETNone/api/users Components—used:ChevronLeft, FileText (lucide)Purpose:Legal terms of service (Norwegian language)Sections:Om tjenesten:Drop as PISP/AISP under PSD2, provided by ALAI Holding ASKrav til brukere:18+ age, Norwegian residency with BankID, KYC required, Norwegian phone (+47)Betalingsmodell:Drop never holds customer money, pass-through model via Open BankingGebyrer:All fees shown before transaction confirmation, see fees page for fulluser listAnsvar:POSTDrop responsible for correct payment execution per betalingstjenesteloven, refund rights per law, not liable for bank/recipient delaysMisbruk og sperring:Right to block accounts for suspected AML/fraud, mandatory STR reporting to Økokrim/EFEAngrerett:14-day withdrawal right per angrerettloven (does not apply to completed transactions)Tvister:Norwegian law, Oslo tingrett jurisdiction, complaint to Finansklagenemnda
/—feesapi/users/inviteFeeinviteOverviewFile:userapp/fees/page.tsxType:GETClient/api/settings/taxcomponent— tax settingsAuth:PATCH— update tax settingsNone/api/settings/taxComponentsGETused:/api/integrationsChevronLeft,—Receiptintegration(lucide)listPurpose:POSTTransparent/api/integrations/:id/connectfee—disclosureconnectpage (Norwegian language)integrationSections:GET- /api/settings/notifications
Overføring—tilnotificationutlandet:Transaction fee: 1.5% per transferpreferencesCurrencyPATCHmarkup:/api/settings/notifications0.5%—onupdatemid-market ratepreferencesTypicalGETtotal:/api/security/audit-log~2%—(compareauditwithlogPOSTat/api/security/data-export3-7%)— request data exportDELETE /api/company— delete company
banksQR-betalingCurrenti butikk:State:- Mock
Fordata,customer:formFree (no chargesubmits topayer)For merchant: 0.5% (lower than card terminals)
consoleKontotjenester:Mobile Responsive:- Sidebar
Accountnavcreation:stacks,Freeforms Monthly fee: FreeBank account linking (AISP): Free
Viktig informasjon:Fees can change with 30-day noticeExchange rates updated in real-time from marketAlways see final amount before confirming
adapt
Screenshot Descriptions
Dashboard/profile/personal—User
Personal Informationsees:File:3metric cards at top (cash balance with green arrow, revenue MTD, unpaid invoices with warning badge)app/profile/personal/page.tsxType:3Clientchartscomponentin row below (P&L bar chart, receivables aging stacked bar, expenses donut)Auth:BottomYesrow: recent transactions table on left, quick action buttons on right
Invoices List
User sees:
- Header with "Invoices" title and "New Invoice" button
- Filter row (
status dropdown, search input, date range dropdown)useAuth() - Table with all invoices (sortable columns, status badges, action menu per row)
- Summary bar at bottom showing totals by status
Invoice Wizard
User sees:
- Progress bar with 6 steps at top
- Current step content in card below
- Back/Next buttons at bottom (Send on final step)
- Step 3 shows line items with add/remove, running total calculation
- Step 5 shows formatted invoice preview
Expenses
User sees:
- "Expenses" header with "Add Expense" button
- Filters (period, category, search)
- Table with date, description, category, amount, vendor, status badge, receipt icon
- Summary bar with totals (total €, pending count, approved count, paid count)
- Add dialog: form with amount+currency, category, date, vendor, payment method, receipt upload, description
Banking
User sees:
- 3 tabs: Accounts, Reconcile, Transactions
- Accounts tab: table of bank accounts with type, currency, balance
- Reconcile tab: account selector, period, unreconciled transaction table with match confidence indicators, action buttons (✓ approve, 🔗 link, ➕ create)
- Transactions tab: full transaction history with reconciled status (✓/○)
VAT Report
User sees:
Components3-stepused:tabsChevronLeft,atShieldCheck (lucide), BottomNavtopState:StepReads1:Warninguserfromcardauthifhookunreconciled transactions exist, "Reconcile Now" and "Continue" buttonsLayout:Step- 2: VAT transaction table (type badge, net amount, VAT rate, VAT amount), summary boxes (collected, paid, net due)
- Step 3: VAT return boxes (Box 1, Box 2, Box 3 highlighted), export buttons (PDF, XML), submit button (disabled, "Coming in Phase 2")
Settings
User
avatarsees:Note:All fields are disabled (cannot edit) — verified via BankIDborder)
/profile/security — Security Settings
Notes
File:All pages use mock data fromapp/profile/security/page.tsxlib/mock-data.tsType:No authenticationClientimplementedcomponent(Phase 2)Auth:No persistenceYes—(useAuth())refreshing page loses all changesComponentsMobile-firstused:designChevronLeft, ChevronRight, Lock, Smartphone, Laptop (lucide), BottomNavSections:Passord:Change password button (shows "Sist endret: Aldri")To-faktor autentisering:BankID verification: Active (green badge)Vipps verification: Not activated (gray badge)
Aktive enheter:iPhone 15 Pro: Oslo, Norge — Aktiv nå (green dot indicator)MacBook Pro: Oslo, Norge — I går kl. 18:45
Footer: Support contact ([email protected])
Note:UI only, no actual functionality connected
/profile/notifications — Notification Settings
File:app/profile/notifications/page.tsxType:Client componentAuth:Yes (useAuth())Components used:ChevronLeft, Bell, Mail (lucide), BottomNavState:pushEnabled, emailEnabled, settingsLoadedData fetching:GET/api/settings(on mount)PATCH/api/settingswith{ pushEnabled: boolean }or{ emailEnabled: boolean }(on toggle)
Layout:Push-varsler toggle switch (Bell icon)E-postvarsler toggle switch (Mail icon)
Behavior:Toggles immediately update state and send PATCH request, revert on failure
/profile/language — Language Settings
File:app/profile/language/page.tsxType:Client componentAuth:Yes (useAuth())Components used:ChevronLeft, Check (lucide), BottomNavState:selected, savingData fetching:GET/api/settings(on mount)PATCH/api/settingswith{ language: string }(on save)
Languages:nb (Norsk Bokmål), en (English), bs (Bosanski), sq (Shqip)Layout:Language list with radio selection (green checkmark for selected)"Lagre" button (green) to save selection
Behavior:Selection updates local state, user must click "Lagre" to persist
/notifications — Notifications Center
File:app/notifications/page.tsxType:Client componentAuth:Yes (useAuth())Components used:BottomNav, ArrowLeft, Bell, ArrowUpRight, ScanLine, Smartphone, TrendingUp (lucide)State:notifications, fetchingData fetching:GET/api/notifications(on mount)PATCH/api/notificationswith{ notificationIds: [ids] }(mark read, fire-and-forget)
Interface:Notification { id, type, title, body, read, createdAt }Layout:Header with back button + "Varsler" titleEmpty state: Bell icon + "Ingen varsler enna" messageGrouped notifications: I DAG / I GÅR / date groupsNotification cards: icon based on type, title, body, timestamp, unread dot indicatorBottomNav
Notification types:transaction_complete (green), qr_payment (yellow), security (blue), rate_update (yellow), default (gray)Auto-read:Automatically marks all unread notifications as read on page loadTime formatting:"I dag kl. HH:MM", "I går kl. HH:MM", or "DD.MM.YYYY kl. HH:MM"
/cards — Card Management (FUTURE — feature-flagged)
Note:Cards are a FUTURE feature, gated behind feature flags (all default tofalse). Requires a card issuing partner before activation.
File:app/cards/page.tsxType:Client componentAuth:Yes (useAuth())Feature flags:virtualCards(gate),physicalCards,cardPin,— allspendingLimitsdefaultpagestotestedat mobile/tablet/desktop breakpointsfalseComponentsDarkused:Button, Dialog, various lucide icons (CreditCard, Plus, ArrowLeft, Smartphone, Eye, EyeOff, Lock, X, Check, Copy, RefreshCw)State:cards, selectedCard, showDetails, showOrderForm, orderForm, loadingData fetching:GET/api/cards(list)POST/api/cards(create virtual)POST/api/cardswith type "physical"sidebar +addresslight(ordercontentphysical)area PATCH—consistent/api/cards/{id}withlayout{status:across"frozen"all| "active"}DELETEpages/api/cards/{id}
Card visual:Green gradient background, masked card number (•••• •••• •••• 4242), expiry, cardholder name