{"id":3270,"date":"2026-07-03T14:24:37","date_gmt":"2026-07-03T12:24:37","guid":{"rendered":"https:\/\/diyautosteer.com\/articles\/"},"modified":"2026-10-08T11:21:28","modified_gmt":"2026-10-08T09:21:28","slug":"articles","status":"publish","type":"page","link":"https:\/\/diyautosteer.com\/en\/articles\/","title":{"rendered":"Articles"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3270\" class=\"elementor elementor-3270 elementor-2733\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fece547 e-flex e-con-boxed e-con e-parent\" data-id=\"fece547\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0103eeb elementor-widget elementor-widget-html\" data-id=\"0103eeb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n  .diyas-articles {\n    font-family: 'DM Sans', -apple-system, sans-serif;\n    max-width: 980px;\n    margin: 0 auto;\n    color: #1a1a1a;\n  }\n  .diyas-articles, .diyas-articles * { text-transform: none !important; box-sizing: border-box; }\n  .diyas-articles h1, .diyas-articles h2 {\n    font-family: 'Lexend', -apple-system, sans-serif;\n    font-weight: 700;\n    margin: 0;\n    letter-spacing: -0.02em;\n  }\n\n  \/* --- Topp --- *\/\n  .diyas-articles-head h1 { font-size: 32px; margin-bottom: 8px; }\n  .diyas-articles-head p { font-size: 15px; color: #6b6b6b; margin: 0 0 26px; max-width: 560px; line-height: 1.5; }\n\n  \/* --- S\u00f8k --- *\/\n  .diyas-articles-search { position: relative; margin-bottom: 18px; }\n  .diyas-articles-search svg {\n    position: absolute; left: 16px; top: 50%; transform: translateY(-50%);\n    width: 18px; height: 18px; color: #9a9a9a; pointer-events: none;\n  }\n  .diyas-articles-search input {\n    width: 100%;\n    font-family: inherit;\n    font-size: 14.5px;\n    padding: 13px 16px 13px 44px;\n    border: 1px solid #e5e5e5;\n    border-radius: 10px;\n    background: #fafafa;\n    outline: none;\n    transition: border-color 0.15s ease, background 0.15s ease;\n  }\n  .diyas-articles-search input:focus { border-color: #2a6e2a; background: #fff; }\n  .diyas-articles-search input { padding-right: 44px; }\n  .diyas-articles-search input::-webkit-search-cancel-button { display: none; }\n  .diyas-search-clear {\n    position: absolute; right: 10px; top: 50%; transform: translateY(-50%);\n    width: 28px; height: 28px; border-radius: 50%; border: 0; padding: 0;\n    background: #eef8ea; color: #2a6e2a; cursor: pointer;\n    display: flex; align-items: center; justify-content: center;\n    transition: background 0.15s ease;\n  }\n  .diyas-search-clear:hover { background: #dcefd5; }\n  .diyas-search-clear:focus-visible { outline: 2px solid #2a6e2a; outline-offset: 2px; }\n  .diyas-search-clear[hidden] { display: none; }\n  .diyas-search-clear svg { position: static; transform: none; width: 14px; height: 14px; color: currentColor; }\n\n  \/* --- Filter --- *\/\n  .diyas-articles-filters {\n    display: flex;\n    gap: 8px;\n    overflow-x: auto;\n    padding-bottom: 4px;\n    margin-bottom: 34px;\n    -webkit-overflow-scrolling: touch;\n    scrollbar-width: thin;\n  }\n  .diyas-filter-btn {\n    flex-shrink: 0;\n    font-family: inherit;\n    font-size: 13.5px;\n    font-weight: 600;\n    padding: 9px 16px;\n    border-radius: 20px;\n    border: 1px solid #e5e5e5;\n    background: #fff;\n    color: #4a4a4a;\n    cursor: pointer;\n    white-space: nowrap;\n    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;\n  }\n  .diyas-filter-btn:hover { background: #f4faf4; border-color: #cfe6c9; }\n  .diyas-filter-btn.is-active { background: #2a6e2a; border-color: #2a6e2a; color: #fff; }\n  .diyas-filter-btn:focus-visible { outline: 2px solid #2a6e2a; outline-offset: 2px; }\n\n  \/* --- Anbefalte artikler: tre i bredden, to rader --- *\/\n  \/* Seksjonen glir sammen n\u00e5r man s\u00f8ker *\/\n  .diyas-articles-recommended {\n    display: grid; grid-template-rows: 1fr; margin-bottom: 42px; opacity: 1;\n    transition: grid-template-rows 0.35s ease, opacity 0.25s ease, margin-bottom 0.35s ease;\n  }\n  .diyas-articles-recommended > .diyas-rec-inner { overflow: hidden; min-height: 0; }\n  .diyas-articles-recommended.is-collapsed { grid-template-rows: 0fr; opacity: 0; margin-bottom: 0; pointer-events: none; }\n  .diyas-articles h2 { font-size: 19px; margin-bottom: 16px; }\n  .diyas-rec-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }\n  .diyas-rec-card {\n    text-decoration: none;\n    color: inherit;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    border: 1px solid #e5e5e5;\n    border-radius: 14px;\n    overflow: hidden;\n    box-shadow: 0 1px 3px rgba(0,0,0,0.04);\n    transition: border-color 0.15s ease, box-shadow 0.15s ease;\n  }\n  .diyas-rec-card:hover { border-color: #cfe6c9; box-shadow: 0 4px 14px rgba(0,0,0,0.06); }\n  .diyas-rec-card:focus-visible { outline: 2px solid #2a6e2a; outline-offset: 2px; }\n  .diyas-rec-card img {\n    width: 100%; height: 140px; object-fit: cover; display: block; flex-shrink: 0;\n  }\n  .diyas-rec-card-body { padding: 16px 18px 18px; display: flex; flex-direction: column; flex: 1; }\n  .diyas-tag {\n    display: inline-block;\n    font-size: 10.5px;\n    font-weight: 700;\n    letter-spacing: 0.03em;\n    color: #1f5420;\n    background: #eef8ea;\n    padding: 3px 8px;\n    border-radius: 5px;\n    margin-bottom: 8px;\n    width: fit-content;\n  }\n  .diyas-rec-card h3 { font-size: 15.5px; font-weight: 700; margin: 0 0 6px; line-height: 1.3; }\n  .diyas-rec-card p { font-size: 13px; color: #6b6b6b; line-height: 1.5; margin: 0 0 10px; }\n  .diyas-rec-more { font-size: 13px; font-weight: 600; color: #2a6e2a; display: inline-flex; align-items: center; gap: 4px; margin-top: auto; width: fit-content; }\n  .diyas-rec-more svg { width: 13px; height: 13px; transition: transform 0.15s ease; }\n  .diyas-rec-card:hover .diyas-rec-more svg { transform: translateX(3px); }\n\n  \/* --- Alle artikler \/ s\u00f8keresultater --- *\/\n  .diyas-all-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 16px; }\n  .diyas-all-head h2 { margin-bottom: 0; }\n  .diyas-all-count { font-size: 13px; color: #6b6b6b; white-space: nowrap; }\n  .diyas-all-list { border-top: 1px solid #eee; }\n  .diyas-all-row {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 20px;\n    padding: 18px 4px;\n    border-bottom: 1px solid #eee;\n    text-decoration: none;\n    color: inherit;\n    transition: background 0.15s ease;\n  }\n  .diyas-all-row:hover { background: #fafcf9; }\n  .diyas-all-row:focus-visible { outline: 2px solid #2a6e2a; outline-offset: -2px; }\n  .diyas-all-row-body { flex: 1; min-width: 0; }\n  .diyas-all-row-title-line { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; flex-wrap: wrap; }\n  .diyas-all-row-title-line .diyas-tag { margin-bottom: 0; }\n  .diyas-all-row-title { font-size: 15px; font-weight: 700; }\n  .diyas-all-row-desc { font-size: 13px; color: #6b6b6b; line-height: 1.4; }\n  .diyas-all-row-arrow { flex-shrink: 0; width: 18px; height: 18px; color: #b5b5b5; transition: color 0.15s ease, transform 0.15s ease; }\n  .diyas-all-row:hover .diyas-all-row-arrow { color: #2a6e2a; transform: translateX(3px); }\n\n  \/* --- Tomt s\u00f8k --- *\/\n  .diyas-empty { text-align: center; padding: 50px 20px; }\n  .diyas-empty svg { width: 34px; height: 34px; color: #cfcfcf; margin-bottom: 12px; }\n  .diyas-empty p { font-size: 14px; color: #6b6b6b; margin: 0 0 14px; }\n  .diyas-empty button {\n    font-family: inherit; font-size: 13.5px; font-weight: 600; color: #2a6e2a;\n    background: #eef8ea; border: none; padding: 9px 16px; border-radius: 8px; cursor: pointer;\n  }\n\n  \/* --- Sidetall --- *\/\n  .diyas-pagination { display: flex; align-items: center; justify-content: center; gap: 6px; margin-top: 28px; }\n  .diyas-page-btn {\n    font-family: inherit;\n    font-size: 13.5px;\n    font-weight: 600;\n    width: 34px; height: 34px;\n    display: flex; align-items: center; justify-content: center;\n    border-radius: 8px;\n    border: 1px solid #e5e5e5;\n    background: #fff;\n    color: #4a4a4a;\n    cursor: pointer;\n  }\n  .diyas-page-btn:hover:not(:disabled) { background: #f4faf4; border-color: #cfe6c9; }\n  .diyas-page-btn.is-active { background: #2a6e2a; border-color: #2a6e2a; color: #fff; }\n  .diyas-page-btn:disabled { opacity: 0.35; cursor: default; }\n  .diyas-page-btn svg { width: 15px; height: 15px; }\n\n  @media (prefers-reduced-motion: reduce) {\n    .diyas-articles-recommended { transition: none; }\n  }\n\n  \/* --- Nettbrett og mobil --- *\/\n  @media (max-width: 900px) {\n    .diyas-rec-grid { grid-template-columns: repeat(2, 1fr); }\n  }\n  @media (max-width: 600px) {\n    .diyas-rec-grid { grid-template-columns: 1fr; }\n    .diyas-all-row-arrow { display: none; }\n  }\n<\/style>\n\n<div class=\"diyas-articles\" id=\"diyasArticles\">\n\n  <div class=\"diyas-articles-head\">\n    <h1 data-tekst=\"artikler.side.tittel\">Artikler<\/h1>\n    <p data-tekst=\"artikler.side.ingress\">L\u00e6r, forst\u00e5 og bli bedre. Utforsk v\u00e5re artikler om autostyring, konsepter, installasjon og mer.<\/p>\n  <\/div>\n\n  <div class=\"diyas-articles-search\">\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"M21 21l-4.3-4.3\"\/><\/svg>\n    <input type=\"search\" id=\"diyasSearchInput\" placeholder=\"S\u00f8k i artikler\u2026\" aria-label=\"S\u00f8k i artikler\" autocomplete=\"off\" data-tekst-placeholder=\"artikler.side.sok\" data-tekst-aria-label=\"artikler.side.sok.etikett\">\n    <button type=\"button\" class=\"diyas-search-clear\" id=\"diyasSearchClear\" aria-label=\"T\u00f8m s\u00f8ket\" data-tekst-aria-label=\"artikler.side.sok.tom\" hidden>\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\"><path d=\"M6 6l12 12M18 6L6 18\"\/><\/svg>\n    <\/button>\n  <\/div>\n\n  <div class=\"diyas-articles-filters\" id=\"diyasFilters\" role=\"group\" aria-label=\"Filtrer etter emne\" data-tekst-aria-label=\"artikler.side.filter\"><\/div>\n\n  <div class=\"diyas-articles-recommended\" id=\"diyasRecSection\">\n    <div class=\"diyas-rec-inner\">\n      <h2 data-tekst=\"artikler.side.anbefalte\">Anbefalte artikler<\/h2>\n      <div class=\"diyas-rec-grid\" id=\"diyasRecGrid\"><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"diyas-articles-all\">\n    <div class=\"diyas-all-head\">\n      <h2 id=\"diyasAllHeading\" data-tekst=\"artikler.side.alle\">Alle artikler<\/h2>\n      <span class=\"diyas-all-count\" id=\"diyasAllCount\" aria-live=\"polite\"><\/span>\n    <\/div>\n    <div class=\"diyas-all-list\" id=\"diyasAllList\"><\/div>\n    <div class=\"diyas-empty\" id=\"diyasEmpty\" hidden>\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"M21 21l-4.3-4.3\"\/><\/svg>\n      <p data-tekst=\"artikler.side.ingen\">Ingen artikler funnet.<\/p>\n      <button type=\"button\" id=\"diyasResetBtn\" data-tekst=\"artikler.side.nullstill\">Nullstill s\u00f8k og filter<\/button>\n    <\/div>\n    <div class=\"diyas-pagination\" id=\"diyasPagination\"><\/div>\n  <\/div>\n\n  <!-- Tekster som brukes av skriptet. Oversettes i WPML \u2192 Strings (domenet \u00abdiyas\u00bb).\n       Ord i {kr\u00f8llparenteser} byttes ut av skriptet og m\u00e5 st\u00e5 med i oversettelsen. -->\n  <div class=\"diyas-i18n\" hidden>\n    <span data-tekst=\"artikler.side.js.alleemner\">Alle emner<\/span>\n    <span data-tekst=\"artikler.side.js.lesmer\">Les mer<\/span>\n    <span data-tekst=\"artikler.side.js.lasteranbefalte\">Laster anbefalte artikler\u2026<\/span>\n    <span data-tekst=\"artikler.side.js.laster\">Laster artikler\u2026<\/span>\n    <span data-tekst=\"artikler.side.js.treff\">{antall} treff<\/span>\n    <span data-tekst=\"artikler.side.js.artikkel\">{antall} artikkel<\/span>\n    <span data-tekst=\"artikler.side.js.artikler\">{antall} artikler<\/span>\n    <span data-tekst=\"artikler.side.js.ingenmatch\">Ingen artikler matcher \u00ab{sok}\u00bb.<\/span>\n    <span data-tekst=\"artikler.side.js.feil\">Kunne ikke laste artikler akkurat n\u00e5. Pr\u00f8v igjen litt senere.<\/span>\n    <span data-tekst=\"artikler.side.js.sokeresultater\">S\u00f8keresultater<\/span>\n    <span data-tekst=\"artikler.side.js.forrige\">Forrige side<\/span>\n    <span data-tekst=\"artikler.side.js.neste\">Neste side<\/span>\n  <\/div>\n\n<\/div>\n\n<script>\n(function () {\n\n  \/* =========================================================\n     OPPSETT\n\n     ANBEFALTE ARTIKLER\n     Gi en artikkel stikkordet (tag) anbefalt1, anbefalt2 ... anbefalt6.\n     Tallet bestemmer plassen:\n       anbefalt1  anbefalt2  anbefalt3   (\u00f8verste rad, fra venstre)\n       anbefalt4  anbefalt5  anbefalt6   (andre rad)\n     St\u00e5r en plass tom, rykker de neste opp.\n\n     KATEGORIER\n     Filterknappene hentes automatisk fra kategoriene i\n     wp-admin (Innlegg \u203a Kategorier). Bare kategorier som har minst\n     \u00e9n publisert artikkel vises. Rekkef\u00f8lgen styres av\n     CATEGORY_ORDER under. Kategorier som ikke st\u00e5r der, kommer\n     etterp\u00e5 i alfabetisk rekkef\u00f8lge.\n     ========================================================= *\/\n\n  var API_BASE = \"\/wp-json\/wp\/v2\";\n  var rootEl = document.getElementById(\"diyasArticles\");\n\n  \/* Spr\u00e5k: artikler, kategorier og stikkord hentes p\u00e5 samme spr\u00e5k som siden (WPML).\n     Tekstene oversettes i WPML \u2192 Strings og trenger ingen endring her. *\/\n  var LANG = (window.diyasRegion && window.diyasRegion.lang) ||\n             (document.documentElement.lang || \"\").split(\"-\")[0].toLowerCase();\n  var LANG_Q = LANG ? \"&lang=\" + encodeURIComponent(LANG) : \"\";\n  var LOCALE = document.documentElement.lang || \"nb-NO\";\n\n  \/\/ Tekst fra de skjulte feltene (oversatt i WPML)\n  function T(key, fallback) {\n    var el = rootEl.querySelector('.diyas-i18n [data-tekst=\"' + key + '\"]');\n    var t = el ? el.textContent.trim() : \"\";\n    return t || fallback;\n  }\n  function count(key, fallback, n) { return T(key, fallback).replace(\"{antall}\", n.toLocaleString(LOCALE)); }\n\n  \/* WPML kan gi oversatte stikkord og kategorier slugs med spr\u00e5khale,\n     f.eks. \"anbefalt1-en-us\" eller \"konsepter-en\". Halen tas bort f\u00f8r\n     sammenligning, s\u00e5 oppsettet under gjelder alle spr\u00e5k. *\/\n  function baseSlug(slug) { return String(slug || \"\").replace(\/-(en|no|nb|nn|de|fr|sv|da)(-[a-z]{2})?$\/i, \"\"); }\n  var RECOMMENDED_PREFIX = \"anbefalt\";\n  var RECOMMENDED_SLOTS = 6;\n  var PER_PAGE = 5;\n  var ALL_LABEL = T(\"artikler.side.js.alleemner\", \"Alle emner\");\n  var HIDDEN_CATEGORIES = [\"uncategorized\", \"ukategorisert\"];\n  \/\/ Norske slugs f\u00f8rst. F\u00e5r de engelske kategoriene egne slugs, legg dem til i samme rekkef\u00f8lge.\n  var CATEGORY_ORDER = [\"konsepter\", \"installasjon\", \"maskinvare\", \"programvare\", \"tips-og-triks\",\n                        \"concepts\", \"installation\", \"hardware\", \"software\", \"tips-and-tricks\"];\n\n  var FALLBACK_IMG = \"https:\/\/placehold.co\/400x240\/eef7ea\/2a6e2a?text=Artikkel\";\n\n  \/\/ Bare feltene siden trenger. Selve artikkelinnholdet hentes ikke.\n  var FIELDS = \"_fields=id,link,title,excerpt,tags,categories,_links,_embedded&_embed=wp:featuredmedia,wp:term\";\n\n  \/* =========================================================\n     TILSTAND\n     ========================================================= *\/\n\n  var state = { query: \"\", category: \"all\", page: 1 };\n  var categories = [];          \/\/ [{ id: WP-ID eller \"all\", slug, label }]\n  var requestToken = 0;\n\n  var filtersEl = document.getElementById(\"diyasFilters\");\n  var recSectionEl = document.getElementById(\"diyasRecSection\");\n  var recGridEl = document.getElementById(\"diyasRecGrid\");\n  var allListEl = document.getElementById(\"diyasAllList\");\n  var emptyEl = document.getElementById(\"diyasEmpty\");\n  var emptyTextEl = emptyEl.querySelector(\"p\");\n  var resetBtn = document.getElementById(\"diyasResetBtn\");\n  var paginationEl = document.getElementById(\"diyasPagination\");\n  var searchInput = document.getElementById(\"diyasSearchInput\");\n  var searchClear = document.getElementById(\"diyasSearchClear\");\n  var allHeadingEl = document.getElementById(\"diyasAllHeading\");\n  var allCountEl = document.getElementById(\"diyasAllCount\");\n  var hasRecommended = false;\n  var ALL_HEADING = allHeadingEl.textContent.trim() || \"Alle artikler\";\n  var NO_ARTICLES = emptyTextEl.textContent.trim() || \"Ingen artikler funnet.\";\n\n  \/* =========================================================\n     Hjelpefunksjoner\n     ========================================================= *\/\n\n  \/\/ Leser JSON selv om WordPress eller en utvidelse har skrevet noe foran svaret\n  function getJSON(url) {\n    return fetch(url).then(function (res) {\n      if (!res.ok) { var err = new Error(\"http \" + res.status); err.status = res.status; throw err; }\n      return res.text().then(function (txt) {\n        var start = txt.search(\/[\\[{]\/);\n        if (start > 0) txt = txt.slice(start);\n        return { data: JSON.parse(txt), headers: res.headers };\n      });\n    });\n  }\n\n  function stripHtml(html) {\n    var tmp = document.createElement(\"div\");\n    tmp.innerHTML = html || \"\";\n    return (tmp.textContent || tmp.innerText || \"\").replace(\/\\s+\/g, \" \").trim();\n  }\n\n  function escapeAttr(s) {\n    return String(s).replace(\/&\/g, \"&amp;\").replace(\/\"\/g, \"&quot;\").replace(\/<\/g, \"&lt;\").replace(\/>\/g, \"&gt;\");\n  }\n\n  function cleanExcerpt(post) {\n    var text = stripHtml(post.excerpt && post.excerpt.rendered);\n    return text.replace(\/\\[\u2026\\]\\s*$\/, \"\").replace(\/\u2026\\s*$\/, \"\").trim();\n  }\n\n  function getFeaturedImage(post) {\n    try {\n      var media = post._embedded[\"wp:featuredmedia\"];\n      if (media && media[0]) {\n        var sizes = media[0].media_details && media[0].media_details.sizes;\n        if (sizes && sizes.medium_large && sizes.medium_large.source_url) return sizes.medium_large.source_url;\n        if (media[0].source_url) return media[0].source_url;\n      }\n    } catch (e) {}\n    return FALLBACK_IMG;\n  }\n\n  \/\/ F\u00f8rste synlige kategori p\u00e5 artikkelen\n  function getPostCategory(post) {\n    try {\n      var groups = post._embedded[\"wp:term\"] || [];\n      for (var g = 0; g < groups.length; g++) {\n        var terms = groups[g] || [];\n        for (var i = 0; i < terms.length; i++) {\n          var t = terms[i];\n          if (t.taxonomy === \"category\" && HIDDEN_CATEGORIES.indexOf(baseSlug(t.slug)) === -1) {\n            return { label: stripHtml(t.name), slug: t.slug };\n          }\n        }\n      }\n    } catch (e) {}\n    return { label: \"\", slug: \"\" };\n  }\n\n  var ARROW = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>';\n\n  function cardHtml(post) {\n    var cat = getPostCategory(post);\n    var title = stripHtml(post.title.rendered);\n    return '<a class=\"diyas-rec-card\" href=\"' + escapeAttr(post.link) + '\">' +\n      '<img decoding=\"async\" src=\"' + escapeAttr(getFeaturedImage(post)) + '\" alt=\"' + escapeAttr(title) + '\" loading=\"lazy\">' +\n      '<div class=\"diyas-rec-card-body\">' +\n      (cat.label ? '<span class=\"diyas-tag\">' + escapeAttr(cat.label.toUpperCase()) + '<\/span>' : \"\") +\n      '<h3>' + escapeAttr(title) + '<\/h3>' +\n      '<p>' + escapeAttr(cleanExcerpt(post)) + '<\/p>' +\n      '<span class=\"diyas-rec-more\">' + escapeAttr(T(\"artikler.side.js.lesmer\", \"Les mer\")) + ' ' + ARROW + '<\/span>' +\n      '<\/div><\/a>';\n  }\n\n  function rowHtml(post) {\n    var cat = getPostCategory(post);\n    return '<a class=\"diyas-all-row\" href=\"' + escapeAttr(post.link) + '\">' +\n      '<div class=\"diyas-all-row-body\">' +\n      '<div class=\"diyas-all-row-title-line\"><span class=\"diyas-all-row-title\">' + escapeAttr(stripHtml(post.title.rendered)) + '<\/span>' +\n      (cat.label ? '<span class=\"diyas-tag\">' + escapeAttr(cat.label.toUpperCase()) + '<\/span>' : \"\") + '<\/div>' +\n      '<div class=\"diyas-all-row-desc\">' + escapeAttr(cleanExcerpt(post)) + '<\/div><\/div>' +\n      '<span class=\"diyas-all-row-arrow\" aria-hidden=\"true\">' + ARROW + '<\/span>' +\n      '<\/a>';\n  }\n\n  \/* =========================================================\n     Kategorier, hentet automatisk fra WordPress\n     ========================================================= *\/\n\n  function loadCategories() {\n    return getJSON(API_BASE + \"\/categories?per_page=100&hide_empty=true&_fields=id,slug,name,count\" + LANG_Q)\n      .then(function (r) {\n        var list = r.data\n          .filter(function (c) { return HIDDEN_CATEGORIES.indexOf(baseSlug(c.slug)) === -1 && c.count > 0; })\n          .map(function (c) { return { id: c.id, slug: c.slug, label: stripHtml(c.name) }; });\n        list.sort(function (a, b) {\n          var ia = CATEGORY_ORDER.indexOf(baseSlug(a.slug)), ib = CATEGORY_ORDER.indexOf(baseSlug(b.slug));\n          if (ia === -1) ia = 999;\n          if (ib === -1) ib = 999;\n          return ia !== ib ? ia - ib : a.label.localeCompare(b.label, LOCALE);\n        });\n        categories = [{ id: \"all\", slug: null, label: ALL_LABEL }].concat(list);\n      })\n      .catch(function () {\n        categories = [{ id: \"all\", slug: null, label: ALL_LABEL }];\n      });\n  }\n\n  function renderFilters() {\n    filtersEl.innerHTML = \"\";\n    categories.forEach(function (c) {\n      var btn = document.createElement(\"button\");\n      btn.type = \"button\";\n      var active = state.category === c.id;\n      btn.className = \"diyas-filter-btn\" + (active ? \" is-active\" : \"\");\n      btn.setAttribute(\"aria-pressed\", active ? \"true\" : \"false\");\n      btn.textContent = c.label;\n      btn.addEventListener(\"click\", function () {\n        state.category = c.id;\n        state.page = 1;\n        renderFilters();\n        updateSearchMode();\n        loadList();\n      });\n      filtersEl.appendChild(btn);\n    });\n  }\n\n  \/* =========================================================\n     Anbefalte artikler, sortert etter anbefalt1 ... anbefalt6\n     ========================================================= *\/\n\n  function loadRecommended() {\n    recGridEl.innerHTML = '<p style=\"color:#9a9a9a;font-size:13.5px;\">' + escapeAttr(T(\"artikler.side.js.lasteranbefalte\", \"Laster anbefalte artikler\u2026\")) + '<\/p>';\n\n    \/\/ T\u00e5ler oversatte stikkord med slugs som \"anbefalt1-en-us\" eller \"anbefalt1-2\"\n    var SLOT_RE = new RegExp(\"^\" + RECOMMENDED_PREFIX + \"-?(\\\\d+)(?:-[a-z0-9-]+)?$\");\n\n    getJSON(API_BASE + \"\/tags?per_page=100&_fields=id,slug&search=\" + RECOMMENDED_PREFIX + LANG_Q)\n      .then(function (r) {\n        var slotByTagId = {};\n        r.data.forEach(function (t) {\n          var m = String(t.slug).match(SLOT_RE);\n          var n = m ? parseInt(m[1], 10) : 0;\n          if (n >= 1 && n <= RECOMMENDED_SLOTS) slotByTagId[t.id] = n;\n        });\n        var tagIds = Object.keys(slotByTagId);\n        if (!tagIds.length) return null;\n\n        return getJSON(API_BASE + \"\/posts?per_page=\" + (RECOMMENDED_SLOTS * 2) + \"&tags=\" + tagIds.join(\",\") + \"&\" + FIELDS + LANG_Q)\n          .then(function (p) {\n            \/\/ Finn laveste plassnummer for hver artikkel, og sorter etter det\n            var withSlot = p.data.map(function (post) {\n              var slot = 999;\n              (post.tags || []).forEach(function (id) { if (slotByTagId[id] && slotByTagId[id] < slot) slot = slotByTagId[id]; });\n              return { post: post, slot: slot };\n            });\n            withSlot.sort(function (a, b) { return a.slot - b.slot; });\n            return withSlot.slice(0, RECOMMENDED_SLOTS).map(function (x) { return x.post; });\n          });\n      })\n      .then(function (posts) {\n        if (!posts || !posts.length) { hasRecommended = false; recSectionEl.hidden = true; return; }\n        hasRecommended = true;\n        recSectionEl.hidden = false;\n        recGridEl.innerHTML = posts.map(cardHtml).join(\"\");\n        updateSearchMode();\n      })\n      .catch(function () { hasRecommended = false; recSectionEl.hidden = true; });\n  }\n\n  \/* =========================================================\n     Alle artikler: filtrert, s\u00f8kt og delt opp i sider\n     ========================================================= *\/\n\n  function buildListUrl() {\n    var params = [FIELDS, \"per_page=\" + PER_PAGE, \"page=\" + state.page];\n    if (state.category !== \"all\") params.push(\"categories=\" + state.category);\n    if (state.query.trim()) params.push(\"search=\" + encodeURIComponent(state.query.trim()));\n    return API_BASE + \"\/posts?\" + params.join(\"&\") + LANG_Q;\n  }\n\n  function showMessage(text, isError) {\n    allListEl.style.display = \"none\";\n    paginationEl.innerHTML = \"\";\n    emptyEl.hidden = false;\n    emptyTextEl.textContent = text;\n    resetBtn.style.display = isError ? \"none\" : \"\";\n  }\n\n  function loadList() {\n    var myToken = ++requestToken;\n    emptyEl.hidden = true;\n    allListEl.style.display = \"\";\n    allListEl.innerHTML = '<p style=\"color:#9a9a9a;font-size:13.5px;padding:20px 4px;\">' + escapeAttr(T(\"artikler.side.js.laster\", \"Laster artikler\u2026\")) + '<\/p>';\n\n    getJSON(buildListUrl())\n      .then(function (r) {\n        if (myToken !== requestToken) return;\n        var total = parseInt(r.headers.get(\"X-WP-Total\") || String(r.data.length), 10);\n        if (state.query.trim()) allCountEl.textContent = count(\"artikler.side.js.treff\", \"{antall} treff\", total);\n        else if (state.category !== \"all\") allCountEl.textContent = total === 1\n          ? count(\"artikler.side.js.artikkel\", \"{antall} artikkel\", total)\n          : count(\"artikler.side.js.artikler\", \"{antall} artikler\", total);\n        else allCountEl.textContent = \"\";\n        if (!r.data.length) {\n          showMessage(state.query.trim()\n            ? T(\"artikler.side.js.ingenmatch\", \"Ingen artikler matcher \u00ab{sok}\u00bb.\").replace(\"{sok}\", state.query.trim())\n            : NO_ARTICLES, false);\n          return;\n        }\n        var totalPages = parseInt(r.headers.get(\"X-WP-TotalPages\") || \"1\", 10);\n        allListEl.style.display = \"\";\n        allListEl.innerHTML = r.data.map(rowHtml).join(\"\");\n        renderPagination(totalPages);\n      })\n      .catch(function (err) {\n        if (myToken !== requestToken) return;\n        if (err && err.status === 400 && state.page !== 1) { state.page = 1; loadList(); return; }\n        showMessage(T(\"artikler.side.js.feil\", \"Kunne ikke laste artikler akkurat n\u00e5. Pr\u00f8v igjen litt senere.\"), true);\n      });\n  }\n\n  function renderPagination(totalPages) {\n    if (totalPages <= 1) { paginationEl.innerHTML = \"\"; return; }\n    var html = '<button type=\"button\" class=\"diyas-page-btn\" data-page=\"prev\" aria-label=\"' + escapeAttr(T(\"artikler.side.js.forrige\", \"Forrige side\")) + '\"' + (state.page === 1 ? \" disabled\" : \"\") + '>' +\n      '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 6l-6 6 6 6\"\/><\/svg><\/button>';\n    for (var i = 1; i <= totalPages; i++) {\n      html += '<button type=\"button\" class=\"diyas-page-btn' + (state.page === i ? \" is-active\" : \"\") + '\" data-page=\"' + i + '\">' + i + '<\/button>';\n    }\n    html += '<button type=\"button\" class=\"diyas-page-btn\" data-page=\"next\" aria-label=\"' + escapeAttr(T(\"artikler.side.js.neste\", \"Neste side\")) + '\"' + (state.page === totalPages ? \" disabled\" : \"\") + '>' +\n      '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 6l6 6-6 6\"\/><\/svg><\/button>';\n    paginationEl.innerHTML = html;\n\n    paginationEl.querySelectorAll(\".diyas-page-btn\").forEach(function (btn) {\n      btn.addEventListener(\"click\", function () {\n        var val = btn.getAttribute(\"data-page\");\n        if (val === \"prev\") state.page = Math.max(1, state.page - 1);\n        else if (val === \"next\") state.page = state.page + 1;\n        else state.page = parseInt(val, 10);\n        loadList();\n        document.getElementById(\"diyasArticles\").scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n      });\n    });\n  }\n\n  function categoryLabel(id) {\n    for (var i = 0; i < categories.length; i++) if (categories[i].id === id) return categories[i].label;\n    return \"\";\n  }\n\n  \/\/ S\u00f8k eller valgt kategori: de anbefalte artiklene glir bort, og lista viser bare treffene\n  function updateSearchMode() {\n    var searching = searchInput.value.trim().length > 0;\n    var filtering = state.category !== \"all\";\n    var narrowed = searching || filtering;\n    recSectionEl.classList.toggle(\"is-collapsed\", narrowed);\n    recSectionEl.setAttribute(\"aria-hidden\", narrowed ? \"true\" : \"false\");\n    searchClear.hidden = !searchInput.value.length;\n    allHeadingEl.textContent = searching ? T(\"artikler.side.js.sokeresultater\", \"S\u00f8keresultater\") : (filtering ? categoryLabel(state.category) : ALL_HEADING);\n    if (!narrowed) allCountEl.textContent = \"\";\n  }\n\n  function clearSearch(keepFocus) {\n    clearTimeout(searchTimeout);\n    searchInput.value = \"\";\n    state.query = \"\";\n    state.page = 1;\n    updateSearchMode();\n    loadList();\n    if (keepFocus) searchInput.focus();\n  }\n\n  resetBtn.addEventListener(\"click\", function () {\n    state.category = \"all\";\n    renderFilters();\n    clearSearch(false);\n  });\n\n  var searchTimeout;\n  searchInput.addEventListener(\"input\", function () {\n    updateSearchMode();               \/\/ skjul anbefalte med en gang man begynner \u00e5 skrive\n    clearTimeout(searchTimeout);\n    searchTimeout = setTimeout(function () {\n      state.query = searchInput.value;\n      state.page = 1;\n      loadList();\n    }, 300);\n  });\n  searchInput.addEventListener(\"keydown\", function (e) {\n    if (e.key === \"Escape\" && searchInput.value) { e.preventDefault(); clearSearch(true); }\n  });\n  searchClear.addEventListener(\"click\", function () { clearSearch(true); });\n\n  \/* =========================================================\n     Start\n     ========================================================= *\/\n\n  loadCategories().then(function () {\n    renderFilters();\n    loadRecommended();\n    loadList();\n  });\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Artikler L\u00e6r, forst\u00e5 og bli bedre. Utforsk v\u00e5re artikler om autostyring, konsepter, installasjon og mer. Anbefalte artikler Alle artikler Ingen artikler funnet. Nullstill s\u00f8k og filter Alle emner Les mer Laster anbefalte artikler\u2026 Laster artikler\u2026 {antall} treff {antall} artikkel {antall} artikler Ingen artikler matcher \u00ab{sok}\u00bb. Kunne ikke laste artikler akkurat n\u00e5. Pr\u00f8v igjen litt senere. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_angie_page":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-3270","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/diyautosteer.com\/en\/wp-json\/wp\/v2\/pages\/3270","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/diyautosteer.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/diyautosteer.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/diyautosteer.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/diyautosteer.com\/en\/wp-json\/wp\/v2\/comments?post=3270"}],"version-history":[{"count":1,"href":"https:\/\/diyautosteer.com\/en\/wp-json\/wp\/v2\/pages\/3270\/revisions"}],"predecessor-version":[{"id":3271,"href":"https:\/\/diyautosteer.com\/en\/wp-json\/wp\/v2\/pages\/3270\/revisions\/3271"}],"wp:attachment":[{"href":"https:\/\/diyautosteer.com\/en\/wp-json\/wp\/v2\/media?parent=3270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}