{
  "version": 3,
  "sources": ["../../../src/scripts/antispam-form.ts", "../../../src/scripts/current-year.ts", "../../../src/scripts/cursor-glow.ts", "../../../src/scripts/network-background.ts", "../../../src/index.ts"],
  "sourcesContent": ["interface ValidatedField {\n  input: HTMLInputElement;\n  error: HTMLElement | null;\n}\n\nfunction validateField(field: ValidatedField): boolean {\n  const { input, error } = field;\n  const valid = input.checkValidity();\n  input.classList.toggle(\"input-error\", !valid);\n  error?.classList.toggle(\"is-visible\", !valid);\n  return valid;\n}\n\n// Client-side validation and fetch-based submission shared by every\n// honeypot/timing/Turnstile-layered form on this site (newsletter\n// signup, unsubscribe-link request) - each just supplies its own\n// form/field ids. On submit: validates, disables the button and shows\n// \"Processing...\", POSTs via fetch(), then navigates to the form's\n// data-success-url regardless of outcome - the backend already treats\n// success/reject/not-found identically, so there's nothing more\n// specific to tell a real user here anyway.\nexport function initAntispamForm(\n  formId: string,\n  fields: { inputId: string; errorId: string }[],\n): void {\n  const form = document.getElementById(formId);\n  if (!(form instanceof HTMLFormElement)) return;\n\n  const successUrl = form.dataset.successUrl;\n\n  const validatedFields: ValidatedField[] = [];\n  for (const { inputId, errorId } of fields) {\n    const input = document.getElementById(inputId);\n    if (!(input instanceof HTMLInputElement)) return;\n    validatedFields.push({ input, error: document.getElementById(errorId) });\n  }\n\n  validatedFields.forEach((field) => {\n    field.input.addEventListener(\"blur\", () => validateField(field));\n    field.input.addEventListener(\"input\", () => {\n      if (field.input.classList.contains(\"input-error\")) validateField(field);\n    });\n  });\n\n  form.addEventListener(\"submit\", (e) => {\n    e.preventDefault();\n\n    const allValid = validatedFields.map(validateField).every(Boolean);\n    if (!allValid) {\n      validatedFields.find((f) => !f.input.checkValidity())?.input.focus();\n      return;\n    }\n\n    const submitButton = form.querySelector('button[type=\"submit\"]');\n    if (submitButton instanceof HTMLButtonElement) {\n      submitButton.disabled = true;\n      submitButton.textContent = \"Processing...\";\n    }\n\n    fetch(form.action, { method: \"POST\", body: new FormData(form) })\n      .catch(() => {\n        // Network failure - still proceed below.\n      })\n      .finally(() => {\n        if (successUrl) window.location.href = successUrl;\n      });\n  });\n}\n", "export function initCurrentYear(): void {\n  const year = document.getElementById(\"year\");\n  if (year) year.textContent = String(new Date().getFullYear());\n}\n", "// Cursor-following bloom, skipped entirely on touch-only devices.\nexport function initCursorGlow(): void {\n  const glow = document.getElementById(\"cursor-glow\");\n  const canHover = window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches;\n  if (!glow || !canHover) return;\n\n  let targetX = window.innerWidth / 2;\n  let targetY = window.innerHeight / 2;\n  let currentX = targetX;\n  let currentY = targetY;\n  let active = false;\n\n  window.addEventListener(\"mousemove\", (e) => {\n    targetX = e.clientX;\n    targetY = e.clientY;\n    if (!active) {\n      active = true;\n      glow.style.opacity = \"1\";\n    }\n  });\n\n  document.addEventListener(\"mouseleave\", () => {\n    active = false;\n    glow.style.opacity = \"0\";\n  });\n\n  const tick = (): void => {\n    currentX += (targetX - currentX) * 0.08;\n    currentY += (targetY - currentY) * 0.08;\n    glow.style.transform = `translate3d(${currentX - 210}px, ${currentY - 210}px, 0)`;\n    requestAnimationFrame(tick);\n  };\n  tick();\n}\n", "// Renders a sparse set of \"server\" nodes at random grid-line intersections\n// inside `containerId`, then periodically animates a small beam travelling\n// between two of them along the grid lines (never diagonally) to suggest\n// decentralised peer-to-peer traffic.\nconst FALLBACK_CELL = 44;\nconst BEAM_MIN_DELAY_MS = 900;\nconst BEAM_MAX_DELAY_MS = 2400;\nconst BEAM_SPEED_PX_PER_MS = 0.3;\nconst RESIZE_DEBOUNCE_MS = 150;\n// A beam is really a short chain of dots riding the same path, staggered in\n// start time with falling opacity/size, so it reads as one line with a\n// fading tail rather than a lone travelling dot.\nconst TRAIL_DOT_COUNT = 60;\nconst TRAIL_STAGGER_MS = 12;\n// Keeps nodes off the outermost grid lines, so a server never sits flush\n// against the edge of the page/viewport.\nconst EDGE_MARGIN_CELLS = 1;\n\n// Reads `--grid-cell` (defined in styles/base.css, shared with `.bg-grid`'s\n// background-size) so node/beam positions can never drift out of sync with\n// where the grid lines are actually drawn.\nfunction readGridCell(el: Element): number {\n  const raw = getComputedStyle(el).getPropertyValue(\"--grid-cell\");\n  const parsed = Number.parseFloat(raw);\n  return Number.isFinite(parsed) && parsed > 0 ? parsed : FALLBACK_CELL;\n}\n\ninterface Point {\n  x: number;\n  y: number;\n}\n\ninterface NetworkNode extends Point {\n  el: HTMLDivElement;\n}\n\nfunction randomInt(max: number): number {\n  return Math.floor(Math.random() * max);\n}\n\nfunction shuffle<T>(items: T[]): void {\n  for (let i = items.length - 1; i > 0; i--) {\n    const j = randomInt(i + 1);\n    const swap = items[i];\n    items[i] = items[j];\n    items[j] = swap;\n  }\n}\n\ninterface GridCell {\n  col: number;\n  row: number;\n}\n\ninterface GridBucket {\n  colStart: number;\n  colEnd: number;\n  rowStart: number;\n  rowEnd: number;\n}\n\n// Splits the intersection grid into `count` roughly even buckets (matched\n// to the container's aspect ratio) and returns them shuffled. Handing out\n// one node per bucket keeps nodes spread across the whole area instead of\n// letting pure randomness clump them together and leave big empty gaps.\nfunction buildStratifiedBuckets(\n  count: number,\n  cols: number,\n  rows: number,\n): GridBucket[] {\n  const bucketCols = Math.max(\n    1,\n    Math.round(Math.sqrt((count * (cols + 1)) / (rows + 1))),\n  );\n  const bucketRows = Math.max(1, Math.ceil(count / bucketCols));\n  const colSpan = (cols + 1) / bucketCols;\n  const rowSpan = (rows + 1) / bucketRows;\n\n  const buckets: GridBucket[] = [];\n  for (let by = 0; by < bucketRows; by++) {\n    for (let bx = 0; bx < bucketCols; bx++) {\n      buckets.push({\n        colStart: Math.floor(bx * colSpan),\n        colEnd: Math.min(cols, Math.floor((bx + 1) * colSpan) - 1),\n        rowStart: Math.floor(by * rowSpan),\n        rowEnd: Math.min(rows, Math.floor((by + 1) * rowSpan) - 1),\n      });\n    }\n  }\n  shuffle(buckets);\n  buckets.length = Math.min(count, buckets.length);\n  return buckets;\n}\n\n// Picks a random intersection inside `bucket` that isn't already in `used`,\n// so two nodes can never land on the same spot - which used to make a beam\n// between them travel zero distance and just look like a stray glow.\nfunction pickFreeIntersection(\n  bucket: GridBucket,\n  used: Set<string>,\n): GridCell | null {\n  const free: GridCell[] = [];\n  for (let col = bucket.colStart; col <= bucket.colEnd; col++) {\n    for (let row = bucket.rowStart; row <= bucket.rowEnd; row++) {\n      const key = `${col}:${row}`;\n      if (!used.has(key)) free.push({ col, row });\n    }\n  }\n  if (free.length === 0) return null;\n\n  const pick = free[randomInt(free.length)];\n  used.add(`${pick.col}:${pick.row}`);\n  return pick;\n}\n\nfunction pickNodeCount(cols: number, rows: number): number {\n  return Math.min(16, Math.max(6, Math.round((cols * rows) / 60)));\n}\n\nfunction manhattanDistance(a: Point, b: Point): number {\n  return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);\n}\n\nfunction isBetween(value: number, a: number, b: number): boolean {\n  return value >= Math.min(a, b) && value <= Math.max(a, b);\n}\n\n// True if any node other than the two endpoints sits on the axis-aligned\n// segment between `from` and `to` (inclusive, so a node sitting exactly on\n// the bend corner counts too).\nfunction segmentHasOtherNode(\n  nodes: NetworkNode[],\n  from: Point,\n  to: Point,\n  endpoints: readonly NetworkNode[],\n): boolean {\n  return nodes.some((node) => {\n    if (endpoints.indexOf(node) !== -1) return false;\n    if (from.y === to.y) {\n      return node.y === from.y && isBetween(node.x, from.x, to.x);\n    }\n    return node.x === from.x && isBetween(node.y, from.y, to.y);\n  });\n}\n\n// Picks an L-shaped route between two grid-aligned nodes that doesn't pass\n// directly over any other node, so a beam only ever visibly touches the two\n// servers it's actually travelling between. Bends at a grid intersection\n// (the two endpoints are grid intersections themselves, and so is the\n// corner between them) so the path only ever runs along the grid lines.\n// Returns null if both the horizontal-first and vertical-first routes are\n// blocked by some other node.\nfunction findClearPath(from: NetworkNode, to: NetworkNode, nodes: NetworkNode[]): string | null {\n  const endpoints = [from, to];\n  const corners: Point[] = [\n    { x: to.x, y: from.y },\n    { x: from.x, y: to.y },\n  ];\n  if (Math.random() < 0.5) corners.reverse();\n\n  for (const corner of corners) {\n    const blocked =\n      segmentHasOtherNode(nodes, from, corner, endpoints) ||\n      segmentHasOtherNode(nodes, corner, to, endpoints);\n    if (!blocked) {\n      return `M ${from.x},${from.y} L ${corner.x},${corner.y} L ${to.x},${to.y}`;\n    }\n  }\n  return null;\n}\n\nexport function initNetworkBackground(containerId: string): void {\n  const container = document.getElementById(containerId);\n  if (!container) return;\n\n  const reduceMotion = window.matchMedia(\n    \"(prefers-reduced-motion: reduce)\",\n  ).matches;\n\n  let nodes: NetworkNode[] = [];\n  let paused = document.visibilityState === \"hidden\";\n\n  const clearNodes = (): void => {\n    nodes.forEach((node) => node.el.remove());\n    nodes = [];\n  };\n\n  const buildNodes = (): void => {\n    clearNodes();\n    const cell = readGridCell(container);\n    const width = container.clientWidth;\n    const height = container.clientHeight;\n    if (width < cell || height < cell) return;\n\n    const cols = Math.floor(width / cell);\n    const rows = Math.floor(height / cell);\n    const margin = Math.min(\n      EDGE_MARGIN_CELLS,\n      Math.floor(cols / 2),\n      Math.floor(rows / 2),\n    );\n    const usableCols = Math.max(0, cols - margin * 2);\n    const usableRows = Math.max(0, rows - margin * 2);\n    const count = pickNodeCount(usableCols, usableRows);\n    const buckets = buildStratifiedBuckets(count, usableCols, usableRows);\n    const used = new Set<string>();\n\n    for (const bucket of buckets) {\n      const intersection = pickFreeIntersection(bucket, used);\n      if (!intersection) continue;\n\n      const x = (intersection.col + margin) * cell;\n      const y = (intersection.row + margin) * cell;\n      const el = document.createElement(\"div\");\n      el.className = \"network-node\";\n      el.style.left = `${x}px`;\n      el.style.top = `${y}px`;\n      container.appendChild(el);\n      nodes.push({ el, x, y });\n    }\n  };\n\n  const pulseNode = (node: NetworkNode): void => {\n    node.el.classList.add(\"network-node-active\");\n    window.setTimeout(\n      () => node.el.classList.remove(\"network-node-active\"),\n      500,\n    );\n  };\n\n  const scheduleNextBeam = (): void => {\n    if (reduceMotion || paused) return;\n    const delay =\n      BEAM_MIN_DELAY_MS +\n      Math.random() * (BEAM_MAX_DELAY_MS - BEAM_MIN_DELAY_MS);\n    window.setTimeout(spawnBeam, delay);\n  };\n\n  const spawnBeam = (): void => {\n    if (nodes.length < 2) {\n      scheduleNextBeam();\n      return;\n    }\n\n    const from = nodes[randomInt(nodes.length)];\n    let to: NetworkNode | null = null;\n    let path: string | null = null;\n\n    for (let attempt = 0; attempt < 8; attempt++) {\n      const candidate = nodes[randomInt(nodes.length)];\n      if (candidate === from) continue;\n      const clearPath = findClearPath(from, candidate, nodes);\n      if (clearPath) {\n        to = candidate;\n        path = clearPath;\n        break;\n      }\n    }\n\n    if (to && path) {\n      const pathValue = `path('${path}')`;\n      const duration = Math.max(\n        500,\n        manhattanDistance(from, to) / BEAM_SPEED_PX_PER_MS,\n      );\n      const trailDots: HTMLDivElement[] = [];\n\n      for (let i = 0; i < TRAIL_DOT_COUNT; i++) {\n        const dot = document.createElement(\"div\");\n        dot.className = \"network-beam\";\n        dot.style.setProperty(\"offset-path\", pathValue);\n        dot.style.setProperty(\"offset-rotate\", \"0deg\");\n\n        const fade = 1 - i / TRAIL_DOT_COUNT;\n        dot.style.opacity = String(fade * fade);\n        dot.style.transform = `scale(${Math.max(0.3, fade)})`;\n\n        container.appendChild(dot);\n        trailDots.push(dot);\n\n        const animation = dot.animate(\n          [{ offsetDistance: \"0%\" }, { offsetDistance: \"100%\" }],\n          {\n            duration,\n            delay: i * TRAIL_STAGGER_MS,\n            easing: \"linear\",\n            fill: \"backwards\",\n          },\n        );\n        if (i === 0) animation.onfinish = () => pulseNode(to);\n      }\n\n      const trailLifetime = duration + (TRAIL_DOT_COUNT - 1) * TRAIL_STAGGER_MS;\n      window.setTimeout(\n        () => trailDots.forEach((dot) => dot.remove()),\n        trailLifetime,\n      );\n    }\n\n    scheduleNextBeam();\n  };\n\n  let resizeTimer: number | undefined;\n  const resizeObserver = new ResizeObserver(() => {\n    window.clearTimeout(resizeTimer);\n    resizeTimer = window.setTimeout(buildNodes, RESIZE_DEBOUNCE_MS);\n  });\n  resizeObserver.observe(container);\n\n  document.addEventListener(\"visibilitychange\", () => {\n    const wasPaused = paused;\n    paused = document.visibilityState === \"hidden\";\n    if (wasPaused && !paused) scheduleNextBeam();\n  });\n\n  buildNodes();\n  scheduleNextBeam();\n}\n", "import { initAntispamForm } from \"./scripts/antispam-form\";\nimport { initCurrentYear } from \"./scripts/current-year\";\nimport { initCursorGlow } from \"./scripts/cursor-glow\";\nimport { initNetworkBackground } from \"./scripts/network-background\";\n\ninitCurrentYear();\ninitCursorGlow();\ninitAntispamForm(\"ln-form\", [\n  { inputId: \"ln-email\", errorId: \"ln-email-error\" },\n  { inputId: \"ln-name\", errorId: \"ln-name-error\" },\n]);\ninitAntispamForm(\"unsub-form\", [\n  { inputId: \"unsub-email\", errorId: \"unsub-email-error\" },\n]);\ninitNetworkBackground(\"bg-network\");\n"],
  "mappings": "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",
  "names": ["validateField", "field", "input", "error", "valid", "initAntispamForm", "formId", "fields", "form", "successUrl", "validatedFields", "inputId", "errorId", "e", "_a", "f", "submitButton", "initCurrentYear", "year", "initCursorGlow", "glow", "canHover", "targetX", "targetY", "currentX", "currentY", "active", "e", "tick", "readGridCell", "el", "raw", "parsed", "randomInt", "max", "shuffle", "items", "i", "j", "swap", "buildStratifiedBuckets", "count", "cols", "rows", "bucketCols", "bucketRows", "colSpan", "rowSpan", "buckets", "by", "bx", "pickFreeIntersection", "bucket", "used", "free", "col", "row", "key", "pick", "pickNodeCount", "manhattanDistance", "a", "b", "isBetween", "value", "segmentHasOtherNode", "nodes", "from", "to", "endpoints", "node", "findClearPath", "corners", "corner", "initNetworkBackground", "containerId", "container", "reduceMotion", "paused", "clearNodes", "buildNodes", "cell", "width", "height", "margin", "usableCols", "usableRows", "intersection", "y", "pulseNode", "scheduleNextBeam", "delay", "spawnBeam", "path", "attempt", "candidate", "clearPath", "pathValue", "duration", "trailDots", "dot", "fade", "animation", "trailLifetime", "resizeTimer", "wasPaused", "initCurrentYear", "initCursorGlow", "initAntispamForm", "initNetworkBackground"]
}
