diff --git a/app/global.css b/app/global.css
index 3b7f8b4..38f9f54 100644
--- a/app/global.css
+++ b/app/global.css
@@ -1,26 +1,5 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
@import 'nextra-theme-docs/dist/style.css' layer(nextra);
-/* Reset: remove custom callout/code overrides to use Nextra defaults */
-
/**
* Custom styles
*
@@ -31,7 +10,9 @@
*/
@layer overwrite {
:root {
- --x-color-nextra-bg: var(--mantine-color-body);
+ /* Force Nextra base background to pure black to match landing */
+ --x-color-nextra-bg: #000;
+ --font-sans: Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
}
:where(.dark) {
@@ -42,416 +23,199 @@
font-size: var(--x-text-sm) !important;
line-height: var(--tw-leading, var(--x-text-sm--line-height)) !important;
}
+}
- /* Navbar and Footer Theme Alignment - More Specific */
- nav.nextra-nav-container,
- .nextra-nav-container,
- div[class*="nextra-nav-container"] {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
- border-bottom: 1px solid rgba(255, 255, 255, 0.1) !important;
- }
+@layer components, mantine, nextra, overwrite;
- .nextra-nav-container-blur,
- div[class*="nextra-nav-container-blur"] {
- background: linear-gradient(135deg, rgba(26, 27, 35, 0.95) 0%, rgba(37, 38, 43, 0.95) 50%, rgba(26, 27, 35, 0.95) 100%) !important;
- backdrop-filter: blur(10px) !important;
+/* Global sleek styles */
+@layer overwrite {
+ html {
+ scroll-behavior: smooth;
}
- .nextra-sidebar-container,
- aside[class*="nextra-sidebar"] {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
- border-right: 1px solid rgba(255, 255, 255, 0.1) !important;
+ body {
+ color: var(--mantine-color-text);
+ font-family: var(--font-sans);
+ background:
+ radial-gradient(1200px 600px at 80% -10%, rgba(0, 102, 255, 0.12), transparent 100%),
+ radial-gradient(1000px 500px at -10% 10%, rgba(255, 0, 128, 0.09), transparent 100%),
+ linear-gradient(180deg, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.0)) !important;
+ /* background: #000000; */
}
- footer.nextra-footer,
- .nextra-footer,
- div[class*="nextra-footer"] {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
- border-top: 1px solid rgba(255, 255, 255, 0.1) !important;
- color: rgba(255, 255, 255, 0.8) !important;
+ :where(.dark) body {
+ color: rgba(255, 255, 255, 0.92);
}
-
-
- /* Force override all Nextra backgrounds */
-[class*="nextra"] {
- background-color: transparent !important;
-}
-
-/* Additional aggressive overrides for docs pages */
-html body [class*="nextra"] {
- background-color: transparent !important;
-}
-
-html body [class*="nextra"] * {
- background-color: transparent !important;
-}
-
-/* Specific overrides for common Nextra classes - Light mode only */
-:global([data-mantine-color-scheme="light"]) html body .nextra-sidebar,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-sidebar"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-menu,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-menu"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-page-container,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-page-container"] {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #e2e8f0 75%, #f8fafc 100%) !important;
-}
-
- /* Specific navbar overrides */
- .nextra-nav-container *,
- nav[class*="nextra"] * {
- color: white !important;
+ h1, h2, h3, h4, h5, h6 {
+ color: inherit;
+ font-family: var(--font-sans);
}
-}
-
-@layer components, mantine, nextra, overwrite;
-
-.bg-grid-white\/\[0\.02\] {
- background-image: radial-gradient(circle, rgba(255, 255, 255, 0.02) 1px, transparent 1px);
-}
-
-/* Force override Nextra theme colors - Dark mode (default) */
-html body nav.nextra-nav-container,
-html body .nextra-nav-container,
-html body div[class*="nextra-nav-container"] {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
- border-bottom: 1px solid rgba(255, 255, 255, 0.1) !important;
-}
-
-html body footer.nextra-footer,
-html body .nextra-footer,
-html body div[class*="nextra-footer"] {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
- border-top: 1px solid rgba(255, 255, 255, 0.1) !important;
- color: rgba(255, 255, 255, 0.8) !important;
-}
-
-html body aside.nextra-sidebar-container,
-html body .nextra-sidebar-container {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
- border-right: 1px solid rgba(255, 255, 255, 0.1) !important;
-}
-
-/* Light mode overrides */
-:global([data-mantine-color-scheme="light"]) html body nav.nextra-nav-container,
-:global([data-mantine-color-scheme="light"]) html body .nextra-nav-container,
-:global([data-mantine-color-scheme="light"]) html body div[class*="nextra-nav-container"] {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #e2e8f0 75%, #f8fafc 100%) !important;
- border-bottom: 1px solid rgba(0, 0, 0, 0.08) !important;
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05) !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body footer.nextra-footer,
-:global([data-mantine-color-scheme="light"]) html body .nextra-footer,
-:global([data-mantine-color-scheme="light"]) html body div[class*="nextra-footer"] {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #e2e8f0 75%, #f8fafc 100%) !important;
- border-top: 1px solid rgba(0, 0, 0, 0.08) !important;
- color: rgba(0, 0, 0, 0.7) !important;
- box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.05) !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body aside.nextra-sidebar-container,
-:global([data-mantine-color-scheme="light"]) html body .nextra-sidebar-container {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #e2e8f0 75%, #f8fafc 100%) !important;
- border-right: 1px solid rgba(0, 0, 0, 0.08) !important;
- box-shadow: 1px 0 3px rgba(0, 0, 0, 0.05) !important;
-}
-
-/* Sidebar navigation elements - Dark mode */
-html body .nextra-sidebar-container a,
-html body aside[class*="nextra"] a {
- color: rgba(255, 255, 255, 0.8) !important;
- transition: all 0.2s ease !important;
-}
-
-html body .nextra-sidebar-container a:hover,
-html body aside[class*="nextra"] a:hover {
- color: white !important;
- background: rgba(255, 255, 255, 0.1) !important;
-}
-
-html body .nextra-sidebar-container a[aria-current="page"],
-html body aside[class*="nextra"] a[aria-current="page"] {
- color: #f783ac !important;
- background: rgba(247, 131, 172, 0.1) !important;
-}
-
-/* Sidebar navigation elements - Light mode */
-:global([data-mantine-color-scheme="light"]) html body .nextra-sidebar-container a,
-:global([data-mantine-color-scheme="light"]) html body aside[class*="nextra"] a {
- color: #475057 !important;
- transition: all 0.2s ease !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body .nextra-sidebar-container a:hover,
-:global([data-mantine-color-scheme="light"]) html body aside[class*="nextra"] a:hover {
- color: #0f172a !important;
- background: rgba(0, 0, 0, 0.05) !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body .nextra-sidebar-container a[aria-current="page"],
-:global([data-mantine-color-scheme="light"]) html body aside[class*="nextra"] a[aria-current="page"] {
- color: #7c3aed !important;
- background: rgba(124, 58, 237, 0.1) !important;
-}
-
-/* Override Nextra main content area - Dark mode */
-html body .nextra-container,
-html body main[class*="nextra"],
-html body div[class*="nextra-container"],
-html body .nextra-main,
-html body [class*="nextra-container"],
-html body [class*="nextra-main"],
-html body .nextra-layout,
-html body [class*="nextra-layout"] {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
-}
-
-/* Override Nextra page content - Dark mode */
-html body .nextra-content,
-html body div[class*="nextra-content"],
-html body article[class*="nextra"],
-html body [class*="nextra-content"],
-html body .nextra-page,
-html body [class*="nextra-page"],
-html body .nextra-body,
-html body [class*="nextra-body"] {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
- color: white !important;
-}
-
-/* Override Nextra body and html - Dark mode */
-html body {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
-}
-
-html {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
-}
-
-/* Light mode content overrides */
-:global([data-mantine-color-scheme="light"]) html body .nextra-container,
-:global([data-mantine-color-scheme="light"]) html body main[class*="nextra"],
-:global([data-mantine-color-scheme="light"]) html body div[class*="nextra-container"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-main,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-container"],
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-main"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-layout,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-layout"] {
- background: linear-gradient(135deg, #ffffff 0%, #f8fafc 25%, #f1f5f9 50%, #f8fafc 75%, #ffffff 100%) !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body .nextra-content,
-:global([data-mantine-color-scheme="light"]) html body div[class*="nextra-content"],
-:global([data-mantine-color-scheme="light"]) html body article[class*="nextra"],
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-content"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-page,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-page"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-body,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-body"] {
- background: linear-gradient(135deg, #ffffff 0%, #f8fafc 25%, #f1f5f9 50%, #f8fafc 75%, #ffffff 100%) !important;
- color: #1e293b !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #e2e8f0 75%, #f8fafc 100%) !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #e2e8f0 75%, #f8fafc 100%) !important;
-}
-
-/* Light mode specific overrides - only apply when light mode is active */
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra"] {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #e2e8f0 75%, #f8fafc 100%) !important;
-}
-
-/* Fix specific elements that show light backgrounds in dark mode */
-html body .nextra-toc,
-html body [class*="nextra-toc"],
-html body .nextra-toc-content,
-html body [class*="nextra-toc-content"],
-html body .nextra-toc-container,
-html body [class*="nextra-toc-container"] {
- background: linear-gradient(135deg, #1a1b23 0%, #25262b 50%, #1a1b23 100%) !important;
- color: rgba(255, 255, 255, 0.8) !important;
-}
-
-html body .nextra-toc a,
-html body [class*="nextra-toc"] a {
- color: rgba(255, 255, 255, 0.8) !important;
-}
-
-html body .nextra-toc a:hover,
-html body [class*="nextra-toc"] a:hover {
- color: white !important;
- background: rgba(255, 255, 255, 0.1) !important;
-}
-
-/* Fix GitHub stats box and other info boxes in dark mode */
-html body .nextra-content [class*="github"],
-html body .nextra-content [class*="stats"],
-html body .nextra-content [class*="info"] {
- background: rgba(0, 0, 0, 0.3) !important;
- color: rgba(255, 255, 255, 0.9) !important;
- border: 1px solid rgba(255, 255, 255, 0.1) !important;
-}
-
-/* Light mode versions of the above */
-:global([data-mantine-color-scheme="light"]) html body .nextra-toc,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-toc"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-toc-content,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-toc-content"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-toc-container,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-toc-container"] {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #e2e8f0 75%, #f8fafc 100%) !important;
- color: #334155 !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body .nextra-toc a,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-toc"] a {
- color: #475057 !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body .nextra-toc a:hover,
-:global([data-mantine-color-scheme="light"]) html body [class*="nextra-toc"] a:hover {
- color: #0f172a !important;
- background: rgba(0, 0, 0, 0.05) !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body .nextra-content [class*="github"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-content [class*="stats"],
-:global([data-mantine-color-scheme="light"]) html body .nextra-content [class*="info"] {
- background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 50%, #f8fafc 100%) !important;
- color: #334155 !important;
- border: 1px solid rgba(0, 0, 0, 0.08) !important;
-}
-
-/* Override Nextra text colors - Dark mode */
-html body .nextra-content h1,
-html body .nextra-content h2,
-html body .nextra-content h3,
-html body .nextra-content h4,
-html body .nextra-content h5,
-html body .nextra-content h6 {
- color: white !important;
-}
-
-html body .nextra-content p,
-html body .nextra-content li,
-html body .nextra-content div {
- color: rgba(255, 255, 255, 0.9) !important;
-}
-/* Code block overrides removed to use Nextra defaults */
-
-/* Override Nextra links - Dark mode */
-html body .nextra-content a {
- color: #f783ac !important;
- transition: color 0.2s ease !important;
-}
-
-html body .nextra-content a:hover {
- color: #f56565 !important;
-}
-
-/* Light mode text colors */
-:global([data-mantine-color-scheme="light"]) html body .nextra-content h1,
-:global([data-mantine-color-scheme="light"]) html body .nextra-content h2,
-:global([data-mantine-color-scheme="light"]) html body .nextra-content h3,
-:global([data-mantine-color-scheme="light"]) html body .nextra-content h4,
-:global([data-mantine-color-scheme="light"]) html body .nextra-content h5,
-:global([data-mantine-color-scheme="light"]) html body .nextra-content h6 {
- color: #0f172a !important;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05) !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body .nextra-content p,
-:global([data-mantine-color-scheme="light"]) html body .nextra-content li,
-:global([data-mantine-color-scheme="light"]) html body .nextra-content div {
- color: #334155 !important;
-}
-
-/* Removed aggressive code block overrides: fall back to Nextra defaults */
-
-/* Removed light mode aggressive code block overrides */
-
-/* Light mode links */
-:global([data-mantine-color-scheme="light"]) html body .nextra-content a {
- color: #7c3aed !important;
- transition: all 0.2s ease !important;
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05) !important;
-}
-
-:global([data-mantine-color-scheme="light"]) html body .nextra-content a:hover {
- color: #6d28d9 !important;
- text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important;
-}
+ a {
+ color: #1f2937;
+ }
+ :where(.dark) a {
+ color: rgba(255, 255, 255, 0.92) !important;
+ }
-/* Light mode carousel text colors */
-:global([data-mantine-color-scheme="light"]) .projectCard h3,
-:global([data-mantine-color-scheme="light"]) .projectCard h4,
-:global([data-mantine-color-scheme="light"]) .projectCard .mantine-Title-root {
- color: #0f172a !important;
-}
+ /* Stronger override for Nextra link styling in docs */
+ :where(.dark) .nextra-content a,
+ :where(.dark) .nextra-content a:visited {
+ color: rgba(255, 255, 255, 0.92) !important;
+ }
+ .nextra-content a,
+ .nextra-content a:visited {
+ color: #1f2937 !important;
+ }
-:global([data-mantine-color-scheme="light"]) .projectCard p,
-:global([data-mantine-color-scheme="light"]) .projectCard .mantine-Text-root {
- color: #334155 !important;
-}
+ /* Ensure Nextra containers donβt paint a gray background */
+ :where(.nextra-container,
+ .nextra-content,
+ .nextra-sidebar-container,
+ .nx-bg-neutral-900,
+ .nx-bg-gray-900,
+ .nx-bg-black,
+ .nx-bg-dark,
+ .nx-bg-zinc-900,
+ .nx-bg-slate-900) {
+ background-color: transparent !important;
+ }
-/* Removed callout overrides to use Nextra defaults */
+ /* Make sticky headers/footers transparent and remove borders/shadows */
+ :where(.nx-sticky) {
+ background: transparent !important;
+ box-shadow: none !important;
+ border: none !important;
+ }
+ :where(.nextra-sidebar) header,
+ :where(.nextra-sidebar) footer,
+ :where(.nextra-container > header) {
+ background: transparent !important;
+ border: none !important;
+ box-shadow: none !important;
+ }
-/* Specific styling for different types of callouts */
-html body .nextra-content [class*="info"] {
- border-left-color: #3b82f6 !important;
-}
+ /* Glassmorphism utility */
+ .glass {
+ background: rgba(255, 255, 255, 0.06);
+ -webkit-backdrop-filter: saturate(120%) blur(10px);
+ backdrop-filter: saturate(120%) blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ }
-html body .nextra-content [class*="warning"] {
- border-left-color: #f59e0b !important;
-}
+ code, pre {
+ border-radius: 10px;
+ }
-html body .nextra-content [class*="error"] {
- border-left-color: #ef4444 !important;
-}
+ /* Target article tag for markdown content font styling */
+ article {
+ font-family: 'Inter', system-ui, -apple-system, sans-serif !important;
+ font-weight: 400;
+ line-height: 1.6;
+ }
-html body .nextra-content [class*="tip"] {
- border-left-color: #10b981 !important;
-}
+ /* Specific styling for the main content article */
+ article[data-pagefind-body="true"] {
+ font-family: 'Inter', system-ui, -apple-system, sans-serif !important;
+ font-size: 16px;
+ line-height: 1.7;
+ color: rgba(255, 255, 255, 0.9);
+ }
-/* Removed table overrides */
+ /* Override Nextra's default article styling */
+ article.x\:w-full {
+ font-family: 'Inter', system-ui, -apple-system, sans-serif !important;
+ }
-/* Removed table cell overrides */
+ /* Sidebar footer background override */
+ :where(.nextra-sidebar-footer) {
+ background: transparent !important;
+ border-top: none !important;
+ box-shadow: none !important;
+ }
-/* Removed table header overrides */
+ /* Lightweight parallax blob for landing */
+ .parallax-blob {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 55vmax;
+ height: 55vmax;
+ transform: translate(-50%, -50%) scale(0.9);
+ background: radial-gradient(closest-side, rgba(0, 102, 255, 0.18), transparent 72%);
+ pointer-events: none;
+ transition: transform 0.18s ease-out, opacity 300ms ease-out;
+ will-change: transform;
+ filter: blur(12px);
+ opacity: 0;
+ }
-html body .nextra-content ul,
-html body .nextra-content ol {
- color: rgba(255, 255, 255, 0.9) !important;
-}
+ /* Beacon of light effect */
+ @keyframes beamPulse {
+ 0%, 100% { opacity: 0.45; transform: translateX(-50%) scaleX(1); }
+ 50% { opacity: 0.7; transform: translateX(-50%) scaleX(1.08); }
+ }
+ .beacon-beam {
+ position: absolute;
+ left: 50%;
+ top: -10vh;
+ height: 120vh;
+ width: 2px;
+ transform: translateX(-50%);
+ background: linear-gradient(180deg,
+ rgba(255,255,255,0) 0%,
+ rgba(0, 146, 255, 0.4) 40%,
+ rgba(0, 146, 255, 0.35) 60%,
+ rgba(255,255,255,0) 100%);
+ filter: blur(8px);
+ opacity: 0.55;
+ pointer-events: none;
+ animation: beamPulse 4s ease-in-out infinite;
+ }
+ .beacon-source {
+ position: absolute;
+ left: 50%;
+ bottom: 10vh;
+ width: 36vmin;
+ height: 12vmin;
+ transform: translateX(-50%);
+ background: radial-gradient(closest-side, rgba(0,146,255,0.28), rgba(0,146,255,0.08) 60%, transparent 70%);
+ filter: blur(14px);
+ opacity: 0.6;
+ pointer-events: none;
+ }
-html body .nextra-content strong,
-html body .nextra-content b {
- color: white !important;
-}
+ /* Distant beacon cone (perspective beam) */
+ .beacon-cone {
+ position: absolute;
+ left: 50%;
+ bottom: -10vh;
+ transform: translateX(-50%) perspective(800px) rotateX(60deg);
+ width: 4px;
+ height: 130vh;
+ background: linear-gradient(
+ 180deg,
+ rgba(0, 146, 255, 0.0) 0%,
+ rgba(0, 146, 255, 0.28) 30%,
+ rgba(0, 146, 255, 0.18) 70%,
+ rgba(0, 146, 255, 0.0) 100%
+ );
+ box-shadow: 0 0 40px 6px rgba(0,146,255,0.18), 0 0 120px 24px rgba(0,146,255,0.10);
+ filter: blur(2px);
+ pointer-events: none;
+ opacity: 0.55;
+ }
-html body .nextra-content em,
-html body .nextra-content i {
- color: rgba(255, 255, 255, 0.8) !important;
+ /* Beacon outline (SVG stroke glow) */
+ .beacon-outline {
+ position: absolute;
+ left: 50%;
+ bottom: 6vh;
+ transform: translateX(-50%);
+ width: clamp(120px, 22vmin, 220px);
+ height: auto;
+ opacity: 0.8;
+ pointer-events: none;
+ }
}
-
-/* Removed light mode callout overrides */
-
-/* Removed light mode callout accent overrides */
-
-/* Removed light mode table overrides */
-
-/* Removed light mode table cells overrides */
-
-/* Removed light mode table header overrides */
-
-/* Removed light mode list overrides */
-
-/* Removed light mode strong/b overrides */
-
-/* Removed light mode em/i overrides */
diff --git a/app/layout.tsx b/app/layout.tsx
index cb30bc4..a7a6311 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -24,18 +24,20 @@ import '@gfazioli/mantine-text-animate/styles.layer.css';
import { ColorSchemeScript, mantineHtmlProps, MantineProvider } from '@mantine/core';
-import '@mantine/core/styles.layer.css';
-
import { Layout } from 'nextra-theme-docs';
import { Banner, Head } from 'nextra/components';
import { getPageMap } from 'nextra/page-map';
import { theme } from '../theme';
+import { Inter } from 'next/font/google';
import './global.css';
import { FloatingAssistant } from '@/components/FloatingAssistant';
+import { PocketFlowChatbot } from '@/components/PocketFlowChatbot';
import { Providers } from './providers';
+const inter = Inter({ subsets: ['latin'], variable: '--font-sans' });
+
export const metadata = {
title: {
default: 'Beacon - NextGen Docs for Nexres',
@@ -82,10 +84,10 @@ export default async function RootLayout({ children }: { children: any }) {
const pageMap = await getPageMap();
return (
-
+
-
+
-
+
- β¨ AI powered documentation for ResilientDB Ecosystem and Apps
-
- }
+ // banner={
+ //
+ // β¨ AI powered documentation for ResilientDB Ecosystem and Apps
+ //
+ // }
navbar={ }
pageMap={pageMap}
docsRepositoryBase="https://github.com/shuding/nextra/tree/main/docs"
footer={ }
- sidebar={{ defaultMenuCollapseLevel: 1 }}
+ sidebar={{ defaultMenuCollapseLevel: 1, toggleButton: true }}
>
{children}
+ {/* */}
diff --git a/app/page.tsx b/app/page.tsx
index f24b2af..e0a1e86 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,638 +1,17 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-'use client';
-
-import { useState, useEffect, useRef } from 'react';
-import {
- Container,
- Title,
- Text,
- Button,
- Card,
- Badge,
- Group,
- Stack,
- Box,
- ActionIcon,
- Flex
-} from '@mantine/core';
-import {
- IconExternalLink,
- IconBrandGithub,
- IconTerminal,
- IconBolt,
- IconDatabase,
- IconCode,
- IconWorld,
- IconChevronLeft,
- IconChevronRight
-} from '@tabler/icons-react';
-import Link from "next/link";
-import classes from './page.module.css';
-
-// Import actual package.json data
-import pack from '../package.json';
-
-// Ecosystem projects data
-const ecosystemProjects = [
- {
- name: "ResilientDB",
- href: "https://github.com/apache/incubator-resilientdb",
- description: "Core blockchain infrastructure for high-performance distributed systems",
- icon: IconDatabase
- },
- {
- name: "ResilientDB GraphQL",
- href: "https://github.com/apache/incubator-resilientdb-graphql",
- description: "GraphQL interface for seamless blockchain data querying",
- icon: IconWorld
- },
- {
- name: "Resilient-Python-Cache",
- href: "https://github.com/apache/incubator-resilientdb-resilient-python-cache",
- description: "High-performance Python caching solution for blockchain applications",
- icon: IconBolt
- },
- {
- name: "ResLens",
- href: "https://github.com/harish876/ResLens",
- description: "Advanced analytics and monitoring tool for ResilientDB networks",
- icon: IconTerminal
- },
- {
- name: "ResilientDB SDK",
- href: "https://github.com/apache/incubator-resilientdb",
- description: "Comprehensive software development kit for blockchain integration",
- icon: IconCode
- },
- {
- name: "ResilientDB CLI",
- href: "https://github.com/apache/incubator-resilientdb",
- description: "Command line interface for blockchain network management",
- icon: IconTerminal
- }
-];
-
-export default function ResilientDBLanding() {
- const [typewriterText, setTypewriterText] = useState('');
- const [currentLine, setCurrentLine] = useState(0);
- const [currentIndex, setCurrentIndex] = useState(Math.floor((ecosystemProjects.length - 3) / 2));
- const terminalRef = useRef(null);
-
- const terminalLines = [
- 'π ResilientDB Node Dependencies:',
- ...Object.keys(pack.dependencies).map(
- (key) => `β’ ${key} : ${pack.dependencies[key as keyof typeof pack.dependencies]}`
- ),
- '',
- 'Each dependency is a block in your development chain.',
- 'Keep your stack resilient!'
- ];
-
- useEffect(() => {
- if (currentLine < terminalLines.length) {
- const timer = setTimeout(() => {
- setTypewriterText(prev => prev + terminalLines[currentLine] + '\n');
- setCurrentLine(prev => prev + 1);
- }, 200);
- return () => clearTimeout(timer);
- }
- }, [currentLine, terminalLines]);
-
- // Auto-scroll to bottom when text updates
- useEffect(() => {
- if (terminalRef.current) {
- terminalRef.current.scrollTop = terminalRef.current.scrollHeight;
- }
- }, [typewriterText]);
-
- const cardWidth = 320;
- const canGoNext = currentIndex < ecosystemProjects.length - 3;
- const canGoPrev = currentIndex > 0;
-
- const nextSlide = () => {
- if (canGoNext) {
- setCurrentIndex((prev) => prev + 1);
- }
- };
-
- const prevSlide = () => {
- if (canGoPrev) {
- setCurrentIndex((prev) => prev - 1);
- }
- };
-
- const getCardStyle = (index: number) => {
- const relativePos = index - currentIndex;
-
- let scale = 1;
- let opacity = 1;
- let blur = 0;
- let zIndex = 5;
-
- if (relativePos >= 0 && relativePos <= 2) {
- scale = 1;
- opacity = 1;
- blur = 0;
- zIndex = 10;
- }
- else if (relativePos === -1) {
- if (canGoPrev) {
- scale = 0.75;
- opacity = 0.5;
- blur = 2;
- zIndex = 5;
- } else {
- scale = 0;
- opacity = 0;
- blur = 0;
- zIndex = 1;
- }
- }
- else if (relativePos === 3) {
- if (canGoNext) {
- scale = 0.75;
- opacity = 0.5;
- blur = 2;
- zIndex = 5;
- } else {
- scale = 0;
- opacity = 0;
- blur = 0;
- zIndex = 1;
- }
- }
- else {
- scale = 0;
- opacity = 0;
- blur = 0;
- zIndex = 1;
- }
-
- return {
- transform: `scale(${scale})`,
- opacity,
- filter: `blur(${blur}px)`,
- zIndex
- };
- };
+import { Container } from '@mantine/core';
+import ShaderBackground from '@/components/landing/ShaderBackground';
+import PulsingCircle from '@/components/landing/PulsingCircle';
+import HeroContent from '@/components/landing/HeroContent';
+import Header from '@/components/landing/Header';
+export default function HomePage() {
return (
-
- {/* Hero Section */}
-
-
-
-
-
-
-
- Next Gen Docs for
-
-
-
- ResilientDB
-
-
-
-
-
- }
- >
- High Performance
-
- }
- >
- Blockchain
-
- }
- >
- Developer Friendly
-
-
-
-
-
- Find all documentation related to ResilientDB, its applications, and ecosystem tools
- supported by the ResilientDB team. This site is your gateway to high-performance blockchain
- infrastructure, developer guides, and integration resources. To learn more about
- ResilientDB, visit{' '}
- {
- e.currentTarget.style.color = '#40c057';
- e.currentTarget.style.textShadow = '0 1px 2px rgba(81, 207, 102, 0.3)';
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.color = '#51cf66';
- e.currentTarget.style.textShadow = 'none';
- }}
- >
- the official website
- .
-
-
-
- }
- rightSection={ }
- style={{
- transition: 'all 0.3s ease',
- border: '1px solid #868e96'
- }}
- >
- Latest Release v{pack.version}
-
-
- }
- style={{
- background: 'rgba(37, 38, 43, 0.5)',
- backdropFilter: 'blur(10px)',
- transition: 'all 0.3s ease'
- }}
- >
- Documentation
-
-
-
-
-
-
- {/* Terminal Section */}
-
-
-
-
-
- Dependencies
-
-
-
-
-
-
-
-
-
- {typewriterText}
-
-
-
-
- {/* Ecosystem Section */}
-
-
-
-
- Explore Apps and Ecosystem
-
-
- Discover the tools and applications built on ResilientDB
-
- {
- e.currentTarget.style.background = 'rgba(81, 207, 102, 0.2)';
- e.currentTarget.style.borderColor = 'rgba(81, 207, 102, 0.4)';
- e.currentTarget.style.transform = 'translateY(-1px)';
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.background = 'rgba(81, 207, 102, 0.1)';
- e.currentTarget.style.borderColor = 'rgba(81, 207, 102, 0.2)';
- e.currentTarget.style.transform = 'translateY(0)';
- }}
- >
- Visit the ResilientDB Hub for more projects
-
-
-
-
- {/* Carousel */}
-
- {/* Left Arrow */}
-
-
-
-
- {/* Right Arrow */}
-
-
-
-
- {/* Cards Container */}
-
-
- {ecosystemProjects.map((project, index) => {
- const IconComponent = project.icon;
- return (
-
-
-
-
-
-
-
-
-
- {project.name}
-
-
- {project.description}
-
-
-
-
- }
- fullWidth
- style={{
- border: '1px solid rgba(173, 181, 189, 0.5)',
- transition: 'all 0.3s ease'
- }}
- >
- View Project
-
-
-
-
- );
- })}
-
-
-
- {/* Dots Indicator */}
-
- {Array.from({ length: ecosystemProjects.length - 2 }, (_, index) => (
- setCurrentIndex(index)}
- style={{
- width: index === currentIndex ? '32px' : '8px',
- height: '8px',
- borderRadius: index === currentIndex ? '4px' : '50%',
- background: index === currentIndex ? '#f783ac' : '#868e96',
- border: 'none',
- cursor: 'pointer',
- transition: 'all 0.3s ease'
- }}
- />
- ))}
-
-
-
+
+
+
+
+
+
-
);
-}
\ No newline at end of file
+}
diff --git a/components/FloatingAssistant.tsx b/components/FloatingAssistant.tsx
index 66d5f52..b14d72d 100644
--- a/components/FloatingAssistant.tsx
+++ b/components/FloatingAssistant.tsx
@@ -19,8 +19,8 @@
'use client';
-import { ActionIcon, Tooltip, Paper, Text, Group, Box, Modal, Textarea, Button, Stack, Divider, Avatar } from '@mantine/core';
-import { IconBrain, IconSend, IconRobot, IconUser } from '@tabler/icons-react';
+import { ActionIcon, Tooltip, Paper, Text, Group, Box, Modal, Textarea, Button, Stack, Divider, Avatar, Switch, Badge } from '@mantine/core';
+import { IconBrain, IconSend, IconRobot, IconUser, IconHighlight, IconSettings } from '@tabler/icons-react';
import { useState, useEffect, ReactNode, useCallback } from 'react';
import ReactMarkdown from 'react-markdown';
import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
@@ -47,6 +47,8 @@ export function FloatingAssistant() {
const [isAskingQuestion, setIsAskingQuestion] = useState(false);
const [debounceTimer, setDebounceTimer] = useState(null);
const [lastSelection, setLastSelection] = useState('');
+ const [highlightMode, setHighlightMode] = useState(true);
+ const [showSettings, setShowSettings] = useState(false);
// Function to check if element is within a code editor
const isWithinCodeEditor = (element: Element | null): boolean => {
@@ -66,6 +68,9 @@ export function FloatingAssistant() {
// Debounced text selection handler
const handleTextSelection = useCallback(() => {
+ // Only handle text selection if highlight mode is enabled
+ if (!highlightMode) return;
+
// Clear any existing timer
if (debounceTimer) {
clearTimeout(debounceTimer);
@@ -93,7 +98,7 @@ export function FloatingAssistant() {
}, 300); // 300ms debounce delay
setDebounceTimer(timer);
- }, [debounceTimer, lastSelection]);
+ }, [debounceTimer, lastSelection, highlightMode]);
// Cleanup timer on unmount
useEffect(() => {
@@ -182,25 +187,200 @@ Please:
return (
<>
-
-
+ {/* Settings Toggle */}
+ setIsOpen(true)}
>
-
+ setShowSettings(!showSettings)}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.background = 'rgba(0, 191, 255, 0.1)';
+ e.currentTarget.style.borderColor = 'rgba(0, 191, 255, 0.3)';
+ e.currentTarget.style.color = '#00bfff';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.background = 'rgba(255,255,255,0.05)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.1)';
+ e.currentTarget.style.color = 'rgba(255,255,255,0.7)';
+ }}
+ >
+
+ {/* Settings Panel */}
+ {showSettings && (
+
+
+
+
+
+
+
+ Highlight Mode
+
+
+ setHighlightMode(event.currentTarget.checked)}
+ size="sm"
+ styles={{
+ track: {
+ backgroundColor: highlightMode ? 'rgba(0, 191, 255, 0.3)' : 'rgba(255,255,255,0.1)',
+ borderColor: highlightMode ? 'rgba(0, 191, 255, 0.5)' : 'rgba(255,255,255,0.2)',
+ },
+ thumb: {
+ backgroundColor: highlightMode ? '#00bfff' : 'rgba(255,255,255,0.6)',
+ },
+ }}
+ />
+
+
+ {highlightMode
+ ? "Select text to automatically get explanations"
+ : "Click the AI button to ask questions manually"}
+
+ {highlightMode && (
+
+ Active
+
+ )}
+
+
+ )}
+
+ {/* Main AI Assistant Button */}
+
+ setIsOpen(true)}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.background = 'rgba(0, 191, 255, 0.2)';
+ e.currentTarget.style.borderColor = 'rgba(0, 191, 255, 0.4)';
+ e.currentTarget.style.transform = 'translateY(-2px)';
+ e.currentTarget.style.boxShadow = '0 8px 20px rgba(0, 191, 255, 0.3)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.background = 'rgba(0, 191, 255, 0.1)';
+ e.currentTarget.style.borderColor = 'rgba(0, 191, 255, 0.2)';
+ e.currentTarget.style.transform = 'translateY(0)';
+ e.currentTarget.style.boxShadow = 'none';
+ }}
+ >
+
+
+ {highlightMode && (
+
+ )}
+
+
+
+
-
-
-
-
- AI Assistant
+
+
+
+
+
+
+ AI Assistant
+
+
+ {highlightMode ? "Highlight mode enabled" : "Manual mode"}
+
+
{selectedText && (
-
+
+
Selected: "{selectedText.length > 50 ? selectedText.substring(0, 50) + '...' : selectedText}"
+
)}
}
>
{selectedText && (
-
-
-
-
-
-
- Selected Text
- {selectedText}
+
+
+
+
+
+
+
+ Selected Text
+
+
+ {selectedText}
+
-
+
)}
{isLoading ? (
-
-
-
-
-
- Generating response...
-
+
+
+
+
+
+
+ Generating response...
+
+
) : explanation ? (
-
-
-
-
-
+
+
+
+
+
(
-
+
{children}
),
@@ -315,67 +593,91 @@ Please:
),
li: ({ children }: MarkdownComponentProps) => (
-
+
{children}
),
h1: ({ children }: MarkdownComponentProps) => (
-
+
{children}
),
h2: ({ children }: MarkdownComponentProps) => (
-
+
{children}
),
h3: ({ children }: MarkdownComponentProps) => (
-
+
{children}
),
blockquote: ({ children }: MarkdownComponentProps) => (
-
{children}
-
+
),
}}
>
{explanation}
-
+
) : (
-
-
-
-
-
-
+
+
+
+
+
+
{selectedText
? "Select text to get an explanation"
: "Ask any question or select text to get an explanation"}
-
+
)}
-
-
+
>
diff --git a/components/GitHubAuth.tsx b/components/GitHubAuth.tsx
index 84eb2a1..3beb28b 100644
--- a/components/GitHubAuth.tsx
+++ b/components/GitHubAuth.tsx
@@ -80,15 +80,55 @@ export function GitHubAuth({ onAuthStateChange, returnUrl }: GitHubAuthProps) {
if (user) {
return (
-
-
-
- Signed in as {user.name || user.login}
-
-
+
+
+
+
+ Signed in as {user.name || user.login}
+
+
+
{
+ e.currentTarget.style.background = 'rgba(255, 77, 77, 0.1)';
+ e.currentTarget.style.borderColor = 'rgba(255, 77, 77, 0.3)';
+ e.currentTarget.style.color = '#ff4d4d';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.background = 'rgba(255,255,255,0.05)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.1)';
+ e.currentTarget.style.color = 'rgba(255,255,255,0.7)';
+ }}
+ >
Sign Out
-
+
);
}
@@ -96,9 +136,47 @@ export function GitHubAuth({ onAuthStateChange, returnUrl }: GitHubAuthProps) {
}
onClick={handleSignIn}
- variant="outline"
+ style={{
+ background: 'rgba(255,255,255,0.05)',
+ backdropFilter: 'blur(8px)',
+ border: '1px solid rgba(255,255,255,0.1)',
+ color: 'rgba(255,255,255,0.9)',
+ borderRadius: 12,
+ padding: '12px 20px',
+ fontWeight: 400,
+ transition: 'all 200ms ease',
+ position: 'relative',
+ overflow: 'hidden',
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.background = 'rgba(0, 191, 255, 0.1)';
+ e.currentTarget.style.borderColor = 'rgba(0, 191, 255, 0.3)';
+ e.currentTarget.style.color = '#00bfff';
+ e.currentTarget.style.transform = 'translateY(-1px)';
+ e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 191, 255, 0.2)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.background = 'rgba(255,255,255,0.05)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.1)';
+ e.currentTarget.style.color = 'rgba(255,255,255,0.9)';
+ e.currentTarget.style.transform = 'translateY(0)';
+ e.currentTarget.style.boxShadow = 'none';
+ }}
>
- Sign in with GitHub to Comment
+
+
+ Sign in with GitHub to Comment
+
);
}
\ No newline at end of file
diff --git a/components/MantineFooter/MantineFooter.tsx b/components/MantineFooter/MantineFooter.tsx
index 839e559..37b9839 100644
--- a/components/MantineFooter/MantineFooter.tsx
+++ b/components/MantineFooter/MantineFooter.tsx
@@ -1,472 +1,384 @@
-"use client"
-
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-import { Anchor, Box, Container, SimpleGrid, Stack, Group, Text, Divider, ActionIcon, Title } from "@mantine/core"
-import { IconBrandGithub, IconWorldWww, IconMail } from "@tabler/icons-react"
+'use client';
/**
- * You can customize the Nextra Footer component.
- * Don't forget to use the MantineProvider component.
+ * Sleek footer component matching the landing page design language
+ * Features glassmorphism effects, subtle animations, and modern styling
+ * Uses regular HTML/React components for full width stretching
*
* @since 1.0.0
- *
*/
export const MantineFooter = () => (
-
- {/* Animated background elements */}
-
-
-
-
- {
- e.currentTarget.style.transform = "translateY(-2px)"
- e.currentTarget.style.color = "#40c057"
- e.currentTarget.style.textShadow = "0 2px 4px rgba(81, 207, 102, 0.5)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.transform = "translateY(0)"
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.textShadow = "0 1px 2px rgba(81, 207, 102, 0.3)"
- }}
- >
- Docs
-
- {
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.15)"
- e.currentTarget.style.transform = "translateX(6px) translateY(-1px)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(81, 207, 102, 0.2)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.backgroundColor = "transparent"
- e.currentTarget.style.transform = "translateX(0) translateY(0)"
- e.currentTarget.style.borderColor = "transparent"
- e.currentTarget.style.boxShadow = "none"
- }}
- >
- Overview
-
- {
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.15)"
- e.currentTarget.style.transform = "translateX(6px) translateY(-1px)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(81, 207, 102, 0.2)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.backgroundColor = "transparent"
- e.currentTarget.style.transform = "translateX(0) translateY(0)"
- e.currentTarget.style.borderColor = "transparent"
- e.currentTarget.style.boxShadow = "none"
- }}
- >
- Installation
-
- {
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.15)"
- e.currentTarget.style.transform = "translateX(6px) translateY(-1px)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(81, 207, 102, 0.2)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.backgroundColor = "transparent"
- e.currentTarget.style.transform = "translateX(0) translateY(0)"
- e.currentTarget.style.borderColor = "transparent"
- e.currentTarget.style.boxShadow = "none"
- }}
- >
- ResilientDB
-
-
+
+
+ {/* Main footer content */}
+
+ {/* Left section - Brand */}
+
+
+
+
+ Next generation documentation for ResilientDB ecosystem.
+ Your gateway to high-performance blockchain infrastructure.
+
+
+
-
- {
- e.currentTarget.style.transform = "translateY(-2px)"
- e.currentTarget.style.color = "#40c057"
- e.currentTarget.style.textShadow = "0 2px 4px rgba(81, 207, 102, 0.5)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.transform = "translateY(0)"
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.textShadow = "0 1px 2px rgba(81, 207, 102, 0.3)"
- }}
- >
- Ecosystem
-
- {
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.15)"
- e.currentTarget.style.transform = "translateX(6px) translateY(-1px)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(81, 207, 102, 0.2)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.backgroundColor = "transparent"
- e.currentTarget.style.transform = "translateX(0) translateY(0)"
- e.currentTarget.style.borderColor = "transparent"
- e.currentTarget.style.boxShadow = "none"
- }}
- >
- ResilientDB GraphQL
-
- {
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.15)"
- e.currentTarget.style.transform = "translateX(6px) translateY(-1px)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(81, 207, 102, 0.2)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.backgroundColor = "transparent"
- e.currentTarget.style.transform = "translateX(0) translateY(0)"
- e.currentTarget.style.borderColor = "transparent"
- e.currentTarget.style.boxShadow = "none"
- }}
- >
- ResLens β Monitoring
-
- {
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.15)"
- e.currentTarget.style.transform = "translateX(6px) translateY(-1px)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(81, 207, 102, 0.2)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.backgroundColor = "transparent"
- e.currentTarget.style.transform = "translateX(0) translateY(0)"
- e.currentTarget.style.borderColor = "transparent"
- e.currentTarget.style.boxShadow = "none"
- }}
- >
- ResVault
-
-
+ {/* Center section - Links */}
+
+
+
+ Documentation
+
+
+
{
+ e.currentTarget.style.color = 'rgba(255,255,255,0.9)';
+ e.currentTarget.style.transform = 'translateX(4px)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = 'rgba(255,255,255,0.6)';
+ e.currentTarget.style.transform = 'translateX(0)';
+ }}
+ >
+ Getting Started
+
+
{
+ e.currentTarget.style.color = 'rgba(255,255,255,0.9)';
+ e.currentTarget.style.transform = 'translateX(4px)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = 'rgba(255,255,255,0.6)';
+ e.currentTarget.style.transform = 'translateX(0)';
+ }}
+ >
+ Installation
+
+
{
+ e.currentTarget.style.color = 'rgba(255,255,255,0.9)';
+ e.currentTarget.style.transform = 'translateX(4px)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = 'rgba(255,255,255,0.6)';
+ e.currentTarget.style.transform = 'translateX(0)';
+ }}
+ >
+ ResilientDB
+
+
+
-
- {
- e.currentTarget.style.transform = "translateY(-2px)"
- e.currentTarget.style.color = "#40c057"
- e.currentTarget.style.textShadow = "0 2px 4px rgba(81, 207, 102, 0.5)"
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.transform = "translateY(0)"
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.textShadow = "0 1px 2px rgba(81, 207, 102, 0.3)"
- }}
- >
- Community
-
-
-
+
+ Community
+
+
+
{
+ e.currentTarget.style.color = 'rgba(255,255,255,0.9)';
+ e.currentTarget.style.transform = 'translateX(4px)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = 'rgba(255,255,255,0.6)';
+ e.currentTarget.style.transform = 'translateX(0)';
+ }}
+ >
+ Official Site
+
+
{
+ e.currentTarget.style.color = 'rgba(255,255,255,0.9)';
+ e.currentTarget.style.transform = 'translateX(4px)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = 'rgba(255,255,255,0.6)';
+ e.currentTarget.style.transform = 'translateX(0)';
+ }}
+ >
+ Blog
+
+
{
+ e.currentTarget.style.color = 'rgba(255,255,255,0.9)';
+ e.currentTarget.style.transform = 'translateX(4px)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = 'rgba(255,255,255,0.6)';
+ e.currentTarget.style.transform = 'translateX(0)';
+ }}
+ >
+ About
+
+
+
+
+
+ {/* Right section - Tech stack */}
+
+
+ Built with
+
+
+
{
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.2)"
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.transform = "translateY(-3px) scale(1.1)"
- e.currentTarget.style.boxShadow = "0 8px 20px rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.5)"
+ e.currentTarget.style.background = 'rgba(255,255,255,0.1)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.2)';
}}
onMouseLeave={(e) => {
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.05)"
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.transform = "translateY(0) scale(1)"
- e.currentTarget.style.boxShadow = "none"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.2)"
+ e.currentTarget.style.background = 'rgba(255,255,255,0.05)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.1)';
}}
>
-
-
-
+ {
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.2)"
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.transform = "translateY(-3px) scale(1.1)"
- e.currentTarget.style.boxShadow = "0 8px 20px rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.5)"
+ e.currentTarget.style.background = 'rgba(255,255,255,0.1)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.2)';
}}
onMouseLeave={(e) => {
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.05)"
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.transform = "translateY(0) scale(1)"
- e.currentTarget.style.boxShadow = "none"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.2)"
+ e.currentTarget.style.background = 'rgba(255,255,255,0.05)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.1)';
}}
>
-
-
-
+ {
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.2)"
- e.currentTarget.style.color = "#51cf66"
- e.currentTarget.style.transform = "translateY(-3px) scale(1.1)"
- e.currentTarget.style.boxShadow = "0 8px 20px rgba(81, 207, 102, 0.3)"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.5)"
+ e.currentTarget.style.background = 'rgba(255,255,255,0.1)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.2)';
}}
onMouseLeave={(e) => {
- e.currentTarget.style.backgroundColor = "rgba(81, 207, 102, 0.05)"
- e.currentTarget.style.color = "rgba(255, 255, 255, 0.8)"
- e.currentTarget.style.transform = "translateY(0) scale(1)"
- e.currentTarget.style.boxShadow = "none"
- e.currentTarget.style.borderColor = "rgba(81, 207, 102, 0.2)"
+ e.currentTarget.style.background = 'rgba(255,255,255,0.05)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.1)';
}}
>
-
-
-
-
- Docs and tools to help you build with ResilientDB.
-
-
-
-
- {/* Integrated copyright section */}
-
-
- Β© {new Date().getFullYear()} ResilientDB. Part of the
-
+
+
+
+
+ {/* Divider */}
+
+
+ {/* Bottom section - Copyright */}
+
+
+
+
+);
diff --git a/components/MantineNavBar/MantineNavBar.tsx b/components/MantineNavBar/MantineNavBar.tsx
index f842b81..09bc07b 100644
--- a/components/MantineNavBar/MantineNavBar.tsx
+++ b/components/MantineNavBar/MantineNavBar.tsx
@@ -1,34 +1,11 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
'use client';
-import { Group, Text } from '@mantine/core';
+import { Box } from '@mantine/core';
+import { usePathname } from 'next/navigation';
import '@mantine/core/styles.css';
-
-import { Navbar } from 'nextra-theme-docs';
-import { ColorSchemeControl } from '../ColorSchemeControl/ColorSchemeControl';
-import { Logo } from '../Logo/Logo';
import { MantineNextraThemeObserver } from '../MantineNextraThemeObserver/MantineNextraThemeObserver';
-import { AskAIModal } from '../AskAIModal';
-import { SearchBar } from '../SearchBar/SearchBar';
+import Header from '@/components/landing/Header';
/**
* You can customize the Nextra NavBar component.
@@ -38,26 +15,14 @@ import { SearchBar } from '../SearchBar/SearchBar';
*
*/
export const MantineNavBar = () => {
+ const pathname = usePathname();
+ if (pathname === '/') return null;
return (
<>
-
-
-
- ResilientDB
-
-
- }
- >
- <>
-
- {/* */}
-
-
- >
-
+
+
+
>
);
-};
\ No newline at end of file
+};
diff --git a/components/PocketFlowChatbot.tsx b/components/PocketFlowChatbot.tsx
new file mode 100644
index 0000000..5e8944f
--- /dev/null
+++ b/components/PocketFlowChatbot.tsx
@@ -0,0 +1,130 @@
+'use client';
+
+import { useEffect, useRef } from 'react';
+
+declare global {
+ interface Window {
+ initializeChatbot: (config: any) => void;
+ }
+}
+
+interface PocketFlowChatbotProps {
+ extraUrls?: string[];
+ prefixes?: string[];
+ chatbotName?: string;
+ wsUrl?: string;
+ instruction?: string;
+ isOpen?: boolean;
+}
+
+export function PocketFlowChatbot({
+ extraUrls = ["https://beacon.resilientdb.com/docs"],
+ prefixes = [],
+ chatbotName = 'Beacon',
+ wsUrl = 'wss://askthispage.com/api/ws/chat',
+ instruction = '',
+ isOpen = false
+}: PocketFlowChatbotProps) {
+ const containerRef = useRef
(null);
+
+ useEffect(() => {
+ // Check if the script is already loaded
+ if (document.querySelector('script[src="https://askthispage.com/embed/chatbot.js"]')) {
+ return;
+ }
+
+ const script = document.createElement("script");
+ script.src = "https://askthispage.com/embed/chatbot.js";
+ script.onload = function() {
+ if (window.initializeChatbot) {
+ window.initializeChatbot({
+ extra_urls: extraUrls,
+ prefixes: prefixes,
+ chatbotName: chatbotName,
+ wsUrl: wsUrl,
+ instruction: instruction,
+ isOpen: isOpen
+ });
+ }
+ };
+ document.head.appendChild(script);
+
+ // Cleanup function
+ return () => {
+ const existingScript = document.querySelector('script[src="https://askthispage.com/embed/chatbot.js"]');
+ if (existingScript) {
+ existingScript.remove();
+ }
+ };
+ }, [extraUrls, prefixes, chatbotName, wsUrl, instruction, isOpen]);
+
+ // Add custom styles after the chatbot loads
+ useEffect(() => {
+ const checkAndStyle = () => {
+ const chatbot = document.querySelector('.askthispage-chatbot') as HTMLElement;
+ if (chatbot) {
+ // Move to left corner
+ chatbot.style.position = 'fixed';
+ chatbot.style.left = '20px';
+ chatbot.style.right = 'auto';
+ chatbot.style.bottom = '20px';
+ chatbot.style.zIndex = '1000';
+
+ // Add experimental badge
+ const badge = document.createElement('div');
+ badge.innerHTML = 'π§ͺ Experimental';
+ badge.style.cssText = `
+ position: absolute;
+ top: -30px;
+ left: 0;
+ background: linear-gradient(45deg, #ff6b6b, #ffa500);
+ color: white;
+ padding: 4px 8px;
+ border-radius: 12px;
+ font-size: 10px;
+ font-weight: bold;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+ z-index: 1001;
+ animation: pulse 2s infinite;
+ white-space: nowrap;
+ `;
+
+ // Add pulse animation
+ const style = document.createElement('style');
+ style.textContent = `
+ @keyframes pulse {
+ 0% { opacity: 1; }
+ 50% { opacity: 0.7; }
+ 100% { opacity: 1; }
+ }
+ `;
+ document.head.appendChild(style);
+
+ chatbot.appendChild(badge);
+ }
+ };
+
+ // Check immediately and then periodically
+ checkAndStyle();
+ const interval = setInterval(checkAndStyle, 1000);
+
+ return () => {
+ clearInterval(interval);
+ };
+ }, []);
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/components/PythonPlayground.tsx b/components/PythonPlayground.tsx
index 4e98551..7539df1 100644
--- a/components/PythonPlayground.tsx
+++ b/components/PythonPlayground.tsx
@@ -268,10 +268,48 @@ loop.run_until_complete(__run())
};
return (
-
-
+
+ {/* Glass effect overlay */}
+
+
+
-
+
+
+ π Python Playground
+
+
+
+
t.value === value)?.code || '')
}
leftSection={ }
+ styles={{
+ input: {
+ background: 'rgba(255,255,255,0.05)',
+ border: '1px solid rgba(255,255,255,0.1)',
+ color: 'rgba(255,255,255,0.9)',
+ '&:focus': {
+ borderColor: 'rgba(0, 191, 255, 0.5)',
+ }
+ }
+ }}
/>
@@ -288,6 +336,11 @@ loop.run_until_complete(__run())
variant="light"
onClick={() => setShowChat(!showChat)}
color={showChat ? "blue" : "gray"}
+ style={{
+ background: showChat ? 'rgba(0, 191, 255, 0.1)' : 'rgba(255,255,255,0.05)',
+ border: '1px solid rgba(255,255,255,0.1)',
+ color: showChat ? '#00bfff' : 'rgba(255,255,255,0.7)',
+ }}
>
@@ -295,7 +348,15 @@ loop.run_until_complete(__run())
-
+
-
+
{showChat && (
<>
-
-
+
+
- AI Assistant
-
+
+ AI Assistant
+
+
setIsExpanded(true)}
disabled={isExpanded}
+ style={{
+ background: 'rgba(255,255,255,0.05)',
+ border: '1px solid rgba(255,255,255,0.1)',
+ color: 'rgba(255,255,255,0.7)',
+ }}
>
@@ -354,16 +441,37 @@ loop.run_until_complete(__run())
color="red"
onClick={clearConversation}
disabled={messages.length === 0}
+ style={{
+ background: 'rgba(255,255,255,0.05)',
+ border: '1px solid rgba(255,255,255,0.1)',
+ color: 'rgba(255,255,255,0.7)',
+ }}
>
-
+
{[...messages].reverse().map((message, i) => (
-
-
+
+
{message.role === 'user' ? (
message.content
) : (
@@ -392,11 +500,11 @@ loop.run_until_complete(__run())
)}
-
+
))}
-
+
-
+
{isAiLoading ? (
}
+ style={{
+ background: 'rgba(255, 77, 77, 0.1)',
+ border: '1px solid rgba(255, 77, 77, 0.3)',
+ color: '#ff4d4d',
+ }}
>
Stop
) : (
-
+
Send
)}
-
+
}
+ style={{
+ background: 'rgba(0, 191, 255, 0.1)',
+ border: '1px solid rgba(0, 191, 255, 0.3)',
+ color: '#00bfff',
+ borderRadius: 8,
+ }}
>
{isRunning ? 'Running...' : 'Run'}
}
+ style={{
+ background: 'rgba(255,255,255,0.05)',
+ border: '1px solid rgba(255,255,255,0.1)',
+ color: 'rgba(255,255,255,0.7)',
+ borderRadius: 8,
+ }}
>
Clear Output
-
{output.map((line, i) => (
-
+
{line}
))}
-
+
-
+
);
}
diff --git a/components/SearchBar/SearchBar.tsx b/components/SearchBar/SearchBar.tsx
index 351195d..7195ec2 100644
--- a/components/SearchBar/SearchBar.tsx
+++ b/components/SearchBar/SearchBar.tsx
@@ -19,7 +19,7 @@
'use client'
-import { Button } from '@mantine/core';
+import { Button, Group, Kbd, Text } from '@mantine/core';
import { IconSearch } from '@tabler/icons-react';
export function SearchBar() {
@@ -34,12 +34,14 @@ export function SearchBar() {
};
return (
-
}
- variant="subtle"
- >
- Search
+
+
+
+ Search
+ Ctrl
+ +
+ K
+
);
}
\ No newline at end of file
diff --git a/components/Welcome/Welcome.module.css b/components/Welcome/Welcome.module.css
index 9bd7e46..e35538c 100644
--- a/components/Welcome/Welcome.module.css
+++ b/components/Welcome/Welcome.module.css
@@ -1,30 +1,32 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
.title {
color: white;
- font-size: 80px;
+ font-size: 72px;
+ line-height: 1.05;
+ letter-spacing: -0.02em;
@media (max-width: 768px) {
- font-size: 60px;
+ font-size: 44px;
}
}
+
.subtitle {
font-size: 80px;
+ line-height: 1.05;
+ letter-spacing: -0.03em;
+}
+
+.hero {
+ position: relative;
+ padding-top: 96px;
+}
+
+.halo {
+ position: absolute;
+ inset: 0;
+ background:
+ radial-gradient(600px 200px at 50% 0%, rgba(0, 102, 255, 0.15), transparent 70%),
+ radial-gradient(300px 150px at 10% 30%, rgba(255, 0, 128, 0.12), transparent 70%),
+ radial-gradient(300px 150px at 90% 30%, rgba(255, 196, 0, 0.12), transparent 70%);
+ pointer-events: none;
+ mask-image: radial-gradient(closest-side, rgba(0,0,0,0.6), transparent 70%);
}
diff --git a/components/Welcome/Welcome.tsx b/components/Welcome/Welcome.tsx
index 6b58799..79c6344 100644
--- a/components/Welcome/Welcome.tsx
+++ b/components/Welcome/Welcome.tsx
@@ -21,59 +21,51 @@
import { TextAnimate } from '@gfazioli/mantine-text-animate';
import { IconBrandGithub, IconExternalLink } from '@tabler/icons-react';
-import { Anchor, Button, Center, Paper, Text, Title } from '@mantine/core';
+import { Anchor, Button, Center, Paper, Text, Title, Stack } from '@mantine/core';
import pack from '../../package.json';
import classes from './Welcome.module.css';
export function Welcome() {
return (
<>
-
- Next Gen Docs for
-
- NexRes
-
-
+
+
+
+
+ Nextβgen docs for
+
+ NexRes
+
+
-
- Find all documentation related to ResilientDB, its applications, and ecosystem tools
- supported by the ResilientDB team. This site is your gateway to high-performance blockchain
- infrastructure, developer guides, and integration resources. To learn more about
- ResilientDB, visit the official website .
-
+
+ Find all documentation related to ResilientDB, its applications, and ecosystem tools
+ supported by the ResilientDB team. This site is your gateway to high-performance
+ blockchain infrastructure, developer guides, and integration resources. To learn more
+ about ResilientDB, visit the official website .
+
-
- }
- leftSection={ }
- variant="outline"
- px={32}
- radius={256}
- size="lg"
- mx="auto"
- mt="xl"
- >
- Latest Release v{pack.version}
-
-
+
+ }
+ leftSection={ }
+ variant="gradient"
+ gradient={{ from: 'blue', to: 'grape' }}
+ px={28}
+ radius={999}
+ size="md"
+ mx="auto"
+ mt="sm"
+ >
+ Latest Release v{pack.version}
+
+
+
+
-
+
`β’ ${key} : ${pack.dependencies[key as keyof typeof pack.dependencies].toString()}`
diff --git a/components/index.ts b/components/index.ts
index 9f70a84..ea1574e 100644
--- a/components/index.ts
+++ b/components/index.ts
@@ -27,3 +27,4 @@ export { NodeConfigGenerator } from './cache/NodeConfigGenerator';
export { PythonConfigGenerator } from './cache/PythonConfigGenerator';
export { NodeQueryBuilder } from './cache/NodeQueryBuilder';
export { PythonQueryBuilder } from './cache/PythonQueryBuilder';
+export { PocketFlowChatbot } from './PocketFlowChatbot';
diff --git a/components/landing/Header.tsx b/components/landing/Header.tsx
new file mode 100644
index 0000000..c85ff7f
--- /dev/null
+++ b/components/landing/Header.tsx
@@ -0,0 +1,164 @@
+'use client';
+
+import { SearchBar } from '../SearchBar/SearchBar';
+
+export default function Header() {
+ return (
+
+ );
+}
+
+
diff --git a/components/landing/HeroContent.tsx b/components/landing/HeroContent.tsx
new file mode 100644
index 0000000..c064f9c
--- /dev/null
+++ b/components/landing/HeroContent.tsx
@@ -0,0 +1,130 @@
+'use client';
+
+export default function HeroContent() {
+ return (
+
+
+
+
+
+ β¨ New Beacon Experience
+
+
+
+
+ Next Gen Docs for
+
+ ResilientDB
+
+
+
+ Find all documentation related to ResilientDB, its applications, and ecosystem tools supported by the ResilientDB team. This site is your gateway to high-performance blockchain infrastructure, developer guides, and integration resources. To learn more about ResilientDB, visit the
+ {
+ e.currentTarget.style.color = '#ffffff';
+ e.currentTarget.style.textDecorationColor = 'rgba(255, 255, 255, 0.8)';
+ e.currentTarget.style.textShadow = '0 0 8px rgba(0, 191, 255, 0.6)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = '#00bfff';
+ e.currentTarget.style.textDecorationColor = 'rgba(0, 191, 255, 0.5)';
+ e.currentTarget.style.textShadow = 'none';
+ }}
+ >
+ {" "}official website
+ .
+
+
+
+ window.open('https://github.com/apache/incubator-resilientdb/releases/tag/v1.10.0-rc03', '_blank')}
+ style={{
+ paddingInline: 24,
+ paddingBlock: 12,
+ borderRadius: 999,
+ background: 'transparent',
+ border: '1px solid rgba(255,255,255,0.3)',
+ color: '#fff',
+ fontWeight: 400,
+ fontSize: 12,
+ transition: 'all 200ms ease',
+ cursor: 'pointer',
+ fontFamily: 'inherit'
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.background = 'rgba(255,255,255,0.1)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.5)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.background = 'transparent';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.3)';
+ }}
+ >
+ Latest Release
+
+ window.location.href = '/docs'}
+ style={{
+ paddingInline: 24,
+ paddingBlock: 12,
+ borderRadius: 999,
+ background: '#fff',
+ border: '1px solid #fff',
+ color: '#000',
+ fontWeight: 400,
+ fontSize: 12,
+ transition: 'all 200ms ease',
+ cursor: 'pointer',
+ fontFamily: 'inherit'
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.background = 'rgba(255,255,255,0.9)';
+ e.currentTarget.style.borderColor = 'rgba(255,255,255,0.9)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.background = '#fff';
+ e.currentTarget.style.borderColor = '#fff';
+ }}
+ >
+ Get Started
+
+
+
+
+ );
+}
+
+
diff --git a/components/landing/PulsingCircle.tsx b/components/landing/PulsingCircle.tsx
new file mode 100644
index 0000000..126cd31
--- /dev/null
+++ b/components/landing/PulsingCircle.tsx
@@ -0,0 +1,53 @@
+'use client';
+
+import { PulsingBorder } from '@paper-design/shaders-react';
+import { motion } from 'framer-motion';
+
+export default function PulsingCircle() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ Beacon β’ Resilient β’ Modern β’ Elegant β’
+
+
+
+
+
+ );
+}
+
+
+
+
+
+
+
diff --git a/components/landing/ShaderBackground.tsx b/components/landing/ShaderBackground.tsx
new file mode 100644
index 0000000..28fd93e
--- /dev/null
+++ b/components/landing/ShaderBackground.tsx
@@ -0,0 +1,136 @@
+'use client';
+
+import React, { useEffect, useRef } from 'react';
+
+interface ShaderBackgroundProps {
+ children: React.ReactNode;
+}
+
+export default function ShaderBackground({ children }: ShaderBackgroundProps) {
+ const containerRef = useRef(null);
+ const blobRef = useRef(null);
+
+ // Lightweight pointer-based parallax, transform only (GPU-accelerated)
+ useEffect(() => {
+ const container = containerRef.current;
+ const blob = blobRef.current;
+ if (!container || !blob) return;
+
+ let rafId = 0;
+ const target = { x: 0, y: 0 };
+ const current = { x: 0, y: 0 };
+
+ const onMove = (e: PointerEvent) => {
+ const rect = container.getBoundingClientRect();
+ target.x = e.clientX - rect.left;
+ target.y = e.clientY - rect.top;
+ if (!rafId) rafId = requestAnimationFrame(tick);
+ };
+
+ const tick = () => {
+ const lerp = 0.18;
+ current.x += (target.x - current.x) * lerp;
+ current.y += (target.y - current.y) * lerp;
+ blob.style.left = `${current.x}px`;
+ blob.style.top = `${current.y}px`;
+ blob.style.opacity = '1';
+ if (Math.abs(current.x - target.x) > 0.001 || Math.abs(current.y - target.y) > 0.001) {
+ rafId = requestAnimationFrame(tick);
+ } else {
+ rafId = 0;
+ }
+ };
+
+ const onLeave = () => {
+ blob.style.opacity = '0';
+ };
+
+ container.addEventListener('pointermove', onMove, { passive: true });
+ container.addEventListener('pointerleave', onLeave, { passive: true });
+ return () => {
+ container.removeEventListener('pointermove', onMove as any);
+ container.removeEventListener('pointerleave', onLeave as any);
+ if (rafId) cancelAnimationFrame(rafId);
+ };
+ }, []);
+
+ return (
+
+ {/* SVG Filters (used by header gooey/pill effects) */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Subtle radial overlays (dark, snappy) */}
+
+
+ {/* Subtle grey hue overlay */}
+
+
+ {/* Low-cost parallax blob */}
+
+
+ {/* Beacon of light elements */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+ );
+}
+
+
diff --git a/content/_meta.ts b/content/_meta.ts
index 3fe9fe5..1efdf5c 100644
--- a/content/_meta.ts
+++ b/content/_meta.ts
@@ -21,12 +21,12 @@ export default {
index: {
title: 'Quick Start',
},
- installation: {
- title: 'Installation',
- },
about: {
title: 'About',
},
+ installation: {
+ title: 'Installation',
+ },
resilientdb: {
title: 'Resilient DB',
},
diff --git a/content/about.mdx b/content/about.mdx
index 7b31dc1..0010339 100644
--- a/content/about.mdx
+++ b/content/about.mdx
@@ -51,4 +51,3 @@ We thank all our contributors and the openβsource community for their support
- ResilientDB website: [resilientdb.com](https://resilientdb.com)
- Beacon (Docs): [beacon.resilientdb.com](https://beacon.resilientdb.com)
-
diff --git a/content/index.mdx b/content/index.mdx
index fa05f89..efefb47 100644
--- a/content/index.mdx
+++ b/content/index.mdx
@@ -20,13 +20,13 @@ Welcome to the **ResilientDB Quickstart Guide**βyour one-stop shop for all Res
---
-## π **What is ResilientDB?**
+## π What is ResilientDB?
ResilientDB is a high-performance, scalable, and secure blockchain platform designed to meet the demands of modern distributed applications. It offers a suite of tools and projects that enable developers and organizations to build robust blockchain solutions efficiently.
---
-## π **Get Started**
+## π Get Started
- **[Installation Guide](installation/):** Learn how to install all ResilientDB projects using the `INSTALL.sh` script.
- **[Usage Guides](usage/):** Explore detailed guides on how to use each ResilientDB project.
@@ -35,7 +35,7 @@ ResilientDB is a high-performance, scalable, and secure blockchain platform desi
---
-## π **Main Repositories**
+## π Main Repositories
Access the main repositories within the ResilientDB Ecosystem and ResilientApps collections:
@@ -50,7 +50,7 @@ Access the main repositories within the ResilientDB Ecosystem and ResilientApps
---
-## π **ResilientDB Ecosystem**
+## π ResilientDB Ecosystem
Explore the core components and tools designed to interact with and extend the functionality of the ResilientDB platform.
@@ -69,7 +69,7 @@ Explore the core components and tools designed to interact with and extend the f
---
-## π± **ResilientApps**
+## π± ResilientApps
This list includes various applications and tools built on top of the ResilientDB platform, enhancing its use cases and usability.
@@ -96,7 +96,7 @@ This list includes various applications and tools built on top of the ResilientD
---
-## π‘ **Why Choose ResilientDB?**
+## π‘ Why Choose ResilientDB?
- **High Performance:** Achieve high transaction throughput with low latency.
- **Scalability:** Designed to scale horizontally to meet growing demands.
@@ -105,7 +105,7 @@ This list includes various applications and tools built on top of the ResilientD
---
-## π **Get Involved**
+## π Get Involved
- **GitHub:** [ResilientEcosystem](https://github.com/ResilientEcosystem)
- **Support:** If you have any questions or need help, feel free to [open an issue](https://github.com/apache/incubator-resilientdb/issues).
diff --git a/package-lock.json b/package-lock.json
index 04ddf2f..9af80c4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,6 +12,7 @@
"@ai-sdk/react": "^1.2.12",
"@codemirror/lang-javascript": "^6.2.4",
"@codemirror/lang-python": "^6.2.1",
+ "@codemirror/view": "^6.37.2",
"@floating-ui/react-dom": "^2.0.0",
"@gfazioli/mantine-marquee": "^2.2.7",
"@gfazioli/mantine-text-animate": "^1.0.3",
@@ -21,10 +22,12 @@
"@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "^15.3.1",
"@octokit/rest": "^22.0.0",
+ "@paper-design/shaders-react": "0.0.53",
"@tabler/icons-react": "^3.31.0",
"@uiw/codemirror-theme-vscode": "^4.23.12",
"@uiw/react-codemirror": "^4.23.12",
"ai": "^4.3.16",
+ "framer-motion": "12.23.14",
"internmap": "^2.0.3",
"next": "15.3.2",
"next-auth": "^4.24.11",
@@ -2248,12 +2251,13 @@
}
},
"node_modules/@codemirror/view": {
- "version": "6.36.8",
- "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.8.tgz",
- "integrity": "sha512-yoRo4f+FdnD01fFt4XpfpMCcCAo9QvZOtbrXExn4SqzH32YC6LgzqxfLZw/r6Ge65xyY03mK/UfUqrVw1gFiFg==",
+ "version": "6.37.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.37.2.tgz",
+ "integrity": "sha512-XD3LdgQpxQs5jhOOZ2HRVT+Rj59O4Suc7g2ULvZ+Yi8eCkickrkZ5JFuoDhs2ST1mNI5zSsNYgR3NGa4OUrbnw==",
"license": "MIT",
"dependencies": {
"@codemirror/state": "^6.5.0",
+ "crelt": "^1.0.6",
"style-mod": "^4.1.0",
"w3c-keyname": "^2.2.4"
}
@@ -4959,6 +4963,30 @@
"url": "https://github.com/sponsors/panva"
}
},
+ "node_modules/@paper-design/shaders": {
+ "version": "0.0.53",
+ "resolved": "https://registry.npmjs.org/@paper-design/shaders/-/shaders-0.0.53.tgz",
+ "integrity": "sha512-ACeYUZNOGLFWXaidIf5CQ0pxPgKgSZjzCe7VJB83NcZJzkHoSppxnchhTrBxTt0OR85wIX+eQOxMJoDgqVCBGw==",
+ "license": "SEE LICENSE IN https://github.com/paper-design/shaders/blob/main/LICENSE"
+ },
+ "node_modules/@paper-design/shaders-react": {
+ "version": "0.0.53",
+ "resolved": "https://registry.npmjs.org/@paper-design/shaders-react/-/shaders-react-0.0.53.tgz",
+ "integrity": "sha512-3WxkYrCpbIJE2l6uHbxHbuISnTM68i93fV1qIyBFUS/l01HBPM/90A9TTinyVWwOA4gIsnn+iSSmv9328z01nA==",
+ "license": "SEE LICENSE IN https://github.com/paper-design/shaders/blob/main/LICENSE",
+ "dependencies": {
+ "@paper-design/shaders": "0.0.53"
+ },
+ "peerDependencies": {
+ "@types/react": "^18 || ^19",
+ "react": "^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@pmmmwh/react-refresh-webpack-plugin": {
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.16.tgz",
@@ -12266,6 +12294,33 @@
"node": ">= 0.6"
}
},
+ "node_modules/framer-motion": {
+ "version": "12.23.14",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.14.tgz",
+ "integrity": "sha512-8BQ6dvqOht2w8P1CwIEvAA0gypDR3fNG/M6/f5lT0QgNIKnJf7J43Bpv++NnCWU8YfmL47UEm2hbI0GRvdVhsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.23.12",
+ "motion-utils": "^12.23.6",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/fresh": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
@@ -17420,6 +17475,21 @@
"pathe": "^2.0.1"
}
},
+ "node_modules/motion-dom": {
+ "version": "12.23.12",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz",
+ "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.23.6"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.23.6",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
+ "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==",
+ "license": "MIT"
+ },
"node_modules/mrmime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
diff --git a/package.json b/package.json
index aa99e17..9a430aa 100644
--- a/package.json
+++ b/package.json
@@ -5,6 +5,7 @@
"scripts": {
"dev": "next dev",
"build": "next build",
+ "postbuild": "pagefind --site .next/server/app --output-path public/_pagefind",
"build:pagefind": "pagefind --site .next/server/app --output-path public/_pagefind",
"analyze": "ANALYZE=true next build",
"start": "next start",
@@ -35,10 +36,12 @@
"@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "^15.3.1",
"@octokit/rest": "^22.0.0",
+ "@paper-design/shaders-react": "0.0.53",
"@tabler/icons-react": "^3.31.0",
"@uiw/codemirror-theme-vscode": "^4.23.12",
"@uiw/react-codemirror": "^4.23.12",
"ai": "^4.3.16",
+ "framer-motion": "12.23.14",
"internmap": "^2.0.3",
"next": "15.3.2",
"next-auth": "^4.24.11",
diff --git a/public/favicon.svg b/public/favicon.svg
index ad88d59..e0632f6 100644
--- a/public/favicon.svg
+++ b/public/favicon.svg
@@ -1,18 +1,18 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/theme.ts b/theme.ts
index 75c6cf9..95c31aa 100644
--- a/theme.ts
+++ b/theme.ts
@@ -22,5 +22,72 @@
import { createTheme } from '@mantine/core';
export const theme = createTheme({
- /* Put your mantine theme override here */
+ /* Sleek, modern theme overrides */
+ primaryColor: 'blue',
+ defaultRadius: 12,
+ fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, Noto Sans, \"Apple Color Emoji\", \"Segoe UI Emoji\"',
+ headings: {
+ fontFamily:
+ 'Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, Noto Sans, \"Apple Color Emoji\", \"Segoe UI Emoji\"',
+ sizes: {
+ h1: { fontSize: '2.75rem', fontWeight: '800', lineHeight: '1.1' },
+ h2: { fontSize: '2.25rem', fontWeight: '800', lineHeight: '1.15' },
+ h3: { fontSize: '1.75rem', fontWeight: '700', lineHeight: '1.2' },
+ },
+ },
+ colors: {
+ blue: [
+ '#e8f1ff',
+ '#d3e4ff',
+ '#a7c6ff',
+ '#7aa8ff',
+ '#4d8aff',
+ '#256dff',
+ '#0d5bff',
+ '#0046d8',
+ '#0037a6',
+ '#002874',
+ ],
+ dark: [
+ '#f8f9fa',
+ '#f1f3f5',
+ '#e9ecef',
+ '#dee2e6',
+ '#ced4da',
+ '#343a40',
+ '#2b3035',
+ '#212529',
+ '#161a1d',
+ '#0b0d0e',
+ ],
+ gray: [
+ '#f8fafc',
+ '#f1f5f9',
+ '#e2e8f0',
+ '#cbd5e1',
+ '#94a3b8',
+ '#64748b',
+ '#475569',
+ '#334155',
+ '#1f2937',
+ '#0f172a',
+ ],
+ },
+ components: {
+ Button: {
+ defaultProps: { radius: 'xl' },
+ styles: {
+ root: { fontWeight: 600 },
+ },
+ },
+ Paper: {
+ defaultProps: { radius: 'lg' },
+ },
+ Card: {
+ defaultProps: { radius: 'lg' },
+ },
+ Tooltip: {
+ defaultProps: { radius: 'md' },
+ },
+ },
});