Page Specifications Per-page UI and feature specifications Page: Accounts Page Spec: Bank Accounts Route /accounts Architecture Status Core Figma Reference accounts.png Visual Description from Figma The bank accounts page displays all AISP-linked bank accounts via Open Banking: Top bar: Left side has a back arrow (ArrowLeft, NOT chevron) icon. "Mine kontoer" heading in bold sans-serif (NOT serif). No right-side icons. Info card: Light green/mint-colored rounded card with green shield icon (left side) and Norwegian text: "Open Banking (PSD2)" — bold heading "Drop leser saldo fra banken din via BankID-samtykke. Vi lagrer aldri pengene dine — alt går direkte fra din bankkonto." — body text explaining PSD2 pass-through model Bank account cards: Two white rounded cards, vertically stacked: DNB account Green circular icon with bank/building symbol (left side) "DNB" — bold heading "Primær" — small green badge/pill with green text and light green background, positioned next to bank name "1234.56.78901" — account number in muted gray text below bank name "35 200,00 NOK" — large bold balance amount (right side, top-aligned) Nordea account Green circular icon with bank/building symbol (left side) "Nordea" — bold heading (no badge) "9876.54.32100" — account number in muted gray text below bank name "12 320,50 NOK" — large bold balance amount (right side, top-aligned) Total balance card: White rounded card with: "Samlet saldo" — muted gray text on left "47 520,50 NOK" — large bold green text on right Add account button: White rounded card/button with: "+ Koble til ny bankkonto" — center-aligned, dark text, plus icon prefix Bottom navigation: 5 tabs — Hjem (house outline), Send (paper plane outline), Skann (QR outline), Kort (card outline, active/green filled), Profil (person outline). "Kort" tab is active (green). NOTE: Figma shows "Kort" tab active, but this is likely a design artifact. The accounts page should activate the "Profil" tab or no tab (if accounts is accessed from dashboard link). Background is light gray. Spacing between cards is consistent. Page Layout App page WITH bottom nav ├── Top Bar │ ├── Left: Back arrow (chevron left) │ └── Center: "Mine kontoer" heading ├── Info Card (light green bg, green shield icon) │ ├── "Open Banking (PSD2)" heading │ └── Explanation text (PSD2 pass-through) ├── Bank Account Cards (white rounded) │ └── For each account: │ ├── Bank icon (green circle) + Bank name + Badge (if primary) + Account number │ └── Balance amount (right-aligned) ├── Total Balance Card (white rounded) │ ├── "Samlet saldo" label (left) │ └── Total amount in green (right) ├── Add Account Button (white rounded) │ └── "+ Koble til ny bankkonto" └── Bottom Nav (Profil active or none) Components Top Bar

Mine kontoer

Info Card

Open Banking (PSD2)

Drop leser saldo fra banken din via BankID-samtykke. Vi lagrer aldri pengene dine — alt går direkte fra din bankkonto.

Bank Account Card

{bankName}

{isPrimary && ( Primær )}

{accountNumber}

{formattedBalance} NOK

Total Balance Card

Samlet saldo

{formattedTotal} NOK

Add Account Button Data Displayed Data Source API List of linked bank accounts AISP (Open Banking) GET /api/accounts Bank name AISP account metadata — Account number AISP account metadata — Account balance AISP real-time balance read — Primary account flag User preference stored in DB — Total balance Calculated sum of all accounts Client-side calculation User Interactions Element Action Result Back arrow Click Navigate back to previous page (likely /dashboard ) Bank account card Click Navigate to account detail page (optional) "+ Koble til ny bankkonto" button Click Initiate BankID flow to link new account via Open Banking Bottom nav tabs Click Navigate to respective page Norwegian Labels Element Norwegian Text Page heading Mine kontoer Info card heading Open Banking (PSD2) Info card text Drop leser saldo fra banken din via BankID-samtykke. Vi lagrer aldri pengene dine — alt går direkte fra din bankkonto. Primary badge Primær Total balance label Samlet saldo Add account button Koble til ny bankkonto Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Info card bg #0B6E35 at 10% opacity ( bg-[#0B6E35]/10 ) Info card border #0B6E35 at 20% opacity ( border-[#0B6E35]/20 ) Primary #0B6E35 Primary hover #095C2C Text primary #1A1A1A Text muted #6B7280 Text light #9CA3AF Border #E5E7EB Brand font font-[family-name:var(--font-fraunces)] Card radius rounded-2xl Button radius rounded-2xl Icon circle radius rounded-full Bank icon size h-12 w-12 Shield icon size h-10 w-10 Bottom Navigation Yes — "Kort" tab shown as active in Figma (green, filled card icon), but this is likely a design artifact. In production, either "Profil" tab should be active (if accounts is part of profile section) or no tab should be highlighted (if accessed from dashboard link). Page: Dashboard Page Spec: Dashboard Route /dashboard Architecture Status Core Figma Reference dashboard.png Visual Description from Figma The dashboard is the main home screen after login: Top bar: Left side has a small Drop icon (green, simplified) + "drop" wordmark in bold serif. Right side has three icons: bell (notifications), a logout/share icon (arrow pointing out of box), and user avatar circle (gray circle with "A" initial). Balance card: White rounded card with: "Hei, Amir!" greeting in muted text "kr 47 520,50" — large bold balance amount "DNB . 1234.56.78901" — bank name and partial account number "Saldo lest fra din bankkonto via Open Banking" — small muted text explaining PSD2 Green building/bank icon + "2 kontoer tilkoblet" green link text Action buttons row: Two side-by-side buttons: "Send penger" — dark green bg, white text, paper plane icon (Send/navigation style). Takes about 45% width. "Skann QR" — white bg with border, dark text, QR code icon. Takes about 55% width. Recent transactions section: "Siste transaksjoner" bold heading with "Se alle" green link on the right Three transaction cards, each in its own white rounded card: Kenan Basic — "Overforing" subtitle, green paper plane icon in green circle, "-2 500 NOK" amount, green "fullfort" badge Rema 1000 — "QR-betaling" subtitle, yellow QR icon in yellow circle, "-189 NOK" amount, green "fullfort" badge Mirza Hadzic — "Overforing" subtitle, green paper plane icon, "-5 000 NOK" amount, yellow/orange "behandler" badge Bottom navigation: 5 tabs — Hjem (active, green, filled house icon), Send (paper plane outline), Skann (QR outline), Kort (card outline), Profil (person outline). All inactive tabs are gray. Background is light gray. Large empty space between transactions and bottom nav. Page Layout App page WITH bottom nav ├── Top Bar │ ├── Left: Drop icon (small) + "drop" wordmark │ └── Right: Bell icon, Logout icon, User avatar (initials) ├── Balance Card (white rounded) │ ├── "Hei, {name}!" greeting │ ├── Balance amount (large bold) │ ├── Bank name + account number │ ├── PSD2 explanation text │ └── "{n} kontoer tilkoblet" link ├── Action Buttons Row │ ├── "Send penger" (green, paper plane icon) │ └── "Skann QR" (outlined, QR icon) ├── Recent Transactions Section │ ├── "Siste transaksjoner" heading + "Se alle" link │ └── Transaction cards (up to 3) │ ├── Icon (type-based) + Name + Type subtitle │ └── Amount + Status badge └── Bottom Nav (Hjem active) Components Top Bar
Drop drop
{initials}
Balance Card

Hei, {firstName}!

kr {formattedBalance}

{bankName} . {accountNumber}

Saldo lest fra din bankkonto via Open Banking

{accountCount} kontoer tilkoblet
Action Buttons Row
Send penger Skann QR
Recent Transactions Section

Siste transaksjoner

Se alle
{/* transaction cards */}
Transaction Card
{type === 'transfer' ? : }

{counterparty}

{typeLabel}

{formattedAmount} NOK

{statusLabel}
Status Badges Status Label Classes completed fullfort bg-[#16A34A]/10 text-[#16A34A] pending behandler bg-[#D97706]/10 text-[#D97706] failed feilet bg-[#EF4444]/10 text-[#EF4444] Data Displayed Data Source API User name JWT / user profile GET /api/account Balance AISP (primary bank account) GET /api/account Bank name + account number AISP linked account GET /api/account Connected accounts count AISP GET /api/account Last 3 transactions Transaction history GET /api/transactions?limit=3 User Interactions Element Action Result Bell icon Click Navigate to /notifications Logout icon Click Clear JWT cookie, redirect to /login User avatar Click Navigate to /profile "2 kontoer tilkoblet" link Click Navigate to /accounts "Send penger" button Click Navigate to /send "Skann QR" button Click Navigate to /scan "Se alle" link Click Navigate to /transactions Transaction card Click Navigate to transaction detail (optional) Bottom nav tabs Click Navigate to respective page Norwegian Labels Element Norwegian Text Greeting Hei, {name}! PSD2 note Saldo lest fra din bankkonto via Open Banking Accounts link {n} kontoer tilkoblet Send button Send penger Scan button Skann QR Transactions heading Siste transaksjoner See all link Se alle Transfer type Overforing QR payment type QR-betaling Status: completed fullfort Status: pending behandler Status: failed feilet Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Primary #0B6E35 Primary hover #095C2C Accent/Gold #D4A017 Text primary #1A1A1A Text body #374151 Text muted #6B7280 Text light #9CA3AF Border #E5E7EB Success #16A34A Warning #D97706 Error #EF4444 Brand font font-[family-name:var(--font-fraunces)] Card radius rounded-2xl Button radius rounded-xl Icon circle radius rounded-full Avatar size h-9 w-9 Bottom Navigation Yes — "Hjem" tab active (green, filled house icon). All other tabs inactive (gray, outline icons). Page: Landing Page Spec: Landing Route / Architecture Status Core Figma Reference NO FIGMA — design needed. Designed from architecture document + design system reference. Visual Description (Design Direction) No Figma screenshot exists. This is a public marketing/landing page for unauthenticated users. It should follow the design system's visual language (green primary, white cards, DM Sans body font, Fraunces for brand text) and present Drop's value proposition: simple remittance and QR payments for everyone in Norway/Scandinavia. Desktop max-width 1200px, responsive down to 375px mobile. Page Layout Full-width page (no bottom nav, public page) ├── Hero Section │ ├── Drop logo (green square + $ icon + gold dot) │ ├── "drop" wordmark (Fraunces serif bold) │ ├── Tagline: "Enklere betalinger. Lavere gebyrer." │ ├── Subtitle text explaining value proposition │ ├── CTA: "Kom i gang" → /register │ └── Secondary CTA: "Logg inn" → /login ├── Hero Section (with ambient glow background) │ ├── Drop logo (green square + $ icon + gold dot) │ ├── "drop" wordmark (Fraunces serif bold) │ ├── Headline: "Enklere betalinger. Lavere gebyrer." (split, second line green) │ ├── Subtitle text explaining value proposition │ ├── Primary CTA: "Opprett konto — gratis" → /register │ ├── Secondary CTA: "Logg inn" → /login │ └── Stats card (3 columns): "0,5%" gebyr, "<2t" leveringstid, "30+" land ├── Features Section │ ├── Heading: "Alt du trenger i en app" │ ├── Feature card 1: Send penger (remittance icon + description) │ ├── Feature card 2: Betal med QR (QR icon + description) │ └── Feature card 3: Virtuelt kort (card icon + description) **NOT "Bankkontoer"** ├── Trust Section │ ├── BankID-verifisert badge (shield icon) │ ├── Rask overføring badge (fast transfer icon) │ └── 30+ land badge (corridors icon) ├── Merchant CTA Section │ ├── "Er du butikkeier?" heading │ ├── Description: "Ta imot betalinger via QR. 1% gebyr..." │ └── "Kom i gang" button └── Footer └── "Drop — et produkt av ALAI Holding AS" copyright Components Hero Section
Drop

drop

Enklere betalinger. Lavere gebyrer.

Feature Cards

Feature Title

Description

Hero Headline

Enklere betalinger.
Lavere gebyrer.

Primary CTA Button Opprett konto — gratis Secondary CTA Logg inn Stats Card

0,5%

Gebyr

Data Displayed Static marketing content only No API calls No authentication required User Interactions Element Action Result "Opprett konto — gratis" button Click Navigate to /register "Logg inn" button Click Navigate to /login Merchant "Kom i gang" button Click NOT IMPLEMENTED (placeholder, href="#") Norwegian Labels Element Norwegian Text Brand wordmark drop Hero headline line 1 Enklere betalinger. Hero headline line 2 Lavere gebyrer. Hero subtitle Send penger, betal med QR, administrer kort — alt på ett sted. Laget for alle i Skandinavia. Primary CTA Opprett konto — gratis Secondary CTA Logg inn Stats label 1 Gebyr Stats label 2 Leveringstid Stats label 3 Land Features heading Alt du trenger i en app Feature 1 title Send penger Feature 1 desc Overfør penger internasjonalt. 0,5% gebyr — billigere enn banken. Feature 2 title Betal med QR Feature 2 desc Skann og betal i butikken. Raskere og billigere enn kort. Feature 3 title Virtuelt kort Feature 3 desc Få et virtuelt kort for netthandel. Bestill fysisk kort hjem. Trust badge 1 BankID-verifisert Trust badge 2 Rask overføring Trust badge 3 30+ land Merchant CTA heading Er du butikkeier? Merchant CTA desc Ta imot betalinger via QR. 1% gebyr — billigere enn kortterminalen. Merchant CTA button Kom i gang Footer copyright Drop — et produkt av ALAI Holding AS Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Primary #0B6E35 Primary hover #095C2C Text primary #1A1A1A Text body #374151 Text muted #6B7280 Brand font font-[family-name:var(--font-fraunces)] Body font DM Sans (default) Card radius rounded-2xl Button radius rounded-xl Button height h-12 Shadow shadow-sm Bottom Navigation No — this is a public page, no bottom nav. Page: Login Page Spec: Login Route /login Architecture Status Core Figma Reference login.png Visual Description from Figma The login page shows: Top section: Drop logo — green rounded square with white dollar-sign icon (with circular arrows around it) and a small gold/orange dot on the top-right corner of the icon. Below the icon: "drop" in bold serif font (Fraunces). Below that: "Enklere betalinger. Lavere gebyrer." in green italic text. Form card: White rounded card with subtle shadow containing: E-postadresse — label above, input field with mail/envelope icon on the left. Placeholder: "navn@eksempel.no". Field has light gray background with rounded corners and subtle border. Passord — label above, input field with lock icon on the left and an eye/visibility toggle icon on the right. Shows dots (password masked). Same styling as email field. "Glemt passord?" — right-aligned green link text below the password field. "Logg inn" button — full width, dark green background ( #0B6E35 ), white text, rounded corners. Has a right arrow icon next to the text. Divider: NOT IMPLEMENTED (claimed in Figma spec but missing from code) Social login buttons: NOT IMPLEMENTED (BankID + Vipps claimed in Figma spec but missing from code) Bottom text: "Har du ikke konto? Opprett konto" — "Opprett konto" is a green bold link. Background is light gray. The entire form is centered vertically and horizontally on the page. Page Layout Full-page centered (no bottom nav — auth page) ├── Logo Section (centered) │ ├── Drop icon (64x64) │ ├── "drop" wordmark (Fraunces serif bold) │ └── Tagline italic green ├── Form Card (white rounded) │ ├── E-postadresse input (mail icon) │ ├── Passord input (lock icon + eye toggle) │ ├── "Glemt passord?" link (right-aligned) **NOT IMPLEMENTED** (href="#") │ └── "Logg inn" button (green, full width, arrow icon) └── "Har du ikke konto? Opprett konto" link Components Logo Block
Drop

drop

Enklere betalinger. Lavere gebyrer.

Form Card
{/* form fields + buttons */}
Email Input
Password Input
Glemt passord?
Login Button Divider
ELLER LOGG INN MED
Social Login Buttons
Register Link

Har du ikke konto? Opprett konto

Error Message

{error}

Data Displayed Static form (no pre-loaded data) On submit: POST /api/auth/login with email + password On success: JWT set in httpOnly cookie, redirect to /dashboard User Interactions Element Action Result E-postadresse input Type Captures email Passord input Type Captures password Eye icon Click Toggle password visibility "Glemt passord?" link Click Navigate to forgot password flow "Logg inn" button Click POST /api/auth/login, on success redirect to /dashboard BankID button Click Initiate BankID auth flow (research ongoing) Vipps button Click Initiate Vipps auth flow (research ongoing) "Opprett konto" link Click Navigate to /register Validation Rules Field Rule Error Message E-postadresse Required, valid email Ugyldig e-postadresse Passord Required, min 1 char Passord er paakrevd Auth failure Invalid credentials Feil e-postadresse eller passord Norwegian Labels Element Norwegian Text Email label E-postadresse Email placeholder navn@eksempel.no Password label Passord Forgot password link Glemt passord? Login button Logg inn Divider text ELLER LOGG INN MED BankID button BankID Vipps button Vipps Register prompt Har du ikke konto? Register link Opprett konto Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Input bg #F9FAFB Primary #0B6E35 Primary hover #095C2C Border #E5E7EB Divider #D1D5DB Text primary #1A1A1A Text muted #6B7280 Text light #9CA3AF Error #EF4444 Brand font font-[family-name:var(--font-fraunces)] Card radius rounded-2xl Input radius rounded-lg Button radius rounded-xl Input height h-11 Button height h-12 Bottom Navigation No — this is an auth page, no bottom nav. Page: Notifications Page Spec: Notifications Route /notifications Architecture Status Core Figma Reference No Figma — designed from architecture Visual Description The notifications page displays transaction alerts, system messages, and payment confirmations: Top bar: Left side has a back arrow (ArrowLeft, NOT chevron). "Varsler" heading in bold sans-serif (NOT serif). No right-side icons. Notification list: Vertically stacked notification cards, each in its own white rounded card: Unread notifications: Bold title text with a green dot indicator (left edge) Read notifications: Regular title text without indicator Each card contains: Icon: Type-based icon in colored circle (green for transfers, yellow for QR payments, blue for system messages) Title: Bold notification heading Description: Muted text with details Timestamp: Muted text showing relative time ("2 timer siden", "I går 14:30") Empty state: When no notifications exist: Large bell icon with slash (gray, centered) "Ingen varsler" heading "Du vil motta varsler om transaksjoner og viktige meldinger her" description text Bottom navigation: 5 tabs — Hjem (house outline, gray), Send (paper plane outline, gray), Skann (QR outline, gray), Kort (card outline, gray), Profil (person outline, gray). No tab highlighted as active. Background is light gray (#EEEEEE). All cards are white with rounded corners (#FFFFFF, rounded-2xl). Unread notifications appear at the top. Page Layout App page WITH bottom nav ├── Top Bar │ ├── Left: Back arrow (chevron left) │ └── Center: "Varsler" heading ├── Notification List (or Empty State) │ └── Notification cards (sorted by date, unread first) │ ├── Unread indicator (green dot) │ ├── Icon (type-based color) │ ├── Title (bold if unread) │ ├── Description (muted text) │ └── Timestamp (relative time) └── Bottom Nav (no active tab) Components Top Bar

Varsler

Notification Card (Unread)
markAsRead(notification.id)} className="relative flex items-start gap-3 rounded-2xl bg-white p-4 shadow-sm cursor-pointer hover:bg-[#F9FAFB] transition-colors" > {/* Unread indicator dot */}
{/* Icon */}
{getNotificationIcon(notification.type)}
{/* Content */}

{notification.title}

{notification.description}

{formatTimestamp(notification.created_at)}

Notification Card (Read)
{/* Icon */}
{getNotificationIcon(notification.type)}
{/* Content */}

{notification.title}

{notification.description}

{formatTimestamp(notification.created_at)}

Empty State

Ingen varsler

Du vil motta varsler om transaksjoner og viktige meldinger her

Notification Icon Logic function getNotificationIcon(type: string) { switch (type) { case 'transaction_sent': case 'transaction_received': return ; case 'qr_payment': return ; case 'system_message': case 'account_linked': case 'security_alert': return ; default: return ; } } function getIconBgColor(type: string) { switch (type) { case 'transaction_sent': case 'transaction_received': return 'bg-[#0B6E35]/10'; case 'qr_payment': return 'bg-[#D4A017]/10'; case 'system_message': case 'account_linked': case 'security_alert': return 'bg-[#3B82F6]/10'; default: return 'bg-[#E5E7EB]'; } } Timestamp Formatter function formatTimestamp(timestamp: string): string { const now = new Date(); const then = new Date(timestamp); const diffMs = now.getTime() - then.getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); const diffDays = Math.floor(diffMs / 86400000); if (diffMins < 1) return 'Akkurat nå'; if (diffMins < 60) return `${diffMins} ${diffMins === 1 ? 'minutt' : 'minutter'} siden`; if (diffHours < 24) return `${diffHours} ${diffHours === 1 ? 'time' : 'timer'} siden`; if (diffDays === 1) return `I går ${then.toLocaleTimeString('nb-NO', { hour: '2-digit', minute: '2-digit' })}`; if (diffDays < 7) return `${diffDays} dager siden`; return then.toLocaleDateString('nb-NO', { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' }); } Data Displayed Data Source API Notification list Notifications table GET /api/notifications Notification title Notification record From notifications table Notification description Notification record From notifications table Notification type Notification record transaction_sent / transaction_received / qr_payment / system_message / account_linked / security_alert Notification read status Notification record is_read boolean Notification timestamp Notification record created_at User Interactions Element Action Result Back arrow Click Navigate back to previous page (dashboard) Unread notification card Click Mark notification as read, update UI to show read state Read notification card Click Optional — navigate to related resource (e.g., transaction detail) Bottom nav tabs Click Navigate to respective page Norwegian Labels Element Norwegian Text Page heading Varsler Empty state heading Ingen varsler Empty state description Du vil motta varsler om transaksjoner og viktige meldinger her Timestamp: Now Akkurat nå Timestamp: Minutes {n} minutt siden / {n} minutter siden Timestamp: Hours {n} time siden / {n} timer siden Timestamp: Yesterday I går {time} Timestamp: Days {n} dager siden Notification: Transaction sent Overføring sendt Notification: Transaction received Penger mottatt Notification: QR Payment QR-betaling fullført Notification: System message Systemmelding Notification: Account linked Bankkonto tilkoblet Notification: Security alert Sikkerhetsvarsel Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Primary #0B6E35 Primary hover #095C2C Accent/Gold #D4A017 Info blue #3B82F6 Text primary #1A1A1A Text muted #6B7280 Text light #9CA3AF Border #E5E7EB Unread indicator #0B6E35 (green dot) Brand font font-[family-name:var(--font-fraunces)] Card radius rounded-2xl Icon circle radius rounded-full Hover bg #F9FAFB Bottom Navigation Yes — No tab active (all tabs gray, outline icons). Page: Profile Page Spec: Profile (Settings) Route /profile Architecture Status Core Figma Reference profile.png Visual Description from Figma The profile/settings page is the user account management screen: Top bar: Left side has a back arrow (ArrowLeft, NOT chevron) in muted gray. "Profil" heading in bold sans-serif font (NOT serif). Right side is empty. Background is light gray (#EEEEEE). User card: White rounded card at top with: Circular avatar with light green background (#0B6E35/10 = 10% opacity green) Initials "AH" in dark green (#0B6E35) centered in the avatar circle User name "Amir Hadžić" in bold black LEFT-ALIGNED (NOT centered) next to avatar Email "amir@eksempel.no" in muted gray below name, LEFT-ALIGNED (NOT centered) LAYOUT: Avatar and text are in horizontal flexbox (NOT centered vertical stack) Menu card: White rounded card containing 5 menu items: "Mine kontoer" — building/bank icon (outlined, dark gray) on left, chevron right on right side "Varsler" — bell icon (outlined, dark gray) on left, chevron right on right side "Innstillinger" — gear/cog icon (outlined, dark gray) on left, chevron right on right side "Sikkerhet" — shield icon (outlined, dark gray) on left, chevron right on right side "Hjelp og støtte" — question mark in circle icon (outlined, dark gray) on left, chevron right on right side Each menu item has padding, separated by subtle divider lines Icons are consistent size (approximately 20-24px) Text is medium weight, dark black Chevron right icons are muted gray Logout button: Separate white rounded button with: "Logg ut" text in red (#EF4444) Logout/exit icon (LogOut component) inline with text (NOT on left with text to right) 2px solid red border (border-2 border-[#EF4444]) White background, hover changes to light red (#FEF2F2) Footer text: NOT IMPLEMENTED (claimed in spec but missing from code) Bottom navigation: 5 tabs — Hjem (house outline), Send (paper plane outline), Skann (QR outline), Kort (card outline), Profil (active, green, filled person icon). All inactive tabs are gray. Background is light gray (#EEEEEE). Spacing between cards is consistent. Page Layout App page WITH bottom nav ├── Top Bar │ ├── Left: Back arrow │ ├── Center: "Profil" heading │ └── Right: Empty ├── User Card (white rounded, centered content) │ ├── Avatar circle (initials, green on light green bg) │ ├── User full name (bold) │ └── Email address (muted) ├── Menu Card (white rounded) │ ├── "Mine kontoer" (bank icon + chevron) │ ├── "Varsler" (bell icon + chevron) │ ├── "Innstillinger" (gear icon + chevron) │ ├── "Sikkerhet" (shield icon + chevron) │ └── "Hjelp og støtte" (question icon + chevron) ├── Logout Button Card (white rounded, red text) │ └── "Logg ut" (logout icon) ├── Footer Text │ └── "Drop v0.1.0 · ALAI Holding AS" └── Bottom Nav (Profil active) Components Top Bar

Profil

User Card
{user.firstName.charAt(0)}{user.lastName.charAt(0)}

{user.firstName} {user.lastName}

{user.email}

Menu Card
} label="Mine kontoer" href="/accounts" /> } label="Varsler" href="/notifications" /> } label="Innstillinger" href="/settings" /> } label="Sikkerhet" href="/security" /> } label="Hjelp og støtte" href="/support" />
Menu Item Component
{icon}
{label}
Divider
Logout Button Footer Text

Drop v0.1.0 · ALAI Holding AS

Data Displayed Data Source API User full name JWT / user profile GET /api/account User email User profile GET /api/account User initials Derived from full name Client-side App version Build metadata Static Company name Static Static User Interactions Element Action Result Back arrow Click Navigate back to previous page Avatar Click Optional: navigate to profile edit page "Mine kontoer" Click Navigate to /accounts "Varsler" Click Navigate to /notifications "Innstillinger" Click Navigate to /settings (app preferences) "Sikkerhet" Click Navigate to /security (PIN, biometrics, 2FA) "Hjelp og støtte" Click Navigate to /support (FAQs, contact) "Logg ut" button Click Clear JWT cookie, redirect to /login Bottom nav tabs Click Navigate to respective page Norwegian Labels Element Norwegian Text Page title Profil Bank accounts menu Mine kontoer Notifications menu Varsler Settings menu Innstillinger Security menu Sikkerhet Help menu Hjelp og støtte Logout button Logg ut Footer Drop v0.1.0 · ALAI Holding AS Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Avatar bg #D1E9DC (light green/mint) Avatar text #0B6E35 Primary #0B6E35 Text primary #1A1A1A Text muted #6B7280 Text light #9CA3AF Border #E5E7EB Danger #EF4444 Danger hover bg #FEF2F2 Hover bg #F9FAFB Brand font font-[family-name:var(--font-fraunces)] Card radius rounded-2xl Avatar radius rounded-full Avatar size h-20 w-20 Menu item padding px-5 py-4 Icon size h-5 w-5 Bottom Navigation Yes — "Profil" tab active (green, filled person icon). All other tabs inactive (gray, outline icons). Page: Register Page Spec: Register Route /register Architecture Status Core Figma Reference onboarding.png Implementation Status SPEC DOCUMENTS STEP 1 ONLY. The actual implementation has 4 steps: Personal Info (documented below) — name, email, phone, DOB, password Phone Verification (NOT DOCUMENTED) — OTP input PIN Setup (NOT DOCUMENTED) — 4-digit PIN with number pad Success Screen (NOT DOCUMENTED) — welcome message + navigate to dashboard This spec covers ONLY step 1. Steps 2-4 need separate specs or this spec needs expansion. Visual Description from Figma The register page (called "Opprett konto" in Figma) has step 1 of 3: Top section: Drop logo (green rounded square with white $ icon and gold dot top-right), "drop" wordmark in bold serif font, tagline "Enklere betalinger. Lavere gebyrer." in green italic text. Progress indicator: Three-segment horizontal bar below the tagline. First segment is filled dark green (active), other two segments are light gray. This indicates "step 1 of 3" in a multi-step registration. Form card: White rounded card containing the form with heading "Opprett konto" in bold. Form fields (6 total): Fornavn and Etternavn — side by side in a 2-column layout. Each has a user icon (person outline) on the left. Placeholders: "Amir" / "Hadzic". E-postadresse — full width, mail/envelope icon left. Placeholder: "amir@eksempel.no". Telefonnummer — full width, phone icon left. Placeholder shows "+47" prefix. Fodselsdato — full width, calendar icon left. Placeholder: "mm/dd/yyyy". Has a calendar picker icon on the right. Passord — full width, lock icon left. Placeholder: "Minst 8 tegn". Eye/visibility toggle icon on the right. "Fortsett" button: Full-width green button below the card (appears slightly muted green, not as saturated as the login button). Bottom text: "Har du allerede konto? Logg inn" — "Logg inn" is a green link. Background is light gray ( #EEEEEE ). All input fields have light gray backgrounds with subtle borders. Page Layout Full-page centered (no bottom nav — auth page) ├── Logo Section (centered) │ ├── Drop icon (64x64) │ ├── "drop" wordmark (Fraunces serif bold) │ └── Tagline italic green ├── Progress Bar (3 steps) │ ├── Step 1: filled green (active) │ ├── Step 2: gray │ └── Step 3: gray ├── Form Card (white rounded) │ ├── "Opprett konto" heading │ ├── Row: Fornavn | Etternavn (2-col) │ ├── E-postadresse input │ ├── Telefonnummer input (+47) │ ├── Fodselsdato input (date picker) │ └── Passord input (toggle visibility) ├── "Fortsett" button (full width, outside card) └── "Har du allerede konto? Logg inn" link Components Logo Block
Drop

drop

Enklere betalinger. Lavere gebyrer.

Progress Bar (3-step)
{/* active */}
{/* inactive */}
{/* inactive */}
Form Card

Opprett konto

{/* form fields */}
Name Fields (2-column)
Standard Input (email, phone, DOB, password)
Password Input (with eye toggle)
Submit Button Error Message

{error}

Data Displayed Static form (no pre-loaded data) On submit: POST /api/auth/register with form data User Interactions Element Action Result Fornavn input Type Captures first name Etternavn input Type Captures last name E-postadresse input Type Captures email Telefonnummer input Type Captures phone (+47 prefix) Fodselsdato input Click/type Opens date picker, captures DOB Passord input Type Captures password (min 8 chars) Eye icon Click Toggle password visibility "Fortsett" button Click Validate all fields, POST /api/auth/register, on success navigate to /login "Logg inn" link Click Navigate to /login Validation Rules Field Rule Error Message Fornavn Required, min 2 chars Fornavn er paakrevd Etternavn Required, min 2 chars Etternavn er paakrevd E-postadresse Required, valid email format Ugyldig e-postadresse Telefonnummer Required, starts with +47, 8 digits Ugyldig telefonnummer Fodselsdato Required, age >= 18 Du ma vaere minst 18 ar Passord Required, min 8 chars Passordet ma vaere minst 8 tegn Norwegian Labels Element Norwegian Text Page heading Opprett konto First name label Fornavn Last name label Etternavn Email label E-postadresse Email placeholder amir@eksempel.no Phone label Telefonnummer Phone placeholder +47 DOB label Fodselsdato DOB placeholder mm/dd/yyyy Password label Passord Password placeholder Minst 8 tegn Submit button Fortsett Login prompt Har du allerede konto? Login link Logg inn Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Input bg #F9FAFB Primary #0B6E35 Primary hover #095C2C Border #E5E7EB Progress active #0B6E35 Progress inactive #E5E7EB Text primary #1A1A1A Text muted #6B7280 Text light #9CA3AF Error #EF4444 Card radius rounded-2xl Input radius rounded-lg Button radius rounded-xl Input height h-11 Button height h-12 Bottom Navigation No — this is an auth page, no bottom nav. Page: Scan Page Spec: Scan QR Route /scan Architecture Status Core Figma Reference scan.png Visual Description from Figma The scan page is a full-screen dark camera-style view for QR code scanning: Top bar: Left side has a white back arrow ( ← ). Center has "Scan QR" in white bold text. No right-side elements. Camera viewport: Full-screen dark background ( #1A1A1A or near-black) simulating a camera feed. Scanner viewfinder: Large centered square/rectangle with: Dashed gray border ( #6B7280 approx) forming the full perimeter Four green corner brackets (thick, #0B6E35 ) at each corner — top-left, top-right, bottom-left, bottom-right A horizontal green scanning line across the middle of the viewfinder (animated or static) Instruction text: Near the bottom, white/light text: "Pek kameraet mot butikkens QR-kode" — muted, centered. Simulate button: Full-width green button at the very bottom: "Simuler skanning" — dark green background ( #0B6E35 ), white text, rounded corners. This is a demo-only button for simulating a QR scan without a real camera. No bottom navigation — this is a full-screen overlay/modal page. Page Layout Full-screen dark (no bottom nav — camera overlay) ├── Top Bar (over dark bg) │ ├── Left: Back arrow (white) │ └── Center: "Scan QR" title (white, bold) ├── Camera Viewport (dark bg, full screen) │ └── Scanner Viewfinder (centered) │ ├── Dashed border (gray) │ ├── Green corner brackets (4 corners) │ └── Green scan line (horizontal, centered) ├── Instruction Text │ └── "Pek kameraet mot butikkens QR-kode" └── Simulate Button (demo only) └── "Simuler skanning" (green, full width) Components Top Bar

Scan QR

{/* spacer for centering */}
Scanner Viewfinder
{/* Dashed border */}
{/* Green corner brackets — top-left */}
{/* Green corner brackets — top-right */}
{/* Green corner brackets — bottom-left */}
{/* Green corner brackets — bottom-right */}
{/* Scan line (centered horizontal) */}
Instruction Text

Pek kameraet mot butikkens QR-kode

Simulate Button (Demo Only) Data Displayed Data Source API None pre-loaded — — On scan success QR payload (merchant ID, amount) POST /api/transactions (type: qr_payment) User Interactions Element Action Result Back arrow Click Navigate back (router.back()) Camera viewfinder Scan QR code Parse QR payload → navigate to payment confirmation "Simuler skanning" button Click Simulate QR scan with mock merchant data → navigate to payment confirmation QR Scan Flow (Demo) User taps "Simuler skanning" App generates mock QR payload: { merchantId: "REMA1000-001", merchantName: "Rema 1000", amount: 189 } Navigate to confirmation screen (inline or modal) showing merchant name + amount User confirms → POST /api/transactions with type qr_payment , PISP initiates payment from linked bank account On success → redirect to /dashboard with success toast QR Scan Flow (Production — Future) Camera activates, user points at merchant QR code QR library decodes payload (merchant ID, amount, reference) Same confirmation + PISP flow as above Norwegian Labels Element Norwegian Text Page title Scan QR Instruction Pek kameraet mot butikkens QR-kode Simulate button Simuler skanning Confirm prompt Bekreft betaling Merchant label Butikk Amount label Belop Pay button Betal nå Cancel button Avbryt Success toast Betaling fullfort! Error toast Betaling feilet. Prov igjen. Design Tokens Token Value Page bg #1A1A1A (dark/camera) Viewfinder border border-dashed border-[#6B7280] Corner brackets border-[#0B6E35] (4px) Scan line bg-[#0B6E35] Primary #0B6E35 Primary hover #095C2C Text white #FFFFFF Text muted (on dark) #9CA3AF Button radius rounded-xl Viewfinder radius rounded-2xl Button height h-12 Bottom Navigation No — this is a full-screen camera overlay, no bottom nav. Page: Send Page Spec: Send Money Route /send Architecture Status Core Implementation Status SPEC DOCUMENTS STEP 1 ONLY. The actual implementation has a 4-step flow: Select Recipient (documented below) — search recipients, add new Enter Amount (NOT DOCUMENTED) — amount input + exchange rate display Confirm (NOT DOCUMENTED) — review transfer details, fee breakdown Success (NOT DOCUMENTED) — confirmation screen + receipt This spec covers ONLY step 1. Steps 2-4 need separate specs or this spec needs expansion. Figma Reference send.png Visual Description from Figma The Send Money page is the first step in the money transfer flow: Top bar: Left side has a back arrow (thin left arrow) icon in muted gray. Center has "Send penger" heading in bold sans-serif font. Below the heading, centered, is "1/4" step indicator in muted text. Background: Light gray ( #EEEEEE ). Search input: Large white rounded input field with: Magnifying glass icon on the left (gray) Placeholder text "Søk mottakere..." in gray Full width with rounded corners Empty state message: Centered text below search input: "Ingen mottakere funnet" in muted gray text ( #6B7280 ) Indicates no recipients have been added yet Add recipient button: White rounded button at bottom of content area: "+" icon on left in dark color "Ny mottaker" text in dark color Full width, white rounded, no visible border (contrast against gray bg) Positioned well above bottom navigation Bottom navigation: Visible but all tabs inactive (no green highlight). The page has a clean, minimal design with large touch targets and plenty of whitespace. Page Layout App page WITH bottom nav ├── Top Bar │ ├── Left: Back arrow (chevron) │ ├── Center: "Send penger" heading │ └── Right: "1/4" step indicator ├── Content Area (light gray bg) │ ├── Search Input │ │ ├── Search icon (left) │ │ └── "Søk mottakere..." placeholder │ ├── Empty State │ │ └── "Ingen mottakere funnet" message │ └── Add Recipient Button │ ├── "+" icon │ └── "Ny mottaker" label └── Bottom Nav (all tabs inactive) Components Top Bar

Send penger

1/4
Search Input
setSearchQuery(e.target.value)} />
Empty State

Ingen mottakere funnet

Add Recipient Button Recipient List (when populated)
{recipients.map((recipient) => ( ))}
Data Displayed Data Source API Saved recipients User's recipient list GET /api/recipients Search results Filtered recipient list Client-side filtering Step indicator Flow state Static (1/4) User Interactions Element Action Result Back arrow Click Navigate back to previous page (dashboard) Search input Type Filter recipient list in real-time Add recipient button Click Navigate to /send/add-recipient (step 2) Recipient card Click Select recipient, navigate to amount input (step 3) Bottom nav tabs Click Navigate to respective page (exits send flow) Norwegian Labels Element Norwegian Text Page title Send penger Step indicator 1/4 Search placeholder Søk mottakere... Empty state Ingen mottakere funnet Add recipient button Ny mottaker Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Input bg #FFFFFF Primary #0B6E35 Primary hover #095C2C Text primary #1A1A1A Text muted #6B7280 Text light #9CA3AF Border #E5E7EB Brand font font-[family-name:var(--font-fraunces)] Card radius rounded-2xl Button radius rounded-2xl Input radius rounded-2xl Avatar/Icon circle rounded-full Icon circle bg #0B6E35]/10 (10% opacity green) Bottom Navigation Yes — All tabs inactive (gray, outline icons). User is in the send flow but not on a main tab page. Flow Context This is step 1 of 4 in the send money flow: Select Recipient (this page) — choose from saved recipients or add new Add Recipient — enter recipient details (name, country, account) Enter Amount — specify amount and currency Review & Confirm — review details, initiate PISP payment from user's bank account Pass-through model reminder: Drop initiates payment via PISP from user's linked bank account. No money is held by Drop. Page: Transactions Page Spec: Transaction History Route /transactions Architecture Status Core Figma Reference history.png Visual Description from Figma The transaction history page shows a complete list of all transactions with filtering: Top bar: Left side has a back arrow (ArrowLeft, NOT chevron). Center has "Transaksjonshistorikk" heading in bold sans-serif (NOT serif). No right-side icons. Filter tabs row: Three pill-shaped tabs using Tabs/TabsList/TabsTrigger components: "Alle" — filter="all", active tab with dark green background (#0B6E35), white text "Overføringer" — filter="remittance" (NOT "Overforinger"), inactive gray "QR-betalinger" — filter="qr_payment", inactive gray Date-based grouping: Transactions grouped by labels: "I dag" — transactions from today "I går" — transactions from yesterday "Denne uken" — transactions within last 7 days (NOT "DENNE UKEN" in uppercase) "Eldre" — older transactions (NOT in original Figma, but implemented) Transaction cards: Each card shows: Icon (ArrowUpRight for remittance in green, QrCode for QR payment in gold #D4A017) Recipient name or "Betaling" Type label: "Overføring" or "QR-betaling" Amount with Norwegian number formatting (space as thousand separator) Status badge: "fullført" (green), "behandler" (orange), "feilet" (red) Bottom navigation: 5 tabs — ALL INACTIVE (no active tab shown on this page, contrary to Figma which shows Kort active). Background is light gray (#EEEEEE). Large empty space below transactions. All cards are white with rounded corners (#FFFFFF, rounded-2xl). Page Layout App page WITH bottom nav ├── Top Bar │ ├── Left: Back arrow (chevron left) │ └── Center: "Transaksjonshistorikk" heading ├── Filter Tabs Row (white rounded container) │ ├── "Alle" (active, green bg) │ ├── "Overforinger" (inactive, white bg) │ └── "QR-betalinger" (inactive, white bg) ├── Transaction List (grouped by date) │ ├── Date Separator: "I GAR" (uppercase, muted) │ ├── Transaction cards (yesterday's transactions) │ ├── Date Separator: "DENNE UKEN" (uppercase, muted) │ └── Transaction cards (this week's transactions) └── Bottom Nav (Kort tab active/highlighted) Components Top Bar

Transaksjonshistorikk

Filter Tabs Row
Date Separator

{dateLabel}

Transaction Card
{type === 'transfer' ? : }

{counterparty}

{typeLabel}

{formattedAmount} NOK

{statusLabel}
Status Badges Status Label Classes completed fullfort bg-[#16A34A]/10 text-[#16A34A] pending behandler bg-[#D97706]/10 text-[#D97706] failed feilet bg-[#EF4444]/10 text-[#EF4444] Data Displayed Data Source API All transactions Transaction history, filtered by selected tab GET /api/transactions?filter={all|transfers|qr} Transaction counterparty Transaction record From transactions table Transaction type Transaction record transfer / qr_payment Transaction amount Transaction record Negative for outgoing Transaction status Transaction record completed / pending / failed Transaction date Transaction record For grouping by date separator User Interactions Element Action Result Back arrow Click Navigate back to previous page (dashboard) "Alle" tab Click Show all transactions (no filter) "Overforinger" tab Click Filter to show only transfer transactions "QR-betalinger" tab Click Filter to show only QR payment transactions Transaction card Click Navigate to transaction detail page (optional) Bottom nav tabs Click Navigate to respective page Norwegian Labels Element Norwegian Text Page heading Transaksjonshistorikk Filter: All Alle Filter: Transfers Overforinger Filter: QR Payments QR-betalinger Date separator: Yesterday I GAR Date separator: This week DENNE UKEN Date separator: This month DENNE MANEDEN Date separator: Earlier TIDLIGERE Transaction type: Transfer Overforing Transaction type: QR Payment QR-betaling Status: completed fullfort Status: pending behandler Status: failed feilet Design Tokens Token Value Page bg #EEEEEE Card bg #FFFFFF Primary #0B6E35 Primary hover #095C2C Accent/Gold #D4A017 Text primary #1A1A1A Text muted #6B7280 Text light #9CA3AF Border #E5E7EB Success #16A34A Warning #D97706 Error #EF4444 Brand font font-[family-name:var(--font-fraunces)] Card radius rounded-2xl Button radius rounded-xl Pill radius rounded-full Icon circle radius rounded-full Bottom Navigation Yes — "Kort" tab appears active/highlighted (based on Figma). All other tabs inactive (gray, outline icons).