Make Your Own Money.
Yours to evolve as your business does.















M0 operates with full transparency, aligning with our core ethos of openness and self-custody. The platform also delivers the robustness and scale we need to serve a global user base.

tag (or Site-wide). */ (function () { 'use strict'; var VARIANT_CLASS = 'w-variant-71a0af12-52ff-c193-34a2-ee14d28ef6a2'; var NAV_SELECTOR = '[data-wf--navigation--variant]'; var variantEls = null; // cached list of all elements that carry the variant class var ticking = false; /* ── Colour helpers ─────────────────────────────────────────────────────── */ /** * Returns true if the rgb/rgba string is a "light" colour, * false if dark, null if unparseable (e.g. transparent). */ function isLight(rgb) { var m = rgb.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/); if (!m) return null; // Perceived-brightness formula (ITU-R BT.601) var luminance = (0.299 * +m[1] + 0.587 * +m[2] + 0.114 * +m[3]) / 255; return luminance > 0.5; } /** * Walks up the DOM from `el` and returns the first non-transparent * computed background-color string, or null. */ function resolveBackground(el) { var node = el; while (node && node !== document.documentElement) { var bg = window.getComputedStyle(node).backgroundColor; if (bg && bg !== 'rgba(0, 0, 0, 0)' && bg !== 'transparent') { return bg; } node = node.parentElement; } return null; } /* ── Core detection ─────────────────────────────────────────────────────── */ /** * Samples the background luminance at STEPS evenly-spaced Y positions * spanning 3× the nav height (from the nav centre downward). * * Returns an array of booleans: true = light sample, false = dark sample. * Only consistent zones (all light OR all dark) will trigger a theme change, * which prevents blinking when the nav crosses a narrow boundary. */ function sampleZone(nav) { var r = nav.getBoundingClientRect(); var cx = r.left + r.width / 2; var navH = r.height; var STEPS = 5; // Span: nav centre → nav centre + 2×navH (total vertical span = 3×navH) var cy0 = r.top + navH / 2; var results = []; for (var i = 0; i < STEPS; i++) { var cy = cy0 + (i / (STEPS - 1)) * 2 * navH; var hits = document.elementsFromPoint(cx, cy); for (var j = 0; j < hits.length; j++) { var el = hits[j]; if (el === nav || nav.contains(el)) continue; var bg = resolveBackground(el); if (bg) { var l = isLight(bg); if (l !== null) results.push(l); break; } } } // Fallback: body colour if (!results.length) { var bodyLight = isLight(window.getComputedStyle(document.body).backgroundColor); if (bodyLight !== null) results.push(bodyLight); } return results; } /* ── Class toggle ───────────────────────────────────────────────────────── */ function update() { if (!variantEls || !variantEls.length) return; var nav = variantEls[0]; var samples = sampleZone(nav); if (!samples.length) return; var allLight = samples.every(function (s) { return s === true; }); var allDark = samples.every(function (s) { return s === false; }); // Only switch when the entire 3× zone is one consistent theme. // Mixed zones (transition boundary) → hold current state, no flicker. if (!allLight && !allDark) return; // dark bg → variant class on (light nav) // light bg → variant class off (dark nav) var shouldHaveClass = allDark; variantEls.forEach(function (el) { el.classList.toggle(VARIANT_CLASS, shouldHaveClass); }); } /* ── Transitions ────────────────────────────────────────────────────────── */ /** * Injects a















