Pages
BilkoDrop Frontend — Pages
Framework:All pages are insrc/drop-app/src/app/using Next.js15 (AppRouter)RouterCurrentfile-basedState:routing.Fully implemented with mock dataFuture State:Will require API integration to replace mock data
LayoutsPage Index
| Route | File | Type | Auth Required | BottomNav |
|---|---|---|---|---|
/ |
page.tsx |
Server | No | No |
/login |
login/page.tsx |
Client | No | No |
/register |
register/page.tsx |
Client | No | No |
/dashboard |
dashboard/page.tsx |
Client | Yes | Yes |
/accounts |
accounts/page.tsx |
Client | Yes | Yes |
/transactions |
transactions/page.tsx |
Client | Yes | Yes |
/scan |
scan/page.tsx |
Client | Yes | Yes |
/send |
send/page.tsx |
Client | Yes | No |
/profile |
profile/page.tsx |
Client | Yes | Yes |
/profile/personal |
profile/personal/page.tsx |
Client | Yes | No |
/profile/security |
profile/security/page.tsx |
Client | Yes | No |
/profile/notifications |
profile/notifications/page.tsx |
Client | Yes | No |
/profile/language |
profile/language/page.tsx |
Client | Yes | No |
/notifications |
notifications/page.tsx |
Client | Yes | Yes |
/cards |
cards/page.tsx |
Client | Yes | No |
/complaints |
complaints/page.tsx |
Client | No | No |
/fees |
fees/page.tsx |
Client | No | No |
/privacy |
privacy/page.tsx |
Client | No | No |
/terms |
terms/page.tsx |
Client | No | No |
/withdrawal |
withdrawal/page.tsx |
Client | No | No |
Page Details
Root/ Layout— Home / Marketing Page
Route:/- File:
app/layout.page.tsx Purpose:Type:RootServerHTMLcomponentwrapper,(noapplies"useInter font, sets metadataclient")Metadata:Auth:Title: "Bilko - Accounting Made Simple"Description: "Modern accounting software for Balkan businesses"
NoneDependencies:Components used:InterDropLogoFull,fontDropAppIcon,fromLink,GoogleImage,Fontscustom icons (IconSendMoney, IconQrScan, IconVirtualCard, IconShield, IconFastTransfer, IconCorridors)Current State:Data:FullyStaticimplementedarraysfeatures(3 items) andstats(3 items) defined inline- Sections:
- Header with DropLogoFull + nav links (Tjenester, Priser, Om oss, Logg inn, Kom i gang)
- Hero with headline, subtext, CTA buttons, phone mockup placeholder
- Features 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 section
- Footer with ALAI Holding AS credit
Dashboard/login Layout— Login
Route:/(dashboard)/*- File:
app/(dashboard)/layout.login/page.tsx Purpose:Type:LayoutClientwrapper for all authenticated pagescomponentKey Components:Auth:SidebarNone (desktopentrypersistent, mobile overlay)point)TopBarComponents used: Image, Link, Button, Mail/Lock/Eye/EyeOff/ArrowRight (headerlucide)- State: email, password, showPassword, error, loading
- Data fetching: POST
/api/auth/loginwithsearch,{notifications,email,userpasswordmenu)} - Validation: Email regex
^[^\s@]+@[^\s@]+\.[^\s@]+$, required fields check - On success:
router.push("/dashboard") - Social login buttons: BankID, Vipps (UI only, not functional)
- Dev mode: Shows demo credentials
[email protected] / demo1234
State—Management:Local state for mobile sidebar toggleMobile Responsiveness:Responsive sidebar with overlayCurrent State:Fully implemented
/register
Pages
Dashboard (Home)Registration
Route:/dashboard- File:
app/(dashboard)/dashboard/register/page.tsx Purpose:Type:FinancialClientoverview and quick actionscomponentKey Components:Auth: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 tableQuick Actions card
NoneDataComponentsRequirementsused: ArrowLeft/ArrowRight/Check/Eye/EyeOff/Phone/Mail/User/Calendar/Lock (Futurelucide),API):GET /api/metrics— cashBalance, revenueMTD, unpaidInvoices, expensesMTD, profitMTD, cashFlowChangeGET /api/pl/monthly— monthly P&L data (revenue, expenses, 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
ButtonCharts:Recharts (BarChart, PieChart) with responsive containersCurrentState:Mock data fromlib/mock-data.tsMobile Responsive:Grid adapts 1/2/3 columns based on breakpoint
Invoices List
Route:/invoicesFile:app/(dashboard)/invoices/page.tsxPurpose:Invoice management with search, filter, sortKey Features:Status filterstep (all/draft/sent/paid/overdue)1-4), Searchformbyfields,customerotp,namepin,or invoice numberDate 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/sortingMobile Responsive:Table scrolls horizontally, filters stack vertically
Invoice Creation Wizard
Route:/invoices/newFile:app/(dashboard)/invoices/new/page.tsxPurpose:6-step wizard to create and send invoiceserrors- Steps:
Customer SelectionInfo —SelectfirstName,existinglastName,customeremail,or add newphone (dialog)+47 prefix), dateOfBirth, passwordInvoice DetailsVerify —Invoice6-digitnumber,OTPissue/dueinputdates,(MVP:netanyterms,6currencydigits accepted)Line ItemsPIN —Add/remove4-digititemsPIN(description,withqty,customunitnumpadprice, VAT rate), auto-calculate totalsUICustomizationSuccess —OptionalWelcomenotesmessage,andredirectpaymenttoterms/dashboard
PreviewValidation:- Age >= 18 (calculated from dateOfBirth)
- XSS protection: names reject
< > " ' & ; ( ) { } [ ] - Password: min 8 chars, must contain letters AND numbers
- Phone: must be 8 digits (Norwegian format)
- Data fetching: POST
/api/auth/register
/dashboard — Main Dashboard
- File:
app/dashboard/page.tsx - Type: Client component
- Auth: Yes (
useAuth()with redirect) - Components used: DropLogo, BottomNav, ScrollArea, Bell/LogOut (lucide)
- State: transactions, loading
- Data fetching: GET
/api/transactions?limit=10 - Interfaces:
Transaction { id, type, status, amount, currency, recipientName, createdAt } - Layout:
- Header: DropLogo + notification bell + logout + avatar initials
- Balance card: primary account balance, formatted NOK
- Action buttons: Send penger (→ /send), Skann QR (→ /scan)
- Recent transactions list in ScrollArea
- BottomNav
/accounts — Bank Accounts
- File:
app/accounts/page.tsx - Type: Client component
- Auth: Yes (
useAuth()) - Components used: BottomNav, Card, ArrowLeft/Landmark/Plus/ChevronRight (lucide)
- Data: Reads
user.bankAccountsfrom auth hook (no separate fetch) - Layout:
- PSD2/Open Banking info banner (blue)
- Account cards: bankName, masked accountNumber, balance, currency, isPrimary badge
- Total balance summary
- "Legg til bankkonto" button (BankID connection note)
/transactions — Transaction History
- File:
app/transactions/page.tsx - Type: Client component
- Auth: Yes (
useAuth()) - Components used: BottomNav, Tabs/TabsList/TabsTrigger, ArrowLeft/Clock (lucide)
- State: transactions, filter, loading
- Data fetching: GET
/api/transactions?type={filter}&limit=50 - Filters: Alle (all), Overforinger (remittance), QR-betalinger (qr_payment)
- Grouping:
groupByDate()function groups into: I dag, I gar, Denne uken, Eldre - Display: Amount with +/- prefix and color coding (green for received, red for sent)
/scan — QR Scanner
- File:
app/scan/page.tsx - Type: Client component
- Auth: Yes (
useAuth()) - Components used: BottomNav, Button, ArrowLeft/Camera/Check/X/Store (lucide)
- State: scanState (scanning | payment | paying | success), scannedMerchant, amount, paymentResult
- Interfaces:
ScannedMerchant { id, name, category },PaymentResult { id, status, amount, fee, merchant } - Flow:
- Scanning —
VisualCamerapreviewviewfinderofUIgeneratedwithinvoicescan frame, "Simuler skanning" button (demo) SendPayment —EmailShowsformmerchant(to,info,subject,amountmessage,input,copy1%tofeeself)calculation- Paying
save/download—optionsLoading spinner - Success — Confirmation with transaction details
+ - Scanning —
- Data
Requirements (Future API):fetching:- POST
GET/api/customerstransactions/qr-payment—withcustomer{listmerchantId,foramountdropdown}merchant:POSTDemo/api/customers—"AhmetovcreateKebab"new(id:customer"merchant_001", category: "Restaurant")
POST/api/invoices— create invoice (draft) —POST /api/invoices/:id/sendsendSendinvoiceMoneyvia emailGET /api/invoices/:id/pdf— download PDF
Step 1: Customer requiredStep 3: At least one line item with description requiredStep 6: Email address required
Expenses List(Remittance)
Route:/expenses- File:
app/(dashboard)/expenses/send/page.tsx Purpose:Type:ExpenseClienttracking with categorization and approval workflowcomponentKey Features:Auth:Period filterYes (this month, last month, quarter, year)Category filter (Office, Travel, Meals, Utilities, Marketing, Infrastructure, Software, Professional Services)Search by description or vendorStatus badges (pending, approved, paid)Receipt attachment indicatorAdd Expense dialog (with upload placeholder)Summary stats (total, pending, approved, paid counts)
Data Requirements (Future API):GET /api/expenses?period=X&category=Y&search=Z— filtered expense listPOST /api/expenses— create expensePATCH /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)DateVendor (searchable input)Payment method (Cash, Card, Bank Transfer)Receipt upload (placeholder UI)Description (optional)
Current State:Mock data, form submits to consoleMobile Responsive:Filters stack, table scrolls
Purchases (Alias)
Route:/purchasesFile:app/(dashboard)/purchases/page.tsxPurpose:Alias to expenses pageCurrent State:Same component as/expenses
Banking
Route:/bankingFile:app/(dashboard)/banking/page.tsxPurpose:Bank account management and reconciliationKey Features:3 tabs: Accounts, Reconcile, TransactionsAccounts Tab:List of bank accounts with balances (multiple currencies)Reconcile Tab:Unreconciled transactions with match confidence, period selectorTransactions Tab:All bank transactions (chronological)Import Transactions button (placeholder)Match actions (approve, link, create new)
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 logicMobile Responsive:Tabs stack, tables scroll
Reports Hub
Route:/reportsFile:app/(dashboard)/reports/page.tsxPurpose:Financial report selection and P&L previewReport Cards:Profit & Loss (implemented preview)Balance Sheet (coming soon)Cash Flow Statement (coming soon)VAT/PDV Report (live at)/reports/vatuseAuth()TrialComponentsBalanceused: Button, ArrowLeft/ArrowRight/Check/ChevronDown/Globe/User (coming soon)General Ledger (coming soon)
lucide)P&L Preview:Expandable Revenue/Expenses sectionsCurrent month detailed breakdownExport buttons (PDF, Excel) — placeholders
Data Requirements (Future API):GET /api/reports/pl?month=YYYY-MM— P&L report dataGET /api/reports/balance-sheet?date=YYYY-MM-DD— balance sheetGET /api/reports/cash-flow?period=X— cash flow statement
CurrentState:Only P&L and VAT reports implemented, others show "Coming Soon" badgeMobile Responsive:Report cards grid adapts
VAT Report
Route:/reports/vatFile:app/(dashboard)/reports/vat/page.tsxPurpose:3-stepVAT(1-4),returnselectedRecipient,preparationamount, recipients, rates, sending, txResult- Steps:
ReconciliationSelectCheckRecipient —WarnsListiffromunreconciledGETbank/api/recipients,transactionsshowsexistname + country flagVATEnterAuditAmount —TableNOKofinput,allreal-timeVAT transactions (invoices + expenses)conversion withnet/VATexchangeamountsrate, 0.5% fee displayReturn SummaryReview —VATSummaryreturnofboxesrecipient,(Boxamount,1:rate,collected,fee,Boxtotal- Success
paid,—BoxConfirmation3:withnetreferencedue)number
2: - Data
Requirements (Future API):fetching:GET/api/bank-accounts/unreconciled-countrecipients—(onreconciliation statusmount)GET/api/vat/transactions?period=YYYY-MMrates—(onall VAT transactionsmount)- POST
GET/api/vat/return?period=YYYY-MMtransactions/remittance—withcalculated{VATrecipientId,returnamountNOK,datatargetCurrency POST /api/vat/submit}— e-filing (Phase 2)GET /api/vat/export/pdf— PDF exportGET /api/vat/export/xml— XML for e-filing
Calculations:Country flags:AssumesRS20%(Serbia),standardBAVAT(Bosnia),rate,TRconverts(Turkey),allPKcurrencies(Pakistan),toPLEUR equivalent(Poland)Current State:Interface:MockTxResultdata,{noid,submission,status,exportamount,placeholdersfee, Mobilerate,Responsive:recipientName,TabstargetAmount,adapt,targetCurrencytables scroll, boxes stack}
Settings/profile — User Profile
Route:/settings- File:
app/(dashboard)/settings/profile/page.tsx - Type: Client component
- Auth: Yes (
useAuth()) - Components used: BottomNav, ArrowLeft/ChevronRight/LogOut/Settings/Shield/HelpCircle/Bell/CreditCard/Landmark (lucide)
- Data: Reads
userfrom auth hook - Layout:
- User info card with initials avatar (green bg), full name, email
- Menu items: Mine kontoer (→ /accounts), Varsler, Innstillinger, Sikkerhet, Hjelp og stotte
- Logout button with confirmation
- Version: "Drop v0.1.0 · ALAI Holding AS"
/withdrawal — Angrerett (Right of Withdrawal)
- File:
app/withdrawal/page.tsx - Type: Client component
- Auth: No
- Components used: ChevronLeft, RotateCcw, CheckCircle (lucide)
- State: submitted, loading
- Purpose: Norwegian angrerettloven compliance — 14-day right of withdrawal form
- Layout:
- 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 itself
- Form with optional reason dropdown (not_needed, alternative, not_satisfied, other) and comment textarea
- Submit 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.tsx - Type: Client component
- Auth: 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:
Multi-sectionFinansavtalelovensettings§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 time
- Form with required fields:
- Category dropdown: transaction, fees, service, privacy, other
- Subject text input (max 200 chars)
- Description textarea (max 2000 chars)
- Submit button with POST to
/api/complaints - External complaint authority section: Finansklagenemnda (FinKN) contact info with link to finansklagenemnda.no
- Success screen: Complaint received, 15 business day review commitment
/privacy — Privacy Policy
- File:
app/privacy/page.tsx - Type: Client component
- Auth: None
- Components used: ChevronLeft, Shield (lucide)
- Purpose: GDPR-compliant privacy policy page (Norwegian language)
- Sections:
CompanyBehandlingsansvarlig:—ALAICompanyHoldingprofileAS(name,aslegaldataform, address, tax ID, currency, fiscal year)controllerUsersHvilke opplysninger vi samler inn:— User management tableIdentification (name, email,role,phone,status)BankID),inviteFinancialbuttondata (bank accounts via Open Banking, transaction history), Technical data (IP, device, app version)TaxFormaal&medCompliancebehandlingen:—TransactionCountry,processingVAT(PSD2/PISP),registration,KYC/AMLVATcompliance,number/rate,AML/terrorismcomplianceprevention,remindersservice improvementIntegrationsRettslig grunnlag:— Connected integrationsContract (IntesaGDPRBank CSV, Email SMTP)6(1)(b)),availableLegalintegrationsobligation (Stripe,6(1)(c))Fiken,forGoogleAML/KYC,Sheets,LegitimateSlack,interestDocuSeal)(6(1)(f)) for service improvementNotificationsDine rettigheter:—InnsynEmail(access),andRettingin-app(rectification),notificationSlettingpreferences(erasure with 5-year AML retention), Dataportabilitet (portability)SecurityOppbevaring: Minimum 5 years per hvitvaskingsloven, anonymization on account deletion but AML data retained- Kontakt: [email protected], complaint to Datatilsynet
/terms — 2FA,Terms sessionof timeout,Service
- File:
auditapp/terms/page.tsx - Type:
dataClientexport,component - Auth:
companyNone - 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 AS
- Krav til brukere: 18+ age, Norwegian residency with BankID, KYC required, Norwegian phone (+47)
- Betalingsmodell: Drop never holds customer money, pass-through model via Open Banking
- Gebyrer: All fees shown before transaction confirmation, see fees page for full list
- Ansvar: Drop responsible for correct payment execution per betalingstjenesteloven, refund rights per law, not liable for bank/recipient delays
- Misbruk og sperring: Right to block accounts for suspected AML/fraud, mandatory STR reporting to Økokrim/EFE
- Angrerett: 14-day withdrawal right per angrerettloven (does not apply to completed transactions)
- Tvister: Norwegian law, Oslo tingrett jurisdiction, complaint to Finansklagenemnda
/fees — Fee Overview
- File:
app/fees/page.tsx - Type: Client component
- Auth: None
- Components used: ChevronLeft, Receipt (lucide)
- Purpose: Transparent fee disclosure page (Norwegian language)
- Sections:
- Overføring til utlandet:
- Transaction fee: 1.5% per transfer
- Currency markup: 0.5% on mid-market rate
- Typical total: ~2% (compare with banks at 3-7%)
- QR-betaling i butikk:
- For customer: Free (no charge to payer)
- For merchant: 0.5% (lower than card terminals)
- Kontotjenester:
- Account creation: Free
- Monthly fee: Free
- Bank account linking (AISP): Free
- Viktig informasjon:
- Fees can change with 30-day notice
- Exchange rates updated in real-time from market
- Always see final amount before confirming
- Overføring til utlandet:
/profile/personal — Personal Information
- File:
app/profile/personal/page.tsx - Type: Client component
- Auth: Yes (
useAuth()) - Components used: ChevronLeft, ShieldCheck (lucide), BottomNav
- State: Reads
userfrom auth hook - Layout:
- User avatar with initials (green gradient)
- Full name and email display
- Read-only form fields: firstName, lastName, email, phone (+47 987 65 432), dateOfBirth (15. mars 1995)
- BankID verification badge (green banner with ShieldCheck icon)
DataNote:RequirementsAll fields are disabled (FuturecannotAPI):edit) — verified via BankID
/profile/security — Security Settings
- File:
app/profile/security/page.tsx - Type: Client component
- Auth: Yes (
useAuth()) - Components used: ChevronLeft, ChevronRight, Lock, Smartphone, Laptop (lucide), BottomNav
- Sections:
- Passord: Change password button (shows "Sist endret: Aldri")
- To-faktor autentisering:
verification:GETBankID/api/settings/company—Activecompany(greendatabadge)verification:PATCHVipps/api/settings/company—Notupdateactivatedcompany(gray GET /api/users— user listPOST /api/users/invite— invite userGET /api/settings/tax— tax settingsPATCH /api/settings/tax— update tax settingsGET /api/integrations— integration listPOST /api/integrations/:id/connect— connect integrationGET /api/settings/notifications— notification preferencesPATCH /api/settings/notifications— update preferencesGET /api/security/audit-log— audit logPOST /api/security/data-export— request data exportDELETE /api/company— delete companybadge)
CurrentAktiveState:enheter:Mock- iPhone
form15submitsPro:toOslo,consoleNorge — Aktiv nå (green dot indicator) - MacBook Pro: Oslo, Norge — I går kl. 18:45
data,- iPhone
- Footer: Support contact ([email protected])
Mobile Responsive:Note:SidebarUInavonly,stacks,noformsactualadaptfunctionality connected
Screenshot/profile/notifications Descriptions
— /profile/notifications DashboardNotification Settings
User sees:
3File:metricapp/profile/notifications/page.tsx- Type:
atClienttopcomponent - Auth: Yes (
cashuseAuth()) - Components used: ChevronLeft, Bell, Mail (lucide), BottomNav
- State: pushEnabled, emailEnabled, settingsLoaded
- Data fetching:
- GET
/api/settings(on mount) - PATCH
/api/settingswithgreen{arrow,pushEnabled:revenuebooleanMTD,}unpaidorinvoices{withemailEnabled:warningbooleanbadge) 3 charts in row below} (P&L bar chart, receivables aging stacked bar, expenses donut)Bottom row: recent transactions tableonleft, quick action buttons on righttoggle)
- GET
- 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
Invoices/profile/language List— Language Settings
User
- File:
app/profile/language/page.tsx - Type: Client component
- Auth: Yes (
useAuth()) - Components used: ChevronLeft, Check (lucide), BottomNav
- State: selected, saving
- Data fetching:
- GET
/api/settings(on mount) - PATCH
/api/settingswith{ language: string }(on save)
- GET
- 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.tsx - Type: Client component
- Auth: Yes (
useAuth()) - Components used: BottomNav, ArrowLeft, Bell, ArrowUpRight, ScanLine, Smartphone, TrendingUp (lucide)
- State: notifications, fetching
- Data fetching:
- GET
/api/notifications(on mount) - PATCH
/api/notificationswith{ notificationIds: [ids] }(mark read, fire-and-forget)
- GET
- Interface:
Notification { id, type, title, body, read, createdAt } - Layout:
- Header with back button + "
Invoices"Varsler" titleand "New Invoice" button FilterEmptyrowstate:(statusBelldropdown,iconsearch+input,"Ingen varsler enna" message- Grouped notifications: I DAG / I GÅR / date
range dropdown)groups TableNotificationwithcards: icon based on type, title, body, timestamp, unread dot indicator- BottomNav
- Header with back button + "
- Notification types: transaction_complete (green), qr_payment (yellow), security (blue), rate_update (yellow), default (gray)
- Auto-read: Automatically marks all
invoicesunread(sortablenotificationscolumns,asstatusreadbadges,onactionpagemenu per row)load SummaryTimebar at bottom showing totals by status
Invoice Wizard
User sees:
Progress bar with 6 steps at topCurrent step content in card belowBack/Next buttons at bottom (Send on final step)Step 3 shows line items with add/remove, running total calculationStep 5 shows formatted invoice preview
Expenses
User sees:
"Expenses" header withformatting: "AddIExpense"dagbuttonkl. Filters (period, category, search)Table with date, description, category, amount, vendor, status badge, receipt iconSummary bar with totals (total €HH:MM",pending"Icount,gårapprovedkl.count,HH:MM",paid count)Add dialog: form with amount+currency, category, date, vendor, payment method, receipt upload, description
Banking
User sees:
3 tabs: Accounts, Reconcile, TransactionsAccounts tab: table of bank accounts with type, currency, balanceReconcile 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:
3-step tabs at topStep 1: Warning card if unreconciled transactions exist,or "ReconcileDD.MM.YYYYNow"kl.and "Continue" buttonsStep 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 sees:
Notes
/cards — Card Management (FUTURE — feature-flagged)
Note: Cards are a FUTURE feature, gated behind feature flags (all default to
false). Requires a card issuing partner before activation.
All pages use mock dataFile:fromlib/mock-data.tsapp/cards/page.tsxNo authenticationType:implementedClient(Phase 2)componentNo persistenceAuth:—Yesrefreshing page loses all changes(useAuth())Mobile-firstFeaturedesignflags:virtualCards(gate),physicalCards,cardPin,spendingLimits— allpagesdefaulttestedtoat mobile/tablet/desktop breakpointsfalseDarkComponentssidebarused: Button, Dialog, various lucide icons (CreditCard, Plus, ArrowLeft, Smartphone, Eye, EyeOff, Lock, X, Check, Copy, RefreshCw)- State: cards, selectedCard, showDetails, showOrderForm, orderForm, loading
- Data fetching:
- GET
/api/cards(list) - POST
/api/cards(create virtual) - POST
/api/cardswith type "physical" +lightaddresscontent(orderareaphysical) - PATCH
consistent/api/cards/{id}layoutwithacross{status:all"frozen"pages| "active"} - DELETE
/api/cards/{id}
— - GET
- Card visual: Green gradient background, masked card number (•••• •••• •••• 4242), expiry, cardholder name