/* Netlify HUD — the badge and owner toolbar Netlify injects on published sites. Built inside a srcdoc iframe from the data-* attributes on the injected tag. */ (() => { "use strict"; const script = document.currentScript || document.querySelector("script[data-nf-variant]"); if (!script) return; const ds = script.dataset; const warn = (msg) => console.warn("[netlify-hud] " + msg + "; not rendering"); const raw = ds.nfVariant; if (!raw) return; const variant = raw === "public" || raw === "owner-private" ? raw : null; if (!variant) return warn("unknown variant: " + raw); const APP_HOSTS = ["app.netlify.com", "app.netlifystg.com"]; const APP_HOST = APP_HOSTS.indexOf(ds.appHost || "") !== -1 ? ds.appHost : ""; const SITE_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test( ds.netlifySiteId || "" ) ? ds.netlifySiteId : ""; if (!APP_HOST) return warn("missing or invalid data-app-host"); if (variant === "owner-private" && !SITE_ID) return warn("missing or invalid data-netlify-site-id"); // Baked at deploy from BRANCH (see netlify.toml): the canary branch, or blank on production/local. let HUD_VARIANT = "main"; if (HUD_VARIANT === "main" || !/^[a-z0-9-]+$/.test(HUD_VARIANT)) HUD_VARIANT = ""; if ( document.getElementById("nl-hud-frame") || document.getElementById("nl-badge-frame") ) return; /* ————— Dismissal, remembered per site and per device ————— */ const STORE_KEY = "nl-hud:" + variant + ":v1"; const readState = () => { try { return localStorage.getItem(STORE_KEY) || ""; } catch (e) { return ""; } }; const writeState = (value) => { try { if (value) localStorage.setItem(STORE_KEY, value); else localStorage.removeItem(STORE_KEY); } catch (e) { } }; const saved = readState(); if (saved === "hidden") return; const startMinimized = variant === "owner-private" && saved === "mini"; const overview = (query) => `https://${APP_HOST}/projects/${SITE_ID}/overview?${query}`; const hudLink = (query, action) => overview(query + "&from_hud=private" + (HUD_VARIANT ? "," + HUD_VARIANT : "") + "&hud_action=" + action); const promptLink = (id) => hudLink("promptTemplate=" + encodeURIComponent(id), "ar_task"); /* ————— Shared bits ————— */ const LOGO = ( s ) => ``; const AI_SVG = (s) => ``; const SHARE_SVG = ``; const TOOLS_SVG = ``; const LOCK_SVG = ``; const LAUNCH_SVG = ``; const CHEVRON_SVG = (dir) => { const paths = dir === "left" ? "M12 4.5 8.5 8 12 11.5M7.5 4.5 4 8 7.5 11.5" : "M4 4.5 7.5 8 4 11.5M8.5 4.5 12 8 8.5 11.5"; return ``; }; const CLOSE_SVG = ``; const ARROW_UP_SVG = ``; const FONT = `-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif`; const PAD = { t: 8, r: 18, b: 18, l: 8 }; const INSET = PAD.l + PAD.r; const VW = "var(--nl-vw,100vw)"; const VH = "var(--nl-vh,100vh)"; const NARROW = 600; const rootClass = (extra) => { const c = []; if (window.innerWidth < NARROW) c.push("nl-narrow"); if (extra) c.push(extra); return c.length ? ` class="${c.join(" ")}"` : ""; }; const BASE_CSS = ` :root{--nl-vw:${window.innerWidth}px;--nl-vh:${window.innerHeight}px} *{box-sizing:border-box} html,body{margin:0;padding:0;background:transparent;overflow:hidden} body{display:flex;align-items:flex-end;justify-content:flex-end;height:100vh; padding:${PAD.t}px ${PAD.r}px ${PAD.b}px ${PAD.l}px; font-family:${FONT};font-size:14px;line-height:1.5;color:#f4f9f9;-webkit-font-smoothing:antialiased} .nl-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:10px;width:max-content;max-width:calc(${VW} - ${INSET}px)} button{font-family:inherit;cursor:pointer} :focus-visible{outline:2px solid #32e6e2;outline-offset:2px;border-radius:6px} .nl-icon-btn{position:relative;flex:none;width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid transparent;background:transparent;color:#d5e3e6;transition:background .15s ease,color .15s ease} .nl-icon-btn:hover{background:rgba(255,255,255,0.08);color:#f4f9f9} .nl-tap::after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%); width:max(100%,44px);height:max(100%,44px)} @keyframes nl-rise{from{opacity:0;transform:translateY(10px) scale(.97)}to{opacity:1;transform:none}} @media (prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;transition:none!important}} `; const MEASURE_JS = ` function nlSend(){ var wrap=document.querySelector('.nl-wrap'),boxes=[]; for(var i=0;i

Build your own site with Netlify

Describe what you want, and an AI agent designs, builds and deploys it in minutes.

${HUD_VARIANT ? `` : ""} ${SITE_ID ? `` : ""}
or
Drop a site you already have