<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>pshields.net</title><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="color-scheme" content="dark"><meta name="description" content="The personal website of Patrick Shields"><link rel="modulepreload" href="/homepage/identity-mark.js"><link rel="modulepreload" href="/vendor/three.module.js"></head>
<style>
  
  :root {
    color-scheme: dark;
    --psw-color-bg: #080808;
    --psw-color-panel: rgba(15, 15, 15, 0.82);
    --psw-color-panel-strong: rgba(18, 18, 18, 0.94);
    --psw-color-ink: rgba(246, 244, 238, 0.94);
    --psw-color-muted: rgba(202, 198, 188, 0.82);
    --psw-color-dim: rgba(160, 154, 142, 0.54);
    --psw-color-rule: rgba(214, 206, 188, 0.16);
    --psw-color-rule-strong: rgba(214, 206, 188, 0.28);
    --psw-color-accent: #e6d8a8;
    --psw-color-accent-warm: #ffcc66;
    --psw-color-brand-dot: #6fa8ff;
    --psw-color-cta: #15366e;
    --psw-color-cta-hover: #1b4389;
    --psw-color-cta-active: #102858;
    --psw-color-cta-ink: #fff;
    --psw-color-danger: #ff8b8b;
    --psw-color-focus: var(--psw-color-accent);
    --psw-axes-gradient: linear-gradient(-45deg,blue -20%,transparent 80%),linear-gradient(45deg,darkred 5%,crimson,darkorange 60%,gold,bisque);
    --psw-axes-glow: rgba(255,217,61,0.18);
    --psw-axes-side: #3d1a12;
    --psw-font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    --psw-font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
    --psw-space-1: 0.25rem;
    --psw-space-2: 0.5rem;
    --psw-space-3: 0.75rem;
    --psw-space-4: 1rem;
    --psw-space-5: 1.5rem;
    --psw-space-6: 2rem;
    --psw-space-7: 3rem;
    --psw-grid-size: 1rem;
    --psw-grid-dot: rgba(214, 206, 188, 0.24);
    --psw-hairline: 1px;
    --psw-radius-panel: 0.25rem;
    --psw-page-max: 72rem;
    --psw-page-gutter: clamp(1rem, 3vw, 2rem);
    --psw-prose-measure: 42rem;
    --psw-topbar-height: 3.55rem;
    --psw-focus-width: 2px;
    --psw-focus-offset: 3px;
    --psw-shadow-panel: 0 1.25rem 3rem rgba(0,0,0,0.34), inset 0 0 0 1px rgba(255,255,255,0.035);
  }
  * { box-sizing: border-box; }
  html { min-height: 100%; background-color: var(--psw-color-bg); background-image: radial-gradient(circle, var(--psw-grid-dot) 0.05rem, transparent 0.05rem); background-size: var(--psw-grid-size) var(--psw-grid-size); }
  body { margin: 0; min-height: 100vh; color: var(--psw-color-ink); font-family: var(--psw-font-sans); background: radial-gradient(60% 48% at 50% 0%, rgba(230,216,168,0.045), transparent 62%), radial-gradient(48% 40% at 100% 100%, rgba(255,204,102,0.028), transparent 70%); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
  ::selection { background: rgba(230,216,168,0.24); color: #fff; }
  [hidden] { display: none !important; }
  .psw-visually-hidden { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
  a { color: inherit; text-decoration-color: color-mix(in srgb, var(--psw-color-accent) 62%, transparent); text-decoration-thickness: 0.08em; text-underline-offset: 0.18em; transition: color 140ms ease, text-decoration-color 140ms ease; }
  a:hover { color: #fff; text-decoration-color: var(--psw-color-accent); }
  :where(a, button, input, textarea, select, [tabindex]):focus-visible { outline: var(--psw-focus-width) solid var(--psw-color-focus); outline-offset: var(--psw-focus-offset); }
  .psw-page-shell { width: min(var(--psw-page-max), calc(100vw - var(--psw-page-gutter) * 2)); margin: 0 auto; }
  .psw-panel { position: relative; border: var(--psw-hairline) solid var(--psw-color-rule); border-radius: var(--psw-radius-panel); background: var(--psw-color-panel-strong); box-shadow: var(--psw-shadow-panel); color: var(--psw-color-ink); }
  .psw-panel--transparent { background: var(--psw-color-panel); }
  .psw-button { display: inline-flex; align-items: center; justify-content: center; gap: 0.45rem; min-height: 2.4rem; border: var(--psw-hairline) solid color-mix(in srgb, var(--psw-color-accent) 54%, var(--psw-color-rule)); border-radius: var(--psw-radius-panel); padding: 0.65rem 0.9rem; background: linear-gradient(180deg, rgba(230,216,168,0.14), rgba(230,216,168,0.05)); color: var(--psw-color-ink); font: 750 0.74rem/1 var(--psw-font-mono); letter-spacing: 0.14em; text-transform: uppercase; text-decoration: none; cursor: pointer; transition: transform 120ms ease, border-color 120ms ease, background 120ms ease, color 120ms ease; }
  .psw-button:hover { border-color: var(--psw-color-accent); background: rgba(230,216,168,0.1); color: #fff; transform: translateY(-1px); }
  .psw-button:active { transform: translateY(1px); }
  .psw-button--ghost { border-color: var(--psw-color-rule); background: rgba(18,18,18,0.62); color: var(--psw-color-muted); }
  .psw-button--ghost:hover { border-color: var(--psw-color-accent); background: rgba(230,216,168,0.07); color: var(--psw-color-ink); }
  .psw-button--cta { min-height: 2rem; border: 0; border-radius: 999px; padding: 0.18rem 0.95rem 0.18rem 0.75rem; background: var(--psw-color-cta); color: var(--psw-color-cta-ink); box-shadow: none; font: 700 0.9rem/1 var(--psw-font-sans); letter-spacing: 0.075em; text-transform: uppercase; transition: background-color 160ms ease, color 160ms ease; }
  .psw-button--cta:hover { border-color: transparent; background: var(--psw-color-cta-hover); color: var(--psw-color-cta-ink); transform: none; }
  .psw-button--cta:active { background: var(--psw-color-cta-active); transform: none; }
  .psw-button--cta svg { display: inline-flex; width: 15px; height: 15px; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; fill: none; flex: 0 0 auto; }
  .psw-header-cta { white-space: nowrap; }
  .psw-kicker { margin: 0; font: 700 0.72rem/1 var(--psw-font-mono); letter-spacing: 0.16em; text-transform: uppercase; color: var(--psw-color-muted); }
  .psw-token { display: inline-flex; align-items: center; gap: 0.35rem; border: var(--psw-hairline) solid var(--psw-color-rule); border-radius: 999px; padding: 0.22rem 0.5rem; background: rgba(230,216,168,0.055); color: var(--psw-color-muted); font: 650 0.72rem/1 var(--psw-font-mono); letter-spacing: 0.08em; text-transform: uppercase; }
  .psw-status-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--psw-space-3); color: var(--psw-color-muted); font: 600 0.74rem/1.35 var(--psw-font-mono); }
  .psw-path { display: inline-flex; align-items: center; gap: var(--psw-space-2); }
  .psw-path--brand::before { content: ''; width: 0.42rem; height: 0.42rem; border-radius: 999px; background: var(--psw-color-brand-dot); box-shadow: 0 0 0.55rem color-mix(in srgb, var(--psw-color-brand-dot) 42%, transparent); }
  .psw-live-dot { width: 0.5rem; height: 0.5rem; border-radius: 999px; background: var(--psw-color-accent); box-shadow: 0 0 0.75rem rgba(230,216,168,0.38); animation: psw-live-pulse 1.8s ease-in-out infinite; }
  @keyframes psw-live-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.44; transform: scale(0.78); } }
  .psw-node { border: var(--psw-hairline) solid var(--psw-color-rule); border-radius: var(--psw-radius-panel); background: rgba(18,18,18,0.68); }
  .psw-graph-edge { stroke: var(--psw-color-rule-strong); stroke-width: 1; vector-effect: non-scaling-stroke; }
  .psw-axes-mark { display: block; aspect-ratio: 1; background: var(--psw-axes-gradient); -webkit-mask-image: var(--psw-axes-mask); mask-image: var(--psw-axes-mask); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; filter: drop-shadow(0 0 1.1rem var(--psw-axes-glow)); }
  
  
  @media (prefers-reduced-motion: reduce) {
    .psw-live-dot { animation: none !important; opacity: 1; transform: none; }
    .psw-button { transition: none; }
    .psw-button:hover, .psw-button:active { transform: none; }
  }
  :root { --home-rem-meter-inset-x: 0.25rem; --home-rem-meter-inset-y: 0.25rem; }
  body { isolation: isolate; }
  
  
  .home-coordinate { position: relative; min-height: 100svh; display: grid; place-items: center; padding: 5.8rem var(--psw-page-gutter) 4.6rem; }
  .home-ip-route { position: absolute; left: clamp(0.85rem, 2.4vw, 1.25rem); top: clamp(0.85rem, 2.4vw, 1.25rem); display: flex; align-items: flex-start; gap: 0.36rem; max-width: min(38rem, calc(100vw - 2rem)); margin: 0; color: var(--psw-color-muted); font: 650 0.68rem/1.45 var(--psw-font-mono); letter-spacing: 0.08em; overflow-wrap: anywhere; }
  .home-ip-line { min-width: 0; }
  .home-ip-route__domain { display: inline-flex; align-items: baseline; gap: 0; min-width: 0; white-space: nowrap; }
  .home-ip-route__token { appearance: none; -webkit-appearance: none; position: relative; display: inline-flex; align-items: baseline; justify-content: center; min-width: 0; min-height: 0; margin: 0; border: 0; border-radius: 0.02rem; padding: 0 0.06rem; background: transparent; color: var(--psw-color-muted); font: inherit; letter-spacing: inherit; cursor: pointer; transform: translateZ(0); }
  .home-ip-route__token:hover, .home-ip-route__token:focus-visible, .home-ip-route__token.is-open { color: var(--psw-color-ink); z-index: 12; }
  .home-ip-route__token:focus-visible { outline: var(--psw-focus-width) solid var(--psw-color-focus); outline-offset: var(--psw-focus-offset); }
  .home-ip-route__token-glyph { position: relative; z-index: 2; }
  .home-ip-route--knockout-ready .home-ip-route__token--knockout .home-ip-route__token-glyph { opacity: 0; }
  .home-ip-route__knockout { position: absolute; inset: 0; z-index: 1; display: block; width: 100%; height: 100%; overflow: visible; pointer-events: none; }
  .home-ip-route__knockout-rect { fill: var(--psw-color-muted); }
  .home-ip-route__token--knockout:hover .home-ip-route__knockout-rect,
  .home-ip-route__token--knockout:focus-visible .home-ip-route__knockout-rect,
  .home-ip-route__token--knockout.is-open .home-ip-route__knockout-rect { fill: var(--psw-color-ink); }
  /* Keep the absolutely positioned popover in the token's pointer path for the close-delay bridge. */
  .home-ip-route__popover { position: absolute; left: 0; top: calc(100% + 0.44rem); z-index: 20; display: none; gap: 0.08rem; width: max-content; min-width: 6.4rem; max-width: min(14rem, calc(100vw - 2rem)); padding: 0.48rem 0.56rem; border: var(--psw-hairline) solid var(--psw-color-rule-strong); border-radius: var(--psw-radius-panel); background: rgba(8,8,8,0.97); box-shadow: var(--psw-shadow-panel); color: var(--psw-color-ink); font: 700 0.72rem/1.35 var(--psw-font-mono); letter-spacing: 0.06em; text-align: left; opacity: 0; pointer-events: auto; transform: translate(var(--home-route-popover-x, 0), -0.18rem); }
  .home-ip-route__token:hover .home-ip-route__popover, .home-ip-route__token.is-open .home-ip-route__popover, .home-ip-route__token:focus-visible .home-ip-route__popover { display: grid; opacity: 1; transform: translate(var(--home-route-popover-x, 0), 0); }
  .home-ip-route__popover span { white-space: nowrap; }
  .home-ip-route__popover-token { color: var(--psw-color-muted); font-weight: 650; }
  .home-ip-route__addr { color: var(--psw-color-ink); text-transform: none; }
  .home-ip-route__via { font-weight: 500; }
  .home-core { width: min(48rem, 100%); min-width: 0; display: grid; justify-items: center; gap: 1.05rem; text-align: center; }
  .home-mark { position: relative; display: block; width: clamp(9rem, 19.8vw, 15.3rem); aspect-ratio: 1; pointer-events: none; }
  .home-mark__canvas { position: absolute; inset: 0; display: block; width: 100%; height: 100%; filter: drop-shadow(0 0 1.15rem var(--psw-axes-glow)); }
  .home-mark__fallback { --psw-axes-mask: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120%22%20height%3D%22120%22%20viewBox%3D%220%200%20120%20120%22%3E%0A%20%20%3Cdefs%3E%0A%20%20%20%20%3Cmarker%20id%3D%22ah-strong%22%20markerWidth%3D%2217%22%20markerHeight%3D%2217%22%20refX%3D%227%22%20refY%3D%228.5%22%20orient%3D%22auto%22%20markerUnits%3D%22userSpaceOnUse%22%3E%0A%20%20%20%20%20%20%3Cpolygon%20points%3D%220%200%2C%2017%208.5%2C%200%2017%22%20fill%3D%22black%22%2F%3E%0A%20%20%20%20%3C%2Fmarker%3E%0A%20%20%3C%2Fdefs%3E%0A%20%20%3Cline%20x1%3D%2260%22%20y1%3D%2270%22%20x2%3D%2260%22%20y2%3D%2220%22%20stroke%3D%22black%22%20stroke-width%3D%228.5%22%20marker-end%3D%22url(%23ah-strong)%22%2F%3E%0A%20%20%3Cline%20x1%3D%2260%22%20y1%3D%2270%22%20x2%3D%22100%22%20y2%3D%2270%22%20stroke%3D%22black%22%20stroke-width%3D%228.5%22%20marker-end%3D%22url(%23ah-strong)%22%2F%3E%0A%20%20%3Cline%20x1%3D%2260%22%20y1%3D%2270%22%20x2%3D%2233%22%20y2%3D%2297%22%20stroke%3D%22black%22%20stroke-width%3D%228.5%22%20marker-end%3D%22url(%23ah-strong)%22%2F%3E%0A%3C%2Fsvg%3E'); position: absolute; inset: 0; width: 100%; }
  .home-interest-line { margin: 0; width: min(44rem, 100%); max-width: calc(100vw - 2rem); color: var(--psw-color-ink); font-size: 1.05rem; line-height: 1.62; overflow-wrap: anywhere; }
  .interest-link { color: var(--psw-color-ink); text-decoration-color: color-mix(in srgb, var(--psw-color-accent-warm) 68%, transparent); overflow-wrap: anywhere; }
  .interest-link:hover { color: #fff; text-decoration-color: var(--psw-color-accent-warm); }
  .home-tokenizer-cta { margin-top: 0.1rem; display: inline-grid; grid-template-columns: minmax(0, auto) auto; align-items: center; gap: 0.55rem; max-width: min(100%, 35rem); border-radius: var(--psw-radius-panel); padding: 0.12rem; color: var(--psw-color-ink); text-align: left; text-decoration: none; }
  .home-tokenizer-cta:focus-visible { outline: var(--psw-focus-width) solid var(--psw-color-focus); outline-offset: var(--psw-focus-offset); }
  .home-tokenizer-cta__question { min-width: 0; font: 650 0.84rem/1.3 var(--psw-font-sans); letter-spacing: 0; overflow-wrap: anywhere; text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--psw-color-accent) 48%, transparent); text-underline-offset: 0.18em; }
  .home-tokenizer-cta:hover .home-tokenizer-cta__question, .home-tokenizer-cta:focus-visible .home-tokenizer-cta__question { color: #fff; text-decoration-color: var(--psw-color-accent); }
  .home-tokenizer-cta__action { min-height: 1.85rem; display: inline-flex; align-items: center; border: var(--psw-hairline) solid color-mix(in srgb, var(--psw-color-accent) 46%, var(--psw-color-rule)); border-radius: var(--psw-radius-panel); padding: 0.42rem 0.68rem 0.4rem; background: var(--psw-color-ink); color: var(--psw-color-bg); font: 650 0.72rem/1 var(--psw-font-mono); letter-spacing: 0.12em; white-space: nowrap; }
  .home-tokenizer-cta:hover .home-tokenizer-cta__action, .home-tokenizer-cta:focus-visible .home-tokenizer-cta__action { border-color: var(--psw-color-accent); background: var(--psw-color-accent); color: var(--psw-color-bg); }
  .home-watching { margin: 0.15rem 0 0; display: inline-flex; align-items: flex-start; justify-content: center; gap: 0.5rem; color: var(--psw-color-muted); font: 500 0.88rem/1.5 var(--psw-font-sans); letter-spacing: 0; text-transform: none; }
  .home-watching__dot { flex: 0 0 auto; width: 0.45rem; height: 0.45rem; margin-top: 0.44em; border-radius: 999px; background: var(--psw-color-accent-warm); opacity: 0.62; }
  .home-watching__link { color: var(--psw-color-muted); text-decoration-color: color-mix(in srgb, var(--psw-color-accent) 48%, transparent); }
  .home-watching__link:hover { color: var(--psw-color-ink); text-decoration-color: var(--psw-color-accent); }
  .home-issue-dock { position: fixed; right: var(--home-rem-meter-inset-x); bottom: calc(var(--home-rem-meter-inset-y) + 2rem); z-index: 24; display: grid; justify-items: end; gap: 0.35rem; }
  .home-issue-cta { min-height: 2rem; padding-top: 0.2rem; padding-bottom: 0.2rem; white-space: nowrap; }
  .home-issue-fallback { margin: var(--psw-space-2) 0 0; color: var(--psw-color-muted); font: 650 0.72rem/1.4 var(--psw-font-mono); letter-spacing: 0.1em; text-transform: uppercase; }
  .home-rem-meter { position: fixed; right: var(--home-rem-meter-inset-x); bottom: var(--home-rem-meter-inset-y); z-index: 9999; width: auto; height: 1rem; margin: 0; background: rgba(128,128,128,0.5); color: #fff; font-size: 0.65rem; line-height: 1rem; font-family: system-ui, sans-serif; text-align: center; white-space: nowrap; pointer-events: none; }
  .issue-intake-dialog { padding: 0; border: none; background: transparent; color: inherit; width: min(44rem, calc(100vw - 2rem)); max-width: 44rem; max-height: calc(100vh - 2rem); overflow: auto; }
  .issue-intake-dialog::backdrop { background: rgba(0,0,0,0.58); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
  .issue-intake-dialog[open] { animation: issue-intake-rise 220ms ease-out; }
  @keyframes issue-intake-rise { from { opacity: 0; transform: translateY(0.6rem); } to { opacity: 1; transform: translateY(0); } }
  @media (prefers-reduced-motion: reduce) { .issue-intake-dialog[open] { animation: none; } }
  @media (pointer: coarse) { .home-ip-route__token::after { content: ''; position: absolute; inset: -0.42rem -0.16rem -0.44rem; z-index: 3; } }
  @media (forced-colors: active) { .home-mark { display: none; } .home-ip-route--knockout-ready .home-ip-route__token--knockout .home-ip-route__token-glyph { opacity: 1; } .home-ip-route__knockout { display: none; } .home-tokenizer-cta__action { border-color: ButtonText; background: ButtonFace; color: ButtonText; } }
  @media (max-width: 48rem) {
    .home-coordinate { place-items: start center; align-content: center; padding-top: 5.75rem; }
    .home-core { gap: 0.9rem; }
    .home-mark { width: min(10.8rem, 54vw); }
    .home-interest-line { font-size: 1rem; }
    .home-tokenizer-cta { grid-template-columns: minmax(0, 1fr) auto; justify-self: stretch; max-width: 25rem; }
    .home-watching { max-width: 100%; align-items: flex-start; font-size: 0.82rem; line-height: 1.5; }
    .home-issue-cta { min-height: 2.25rem; }
  }
  @media (max-width: 28rem) {
    .home-ip-route { font-size: 0.62rem; line-height: 1.55; }
    .home-interest-line { width: min(20.5rem, 100%); }
    .home-tokenizer-cta { justify-self: center; max-width: 100%; }
    .home-tokenizer-cta__question { font-size: 0.76rem; }
    .home-watching { text-align: left; }
  }
  @media (max-width: 22rem) {
    .home-tokenizer-cta { grid-template-columns: 1fr; justify-items: center; gap: 0.4rem; text-align: center; }
    .home-tokenizer-cta__action { min-height: 1.65rem; }
    .home-watching { justify-self: start; justify-content: flex-start; width: min(10.5rem, calc(100vw - 10rem)); }
  }
  @media (max-height: 30rem) and (max-width: 56rem) {
    .home-coordinate { align-content: start; padding-top: 3.2rem; padding-bottom: 1.6rem; }
    .home-core { gap: 0.45rem; }
    .home-mark { width: 5.2rem; }
    .home-interest-line { max-width: 38rem; font-size: 0.82rem; line-height: 1.35; }
    .home-tokenizer-cta { margin-top: 0; padding: 0; }
    .home-tokenizer-cta__question { font-size: 0.74rem; line-height: 1.2; }
    .home-tokenizer-cta__action { min-height: 1.5rem; padding: 0.32rem 0.5rem 0.3rem; font-size: 0.72rem; }
    .home-watching { font-size: 0.66rem; line-height: 1.35; }
  }
  
  .issue-form-shell { width: min(44rem, calc(100vw - 2rem)); display: grid; gap: 1.25rem; }
  .issue-form-card { --psw-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace; --psw-rule: rgba(214,206,188,0.16); --psw-rule-warm: rgba(255,204,102,0.7); --psw-ink: rgba(246,244,238,0.94); --psw-ink-mute: rgba(202,198,188,0.72); --psw-ink-dim: rgba(160,154,142,0.54); --psw-paper: rgba(18,18,18,0.94); --psw-stamp: linear-gradient(45deg, darkred 5%, crimson, darkorange 60%, gold, bisque); position: relative; border: 1px solid var(--psw-rule); border-radius: 0; padding: 1.4rem 1.4rem 1.4rem 2.1rem; background: var(--psw-paper); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); box-shadow: 0 1.5rem 3rem rgba(0,0,0,0.5), inset 0 0 0 1px rgba(255,255,255,0.04); color: var(--psw-ink); overflow: hidden; }
  .issue-form-card::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 0.4rem; background: var(--psw-stamp); }
  .issue-form-card::after { content: ''; position: absolute; left: 1.05rem; top: 0.6rem; bottom: 0.6rem; width: 1px; background-image: linear-gradient(180deg, var(--psw-rule) 0 50%, transparent 50% 100%); background-size: 1px 0.45rem; opacity: 0.7; pointer-events: none; }
  .issue-form-head { display: grid; grid-template-columns: 1fr auto; gap: 1.5rem; align-items: start; padding-bottom: 0.85rem; border-bottom: 1px solid var(--psw-rule); }
  .issue-form-id { margin: 0; display: inline-flex; align-items: center; gap: 0.55rem; font: 600 0.7rem/1 var(--psw-mono); letter-spacing: 0.18em; text-transform: uppercase; color: var(--psw-ink-mute); }
  .issue-form-id::before { content: ''; width: 0.5rem; height: 0.5rem; background: var(--psw-stamp); }
  .issue-form-title { margin: 0.55rem 0 0; font: 800 1.6rem/1.05 system-ui, sans-serif; letter-spacing: -0.015em; }
  .issue-form-lede { margin: 0.4rem 0 0; max-width: 32rem; color: var(--psw-ink-mute); font: 400 0.94rem/1.45 system-ui, sans-serif; }
  .issue-form-close { border: 1px solid var(--psw-rule); background: transparent; color: var(--psw-ink); padding: 0.4rem 0.7rem; font: 600 0.7rem/1 var(--psw-mono); letter-spacing: 0.16em; text-transform: uppercase; cursor: pointer; border-radius: 0; transition: border-color 120ms ease, background 120ms ease; }
  .issue-form-close:hover { border-color: var(--psw-rule-warm); background: rgba(255,217,61,0.08); }
  .issue-form-message { margin: 1.1rem 0 0; border-left: 0.2rem solid #ff8b8b; padding: 0.7rem 0.9rem; background: rgba(255,139,139,0.08); color: #ffd2d2; font: 400 0.92rem/1.45 system-ui, sans-serif; }
  .issue-form { display: grid; gap: 1.35rem; margin-top: 1.15rem; }
  .issue-form__field { display: grid; gap: 0.45rem; position: relative; }
  .issue-form__split { display: grid; gap: 1.35rem; }
  .issue-form__eyebrow { display: flex; align-items: baseline; justify-content: space-between; gap: 0.7rem; font: 600 0.7rem/1 var(--psw-mono); letter-spacing: 0.16em; text-transform: uppercase; color: var(--psw-ink-mute); }
  .issue-form__eyebrow-name > span:first-child { color: var(--psw-ink-dim); margin-right: 0.55rem; letter-spacing: 0.1em; }
  .issue-form__eyebrow-meta { color: var(--psw-ink-dim); font-weight: 500; letter-spacing: 0.14em; }
  .issue-form__count { letter-spacing: 0.04em; font-variant-numeric: tabular-nums; transition: color 120ms ease; }
  .issue-form__count[data-near-limit] { color: var(--psw-rule-warm); }
  .issue-form__count[data-at-limit] { color: #ff8b8b; }
  .issue-form__input, .issue-form__textarea, .issue-form__select { width: 100%; border: 0; border-bottom: 1px solid var(--psw-rule); border-radius: 0; padding: 0.55rem 0.15rem; background: transparent; color: var(--psw-ink); box-sizing: border-box; font: 400 1rem/1.45 system-ui, sans-serif; transition: border-color 140ms ease, background 140ms ease; }
  .issue-form__input:focus, .issue-form__textarea:focus, .issue-form__select:focus { outline: none; border-bottom-color: var(--psw-rule-warm); background: rgba(255,217,61,0.05); }
  .issue-form__input:focus-visible, .issue-form__textarea:focus-visible, .issue-form__select:focus-visible { outline: none; }
  .issue-form__input::placeholder, .issue-form__textarea::placeholder { color: var(--psw-ink-dim); }
  .issue-form__textarea { min-height: 8.5rem; resize: vertical; }
  .issue-form__select { appearance: none; -webkit-appearance: none; padding-right: 1.6rem; cursor: pointer; background-image: linear-gradient(45deg, transparent 50%, var(--psw-ink-mute) 50%), linear-gradient(135deg, var(--psw-ink-mute) 50%, transparent 50%); background-position: calc(100% - 0.85rem) calc(50% + 1px), calc(100% - 0.55rem) calc(50% + 1px); background-size: 0.32rem 0.32rem; background-repeat: no-repeat; }
  .issue-form__select option { background: #111; color: var(--psw-ink); }
  .issue-form__hint { margin: 0; color: var(--psw-ink-mute); font: 400 0.78rem/1.5 var(--psw-mono); letter-spacing: 0.02em; }
  .issue-form__hint::before { content: '→ '; color: var(--psw-ink-dim); }
  .issue-form__error { margin: 0; color: #ff8b8b; font: 600 0.76rem/1.45 var(--psw-mono); letter-spacing: 0.04em; }
  .issue-form__error::before { content: '✕ '; }
  .issue-form__check { display: grid; grid-template-columns: auto 1fr; gap: 0.85rem; align-items: start; padding: 0.85rem 0; border-top: 1px dashed var(--psw-rule); border-bottom: 1px dashed var(--psw-rule); cursor: pointer; }
  .issue-form__check input { appearance: none; -webkit-appearance: none; width: 1.2rem; height: 1.2rem; margin: 0.15rem 0 0; border: 1px solid var(--psw-rule); border-radius: 0; background: transparent; cursor: pointer; position: relative; transition: border-color 120ms ease, background 120ms ease; }
  .issue-form__check input:focus-visible { outline: 1px solid var(--psw-rule-warm); outline-offset: 2px; }
  .issue-form__check input:checked { border-color: transparent; background: var(--psw-stamp); }
  .issue-form__check input:checked::after { content: ''; position: absolute; left: 0.32rem; top: 0.05rem; width: 0.3rem; height: 0.62rem; border: 0 solid #1a0a02; border-right-width: 2px; border-bottom-width: 2px; transform: rotate(42deg); }
  .issue-form__check-body { display: grid; gap: 0.3rem; }
  .issue-form__check-label { font: 600 0.78rem/1 var(--psw-mono); letter-spacing: 0.14em; text-transform: uppercase; color: var(--psw-ink); }
  .issue-form__check-hint { margin: 0; color: var(--psw-ink-mute); font: 400 0.88rem/1.4 system-ui, sans-serif; }
  .issue-form__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 1.2rem; margin-top: 0.25rem; }
  .issue-form__submit { position: relative; border: 0; border-radius: 0; padding: 0.85rem 1.35rem 0.85rem 1.45rem; background: var(--psw-stamp); color: #1a0a02; font: 800 0.82rem/1 system-ui, sans-serif; letter-spacing: 0.2em; text-transform: uppercase; cursor: pointer; box-shadow: 0 0.35rem 0 rgba(0,0,0,0.32), 0 0.55rem 1.6rem rgba(255,138,80,0.18); transition: transform 120ms ease, box-shadow 120ms ease; }
  .issue-form__submit:hover { transform: translateY(-1px); box-shadow: 0 0.45rem 0 rgba(0,0,0,0.32), 0 0.7rem 1.9rem rgba(255,180,80,0.32); }
  .issue-form__submit:active { transform: translateY(2px); box-shadow: 0 0.15rem 0 rgba(0,0,0,0.32); }
  .issue-form__submit::after { content: '▸'; margin-left: 0.65rem; }
  .issue-form__link { color: var(--psw-ink-mute); font: 600 0.7rem/1 var(--psw-mono); letter-spacing: 0.16em; text-transform: uppercase; text-decoration: none; padding-bottom: 0.18rem; border-bottom: 1px solid var(--psw-rule); transition: color 120ms ease, border-color 120ms ease; }
  .issue-form__link:hover { color: var(--psw-ink); border-bottom-color: var(--psw-rule-warm); }
  .issue-form__trap { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
  @media (min-width: 40rem) {
    .issue-form__split { grid-template-columns: 1fr 1fr; gap: 1.6rem; }
    .issue-form-card { padding: 1.6rem 1.7rem 1.6rem 2.4rem; }
  }
  @media (prefers-reduced-motion: reduce) {
    .issue-form__submit { transition: none; }
    .issue-form__submit:hover, .issue-form__submit:active { transform: none; }
  }
  
  
</style>
<body>



<main class="home-coordinate" aria-labelledby="homeTitle">
  <h1 id="homeTitle" class="psw-visually-hidden">pshields.net</h1>
  <p class="home-ip-route"><span class="home-ip-line"><span class="psw-visually-hidden">Request route </span><span class="home-ip-route__domain" role="group" aria-label="pshields.net" aria-keyshortcuts="ArrowLeft ArrowRight Home End"><button class="home-ip-route__token" type="button" data-token-index="1" data-token-id="975" tabindex="0" aria-label="ps, Gemma 4 token ID 975"><span class="home-ip-route__token-glyph">ps</span><span class="home-ip-route__popover"><span class="home-ip-route__popover-token">ps</span><span>Gemma 4 token ID 975</span></span></button><button class="home-ip-route__token home-ip-route__token--knockout" type="button" data-token-index="2" data-token-id="236754" tabindex="-1" aria-label="h, Gemma 4 token ID 236754"><span class="home-ip-route__token-glyph">h</span><svg class="home-ip-route__knockout" aria-hidden="true" focusable="false"><defs><mask id="home-route-token-mask-2" maskUnits="userSpaceOnUse"><rect class="home-ip-route__knockout-mask-bg" fill="white"></rect><text class="home-ip-route__knockout-mask-text" text-anchor="middle" dominant-baseline="alphabetic" fill="black">h</text></mask></defs><rect class="home-ip-route__knockout-rect" mask="url(#home-route-token-mask-2)"></rect></svg><span class="home-ip-route__popover"><span class="home-ip-route__popover-token">h</span><span>Gemma 4 token ID 236754</span></span></button><button class="home-ip-route__token" type="button" data-token-index="3" data-token-id="1259" tabindex="-1" aria-label="ield, Gemma 4 token ID 1259"><span class="home-ip-route__token-glyph">ield</span><span class="home-ip-route__popover"><span class="home-ip-route__popover-token">ield</span><span>Gemma 4 token ID 1259</span></span></button><button class="home-ip-route__token home-ip-route__token--knockout" type="button" data-token-index="4" data-token-id="236751" tabindex="-1" aria-label="s, Gemma 4 token ID 236751"><span class="home-ip-route__token-glyph">s</span><svg class="home-ip-route__knockout" aria-hidden="true" focusable="false"><defs><mask id="home-route-token-mask-4" maskUnits="userSpaceOnUse"><rect class="home-ip-route__knockout-mask-bg" fill="white"></rect><text class="home-ip-route__knockout-mask-text" text-anchor="middle" dominant-baseline="alphabetic" fill="black">s</text></mask></defs><rect class="home-ip-route__knockout-rect" mask="url(#home-route-token-mask-4)"></rect></svg><span class="home-ip-route__popover"><span class="home-ip-route__popover-token">s</span><span>Gemma 4 token ID 236751</span></span></button><button class="home-ip-route__token" type="button" data-token-index="5" data-token-id="236761" tabindex="-1" aria-label="period, Gemma 4 token ID 236761"><span class="home-ip-route__token-glyph">.</span><span class="home-ip-route__popover"><span class="home-ip-route__popover-token">.</span><span>Gemma 4 token ID 236761</span></span></button><button class="home-ip-route__token home-ip-route__token--knockout" type="button" data-token-index="6" data-token-id="2108" tabindex="-1" aria-label="net, Gemma 4 token ID 2108"><span class="home-ip-route__token-glyph">net</span><svg class="home-ip-route__knockout" aria-hidden="true" focusable="false"><defs><mask id="home-route-token-mask-6" maskUnits="userSpaceOnUse"><rect class="home-ip-route__knockout-mask-bg" fill="white"></rect><text class="home-ip-route__knockout-mask-text" text-anchor="middle" dominant-baseline="alphabetic" fill="black">net</text></mask></defs><rect class="home-ip-route__knockout-rect" mask="url(#home-route-token-mask-6)"></rect></svg><span class="home-ip-route__popover"><span class="home-ip-route__popover-token">net</span><span>Gemma 4 token ID 2108</span></span></button></span> / <span class="home-ip-route__addr">66.102.9.131</span></span></p>
  <section class="home-core">
    <div class="home-mark home-mark--3d" id="homeIdentityMark" data-home-identity-mark aria-hidden="true">
  <canvas class="home-mark__canvas" data-home-identity-mark-canvas></canvas>
  <template data-home-identity-mark-fallback><span class="home-mark__fallback psw-axes-mark"></span></template>
  <noscript><span class="home-mark__fallback psw-axes-mark"></span></noscript>
</div>
    <p class="home-interest-line">My interests include <a class="interest-link" href="/topic/agentic-engineering">agentic engineering</a>, attention management, context engineering, context management, cross products, harness engineering, issue tracking, spec-driven development, and web development.</p>
    <p class="home-watching">
  <span class="home-watching__dot" aria-hidden="true"></span>
  <a class="home-watching__link" href="https://www.youtube.com/watch?v=RtywqDFBYnQ" target="_blank" rel="noopener noreferrer" aria-label="Recently watched on YouTube: Memory and dreaming for self-learning agents">Recently watched: Memory and dreaming for self-learning agents</a>
</p>
    <a class="home-tokenizer-cta" href="/tokenizer">
  <span class="home-tokenizer-cta__question">How does Gemma 4 tokenize a string?</span>
  <span class="home-tokenizer-cta__action" aria-hidden="true">FIND OUT</span>
</a>
  </section>
  <div class="home-rem-meter" id="remOverlay" aria-label="Viewport size in rems"></div>
  <div class="home-issue-dock">
    <button class="home-issue-cta psw-button psw-button--cta" id="issueIntakeButton" type="button" aria-controls="issueIntakeDialog" aria-expanded="false" aria-haspopup="dialog"><svg aria-hidden="true" focusable="false" viewBox="0 0 24 24"><path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z"></path><path d="M14 3v5h5"></path><path d="M12 12v6"></path><path d="M9 15h6"></path></svg>File issue</button>
<noscript><p class="home-issue-fallback"><a href="/issues/file">Open full-page form</a></p></noscript>
<dialog class="issue-intake-dialog" id="issueIntakeDialog" aria-labelledby="issueIntakeTitle">
  <div class="issue-form-card">
  <div class="issue-form-head">
    <p class="issue-form-id">Form A · Issue intake</p>
    <button class="issue-form-close" id="issueIntakeClose" type="button">Close</button>
  </div>
  <h2 class="issue-form-title" id="issueIntakeTitle">File an issue</h2>
  <p class="issue-form-lede">Bug, idea, question — drop it here without leaving the site</p>
  
<form class="issue-form" action="/issues" method="post">
  <div class="issue-form__field">
    <div class="issue-form__eyebrow">
    <span class="issue-form__eyebrow-name"><span aria-hidden="true">§ 01</span>Title</span>
    <span class="issue-form__eyebrow-meta issue-form__count" data-issue-form-count-for="issueTitle" data-issue-form-count-max="120" aria-live="polite">0/120</span>
  </div>
    <input class="issue-form__input" id="issueTitle" name="title" maxlength="120" placeholder="Brief summary" required value="">
    
  </div>
  <div class="issue-form__split">
    <div class="issue-form__field">
      <div class="issue-form__eyebrow">
    <span class="issue-form__eyebrow-name"><span aria-hidden="true">§ 02</span>Category</span>
    
  </div>
      <select class="issue-form__select" id="issueCategory" name="category" required>
        <option value="">Choose one</option><option value="bug">Bug</option><option value="idea">Idea</option><option value="question">Question</option><option value="other">Other</option>
      </select>
      
    </div>
    <div class="issue-form__field">
      <div class="issue-form__eyebrow">
    <span class="issue-form__eyebrow-name"><span aria-hidden="true">§ 03</span>Email</span>
    <span class="issue-form__eyebrow-meta">optional</span>
  </div>
      <input class="issue-form__input" id="issueReporterEmail" name="reporterEmail" maxlength="254" placeholder="you@example.com" type="email" value="">
      
    </div>
  </div>
  <div class="issue-form__field">
    <div class="issue-form__eyebrow">
    <span class="issue-form__eyebrow-name"><span aria-hidden="true">§ 04</span>Details</span>
    <span class="issue-form__eyebrow-meta issue-form__count" data-issue-form-count-for="issueDetails" data-issue-form-count-max="4000" aria-live="polite">0/4000</span>
  </div>
    <textarea class="issue-form__textarea" id="issueDetails" name="details" maxlength="4000" placeholder="What happened, what you expected, or what you would like to see" required></textarea>
    <p class="issue-form__hint">Keep it lightweight but specific enough that I can act on it</p>
    
  </div>
  <div class="issue-form__field">
    <div class="issue-form__eyebrow">
    <span class="issue-form__eyebrow-name"><span aria-hidden="true">§ 05</span>Passcode</span>
    <span class="issue-form__eyebrow-meta">optional</span>
  </div>
    <input class="issue-form__input" id="issuePasscode" name="passcode" maxlength="64" placeholder="Enter a passcode if you have one" value="">
    <p class="issue-form__hint">Continue without one while the daily anonymous bucket has room</p>
    
  </div>
  <div class="issue-form__field issue-form__trap" aria-hidden="true">
    <label for="issueOrganization">Organization</label>
    <input class="issue-form__input" id="issueOrganization" name="organization" tabindex="-1" autocomplete="off" value="">
    
  </div>
  <label class="issue-form__check" for="issueAllowPublic">
    <input id="issueAllowPublic" name="allowPublic" type="checkbox">
    <span class="issue-form__check-body">
      <span class="issue-form__check-label">Okay to make public later</span>
      <p class="issue-form__check-hint">Everything starts private, but this lets me consider publishing the issue later</p>
    </span>
  </label>
  <div class="issue-form__actions">
    <button class="issue-form__submit" type="submit">Submit issue</button>
    <a class="issue-form__link" href="/issues/file">Open full page</a>
  </div>
</form>
</div>
</dialog>
  </div>
</main>


<script>
(function(){var route=document.querySelector('.home-ip-route');if(!route)return;var selector='.home-ip-route__token';var routeTokenCloseDelay=150;var popoverEdgeGutter=8;var closeRouteTokenHandle=0;function clearRouteTokenClose(){if(closeRouteTokenHandle!==0){window.clearTimeout(closeRouteTokenHandle);closeRouteTokenHandle=0;}}function scheduleCloseRouteToken(token){clearRouteTokenClose();closeRouteTokenHandle=window.setTimeout(function(){token.classList.remove('is-open');closeRouteTokenHandle=0;},routeTokenCloseDelay);}function layoutRouteTokenPopover(token){var popover=token.querySelector('.home-ip-route__popover');if(!popover)return;var currentOffset=parseFloat(popover.style.getPropertyValue('--home-route-popover-x'))||0;var viewportWidth=Math.max(document.documentElement.clientWidth||0,window.innerWidth||0);var rect=popover.getBoundingClientRect();var baseLeft=rect.left-currentOffset;var baseRight=rect.right-currentOffset;var minOffset=popoverEdgeGutter-baseLeft;var maxOffset=viewportWidth-popoverEdgeGutter-baseRight;var offset=maxOffset<minOffset?minOffset:Math.min(Math.max(0,minOffset),maxOffset);popover.style.setProperty('--home-route-popover-x',offset+'px');}function layoutKnockouts(){var canvas=layoutKnockouts.canvas||(layoutKnockouts.canvas=document.createElement('canvas'));var context=canvas.getContext('2d');document.querySelectorAll('.home-ip-route__token--knockout').forEach(function(token){var svg=token.querySelector('.home-ip-route__knockout');var maskBg=token.querySelector('.home-ip-route__knockout-mask-bg');var maskText=token.querySelector('.home-ip-route__knockout-mask-text');var rect=token.querySelector('.home-ip-route__knockout-rect');var glyph=token.querySelector('.home-ip-route__token-glyph');if(!svg||!maskBg||!maskText||!rect||!glyph)return;var tokenBox=token.getBoundingClientRect();var tokenStyle=getComputedStyle(token);var width=Math.max(tokenBox.width,1);var height=Math.max(tokenBox.height,1);var radius=Math.min(parseFloat(tokenStyle.borderTopLeftRadius)||0,height/2);var fontSize=parseFloat(tokenStyle.fontSize)||height;var baselineY=height/2;if(context){context.font=tokenStyle.fontWeight+' '+tokenStyle.fontSize+' '+tokenStyle.fontFamily;var metrics=context.measureText(glyph.textContent||'');var ascent=metrics.actualBoundingBoxAscent||fontSize*0.8;var descent=metrics.actualBoundingBoxDescent||fontSize*0.2;baselineY=(height-ascent-descent)/2+ascent;}svg.setAttribute('viewBox','0 0 '+width+' '+height);svg.setAttribute('width',String(width));svg.setAttribute('height',String(height));maskBg.setAttribute('x','0');maskBg.setAttribute('y','0');maskBg.setAttribute('width',String(width));maskBg.setAttribute('height',String(height));rect.setAttribute('x','0');rect.setAttribute('y','0');rect.setAttribute('width',String(width));rect.setAttribute('height',String(height));rect.setAttribute('rx',String(radius));maskText.setAttribute('x',String(width/2));maskText.setAttribute('y',String(baselineY));maskText.setAttribute('font-family',tokenStyle.fontFamily);maskText.setAttribute('font-size',tokenStyle.fontSize);maskText.setAttribute('font-weight',tokenStyle.fontWeight);maskText.setAttribute('letter-spacing',tokenStyle.letterSpacing);});route.classList.add('home-ip-route--knockout-ready');}function closeRouteTokens(currentToken){clearRouteTokenClose();document.querySelectorAll('.home-ip-route__token.is-open').forEach(function(token){if(token!==currentToken){token.classList.remove('is-open');}});}function openRouteToken(token){closeRouteTokens(token);token.classList.add('is-open');layoutRouteTokenPopover(token);}function getEventToken(event){return event.target instanceof Element?event.target.closest(selector):null;}layoutKnockouts();requestAnimationFrame(layoutKnockouts);if(document.fonts&&document.fonts.ready){document.fonts.ready.then(function(){layoutKnockouts();document.querySelectorAll(selector+'.is-open').forEach(layoutRouteTokenPopover);});}if('ResizeObserver'in window){var knockoutResizeObserver=new ResizeObserver(layoutKnockouts);document.querySelectorAll(selector).forEach(function(token){knockoutResizeObserver.observe(token);});}window.addEventListener('resize',function(){layoutKnockouts();document.querySelectorAll(selector+'.is-open').forEach(layoutRouteTokenPopover);},{passive:true});document.addEventListener('pointerover',function(event){var token=getEventToken(event);if(token)openRouteToken(token);});document.addEventListener('pointerout',function(event){var token=getEventToken(event);if(!token)return;if(event.relatedTarget instanceof Node&&token.contains(event.relatedTarget))return;scheduleCloseRouteToken(token);});document.addEventListener('focusin',function(event){var token=getEventToken(event);if(token)openRouteToken(token);});document.addEventListener('focusout',function(event){var token=getEventToken(event);if(token)scheduleCloseRouteToken(token);});document.addEventListener('click',function(event){var token=getEventToken(event);if(token){openRouteToken(token);return;}closeRouteTokens(null);});document.addEventListener('keydown',function(event){if(event.key==='Escape'){closeRouteTokens(null);return;}var token=getEventToken(event);if(!token||['ArrowLeft','ArrowRight','Home','End'].indexOf(event.key)===-1)return;var tokens=Array.prototype.slice.call(route.querySelectorAll(selector));var currentIndex=tokens.indexOf(token);var lastIndex=tokens.length-1;var nextIndex=currentIndex;if(event.key==='ArrowLeft')nextIndex=currentIndex===0?lastIndex:currentIndex-1;else if(event.key==='ArrowRight')nextIndex=currentIndex===lastIndex?0:currentIndex+1;else if(event.key==='Home')nextIndex=0;else if(event.key==='End')nextIndex=lastIndex;event.preventDefault();tokens.forEach(function(routeToken){routeToken.tabIndex=-1;});var nextToken=tokens[nextIndex];nextToken.tabIndex=0;nextToken.focus();openRouteToken(nextToken);});})();
(function(){var el=document.getElementById('remOverlay');if(!el)return;function update(){var rem=parseFloat(getComputedStyle(document.documentElement).fontSize)||16;var floorW=Math.floor(window.innerWidth/rem);var floorH=Math.floor(window.innerHeight/rem);var marginX=(window.innerWidth-floorW*rem)/2;var marginY=(window.innerHeight-floorH*rem)/2;var root=document.documentElement;root.style.setProperty('--home-rem-meter-inset-x',marginX+'px');root.style.setProperty('--home-rem-meter-inset-y',marginY+'px');root.style.backgroundPosition=(marginX-0.5*rem)+'px '+(marginY-0.5*rem)+'px';el.innerHTML=floorW+' &times; '+floorH;el.setAttribute('aria-label',floorW+' by '+floorH+' rem viewport');el.style.width='auto';var natural=el.getBoundingClientRect().width;el.style.width=Math.ceil(natural/rem)+'rem';}window.addEventListener('resize',update,{passive:true});update();})();
(function(){window.homeIdentityMarkFallback=function(){document.querySelectorAll('[data-home-identity-mark]').forEach(function(mark){if(mark.querySelector('.home-mark__fallback'))return;var template=mark.querySelector('[data-home-identity-mark-fallback]');if(template&&'content'in template){mark.appendChild(template.content.cloneNode(true));}});};})();
(function() {
  const issueDialog = document.getElementById('issueIntakeDialog');
  const issueButton = document.getElementById('issueIntakeButton');
  const issueClose = document.getElementById('issueIntakeClose');
  if (typeof HTMLDialogElement === 'undefined' || !(issueDialog instanceof HTMLDialogElement)) {
    issueButton?.addEventListener('click', () => {
      window.location.href = '/issues/file';
    });
    return;
  }
  issueButton?.addEventListener('click', () => {
    if (!issueDialog.open) {
      issueDialog.showModal();
      issueButton.setAttribute('aria-expanded', 'true');
    }
  });
  issueClose?.addEventListener('click', () => {
    if (issueDialog.open) {
      issueDialog.close();
    }
  });
  issueDialog.addEventListener('click', (event) => {
    if (event.target === issueDialog) {
      issueDialog.close();
    }
  });
  issueDialog.addEventListener('close', () => {
    issueButton?.setAttribute('aria-expanded', 'false');
  });
})();
(function(){var counters=document.querySelectorAll('[data-issue-form-count-for]');function bind(counter){var input=document.getElementById(counter.getAttribute('data-issue-form-count-for'));if(!input)return;var max=parseInt(counter.getAttribute('data-issue-form-count-max'),10);function update(){var len=input.value.length;counter.textContent=len+'/'+max;if(len>=max){counter.setAttribute('data-at-limit','');counter.removeAttribute('data-near-limit');}else if(len>=Math.floor(max*0.9)){counter.setAttribute('data-near-limit','');counter.removeAttribute('data-at-limit');}else{counter.removeAttribute('data-near-limit');counter.removeAttribute('data-at-limit');}}input.addEventListener('input',update);}for(var i=0;i<counters.length;i++)bind(counters[i]);})();
</script>
<script type="module" src="/homepage/identity-mark.js" onerror="window.homeIdentityMarkFallback&&window.homeIdentityMarkFallback()"></script>
</body>
</html>