From 4adb318926664a18a5cef07fda9c0496b5cc7cfc Mon Sep 17 00:00:00 2001 From: Tinh Nguyen Date: Wed, 22 Apr 2026 14:40:45 +0700 Subject: [PATCH 1/5] New Theme --- docs/5n-infra/index.md | 8 + docs/assets/fn/footer-logo.svg | 27 + docs/assets/fn/icon-5n-dashboard.svg | 3 + docs/assets/fn/icon-5n-infra.png | Bin 0 -> 36433 bytes docs/assets/fn/icon-5n-time-machine.svg | 6 + docs/assets/fn/icon-arrow.svg | 3 + docs/assets/fn/icon-coming-soon.svg | 3 + docs/assets/fn/icon-id-sdk.svg | 5 + docs/assets/fn/icon-loop-sdk.svg | 11 + docs/assets/fn/icon-search.svg | 3 + docs/assets/fn/logo.svg | 27 + docs/index.md | 17 +- docs/javascripts/fn-theme.js | 527 +++++++++ docs/stylesheets/fn-layout.css | 1388 +++++++++++++++++++++++ docs/stylesheets/fn-tokens.css | 157 +++ id-sdk | 1 + loop-sdk | 1 + mkdocs.yml | 37 +- overrides/home.html | 141 +++ overrides/main.html | 40 + overrides/partials/fn-footer.html | 62 + overrides/partials/fn-header.html | 98 ++ 22 files changed, 2537 insertions(+), 28 deletions(-) create mode 100644 docs/5n-infra/index.md create mode 100644 docs/assets/fn/footer-logo.svg create mode 100644 docs/assets/fn/icon-5n-dashboard.svg create mode 100644 docs/assets/fn/icon-5n-infra.png create mode 100644 docs/assets/fn/icon-5n-time-machine.svg create mode 100644 docs/assets/fn/icon-arrow.svg create mode 100644 docs/assets/fn/icon-coming-soon.svg create mode 100644 docs/assets/fn/icon-id-sdk.svg create mode 100644 docs/assets/fn/icon-loop-sdk.svg create mode 100644 docs/assets/fn/icon-search.svg create mode 100644 docs/assets/fn/logo.svg create mode 100644 docs/javascripts/fn-theme.js create mode 100644 docs/stylesheets/fn-layout.css create mode 100644 docs/stylesheets/fn-tokens.css create mode 160000 id-sdk create mode 160000 loop-sdk create mode 100644 overrides/home.html create mode 100644 overrides/main.html create mode 100644 overrides/partials/fn-footer.html create mode 100644 overrides/partials/fn-header.html diff --git a/docs/5n-infra/index.md b/docs/5n-infra/index.md new file mode 100644 index 0000000..8abacce --- /dev/null +++ b/docs/5n-infra/index.md @@ -0,0 +1,8 @@ +# 5N Infra + + +5N provides hosted node service where we can operate operator for you. Contact nodesupport@fivenorth.io for detail. + +## Canton Network + +5N is a Supper Validator on Canton network and we can also help with your onboarding to Canton by sponsoring your node. Contact nodesupport@fivenorth.io for detail \ No newline at end of file diff --git a/docs/assets/fn/footer-logo.svg b/docs/assets/fn/footer-logo.svg new file mode 100644 index 0000000..301ec21 --- /dev/null +++ b/docs/assets/fn/footer-logo.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/fn/icon-5n-dashboard.svg b/docs/assets/fn/icon-5n-dashboard.svg new file mode 100644 index 0000000..850be55 --- /dev/null +++ b/docs/assets/fn/icon-5n-dashboard.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/fn/icon-5n-infra.png b/docs/assets/fn/icon-5n-infra.png new file mode 100644 index 0000000000000000000000000000000000000000..e9807032a8a0f901b2b4e740ce62b99fc82f6de7 GIT binary patch literal 36433 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 Dk3;2~ literal 0 HcmV?d00001 diff --git a/docs/assets/fn/icon-5n-time-machine.svg b/docs/assets/fn/icon-5n-time-machine.svg new file mode 100644 index 0000000..926ce6e --- /dev/null +++ b/docs/assets/fn/icon-5n-time-machine.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/assets/fn/icon-arrow.svg b/docs/assets/fn/icon-arrow.svg new file mode 100644 index 0000000..6504ed2 --- /dev/null +++ b/docs/assets/fn/icon-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/fn/icon-coming-soon.svg b/docs/assets/fn/icon-coming-soon.svg new file mode 100644 index 0000000..c219901 --- /dev/null +++ b/docs/assets/fn/icon-coming-soon.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/fn/icon-id-sdk.svg b/docs/assets/fn/icon-id-sdk.svg new file mode 100644 index 0000000..ff499a4 --- /dev/null +++ b/docs/assets/fn/icon-id-sdk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/assets/fn/icon-loop-sdk.svg b/docs/assets/fn/icon-loop-sdk.svg new file mode 100644 index 0000000..94d5d4e --- /dev/null +++ b/docs/assets/fn/icon-loop-sdk.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/assets/fn/icon-search.svg b/docs/assets/fn/icon-search.svg new file mode 100644 index 0000000..3807844 --- /dev/null +++ b/docs/assets/fn/icon-search.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/fn/logo.svg b/docs/assets/fn/logo.svg new file mode 100644 index 0000000..960a29c --- /dev/null +++ b/docs/assets/fn/logo.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/index.md b/docs/index.md index 8abacce..fc393a2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,8 +1,9 @@ -# 5N Infra - - -5N provides hosted node service where we can operate operator for you. Contact nodesupport@fivenorth.io for detail. - -## Canton Network - -5N is a Supper Validator on Canton network and we can also help with your onboarding to Canton by sponsoring your node. Contact nodesupport@fivenorth.io for detail \ No newline at end of file +--- +template: home.html +title: Five North — Foundational Infrastructure for Decentralized Financial Networks +hide: + - navigation + - toc + - path + - footer +--- diff --git a/docs/javascripts/fn-theme.js b/docs/javascripts/fn-theme.js new file mode 100644 index 0000000..2011a2c --- /dev/null +++ b/docs/javascripts/fn-theme.js @@ -0,0 +1,527 @@ +/* ═══════════════════════════════════════════════════════════════ + FIVENORTH CUSTOM BEHAVIOR + - Theme toggle (Light ⇄ Dark) — default = dark + - Mobile hamburger menu + - Active tab highlight based on URL + - Hero grid animation (Home page only) + + Designed to survive MkDocs Material's `navigation.instant`, which + swaps the content on each navigation. We achieve this by + binding a SINGLE click listener to `document` (which is never + replaced) and dispatching via `closest()`. + ═══════════════════════════════════════════════════════════════ */ + +(function () { + 'use strict'; + + const FN_THEME_KEY = 'fn-theme'; + const SCHEME_LIGHT = 'default'; + const SCHEME_DARK = 'slate'; + + /* ═════════════════ Theme ═════════════════ */ + + function getStoredTheme() { + try { + const v = localStorage.getItem(FN_THEME_KEY); + return (v === 'light' || v === 'dark' || v === 'system') ? v : null; + } catch (_) { return null; } + } + + /* Dark is the default for first-time visitors. */ + function computeTheme() { + return getStoredTheme() || 'dark'; + } + + /* Resolve system preference to actual light/dark */ + function resolveTheme(theme) { + if (theme === 'system') { + return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'; + } + return theme; + } + + function applyTheme(theme) { + const resolved = resolveTheme(theme); + const scheme = resolved === 'light' ? SCHEME_LIGHT : SCHEME_DARK; + document.documentElement.setAttribute('data-md-color-scheme', scheme); + if (document.body) { + document.body.setAttribute('data-md-color-scheme', scheme); + } + } + + function saveTheme(theme) { + try { localStorage.setItem(FN_THEME_KEY, theme); } catch (_) {} + } + + /* Apply theme as early as possible to prevent FOUC. */ + applyTheme(computeTheme()); + + /* ═════════════════ Mobile menu helpers ═════════════════ */ + + function closeMobileMenu() { + const drawer = document.querySelector('[data-fn-mobile-nav]'); + const btn = document.querySelector('[data-fn-hamburger]'); + const line = btn && btn.querySelector('.fn-hamburger-line'); + if (drawer) drawer.classList.remove('fn-mobile-nav-open'); + if (line) line.classList.remove('fn-hamburger-open'); + if (btn) btn.setAttribute('aria-expanded', 'false'); + } + + function toggleMobileMenu(btn) { + const drawer = document.querySelector('[data-fn-mobile-nav]'); + const line = btn.querySelector('.fn-hamburger-line'); + if (!drawer || !line) return; + const open = drawer.classList.toggle('fn-mobile-nav-open'); + line.classList.toggle('fn-hamburger-open', open); + btn.setAttribute('aria-expanded', String(open)); + } + + /* ═════════════════ Mobile search overlay ═════════════════ + .fn-search-wrap is now a direct sibling of .fn-header__sticky at + body level — no backdrop-filter ancestor — so position:fixed is + always viewport-relative. We just toggle body.fn-mobile-search-active + and CSS turns .fn-search-wrap into a full-screen overlay. */ + + var _mobileSearchOpen = false; + + /* Material emits `` at body + level. Its search module is wired to that exact element via + `watchToggle(getElement("#__search"))`, so toggling it is how we tell + Material the search UI is active. */ + function setMdSearchToggle(on) { + var t = document.getElementById('__search'); + if (!t || t.checked === on) return; + t.checked = on; + t.dispatchEvent(new Event('change', { bubbles: true })); + } + + /* The real query field has NO id — it's tagged + `data-md-component="search-query"`. Earlier code used + `getElementById('__search')` which returned the hidden CHECKBOX, so + focus/value/input events went to the wrong element on mobile. */ + function getSearchInput() { + return document.querySelector('.md-search__input') + || document.querySelector('[data-md-component="search-query"]'); + } + + function closeMobileSearch() { + if (!_mobileSearchOpen) return; + _mobileSearchOpen = false; + document.body.classList.remove('fn-mobile-search-active'); + document.querySelectorAll('[data-fn-search-toggle]').forEach(function (b) { + b.setAttribute('aria-expanded', 'false'); + b.classList.remove('is-active'); + }); + setMdSearchToggle(false); + var q = getSearchInput(); + if (q) { + q.value = ''; + q.blur(); + q.dispatchEvent(new Event('input', { bubbles: true })); + } + } + + function resetMobileSearchState() { + _mobileSearchOpen = false; + document.body.classList.remove('fn-mobile-search-active'); + setMdSearchToggle(false); + document.querySelectorAll('[data-fn-search-toggle]').forEach(function (b) { + b.setAttribute('aria-expanded', 'false'); + b.classList.remove('is-active'); + }); + } + + function openMobileSearch() { + if (_mobileSearchOpen) return; + _mobileSearchOpen = true; + document.body.classList.add('fn-mobile-search-active'); + document.querySelectorAll('[data-fn-search-toggle]').forEach(function (b) { + b.setAttribute('aria-expanded', 'true'); + b.classList.add('is-active'); + }); + + /* Tell Material's search JS that search is active → enables result routing */ + setMdSearchToggle(true); + + /* Focus the real text input — wait for CSS display change to take effect */ + var q = getSearchInput(); + if (q) { + requestAnimationFrame(function () { + q.focus(); + var tries = 0; + var retry = setInterval(function () { + if (document.activeElement === q || ++tries > 8) { + clearInterval(retry); + } else { + q.focus(); + } + }, 50); + /* Dispatch input event so Material processes any pre-existing value + and activates its result pipeline on mobile. */ + q.dispatchEvent(new Event('input', { bubbles: true })); + }); + if (!q.dataset.fnMobileSearchEsc) { + q.dataset.fnMobileSearchEsc = '1'; + q.addEventListener('keydown', function (e) { + if (e.key === 'Escape') closeMobileSearch(); + }); + } + + /* Material's own × (type=reset) clears input but not our overlay. + Intercept the form reset and close our mobile search too. */ + var form = q.closest('form'); + if (form && !form._fnResetBound) { + form._fnResetBound = true; + form.addEventListener('reset', function () { + if (_mobileSearchOpen) { + /* Let the native reset clear input first, then close overlay */ + setTimeout(closeMobileSearch, 0); + } + }); + } + } + + /* Inject a search icon inside the form (once), positioned absolute on the left */ + var wrap = document.querySelector('[data-fn-search-wrap]'); + if (wrap && !wrap.querySelector('.fn-mobile-search-icon')) { + var searchIcon = document.createElement('span'); + searchIcon.className = 'fn-mobile-search-icon'; + searchIcon.setAttribute('aria-hidden', 'true'); + searchIcon.innerHTML = ''; + var form = wrap.querySelector('.md-search__form'); + if (form) form.insertBefore(searchIcon, form.firstChild); + } + + /* Inject a close button into the search wrap on mobile (once) */ + if (wrap && !wrap.querySelector('.fn-mobile-search-close')) { + var closeBtn = document.createElement('button'); + closeBtn.type = 'button'; + closeBtn.className = 'fn-mobile-search-close'; + closeBtn.setAttribute('aria-label', 'Close search'); + closeBtn.innerHTML = ''; + wrap.appendChild(closeBtn); + closeBtn.addEventListener('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + closeMobileSearch(); + }); + } + } + + function bindSearchToggleButtons() { + document.querySelectorAll('[data-fn-search-toggle]').forEach(function (btn) { + if (btn.dataset.fnSearchBound === '1') return; + btn.dataset.fnSearchBound = '1'; + btn.addEventListener('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + if (_mobileSearchOpen) { + closeMobileSearch(); + } else { + closeMobileMenu(); + openMobileSearch(); + } + }); + }); + } + + /* ═════════════════ Active tab highlight ═════════════════ */ + + function isActiveTab(href) { + if (!href) return false; + try { + const url = new URL(href, window.location.origin); + if (url.origin !== window.location.origin) return false; + const path = window.location.pathname.replace(/\/index\.html$/, '/'); + const target = url.pathname.replace(/\/index\.html$/, '/'); + if (target === '/' || target === '') return path === '/' || path === ''; + return path === target || path.startsWith(target); + } catch (_) { return false; } + } + + function updateActiveTabs() { + document.querySelectorAll('[data-fn-tab]').forEach(function (el) { + const href = el.getAttribute('href'); + if (isActiveTab(href)) el.classList.add('is-active'); + else el.classList.remove('is-active'); + }); + } + + /* ═════════════════ Hero grid animation ═════════════════ */ + + const GRID_CELLS = [ + { col: 2, row: 6, color: '#D3D8F3', order: 7, drop: 0 }, + { col: 4, row: 6, color: 'white', drop: 1 }, + { col: 6, row: 6, color: '#E4DCF9', order: 8, drop: 2 }, + { col: 1, row: 5, color: 'white', drop: 3 }, + { col: 3, row: 5, color: 'white', drop: 4 }, + { col: 5, row: 5, color: '#D5F4FE', order: 6, drop: 5 }, + { col: 4, row: 4, color: '#CAEEC8', order: 4, drop: 6 }, + { col: 6, row: 4, color: '#D3D8F3', order: 5, drop: 7 }, + { col: 3, row: 3, color: '#F2FF96', order: 3, drop: 8 }, + { col: 5, row: 3, color: 'white', drop: 9 }, + { col: 7, row: 3, color: 'white', drop: 10 }, + { col: 4, row: 2, color: '#E4DCF9', order: 1, drop: 11 }, + { col: 6, row: 2, color: '#D5F4FE', order: 2, drop: 12 }, + { col: 5, row: 1, color: 'white', drop: 13 }, + { col: 7, row: 1, color: '#CAEEC8', order: 0, drop: 14 }, + ]; + + const PHASE_DURATION = { drop: 3000, blink: 10000, fadeout: 1000, pause: 600 }; + const NEXT_PHASE = { drop: 'blink', blink: 'fadeout', fadeout: 'pause', pause: 'drop' }; + + let heroTimer = null; + + function buildHeroGrid(container) { + container.innerHTML = ''; + GRID_CELLS.forEach(function (cell) { + const el = document.createElement('div'); + const isColored = cell.order != null; + el.className = 'fn-grid-cell' + (isColored ? ' fn-grid-cell-active' : ''); + el.style.gridColumn = String(cell.col); + el.style.gridRow = String(cell.row); + el.style.setProperty('--cell-color', + isColored ? cell.color : 'var(--fn-surface-raised)'); + el.style.setProperty('--drop-i', String(cell.drop)); + if (isColored) el.style.setProperty('--cell-i', String(cell.order)); + container.appendChild(el); + }); + } + + function runHero(container) { + buildHeroGrid(container); + let phase = 'drop'; + container.className = 'fn-hero-grid fn-phase-' + phase; + (function step() { + heroTimer = setTimeout(function () { + phase = NEXT_PHASE[phase]; + container.className = 'fn-hero-grid fn-phase-' + phase; + if (phase === 'drop') buildHeroGrid(container); + step(); + }, PHASE_DURATION[phase]); + })(); + } + + function initHero() { + if (heroTimer) { clearTimeout(heroTimer); heroTimer = null; } + const container = document.querySelector('[data-fn-hero-grid]'); + const containerMobile = document.querySelector('[data-fn-hero-grid-mobile]'); + if (!container && !containerMobile) return; + /* Run a single shared phase loop; both grids mirror each other */ + let phase = 'drop'; + function buildBoth() { + if (container) buildHeroGrid(container); + if (containerMobile) buildHeroGrid(containerMobile); + } + buildBoth(); + if (container) container.className = 'fn-hero-grid fn-phase-' + phase; + if (containerMobile) containerMobile.className = 'fn-hero-grid fn-phase-' + phase; + (function step() { + heroTimer = setTimeout(function () { + phase = NEXT_PHASE[phase]; + if (container) container.className = 'fn-hero-grid fn-phase-' + phase; + if (containerMobile) containerMobile.className = 'fn-hero-grid fn-phase-' + phase; + if (phase === 'drop') buildBoth(); + step(); + }, PHASE_DURATION[phase]); + })(); + } + + /* ═════════════════ Sticky-bar "stuck" detection ═════════════ + The action bar (tabs + search) uses `position: sticky; top: 0`. + To show a subtle divider ONLY when it's actually pinned to the + viewport edge, we watch a 1px sentinel placed just above it. + When the sentinel scrolls out of view → bar is stuck. */ + + let stickyObserver = null; + + function initStickyBar() { + if (stickyObserver) { stickyObserver.disconnect(); stickyObserver = null; } + + const bar = document.querySelector('[data-fn-sticky-bar]'); + if (!bar) return; + + // Ensure a sentinel right above the bar, inside .fn-header. + let sentinel = document.querySelector('[data-fn-sticky-sentinel]'); + if (!sentinel) { + sentinel = document.createElement('div'); + sentinel.setAttribute('data-fn-sticky-sentinel', ''); + sentinel.style.cssText = 'height:1px;width:100%;pointer-events:none;'; + bar.parentNode.insertBefore(sentinel, bar); + } + + stickyObserver = new IntersectionObserver(function (entries) { + entries.forEach(function (entry) { + // When sentinel is NOT intersecting (scrolled out), bar is stuck. + if (!entry.isIntersecting) bar.classList.add('is-stuck'); + else bar.classList.remove('is-stuck'); + }); + }, { threshold: 0, rootMargin: '0px' }); + + stickyObserver.observe(sentinel); + } + + /* ═════════════════ Theme pill binding ═════════════════ + Each button in .fn-theme-pill carries data-fn-theme-opt="system|light|dark". + Clicking it saves + applies that theme and updates the active highlight. */ + + function updatePillActive() { + const current = computeTheme(); + document.querySelectorAll('[data-fn-theme-opt]').forEach(function (btn) { + const opt = btn.getAttribute('data-fn-theme-opt'); + btn.classList.toggle('is-active', opt === current); + }); + } + + function bindThemeButtons() { + document.querySelectorAll('[data-fn-theme-opt]').forEach(function (btn) { + if (btn.dataset.fnThemeBound === '1') return; + btn.dataset.fnThemeBound = '1'; + btn.addEventListener('click', function () { + const theme = btn.getAttribute('data-fn-theme-opt'); + applyTheme(theme); + saveTheme(theme); + updatePillActive(); + }); + }); + } + + function bindHamburgerButtons() { + document.querySelectorAll('[data-fn-hamburger]').forEach(function (btn) { + if (btn.dataset.fnHamBound === '1') return; + btn.dataset.fnHamBound = '1'; + btn.addEventListener('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + toggleMobileMenu(btn); + }); + }); + } + + /* ═════════════════ Per-page init ═════════════════ */ + + function initPage() { + applyTheme(computeTheme()); // reinforce after body swap + closeMobileMenu(); // reset drawer state on nav + resetMobileSearchState(); // hard-reset after instant-nav body swap + updateActiveTabs(); + updatePillActive(); // sync pill highlight + bindThemeButtons(); + bindHamburgerButtons(); + bindSearchToggleButtons(); + initHero(); + initStickyBar(); + } + + /* ═════════════════ Global (one-time) wiring ═════════════════ + These listeners attach to `document`, which is never swapped + by Material's instant navigation. Survives all DOM replacements. */ + + document.addEventListener('click', function (e) { + const target = e.target; + if (!(target instanceof Element)) return; + + // Search toggle (open/close mobile search bar) + const sTgl = target.closest('[data-fn-search-toggle]'); + if (sTgl) { + e.preventDefault(); + e.stopPropagation(); + if (_mobileSearchOpen) { + closeMobileSearch(); + } else { + closeMobileMenu(); + openMobileSearch(); + } + return; + } + + // Hamburger + const ham = target.closest('[data-fn-hamburger]'); + if (ham) { + e.preventDefault(); + closeMobileSearch(); // close search if open + toggleMobileMenu(ham); + return; + } + + // Mobile nav link → close drawer + const mLink = target.closest('[data-fn-mobile-nav] a'); + if (mLink) { + closeMobileMenu(); + } + + }, { capture: false }); + + /* ═════════════════ Bootstrap ═════════════════ */ + + /* Attach buttons immediately if any already exist (script may load after + parser has seen the header). No-op if not yet in DOM. */ + bindThemeButtons(); + bindHamburgerButtons(); + bindSearchToggleButtons(); + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initPage, { once: true }); + } else { + initPage(); + } + + /* Also re-bind whenever the header subtree is mutated (Material instant + navigation replaces body content; this catches it regardless of whether + document$ is available). */ + const mo = new MutationObserver(function () { + bindThemeButtons(); + bindHamburgerButtons(); + bindSearchToggleButtons(); + }); + if (document.body) { + mo.observe(document.body, { childList: true, subtree: true }); + } else { + document.addEventListener('DOMContentLoaded', function () { + mo.observe(document.body, { childList: true, subtree: true }); + }, { once: true }); + } + + /* Re-run per-page init after each instant-nav DOM swap. + Material exposes `document$` (RxJS-like observable) on the global + scope. We try a few access paths for robustness across versions. */ + function hookDocument$() { + try { + /* Material exposes `window.document$` after bootstrap. */ + const obs = window.document$ || null; + if (obs && typeof obs.subscribe === 'function') { + obs.subscribe(initPage); + return true; + } + } catch (_) {} + return false; + } + + if (!hookDocument$()) { + const iv = setInterval(function () { + if (hookDocument$()) clearInterval(iv); + }, 200); + setTimeout(function () { clearInterval(iv); }, 10000); + } + + /* Final safety net: if document$ is never exposed for some reason, + watch the URL. Material's instant nav does pushState, so popstate + + a MutationObserver on
will catch the swap. */ + let lastPath = location.pathname; + const urlCheck = function () { + if (location.pathname !== lastPath) { + lastPath = location.pathname; + initPage(); + } + }; + window.addEventListener('popstate', urlCheck); + // Patch pushState/replaceState so we can detect programmatic nav. + ['pushState', 'replaceState'].forEach(function (k) { + const orig = history[k]; + history[k] = function () { + const r = orig.apply(this, arguments); + setTimeout(urlCheck, 0); + return r; + }; + }); +})(); diff --git a/docs/stylesheets/fn-layout.css b/docs/stylesheets/fn-layout.css new file mode 100644 index 0000000..f522e5f --- /dev/null +++ b/docs/stylesheets/fn-layout.css @@ -0,0 +1,1388 @@ +/* ═══════════════════════════════════════════════════════════════ + FIVENORTH LAYOUT CSS + Semantic classes for Header, Footer, TabNav, Hero, Products. + Replaces Tailwind utility classes used in the original React code. + ═══════════════════════════════════════════════════════════════ */ + +/* ═══════════════════════════════════════════════════════════════ + GLOBAL SURFACE + Unify html/body and Material containers to fn-surface so there is + no "seam" between our custom header and Material's content areas. + ═══════════════════════════════════════════════════════════════ */ +html, +body { + background-color: var(--fn-surface); + color: var(--fn-fg); + font-family: var(--fn-font-sans); + transition: + background-color var(--fn-duration-base) var(--fn-ease), + color var(--fn-duration-base) var(--fn-ease); +} + +.md-container, +.md-main, +.md-main__inner, +.md-content, +.md-sidebar, +.md-sidebar__scrollwrap { + background-color: var(--fn-surface) !important; + color: var(--fn-fg); +} + +/* Material sidebars use `position: sticky; top: 2.4rem` by default (tuned + to Material's own header). Our sticky action bar is ~54px tall, so we + push the sidebar top offset down to match and prevent overlap when the + action bar is stuck. */ +.md-sidebar { + top: 56px !important; +} +@media (max-width: 959px) { + .md-sidebar { top: 0 !important; } +} + +/* ═══════════════════════════════════════════════════════════════ + HIDE MATERIAL DEFAULT HEADER / TABS / FOOTER + We render our own header/footer below. + ═══════════════════════════════════════════════════════════════ */ +.md-header, +.md-tabs, +.md-footer { + display: none !important; +} + +/* Adjust Material main container to account for our sticky header */ +.md-container { + padding-top: 0 !important; +} + +/* ═══════════════════════════════════════════════════════════════ + HEADER + ═══════════════════════════════════════════════════════════════ */ +/* Brand + sticky are now two separate direct children of . Body is + `display: flex; flex-direction: column; min-height: 100%` (Material's + default), and since spans the entire document height, a sticky + element inside body can bind to the viewport for the full scroll. */ + +/* ── Brand bar (NOT sticky) ───────────────────────────────────── */ +.fn-header__brand { + display: flex; + justify-content: center; + padding: 16px 20px 12px; + background-color: var(--fn-surface); + /* Body's align-items: stretch would otherwise try to equalize heights. + We want each bar to take its natural height. */ + flex: 0 0 auto; + align-self: stretch; +} + +.fn-header__brand-inner { + display: flex; + align-items: center; + gap: 24px; + max-width: var(--fn-max-w); + width: 100%; + min-width: 0; +} + +/* ── Sticky action bar (tabs + search + theme + hamburger) ───── */ +.fn-header__sticky { + display: flex; + justify-content: center; + position: sticky; + top: 0; + z-index: 50; + padding: 10px 20px; + background-color: var(--fn-surface-overlay); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + border-bottom: 1px solid transparent; + transition: border-color var(--fn-duration-fast) var(--fn-ease); + /* Critical for sticky-inside-flex-column: ensure this bar does NOT + stretch vertically — flex item would otherwise be stretched and + sticky behavior becomes unpredictable. */ + flex: 0 0 auto; + align-self: stretch; +} + +/* Subtle divider becomes visible only when actually stuck */ +.fn-header__sticky.is-stuck { + border-bottom-color: var(--fn-line-muted); +} + +.fn-header__sticky-inner { + display: flex; + align-items: center; + justify-content: space-between; + max-width: var(--fn-max-w); + width: 100%; + gap: 16px; +} + +/* Mobile nav drawer also needs flex-item sizing */ +.fn-mobile-nav { + flex: 0 0 auto; + align-self: stretch; +} + +.fn-logo-link { + display: inline-block; + flex: 0 0 auto; +} + +.fn-logo-img { + display: block; + height: 40px; + width: 168px; + max-width: 100%; + background-position: center; + background-repeat: no-repeat; + background-size: contain; + vertical-align: middle; +} + +.fn-header__title-wrap { + display: flex; + align-items: center; + height: 30px; + padding-left: 24px; + border-left: 1px solid var(--fn-line-divider); +} +@media (max-width: 767px) { + .fn-header__title-wrap { display: none; } +} + +.fn-header__title { + font-size: 14px; + font-weight: 600; + color: var(--fn-fg); +} + +.fn-header__right { + display: flex; + align-items: center; + gap: 12px; + position: relative; + z-index: 5; +} + +/* Neutralize Material's global click-blocker overlay. We render search as a + header dropdown (not fullscreen), so this overlay should never catch clicks. */ +.md-overlay { + display: none !important; + pointer-events: none !important; +} + +/* ── Clipboard / share toast notification ────────────────────── + Material uses inverted --md-default-fg/bg-color for .md-dialog, which + clashes with our custom tokens. Override with explicit high-contrast + values for both light and dark modes so the "Copied" message is always + readable. */ +.md-dialog { + background-color: #1e1e24 !important; + border: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4) !important; + border-radius: 8px !important; + padding: 8px 14px !important; +} + +.md-dialog__inner { + color: #f1f5f9 !important; + font-size: 0.75rem !important; + font-weight: 500; +} + +/* Light mode: invert to dark-text-on-light */ +[data-md-color-scheme="default"] .md-dialog { + background-color: #1a1a24 !important; +} +[data-md-color-scheme="default"] .md-dialog__inner { + color: #f8fafc !important; +} + +/* ═══════════════════════════════════════════════════════════════ + SEARCH WRAP + .fn-search-wrap is a direct body-level sibling of .fn-header__sticky + (no backdrop-filter ancestor → position:fixed is viewport-relative). + + Desktop: fixed at top-right of sticky bar. + Mobile: hidden off-screen (NOT display:none so Material can init); + slides in full-width when body.fn-mobile-search-active. + ═══════════════════════════════════════════════════════════════ */ +.fn-search-wrap { + position: fixed; + top: 0; + right: max(20px, calc((100vw - var(--fn-max-w)) / 2 + 20px)); + z-index: 55; + display: flex; + align-items: center; + height: 56px; + pointer-events: auto; +} + +@media (max-width: 767px) { + /* NOT display:none — keep in DOM so Material initialises the search worker. + Pushed off-screen to the right so it's invisible and non-interactive. */ + .fn-search-wrap { + right: -120vw; + pointer-events: none; + transition: right 0s; /* snap, no slide glitch on desktop */ + } + + /* ── Active: full-width search bar ── */ + body.fn-mobile-search-active .fn-search-wrap { + right: 0 !important; + left: 0 !important; + top: 0 !important; + height: 56px !important; + pointer-events: auto !important; + z-index: 300 !important; + background: var(--fn-surface) !important; + border-bottom: 1px solid var(--fn-line) !important; + padding: 0 12px 0 16px !important; + gap: 8px !important; + } + + /* Expand the form to fill the bar */ + body.fn-mobile-search-active .fn-search-wrap .md-search__form { + flex: 1 !important; + width: auto !important; + min-width: 0 !important; + height: 40px !important; + max-width: none !important; + font-size: 16px !important; /* prevents iOS auto-zoom on focus */ + background: var(--fn-surface-inset) !important; + border: 1.5px solid var(--fn-line) !important; + border-radius: var(--fn-radius-md) !important; + display: flex !important; + align-items: center !important; + padding: 0 !important; + } + + body.fn-mobile-search-active .fn-search-wrap .md-search__form:focus-within { + width: auto !important; + border-color: var(--fn-accent) !important; + } + + body.fn-mobile-search-active .fn-search-wrap .md-search__input { + font-size: 16px !important; + color: var(--fn-fg) !important; + background: transparent !important; + caret-color: var(--fn-accent) !important; + opacity: 1 !important; + pointer-events: auto !important; + width: 100% !important; + min-width: 0 !important; + padding: 0 12px !important; + text-align: left !important; + } + + /* Hide Material's icon label (has 2 SVGs that render weirdly on mobile) */ + body.fn-mobile-search-active .fn-search-wrap .md-search__icon[for="__search"] { + display: none !important; + } + + /* Hide all buttons inside the input (share + reset) — close is outside */ + body.fn-mobile-search-active .fn-search-wrap .md-search__options { + display: none !important; + } + + /* Custom search icon injected by JS — flex item inside the form row */ + .fn-mobile-search-icon { + display: none; + flex-shrink: 0; + align-items: center; + justify-content: center; + width: 18px; + height: 18px; + margin-left: 12px; + color: var(--fn-fg-muted); + pointer-events: none; + } + body.fn-mobile-search-active .fn-mobile-search-icon { + display: flex; + } + + /* Style the close (X) button */ + .fn-mobile-search-close { + flex-shrink: 0 !important; + width: 36px !important; + height: 36px !important; + border-radius: var(--fn-radius-md) !important; + background: transparent !important; + color: var(--fn-fg-secondary) !important; + border: none !important; + margin-left: 0 !important; + } + .fn-mobile-search-close:hover { color: var(--fn-fg) !important; } + + /* Results dropdown — force visible + full-width below the 60px bar. + Use position:fixed (not absolute) so the output escapes fn-search-wrap's + stacking context and sits in the root stacking context at z-index 9000, + above everything regardless of any parent overflow or stacking issues. */ + body.fn-mobile-search-active .fn-search-wrap .md-search__output { + display: block !important; + visibility: visible !important; + opacity: 1 !important; + pointer-events: auto !important; + position: fixed !important; + top: 60px !important; + left: 0 !important; + right: 0 !important; + bottom: 0 !important; + width: 100% !important; + height: auto !important; + max-height: calc(100dvh - 60px) !important; + border-radius: 0 !important; + box-shadow: none !important; + transform: none !important; + transition: none !important; + background: var(--fn-surface-raised) !important; + border-top: 1px solid var(--fn-line) !important; + overflow-y: auto !important; + z-index: 9000 !important; + } + + body.fn-mobile-search-active .fn-search-wrap .md-search__scrollwrap { + height: auto !important; + max-height: calc(100dvh - 60px) !important; + overflow-y: auto !important; + } + + /* Ensure result items are clearly visible on mobile */ + body.fn-mobile-search-active .fn-search-wrap .md-search-result { + background: transparent !important; + } + body.fn-mobile-search-active .fn-search-wrap .md-search-result__meta { + color: var(--fn-fg-muted) !important; + background: var(--fn-surface-raised) !important; + } + body.fn-mobile-search-active .fn-search-wrap .md-search-result__item { + background: transparent !important; + } + body.fn-mobile-search-active .fn-search-wrap .md-search-result__link { + color: var(--fn-fg) !important; + } + body.fn-mobile-search-active .fn-search-wrap .md-search-result__title { + color: var(--fn-fg) !important; + } + body.fn-mobile-search-active .fn-search-wrap .md-search-result__teaser { + color: var(--fn-fg-muted) !important; + } + + /* Base styles for the close button (overrides applied above in active state) */ + .fn-mobile-search-close { + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + padding: 0; + appearance: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: transparent; + } + .fn-mobile-search-close svg { pointer-events: none; } +} + +/* Contain Material's .md-search inside our wrapper. Material itself has + rules that float the form to the right on small screens; we neutralize + those because our wrapper sits inside a flex row. */ +.fn-search-wrap .md-search { + position: static !important; + padding: 0 !important; +} + +/* Kill ALL of Material's mobile/desktop overrides on .md-search__inner + so it renders inline inside our flex wrapper. + Material applies: position:fixed; left:100%; opacity:0; pointer-events:none + on small screens — we override everything with !important. */ +.fn-search-wrap .md-search__inner { + position: static !important; + top: auto !important; + left: auto !important; + right: auto !important; + bottom: auto !important; + width: auto !important; + height: auto !important; + margin: 0 !important; + padding: 0 !important; + float: none !important; + transform: none !important; + transition: none !important; + opacity: 1 !important; + pointer-events: auto !important; +} + +.fn-search-wrap .md-search__form { + position: relative; + display: flex; + align-items: center; + height: 32px; + width: 220px; + padding: 0 12px 0 32px; + border-radius: var(--fn-radius-md); + background: var(--fn-surface-inset); + border: 1px solid var(--fn-line); + box-shadow: none; + transition: + width 0.2s cubic-bezier(0.1, 0.7, 0.1, 1), + background-color var(--fn-duration-fast) var(--fn-ease), + border-color var(--fn-duration-fast) var(--fn-ease); +} + +.fn-search-wrap .md-search__form:hover { + border-color: var(--fn-line-divider); +} + +.fn-search-wrap .md-search__form:focus-within { + width: 360px; + border-color: var(--fn-accent); +} + +/* Search input */ +.fn-search-wrap .md-search__input { + position: static; + flex: 1; + min-width: 0; + height: 100%; + padding: 0; + background: transparent; + color: var(--fn-fg); + font-size: 12px; + font-family: inherit; + border: 0; + outline: none; + text-align: left !important; +} + +.fn-search-wrap .md-search__input::placeholder { + color: var(--fn-fg-muted); + opacity: 1; +} + +/* Search icon (magnifier) on the left */ +.fn-search-wrap .md-search__icon[for="__search"] { + position: absolute; + left: 10px; + top: 50%; + transform: translateY(-50%); + width: 16px; + height: 16px; + margin: 0; + padding: 0; + color: var(--fn-fg-muted); + cursor: text; +} + +.fn-search-wrap .md-search__icon[for="__search"] svg { + width: 16px; + height: 16px; +} + +/* Hide the "previous" (back arrow) icon that Material swaps in on mobile */ +.fn-search-wrap .md-search__icon[for="__search"] svg:nth-child(2) { + display: none; +} + +/* Options bar (share / reset) — keep reset button accessible on the right */ +.fn-search-wrap .md-search__options { + position: absolute; + right: 4px; + top: 0; + bottom: 0; + display: flex; + align-items: center; +} + +.fn-search-wrap .md-search__options > .md-icon { + width: 20px; + height: 20px; + padding: 0; + color: var(--fn-fg-muted); + opacity: 0; + pointer-events: none; + transition: opacity var(--fn-duration-fast) var(--fn-ease); +} + +.fn-search-wrap [data-md-toggle="search"]:checked ~ .md-header .md-search__options > .md-icon, +.fn-search-wrap .md-search__form:focus-within .md-search__options > .md-icon { + opacity: 1; + pointer-events: auto; +} + +/* The fullscreen overlay that Material dims the page with — hide entirely. + We use a dropdown (.md-search__output) instead of the fullscreen search + UX. Use !important because Material has multiple media-query rules that + re-assert position/size on this element. If it leaks visible it becomes + an invisible click-trap covering the theme button and surrounding area. */ +.fn-search-wrap .md-search__overlay, +.md-search__overlay, +label.md-search__overlay { + display: none !important; + visibility: hidden !important; + width: 0 !important; + height: 0 !important; + pointer-events: none !important; +} + +/* Results dropdown — float below the input as a dropdown, not fullscreen. + display:block !important prevents Material's mobile CSS from hiding it + (Material uses display:none on small screens via its own media queries). + We control visibility via opacity/pointer-events only. */ +.fn-search-wrap .md-search__output { + display: block !important; + visibility: visible !important; + position: absolute; + top: calc(100% + 6px); + right: 0; + width: min(520px, 90vw); + max-height: 70vh; + border-radius: var(--fn-radius-md); + background: var(--fn-surface-raised); + border: 1px solid var(--fn-line); + box-shadow: 0 12px 40px -8px rgba(0, 0, 0, 0.25); + overflow: hidden; + z-index: 60; + /* Hidden by default — only via opacity, NOT display */ + opacity: 0; + transform: translateY(-4px); + pointer-events: none; + transition: + opacity var(--fn-duration-fast) var(--fn-ease), + transform var(--fn-duration-fast) var(--fn-ease); +} + +/* Shown when: Material's search toggle is checked, OR the input has focus. + Material emits `#__search` (data-md-toggle="search") at body level, + which is a PRECEDING SIBLING of .fn-search-wrap, so `~` works here. Our + JS checks that same element on mobile open so Material's search JS also + activates result routing. */ +.fn-search-wrap:focus-within .md-search__output { + opacity: 1; + transform: translateY(0); + pointer-events: auto; +} + +.fn-search-wrap .md-search__scrollwrap { + max-height: 70vh; + overflow-x: hidden; + overflow-y: auto; + background: transparent; + width: 100%; +} + +.fn-search-wrap .md-search-result { + background: transparent; + color: var(--fn-fg); +} + +.fn-search-wrap .md-search-result__meta { + padding: 12px 16px; + font-size: 12px; + color: var(--fn-fg-muted); + background: transparent; + border-bottom: 1px solid var(--fn-line-muted); +} + +.fn-search-wrap .md-search-result__list { + margin: 0; + padding: 4px 0; + list-style: none; +} + +.fn-search-wrap .md-search-result__item { + box-shadow: none; + border-bottom: 1px solid var(--fn-line-muted); +} + +.fn-search-wrap .md-search-result__item:last-child { + border-bottom: none; +} + +.fn-search-wrap .md-search-result__link { + padding: 12px 16px !important; + background: transparent; + color: var(--fn-fg); + transition: background-color var(--fn-duration-fast) var(--fn-ease); +} + +.fn-search-wrap .md-search-result__article { + overflow: hidden; +} + +.fn-search-wrap .md-search-result__link:hover, +.fn-search-wrap .md-search-result__link:focus, +.fn-search-wrap .md-search-result__link[data-md-state="active"] { + background: var(--fn-surface-inset); +} + +.fn-search-wrap .md-search-result__article--document .md-search-result__title { + font-size: 14px; + font-weight: 600; + color: var(--fn-fg); + margin: 0; +} + +.fn-search-wrap .md-search-result__teaser { + font-size: 12px; + color: var(--fn-fg-secondary); + margin-top: 4px; + max-height: none; +} + +.fn-search-wrap .md-search-result mark { + color: var(--fn-accent); + background: transparent; + font-weight: 600; +} + +/* Hide suggest div's default positioning quirks */ +.fn-search-wrap .md-search__suggest { + opacity: 0; +} + +/* ── Theme toggle button ───────────────────────────────────── */ +/* ── Theme pill (System / Light / Dark) ────────────────────── + A capsule with 3 icon buttons. The active option gets a filled + background; others are ghost. Lives in the footer bottom bar. */ +.fn-theme-pill { + display: flex; + align-items: center; + gap: 2px; + padding: 3px; + background: var(--fn-surface-inset); + border: 1px solid var(--fn-line); + border-radius: 999px; + flex-shrink: 0; +} + +.fn-theme-pill__btn { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 999px; + border: none; + background: transparent; + color: var(--fn-fg-muted); + cursor: pointer; + padding: 0; + margin: 0; + font: inherit; + line-height: 0; + appearance: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: transparent; + transition: + background-color 0.15s ease, + color 0.15s ease; +} + +.fn-theme-pill__btn svg { + pointer-events: none; + display: block; +} + +/* Active state */ +.fn-theme-pill__btn.is-active { + background: var(--fn-accent); + color: #fff; +} + +/* Hover on inactive buttons */ +.fn-theme-pill__btn:not(.is-active):hover { + background: var(--fn-surface-raised); + color: var(--fn-fg); +} + +.fn-theme-pill__btn:focus-visible { + outline: 2px solid var(--fn-accent); + outline-offset: 2px; +} + +/* ── Old single-button styles removed — see fn-theme-pill above ── */ + +/* ── Hamburger button ──────────────────────────────────────── */ +.fn-hamburger { + position: relative; + box-sizing: border-box; + width: 32px; + height: 32px; + border-radius: var(--fn-radius-md); + border: 1px solid var(--fn-line); + background: var(--fn-surface-inset); + cursor: pointer; + display: none; + align-items: center; + justify-content: center; + padding: 0; + margin: 0; + flex-shrink: 0; + z-index: 1; + user-select: none; + -webkit-user-select: none; + -webkit-tap-highlight-color: transparent; + appearance: none; + -webkit-appearance: none; + transition: border-color var(--fn-duration-fast) var(--fn-ease); +} + +.fn-hamburger > span, +.fn-hamburger > span::before, +.fn-hamburger > span::after { + pointer-events: none; +} + +/* Invisible hit-area expansion for hamburger */ +.fn-hamburger::before { + content: ''; + position: absolute; + inset: -8px; + border-radius: calc(var(--fn-radius-md) + 8px); +} + +.fn-hamburger:hover { border-color: var(--fn-accent); } +.fn-hamburger:active { transform: scale(0.96); } +.fn-hamburger:focus-visible { + outline: 2px solid var(--fn-accent); + outline-offset: 2px; +} + +.fn-hamburger-line, +.fn-hamburger-line::before, +.fn-hamburger-line::after { + display: block; + width: 14px; + height: 1.5px; + background: var(--fn-fg-secondary); + border-radius: 1px; + transition: + transform var(--fn-duration-base) var(--fn-ease), + opacity var(--fn-duration-base) var(--fn-ease), + background-color var(--fn-duration-base) var(--fn-ease); +} + +.fn-hamburger-line { position: relative; } + +.fn-hamburger-line::before, +.fn-hamburger-line::after { + content: ''; + position: absolute; + left: 0; +} + +.fn-hamburger-line::before { transform: translateY(-4.5px); } +.fn-hamburger-line::after { transform: translateY(4.5px); } + +.fn-hamburger-line.fn-hamburger-open { + background: transparent; +} + +.fn-hamburger-line.fn-hamburger-open::before { + transform: rotate(45deg); +} + +.fn-hamburger-line.fn-hamburger-open::after { + transform: rotate(-45deg); +} + +/* ── Mobile nav drawer ─────────────────────────────────────── */ +.fn-mobile-nav { + display: none; +} + +/* Hamburger in brand bar — only on mobile, pushed right via margin-left: auto */ +.fn-hamburger--brand { + display: none; +} + +/* Mobile controls group (search icon + hamburger) */ +.fn-mobile-controls { + display: none; + align-items: center; + gap: 8px; + margin-left: auto; +} + +.fn-mobile-search-btn { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: var(--fn-radius-md); + border: 1px solid var(--fn-line); + background: var(--fn-surface-inset); + color: var(--fn-fg-secondary); + cursor: pointer; + padding: 0; + flex-shrink: 0; + appearance: none; + -webkit-appearance: none; + -webkit-tap-highlight-color: transparent; + transition: border-color var(--fn-duration-fast) var(--fn-ease), + color var(--fn-duration-fast) var(--fn-ease); +} + +.fn-mobile-search-btn svg { pointer-events: none; } +.fn-mobile-search-btn:hover { border-color: var(--fn-accent); color: var(--fn-accent); } +.fn-mobile-search-btn.is-active { border-color: var(--fn-accent); color: var(--fn-accent); } + +/* Mobile controls and nav */ +@media (max-width: 767px) { + .fn-mobile-controls { display: flex; } + .fn-hamburger--brand { display: flex; } + + /* Mobile nav drawer */ + .fn-mobile-nav { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows var(--fn-duration-base) var(--fn-ease-out); + border-top: 1px solid transparent; + } + + .fn-mobile-nav-open { + grid-template-rows: 1fr; + border-top-color: var(--fn-line); + } + + .fn-mobile-nav > div { + overflow: hidden; + } + + .fn-mobile-nav__list { + display: flex; + flex-direction: column; + gap: 4px; + padding: 16px 20px 20px; + } + + .fn-mobile-nav__link { + display: flex; + align-items: center; + border-radius: var(--fn-radius-md); + padding: 10px 16px; + font-size: 14px; + font-weight: 500; + color: var(--fn-fg); + text-decoration: none; + border: 1px solid transparent; + background: transparent; + transition: + color var(--fn-duration-fast) var(--fn-ease), + border-color var(--fn-duration-fast) var(--fn-ease); + } + + .fn-mobile-nav__link:hover { + border-color: var(--fn-line); + color: var(--fn-fg-secondary); + } + + .fn-mobile-nav__link.is-active { + border-color: var(--fn-line); + color: var(--fn-accent); + } +} + +/* ═══════════════════════════════════════════════════════════════ + TAB NAV (pill row) + ═══════════════════════════════════════════════════════════════ */ +.fn-tabnav { + display: flex; + flex-wrap: wrap; + gap: 4px; + min-width: 0; + flex: 1 1 auto; +} + +@media (max-width: 767px) { + .fn-tabnav { display: none; } +} + +.fn-tab { + align-content: center; + border-radius: 9999px; + padding: 8px 24px; + cursor: pointer; + color: var(--fn-fg); + text-decoration: none; + border: 1px solid transparent; + background: transparent; + transition: + color var(--fn-duration-fast) var(--fn-ease), + border-color var(--fn-duration-fast) var(--fn-ease); +} + +.fn-tab:hover { + border-color: var(--fn-line); + color: var(--fn-fg-secondary); +} + +.fn-tab.is-active { + border-color: var(--fn-line); + color: var(--fn-accent); +} + +.fn-tab__label { + font-size: 14px; + font-weight: 500; + text-align: center; + width: max-content; +} + +/* ═══════════════════════════════════════════════════════════════ + PAGE LAYOUT WRAPPERS + ═══════════════════════════════════════════════════════════════ */ +.fn-page { + font-synthesis: none; + display: flex; + flex-direction: column; + width: 100%; + min-height: 100vh; + background: var(--fn-surface); + color: var(--fn-fg); + -webkit-font-smoothing: antialiased; + font-size: 12px; + line-height: 1rem; +} + +.fn-main { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + padding: 24px 20px 54px 20px; + gap: 50px; +} + +@media (max-width: 1023px) { + .fn-main { + padding-top: 0; + } +} + +.fn-main__inner { + display: flex; + flex-direction: column; + max-width: var(--fn-max-w); + width: 100%; + gap: 112px; +} + +@media (max-width: 767px) { + .fn-main__inner { + gap: 32px; + } +} + +/* ═══════════════════════════════════════════════════════════════ + HERO SECTION + ═══════════════════════════════════════════════════════════════ */ +.fn-hero { + position: relative; +} + +.fn-hero__text { + display: flex; + flex-direction: column; + max-width: 800px; + gap: 15px; +} + +.fn-hero__title { + position: relative; + letter-spacing: -1px; + color: var(--fn-fg); + font-weight: 700; + font-size: 54px; + line-height: 120%; + max-width: 700px; + padding-bottom: 18px; + font-family: var(--fn-font-display); +} + +@media (max-width: 1023px) { + .fn-hero__title { font-size: 42px; line-height: 52px; } +} + +@media (max-width: 639px) { + .fn-hero__title { font-size: 32px; line-height: 40px; } +} + +.fn-hero__subtitle { + max-width: 600px; + color: var(--fn-fg-secondary); + font-size: 18px; + line-height: 160%; +} + +.fn-hero__bg-wrap { + position: absolute; + top: -40px; + right: 0; + width: 441px; + height: 441px; + pointer-events: none; +} + +@media (max-width: 1023px) { + .fn-hero__bg-wrap { display: none; } +} + +/* Mobile grid — visible only on small screens, above h1 */ +.fn-hero__bg-wrap--mobile { + position: relative; + top: auto; + right: auto; + width: 100%; + /* aspect-ratio 7:6 = 7 cols × 6 rows → cells are perfectly square */ + aspect-ratio: 7 / 6; + height: auto; + margin-bottom: 16px; + display: none; + overflow: hidden; +} + +@media (max-width: 1023px) { + .fn-hero__bg-wrap--mobile { + display: block; + } +} + +.fn-hero__bg-wrap--mobile .fn-hero-grid { + grid-template-columns: repeat(7, 1fr); + grid-template-rows: repeat(6, 1fr); + width: 100%; + height: 100%; +} + +/* ── Hero grid (animated) ──────────────────────────────────── */ +.fn-hero-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + grid-template-rows: repeat(7, 1fr); + width: 100%; + height: 100%; + clip-path: inset(-1px); +} + +.fn-grid-cell { + position: relative; + opacity: 0; +} + +.fn-grid-cell::before { + content: ''; + position: absolute; + inset: -0.5px; + border: 1px solid var(--fn-grid-line, var(--fn-line)); + pointer-events: none; + z-index: 1; +} + +.fn-grid-cell::after { + content: ''; + position: absolute; + inset: 0; + background-color: var(--cell-color); + opacity: var(--fn-cell-idle); + filter: var(--fn-cell-filter-idle); +} + +.fn-grid-cell-active::after { + opacity: var(--fn-cell-idle-active); +} + +/* Phase: drop */ +.fn-phase-drop .fn-grid-cell { + animation: fn-cell-drop 0.55s var(--fn-ease-out) calc(var(--drop-i, 0) * 120ms) forwards; +} + +@keyframes fn-cell-drop { + 0% { opacity: 0; transform: translate3d(0, -300px, 0); } + 30% { opacity: 1; } + 75% { transform: translate3d(0, 4px, 0); } + 90% { transform: translate3d(0, -2px, 0); } + 100% { opacity: 1; transform: translate3d(0, 0, 0); } +} + +/* Phase: blink */ +.fn-phase-blink .fn-grid-cell { + opacity: 1; +} + +.fn-phase-blink .fn-grid-cell-active { + animation: fn-cell-glow 9s ease-in-out calc(var(--cell-i, 0) * 1s) both; +} + +.fn-phase-blink .fn-grid-cell-active::after { + animation: fn-cell-fill 9s ease-in-out calc(var(--cell-i, 0) * 1s) both; +} + +@keyframes fn-cell-fill { + 0%, 14%, 100% { + opacity: var(--fn-cell-idle-active); + filter: var(--fn-cell-filter-idle); + } + 5%, 9% { + opacity: 1; + filter: var(--fn-cell-filter-glow); + } +} + +@keyframes fn-cell-glow { + 0%, 14%, 100% { + box-shadow: + inset 0 0 0 0 transparent, + 0 0 0 0 transparent; + } + 5%, 9% { + box-shadow: + inset 0 0 12px var(--fn-accent-glow), + 0 0 var(--fn-cell-halo-blur) var(--fn-cell-halo-spread) + color-mix(in srgb, var(--cell-color) var(--fn-cell-halo-strength), transparent); + } +} + +/* Phase: fadeout */ +.fn-phase-fadeout .fn-grid-cell { + opacity: 1; + animation: fn-cell-fadeout 0.8s var(--fn-ease) forwards; +} + +@keyframes fn-cell-fadeout { + to { opacity: 0; transform: scale(0.92); } +} + +/* Phase: pause */ +.fn-phase-pause .fn-grid-cell { + opacity: 0; +} + +/* ═══════════════════════════════════════════════════════════════ + PRODUCTS GRID + ═══════════════════════════════════════════════════════════════ */ +.fn-products { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(500px, 1fr)); + width: 100%; + gap: 24px; +} + +@media (max-width: 767px) { + .fn-products { + grid-template-columns: 1fr; + gap: 12px; + } +} + +.fn-card { + display: flex; + flex-direction: column; + gap: 24px; + padding: 48px; + border-radius: var(--fn-radius-md); + background: var(--fn-surface-raised); + border: 1px solid var(--fn-line); + text-decoration: none; + color: inherit; + transition: + transform var(--fn-duration-slow) var(--fn-ease-out), + border-color var(--fn-duration-slow) var(--fn-ease), + box-shadow var(--fn-duration-slow) var(--fn-ease), + background-color var(--fn-duration-base) var(--fn-ease), + color var(--fn-duration-base) var(--fn-ease); +} + +@media (max-width: 767px) { + .fn-card { + padding: 20px; + gap: 14px; + } +} + +.fn-card:hover { + transform: translateY(-6px); + border-color: var(--fn-accent-muted); + box-shadow: var(--fn-shadow-hover); +} + +.fn-card__icon-wrap { + display: flex; + align-items: center; + justify-content: center; + height: 100px; + width: 100px; + border-radius: 16px; + flex-shrink: 0; +} + +@media (max-width: 767px) { + .fn-card__icon-wrap { + height: 72px; + width: 72px; + border-radius: 12px; + } +} + +.fn-card__icon { + display: block; + background-position: center; + background-repeat: no-repeat; + background-size: contain; + flex-shrink: 0; +} + +.fn-card__body { + display: flex; + flex-direction: column; + gap: 8px; +} + +.fn-card__title { + letter-spacing: -0.48px; + font-weight: 700; + font-size: 24px; + line-height: 33.6px; + color: var(--fn-card-t-light, var(--fn-fg)); + transition: color var(--fn-duration-base) var(--fn-ease); +} + +[data-md-color-scheme="slate"] .fn-card__title { + color: var(--fn-card-t-dark, var(--fn-fg)); +} + +/* Per-card icon sizes (mirrors `iconClass` in src/site.ts) */ +.fn-card__icon--loop-sdk { height: 62px; width: 74px; } +.fn-card__icon--id-sdk { height: 20px; width: 70px; } +.fn-card__icon--5n-infra { height: 72px; width: 72px; background-size: cover; } +.fn-card__icon--5n-dashboard { height: 50px; width: 46px; } +.fn-card__icon--5n-time-machine{ height: 44px; width: 44px; } +.fn-card__icon--coming-soon { height: 36px; width: 36px; } + +.fn-card__desc { + color: var(--fn-fg-secondary); + font-size: 16px; + line-height: 25.6px; +} + +.fn-card__cta { + display: flex; + align-items: center; + margin-top: auto; + gap: 8px; +} + +.fn-card__cta-label { + color: var(--fn-fg); + font-weight: 700; + font-size: 14px; + line-height: 16.8px; + flex-shrink: 0; +} + +.fn-card__cta-icon { + display: block; + width: 20px; + height: 20px; + background-position: center; + background-repeat: no-repeat; + background-size: contain; + flex-shrink: 0; + filter: var(--fn-logo-filter); +} + +/* ═══════════════════════════════════════════════════════════════ + FOOTER + ═══════════════════════════════════════════════════════════════ */ +.fn-footer { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + padding: 64px 20px 32px 20px; + background: var(--fn-surface-section); + border-top: 1px solid var(--fn-line-muted); +} + +.fn-footer__inner { + display: flex; + flex-direction: column; + max-width: var(--fn-max-w); + width: 100%; + gap: 48px; +} + +.fn-footer__top { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 32px; +} + +.fn-footer__links { + display: flex; + gap: 24px; + flex-wrap: wrap; +} + +.fn-footer__link { + font-size: 14px; + color: var(--fn-fg-secondary); + text-decoration: none; + transition: color var(--fn-duration-fast) var(--fn-ease); +} + +.fn-footer__link:hover { + color: var(--fn-fg); +} + +.fn-footer__bottom { + display: flex; + align-items: center; + justify-content: space-between; + padding-top: 32px; + border-top: 1px solid var(--fn-line-muted); +} + +.fn-footer__copyright { + font-size: 12px; + letter-spacing: 0.24px; + color: var(--fn-fg-muted); +} + +/* ═══════════════════════════════════════════════════════════════ + DOCS PAGE TWEAKS + ═══════════════════════════════════════════════════════════════ */ + +/* Keep docs pages breathing room under the sticky header */ +.md-main { + padding-top: 0.6rem; +} + +/* Align Material's text on content pages with fn tokens */ +.md-typeset { + color: var(--fn-fg); +} + +.md-typeset h1, +.md-typeset h2, +.md-typeset h3, +.md-typeset h4, +.md-typeset h5, +.md-typeset h6 { + color: var(--fn-fg); +} + +.md-nav__link, +.md-nav__title { + color: var(--fn-fg-secondary); +} + +.md-nav__link:hover, +.md-nav__link--active { + color: var(--fn-accent); +} diff --git a/docs/stylesheets/fn-tokens.css b/docs/stylesheets/fn-tokens.css new file mode 100644 index 0000000..0eafdf1 --- /dev/null +++ b/docs/stylesheets/fn-tokens.css @@ -0,0 +1,157 @@ +/* ═══════════════════════════════════════════════════════════════ + FIVENORTH DESIGN TOKENS + Ported from 5n-fivenorth-io/src/app.css. + Integrates with MkDocs Material palette via [data-md-color-scheme]. + ═══════════════════════════════════════════════════════════════ */ + +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Inter+Tight:wght@800;900&display=swap'); + +/* ── Primitive tokens (constant, theme-independent) ────────── */ +:root { + --fn-accent: #407AEF; + --fn-accent-muted: rgba(64, 122, 239, 0.35); + --fn-accent-glow: rgba(64, 122, 239, 0.15); + + --fn-radius-md: 8px; + + --fn-duration-fast: 200ms; + --fn-duration-base: 350ms; + --fn-duration-slow: 400ms; + + --fn-ease: ease; + --fn-ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94); + + --fn-shadow-hover: 0 12px 40px -8px var(--fn-accent-glow); + + --fn-max-w: 61rem; /* matches Material's .md-grid max-width exactly */ + + --fn-font-sans: 'Inter', system-ui, sans-serif; + --fn-font-display: 'Inter Tight', 'Inter', system-ui, sans-serif; +} + +/* ── Semantic tokens · Light (Material "default") ──────────── */ +[data-md-color-scheme="default"] { + --fn-surface: #FFFFFF; + --fn-surface-raised: #F9FAFB; + --fn-surface-overlay: rgba(255, 255, 255, 0.8); + --fn-surface-inset: #F3F4F6; + --fn-surface-section: #F9FAFB; + + --fn-fg: #111827; + --fn-fg-secondary: #6B7280; + --fn-fg-muted: #9CA3AF; + + --fn-line: #E5E7EB; + --fn-line-muted: #E5E7EB; + --fn-line-divider: #D1D5DB; + + --fn-grid-line: #C9CDD4; + + --fn-cell-idle: 0.35; + --fn-cell-idle-active: 0.45; + --fn-cell-filter-idle: saturate(1) brightness(1); + --fn-cell-filter-glow: saturate(1.1) brightness(0.93); + --fn-cell-halo-blur: 22px; + --fn-cell-halo-spread: 3px; + --fn-cell-halo-strength: 65%; + + --fn-logo-filter: brightness(0); +} + +/* ── Semantic tokens · Dark (Material "slate") ─────────────── */ +[data-md-color-scheme="slate"] { + --fn-surface: #111113; + --fn-surface-raised: #141517; + --fn-surface-overlay: rgba(17, 17, 19, 0.8); + --fn-surface-inset: #1B1B1D; + --fn-surface-section: #111113; + + --fn-fg: #F8FAFC; + --fn-fg-secondary: #94A3B8; + --fn-fg-muted: #666666; + + --fn-line: #21242B; + --fn-line-muted: #191B21; + --fn-line-divider: #272626; + + --fn-grid-line: #21242B; + + --fn-cell-idle: 0.08; + --fn-cell-idle-active: 0.15; + --fn-cell-filter-idle: saturate(1) brightness(1); + --fn-cell-filter-glow: saturate(1) brightness(1); + --fn-cell-halo-blur: 10px; + --fn-cell-halo-spread: 1px; + --fn-cell-halo-strength: 30%; + + --fn-logo-filter: none; + + /* ── Material palette overrides for slate scheme ────────────── + Because we disabled Material's built-in `palette:` to keep our + custom JS as the single source of truth, we need to remap + Material's own CSS variables to our dark tokens — otherwise + sticky bars (.md-nav__title), admonitions, code blocks, etc. + keep their default LIGHT values and bleed through in dark mode + (the "white streak" at the top of the sidebars). */ + --md-default-bg-color: #111113; + --md-default-bg-color--light: rgba(17, 17, 19, 0.7); + --md-default-bg-color--lighter:rgba(17, 17, 19, 0.3); + --md-default-bg-color--lightest:rgba(17, 17, 19, 0.12); + + --md-default-fg-color: #F8FAFC; + --md-default-fg-color--light: #94A3B8; + --md-default-fg-color--lighter:#666666; + --md-default-fg-color--lightest:#2E333C; + + --md-primary-fg-color: #407AEF; + --md-primary-bg-color: #F8FAFC; + --md-accent-fg-color: #407AEF; + --md-accent-bg-color: #F8FAFC; + + --md-typeset-color: #F8FAFC; + --md-typeset-a-color: #407AEF; + --md-typeset-table-color: rgba(255, 255, 255, 0.12); + --md-typeset-table-color--light:rgba(255, 255, 255, 0.035); + --md-typeset-mark-color: rgba(64, 122, 239, 0.28); + + --md-code-fg-color: #E2E8F0; + --md-code-bg-color: #1B1B1D; + --md-code-hl-color: rgba(64, 122, 239, 0.3); + + --md-admonition-fg-color: #F8FAFC; + --md-admonition-bg-color: #141517; + + --md-footer-fg-color: #F8FAFC; + --md-footer-fg-color--light: #94A3B8; + --md-footer-fg-color--lighter: #666666; + --md-footer-bg-color: #111113; + --md-footer-bg-color--dark: #0A0A0C; +} + +/* ── Global element smoothing ──────────────────────────────── */ +* { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +html { scroll-behavior: smooth; } + +/* Smooth theme transition for all themed elements */ +.fn-t { + transition: + background-color var(--fn-duration-base) var(--fn-ease), + color var(--fn-duration-base) var(--fn-ease), + border-color var(--fn-duration-base) var(--fn-ease), + filter var(--fn-duration-base) var(--fn-ease); +} + +/* Logo filter inversion (svg/png logos stay legible on both themes) */ +.fn-logo { + filter: var(--fn-logo-filter); + transition: filter var(--fn-duration-base) var(--fn-ease); +} + +/* Background-image icon sizing */ +.fn-icon { + background-size: round(100%, 0.5px) round(100%, 0.5px); +} diff --git a/id-sdk b/id-sdk new file mode 160000 index 0000000..6d0a8ef --- /dev/null +++ b/id-sdk @@ -0,0 +1 @@ +Subproject commit 6d0a8efbcc969e9cba6b080793d4b8c40da156c4 diff --git a/loop-sdk b/loop-sdk new file mode 160000 index 0000000..1a1309b --- /dev/null +++ b/loop-sdk @@ -0,0 +1 @@ +Subproject commit 1a1309b74d1aee27c8670d215feeca4b9c046d50 diff --git a/mkdocs.yml b/mkdocs.yml index 1d76cdb..00cbb0c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,9 +1,20 @@ site_name: Operating Documents site_url: https://www.fivenorthgroup.com/ + +watch: + - overrides + extra_css: + - stylesheets/fn-tokens.css + - stylesheets/fn-layout.css - stylesheets/extra.css + +extra_javascript: + - javascripts/fn-theme.js + theme: name: material + custom_dir: overrides font: text: Inter Tight code: Red Hat Mono @@ -32,25 +43,10 @@ theme: - search.suggest - toc.follow - palette: - # Dark Mode - - media: "(prefers-color-scheme: light)" - scheme: slate - toggle: - icon: material/weather-sunny - name: Dark mode - primary: black - accent: black - - # Light Mode - - media: "(prefers-color-scheme: dark)" - scheme: default - toggle: - icon: material/weather-night - name: Light mode - primary: black - accent: black - + # Theme switching is handled by fn-theme.js (docs/javascripts/fn-theme.js). + # We deliberately DO NOT declare a `palette:` here so Material doesn't + # auto-apply a scheme on load or render its own palette switcher — that + # would fight the fivenorth theme toggle. plugins: - search @@ -86,8 +82,9 @@ markdown_extensions: copyright: Copyright © 2025 Five North Group nav: + - Home: index.md - 5N Infra: - - index.md + - 5n-infra/index.md - Hosted Node: hosted-node/hosted-node-access.md - Sandbox: sandbox/sandbox-access.md - Sponsor: diff --git a/overrides/home.html b/overrides/home.html new file mode 100644 index 0000000..753bcc3 --- /dev/null +++ b/overrides/home.html @@ -0,0 +1,141 @@ +{# + Home landing page template. + Ported from 5n-fivenorth-io/src/LandingPage.tsx (HeroSection + ProductsSection). + Used on any markdown page with `template: home.html` front-matter. +#} +{% extends "main.html" %} + +{# Product list — mirrors PRODUCTS array in site.ts. #} +{% set fn_products = [ + { + 'id': 'loop-sdk', + 'title': 'Loop SDK', + 'title_color': '#F2FF96', 'title_color_light': '#4D5A0A', + 'icon_bg': '#1E293B', + 'icon_url': 'assets/fn/icon-loop-sdk.svg', + 'icon_class': 'fn-card__icon--loop-sdk', + 'description': 'Loop SDK is a lightweight JavaScript client that allows dApps to securely connect to the Loop wallet. The SDK also includes a server-side signing flow for integrators who want to sign and submit transactions without a wallet popup.', + 'docs_url': 'loop-sdk/overview/' + }, + { + 'id': 'id-sdk', + 'title': 'ID SDK', + 'title_color': '#97E4FE', 'title_color_light': '#0369A1', + 'icon_bg': '#97E4FE', + 'icon_url': 'assets/fn/icon-id-sdk.svg', + 'icon_class': 'fn-card__icon--id-sdk', + 'description': 'The 5N ID service provides secure, tamper-proof identity verification and credential management through smart contracts on the Canton network.', + 'docs_url': 'id-sdk/introduction/' + }, + { + 'id': '5n-infra', + 'title': '5N Infra', + 'title_color': '#528BFF', 'title_color_light': '#1D4ED8', + 'icon_bg': '#042A77', + 'icon_url': 'assets/fn/icon-5n-infra.png', + 'icon_class': 'fn-card__icon--5n-infra', + 'is_img': true, + 'description': '5N provides hosted node service where we can operate operator for you. Contact nodesupport@fivenorth.io for detail.', + 'docs_url': '5n-infra/' + }, + { + 'id': '5n-dashboard', + 'title': '5N Dashboard', + 'title_color': '#E4DCF9', 'title_color_light': '#6D28D9', + 'icon_bg': '#E4DCF9', + 'icon_url': 'assets/fn/icon-5n-dashboard.svg', + 'icon_class': 'fn-card__icon--5n-dashboard', + 'description': 'The goal of the 5N Dashboard is to give developers and administrators the tools needed to effectively deploy, monitor, maintain, and back up both the node and their Canton‑based applications.', + 'docs_url': '5n-dashboard/introduction/' + }, + { + 'id': '5n-time-machine', + 'title': '5N Time Machine', + 'title_color': '#F0FCF0', 'title_color_light': '#15803D', + 'icon_bg': '#F0FCF0', + 'icon_url': 'assets/fn/icon-5n-time-machine.svg', + 'icon_class': 'fn-card__icon--5n-time-machine', + 'description': '5N Time Machine subscribes to your ledger, gets all the updates, and saves them into a Postgres database in a schema called time_machine.', + 'docs_url': '5n-timemachine/introduction/' + }, + { + 'id': 'coming-soon', + 'title': 'Coming Soon', + 'title_color': '#F8FAFC', 'title_color_light': '#374151', + 'icon_bg': '#161920', + 'icon_url': 'assets/fn/icon-coming-soon.svg', + 'icon_class': 'fn-card__icon--coming-soon', + 'description': 'More products are coming soon...' + } +] %} + +{% block container %} +
+
+
+
+ + {# ── Hero section ── #} +
+ + {# Grid mobile — shown above h1, hidden on desktop #} + + +
+

+ Foundational infrastructure for decentralized financial networks. +

+

+ At Five North Infrastructure, we're engineering the foundational + systems that empower next-generation financial networks: + Decentralized, privacy-preserving, and tailored for institutional scale. +

+
+ +
+ + {# ── Products grid ── #} +
+ {% for p in fn_products %} + {% if p.docs_url %} + + {% else %} + + {% endif %} + {% endfor %} +
+ +
+
+
+
+{% endblock %} diff --git a/overrides/main.html b/overrides/main.html new file mode 100644 index 0000000..fcf7737 --- /dev/null +++ b/overrides/main.html @@ -0,0 +1,40 @@ +{# + Global template override for all MkDocs Material pages. + - Replaces the default Material header with the fivenorth header (includes pill tabs). + - Replaces the default Material footer with the fivenorth footer. + - Removes Material's announcement bar and default tabs row. +#} +{% extends "base.html" %} + +{# Apply theme synchronously in to prevent flash-of-wrong-theme. + Must stay in sync with docs/javascripts/fn-theme.js. #} +{% block extrahead %} + {{ super() }} + +{% endblock %} + +{% block announce %}{% endblock %} + +{% block header %} + {% include "partials/fn-header.html" %} +{% endblock %} + +{% block tabs %}{% endblock %} + +{% block footer %} + {% include "partials/fn-footer.html" %} +{% endblock %} diff --git a/overrides/partials/fn-footer.html b/overrides/partials/fn-footer.html new file mode 100644 index 0000000..dd03b3f --- /dev/null +++ b/overrides/partials/fn-footer.html @@ -0,0 +1,62 @@ +{# + Fivenorth custom footer. + Ported from 5n-fivenorth-io/src/sections/Footer.tsx. +#} +{% set fn_footer_links = [ + { 'label': 'About', 'url': 'https://www.fivenorthdigital.com/' }, + { 'label': 'Contact', 'url': 'https://www.fivenorthdigital.com/for-developers' } +] %} + +
+ +
diff --git a/overrides/partials/fn-header.html b/overrides/partials/fn-header.html new file mode 100644 index 0000000..af2aa5c --- /dev/null +++ b/overrides/partials/fn-header.html @@ -0,0 +1,98 @@ +{# + Fivenorth custom header — FOUR sibling elements at body level: + + 1.
— logo + title, scrolls away. + 2.
— tabs sticky bar. + 3.
— search component (sibling, NOT inside + .fn-header__sticky which has backdrop- + filter; placing it here lets position:fixed + work relative to the real viewport). + 4.
— hamburger drawer. +#} +{% set fn_tabs = [ + { 'label': 'Home', 'href': '' | url }, + { 'label': '5N Infra', 'href': '5n-infra/' | url }, + { 'label': '5N Dashboard', 'href': '5n-dashboard/introduction/' | url }, + { 'label': 'Loop SDK', 'href': 'loop-sdk/overview/' | url }, + { 'label': 'ID SDK', 'href': 'id-sdk/introduction/' | url }, + { 'label': '5N Time Machine', 'href': '5n-timemachine/introduction/' | url } +] %} + +{# ── 1. Brand bar (scrolls with page) ────────────────────────── #} + + +{# ── 2. Sticky action bar ───────────────────────────────────────── + MUST be a
tag: Material's search worker calls + R("header [for=__search]") on init. We satisfy it with a hidden stub + label so the real .fn-search-wrap can live OUTSIDE this element. #} + + +{# ── 3. Search wrap — sibling of .fn-header__sticky ────────────── + The toggle checkbox `#__search` is emitted automatically by Material's + base.html at body level (before this header), so the CSS sibling + selector `[data-md-toggle="search"]:checked ~ .fn-search-wrap ...` + still works — no need for our own duplicate toggle. + + No backdrop-filter ancestor → position:fixed works vs viewport. + Desktop: fixed, right-aligned, same height as sticky bar. + Mobile: fixed full-screen overlay when fn-mobile-search-active. #} +
+ {% include "partials/search.html" %} +
+ +{# ── 5. Mobile nav drawer ─────────────────────────────────────── #} +
+
+
+ {% for tab in fn_tabs %} + + {{ tab.label }} + + {% endfor %} +
+
+
From 5df6c4da60a40bea5515d2e23f2958442507273d Mon Sep 17 00:00:00 2001 From: Tinh Nguyen Date: Wed, 22 Apr 2026 14:56:37 +0700 Subject: [PATCH 2/5] Update --- docs/stylesheets/fn-layout.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/stylesheets/fn-layout.css b/docs/stylesheets/fn-layout.css index f522e5f..736ca43 100644 --- a/docs/stylesheets/fn-layout.css +++ b/docs/stylesheets/fn-layout.css @@ -69,8 +69,7 @@ body { justify-content: center; padding: 16px 20px 12px; background-color: var(--fn-surface); - /* Body's align-items: stretch would otherwise try to equalize heights. - We want each bar to take its natural height. */ + border-bottom: 1px solid #2e323c; flex: 0 0 auto; align-self: stretch; } From 1d6381752464ebf97fb1b3abb9b321cc769109cc Mon Sep 17 00:00:00 2001 From: Tinh Nguyen Date: Wed, 22 Apr 2026 15:13:53 +0700 Subject: [PATCH 3/5] Search --- docs/javascripts/fn-theme.js | 41 ++++++++++++++++++++++++++++++++++ docs/stylesheets/fn-layout.css | 38 +++++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/docs/javascripts/fn-theme.js b/docs/javascripts/fn-theme.js index 2011a2c..e8fbe7b 100644 --- a/docs/javascripts/fn-theme.js +++ b/docs/javascripts/fn-theme.js @@ -398,6 +398,46 @@ }); } + /* ═════════════════ Desktop search shortcut (⌘K / Ctrl+K) ═════════════════ */ + + var _searchShortcutBound = false; + + function initDesktopSearchShortcut() { + /* Inject ⌘K badge into the search form (once) */ + var form = document.querySelector('.fn-search-wrap .md-search__form'); + if (form && !form.querySelector('.fn-search-kbd')) { + var kbd = document.createElement('span'); + kbd.className = 'fn-search-kbd'; + kbd.setAttribute('aria-hidden', 'true'); + var isMac = /Mac|iPhone|iPod|iPad/.test(navigator.platform || ''); + kbd.innerHTML = isMac + ? 'K' + : 'CtrlK'; + form.appendChild(kbd); + } + + if (_searchShortcutBound) return; + _searchShortcutBound = true; + + document.addEventListener('keydown', function (e) { + /* Only on desktop (search wrap is visible) */ + if (window.innerWidth <= 767) return; + if ((e.metaKey || e.ctrlKey) && e.key === 'k') { + e.preventDefault(); + var q = getSearchInput(); + if (q) { + q.focus(); + q.select(); + } + } + /* Escape blurs the input */ + if (e.key === 'Escape') { + var q = getSearchInput(); + if (q && document.activeElement === q) q.blur(); + } + }); + } + /* ═════════════════ Per-page init ═════════════════ */ function initPage() { @@ -411,6 +451,7 @@ bindSearchToggleButtons(); initHero(); initStickyBar(); + initDesktopSearchShortcut(); } /* ═════════════════ Global (one-time) wiring ═════════════════ diff --git a/docs/stylesheets/fn-layout.css b/docs/stylesheets/fn-layout.css index 736ca43..7db675c 100644 --- a/docs/stylesheets/fn-layout.css +++ b/docs/stylesheets/fn-layout.css @@ -67,7 +67,7 @@ body { .fn-header__brand { display: flex; justify-content: center; - padding: 16px 20px 12px; + padding: 16px 0 12px; background-color: var(--fn-surface); border-bottom: 1px solid #2e323c; flex: 0 0 auto; @@ -81,6 +81,7 @@ body { max-width: var(--fn-max-w); width: 100%; min-width: 0; + padding: 0 20px; } /* ── Sticky action bar (tabs + search + theme + hamburger) ───── */ @@ -90,7 +91,7 @@ body { position: sticky; top: 0; z-index: 50; - padding: 10px 20px; + padding: 10px 0; background-color: var(--fn-surface-overlay); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); @@ -115,6 +116,7 @@ body { max-width: var(--fn-max-w); width: 100%; gap: 16px; + padding: 0 20px; } /* Mobile nav drawer also needs flex-item sizing */ @@ -482,6 +484,38 @@ body { display: none; } +/* ⌘K / Ctrl+K badge inside the search input */ +.fn-search-kbd { + display: flex; + align-items: center; + gap: 2px; + flex-shrink: 0; + pointer-events: none; + margin-right: 2px; +} + +.fn-search-kbd kbd { + display: inline-flex; + align-items: center; + justify-content: center; + height: 18px; + min-width: 18px; + padding: 0 4px; + border-radius: 4px; + border: 1px solid var(--fn-line-divider); + background: var(--fn-surface-raised); + color: var(--fn-fg-muted); + font-size: 10px; + font-family: inherit; + line-height: 1; + font-style: normal; +} + +/* Hide badge when input has focus (user is typing) */ +.fn-search-wrap .md-search__form:focus-within .fn-search-kbd { + display: none; +} + /* Options bar (share / reset) — keep reset button accessible on the right */ .fn-search-wrap .md-search__options { position: absolute; From 3621caf87b1a27c5a7c68c11bb0c652d90dc67cc Mon Sep 17 00:00:00 2001 From: Tinh Nguyen Date: Wed, 22 Apr 2026 15:31:49 +0700 Subject: [PATCH 4/5] Update Live --- docs/javascripts/fn-theme.js | 22 +++++++++++++--- docs/stylesheets/fn-layout.css | 48 +++++++++++++++++++++++++++------- overrides/main.html | 2 +- 3 files changed, 58 insertions(+), 14 deletions(-) diff --git a/docs/javascripts/fn-theme.js b/docs/javascripts/fn-theme.js index e8fbe7b..d6efd48 100644 --- a/docs/javascripts/fn-theme.js +++ b/docs/javascripts/fn-theme.js @@ -27,9 +27,9 @@ } catch (_) { return null; } } - /* Dark is the default for first-time visitors. */ + /* Follow OS preference for first-time visitors. */ function computeTheme() { - return getStoredTheme() || 'dark'; + return getStoredTheme() || 'system'; } /* Resolve system preference to actual light/dark */ @@ -56,6 +56,16 @@ /* Apply theme as early as possible to prevent FOUC. */ applyTheme(computeTheme()); + /* Re-apply when OS theme changes (only takes effect when user chose 'system') */ + try { + window.matchMedia('(prefers-color-scheme: light)').addEventListener('change', function () { + if (computeTheme() === 'system') { + applyTheme('system'); + updatePillActive(); + } + }); + } catch (_) {} + /* ═════════════════ Mobile menu helpers ═════════════════ */ function closeMobileMenu() { @@ -83,6 +93,7 @@ and CSS turns .fn-search-wrap into a full-screen overlay. */ var _mobileSearchOpen = false; + var _searchFocusRetry = null; /* Material emits `` at body level. Its search module is wired to that exact element via @@ -107,6 +118,7 @@ function closeMobileSearch() { if (!_mobileSearchOpen) return; _mobileSearchOpen = false; + if (_searchFocusRetry) { clearInterval(_searchFocusRetry); _searchFocusRetry = null; } document.body.classList.remove('fn-mobile-search-active'); document.querySelectorAll('[data-fn-search-toggle]').forEach(function (b) { b.setAttribute('aria-expanded', 'false'); @@ -149,9 +161,11 @@ requestAnimationFrame(function () { q.focus(); var tries = 0; - var retry = setInterval(function () { + if (_searchFocusRetry) { clearInterval(_searchFocusRetry); } + _searchFocusRetry = setInterval(function () { if (document.activeElement === q || ++tries > 8) { - clearInterval(retry); + clearInterval(_searchFocusRetry); + _searchFocusRetry = null; } else { q.focus(); } diff --git a/docs/stylesheets/fn-layout.css b/docs/stylesheets/fn-layout.css index 7db675c..7073810 100644 --- a/docs/stylesheets/fn-layout.css +++ b/docs/stylesheets/fn-layout.css @@ -69,11 +69,15 @@ body { justify-content: center; padding: 16px 0 12px; background-color: var(--fn-surface); - border-bottom: 1px solid #2e323c; + border-bottom: 1px solid var(--fn-line); flex: 0 0 auto; align-self: stretch; } +[data-md-color-scheme="slate"] .fn-header__brand { + border-bottom-color: #2e323c; +} + .fn-header__brand-inner { display: flex; align-items: center; @@ -104,9 +108,14 @@ body { align-self: stretch; } -/* Subtle divider becomes visible only when actually stuck */ +/* Subtle divider + shadow becomes visible only when actually stuck */ .fn-header__sticky.is-stuck { border-bottom-color: var(--fn-line-muted); + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06); +} + +[data-md-color-scheme="slate"] .fn-header__sticky.is-stuck { + box-shadow: none; } .fn-header__sticky-inner { @@ -132,8 +141,8 @@ body { .fn-logo-img { display: block; - height: 40px; - width: 168px; + height: 32px; + width: 132px; max-width: 100%; background-position: center; background-repeat: no-repeat; @@ -150,6 +159,14 @@ body { } @media (max-width: 767px) { .fn-header__title-wrap { display: none; } + .fn-header__brand { + position: sticky; + top: 0; + z-index: 50; + } + .fn-header__sticky { + display: none; + } } .fn-header__title { @@ -516,6 +533,10 @@ body { display: none; } +@media (max-width: 767px) { + .fn-search-kbd { display: none !important; } +} + /* Options bar (share / reset) — keep reset button accessible on the right */ .fn-search-wrap .md-search__options { position: absolute; @@ -868,17 +889,26 @@ label.md-search__overlay { .fn-mobile-controls { display: flex; } .fn-hamburger--brand { display: flex; } - /* Mobile nav drawer */ + /* Mobile nav drawer — fixed below the sticky brand bar */ .fn-mobile-nav { + position: fixed; + top: 61px; /* brand bar: 16px padding-top + 32px logo + 12px padding-bottom + 1px border */ + left: 0; + right: 0; + z-index: 49; + background: var(--fn-surface); + border-bottom: 1px solid transparent; display: grid; grid-template-rows: 0fr; - transition: grid-template-rows var(--fn-duration-base) var(--fn-ease-out); - border-top: 1px solid transparent; + transition: + grid-template-rows var(--fn-duration-base) var(--fn-ease-out), + border-color var(--fn-duration-fast) var(--fn-ease); + overflow: hidden; } .fn-mobile-nav-open { grid-template-rows: 1fr; - border-top-color: var(--fn-line); + border-bottom-color: var(--fn-line); } .fn-mobile-nav > div { @@ -1075,7 +1105,6 @@ label.md-search__overlay { height: auto; margin-bottom: 16px; display: none; - overflow: hidden; } @media (max-width: 1023px) { @@ -1346,6 +1375,7 @@ label.md-search__overlay { max-width: var(--fn-max-w); width: 100%; gap: 48px; + padding: 0 20px; } .fn-footer__top { diff --git a/overrides/main.html b/overrides/main.html index fcf7737..53cc23a 100644 --- a/overrides/main.html +++ b/overrides/main.html @@ -14,7 +14,7 @@ (function () { try { var v = localStorage.getItem('fn-theme'); - var theme = (v === 'light' || v === 'dark' || v === 'system') ? v : 'dark'; + var theme = (v === 'light' || v === 'dark' || v === 'system') ? v : 'system'; var resolved = theme === 'system' ? (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark') : theme; From 87a545a7f11c7c07004e8eff31b7dbfc443f421d Mon Sep 17 00:00:00 2001 From: Tinh Nguyen Date: Wed, 22 Apr 2026 17:20:17 +0700 Subject: [PATCH 5/5] LIVE --- docs/assets/social.png | Bin 0 -> 96652 bytes docs/stylesheets/fn-layout.css | 31 ++++-------------------------- mkdocs.yml | 2 ++ overrides/main.html | 23 ++++++++++++++++++++++ overrides/partials/fn-header.html | 6 +----- 5 files changed, 30 insertions(+), 32 deletions(-) create mode 100644 docs/assets/social.png diff --git a/docs/assets/social.png b/docs/assets/social.png new file mode 100644 index 0000000000000000000000000000000000000000..41d70c3a740525bf4fb09db721bcc2917c8490d2 GIT binary patch literal 96652 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
    E3Oj?n=gLh$J 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 literal 0 HcmV?d00001 diff --git a/docs/stylesheets/fn-layout.css b/docs/stylesheets/fn-layout.css index 7073810..3259c08 100644 --- a/docs/stylesheets/fn-layout.css +++ b/docs/stylesheets/fn-layout.css @@ -67,7 +67,7 @@ body { .fn-header__brand { display: flex; justify-content: center; - padding: 16px 0 12px; + padding: 12px 0; background-color: var(--fn-surface); border-bottom: 1px solid var(--fn-line); flex: 0 0 auto; @@ -150,15 +150,7 @@ body { vertical-align: middle; } -.fn-header__title-wrap { - display: flex; - align-items: center; - height: 30px; - padding-left: 24px; - border-left: 1px solid var(--fn-line-divider); -} @media (max-width: 767px) { - .fn-header__title-wrap { display: none; } .fn-header__brand { position: sticky; top: 0; @@ -169,12 +161,6 @@ body { } } -.fn-header__title { - font-size: 14px; - font-weight: 600; - color: var(--fn-fg); -} - .fn-header__right { display: flex; align-items: center; @@ -209,14 +195,6 @@ body { font-weight: 500; } -/* Light mode: invert to dark-text-on-light */ -[data-md-color-scheme="default"] .md-dialog { - background-color: #1a1a24 !important; -} -[data-md-color-scheme="default"] .md-dialog__inner { - color: #f8fafc !important; -} - /* ═══════════════════════════════════════════════════════════════ SEARCH WRAP .fn-search-wrap is a direct body-level sibling of .fn-header__sticky @@ -755,8 +733,6 @@ label.md-search__overlay { outline-offset: 2px; } -/* ── Old single-button styles removed — see fn-theme-pill above ── */ - /* ── Hamburger button ──────────────────────────────────────── */ .fn-hamburger { position: relative; @@ -1062,7 +1038,8 @@ label.md-search__overlay { font-size: 54px; line-height: 120%; max-width: 700px; - padding-bottom: 18px; + padding-bottom: 0; + margin: 0; font-family: var(--fn-font-display); } @@ -1071,7 +1048,7 @@ label.md-search__overlay { } @media (max-width: 639px) { - .fn-hero__title { font-size: 32px; line-height: 40px; } + .fn-hero__title { font-size: 32px; line-height: 40px; margin-top: 20px; } } .fn-hero__subtitle { diff --git a/mkdocs.yml b/mkdocs.yml index 00cbb0c..56bafad 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,7 @@ site_name: Operating Documents site_url: https://www.fivenorthgroup.com/ +site_description: "Foundational infrastructure documentation for decentralized financial networks — Five North Group." +site_author: "Five North Group" watch: - overrides diff --git a/overrides/main.html b/overrides/main.html index 53cc23a..597b641 100644 --- a/overrides/main.html +++ b/overrides/main.html @@ -10,6 +10,29 @@ Must stay in sync with docs/javascripts/fn-theme.js. #} {% block extrahead %} {{ super() }} + + {# ── Social / Open Graph meta ───────────────────────────────── #} + {% set _title = (page.title ~ ' — ' if page and page.title else '') ~ config.site_name %} + {% set _desc = page.meta.description if page and page.meta.description else config.site_description %} + {% set _url = page.canonical_url if page and page.canonical_url else config.site_url %} + {% set _img = config.site_url ~ 'assets/social.png' %} + + + + + + + + + + + + + + + + +