diff --git a/ui/src/routes/_layout/_page.tsx b/ui/src/routes/_layout/_page.tsx
index 35e5b21..eadba04 100644
--- a/ui/src/routes/_layout/_page.tsx
+++ b/ui/src/routes/_layout/_page.tsx
@@ -6,7 +6,7 @@ export const Route = createFileRoute("/_layout/_page")({
function PageLayout() {
return (
-
+
);
diff --git a/ui/src/routes/_layout/_page/builders.tsx b/ui/src/routes/_layout/_page/builders.tsx
new file mode 100644
index 0000000..8eb248e
--- /dev/null
+++ b/ui/src/routes/_layout/_page/builders.tsx
@@ -0,0 +1,293 @@
+/**
+ * Builders Page
+ * Displays NEAR Legion builders directory
+ */
+
+import { createFileRoute } from "@tanstack/react-router";
+import { useState } from "react";
+import { BuilderList, BuilderDetails, BuilderListItem, type Builder } from "@/components/builders";
+
+export const Route = createFileRoute("/_layout/_page/builders")({
+ component: BuildersPage,
+});
+
+// Mock data - replace with API call later
+const mockBuilders: Builder[] = [
+ {
+ id: "1",
+ accountId: "alice.near",
+ displayName: "Alice",
+ avatar: null,
+ role: "Core Developer",
+ tags: ["Smart Contracts", "Rust", "DeFi"],
+ description:
+ "Building decentralized finance primitives on NEAR. Focused on creating trustless lending protocols and automated market makers. Previously worked on Ethereum DeFi projects before joining the NEAR ecosystem.",
+ projects: [
+ {
+ name: "LendNEAR",
+ description: "Decentralized lending protocol with dynamic interest rates",
+ status: "Active",
+ },
+ {
+ name: "SwapLegion",
+ description: "AMM with concentrated liquidity for NEAR tokens",
+ status: "In Development",
+ },
+ ],
+ socials: {
+ github: "alice-near",
+ twitter: "alice_builds",
+ },
+ },
+ {
+ id: "2",
+ accountId: "bob.near",
+ displayName: "Bob",
+ avatar: null,
+ role: "Frontend Lead",
+ tags: ["React", "UI/UX", "TypeScript"],
+ description:
+ "Crafting beautiful user experiences for NEAR dApps. Specializing in React and design systems. Passionate about making Web3 accessible to everyone through intuitive interfaces.",
+ projects: [
+ {
+ name: "NEAR Kit",
+ description: "Component library for NEAR dApps",
+ status: "Active",
+ },
+ ],
+ socials: {
+ github: "bob-frontend",
+ },
+ },
+ {
+ id: "3",
+ accountId: "carol.near",
+ displayName: "Carol",
+ avatar: null,
+ role: "Protocol Engineer",
+ tags: ["Blockchain", "Security", "Auditing"],
+ description:
+ "Security researcher and protocol engineer. Conducting audits and building secure infrastructure for the NEAR ecosystem. Background in cryptography and formal verification.",
+ projects: [
+ {
+ name: "SafeGuard",
+ description: "Smart contract security scanning tool",
+ status: "Beta",
+ },
+ {
+ name: "AuditDAO",
+ description: "Decentralized security audit coordination",
+ status: "Planning",
+ },
+ ],
+ socials: {
+ github: "carol-sec",
+ twitter: "carol_audits",
+ },
+ },
+ {
+ id: "4",
+ accountId: "dave.near",
+ displayName: "Dave",
+ avatar: null,
+ role: "DevRel",
+ tags: ["Documentation", "Education", "Community"],
+ description:
+ "Developer relations and education. Creating tutorials, documentation, and educational content to onboard new developers to the NEAR ecosystem. Running workshops and hackathons.",
+ projects: [
+ {
+ name: "NEAR Academy",
+ description: "Interactive learning platform for NEAR development",
+ status: "Active",
+ },
+ ],
+ socials: {
+ twitter: "dave_teaches",
+ },
+ },
+ {
+ id: "5",
+ accountId: "eve.near",
+ displayName: "Eve",
+ avatar: null,
+ role: "Infrastructure",
+ tags: ["Indexers", "APIs", "DevOps"],
+ description:
+ "Building the backbone infrastructure for NEAR applications. Maintaining indexers, APIs, and developer tooling. Focused on reliability and scalability.",
+ projects: [
+ {
+ name: "NEAR Graph",
+ description: "High-performance indexer for NEAR blockchain data",
+ status: "Active",
+ },
+ {
+ name: "RPC Plus",
+ description: "Enhanced RPC endpoints with caching and analytics",
+ status: "Active",
+ },
+ ],
+ socials: {
+ github: "eve-infra",
+ },
+ },
+ {
+ id: "6",
+ accountId: "frank.near",
+ displayName: "Frank",
+ avatar: null,
+ role: "Smart Contract Dev",
+ tags: ["Rust", "WASM", "Testing"],
+ description: "Building secure and efficient smart contracts for the NEAR ecosystem.",
+ projects: [{ name: "ContractKit", description: "Smart contract templates", status: "Active" }],
+ socials: { github: "frank-contracts" },
+ },
+ {
+ id: "7",
+ accountId: "grace.near",
+ displayName: "Grace",
+ avatar: null,
+ role: "Product Designer",
+ tags: ["Figma", "UX Research", "Prototyping"],
+ description: "Designing intuitive Web3 experiences that bridge complexity with usability.",
+ projects: [{ name: "NEAR Design System", description: "Unified design language", status: "Active" }],
+ socials: { twitter: "grace_designs" },
+ },
+ {
+ id: "8",
+ accountId: "henry.near",
+ displayName: "Henry",
+ avatar: null,
+ role: "Data Engineer",
+ tags: ["Analytics", "Python", "SQL"],
+ description: "Building data pipelines and analytics tools for blockchain insights.",
+ projects: [{ name: "ChainMetrics", description: "On-chain analytics dashboard", status: "Beta" }],
+ socials: { github: "henry-data" },
+ },
+ {
+ id: "9",
+ accountId: "iris.near",
+ displayName: "Iris",
+ avatar: null,
+ role: "Community Lead",
+ tags: ["Growth", "Events", "Partnerships"],
+ description: "Growing the NEAR community through events, partnerships, and engagement.",
+ projects: [{ name: "NEAR Meetups", description: "Global community events", status: "Active" }],
+ socials: { twitter: "iris_community" },
+ },
+ {
+ id: "10",
+ accountId: "jack.near",
+ displayName: "Jack",
+ avatar: null,
+ role: "Mobile Developer",
+ tags: ["React Native", "iOS", "Android"],
+ description: "Building mobile-first experiences for NEAR dApps.",
+ projects: [{ name: "NEAR Wallet Mobile", description: "Mobile wallet app", status: "In Development" }],
+ socials: { github: "jack-mobile" },
+ },
+ {
+ id: "11",
+ accountId: "kate.near",
+ displayName: "Kate",
+ avatar: null,
+ role: "Technical Writer",
+ tags: ["Documentation", "Tutorials", "API Docs"],
+ description: "Making NEAR accessible through clear and comprehensive documentation.",
+ projects: [{ name: "NEAR Docs", description: "Official documentation", status: "Active" }],
+ socials: { github: "kate-docs" },
+ },
+ {
+ id: "12",
+ accountId: "leo.near",
+ displayName: "Leo",
+ avatar: null,
+ role: "Game Developer",
+ tags: ["Unity", "Gaming", "NFTs"],
+ description: "Creating blockchain-powered gaming experiences on NEAR.",
+ projects: [{ name: "NEAR Quest", description: "Play-to-earn RPG", status: "Beta" }],
+ socials: { twitter: "leo_games" },
+ },
+];
+
+function BuildersPage() {
+ const [selectedBuilder, setSelectedBuilder] = useState
(mockBuilders[0]);
+ const [showList, setShowList] = useState(true);
+
+ return (
+
+ {/* Header */}
+
+
+ NEAR Legion Builders
+
+
+ Discover the builders shaping the NEAR ecosystem
+
+
+
+ {/* Mobile: Tab switcher */}
+
+
+
+
+
+ {/* Mobile: Conditional panels - full height */}
+
+ {showList ? (
+
+
+ {mockBuilders.map((builder) => (
+
{
+ setSelectedBuilder(builder);
+ setShowList(false);
+ }}
+ >
+ {
+ setSelectedBuilder(builder);
+ setShowList(false);
+ }}
+ />
+
+ ))}
+
+
+ ) : (
+
+ )}
+
+
+ {/* Desktop: Side by side - full height */}
+
+
+
+
+
+ );
+}
diff --git a/ui/src/routes/_layout/login.tsx b/ui/src/routes/_layout/login.tsx
index 842d34b..7b7dcb2 100644
--- a/ui/src/routes/_layout/login.tsx
+++ b/ui/src/routes/_layout/login.tsx
@@ -150,14 +150,21 @@ function LoginPage() {
}
return (
-
-
+
+
+
+
Welcome
+
+ Connect your NEAR wallet to continue
+
+
+
{!accountId ? (
@@ -167,7 +174,7 @@ function LoginPage() {
type="button"
onClick={handleNearSignIn}
disabled={isLoading}
- className="w-full px-6 py-4 text-sm font-mono border border-border hover:border-primary/50 bg-muted/20 hover:bg-muted/40 transition-all rounded-lg disabled:opacity-50 disabled:cursor-not-allowed"
+ className="w-full px-4 py-3 text-sm font-mono border border-primary/40 bg-primary/10 hover:bg-primary/20 text-primary transition-all disabled:opacity-50 disabled:cursor-not-allowed"
>
{isSigningInWithNear
? "signing in..."
@@ -177,7 +184,7 @@ function LoginPage() {
type="button"
onClick={handleWalletDisconnect}
disabled={isLoading}
- className="w-full px-6 py-3 text-xs font-mono text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
+ className="w-full px-4 py-2 text-xs font-mono text-muted-foreground/60 hover:text-muted-foreground transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
>
{isDisconnectingWallet ? "disconnecting..." : "disconnect"}
diff --git a/ui/src/routes/test-colors.tsx b/ui/src/routes/test-colors.tsx
new file mode 100644
index 0000000..d9294a7
--- /dev/null
+++ b/ui/src/routes/test-colors.tsx
@@ -0,0 +1,195 @@
+import { createFileRoute } from '@tanstack/react-router';
+
+export const Route = createFileRoute('/test-colors')({
+ component: TestColors,
+});
+
+function ColorSwatch({
+ name,
+ bgClass,
+ fgClass,
+}: {
+ name: string;
+ bgClass: string;
+ fgClass: string;
+}) {
+ return (
+
+
{name}
+
+ bg: {bgClass}
+
+ text: {fgClass}
+
+
+ );
+}
+
+function TestColors() {
+ return (
+
+
+
+
+
+
+ Core Colors
+
+
+
+
+
+
+
+
+
+
+ Interactive Colors
+
+
+
+
+
+
+
+
+
+
+ Utility Colors
+
+
+
+
+
+
+
+
+
+ Form & Input Colors
+
+
+
+
Input Border
+
border: border-input
+
+
+
+
Ring (Focus)
+
ring: ring-ring
+
+
+
+
+
+
+
+ Usage Examples
+
+
+
+
Example Card Component
+
+ This card uses bg-card and text-card-foreground for the container, with
+ text-muted-foreground for secondary text.
+
+
+
+
+
+
+
+
+
+
Muted Section
+
+ Use bg-muted for subtle background sections. The text here uses
+ text-muted-foreground for a subdued appearance.
+
+
+
+
+
Accent Highlight
+
+ Use bg-accent for highlighted or hover states. Common for menu items,
+ list selections, etc.
+
+
+
+
+
+
+ Text Hierarchy
+
+
+
+ Primary text (text-foreground) - Use for headings and important content
+
+
+ Secondary text (text-muted-foreground) - Use for descriptions and less
+ important content
+
+
+ Link/accent text (text-primary) - Use for links and interactive elements
+
+
+ Error text (text-destructive) - Use for error messages and warnings
+
+
+
+
+
+
+
+ );
+}
diff --git a/ui/src/styles.css b/ui/src/styles.css
index a136513..e2f92b3 100644
--- a/ui/src/styles.css
+++ b/ui/src/styles.css
@@ -2,96 +2,154 @@
@import 'tw-animate-css';
-@import url('https://fonts.googleapis.com/css2?family=Red+Hat+Mono:wght@300;400;500;600;700&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Afacad:ital,wght@0,400;0,700;1,700&family=Inter:wght@400&family=Roboto+Mono:wght@400;500;700&display=swap');
@custom-variant dark (&:is(.dark *));
+/* ============================================
+ NEAR LEGION - Global Styles
+ ============================================ */
+
body {
@apply m-0;
- font-family: 'Red Hat Mono', monospace;
+ font-family: 'Roboto Mono', ui-monospace, monospace;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
- font-family:
- source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
+ font-family: 'Roboto Mono', source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
}
+/* ============================================
+ CSS Custom Properties - NEAR Legion Theme
+ ============================================ */
+
:root {
+ /* Core colors - Dark theme by default */
+ --background: oklch(0.07 0 0);
+ --foreground: oklch(1 0 0);
+
+ /* Card surfaces */
+ --card: oklch(0.12 0.005 260);
+ --card-foreground: oklch(1 0 0);
+
+ /* Popover/dropdown */
+ --popover: oklch(0.09 0 0);
+ --popover-foreground: oklch(1 0 0);
+
+ /* Primary - NEAR Legion Green */
+ --primary: oklch(0.85 0.25 145);
+ --primary-foreground: oklch(0.07 0 0);
+
+ /* Secondary */
+ --secondary: oklch(0.15 0 0);
+ --secondary-foreground: oklch(1 0 0);
+
+ /* Muted */
+ --muted: oklch(0.15 0 0);
+ --muted-foreground: oklch(0.7 0 0);
+
+ /* Accent - Orange */
+ --accent: oklch(0.75 0.18 50);
+ --accent-foreground: oklch(0.07 0 0);
+
+ /* Destructive */
+ --destructive: oklch(0.6 0.25 25);
+ --destructive-foreground: oklch(1 0 0);
+
+ /* Border & Input - using semi-transparent green */
+ --border: oklch(0.85 0.25 145 / 0.3);
+ --input: oklch(0.85 0.25 145 / 0.2);
+ --ring: oklch(0.85 0.25 145 / 0.5);
+
+ /* Chart colors */
+ --chart-1: oklch(0.85 0.25 145);
+ --chart-2: oklch(0.75 0.18 50);
+ --chart-3: oklch(0.6 0.2 250);
+ --chart-4: oklch(0.55 0.25 290);
+ --chart-5: oklch(0.7 0.2 145);
+
+ /* Radius - sharp edges for cyberpunk look */
+ --radius: 0rem;
+
+ /* NEAR brand colors */
+ --near-green: oklch(0.85 0.25 145);
+ --near-green-hover: oklch(0.9 0.28 145);
+ --near-green-light: oklch(0.85 0.25 145 / 0.15);
+ --near-orange: oklch(0.75 0.18 50);
+ --near-blue: oklch(0.6 0.2 250);
+ --near-purple: oklch(0.55 0.25 290);
+
+ /* Sidebar */
+ --sidebar: oklch(0.09 0 0);
+ --sidebar-foreground: oklch(1 0 0);
+ --sidebar-primary: oklch(0.85 0.25 145);
+ --sidebar-primary-foreground: oklch(0.07 0 0);
+ --sidebar-accent: oklch(0.15 0 0);
+ --sidebar-accent-foreground: oklch(1 0 0);
+ --sidebar-border: oklch(0.85 0.25 145 / 0.2);
+ --sidebar-ring: oklch(0.85 0.25 145 / 0.5);
+}
+
+/* Light mode overrides (if needed) */
+.light {
--background: oklch(1 0 0);
- --foreground: oklch(0.141 0.005 285.823);
- --card: oklch(1 0 0);
- --card-foreground: oklch(0.141 0.005 285.823);
+ --foreground: oklch(0.07 0 0);
+ --card: oklch(0.97 0 0);
+ --card-foreground: oklch(0.07 0 0);
--popover: oklch(1 0 0);
- --popover-foreground: oklch(0.141 0.005 285.823);
- --primary: oklch(0.21 0.006 285.885);
- --primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.967 0.001 286.375);
- --secondary-foreground: oklch(0.21 0.006 285.885);
- --muted: oklch(0.967 0.001 286.375);
- --muted-foreground: oklch(0.552 0.016 285.938);
- --accent: oklch(0.967 0.001 286.375);
- --accent-foreground: oklch(0.21 0.006 285.885);
- --destructive: oklch(0.577 0.245 27.325);
- --destructive-foreground: oklch(0.577 0.245 27.325);
- --border: oklch(0.92 0.004 286.32);
- --input: oklch(0.92 0.004 286.32);
- --ring: oklch(0.871 0.006 286.286);
- --chart-1: oklch(0.646 0.222 41.116);
- --chart-2: oklch(0.6 0.118 184.704);
- --chart-3: oklch(0.398 0.07 227.392);
- --chart-4: oklch(0.828 0.189 84.429);
- --chart-5: oklch(0.769 0.188 70.08);
- --radius: 0.625rem;
- --near-green: #00ec97;
- --near-green-hover: #00d66f;
- --near-green-light: #d4fced;
- --near-blue: #3d7fff;
- --near-purple: #635bff;
- --sidebar: oklch(0.985 0 0);
- --sidebar-foreground: oklch(0.141 0.005 285.823);
- --sidebar-primary: oklch(0.21 0.006 285.885);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.967 0.001 286.375);
- --sidebar-accent-foreground: oklch(0.21 0.006 285.885);
- --sidebar-border: oklch(0.92 0.004 286.32);
- --sidebar-ring: oklch(0.871 0.006 286.286);
+ --popover-foreground: oklch(0.07 0 0);
+ --primary: oklch(0.6 0.2 155);
+ --primary-foreground: oklch(1 0 0);
+ --secondary: oklch(0.95 0 0);
+ --secondary-foreground: oklch(0.07 0 0);
+ --muted: oklch(0.95 0 0);
+ --muted-foreground: oklch(0.4 0 0);
+ --accent: oklch(0.75 0.18 50);
+ --accent-foreground: oklch(1 0 0);
+ --border: oklch(0.6 0.2 155 / 0.3);
+ --input: oklch(0.6 0.2 155 / 0.2);
+ --ring: oklch(0.6 0.2 155 / 0.5);
+ --sidebar: oklch(0.97 0 0);
+ --sidebar-foreground: oklch(0.07 0 0);
+ --sidebar-primary: oklch(0.6 0.2 155);
+ --sidebar-primary-foreground: oklch(1 0 0);
+ --sidebar-accent: oklch(0.92 0 0);
+ --sidebar-accent-foreground: oklch(0.07 0 0);
+ --sidebar-border: oklch(0.6 0.2 155 / 0.2);
+ --sidebar-ring: oklch(0.6 0.2 155 / 0.5);
}
+/* Dark mode (default for NEAR Legion) */
.dark {
- --background: oklch(0.141 0.005 285.823);
- --foreground: oklch(0.985 0 0);
- --card: oklch(0.141 0.005 285.823);
- --card-foreground: oklch(0.985 0 0);
- --popover: oklch(0.141 0.005 285.823);
- --popover-foreground: oklch(0.985 0 0);
- --primary: oklch(0.985 0 0);
- --primary-foreground: oklch(0.21 0.006 285.885);
- --secondary: oklch(0.274 0.006 286.033);
- --secondary-foreground: oklch(0.985 0 0);
- --muted: oklch(0.274 0.006 286.033);
- --muted-foreground: oklch(0.705 0.015 286.067);
- --accent: oklch(0.274 0.006 286.033);
- --accent-foreground: oklch(0.985 0 0);
- --destructive: oklch(0.396 0.141 25.723);
- --destructive-foreground: oklch(0.637 0.237 25.331);
- --border: oklch(0.274 0.006 286.033);
- --input: oklch(0.274 0.006 286.033);
- --ring: oklch(0.442 0.017 285.786);
- --chart-1: oklch(0.488 0.243 264.376);
- --chart-2: oklch(0.696 0.17 162.48);
- --chart-3: oklch(0.769 0.188 70.08);
- --chart-4: oklch(0.627 0.265 303.9);
- --chart-5: oklch(0.645 0.246 16.439);
- --sidebar: oklch(0.21 0.006 285.885);
- --sidebar-foreground: oklch(0.985 0 0);
- --sidebar-primary: oklch(0.488 0.243 264.376);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.274 0.006 286.033);
- --sidebar-accent-foreground: oklch(0.985 0 0);
- --sidebar-border: oklch(0.274 0.006 286.033);
- --sidebar-ring: oklch(0.442 0.017 285.786);
+ --background: oklch(0.07 0 0);
+ --foreground: oklch(1 0 0);
+ --card: oklch(0.12 0.005 260);
+ --card-foreground: oklch(1 0 0);
+ --popover: oklch(0.09 0 0);
+ --popover-foreground: oklch(1 0 0);
+ --primary: oklch(0.85 0.25 145);
+ --primary-foreground: oklch(0.07 0 0);
+ --secondary: oklch(0.15 0 0);
+ --secondary-foreground: oklch(1 0 0);
+ --muted: oklch(0.15 0 0);
+ --muted-foreground: oklch(0.7 0 0);
+ --accent: oklch(0.75 0.18 50);
+ --accent-foreground: oklch(0.07 0 0);
+ --destructive: oklch(0.6 0.25 25);
+ --destructive-foreground: oklch(1 0 0);
+ --border: oklch(0.85 0.25 145 / 0.3);
+ --input: oklch(0.85 0.25 145 / 0.2);
+ --ring: oklch(0.85 0.25 145 / 0.5);
+ --sidebar: oklch(0.09 0 0);
+ --sidebar-foreground: oklch(1 0 0);
+ --sidebar-primary: oklch(0.85 0.25 145);
+ --sidebar-primary-foreground: oklch(0.07 0 0);
+ --sidebar-accent: oklch(0.15 0 0);
+ --sidebar-accent-foreground: oklch(1 0 0);
+ --sidebar-border: oklch(0.85 0.25 145 / 0.2);
+ --sidebar-ring: oklch(0.85 0.25 145 / 0.5);
}
@theme inline {
@@ -131,6 +189,12 @@ code {
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
+
+ /* NEAR Legion custom colors */
+ --color-near-green: var(--near-green);
+ --color-near-orange: var(--near-orange);
+ --color-near-blue: var(--near-blue);
+ --color-near-purple: var(--near-purple);
}
@layer base {
@@ -141,11 +205,249 @@ code {
html {
height: 100%;
height: 100dvh;
+ /* Better base font size for readability */
+ font-size: 16px;
}
body {
@apply bg-background text-foreground;
min-height: 100%;
min-height: 100dvh;
+ line-height: 1.5;
+ -webkit-tap-highlight-color: transparent;
+ touch-action: manipulation;
+ }
+
+ #app {
+ min-height: 100vh;
+ min-height: 100dvh;
+ }
+
+ /* Compact typography */
+ h1 {
+ @apply text-xl sm:text-2xl font-bold tracking-tight;
+ }
+
+ h2 {
+ @apply text-lg sm:text-xl font-bold tracking-tight;
+ }
+
+ h3 {
+ @apply text-base sm:text-lg font-semibold;
+ }
+
+ h4 {
+ @apply text-sm sm:text-base font-semibold;
+ }
+
+ p {
+ @apply text-sm leading-relaxed;
+ }
+
+ /* Selection styling */
+ ::selection {
+ background: var(--border);
+ color: var(--foreground);
+ }
+
+ /* Minimal scrollbar styling */
+ ::-webkit-scrollbar {
+ width: 4px;
+ height: 4px;
+ }
+
+ ::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background: oklch(0.85 0.25 145 / 0.2);
+ border-radius: 0;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background: oklch(0.85 0.25 145 / 0.4);
+ }
+
+ /* Firefox scrollbar */
+ * {
+ scrollbar-width: thin;
+ scrollbar-color: oklch(0.85 0.25 145 / 0.2) transparent;
+ }
+
+}
+
+/* ============================================
+ NEAR Legion - Utility Classes
+ ============================================ */
+
+@layer utilities {
+ /* Glow effects */
+ .glow-primary {
+ box-shadow: 0 0 20px oklch(0.85 0.25 145 / 0.5);
}
+
+ .glow-accent {
+ box-shadow: 0 0 20px oklch(0.75 0.18 50 / 0.5);
+ }
+
+ .text-glow-primary {
+ text-shadow: 0 0 8px oklch(0.85 0.25 145 / 0.7);
+ }
+
+ .text-glow-accent {
+ text-shadow: 0 0 8px oklch(0.75 0.18 50 / 0.7);
+ }
+
+ /* Cyberpunk border effect */
+ .border-cyber {
+ position: relative;
+ }
+
+ .border-cyber::after {
+ content: '';
+ position: absolute;
+ inset: 0;
+ border: 2px solid var(--ring);
+ transform: translate(4px, 4px);
+ pointer-events: none;
+ transition: transform 0.3s ease;
+ }
+
+ .border-cyber:hover::after {
+ transform: translate(0, 0);
+ }
+
+ /* Grid pattern background */
+ .bg-grid {
+ background-image:
+ linear-gradient(oklch(0.85 0.25 145 / 0.03) 1px, transparent 1px),
+ linear-gradient(90deg, oklch(0.85 0.25 145 / 0.03) 1px, transparent 1px);
+ background-size: 50px 50px;
+ }
+
+ /* Scanline effect */
+ .scanlines::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: repeating-linear-gradient(
+ 0deg,
+ transparent,
+ transparent 2px,
+ oklch(0 0 0 / 0.1) 2px,
+ oklch(0 0 0 / 0.1) 4px
+ );
+ pointer-events: none;
+ }
+}
+
+/* ============================================
+ Animations
+ ============================================ */
+
+@keyframes pulse-glow {
+ 0%, 100% {
+ box-shadow: 0 0 5px oklch(0.85 0.25 145 / 0.5);
+ }
+ 50% {
+ box-shadow: 0 0 20px oklch(0.85 0.25 145 / 0.8);
+ }
+}
+
+@keyframes flicker {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.8; }
+}
+
+@keyframes typing {
+ from { width: 0; }
+ to { width: 100%; }
+}
+
+@keyframes blink-caret {
+ from, to { border-color: transparent; }
+ 50% { border-color: var(--primary); }
+}
+
+.animate-pulse-glow {
+ animation: pulse-glow 2s ease-in-out infinite;
+}
+
+.animate-flicker {
+ animation: flicker 0.15s ease-in-out infinite;
+}
+
+/* ============================================
+ Wallet Connector Popup Styles
+ ============================================ */
+
+.hot-connector-popup * {
+ box-sizing: border-box;
+ font-family: 'Roboto Mono', ui-monospace, monospace;
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+ color: #fff;
+}
+
+.hot-connector-popup *::-webkit-scrollbar {
+ display: none;
+}
+
+.hot-connector-popup .modal-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 100000000;
+ background-color: oklch(0 0 0 / 0.7);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ backdrop-filter: blur(4px);
+}
+
+.hot-connector-popup .modal-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ max-width: 420px;
+ width: 100%;
+ border: 2px solid var(--border);
+ background: var(--popover);
+}
+
+.hot-connector-popup .modal-header {
+ display: flex;
+ padding: 16px;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+ border-bottom: 1px solid var(--sidebar-border);
+ width: 100%;
+}
+
+.hot-connector-popup .modal-header p {
+ color: var(--primary);
+ font-size: 18px;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+}
+
+.hot-connector-popup .connect-item {
+ display: flex;
+ padding: 12px;
+ align-items: center;
+ gap: 12px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ border: 1px solid transparent;
+}
+
+.hot-connector-popup .connect-item:hover {
+ background: var(--near-green-light);
+ border-color: var(--border);
}