/* SHARED APP SURFACE - showroom, ledger, reports, organization pages. Tokens first, so dark mode is a variable swap and not a per-rule fight. */ :root { --surface: #ffffff; --surface-2: #f8fafc; --surface-sunk: #f1f5f9; --ink: #0f172a; --ink-2: #475569; --ink-3: #94a3b8; --line: #e5e7eb; --line-soft: #f1f5f9; --accent: #2563eb; --pos: #059669; --neg: #dc2626; --warn: #d97706; --shadow-sm: 0 1px 3px rgba(15,23,42,.06); --shadow: 0 2px 14px rgba(15,23,42,.07); --radius: 14px; } html[data-theme="dark"] { --surface: #1e293b; --surface-2: #17222f; --surface-sunk: #0f172a; --ink: #e2e8f0; --ink-2: #94a3b8; --ink-3: #64748b; --line: #334155; --line-soft: #263449; --shadow-sm: 0 1px 3px rgba(0,0,0,.4); --shadow: 0 2px 14px rgba(0,0,0,.42); } .page-wrap { max-width: 1100px; margin: 0 auto; padding: 22px 16px 90px; } .page-wrap-wide { max-width: 1320px; } .page-head { display: flex; align-items: flex-start; gap: 12px; flex-wrap: wrap; margin-bottom: 18px; } .page-head h1 { font-size: 1.4rem; font-weight: 800; letter-spacing: -.4px; margin: 0; color: var(--ink); } .page-head .sub { font-size: .82rem; color: var(--ink-2); margin-top: 2px; } .page-head .spacer { flex: 1 1 auto; } .panel { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); overflow: hidden; } .panel + .panel { margin-top: 16px; } .panel-head { display: flex; align-items: center; gap: 10px; padding: 13px 16px; border-bottom: 1px solid var(--line-soft); } .panel-head h2, .panel-head h3 { font-size: .95rem; font-weight: 700; margin: 0; color: var(--ink); } .panel-head .spacer { flex: 1 1 auto; } .panel-body { padding: 16px; } .panel-body.tight { padding: 10px 16px; } .stat-grid { display: grid; gap: 10px; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); margin-bottom: 16px; } .stat { background: var(--surface); border: 1px solid var(--line); border-left: 3px solid var(--accent); border-radius: 12px; padding: 12px 14px; box-shadow: var(--shadow-sm); } .stat.pos { border-left-color: var(--pos); } .stat.neg { border-left-color: var(--neg); } .stat.warn { border-left-color: var(--warn); } .stat.mute { border-left-color: var(--ink-3); } .stat-label { font-size: .62rem; font-weight: 800; text-transform: uppercase; letter-spacing: .8px; color: var(--ink-3); display: flex; align-items: center; gap: 5px; } .stat-value { font-size: 1.15rem; font-weight: 800; color: var(--ink); line-height: 1.25; margin-top: 4px; word-break: break-word; } .stat-value.sm { font-size: .98rem; } .stat-sub { font-size: .7rem; color: var(--ink-3); margin-top: 2px; } .money.pos { color: var(--pos); } .money.neg { color: var(--neg); } .data-row { display: flex; align-items: center; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--line-soft); } .data-row:last-child { border-bottom: none; } .data-row:hover { background: var(--surface-2); } .data-row .grow { flex: 1 1 auto; min-width: 0; } .row-title { font-weight: 700; font-size: .9rem; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .row-meta { font-size: .74rem; color: var(--ink-2); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .row-amount { font-weight: 800; font-size: .92rem; white-space: nowrap; text-align: right; } .chip { display: inline-flex; align-items: center; gap: 4px; font-size: .68rem; font-weight: 700; padding: 3px 9px; border-radius: 20px; background: var(--surface-sunk); color: var(--ink-2); white-space: nowrap; } .chip.solid { color: #fff; } .chip i { font-size: .78rem; } .seg { display: inline-flex; background: var(--surface-sunk); border-radius: 10px; padding: 3px; gap: 2px; flex-wrap: wrap; } .seg button, .seg a { border: none; background: none; font-size: .78rem; font-weight: 600; color: var(--ink-2); padding: 5px 12px; border-radius: 8px; cursor: pointer; text-decoration: none; white-space: nowrap; } .seg button.on, .seg a.on { background: var(--surface); color: var(--accent); box-shadow: var(--shadow-sm); } .thumb { width: 56px; height: 44px; border-radius: 9px; object-fit: cover; background: var(--surface-sunk); flex-shrink: 0; } .thumb-lg { width: 100%; aspect-ratio: 4/3; border-radius: 12px; object-fit: cover; background: var(--surface-sunk); } .thumb-ph { display: flex; align-items: center; justify-content: center; color: var(--ink-3); font-size: 1.2rem; } .form-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); } .form-grid .span-2 { grid-column: span 2; } @media (max-width: 575.98px) { .form-grid .span-2 { grid-column: span 1; } } .field-label { font-size: .72rem; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; color: var(--ink-2); margin-bottom: 5px; display: block; } .field-help { font-size: .72rem; color: var(--ink-3); margin-top: 4px; } .field-error { font-size: .74rem; color: var(--neg); margin-top: 4px; font-weight: 600; } .fieldset-title { font-size: .74rem; font-weight: 800; text-transform: uppercase; letter-spacing: 1px; color: var(--ink-3); margin: 20px 0 12px; display: flex; align-items: center; gap: 8px; } .fieldset-title:first-child { margin-top: 0; } .fieldset-title::after { content: ""; flex: 1; height: 1px; background: var(--line); } .empty { text-align: center; padding: 42px 20px; color: var(--ink-3); } .empty i { font-size: 2.4rem; opacity: .5; display: block; margin-bottom: 10px; } .empty p { color: var(--ink-2); margin: 0 0 4px; font-size: .9rem; } .bar { height: 7px; border-radius: 6px; background: var(--surface-sunk); overflow: hidden; } .bar > span { display: block; height: 100%; border-radius: 6px; background: var(--accent); transition: width .35s; } .form-actions { position: sticky; bottom: 0; background: var(--surface); border-top: 1px solid var(--line); padding: 12px 16px; display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap; margin: 16px -16px -16px; z-index: 5; } html[data-theme="dark"] body { background: #0f172a; } html[data-theme="dark"] .table { --bs-table-color: var(--ink); --bs-table-bg: transparent; --bs-table-border-color: var(--line); } /* Organization switcher in the navbar */ .org-chip { display: flex; align-items: center; gap: 8px; background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.14); border-radius: 20px; padding: 4px 12px 4px 5px; color: rgba(255,255,255,.92) !important; font-size: .8rem; font-weight: 600; max-width: 215px; } .org-chip:hover { background: rgba(255,255,255,.16) !important; color: #fff !important; } .org-avatar { width: 26px; height: 26px; border-radius: 8px; flex-shrink: 0; background: linear-gradient(135deg, #0ea5e9, #7c3aed); color: #fff; font-size: .66rem; font-weight: 800; display: inline-flex; align-items: center; justify-content: center; } .org-chip .org-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .org-menu { min-width: 272px; } .org-menu .org-item { display: flex; align-items: center; gap: 10px; padding: 8px 14px; text-decoration: none; color: inherit; } .org-menu .org-item .nm { font-weight: 600; font-size: .85rem; } .org-menu .org-item .rl { font-size: .68rem; color: #94a3b8; } .org-menu form { margin: 0; } .org-menu button.org-item { width: 100%; border: none; background: none; text-align: left; } .org-menu button.org-item:hover { background: #f3f4f6; } html[data-theme="dark"] .org-menu button.org-item:hover { background: #263449; } .nav-section-label { font-size: .6rem; font-weight: 800; letter-spacing: 1.2px; text-transform: uppercase; color: rgba(255,255,255,.3); padding: 12px 16px 4px; } .mob-org-block { display: flex; align-items: center; gap: 10px; padding: 10px 16px; }
The complete toolkit for Nepal merchants — instant FonePay fee calculation, dynamic QR payments, finance tracking, and more.
Built for Nepal merchants, developers, and finance teams working with FonePay.
Instantly compute FonePay transaction fees, net receivable amounts, and total charges for any transaction value.
Generate real-time FonePay dynamic QR codes for amounts. WebSocket-powered instant payment confirmation.
Every signup and login is secured with a one-time password sent to your email — SHA-512 hashed, never plain text.
Record dues, cash payments, and payment history. Full finance dashboard with edit and delete controls.
Separate dashboards for Users and Admins. Admins manage all accounts and FonePay credentials centrally.
Install directly on your phone or desktop. Works fast, feels like a native app.
Get up and running in minutes — no technical setup required.
Sign up with your email and password. You'll receive a 6-digit OTP to verify your identity instantly.
Enter the one-time password sent to your email. Your account is activated only after verification.
Enter your merchant code, username, and secret key once. Your keys stay encrypted and private.
Use the fee calculator or generate a dynamic QR code for any amount — fast and accurate.
Everything you need to manage FonePay transactions — from instant fee calculation to real-time QR payments and full finance tracking.
Enter any transaction amount and instantly see the 2% FonePay merchant fee, net receivable, and total cost — no spreadsheet needed.
Try FreeGenerate a real-time FonePay Dynamic QR for any amount. Payment confirmation arrives in seconds — no manual checking required.
Start NowRecord dues, accept cash or FonePay QR payments, and track every payment with a complete history.
Get StartedClear answers about pricing, FonePay fees, and how Neuro Calculator works.