2025-08-29 02:47:12 +00:00

235 lines
7.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// import { Page, Card, Text } from "@shopify/polaris";
// export default function NotFound() {
// return (
// <Page>
// <Card>
// <Text variant="headingLg" as="h1">
// 404 - Page Not Found
// </Text>
// <Text as="p">
// The page you are looking for does not exist.
// </Text>
// </Card>
// </Page>
// );
// }
import {Page, Card, Text, Button, Box, BlockStack, InlineStack, Link} from "@shopify/polaris";
export default function NotFound() {
return (
<Page fullWidth>
{/* Animated gradient background */}
<div className="notfound-gradient">
<div className="gradient-overlay" />
<div className="gradient-blur" />
</div>
{/* Content layer */}
<Box minHeight="80vh" padding="400" position="relative" zIndex="1">
<Box
maxWidth="720px"
marginInline="auto"
paddingBlockStart="400"
paddingBlockEnd="600"
>
{/* Glassy card with subtle border glow */}
<div className="glass-wrap">
<Card>
<Box padding="600">
<BlockStack gap="400" align="center">
{/* Decorative SVG */}
<div className="hero-icon" aria-hidden="true">
<svg
width="140"
height="140"
viewBox="0 0 140 140"
role="img"
aria-label="Lost page"
>
<defs>
<linearGradient id="g1" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stopColor="rgba(99, 102, 241, 1)"/>
<stop offset="100%" stopColor="rgba(236, 72, 153, 1)"/>
</linearGradient>
</defs>
<circle cx="70" cy="70" r="64" fill="url(#g1)" opacity="0.15"/>
<g transform="translate(20,22)">
<text
x="50"
y="62"
textAnchor="middle"
fontSize="56"
fontWeight="700"
fill="url(#g1)"
className="shimmer"
>
404
</text>
<circle cx="94" cy="94" r="6" fill="url(#g1)" className="floaty"/>
<circle cx="16" cy="18" r="4" fill="url(#g1)" className="floaty delay"/>
</g>
</svg>
</div>
<Text as="h1" variant="heading2xl" alignment="center">
404 Page not found
</Text>
<Text as="p" variant="bodyLg" tone="subdued" alignment="center">
The page youre looking for doesnt exist or may have moved.
</Text>
{/* Actions */}
<InlineStack gap="300" align="center">
<Button
variant="primary"
url="/"
onClick={(e) => {
// keep SPA routers happy—adjust if you use react-router/next/navigation
}}
>
Go to dashboard
</Button>
<Button onClick={() => window.history.length > 1 ? window.history.back() : (window.location.href = "/")}>
Go back
</Button>
<Button variant="tertiary" onClick={() => window.location.reload()}>
Reload
</Button>
</InlineStack>
{/* Helpful links (optional) */}
<InlineStack gap="300" align="center">
<Text as="span" tone="subdued">
Or check{" "}
<Link url="/help" removeUnderline>Help Center</Link>{" "}
or{" "}
<Link url="/contact" removeUnderline>Contact support</Link>.
</Text>
</InlineStack>
</BlockStack>
</Box>
</Card>
</div>
</Box>
</Box>
{/* component-scoped styles */}
<style jsx>{`
.notfound-gradient {
position: fixed;
inset: 0;
overflow: hidden;
z-index: 0;
pointer-events: none;
}
.gradient-overlay {
position: absolute;
inset: -20%;
background: linear-gradient(120deg,
#6366f1 0%,
#8b5cf6 25%,
#ec4899 50%,
#f97316 75%,
#22d3ee 100%
);
animation: gradientShift 14s ease-in-out infinite alternate;
filter: saturate(1.1) contrast(1.05);
opacity: 0.25;
}
.gradient-blur {
position: absolute;
inset: 0;
backdrop-filter: blur(48px);
-webkit-backdrop-filter: blur(48px);
}
.glass-wrap {
position: relative;
border-radius: 16px;
overflow: hidden;
background: rgba(255, 255, 255, 0.65);
box-shadow:
0 10px 30px rgba(17, 24, 39, 0.12),
inset 0 0 0 1px rgba(99, 102, 241, 0.12);
}
.glass-wrap::before {
content: "";
position: absolute;
inset: -1px;
border-radius: 18px;
background: conic-gradient(
from 180deg at 50% 50%,
rgba(99,102,241,0.45),
rgba(236,72,153,0.45),
rgba(34,211,238,0.45),
rgba(99,102,241,0.45)
);
filter: blur(18px);
opacity: 0.35;
z-index: -1;
animation: rotateGlow 10s linear infinite;
}
.hero-icon {
transform: translateZ(0);
will-change: transform, opacity;
}
.floaty {
animation: float 6s ease-in-out infinite;
transform-origin: center;
}
.floaty.delay {
animation-delay: 1.5s;
}
.shimmer {
fill: url(#g1);
animation: shimmer 2.8s ease-in-out infinite;
}
/* Animations */
@keyframes gradientShift {
0% { transform: translate3d(-6%, -6%, 0) scale(1.05); }
100% { transform: translate3d(6%, 6%, 0) scale(1.05); }
}
@keyframes rotateGlow {
to { transform: rotate(360deg); }
}
@keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-6px); }
}
@keyframes shimmer {
0%, 100% { opacity: 0.85; }
50% { opacity: 1; }
}
/* Buttons: subtle interactive motion */
:global(button.Polaris-Button) {
transition: transform 160ms ease, box-shadow 160ms ease;
}
:global(button.Polaris-Button:hover) {
transform: translateY(-1px);
box-shadow: 0 6px 18px rgba(99, 102, 241, 0.15);
}
:global(button.Polaris-Button:active) {
transform: translateY(0);
box-shadow: 0 2px 8px rgba(99, 102, 241, 0.12);
}
/* Respect dark mode if your app toggles a dark surface */
@media (prefers-color-scheme: dark) {
.glass-wrap {
background: rgba(17, 24, 39, 0.6);
box-shadow:
0 10px 30px rgba(0, 0, 0, 0.35),
inset 0 0 0 1px rgba(148, 163, 184, 0.12);
}
}
`}</style>
</Page>
);
}