{"version":3,"names":["BASE_W","BASE_H","DETAIL_MAX","STOPS","PAL","TAU","Math","PI","DIST_STEPS","WAVE_X","WAVE_Y","WAVE_DIAG","WAVE_RADIAL","RATE_X","RATE_Y","RATE_DIAG","RATE_RADIAL","BASE_FALLBACK","r","g","b","a","DURATION_FALLBACK","painting","WeakSet","paint","canvas","has","add","ctx","getContext","alpha","tree","getRootNode","scope","ShadowRoot","document","body","palette","Uint8ClampedArray","bufW","bufH","detail","image","pixels","distIndex","maxDist","tableX","tableY","tableDiag","tableRadial","allocate","factor","round","width","height","createImageData","data","n","length","cx","cy","Uint16Array","y","i","x","d","hypot","Float32Array","zoom","duration","probe","createElement","parseColour","value","text","String","trim","fillStyle","out","fn","match","Number","undefined","hex","parseInt","watching","watchScheme","onFlip","flip","setAttribute","style","cssText","setProperty","addEventListener","append","resolver","resolve","includes","hidden","color","getComputedStyle","readSettings","cs","token","name","getPropertyValue","base","rawZoom","parseFloat","isFinite","min","max","rawDuration","stops","forEach","key","colour","pos","push","sort","p","hi","findIndex","stop","lo","from","to","span","k","render","t","kx","ky","kd","kr","sin","s","toPalette","wy","v","entry","into","putImageData","reduced","window","matchMedia","animated","matches","documentElement","getAttribute","raf","last","onScreen","cancelAnimationFrame","step","now","isConnected","dt","requestAnimationFrame","start","resync","MutationObserver","observe","attributes","attributeFilter","IntersectionObserver","entries","isIntersecting","attach","querySelectorAll","host","shadowRoot","readyState","once"],"sources":["theme-3-inline-common-body_tag.js"],"sourcesContent":["/**\n * @file\n * The masthead plasma field.\n *\n * A classic summed-sine plasma: every pixel is the sum of four wave systems -\n * horizontal, vertical, diagonal and radial - and the total is mapped through a\n * palette. That is what makes it a plasma rather than an arrangement of shapes.\n * The whole band varies, everywhere, because every pixel is computed; earlier\n * builds of this masthead layered radial gradients, which could only ever be a\n * few pools of colour with dead ground between them.\n *\n * Two things keep it cheap enough to leave running.\n *\n * It renders into a small buffer (256x40 at zoom 1) that CSS stretches over the\n * band, so the browser's own smoothing does the softening. A plasma is all low\n * spatial frequencies, so there is nothing in it that a full-resolution buffer\n * would resolve and this one does not - it would just cost tens of times more.\n * Zooming out shortens the waves, so the buffer grows to match, up to three times\n * its base size; that keeps the pixels-per-wave roughly constant at any zoom.\n *\n * And the per-pixel loop does no trigonometry. Each wave system is sampled once\n * per frame into a small table (by column, by row, by diagonal, by distance), and\n * the loop is then four array reads and an add. That is about eleven hundred sine\n * calls a frame rather than forty thousand.\n *\n * The palette comes from the --sa-header-* tokens, flattened onto the base colour\n * when it is built, so the loop never composites either. The plasma_picker dev\n * control edits those tokens and fires sa:plasma-change; nothing else needs to\n * know it exists.\n *\n * The same file paints the forum's copy of the masthead. The forum serves the\n * site's header fragment inside its own pages, in the shadow root of an\n * <sa-header> element, and copies this file from /fragments/plasma into its own\n * theme, so a change here reaches the forum too. That is why it needs nothing\n * from Drupal and loads nothing, and stageafrica_forum's FragmentCheck refuses\n * to serve it if it does. On the forum the tokens that differ between the\n * schemes arrive as light-dark(), resolved against the forum's own scheme,\n * because the site's [data-sa-theme] switch does not exist there.\n */\n(() => {\n  'use strict';\n\n  // The render buffer at zoom 1. CSS stretches it over the band, and it grows when\n  // the field is zoomed out - see the detail factor in readSettings.\n  const BASE_W = 256;\n  const BASE_H = 40;\n  const DETAIL_MAX = 3;\n  const STOPS = ['c1', 'c2', 'c3', 'c4', 'c5', 'c6'];\n  const PAL = 256;\n  const TAU = Math.PI * 2;\n\n  // Quarter-pixel resolution for the radial term's table: finer than the buffer\n  // can show, and small enough to rebuild every frame.\n  const DIST_STEPS = 4;\n\n  // Wavelengths in buffer units, all scaled by --sa-header-zoom. The relative\n  // sizes matter more than the absolute ones: near-equal wavelengths beat against\n  // each other into visible regularity, so these stay mutually awkward.\n  const WAVE_X = 12;\n  const WAVE_Y = 7;\n  const WAVE_DIAG = 17;\n  const WAVE_RADIAL = 9;\n\n  // How fast each wave advances in time, relative to the base rate. These are\n  // deliberately awkward ratios: with the tidy 1, 0.7, 1.3 of the textbook version\n  // the four terms come back into step every few minutes and the whole field\n  // repeats exactly, which is the trap four earlier builds of this masthead fell\n  // into. At these ratios there is no practical common period.\n  const RATE_X = 1;\n  const RATE_Y = 0.68;\n  const RATE_DIAG = 1.37;\n  const RATE_RADIAL = 0.91;\n\n  // Fallbacks, used only if a token is missing or unparseable.\n  const BASE_FALLBACK = { r: 60, g: 56, b: 51, a: 1 };\n  const DURATION_FALLBACK = 18;\n\n  // Every canvas already being painted, so looking for canvases a second time\n  // starts none of them twice.\n  const painting = new WeakSet();\n\n  const paint = (canvas) => {\n    if (painting.has(canvas)) {\n      return;\n    }\n    painting.add(canvas);\n    const ctx = canvas.getContext('2d', { alpha: false });\n    if (!ctx) {\n      return;\n    }\n\n    // The tree the canvas is in: the page on the site, the <sa-header> shadow\n    // root on the forum. Anything the field adds to the page goes there.\n    const tree = canvas.getRootNode();\n    const scope = tree instanceof ShadowRoot ? tree : document.body;\n\n    const palette = new Uint8ClampedArray(PAL * 3);\n\n    let bufW = 0;\n    let bufH = 0;\n    let detail = 0;\n    let image;\n    let pixels;\n    let distIndex;\n    let maxDist = 0;\n    let tableX;\n    let tableY;\n    let tableDiag;\n    let tableRadial;\n\n    /**\n     * Size the render buffer for a given detail factor.\n     *\n     * Zooming out shortens the waves, and once they are shorter than the buffer\n     * can resolve the field degrades into mush. So the buffer grows as the zoom\n     * drops, holding roughly the same number of pixels per wave at any zoom, and\n     * paying for the bigger loop only when it is needed.\n     */\n    const allocate = (factor) => {\n      detail = factor;\n      bufW = Math.round(BASE_W * factor);\n      bufH = Math.round(BASE_H * factor);\n      canvas.width = bufW;\n      canvas.height = bufH;\n      image = ctx.createImageData(bufW, bufH);\n      pixels = image.data;\n      // The field is opaque everywhere, so alpha is written once and never again.\n      for (let n = 3; n < pixels.length; n += 4) {\n        pixels[n] = 255;\n      }\n\n      // How far each pixel sits from the centre, as an index into the radial\n      // table. Fixed for a given buffer size, so it is rebuilt only on a resize.\n      const cx = (bufW - 1) / 2;\n      const cy = (bufH - 1) / 2;\n      distIndex = new Uint16Array(bufW * bufH);\n      maxDist = 0;\n      for (let y = 0, i = 0; y < bufH; y += 1) {\n        for (let x = 0; x < bufW; x += 1, i += 1) {\n          const d = Math.round(Math.hypot(x - cx, y - cy) * DIST_STEPS);\n          distIndex[i] = d;\n          if (d > maxDist) {\n            maxDist = d;\n          }\n        }\n      }\n\n      tableX = new Float32Array(bufW);\n      tableY = new Float32Array(bufH);\n      tableDiag = new Float32Array(bufW + bufH);\n      tableRadial = new Float32Array(maxDist + 1);\n    };\n\n    let zoom = 1;\n    let duration = DURATION_FALLBACK;\n\n    // Let the browser parse colours rather than hand-rolling it: any CSS\n    // colour goes in, a normalised hex or rgba string comes back.\n    const probe = document.createElement('canvas').getContext('2d');\n    const parseColour = (value) => {\n      const text = String(value || '').trim();\n      if (!text) {\n        return null;\n      }\n      // An invalid value leaves fillStyle untouched, so a sentinel tells the\n      // two cases apart.\n      probe.fillStyle = '#010203';\n      probe.fillStyle = text;\n      const out = probe.fillStyle;\n      if (out === '#010203' && text !== '#010203') {\n        return null;\n      }\n      const fn = out.match(/^rgba?\\(([\\d.]+),\\s*([\\d.]+),\\s*([\\d.]+)(?:,\\s*([\\d.]+))?\\)$/);\n      if (fn) {\n        return {\n          r: Number(fn[1]),\n          g: Number(fn[2]),\n          b: Number(fn[3]),\n          a: fn[4] === undefined ? 1 : Number(fn[4]),\n        };\n      }\n      const hex = out.match(/^#([0-9a-f]{6})$/i);\n      if (hex) {\n        const n = parseInt(hex[1], 16);\n        return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255, a: 1 };\n      }\n      return null;\n    };\n\n    // Nothing on the forum's page announces a change of scheme, and its own\n    // toggle works by swapping stylesheets. So a colour that follows the scheme\n    // is watched instead: a transition starts whenever it flips, however the\n    // page flipped it. Only a canvas whose tokens use light-dark() needs this;\n    // the site's own toggle is observed directly, below.\n    let watching = false;\n    const watchScheme = (onFlip) => {\n      if (watching) {\n        return;\n      }\n      watching = true;\n      const flip = document.createElement('span');\n      flip.setAttribute('aria-hidden', 'true');\n      flip.style.cssText = 'position:absolute;inline-size:0;block-size:0;overflow:hidden;visibility:hidden;pointer-events:none;color:light-dark(#000,#fff)';\n      flip.style.setProperty('transition', 'color 1ms step-end', 'important');\n      flip.addEventListener('transitionrun', onFlip);\n      scope.append(flip);\n    };\n\n    // A token written as light-dark() is resolved by the browser, against the\n    // page's own scheme. It is read at the top of the canvas's tree, because the\n    // header forces color-scheme: dark on everything inside it, and a token\n    // resolved under the header would always come back dark.\n    let resolver = null;\n    const resolve = (value, onFlip) => {\n      const text = String(value || '').trim();\n      if (!text.includes('light-dark(')) {\n        return text;\n      }\n      watchScheme(onFlip);\n      if (!resolver) {\n        resolver = document.createElement('span');\n        resolver.hidden = true;\n        scope.append(resolver);\n      }\n      // As in parseColour, an invalid value leaves the colour untouched.\n      resolver.style.color = 'rgb(1, 2, 3)';\n      resolver.style.color = text;\n      if (resolver.style.color === 'rgb(1, 2, 3)') {\n        return '';\n      }\n      return getComputedStyle(resolver).color;\n    };\n\n    const readSettings = (onFlip) => {\n      // Read at the canvas rather than the root: on the forum the tokens are\n      // declared on the <sa-header> host, and on the site the canvas inherits\n      // them from the root, the picker's live edits included.\n      const cs = getComputedStyle(canvas);\n      const token = (name) => parseColour(resolve(cs.getPropertyValue(name), onFlip));\n      const base = token('--sa-header-base') || BASE_FALLBACK;\n\n      const rawZoom = parseFloat(cs.getPropertyValue('--sa-header-zoom'));\n      zoom = Number.isFinite(rawZoom) && rawZoom > 0 ? rawZoom : 1;\n      // Quantised to halves, so dragging the zoom slider does not reallocate the\n      // buffer on every input event.\n      const factor = Math.min(DETAIL_MAX, Math.max(1, Math.round(2 / zoom) / 2));\n      if (factor !== detail) {\n        allocate(factor);\n      }\n      const rawDuration = parseFloat(cs.getPropertyValue('--sa-header-drift-duration'));\n      duration = Number.isFinite(rawDuration) && rawDuration > 0 ? rawDuration : DURATION_FALLBACK;\n\n      const stops = [];\n      STOPS.forEach((key) => {\n        const colour = token(`--sa-header-${key}`);\n        // A slot left transparent is a spare the picker has not turned on.\n        if (!colour || colour.a === 0) {\n          return;\n        }\n        const pos = parseFloat(cs.getPropertyValue(`--sa-header-${key}-pos`));\n        stops.push({\n          pos: Number.isFinite(pos) ? Math.min(100, Math.max(0, pos)) : 50,\n          // Flatten onto the base here so the per-pixel loop never composites.\n          r: base.r + (colour.r - base.r) * colour.a,\n          g: base.g + (colour.g - base.g) * colour.a,\n          b: base.b + (colour.b - base.b) * colour.a,\n        });\n      });\n      stops.sort((a, b) => a.pos - b.pos);\n      if (!stops.length) {\n        stops.push({ pos: 0, r: base.r, g: base.g, b: base.b });\n      }\n\n      for (let i = 0; i < PAL; i += 1) {\n        const p = (i / (PAL - 1)) * 100;\n        let hi = stops.findIndex((stop) => stop.pos >= p);\n        let lo;\n        if (hi === -1) {\n          // Past the last stop: hold it rather than extrapolating.\n          hi = stops.length - 1;\n          lo = hi;\n        } else {\n          lo = Math.max(0, hi - 1);\n        }\n        const from = stops[lo];\n        const to = stops[hi];\n        const span = to.pos - from.pos;\n        const k = span > 0 ? Math.min(1, Math.max(0, (p - from.pos) / span)) : 0;\n        palette[i * 3] = from.r + (to.r - from.r) * k;\n        palette[i * 3 + 1] = from.g + (to.g - from.g) * k;\n        palette[i * 3 + 2] = from.b + (to.b - from.b) * k;\n      }\n    };\n\n    const render = (t) => {\n      // Wavelengths are in base-resolution units, so they scale with the buffer\n      // as well as with the zoom - otherwise growing the buffer would shrink the\n      // field on screen instead of just resolving it better.\n      const kx = WAVE_X * zoom * detail;\n      const ky = WAVE_Y * zoom * detail;\n      const kd = WAVE_DIAG * zoom * detail;\n      const kr = WAVE_RADIAL * zoom * detail * DIST_STEPS;\n\n      for (let x = 0; x < bufW; x += 1) {\n        tableX[x] = Math.sin(x / kx + t * RATE_X);\n      }\n      for (let y = 0; y < bufH; y += 1) {\n        tableY[y] = Math.sin(y / ky + t * RATE_Y);\n      }\n      for (let s = 0; s < tableDiag.length; s += 1) {\n        tableDiag[s] = Math.sin(s / kd + t * RATE_DIAG);\n      }\n      for (let d = 0; d <= maxDist; d += 1) {\n        tableRadial[d] = Math.sin(d / kr + t * RATE_RADIAL);\n      }\n\n      // Four waves sum to -4..4; fold that onto the palette.\n      const toPalette = (PAL - 1) / 8;\n      for (let y = 0, i = 0; y < bufH; y += 1) {\n        const wy = tableY[y];\n        for (let x = 0; x < bufW; x += 1, i += 1) {\n          const v = tableX[x] + wy + tableDiag[x + y] + tableRadial[distIndex[i]];\n          const entry = ((v + 4) * toPalette) | 0;\n          const from = entry * 3;\n          const into = i * 4;\n          pixels[into] = palette[from];\n          pixels[into + 1] = palette[from + 1];\n          pixels[into + 2] = palette[from + 2];\n        }\n      }\n      ctx.putImageData(image, 0, 0);\n    };\n\n    const reduced = window.matchMedia('(prefers-reduced-motion: reduce)');\n    // The picker forces motion so the speed can be judged at all on a machine\n    // that asks for reduced motion. It is debug-gated, so the public site\n    // always honours the preference.\n    const animated = () =>\n      !reduced.matches || document.documentElement.getAttribute('data-sa-motion') === 'force';\n\n    let raf = 0;\n    let last = 0;\n    let t = 0;\n    // Whether any of the canvas is on screen. The site's header is sticky and\n    // always is; the forum's scrolls away above the forum's own header, and a\n    // field nobody can see is not worth a frame.\n    let onScreen = true;\n\n    const stop = () => {\n      if (raf) {\n        cancelAnimationFrame(raf);\n        raf = 0;\n      }\n    };\n\n    const step = (now) => {\n      // A canvas taken off the page stops, rather than painting into nothing.\n      if (!canvas.isConnected) {\n        raf = 0;\n        return;\n      }\n      // Advance by elapsed time rather than a fixed step, so the speed is the\n      // same on any refresh rate, and accumulate rather than deriving t from\n      // the start - that way changing the speed eases in instead of jumping.\n      const dt = last ? Math.min(0.1, (now - last) / 1000) : 0;\n      last = now;\n      t += dt * (TAU / duration);\n      render(t);\n      raf = requestAnimationFrame(step);\n    };\n\n    const start = () => {\n      if (raf) {\n        return;\n      }\n      // Drawn at once, so an opaque canvas is never shown before its first\n      // frame, which would be black.\n      render(t);\n      if (!animated() || !onScreen) {\n        return;\n      }\n      last = 0;\n      raf = requestAnimationFrame(step);\n    };\n\n    const resync = () => {\n      readSettings(resync);\n      if (animated()) {\n        start();\n      } else {\n        stop();\n        render(t);\n      }\n    };\n\n    // Coming back to a hidden tab, the gap since the last frame is not time\n    // the plasma should have travelled.\n    document.addEventListener('visibilitychange', () => {\n      last = 0;\n    });\n    reduced.addEventListener('change', resync);\n    document.addEventListener('sa:plasma-change', resync);\n\n    // The palette is themed, and it is read once and cached, so the field has to\n    // be told when the theme moves under it. Both routes count: the toggle sets\n    // data-sa-theme on the root, and with no explicit choice the OS preference\n    // decides. Watching the attribute rather than the toggle keeps this working\n    // whatever sets it.\n    new MutationObserver(resync).observe(document.documentElement, {\n      attributes: true,\n      attributeFilter: ['data-sa-theme'],\n    });\n    window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', resync);\n\n    new IntersectionObserver((entries) => {\n      onScreen = entries[entries.length - 1].isIntersecting;\n      if (onScreen) {\n        start();\n      } else {\n        stop();\n      }\n    }).observe(canvas);\n\n    resync();\n  };\n\n  // The site's canvas is in the page. The forum's is in the shadow root of each\n  // <sa-header>, which a query of the page does not reach.\n  const attach = () => {\n    document.querySelectorAll('[data-sa-header-plasma]').forEach(paint);\n    document.querySelectorAll('sa-header').forEach((host) => {\n      if (host.shadowRoot) {\n        host.shadowRoot.querySelectorAll('[data-sa-header-plasma]').forEach(paint);\n      }\n    });\n  };\n\n  // At once, for a script that comes after the canvas, which can then draw the\n  // first frame before the page is first shown; and again once the page is\n  // parsed, for a script that comes before it.\n  attach();\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', attach, { once: true });\n  }\n})();\n"],"mappings":"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","ignoreList":[]}