{"id":8,"date":"2025-08-27T13:43:36","date_gmt":"2025-08-27T13:43:36","guid":{"rendered":"https:\/\/ukesmeny.net\/?page_id=8"},"modified":"2025-09-03T07:32:18","modified_gmt":"2025-09-03T07:32:18","slug":"8-2","status":"publish","type":"page","link":"https:\/\/ukesmeny.net\/","title":{"rendered":"Ukesmeny"},"content":{"rendered":"\n<div style=\"display:flex;flex-wrap:wrap;gap:24px;align-items:flex-start;font-family:system-ui,Arial,sans-serif\">\n\n  <!-- Venstre: Generering -->\n  <div style=\"flex:1;min-width:320px\">\n    <div id=\"ukesmeny-app\" style=\"max-width:770px;margin:0 auto\">\n      <h1 style=\"margin:0 0 10px\">Ukesmeny<\/h1>\n\n      <div style=\"padding:12px 16px; margin:12px 0; border:1px solid #f5c2c7; background:#f8d7da; color:#842029; border-radius:6px; font-size:14px; line-height:1.4\">\n        <strong>OBS:<\/strong> Denne nettsiden er under utvikling. Dobbelsjekk alltid svarene du f\u00e5r.\n        Oppskriftene genereres av AI, og feil kan forekomme. Kaloriangivelser (kcal per 100 g) er estimater\n        basert p\u00e5 ingrediensene og er ikke verifisert av ern\u00e6ringsekspert.\n      <\/div>\n\n      <p style=\"margin:0 0 18px;color:#444\">Billige, raske og barnevennlige middager \u2013 generer meny, handleliste og prisestimat p\u00e5 1\u20132\u20133.<\/p>\n\n      <!-- Valg -->\n      <div style=\"display:flex;gap:12px;flex-wrap:wrap;align-items:center;margin-bottom:12px\">\n        <label>Antall dager:\n          <select id=\"ddDays\">\n            <option value=\"3\" selected>3 dager<\/option>\n            <option value=\"5\">5 dager<\/option>\n          <\/select>\n        <\/label>\n\n        <label>Husholdning:\n          <select id=\"ddHousehold\">\n            <option>1 voksen<\/option>\n            <option>2 voksne<\/option>\n            <option selected>2 voksne og 2 barn<\/option>\n          <\/select>\n        <\/label>\n      <\/div>\n\n      <fieldset style=\"border:1px solid #eee;border-radius:8px;padding:12px;margin:0 0 12px\">\n        <legend style=\"padding:0 6px;color:#333\">Minimum per uke (valgfritt)<\/legend>\n        <div style=\"display:flex;gap:12px;flex-wrap:wrap\">\n          <label>Fisk:\n            <input id=\"minFish\" type=\"number\" min=\"0\" max=\"7\" value=\"0\" style=\"width:70px\">\n          <\/label>\n          <label>Kylling:\n            <input id=\"minChicken\" type=\"number\" min=\"0\" max=\"7\" value=\"0\" style=\"width:70px\">\n          <\/label>\n          <label>Kj\u00f8ttdeig:\n            <input id=\"minMince\" type=\"number\" min=\"0\" max=\"7\" value=\"0\" style=\"width:70px\">\n          <\/label>\n          <label>Vegetar:\n            <input id=\"minVeg\" type=\"number\" min=\"0\" max=\"7\" value=\"0\" style=\"width:70px\">\n          <\/label>\n        <\/div>\n        <p style=\"margin:8px 0 0;color:#666;font-size:14px\">Setter du f.eks. \u201cFisk = 1\u201d, sikrer du minst \u00e9n fiskerett \u2013 resten er opp til variasjon.<\/p>\n      <\/fieldset>\n\n      <div style=\"margin-bottom:12px\">\n        <label>Ekskluder ingredienser (kommaseparert):<br>\n          <input type=\"text\" id=\"txtExclude\" placeholder=\"f.eks. r\u00f8dt kj\u00f8tt, svin, skalldyr\" style=\"width:100%;max-width:420px\">\n        <\/label>\n      <\/div>\n\n      <div style=\"display:flex;gap:12px;align-items:center;margin-bottom:8px\">\n        <button id=\"btnGenerate\">Generer meny<\/button>\n        <button id=\"btnReuse\" style=\"display:none\">Bruk lokal kopi (samme valg)<\/button>\n        <span id=\"loader\" style=\"display:none\">\u23f3 Genererer \u2026<\/span>\n      <\/div>\n\n      <div id=\"error\" style=\"display:none;margin-top:10px;padding:10px;background:#fff4f4;border:1px solid #f1cccc;color:#a40000;border-radius:6px\"><\/div>\n      <hr style=\"margin:18px 0\">\n\n      <!-- Erstatte valgte -->\n      <div id=\"replacePanel\" style=\"display:none;border:1px solid #eee;border-radius:8px;padding:12px;margin:12px 0\">\n        <strong>Erstatt valgte retter<\/strong>\n        <div style=\"display:flex;gap:12px;flex-wrap:wrap;margin-top:8px\">\n          <label>\u00d8nsket type:\n            <select id=\"selReplaceTag\">\n              <option value=\"\">Tilfeldig<\/option>\n              <option value=\"fisk\">Fisk<\/option>\n              <option value=\"kylling\">Kylling<\/option>\n              <option value=\"kj\u00f8ttdeig\">Kj\u00f8ttdeig<\/option>\n              <option value=\"vegetar\">Vegetar<\/option>\n            <\/select>\n          <\/label>\n          <label>Ekskluder (valgfritt):\n            <input id=\"txtReplaceExclude\" type=\"text\" placeholder=\"f.eks. sopp, svin\" style=\"width:220px\">\n          <\/label>\n          <button id=\"btnReplace\">Erstatt valgte<\/button>\n        <\/div>\n        <p style=\"margin:6px 0 0;color:#666;font-size:13px\">Huk av oppskriftene du vil bytte i listen under, og trykk \u201cErstatt valgte\u201d.<\/p>\n      <\/div>\n\n      <!-- Resultat -->\n      <div id=\"resultat\" style=\"margin-top:8px\"><\/div>\n\n      <div id=\"actions\" style=\"display:none;margin:16px 0;gap:8px;align-items:center\">\n        <button id=\"btnCopyList\">Kopi\u00e9r handleliste<\/button>\n        <button id=\"btnPrint\">Skriv ut<\/button>\n      <\/div>\n\n      <!-- Single prompt -->\n      <div style=\"border-top:1px dashed #ddd;margin-top:20px;padding-top:16px\">\n        <h3 style=\"margin:0 0 8px\">Generer \u00e9n oppskrift med fritekst<\/h3>\n        <p style=\"margin:0 0 8px;color:#666;font-size:14px\">Beskriv behovet (helg, barnevennlig, allergier, preferanser). Vi bruker samme regler for mengder, detaljer og handleliste.<\/p>\n        <textarea id=\"txtSinglePrompt\" rows=\"3\" placeholder=\"Eks: Ungene kommer i helgen. De elsker pasta og kylling, men t\u00e5ler ikke n\u00f8tter\u2026\" style=\"width:100%;max-width:720px\"><\/textarea><br>\n        <button id=\"btnSinglePrompt\" style=\"margin-top:8px\">Generer \u00e9n oppskrift<\/button>\n        <div id=\"singleOut\" style=\"margin-top:10px\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- H\u00f8yre: Historikk \/ Tilbakemelding -->\n  <aside style=\"flex:0 0 360px;max-width:100%;display:flex;flex-direction:column;gap:16px\">\n    <!-- Historikk -->\n    <div style=\"border:1px solid #eee;border-radius:8px;padding:16px;background:#fafafa\">\n      <h2 style=\"margin:0 0 8px\">Historikk<\/h2>\n      <p style=\"margin:0 0 10px;color:#555;font-size:14px\">Gjenbruk tidligere menyer uten nytt API-kall.<\/p>\n      <div id=\"historyList\" style=\"display:grid;gap:10px\"><\/div>\n      <button id=\"btnClearHistory\" style=\"margin-top:10px\">T\u00f8m historikk<\/button>\n    <\/div>\n\n    <!-- Tilbakemelding -->\n    <div style=\"border:1px solid #eee;border-radius:8px;padding:16px;background:#fafafa\">\n      <h2 style=\"margin-top:0\">Tilbakemelding<\/h2>\n      <p style=\"font-size:14px;color:#555;margin-top:0\">Har du forslag, oppdaget feil eller ideer? Send oss en melding:<\/p>\n      <div id=\"feedbackBox\">\n        <textarea id=\"feedbackMsg\" rows=\"4\" placeholder=\"Skriv din tilbakemelding her...\" style=\"width:100%;margin-bottom:8px\"><\/textarea>\n        <input id=\"feedbackEmail\" type=\"email\" placeholder=\"Din e-post (valgfritt)\" style=\"width:100%;margin-bottom:8px\">\n        <button id=\"btnFeedback\">Send<\/button>\n        <span id=\"feedbackStatus\" style=\"display:block;margin-top:6px;font-size:14px;color:#555\"><\/span>\n      <\/div>\n    <\/div>\n  <\/aside>\n<\/div>\n\n<script>\n(() => {\n  const API_URL = 'https:\/\/ukesmeny-api.vercel.app\/api\/menu';\n  const FEEDBACK_URL = \"https:\/\/ukesmeny-api.vercel.app\/api\/feedback\";\n\n  const $ = s => document.querySelector(s);\n  const esc = s => String(s).replace(\/[&<>]\/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\n\n  \/\/ -------- Historikk for anti-duplisering --------\n  function saveUsedTitles(days){\n    try{\n      const prev = JSON.parse(localStorage.getItem(\"used_titles\")||\"[]\");\n      const next = [...new Set([...prev, ...(days||[]).map(d=>d.title).filter(Boolean)])];\n      while (next.length > 30) next.shift();\n      localStorage.setItem(\"used_titles\", JSON.stringify(next));\n    }catch{}\n  }\n  function getUsedTitles(){\n    try{ return JSON.parse(localStorage.getItem(\"used_titles\")||\"[]\"); }catch{ return []; }\n  }\n\n  \/\/ ---------- Signatur\/payload ----------\n  function getPayload(){\n    return {\n      days: Number($('#ddDays').value || 3),\n      household: $('#ddHousehold').value || '2 voksne og 2 barn',\n      constraints: {\n        minFish: Number($('#minFish').value || 0),\n        minChicken: Number($('#minChicken').value || 0),\n        minMince: Number($('#minMince').value || 0),\n        minVeg: Number($('#minVeg').value || 0)\n      },\n      exclude: $('#txtExclude').value.trim(),\n      recentTitles: getUsedTitles() \/\/ unng\u00e5 nylige retter\n    };\n  }\n  function signature(payload){\n    return btoa(unescape(encodeURIComponent(JSON.stringify(payload)))).slice(0, 48);\n  }\n\n  \/\/ ---------- Render meny (med priser og erstatting) ----------\n  function renderMenu(data){\n    const out = $('#resultat');\n    let html = '';\n    if(Array.isArray(data?.days)){\n      data.days.forEach((d,i)=>{\n        html += `<section style=\"margin:18px 0;padding:14px;border:1px solid #eee;border-radius:8px\">\n          <div style=\"display:flex;justify-content:space-between;align-items:center;gap:8px\">\n            <h3 style=\"margin:0 0 6px\">Dag ${i+1}: ${esc(d.title||'')}<\/h3>\n            <label style=\"font-size:13px;color:#555\">\n              <input type=\"checkbox\" class=\"chkReplace\" data-idx=\"${i}\"> Erstatt denne\n            <\/label>\n          <\/div>\n          ${d.tags ? `<p style=\"margin:0 0 4px;color:#777;font-size:13px\">Tag: ${esc([].concat(d.tags).join(', '))}<\/p>` : ''}\n          <p style=\"margin:0 0 8px;color:#555\"><em>${esc(d.kcalPer100g ?? '')} kcal per 100 g<\/em><\/p>\n          <p><strong>Ingredienser:<\/strong><\/p>\n          <ul style=\"margin:6px 0 10px 18px\">${(d.ingredienser||[]).map(x=>`<li>${esc(x)}<\/li>`).join('')}<\/ul>\n          <p><strong>Fremgangsm\u00e5te:<\/strong><\/p>\n          <ol style=\"margin:6px 0 0 18px\">${(d.steg||[]).map(x=>`<li>${esc(x)}<\/li>`).join('')}<\/ol>\n        <\/section>`;\n      });\n    }\n\n    \/\/ Handleliste\n    const hl = data?.handleliste || {};\n    const cats = ['Frukt & gr\u00f8nt','Kj\u00f8tt, fisk & egg','T\u00f8rrvarer','Meieri','Krydder & olje'];\n    html += `<h2 style=\"margin:18px 0 8px\">Handleliste<\/h2>`;\n    cats.forEach(cat=>{\n      const items = hl[cat]||[];\n      if(items.length){\n        html += `<h4>${esc(cat)}<\/h4><ul style=\"margin:0 0 10px 18px\">${items.map(x=>`<li>${esc(x)}<\/li>`).join('')}<\/ul>`;\n      }\n    });\n\n    \/\/ Pris-estimat (beta)\n    if (data?.pricing) {\n      const p = data.pricing;\n      html += `<h2 style=\"margin:18px 0 8px\">Prisestimat (beta)<\/h2>\n               <p style=\"margin:0 0 8px;color:#666;font-size:14px\">\n                 Omtrentlig sum i ${esc(p.meta?.currency || 'NOK')}. Basisvarer (${esc((p.skippedCategories||[]).join(', ') || 'ingen')}) er ikke med i totalsummen.\n                 Kilde: ${esc(p.meta?.source || '\u2013')} (oppdatert ${esc(p.meta?.updated || '-')}).<\/p>`;\n      cats.forEach(cat=>{\n        const lines = (p.items||[]).filter(it => it.category === cat);\n        if (!lines.length) return;\n        html += `<div style=\"margin:8px 0 12px;padding:10px;border:1px solid #eee;border-radius:8px\">\n                   <div style=\"display:flex;justify-content:space-between;gap:12px\">\n                     <strong>${esc(cat)}<\/strong>\n                     <span>Sum: ca ${esc(String(p.categoryTotals?.[cat] || 0))} ${esc(p.meta?.currency || 'NOK')}<\/span>\n                   <\/div>\n                   <ul style=\"margin:6px 0 0 18px;list-style:disc\">\n                     ${lines.map(it => `<li>${esc(it.label)} \u2014 ca ${esc(String(it.approx))} ${esc(p.meta?.currency || 'NOK')}<\/li>`).join('')}\n                   <\/ul>\n                 <\/div>`;\n      });\n      html += `<p style=\"margin:8px 0 0;font-size:16px\"><strong>Total: ca ${esc(String(p.grandTotal || 0))} ${esc(p.meta?.currency || 'NOK')}<\/strong><\/p>\n               <p style=\"margin:4px 0 0;color:#8b5e00;font-size:13px\"><em>${esc(data._pricing_note || 'Prisene er grove estimater og kan avvike i butikk.')}<\/em><\/p>`;\n    }\n\n    out.innerHTML = html || '<p>Ingen data.<\/p>';\n    $('#actions').style.display = html ? 'flex':'none';\n    $('#replacePanel').style.display = Array.isArray(data?.days) && data.days.length ? 'block' : 'none';\n  }\n\n  \/\/ ---------- Historikk (cache) ----------\n  const HISTORY_KEY = 'ukesmeny_history_v1';\n  function loadHistoryList(){ try { return JSON.parse(localStorage.getItem(HISTORY_KEY) || '[]'); } catch { return []; } }\n  function saveHistoryEntry(sig, payload, data){\n    try {\n      const list = loadHistoryList().filter(x => x.sig !== sig);\n      list.unshift({ sig, payload, data, ts: Date.now() });\n      localStorage.setItem(HISTORY_KEY, JSON.stringify(list.slice(0, 10)));\n    } catch {}\n  }\n  function removeHistory(sig){\n    try { localStorage.setItem(HISTORY_KEY, JSON.stringify(loadHistoryList().filter(x => x.sig !== sig))); } catch {}\n  }\n  function clearHistory(){ try { localStorage.removeItem(HISTORY_KEY); } catch {} }\n  function formatPayloadSummary(p){\n    const c = p.constraints || {};\n    const parts = [];\n    if (c.minFish) parts.push(`fisk ${c.minFish}`);\n    if (c.minChicken) parts.push(`kylling ${c.minChicken}`);\n    if (c.minMince) parts.push(`kj\u00f8ttdeig ${c.minMince}`);\n    if (c.minVeg) parts.push(`vegetar ${c.minVeg}`);\n    if (p.exclude) parts.push(`uten: ${p.exclude}`);\n    return `${p.days}d, ${p.household}${parts.length ? ' \u00b7 ' + parts.join(', ') : ''}`;\n  }\n  function renderHistorySidebar(){\n    const list = loadHistoryList();\n    const box = $('#historyList');\n    if (!list.length){ box.innerHTML = '<p style=\"color:#777;font-size:14px\">Ingen historikk enda.<\/p>'; return; }\n    box.innerHTML = list.map(item => {\n      const when = new Date(item.ts).toLocaleString();\n      const summary = esc(formatPayloadSummary(item.payload));\n      return `<div style=\"border:1px solid #eaeaea;border-radius:6px;padding:10px;background:#fff\">\n        <div style=\"font-size:13px;color:#555;margin-bottom:6px\">${summary}<\/div>\n        <div style=\"display:flex;gap:8px\">\n          <button data-act=\"reuse\" data-sig=\"${item.sig}\">Gjenbruk<\/button>\n          <button data-act=\"delete\" data-sig=\"${item.sig}\" style=\"background:#fff;border:1px solid #ddd\">Slett<\/button>\n        <\/div>\n        <div style=\"margin-top:6px;color:#999;font-size:12px\">${when}<\/div>\n      <\/div>`;\n    }).join('');\n  }\n  function toggleReuseButton(){\n    const sig = signature(getPayload());\n    const exists = loadHistoryList().some(x => x.sig === sig);\n    $('#btnReuse').style.display = exists ? 'inline-block' : 'none';\n  }\n\n  \/\/ ---------- Verkt\u00f8y ----------\n  function collectListText(data){\n    const hl = data?.handleliste||{};\n    const cats=['Frukt & gr\u00f8nt','Kj\u00f8tt, fisk & egg','T\u00f8rrvarer','Meieri','Krydder & olje'];\n    return cats.map(c=>hl[c]?.length?`${c}\\n${hl[c].map(x=>`- ${x}`).join('\\n')}`:'').filter(Boolean).join('\\n\\n');\n  }\n\n  \/\/ ---------- Generering ----------\n  async function generate(){\n    const hasCurrent = !!window.__ukesmeny_last;\n    if (hasCurrent) {\n      const ok = confirm(\n        'Det ligger allerede en generert meny.\\n\\n' +\n        'Vil du lage en NY meny fra bunnen av?\\n' +\n        'Den gamle blir erstattet.\\n\\n' +\n        'Tips: Du kan ogs\u00e5 erstatte enkeltretter via panelet \"Erstatt valgte\".'\n      );\n      if (!ok) return;\n    }\n\n    $('#error').style.display='none';\n    $('#btnGenerate').disabled=true; $('#loader').style.display='inline';\n\n    const payload = getPayload();\n    const sig = signature(payload);\n\n    \/\/ hopp over lokal cache n\u00e5r vi eksplisitt bekrefter ny generering\n    const cached = !hasCurrent && loadHistoryList().find(x => x.sig === sig);\n    if (cached){\n      renderMenu(cached.data);\n      window.__ukesmeny_last=cached.data;\n      $('#loader').style.display='none'; $('#btnGenerate').disabled=false;\n      $('#resultat').scrollIntoView({behavior:'smooth'});\n      return;\n    }\n\n    try{\n      const res = await fetch(API_URL,{\n        method:'POST',mode:'cors',\n        headers:{'Content-Type':'application\/json'},\n        body:JSON.stringify(payload)\n      });\n      const txt=await res.text();\n      if(!res.ok) throw new Error(`API ${res.status}: ${txt}`);\n      const data=JSON.parse(txt);\n      renderMenu(data);\n      window.__ukesmeny_last=data;\n\n      saveHistoryEntry(sig, payload, data);\n      saveUsedTitles(data.days || []);\n      renderHistorySidebar();\n      toggleReuseButton();\n      $('#resultat').scrollIntoView({behavior:'smooth'});\n    }catch(e){\n      $('#error').textContent=e.message;\n      $('#error').style.display='block';\n    }finally{\n      $('#btnGenerate').disabled=false; $('#loader').style.display='none';\n    }\n  }\n\n  \/\/ ---------- Erstatt valgte ----------\n  async function replaceSelected(){\n    const curr = window.__ukesmeny_last;\n    if(!curr || !Array.isArray(curr.days) || !curr.days.length){\n      alert('Generer en meny f\u00f8rst.'); return;\n    }\n    const checked = [...document.querySelectorAll('.chkReplace:checked')].map(el => Number(el.dataset.idx));\n    if (!checked.length){ alert('Huk av minst \u00e9n rett du vil erstatte.'); return; }\n\n    const desiredTag = $('#selReplaceTag').value || \"\";\n    const exclude = $('#txtReplaceExclude').value.trim();\n\n    const payload = {\n      action: \"replace\",\n      currentMenu: curr,\n      replacements: checked.map(idx => ({ index: idx, desiredTag, exclude })),\n      household: $('#ddHousehold').value || '2 voksne og 2 barn'\n    };\n\n    $('#btnReplace').disabled = true; $('#loader').style.display='inline';\n    try{\n      const res = await fetch(API_URL, {\n        method: 'POST', mode: 'cors',\n        headers: {'Content-Type':'application\/json'},\n        body: JSON.stringify(payload)\n      });\n      const txt = await res.text();\n      if(!res.ok) throw new Error(`API ${res.status}: ${txt}`);\n      const data = JSON.parse(txt);\n\n      renderMenu(data);\n      window.__ukesmeny_last = data;\n\n      const base = getPayload();\n      const sig = signature(base);\n      saveHistoryEntry(sig, base, data);\n      saveUsedTitles(data.days || []);\n      renderHistorySidebar();\n      toggleReuseButton();\n    }catch(e){\n      $('#error').textContent = e.message;\n      $('#error').style.display='block';\n    }finally{\n      $('#btnReplace').disabled = false; $('#loader').style.display='none';\n    }\n  }\n\n  \/\/ ---------- Single prompt ----------\n  async function singlePrompt(){\n    const text = $('#txtSinglePrompt').value.trim();\n    if (!text){ alert('Skriv hva du \u00f8nsker i tekstfeltet.'); return; }\n\n    const payload = {\n      action: \"single\",\n      customPrompt: text,\n      household: $('#ddHousehold').value || '2 voksne og 2 barn'\n    };\n\n    const box = $('#singleOut');\n    box.textContent = 'Genererer \u2026';\n    try{\n      const res = await fetch(API_URL, {\n        method:'POST', mode:'cors',\n        headers:{'Content-Type':'application\/json'},\n        body: JSON.stringify(payload)\n      });\n      const txt = await res.text();\n      if(!res.ok) throw new Error(`API ${res.status}: ${txt}`);\n      const data = JSON.parse(txt);\n\n      const d = Array.isArray(data?.days) ? data.days[0] : data;\n      if (!d){ box.textContent = 'Fikk ikke gyldig oppskrift.'; return; }\n\n      box.innerHTML = `\n        <div style=\"border:1px solid #eee;border-radius:8px;padding:12px\">\n          <h4 style=\"margin:0 0 6px\">${esc(d.title || 'Oppskrift')}<\/h4>\n          <p style=\"margin:0 0 6px;color:#555\"><em>${esc(d.kcalPer100g ?? '')} kcal per 100 g<\/em><\/p>\n          <p><strong>Ingredienser:<\/strong><\/p>\n          <ul style=\"margin:6px 0 10px 18px\">${(d.ingredienser||[]).map(x=>`<li>${esc(x)}<\/li>`).join('')}<\/ul>\n          <p><strong>Fremgangsm\u00e5te:<\/strong><\/p>\n          <ol style=\"margin:6px 0 0 18px\">${(d.steg||[]).map(x=>`<li>${esc(x)}<\/li>`).join('')}<\/ol>\n        <\/div>`;\n    }catch(e){\n      box.textContent = e.message;\n    }\n  }\n\n  \/\/ ---------- Tilbakemelding ----------\n  async function sendFeedback(){\n    const msg = $('#feedbackMsg').value.trim();\n    const email = $('#feedbackEmail').value.trim();\n    const status = $('#feedbackStatus');\n    if (!msg){ status.style.color='red'; status.textContent='Skriv en melding f\u00f8rst.'; return; }\n    status.textContent = 'Sender\u2026'; status.style.color='#555';\n    try{\n      const res = await fetch(\"https:\/\/ukesmeny-api.vercel.app\/api\/feedback\", {\n        method: \"POST\", headers: {\"Content-Type\":\"application\/json\"},\n        body: JSON.stringify({ message: msg, email })\n      });\n      const data = await res.json();\n      if (res.ok){\n        status.style.color='green'; status.textContent = data.msg || 'Takk for tilbakemeldingen!';\n        $('#feedbackMsg').value = ''; $('#feedbackEmail').value='';\n      } else {\n        status.style.color='red'; status.textContent = data.error || 'Noe gikk galt.';\n      }\n    } catch {\n      status.style.color='red'; status.textContent = 'Kunne ikke sende.';\n    }\n  }\n\n  \/\/ ---------- Eventer ----------\n  $('#btnGenerate').addEventListener('click', generate);\n  $('#btnReplace').addEventListener('click', replaceSelected);\n  $('#btnSinglePrompt').addEventListener('click', singlePrompt);\n  $('#btnFeedback').addEventListener('click', sendFeedback);\n\n  $('#btnReuse').addEventListener('click', () => {\n    const sig = signature(getPayload());\n    const item = loadHistoryList().find(x => x.sig === sig);\n    if (item){\n      renderMenu(item.data);\n      window.__ukesmeny_last = item.data;\n      $('#resultat').scrollIntoView({behavior:'smooth'});\n    }\n  });\n\n  ['ddDays','ddHousehold','minFish','minChicken','minMince','minVeg','txtExclude']\n    .forEach(id => document.getElementById(id).addEventListener('input', toggleReuseButton));\n\n  $('#historyList').addEventListener('click', (e)=>{\n    const btn = e.target.closest('button'); if(!btn) return;\n    const act = btn.getAttribute('data-act');\n    const sig = btn.getAttribute('data-sig');\n    if (act === 'reuse'){\n      const item = loadHistoryList().find(x => x.sig === sig);\n      if (item){\n        const p = item.payload;\n        $('#ddDays').value = String(p.days);\n        $('#ddHousehold').value = p.household;\n        $('#minFish').value = p.constraints?.minFish || 0;\n        $('#minChicken').value = p.constraints?.minChicken || 0;\n        $('#minMince').value = p.constraints?.minMince || 0;\n        $('#minVeg').value = p.constraints?.minVeg || 0;\n        $('#txtExclude').value = p.exclude || '';\n        toggleReuseButton();\n        renderMenu(item.data);\n        window.__ukesmeny_last = item.data;\n      }\n    } else if (act === 'delete'){\n      removeHistory(sig);\n      renderHistorySidebar();\n      toggleReuseButton();\n    }\n  });\n\n  $('#btnClearHistory').addEventListener('click', ()=>{\n    if (confirm('Slette all lokal historikk?')){\n      clearHistory();\n      renderHistorySidebar();\n      toggleReuseButton();\n    }\n  });\n\n  $('#btnCopyList').addEventListener('click', async()=>{\n    const d=window.__ukesmeny_last; if(!d) return;\n    const txt=collectListText(d);\n    try{await navigator.clipboard.writeText(txt);alert('Handlelisten er kopiert \u2714')}\n    catch{alert('Kunne ikke kopiere \u2013 marker og kopier manuelt.')}\n  });\n  $('#btnPrint').addEventListener('click',()=>window.print());\n\n  \/\/ Init\n  renderHistorySidebar();\n  toggleReuseButton();\n})();\n<\/script>\n\n\n\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<!-- ========================\n  INFO-BANNER + MODAL\n  ======================== -->\n\n<!-- Info-banner nederst -->\n<div id=\"ukesmeny-consent\" role=\"region\" aria-label=\"Informasjon om lagring\" style=\"display:none;position:fixed;left:0;right:0;bottom:0;z-index:9999;background:#0f172a;color:#fff;\">\n  <div style=\"max-width:1100px;margin:0 auto;padding:12px 16px;display:flex;gap:12px;align-items:center;flex-wrap:wrap\">\n    <div style=\"flex:1;min-width:260px;font-size:14px;line-height:1.4\">\n      <strong>Info:<\/strong> Vi lagrer litt informasjon lokalt i nettleseren din (f.eks. tidligere menyer) for \u00e5 forbedre opplevelsen.\n      Dette deles ikke med andre og lagres ikke p\u00e5 v\u00e5re servere.\n      <a href=\"#ukesmeny-privacy\" style=\"color:#93c5fd;text-decoration:underline\">Les mer<\/a>.\n    <\/div>\n    <div style=\"display:flex;gap:8px\">\n      <button id=\"ukesmeny-consent-ok\" style=\"background:#22c55e;color:#0b1b2b;border:0;border-radius:6px;padding:8px 12px;cursor:pointer\">OK<\/button>\n      <button id=\"ukesmeny-consent-close\" aria-label=\"Skjul\" title=\"Skjul\" style=\"background:#0b1220;color:#e2e8f0;border:1px solid #334155;border-radius:6px;padding:8px 12px;cursor:pointer\">Skjul<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- Modal: Personvern (popup) -->\n<div id=\"ukesmeny-privacy\" aria-hidden=\"true\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ukesmeny-privacy-title\"\n     style=\"display:none;position:fixed;inset:0;z-index:10000;\">\n  <!-- Bakgrunn -->\n  <div class=\"ukesmeny-privacy-backdrop\" style=\"position:absolute;inset:0;background:rgba(2,6,23,0.65);\"><\/div>\n\n  <!-- Dialog -->\n  <div class=\"ukesmeny-privacy-dialog\" role=\"document\" tabindex=\"-1\"\n       style=\"position:relative;max-width:720px;margin:5vh auto;background:#fff;border-radius:10px;box-shadow:0 10px 30px rgba(0,0,0,.2);\">\n    <div style=\"padding:18px 18px 0;display:flex;justify-content:space-between;align-items:center;gap:12px\">\n      <h2 id=\"ukesmeny-privacy-title\" style=\"margin:0;font-size:20px\">Personvern, informasjonskapsler og lokal lagring<\/h2>\n      <button type=\"button\" class=\"ukesmeny-privacy-close\"\n              aria-label=\"Lukk\" title=\"Lukk\"\n              style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:8px;padding:6px 10px;cursor:pointer\">\n        Lukk\n      <\/button>\n    <\/div>\n\n    <div style=\"padding:12px 18px 18px;max-height:65vh;overflow:auto;line-height:1.55\">\n      <p><em>Sist oppdatert: 28. august 2025<\/em><\/p>\n      <p>P\u00e5 <strong>Ukesmeny<\/strong> lagrer vi litt informasjon lokalt i nettleseren din (localStorage\/cookies)\n      for \u00e5 gj\u00f8re tjenesten enkel \u00e5 bruke. Vi bruker ikke sporing eller markedsf\u00f8ring, og deler ikke\n      denne informasjonen med andre.<\/p>\n\n      <h3>Hva lagrer vi \u2013 og hvorfor?<\/h3>\n      <ul>\n        <li><strong>Genererte menyer (historikk):<\/strong> Gjenbruk uten ny generering.<\/li>\n        <li><strong>Valg\/innstillinger:<\/strong> Antall dager, husholdning, minstekrav.<\/li>\n        <li><strong>\u201cBrukte oppskrifter\u201d:<\/strong> For \u00e5 unng\u00e5 like retter mange uker p\u00e5 rad.<\/li>\n        <li><strong>Info-banner:<\/strong> Om du har trykket \u00abOK\u00bb, s\u00e5 vi ikke viser det igjen.<\/li>\n      <\/ul>\n\n      <h3>Tredjeparter<\/h3>\n      <ul>\n        <li><strong>Vercel:<\/strong> Hosting, tekniske logger for drift\/sikkerhet.<\/li>\n        <li><strong>OpenAI:<\/strong> Generering av oppskrifter basert p\u00e5 foresp\u00f8rsler du sender inn.<\/li>\n      <\/ul>\n\n      <h3>Hvor lenge?<\/h3>\n      <ul>\n        <li><strong>Lokal historikk:<\/strong> Ligger hos deg til du sletter den.<\/li>\n        <li><strong>Tilbakemeldinger:<\/strong> Bevares s\u00e5 lenge det er relevant, eller til sletting bes om.<\/li>\n      <\/ul>\n\n      <h3>Slik sletter du<\/h3>\n      <ul>\n        <li>Slett data for <em>ukesmeny.net<\/em> i nettleserens personverninnstillinger.<\/li>\n        <li>Bruk \u00abT\u00f8m historikk\u00bb i appen for \u00e5 fjerne lagrede menyer lokalt.<\/li>\n      <\/ul>\n\n      \n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- Script for b\u00e5de banner og modal -->\n<script>\n(function(){\n  const KEY = 'ukesmeny_consent_v1';\n  function lsOK(){ try {localStorage.setItem('__t','1');localStorage.removeItem('__t');return true;}catch(e){return false;} }\n  function getConsent(){ return lsOK() ? localStorage.getItem(KEY)==='ok' : document.cookie.split('; ').some(c=>c.startsWith(KEY+'=ok')); }\n  function setConsent(){ if(lsOK()){localStorage.setItem(KEY,'ok');} else {document.cookie=KEY+'=ok; Max-Age='+60*60*24*365+'; Path=\/; SameSite=Lax';} }\n  function showBar(show){ const el=document.getElementById('ukesmeny-consent'); if(el) el.style.display=show?'block':'none'; }\n\n  if(!getConsent()){ showBar(true); }\n  document.getElementById('ukesmeny-consent-ok')?.addEventListener('click',()=>{ setConsent(); showBar(false); });\n  document.getElementById('ukesmeny-consent-close')?.addEventListener('click',()=>{ showBar(false); });\n\n  \/\/ Modal\n  const modal=document.getElementById('ukesmeny-privacy');\n  const dialog=modal?.querySelector('.ukesmeny-privacy-dialog');\n  const closeBtn=modal?.querySelector('.ukesmeny-privacy-close');\n  let lastFocused=null;\n\n  document.addEventListener('click',e=>{\n    const a=e.target.closest('a[href=\"#ukesmeny-privacy\"]');\n    if(!a) return;\n    e.preventDefault(); openModal();\n  });\n  function trapFocus(e){\n    if(!modal||modal.style.display==='none') return;\n    const focusables=modal.querySelectorAll('button,[href],input,select,textarea,[tabindex]:not([tabindex=\"-1\"])');\n    if(!focusables.length) return;\n    const first=focusables[0], last=focusables[focusables.length-1];\n    if(e.key==='Tab'){\n      if(e.shiftKey && document.activeElement===first){ e.preventDefault(); last.focus(); }\n      else if(!e.shiftKey && document.activeElement===last){ e.preventDefault(); first.focus(); }\n    } else if(e.key==='Escape'){ closeModal(); }\n  }\n  function openModal(){\n    if(!modal) return; lastFocused=document.activeElement;\n    modal.style.display='block'; modal.setAttribute('aria-hidden','false');\n    (dialog||modal).focus({preventScroll:true});\n    document.addEventListener('keydown',trapFocus);\n    modal.querySelector('.ukesmeny-privacy-backdrop').addEventListener('click',closeModal,{once:true});\n  }\n  function closeModal(){\n    if(!modal) return;\n    modal.style.display='none'; modal.setAttribute('aria-hidden','true');\n    document.removeEventListener('keydown',trapFocus);\n    if(lastFocused&&typeof lastFocused.focus==='function'){ lastFocused.focus(); }\n  }\n  closeBtn?.addEventListener('click',closeModal);\n\n  window.UkesmenyPrivacyModal={open:openModal,close:closeModal};\n})();\n<\/script>\n\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ukesmeny OBS: Denne nettsiden er under utvikling. Dobbelsjekk alltid svarene du f\u00e5r. Oppskriftene genereres av AI, og feil kan forekomme. Kaloriangivelser (kcal per 100 g) er estimater basert p\u00e5 ingrediensene og er ikke verifisert av ern\u00e6ringsekspert. Billige, raske og barnevennlige middager \u2013 generer meny, handleliste og prisestimat p\u00e5 1\u20132\u20133. Antall dager: 3 dager5 dager Husholdning: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8","page","type-page","status-publish","hentry"],"rankMath":{"parentDomain":"ukesmeny.net","noFollowDomains":[],"noFollowExcludeDomains":[],"noFollowExternalLinks":false,"featuredImageNotice":"The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.","pluginReviewed":false,"postSettings":{"linkSuggestions":true,"useFocusKeyword":false},"frontEndScore":false,"postName":"8-2","permalinkFormat":"https:\/\/ukesmeny.net\/","showLockModifiedDate":true,"assessor":{"focusKeywordLink":"https:\/\/ukesmeny.net\/wp-admin\/edit.php?focus_keyword=%focus_keyword%&post_type=%post_type%","hasTOCPlugin":false,"primaryTaxonomy":false,"serpData":{"title":"","description":"","focusKeywords":"","pillarContent":false,"canonicalUrl":"","breadcrumbTitle":"","advancedRobots":[],"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":"","facebookHasOverlay":false,"facebookImageOverlay":"","facebookAuthor":"","twitterCardType":"","twitterUseFacebook":true,"twitterTitle":"","twitterDescription":"","twitterImage":"","twitterImageID":"","twitterHasOverlay":false,"twitterImageOverlay":"","twitterPlayerUrl":"","twitterPlayerSize":"","twitterPlayerStream":"","twitterPlayerStreamCtype":"","twitterAppDescription":"","twitterAppIphoneName":"","twitterAppIphoneID":"","twitterAppIphoneUrl":"","twitterAppIpadName":"","twitterAppIpadID":"","twitterAppIpadUrl":"","twitterAppGoogleplayName":"","twitterAppGoogleplayID":"","twitterAppGoogleplayUrl":"","twitterAppCountry":"","robots":{"index":true},"twitterAuthor":"username","primaryTerm":0,"authorName":"admin","titleTemplate":"%title% %sep% %sitename%","descriptionTemplate":"%excerpt%","showScoreFrontend":true,"lockModifiedDate":false},"powerWords":[],"diacritics":{"A":"[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]","AA":"[\\uA732]","AE":"[\\u00C6\\u01FC\\u01E2]","AO":"[\\uA734]","AU":"[\\uA736]","AV":"[\\uA738\\uA73A]","AY":"[\\uA73C]","B":"[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]","C":"[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]","D":"[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]","DZ":"[\\u01F1\\u01C4]","Dz":"[\\u01F2\\u01C5]","E":"[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]","F":"[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]","G":"[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]","H":"[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]","I":"[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]","J":"[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]","K":"[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]","L":"[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]","LJ":"[\\u01C7]","Lj":"[\\u01C8]","M":"[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]","N":"[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]","NJ":"[\\u01CA]","Nj":"[\\u01CB]","O":"[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]","OI":"[\\u01A2]","OO":"[\\uA74E]","OU":"[\\u0222]","P":"[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]","Q":"[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]","R":"[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]","S":"[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]","T":"[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]","TZ":"[\\uA728]","U":"[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]","V":"[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]","VY":"[\\uA760]","W":"[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]","X":"[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]","Y":"[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]","Z":"[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]","a":"[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]","aa":"[\\uA733]","ae":"[\\u00E6\\u01FD\\u01E3]","ao":"[\\uA735]","au":"[\\uA737]","av":"[\\uA739\\uA73B]","ay":"[\\uA73D]","b":"[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]","c":"[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]","d":"[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]","dz":"[\\u01F3\\u01C6]","e":"[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]","f":"[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]","g":"[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]","h":"[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]","hv":"[\\u0195]","i":"[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]","j":"[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]","k":"[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]","l":"[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]","lj":"[\\u01C9]","m":"[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]","n":"[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]","nj":"[\\u01CC]","o":"[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]","oi":"[\\u01A3]","ou":"[\\u0223]","oo":"[\\uA74F]","p":"[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]","q":"[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]","r":"[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]","s":"[\\u0073\\u24E2\\uFF53\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]","ss":"[\\u00DF]","t":"[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]","tz":"[\\uA729]","u":"[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]","v":"[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]","vy":"[\\uA761]","w":"[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]","x":"[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]","y":"[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]","z":"[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]"},"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasRedirection":false,"hasBreadcrumb":false},"homeUrl":"https:\/\/ukesmeny.net","objectID":8,"objectType":"post","locale":"nb","localeFull":"nb_NO","overlayImages":{"play":{"name":"Play icon","url":"https:\/\/ukesmeny.net\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","path":"\/home\/ukesmeny\/public_html\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-play.png","position":"middle_center"},"gif":{"name":"GIF icon","url":"https:\/\/ukesmeny.net\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","path":"\/home\/ukesmeny\/public_html\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/icon-gif.png","position":"middle_center"}},"defautOgImage":"https:\/\/ukesmeny.net\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/social-placeholder.jpg","customPermalinks":false,"isUserRegistered":false,"autoSuggestKeywords":false,"connectSiteUrl":"https:\/\/rankmath.com\/auth?site=https%3A%2F%2Fukesmeny.net&r=https%3A%2F%2Fukesmeny.net%2Findex.php%3Frest_route%3D%252Fwp%252Fv2%252Fpages%252F8%26nonce%3D4605b77fbf","maxTags":5,"trendsIcon":"<svg viewBox=\"0 0 610 610\"><path d=\"M18.85,446,174.32,290.48l58.08,58.08L76.93,504a14.54,14.54,0,0,1-20.55,0L18.83,466.48a14.54,14.54,0,0,1,0-20.55Z\" style=\"fill:#4285f4\"\/><path d=\"M242.65,242.66,377.59,377.6l-47.75,47.75a14.54,14.54,0,0,1-20.55,0L174.37,290.43l47.75-47.75A14.52,14.52,0,0,1,242.65,242.66Z\" style=\"fill:#ea4335\"\/><polygon points=\"319.53 319.53 479.26 159.8 537.34 217.88 377.61 377.62 319.53 319.53\" style=\"fill:#fabb05\"\/><path d=\"M594.26,262.73V118.61h0a16.94,16.94,0,0,0-16.94-16.94H433.2a16.94,16.94,0,0,0-12,28.92L565.34,274.71h0a16.94,16.94,0,0,0,28.92-12Z\" style=\"fill:#34a853\"\/><rect width=\"610\" height=\"610\" style=\"fill:none\"\/><\/svg>","showScore":true,"siteFavIcon":"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8\/9hAAABs0lEQVR4AWL4\/\/8\/RRjO8Iucx+noO0MWUDo16FYABMGP6ZfUcRnWtm27jVPbtm3bttuH2t3eFPcY9pLz7NxiLjCyVd87pKnHyqXyxtCs8APd0rnyxiu4qSeA3QEDrAwBDrT1s1Rc\/OrjLZwqVmOSu6+Lamcpp2KKMA9PH1BYXMe1mUP5qotvXTywsOEEYHXxrY+3cqk6TMkYpNr2FeoY3KIr0RPtn9wQ2unlA+GMkRw6+9TFw4YTwDUzx\/JVvARj9KaedXRO8P5B1Du2S32smzqUrcKGEyA+uAgQjKX7zf0boWHGfn71jIKj2689gxp7OAGShNcBUmLMPVjZuiKcA2vuWHHDCQxMCz629kXAIU4ApY15QwggAFbfOP9DhgBJ+nWVJ1AZAfICAj1pAlY6hCADZnveQf7bQIwzVONGJonhLIlS9gr5mFg44Xd+4S3XHoGNPdJl1INIwKyEgHckEhgTe1bGiFY9GSFBYUwLh1IkiJUbY407E7syBSFxKTszEoiE\/YdrgCEayDmtaJwCI9uu8TKMuZSVfSa4BpGgzvomBR\/INhLGzrqDotp01ZR8pn\/1L0JN9d9XNyx0AAAAAElFTkSuQmCC","canUser":{"general":false,"advanced":false,"snippet":false,"social":false,"analysis":false,"analytics":false,"content_ai":false},"showKeywordIntent":true,"isPro":false,"is_front_page":false,"trendsUpgradeLink":"https:\/\/rankmath.com\/pricing\/?utm_source=Plugin&utm_medium=CE%20General%20Tab%20Trends&utm_campaign=WP","trendsUpgradeLabel":"Upgrade","trendsPreviewImage":"https:\/\/ukesmeny.net\/wp-content\/plugins\/seo-by-rank-math\/assets\/admin\/img\/trends-preview.jpg","currentEditor":false,"homepageData":{"assessor":{"powerWords":[],"diacritics":true,"researchesTests":["contentHasTOC","contentHasShortParagraphs","contentHasAssets","keywordInTitle","keywordInMetaDescription","keywordInPermalink","keywordIn10Percent","keywordInContent","keywordInSubheadings","keywordInImageAlt","keywordDensity","keywordNotUsed","lengthContent","lengthPermalink","linksHasInternal","linksHasExternals","linksNotAllExternals","titleStartWithKeyword","titleSentiment","titleHasPowerWords","titleHasNumber","hasContentAI"],"hasBreadcrumb":false,"serpData":{"title":"%sitename% %page% %sep% %sitedesc%","description":"","titleTemplate":"%sitename% %page% %sep% %sitedesc%","descriptionTemplate":"","focusKeywords":"","breadcrumbTitle":"Home","robots":{"index":true},"advancedRobots":[],"facebookTitle":"","facebookDescription":"","facebookImage":"","facebookImageID":""}}},"tocTitle":"Table of Contents","tocExcludeHeadings":[],"listStyle":"ul"},"_links":{"self":[{"href":"https:\/\/ukesmeny.net\/index.php?rest_route=\/wp\/v2\/pages\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ukesmeny.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ukesmeny.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ukesmeny.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ukesmeny.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8"}],"version-history":[{"count":34,"href":"https:\/\/ukesmeny.net\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions"}],"predecessor-version":[{"id":60,"href":"https:\/\/ukesmeny.net\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions\/60"}],"wp:attachment":[{"href":"https:\/\/ukesmeny.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}