CINXE.COM

Bokkilden

<!DOCTYPE html> <html lang="nb" class="h-full"> <!-- Copyright De norske Bokklubbene. All rights reserved. --> <head > <script id="Cookiebot" src="https://consent.cookiebot.com/uc.js" data-cbid="055187ca-ee46-469e-82db-ed7e26998c59" type="text/javascript" async></script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5J5HG2K');</script> <!-- End Google Tag Manager --> <script> !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '387946424906610'); fbq('track', "PageView"); </script> <base href="https://www.bokkilden.no/"/> <title> Bokkilden </title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="version" content=""/> <meta name="google-site-verification" content="gsrBS7DVfQBttAlDQew6-hr-iyI0w5fZC--CFIF4xzM"/> <meta property="og:site_name" content="Bokkilden"/> <meta property="og:locale" content="nb_NO"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta name="format-detection" content="telephone=no"/> <meta name="description" content="Norges ledende nettbokhandel med over 6 millioner titler! Svært lave priser, rask levering og fast lav frakt på kr 19,- på bøker."/> <meta property="og:description" content="Norges ledende nettbokhandel med over 6 millioner titler! Svært lave priser, rask levering og fast lav frakt på kr 19,- på bøker."/> <meta name="keywords" content="bok, bøker, bokhandel, internettbokhandel, billigbøker,billige bøker, kjøpe bøker, dvd, tilbudsbøker, barnebøker, boktilbud, krim, pocket, pocketbøker, gavekort"/> <meta property="fb:app_id" content="121894421201314"/> <meta property="og:title" content="Bokkilden"/> <meta name="robots" content="" /> <meta property="og:type" content="website"/> <meta property="og:image" content="https://www.bokkilden.no/servlet/VisBildeServlet?bildeId=480773"/> <link href="/static/css/bokkilden/style.css?rel=34b92bab02edc2b493db124971594860" rel="stylesheet"> <script type="module" src="/static/js/app.js?rel=9837d605d917102d931facc6067c7307"></script> <script src="/static/js/dialogPolyfill.js"></script> <link rel="stylesheet" href="/static/css/dialog-polyfill.css"/> <link rel="manifest" href="/static/manifest/bokkilden/site.webmanifest"/> <link rel="icon" type="image/x-icon" href="/static/icons/bokkilden/favicon.ico"/> <link rel="icon" sizes="16x16" href="/static/images/bokkilden/favicon-16x16.png"/> <link rel="icon" sizes="32x32" href="/static/images/bokkilden/favicon-32x32.png"/> <link rel="icon" sizes="192x192" href="/static/images/bokkilden/android-chrome-192x192.png"> <link rel="icon" sizes="512x512" href="/static/images/bokkilden/android-chrome-512x512.png"> <link rel="apple-touch-icon" sizes="180x180" href="/static/images/bokkilden/apple-touch-icon.png"/> </head> <body class="h-full bg-papirhvit text-svart font-serif text-lg md:text-xl lg:text-2xl"> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5J5HG2K" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <svg xmlns="http://www.w3.org/2000/svg" class="hidden"> <symbol id="icon-check" viewBox="0 0 20 20"> <path d="m0 8.548 8.136 9.841L20 3.31l-2.16-1.699-9.757 12.401-5.965-7.215L0 8.548Z" fill="currentColor"></path> </symbol> <symbol id="icon-shopping" viewBox="0 0 576 512"> <path d="M16 0C7.2 0 0 7.2 0 16s7.2 16 16 16H53.9c7.6 0 14.2 5.3 15.7 12.8l58.9 288c6.1 29.8 32.3 51.2 62.7 51.2H496c8.8 0 16-7.2 16-16s-7.2-16-16-16H191.2c-15.2 0-28.3-10.7-31.4-25.6L152 288H466.5c29.4 0 55-20 62.1-48.5L575.5 51.9c2.1-8.6-3.1-17.3-11.6-19.4s-17.3 3.1-19.4 11.6L497.6 231.8C494 246 481.2 256 466.5 256H145.4L100.9 38.4C96.3 16 76.7 0 53.9 0H16zM168 456a24 24 0 1 1 48 0 24 24 0 1 1 -48 0zm80 0a56 56 0 1 0 -112 0 56 56 0 1 0 112 0zm200-24a24 24 0 1 1 0 48 24 24 0 1 1 0-48zm0 80a56 56 0 1 0 0-112 56 56 0 1 0 0 112zM240 128c0 8.8 7.2 16 16 16h48v48c0 8.8 7.2 16 16 16s16-7.2 16-16V144h48c8.8 0 16-7.2 16-16s-7.2-16-16-16H336V64c0-8.8-7.2-16-16-16s-16 7.2-16 16v48H256c-8.8 0-16 7.2-16 16z" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2" fill="currentColor"></path> </symbol> <symbol id="icon-search" viewBox="0 0 28 28"> <path d="M9.855 16.736 0 26.574l1.407 1.41 9.856-9.84a10.194 10.194 0 0 0 6.5 2.329C23.417 20.473 28 15.89 28 10.237 28 4.583 23.417 0 17.763 0 12.11 0 7.527 4.583 7.527 10.237c0 2.467.873 4.731 2.328 6.499Zm7.908 1.746a8.246 8.246 0 1 1 .002-16.492 8.246 8.246 0 0 1-.002 16.492Z" fill="currentColor"></path> </symbol> <symbol id="icon-bar" viewBox="0 0 49 49"> <path d="M0 43h49v-3H0v3Zm0-17.001h49v-3H0v3ZM0 9h49V6H0v3Z" fill="currentColor"></path> </symbol> <symbol id="icon-arrow-right" viewBox="0 0 448 512"> <path d="M443.3 267.3c6.2-6.2 6.2-16.4 0-22.6l-176-176c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6L393.4 240 16 240c-8.8 0-16 7.2-16 16s7.2 16 16 16l377.4 0L244.7 420.7c-6.2 6.2-6.2 16.4 0 22.6s16.4 6.2 22.6 0l176-176z" fill="currentColor"></path> </symbol> <symbol id="icon-arrow-left" viewBox="0 0 448 512"> <path d="M4.7 244.7c-6.2 6.2-6.2 16.4 0 22.6l176 176c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6L54.6 272 432 272c8.8 0 16-7.2 16-16s-7.2-16-16-16L54.6 240 203.3 91.3c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.2-22.6 0l-176 176z" fill="currentColor"></path> </symbol> <symbol id="icon-arrow-up" viewBox="0 0 384 512"> <path d="M203.3 36.7c-6.2-6.2-16.4-6.2-22.6 0l-176 176c-6.2 6.2-6.2 16.4 0 22.6s16.4 6.2 22.6 0L176 86.6V464c0 8.8 7.2 16 16 16s16-7.2 16-16V86.6L356.7 235.3c6.2 6.2 16.4 6.2 22.6 0s6.2-16.4 0-22.6l-176-176z" fill="currentColor"></path> </symbol> <symbol id="icon-arrow-down" viewBox="0 0 384 512"> <path d="M180.7 475.3c6.2 6.2 16.4 6.2 22.6 0l176-176c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.2-22.6 0L208 425.4 208 48c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 377.4L27.3 276.7c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6l176 176z" fill="currentColor"></path> </symbol> <symbol id="icon-symbol" viewBox="0 0 15 15"> <path d="M11.891 7.061c.832.104 1.514.343 2.041.715.712.508 1.068 1.21 1.068 2.107 0 .612-.173 1.16-.525 1.649-.352.489-.872.874-1.566 1.155-.695.281-1.544.422-2.55.422H4.921v-.897c.521 0 .886-.087 1.095-.259v-.004c.209-.172.311-.449.311-.829V3.876c0-.381-.106-.657-.32-.829-.214-.172-.574-.259-1.086-.259v-.897h5.371c1.344 0 2.363.24 3.057.716s1.041 1.128 1.041 1.957c0 .771-.302 1.382-.907 1.831-.421.311-.951.529-1.592.652v.014ZM0 12.307c1.379 0 2.629-.502 3.533-1.313.904-.811 1.464-1.931 1.464-3.168C2.238 7.826 0 9.833 0 12.307Zm11.81-.911c.445-.358.667-.879.667-1.572 0-.693-.223-1.169-.663-1.5-.441-.335-1.09-.498-1.949-.498H8.677v4.105H9.95c.792 0 1.41-.177 1.855-.535h.005ZM0 2.362c0 1.24.56 2.36 1.464 3.17.904.81 2.154 1.311 3.533 1.311C4.997 4.37 2.759 2.362 0 2.362Zm11.378 3.96c.405-.335.61-.815.61-1.45 0-.584-.183-1.051-.552-1.39-.37-.34-.89-.508-1.567-.508H8.682v3.851h.965c.748 0 1.322-.168 1.731-.498v-.005Z" fill="currentColor"></path> </symbol> <symbol id="icon-close" viewBox="0 0 17 17"> <path d="M8.5 7.172 1.914.586.5 2l6.586 6.586-6.223 6.222 1.414 1.415L8.5 10l6.222 6.222 1.414-1.414-6.222-6.222L16.5 2 15.085.586 8.5 7.172Z" fill="currentColor"></path> </symbol> <symbol id="icon-heart" viewBox="0 0 37 32"> <path d="M9.764.32h-.006V.313a9.74 9.74 0 0 0-9.75 9.716c-.041.702-.469 12.923 18.071 21.464l.421.194.422-.194C37.53 22.92 37.03 10.641 36.992 10.017c-.015-5.36-4.364-9.701-9.743-9.704h-.006a9.74 9.74 0 0 0-8.737 5.424A9.737 9.737 0 0 0 9.764.313V.32Zm-.006 2.008a7.727 7.727 0 0 0-7.735 7.735l-.002.07s-.651 11.254 16.48 19.333C35.63 21.387 34.98 10.133 34.98 10.133l-.003-.07a7.728 7.728 0 0 0-7.731-7.735 7.728 7.728 0 0 0-7.732 7.735h-2.015l-.003-.2a7.726 7.726 0 0 0-7.732-7.535h-.006Z" fill="currentColor" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2" ></path> </symbol> <symbol id="icon-heart-fill" viewBox="0 0 37 32"> <path d="M9.764.32h-.006V.313a9.74 9.74 0 0 0-9.75 9.716c-.041.702-.469 12.923 18.071 21.464l.421.194.422-.194C37.53 22.92 37.03 10.641 36.992 10.017c-.015-5.36-4.364-9.701-9.743-9.704h-.006a9.74 9.74 0 0 0-8.737 5.424A9.737 9.737 0 0 0 9.764.313V.32Z" style="fill:#d52f09;fill-rule:nonzero"></path> </symbol> <symbol id="icon-dice-4" viewBox="0 0 47 47"> <path d="M0 0h47v47H0V0Zm34.688 38.586h.001a3.873 3.873 0 0 0 3.854-3.854c0-2.114-1.739-3.853-3.853-3.854h-.001a3.873 3.873 0 0 0-3.854 3.854c0 2.114 1.739 3.853 3.853 3.854Zm-22.381 0c2.114-.001 3.853-1.74 3.853-3.854a3.873 3.873 0 0 0-3.854-3.854 3.873 3.873 0 0 0-3.854 3.854 3.873 3.873 0 0 0 3.854 3.854h.001Zm0-22.463a3.873 3.873 0 0 0 3.855-3.855 3.873 3.873 0 0 0-3.855-3.855 3.873 3.873 0 0 0-3.855 3.855 3.873 3.873 0 0 0 3.855 3.855Zm22.381 0a3.873 3.873 0 0 0 3.855-3.855 3.873 3.873 0 0 0-3.855-3.855 3.873 3.873 0 0 0-3.855 3.855 3.873 3.873 0 0 0 3.855 3.855Z" style="fill:#d52f09;fill-rule:nonzero"></path> </symbol> <symbol id="icon-dice-5" viewBox="0 0 47 47"> <path d="M0 0h47v47H0V0Zm34.688 38.586h.001a3.873 3.873 0 0 0 3.854-3.854c0-2.114-1.739-3.853-3.853-3.854h-.001a3.873 3.873 0 0 0-3.854 3.854c0 2.114 1.739 3.853 3.853 3.854Zm-22.381 0c2.114-.001 3.853-1.74 3.853-3.854a3.873 3.873 0 0 0-3.854-3.854 3.873 3.873 0 0 0-3.854 3.854 3.873 3.873 0 0 0 3.854 3.854h.001Zm10.67-11.231a3.873 3.873 0 0 0 3.854-3.854V23.5c-.001-2.114-1.74-3.853-3.854-3.853a3.873 3.873 0 0 0-3.854 3.854 3.873 3.873 0 0 0 3.854 3.854Zm-10.67-11.232a3.873 3.873 0 0 0 3.855-3.855 3.873 3.873 0 0 0-3.855-3.855 3.873 3.873 0 0 0-3.855 3.855 3.873 3.873 0 0 0 3.855 3.855Zm22.381 0a3.873 3.873 0 0 0 3.855-3.855 3.873 3.873 0 0 0-3.855-3.855 3.873 3.873 0 0 0-3.855 3.855 3.873 3.873 0 0 0 3.855 3.855Z" style="fill:#d52f09; fill-rule:nonzero"></path> </symbol> <symbol id="icon-dice-6" viewBox="0 0 47 47"> <path d="M0 0h47v47H0V0Zm12.309 38.586a3.873 3.873 0 0 0 3.854-3.854 3.873 3.873 0 0 0-3.854-3.854 3.873 3.873 0 0 0-3.854 3.854 3.873 3.873 0 0 0 3.854 3.854Zm22.383 0a3.873 3.873 0 0 0 3.854-3.854 3.873 3.873 0 0 0-3.854-3.854 3.873 3.873 0 0 0-3.854 3.854 3.873 3.873 0 0 0 3.854 3.854ZM12.309 27.355c2.114-.001 3.854-1.741 3.854-3.855a3.873 3.873 0 0 0-3.855-3.855h-.001c-2.114.001-3.854 1.741-3.854 3.855a3.873 3.873 0 0 0 3.855 3.855h.001Zm22.383 0c2.114-.001 3.854-1.741 3.854-3.855a3.873 3.873 0 0 0-3.855-3.855h-.001c-2.114.001-3.854 1.741-3.854 3.855a3.873 3.873 0 0 0 3.855 3.855h.001ZM12.309 16.123c2.114-.001 3.854-1.741 3.854-3.855a3.873 3.873 0 0 0-3.855-3.855h-.001c-2.114.001-3.854 1.741-3.854 3.855a3.873 3.873 0 0 0 3.855 3.855h.001Zm22.383 0c2.114-.001 3.854-1.741 3.854-3.855a3.873 3.873 0 0 0-3.855-3.855h-.001c-2.114.001-3.854 1.741-3.854 3.855a3.873 3.873 0 0 0 3.855 3.855h.001Z" style="fill:#d52f09; fill-rule:nonzero"></path> </symbol> <symbol id="icon-star" viewBox="0 0 576 512"> <path d="M288.1 0l86.5 164 182.7 31.6L428 328.5 454.4 512 288.1 430.2 121.7 512l26.4-183.5L18.9 195.6 201.5 164 288.1 0z" fill="currentColor"></path> </symbol> <symbol id="icon-facebook" viewBox="0 0 448 512"> <path d="M400 32H48A48 48 0 0 0 0 80v352a48 48 0 0 0 48 48h137.25V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.27c-30.81 0-40.42 19.12-40.42 38.73V256h68.78l-11 71.69h-57.78V480H400a48 48 0 0 0 48-48V80a48 48 0 0 0-48-48z" fill="currentColor"></path> </symbol> <symbol id="icon-instagram" viewBox="0 0 448 512"> <path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z" fill="currentColor"></path> </symbol> <symbol id="icon-visa" viewBox="0 0 576 512"> <path d="M470.1 231.3s7.6 37.2 9.3 45H446c3.3-8.9 16-43.5 16-43.5-.2.3 3.3-9.1 5.3-14.9l2.8 13.4zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM152.5 331.2L215.7 176h-42.5l-39.3 106-4.3-21.5-14-71.4c-2.3-9.9-9.4-12.7-18.2-13.1H32.7l-.7 3.1c15.8 4 29.9 9.8 42.2 17.1l35.8 135h42.5zm94.4.2L272.1 176h-40.2l-25.1 155.4h40.1zm139.9-50.8c.2-17.7-10.6-31.2-33.7-42.3-14.1-7.1-22.7-11.9-22.7-19.2.2-6.6 7.3-13.4 23.1-13.4 13.1-.3 22.7 2.8 29.9 5.9l3.6 1.7 5.5-33.6c-7.9-3.1-20.5-6.6-36-6.6-39.7 0-67.6 21.2-67.8 51.4-.3 22.3 20 34.7 35.2 42.2 15.5 7.6 20.8 12.6 20.8 19.3-.2 10.4-12.6 15.2-24.1 15.2-16 0-24.6-2.5-37.7-8.3l-5.3-2.5-5.6 34.9c9.4 4.3 26.8 8.1 44.8 8.3 42.2.1 69.7-20.8 70-53zM528 331.4L495.6 176h-31.1c-9.6 0-16.9 2.8-21 12.9l-59.7 142.5H426s6.9-19.2 8.4-23.3H486c1.2 5.5 4.8 23.3 4.8 23.3H528z" fill="currentColor"></path> </symbol> <symbol id="icon-mastercard" viewBox="0 0 576 512"> <path d="M482.9 410.3c0 6.8-4.6 11.7-11.2 11.7-6.8 0-11.2-5.2-11.2-11.7 0-6.5 4.4-11.7 11.2-11.7 6.6 0 11.2 5.2 11.2 11.7zm-310.8-11.7c-7.1 0-11.2 5.2-11.2 11.7 0 6.5 4.1 11.7 11.2 11.7 6.5 0 10.9-4.9 10.9-11.7-.1-6.5-4.4-11.7-10.9-11.7zm117.5-.3c-5.4 0-8.7 3.5-9.5 8.7h19.1c-.9-5.7-4.4-8.7-9.6-8.7zm107.8.3c-6.8 0-10.9 5.2-10.9 11.7 0 6.5 4.1 11.7 10.9 11.7 6.8 0 11.2-4.9 11.2-11.7 0-6.5-4.4-11.7-11.2-11.7zm105.9 26.1c0 .3.3.5.3 1.1 0 .3-.3.5-.3 1.1-.3.3-.3.5-.5.8-.3.3-.5.5-1.1.5-.3.3-.5.3-1.1.3-.3 0-.5 0-1.1-.3-.3 0-.5-.3-.8-.5-.3-.3-.5-.5-.5-.8-.3-.5-.3-.8-.3-1.1 0-.5 0-.8.3-1.1 0-.5.3-.8.5-1.1.3-.3.5-.3.8-.5.5-.3.8-.3 1.1-.3.5 0 .8 0 1.1.3.5.3.8.3 1.1.5s.2.6.5 1.1zm-2.2 1.4c.5 0 .5-.3.8-.3.3-.3.3-.5.3-.8 0-.3 0-.5-.3-.8-.3 0-.5-.3-1.1-.3h-1.6v3.5h.8V426h.3l1.1 1.4h.8l-1.1-1.3zM576 81v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V81c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM64 220.6c0 76.5 62.1 138.5 138.5 138.5 27.2 0 53.9-8.2 76.5-23.1-72.9-59.3-72.4-171.2 0-230.5-22.6-15-49.3-23.1-76.5-23.1-76.4-.1-138.5 62-138.5 138.2zm224 108.8c70.5-55 70.2-162.2 0-217.5-70.2 55.3-70.5 162.6 0 217.5zm-142.3 76.3c0-8.7-5.7-14.4-14.7-14.7-4.6 0-9.5 1.4-12.8 6.5-2.4-4.1-6.5-6.5-12.2-6.5-3.8 0-7.6 1.4-10.6 5.4V392h-8.2v36.7h8.2c0-18.9-2.5-30.2 9-30.2 10.2 0 8.2 10.2 8.2 30.2h7.9c0-18.3-2.5-30.2 9-30.2 10.2 0 8.2 10 8.2 30.2h8.2v-23zm44.9-13.7h-7.9v4.4c-2.7-3.3-6.5-5.4-11.7-5.4-10.3 0-18.2 8.2-18.2 19.3 0 11.2 7.9 19.3 18.2 19.3 5.2 0 9-1.9 11.7-5.4v4.6h7.9V392zm40.5 25.6c0-15-22.9-8.2-22.9-15.2 0-5.7 11.9-4.8 18.5-1.1l3.3-6.5c-9.4-6.1-30.2-6-30.2 8.2 0 14.3 22.9 8.3 22.9 15 0 6.3-13.5 5.8-20.7.8l-3.5 6.3c11.2 7.6 32.6 6 32.6-7.5zm35.4 9.3l-2.2-6.8c-3.8 2.1-12.2 4.4-12.2-4.1v-16.6h13.1V392h-13.1v-11.2h-8.2V392h-7.6v7.3h7.6V416c0 17.6 17.3 14.4 22.6 10.9zm13.3-13.4h27.5c0-16.2-7.4-22.6-17.4-22.6-10.6 0-18.2 7.9-18.2 19.3 0 20.5 22.6 23.9 33.8 14.2l-3.8-6c-7.8 6.4-19.6 5.8-21.9-4.9zm59.1-21.5c-4.6-2-11.6-1.8-15.2 4.4V392h-8.2v36.7h8.2V408c0-11.6 9.5-10.1 12.8-8.4l2.4-7.6zm10.6 18.3c0-11.4 11.6-15.1 20.7-8.4l3.8-6.5c-11.6-9.1-32.7-4.1-32.7 15 0 19.8 22.4 23.8 32.7 15l-3.8-6.5c-9.2 6.5-20.7 2.6-20.7-8.6zm66.7-18.3H408v4.4c-8.3-11-29.9-4.8-29.9 13.9 0 19.2 22.4 24.7 29.9 13.9v4.6h8.2V392zm33.7 0c-2.4-1.2-11-2.9-15.2 4.4V392h-7.9v36.7h7.9V408c0-11 9-10.3 12.8-8.4l2.4-7.6zm40.3-14.9h-7.9v19.3c-8.2-10.9-29.9-5.1-29.9 13.9 0 19.4 22.5 24.6 29.9 13.9v4.6h7.9v-51.7zm7.6-75.1v4.6h.8V302h1.9v-.8h-4.6v.8h1.9zm6.6 123.8c0-.5 0-1.1-.3-1.6-.3-.3-.5-.8-.8-1.1-.3-.3-.8-.5-1.1-.8-.5 0-1.1-.3-1.6-.3-.3 0-.8.3-1.4.3-.5.3-.8.5-1.1.8-.5.3-.8.8-.8 1.1-.3.5-.3 1.1-.3 1.6 0 .3 0 .8.3 1.4 0 .3.3.8.8 1.1.3.3.5.5 1.1.8.5.3 1.1.3 1.4.3.5 0 1.1 0 1.6-.3.3-.3.8-.5 1.1-.8.3-.3.5-.8.8-1.1.3-.6.3-1.1.3-1.4zm3.2-124.7h-1.4l-1.6 3.5-1.6-3.5h-1.4v5.4h.8v-4.1l1.6 3.5h1.1l1.4-3.5v4.1h1.1v-5.4zm4.4-80.5c0-76.2-62.1-138.3-138.5-138.3-27.2 0-53.9 8.2-76.5 23.1 72.1 59.3 73.2 171.5 0 230.5 22.6 15 49.5 23.1 76.5 23.1 76.4.1 138.5-61.9 138.5-138.4z" fill="currentColor"></path> </symbol> <symbol id="icon-thumb" viewBox="0 0 29 29"> <path d="M17.751 1.555c1.473.301 2.43 1.769 2.136 3.278l-.131.662a14.045 14.045 0 0 1-1.631 4.364h8.156c1.501 0 2.719 1.247 2.719 2.785s-1.105 2.67-2.509 2.78c.436.493.697 1.149.697 1.863 0 1.357-.952 2.489-2.204 2.733.249.418.391.917.391 1.445 0 1.236-.787 2.286-1.875 2.646.04.191.063.395.063.603 0 1.538-1.218 2.786-2.719 2.786h-4.163a5.36 5.36 0 0 1-3.019-.934l-2.181-1.492c-1.512-1.033-2.418-2.774-2.418-4.636v-6.453c0-1.695.753-3.291 2.039-4.353l.419-.342a8.374 8.374 0 0 0 2.9-4.886l.13-.662c.294-1.508 1.728-2.489 3.2-2.187ZM1.812 10.787h3.625c1.003 0 1.813.83 1.813 1.857v12.999c0 1.027-.81 1.857-1.813 1.857H1.812C.81 27.5 0 26.67 0 25.643V12.644c0-1.027.81-1.857 1.812-1.857Z" fill="currentColor"></path> </symbol> <symbol id="icon-play" viewBox="0 0 384 512"> <path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z" fill="currentColor"></path> </symbol> </svg> <div class="content-wrapper"> <header class="mb-8 md:mb-10 lg:mb-20 pt-2 lg:pt-5"> <nav class="text-lg md:text-xl flex items-center gap-2 md:gap-4 justify-end mb-2 md:mb-4 lg:mb-8"> <!-- START ESI-fragment: "/toppmenyLogin.do?" --> <div data-load-on-event="userLoggedIn" data-src="/toppmenyLogin.do?" style="display: contents;" class="contents" > <a href="/medlem/minSide.do" class="hover:underline" data-selenium="minSide">Logg inn (Min side)</a> </div> <!-- SLUTT ESI-fragment: "/toppmenyLogin.do?" --> <a href="/handlekurv.do" class="hover:underline" data-basket-button="">Handlekurv <!-- START ESI-fragment: "/handlekurv.do?vis=antall" --> <div data-load-on-event="basketChanged" data-src="/handlekurv.do?vis=antall" style="display: contents;" class="contents" > (0) </div> <!-- SLUTT ESI-fragment: "/handlekurv.do?vis=antall" --> </a> </nav> <div class="flex flex-wrap lg:flex-nowrap items-center gap-4 lg:gap-8 [--height:50px]"> <a href="/side.do?rom=MP" class="w-2/3 md:w-1/3 lg:w-[370px]" aria-label="Tilbake til forsiden"> <img src="/static/images/bokkilden/logo.svg" width="372" height="47" alt=""> </a> <button onclick="document.querySelector('#sidebarMenu').showModal()" class="h-[var(--height)] w-[var(--height)] flex-col group ml-auto lg:ml-0 md:order-last justify-center items-center" aria-label="Vis meny"> <span class="flex justify-center text-3xl text-primary group-hover:text-svart leading-none"> <svg class="h-[1em] w-[1em]" aria-hidden="true" role="img"> <use xlink:href="#icon-bar"></use> </svg> </span> <span class="text-xs md:text-base leading-none text-center block">Meny</span> </button> <link rel="stylesheet" href="/static/css/autoComplete.css"/> <div id="sokefelt" class="relative w-full md:w-auto md:flex-1 md:ml-12 lg:flex-none lg:w-[550px] lg:ml-auto lg:mr-0 h-[var(--height)] "> <form action="enkeltSok.do" id="site-search" class="w-full h-full text-lg md:text-xl"> <input id="main-search" name="enkeltsok" data-selenium="enkeltsok" class="border-2 border-svart px-4 block w-full bg-transparent focus:!bg-papirhvit" style="padding-top: 0.56rem; padding-bottom: 0.56rem;" placeholder="Finn din neste bok her" aria-label="Søke etter produkter" autocomplete="off" aria-controls="autoComplete_list_1" aria-autocomplete="both" role="combobox" aria-owns="autoComplete_list_1" aria-haspopup="true" aria-expanded="false" autofocus="autofocus"> <ul id="autoComplete_list_1" role="listbox" hidden="" class="divide-y divide-svart border border-svart -mt-0.5 bg-papirhvit"></ul> <button class="absolute top-0 right-0 w-11 h-full text-2xl md:text-3xl hover:text-primary flex items-center justify-center" aria-label="Søk" type="submit" data-selenium="sok"> <svg class="h-[1em] w-[1em]" aria-hidden="true" role="img"> <use xlink:href="#icon-search"></use> </svg> </button> </form> </div> </div> </header> </div> <!-- START ESI-fragment: "/sidemeny.do" --> <div style="display: contents;" class="contents" > <dialog id="sidebarMenu" class="fixed left-0 top-0 w-full md:left-auto md:w-[400px] right-0 md:shadow bg-papirhvit bottom-0 z-50 overflow-y-auto pb-12 animate-slide-right backdrop:bg-black backdrop:bg-opacity-20 max-h-full max-w-full m-0 p-0 h-full"> <div data-content class="contents"> <nav class="grid grid-cols-1 divide-y divide-svart pt-2 border-b border-svart mb-4" aria-labelledby="#link-name"> <div class="p-4 flex items-center gap-1"> <h2 class="font-bold text-primary flex-1" id="link-name">Meny</h2> <form method="dialog" class="contents"> <button class="p-2 text-sm" aria-label="Skjul navigasjon" tabindex="-1"> <svg class="h-[1em] w-[1em]" aria-hidden="true" role="img"> <use xlink:href="#icon-close"></use> </svg> </button> </form> </div> <div> <button class="px-4 py-3 flex items-center gap-1 w-full" onclick="toogleSidebarGroup(this)" aria-expanded="false"> <div class="flex-1 text-left font-bold"> Bøker </div> <span class="icon flex p-2 text-lg"> <svg class="h-[1em] w-[1em]" aria-hidden="true" role="img"> <use xlink:href="#icon-arrow-down"></use> </svg> </span> </button> <div class="children-menu py-2 hidden"> <a href="/utvalg.do?term=utgittdato:[NOW-3MONTH%20TO%20NOW]%20AND%20produkttype:B%20AND%20(bokgruppe:4*+OR%20bokgruppe:3*)&overskrift=Nyheter&vis=ruter" class="px-4 py-2 block w-full"> Nyheter </a> </a> <a href="/gavehjelper.do" class="px-4 py-2 block w-full"> Gavehjelper </a> <a href="/utvalg.do?term=planlagt_utgivelsesdato:%5bNOW%20TO%20*%5d+regdato:%5bNOW-6MONTH%20TO%20NOW%5d-klasse_kode:Y*+innbinding:Innbundet+bokgruppe:4*+OR%20bokgruppe3*+bilde_kommer:0&overskrift=Bøker%20som%20kommer&vis=ruter" class="px-4 py-2 block w-full"> Bøker som kommer </a> <a href="/bestselgereBokhandel.do?navn=Skjønnlitteratur" class="px-4 py-2 block w-full"> Bestselgere Norge </a> <a href="/bestselgere.do?rom=Skjonnlitteratur" class="px-4 py-2 block w-full"> Bestselgere Bokkilden </a> <a href="/utvalg.do?term=(thema_kode:FF*+OR+thema_kode:FH*)+AND+spraak:Norsk*+AND+bilde_kommer:0&overskrift=Krim%20og%20spenning" class="px-4 py-2 block w-full"> Krim </a> <a href="/utvalg.do?term=thema_kode:F*%20AND%20-thema_kode:FF*&overskrift=Romaner" class="px-4 py-2 block w-full"> Romaner </a> <a href="/utvalg.do?term=spraak:Engelsk+AND+thema_kode:F*&overskrift=Engelsk%20skjønnlitteratur" class="px-4 py-2 block w-full"> Engelsk skjønnlitteratur </a> <a href="/emneSok.do?term=thema_kode:DC&overskrift=Lyrikk" class="px-4 py-2 block w-full"> Lyrikk </a> <a href="/emneSok.do?term=thema_kode:X&overskrift=Tegneserier" class="px-4 py-2 block w-full"> Tegneserier </a> <a href="/utvalg.do?term=thema_kode:Y*&overskrift=Barn%20og%20ungdom" class="px-4 py-2 block w-full"> Barn og ungdom </a> <a href="/side.do?dokId=713383" class="px-4 py-2 block w-full"> Debutanter </a> <a href="/emneSok.do?utvalg=faglitteratur" class="px-4 py-2 block w-full"> Faglitteratur </a> <a href="/utvalg.do?term=utgittdato:%5BNOW-3MONTH%20TO%20NOW%5D%20AND%20produkttype:B%20AND%20(bokgruppe:3*)&overskrift=Nyheter%20faktabøker" class="px-4 py-2 block w-full"> Fakta </a> <a href="/side.do?dokId=690196" class="px-4 py-2 block w-full"> #booktok </a> <a href="/utvalg.do?term=produkttype:X&overskrift=E-bøker" class="px-4 py-2 block w-full"> E-bøker</a> <a href="/utvalg.do?term=produkttype:Z%20OR%20produkttype:L&overskrift=Lydbøker" class="px-4 py-2 block w-full"> Lydbøker</a> </div> </div> <div> <button class="px-4 py-3 flex items-center gap-1 w-full" onclick="toogleSidebarGroup(this)" aria-expanded="false"> <div class="flex-1 text-left font-bold"> Gaver og interiør </div> <span class="icon flex p-2 text-lg"> <svg class="h-[1em] w-[1em]" aria-hidden="true" role="img"> <use xlink:href="#icon-arrow-down"></use> </svg> </span> </button> <div class="children-menu py-2 hidden"> <a href="/side.do?dokId=649350" class="px-4 py-2 block w-full"> Nyheter </a> <a href="/filter.do?filterId=1094187" class="px-4 py-2 block w-full"> Billigkroken </a> <a href="/emneSok.do?term=klasse_kode:25.4&overskrift=Interiør" class="px-4 py-2 block w-full"> Interiør </a> <a href="/emneSok.do?term=klasse_kode:25.4.5&overskrift=Kjøkken" class="px-4 py-2 block w-full"> Kjøkken </a> <a href="/emneSok.do?term=klasse_kode:25.1&overskrift=Fritid" class="px-4 py-2 block w-full"> Fritid </a> <a href="/emneSok.do?term=klasse_kode:25.2&overskrift=Klær%20og%20tilbehør" class="px-4 py-2 block w-full"> Klær & tilbehør </a> <a href="/emneSok.do?term=klasse_kode:25.3&overskrift=Velvære" class="px-4 py-2 block w-full"> Velvære </a> <a href="/emneSok.do?term=klasse_kode:25.5&overskrift=Barn" class="px-4 py-2 block w-full"> Barn </a> </div> </div> <div> <button class="px-4 py-3 flex items-center gap-1 w-full" aria-expanded="false"> <div class="flex-1 text-left font-bold"> <a href="/side.do?dokId=734314">JUL</a> </div> </button> </div> <div> <button class="px-4 py-3 flex items-center gap-1 w-full" onclick="toogleSidebarGroup(this)" aria-expanded="false"> <div class="flex-1 text-left font-bold"> <strong>Salg</strong> </div> <span class="icon flex p-2 text-lg"> <svg class="h-[1em] w-[1em]" aria-hidden="true" role="img"> <use xlink:href="#icon-arrow-down"></use> </svg> </span> </button> <div class="children-menu py-2 hidden"> <a href="/filter.do?filterId=1094187&antall=100&til=sorterFilter" class="px-4 py-2 block w-full"> Billigkroken </a> <a href="/filter.do?filterId=1096383&antall=100&til=sorterFilter" class="px-4 py-2 block w-full"> Lagersalg bøker </a> </div> </div> </nav> <script> (function () { function toogleSidebarGroup(el) { var parent = el.parentNode; parent.querySelector(".icon").classList.toggle("rotate-180"); const isExpanded = el.getAttribute("aria-expanded") === "true"; el.setAttribute("aria-expanded", isExpanded ? "false" : "true"); parent.querySelector(".children-menu").classList.toggle("hidden"); } window.toogleSidebarGroup = window.toogleSidebarGroup || toogleSidebarGroup; })(); </script> <div> <a href="/medlem/minSide.do" class="px-4 py-2 flex gap-1"> Min side </a> <a href="/kundeservice.do" class="px-4 py-2 flex gap-1"> Kundeservice </a> <a href="/side.do?dokId=665592" class="px-4 py-2 flex gap-1 font-bold"> Gavekort – en perfekt gave </a> <a href="/nyKunde.do" class="px-4 py-2 flex gap-1"> Registrer deg </a> </div> </div> </dialog> <script> const dialog = document.querySelector("#sidebarMenu"); dialogPolyfill.registerDialog(dialog); (function () { if (dialog) { dialog.addEventListener("click", () => dialog.close()); const dialogContent = dialog.querySelector("[data-content]"); dialogContent.addEventListener("click", (event) => event.stopPropagation() ); } })(); </script> </div> <!-- SLUTT ESI-fragment: "/sidemeny.do" --> <main class="content-wrapper" id="main"> <!-- Content area start --> <div class="flex justify-center my-4 lg:my-8"> <div class="grid grid-cols-1 gap-4 lg:w-8/12"> <h2 class="h3 thin mt-4"> Beklager. Ditt søk på "9789279054952" ga ingen treff. </h2> <div> <p>Alt du skrev inn i søket må oppfylles for å få treff. <br> Du får bare treff på det som er i salg. </p> </div> <div> <p>Du kan forsøke:</p> <ul class="list-disc list-inside"> <li>Å søke på begynnelsen av ordet</li> <li>Å søke på færre ord</li> <li>Sjekke at du har skrevet søkeordet riktig</li> </ul> </div> <p class="text-lg xl:text-xl"> Mente du kanskje: <a class="link" href="/enkeltSok.do?rom=MP&amp;enkeltsok=9780205214952">9780205214952</a>? <a class="link" href="/enkeltSok.do?rom=MP&amp;enkeltsok=9780763754952">9780763754952</a>? <a class="link" href="/enkeltSok.do?rom=MP&amp;enkeltsok=9781285075495">9781285075495</a>? </p> </div> </div> <!-- Content area end --> </main> <script> (function () { function isLoggedIn() { return (document.cookie.indexOf('CryptPwd') !== -1) || (document.cookie.indexOf('KundeNr') !== -1); } window.isLoggedIn = isLoggedIn; function showLoginDialog() { return new Promise((resolve, reject) => { document.body.addEventListener("userLoggedIn", (event) => { resolve(true); }); document.body.addEventListener("userNotLoggedIn", (event) => { // Bruker lukket loginPopup resolve(false); }); const loginDialog = document.querySelector("#loginPopupDialog"); loginDialog.showModal(); }); } window.showLoginDialog = showLoginDialog; function confirmUserLoggedInOrShowLoginPopup() { return new Promise((resolve, reject) => { if(!window.isLoggedIn()) { // Ikke innlogget, vis logindialog const loginPromise = showLoginDialog(); resolve(loginPromise); } else { // Allerede innlogget resolve(true); } }); } window.confirmUserLoggedInOrShowLoginPopup = confirmUserLoggedInOrShowLoginPopup; })(); </script> <script> (function () { function toggleHeart(element) { window.confirmUserLoggedInOrShowLoginPopup().then(async function(isLoggedIn) { if(isLoggedIn) { const produktId = element.dataset.favorite; const erFavoritt = element.dataset.favoriteChecked === "true"; element.dataset.favoriteChecked = !erFavoritt; const data = {}; data[erFavoritt ? "fjernProduktId" : "leggTilProduktId"] = produktId; const response = await fetch( '/api/kunde/favoritter.json', { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(data), } ); element.blur(); } }); } window.toggleHeart = window.toggleHeart || toggleHeart; function initFavorites() { // Hent favoritter og merk hjerter const hjerteknapper = document.querySelectorAll('button[data-favorite]'); if(window.isLoggedIn()) { const data = {}; const sjekkProduktIder = []; for(let i = 0; i < hjerteknapper.length; i++) { sjekkProduktIder.push(hjerteknapper[i].dataset.favorite); } data["sjekkProduktIder"] = sjekkProduktIder; if(sjekkProduktIder.length) { fetch( '/api/kunde/favoritter.json', { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(data), } ) .then(res => res.json()) .then(favoritter => { if(favoritter && favoritter.produktId) { favoritter.produktId.forEach((produktId) => { const element = document.querySelector(`[data-favorite="${produktId}"]`); if (element) { element.dataset.favoriteChecked = true; } }); } // Ferdig med å laste favoritter. Gjør hjertene klikkbare for(let i = 0; i < hjerteknapper.length; i++) { hjerteknapper[i].disabled = false; } }); } } else { // Ikke logget inn, gjør hjertene klikkbare for(let i = 0; i < hjerteknapper.length; i++) { hjerteknapper[i].disabled = false; } } } window.initFavorites = initFavorites; })(); </script> <script> function initLoadOnEvent(rootElement) { // Legger til en event-lytter for alle elementer med data-load-on-event // attributt (dette er en space-separert liste med eventnavn). Nytt innhold hentes // fra URL i attributtet data-src. let root = rootElement ? rootElement : document; const loadOnEventElements = root.querySelectorAll('[data-load-on-event]'); loadOnEventElements.forEach((element) => { const eventNames = element.dataset.loadOnEvent.split(' '); eventNames.forEach((eventName) => { eventName = eventName.trim(); let once = false; let parts = eventName.split(':'); // e.g. "basketChanged:once" if(parts.length > 1) { eventName = parts[0]; once = parts[1] === 'once'; } const options = {'once': once}; //console.log('Legger til eventlistener på ' + eventName + ' for el ' + element + ', options=' + options); document.addEventListener(eventName, async event => { const url = element.dataset.src; const response = await fetch(url); if(response.ok) { const html = await response.text(); element.innerHTML = html; } else { console.log(`Fikk status ${response.status} (${response.statusText}) ved lasting av ${url}. Trigget av event ${eventName} på element ${element}`) } }, options); }); }); } window.initLoadOnEvent = initLoadOnEvent; </script> <script> (function() { function getElementHeight(element) { let height = 0; console.log(element); if(element) { height = element.offsetHeight; if(height === 0) { // Element has no height. Sum height of children instead. if(element.children.length) { for(let i = 0; element.children; i < element.children.length) { height += element.children[i].offsetHeight; } } } } return height; } function insertHtmlAndRunScripts(element, html) { // Set current height as min-height for element before changing // with innerHTML to avoid "jumping" when content disappears and // reappears. const elHeight = getElementHeight(element); let oldMinHeight; if(elHeight > 0) { oldMinHeight = window.getComputedStyle(element, null).minHeight; element.style.minHeight = elHeight + 'px'; } element.innerHTML = html; if(oldMinHeight) { element.style.minHeight = oldMinHeight; } const scriptEls = element.querySelectorAll('script'); scriptEls.forEach( (el) => { eval(el.text); // Run script }); initLoadOnEvent(element); // Init data-load-on-event elements element.dispatchEvent(new Event("fragmentLoaded", {bubbles: true})); } window.insertHtmlAndRunScripts = insertHtmlAndRunScripts; })(); </script> <script> (function() { function initPage() { window.initLoadOnEvent(); window.initFavorites(); } window.initPage = initPage; window.initPage(); })(); </script> <script> (function () { function dropDownToggleBtn(btn) { const parent = btn.parentNode; let isExpanded = btn.getAttribute("aria-expanded") === "true"; const dropdown = parent.querySelector("[data-dropdown-content]"); const icon = btn.querySelector("[data-dropdown-icon]"); function outsideHandler(e) { if (isExpanded && e.target.closest("[data-dropdown-content]")) return; close(); document.removeEventListener("click", outsideHandler); } function close() { btn.setAttribute("aria-expanded", "false"); dropdown && dropdown.setAttribute("hidden", "true"); icon && icon.classList.remove("rotate-180"); isExpanded = false; } btn.close = close; function open() { btn.setAttribute("aria-expanded", "true"); dropdown && dropdown.removeAttribute("hidden"); icon && icon.classList.add("rotate-180"); isExpanded = true; document.addEventListener("click", outsideHandler); } if (isExpanded) { open(); } btn.addEventListener("click", (e) => { if (isExpanded) { e.stopPropagation(); } btn.blur(); setTimeout(() => { isExpanded ? close() : open(); }, 0); }); } document .querySelectorAll("[data-dropdown]") .forEach((item) => dropDownToggleBtn(item)); })(); </script> <template id="alert-error-template"> <div class="border-svart border-2 p-3 bg-stone-100 relative mb-4" role="alert" data-base-classes="relative"> <span class="block sm:inline alert-message"></span> </div> </template> <template id="alert-info-template"> <div class="border-svart border-2 p-3 bg-stone-100 relative mb-4" role="alert" data-base-classes="relative"> <span class="block sm:inline alert-message"></span> </div> </template> <script> (function () { function findScopesByType(baseElement, cssClass) { baseElement = baseElement ? baseElement : document; let scopes = []; const msgSlots = baseElement.querySelectorAll('.sambo_melding_' + cssClass); msgSlots.forEach((slot) => { let parts = slot.id.split(' '); for(let i = 0; i < parts.length; i++) { scopes.push(parts[i]); } }); return scopes; } function findScopes(baseElement) { let scopes = []; scopes = scopes.concat(findScopesByType(baseElement, 'fatal')); scopes = scopes.concat(findScopesByType(baseElement, 'feil')); scopes = scopes.concat(findScopesByType(baseElement, 'info')); return scopes; } function findPopupScopes(baseElement) { baseElement = baseElement ? baseElement : document; let popupScopes = []; let slots = baseElement.querySelectorAll('#popupShow'); slots.forEach((slot) => { if(slot.datasets.scopes) { popupScopes.push(slot.dataset.scopes); } else { popupScopes.push('popup'); } }); return popupScopes; } function placeMessages(baseElement, messagesResponse) { let messages = messagesResponse.meldinger; let suppressed = messagesResponse.suppressed; let messagePlaced = false; for(let i = 0; i < messages.length; i++) { placeMessage(baseElement, messages[i]); messagePlaced = true; } if(messagePlaced && baseElement) { baseElement.scrollIntoView(); } if(suppressed && suppressed.length > 0) { alert('POPUP MSG: ' + suppressed) } } function placeMessage(baseElement, message) { baseElement = baseElement ? baseElement : document; // Må erstatte '.' i id'er med '\\.' for å kunne slå opp med JS const placeId = message.scope.replaceAll('.', '\\.'); const place = baseElement.querySelector('#' + placeId); let templateId; if(message.type === 'feil') { templateId = 'alert-error-template'; } else { templateId = 'alert-info-template'; } const alertTemplateEl = document.querySelector('#' + templateId); const alertFragment = alertTemplateEl.content.cloneNode(true); alertFragment.querySelector('.alert-message').innerHTML = message.value; // Kopier style fra element skrevet ut av custom tag (satt med style_class attributt) let classNames = place.children[0].getAttribute('class'); if(classNames && classNames.trim()) { // Overkjør helt style fra templat, inkluder klasser fra data-base-classes classNames += ' ' + alertFragment.firstElementChild.dataset.baseClasses; alertFragment.firstElementChild.setAttribute('class', classNames); } const alertEl = alertFragment.querySelector('div[role=alert]'); alertEl.setAttribute('data-alert-type', message.type); alertEl.setAttribute('data-alert-varighet', message.varighet); alertEl.setAttribute('data-alert-key', message.key); place.parentNode.insertBefore(alertFragment, place.nextElementSibling); } async function getAndPlaceMessages(baseElement, scopes, popupScopes) { if(scopes.length === 0 && popupScopes.length === 0) { return; } const url = '/meldinger/alle?' + new URLSearchParams({ scopes: scopes, suppress: popupScopes }); fetch(url) .then(res => res.json()) .then(messages => { placeMessages(baseElement, messages); }); } function removePreviousUserMessages(baseElement) { // Fjern tidligere viste alerts som bare skal vises en gang baseElement = baseElement ? baseElement : document; const previousMessages = baseElement.querySelectorAll('.mx-auto div[role=alert][data-alert-varighet=SINGLE]'); previousMessages.forEach(e => e.remove()); } function showUserMessages(baseElement) { const scopes = findScopes(baseElement); const popupScopes = findPopupScopes(baseElement); removePreviousUserMessages(baseElement); getAndPlaceMessages(baseElement, scopes, popupScopes); } window.showUserMessages = showUserMessages; showUserMessages(); })(); </script> <dialog id="loginPopupDialog" class="fixed top-1/2 -translate-y-1/2 left-1/2 -translate-x-1/2 origin-center p-4 py-6 md:p-6 md:py-8 w-[400px] bg-papirhvit max-w-[90vw] z-50 m-0 backdrop:bg-black backdrop:bg-opacity-10 shadow-lg"> <div class="contents"> <form method="dialog"> <button class="p-3 absolute right-1 top-1 text-base" tabindex="-1"> <svg class="h-[1em] w-[1em]" aria-hidden="true" role="img"> <use xlink:href="#icon-close"></use> </svg> </button> </form> <div data-content=""> <h1 class="h2">Logg inn</h1> <div id='FEIL.loggInn' class='sambo_melding_feil' style='display:none'><div class='' style='display:none'></div></div> <div id='INFO.loggInn' class='sambo_melding_info' style='display:none'><div class='' style='display:none'></div></div> <form action="/loginPopup.do" class="grid grid-cols-1 gap-4 md:gap-6 loginForm"> <div> <label for="dialogfield-username" class="field-label text-xl">E-postadresse</label> <input type="email" name="login" id="dialogfield-username" class="form-field form-field-l" placeholder="E-postadresse" title="Din e-postadresse" oninvalid="this.setCustomValidity('Ikke en gyldig e-postadresse')" onchange="this.setCustomValidity('')" value="" required> </div> <div> <label for="dialogfield-password" class="field-label text-xl">Passord</label> <input name="passord" id="dialogfield-password" type="password" class="form-field form-field-l" title="Ditt passord" placeholder="Passord" oninvalid="this.setCustomValidity('Passord er påkrevet')" onchange="this.setCustomValidity('')" required> </div> <div class="flex items-center gap-4"> <input type="checkbox" class="form-check form-check-l mr-1" name="permanent" id="dialoghusk-meg" checked> <label for="dialoghusk-meg" class="text-xl">Husk meg</label> </div> <input type="hidden" name="loginType" value="loginPopupDialog"/> <div> <button class="btn btn-solid px-10"> <div role="status" class="loginSpinner hidden"> <svg aria-hidden="true" class="inline w-8 h-8 mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-gray-600 dark:fill-gray-300" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"/> <path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"/> </svg> <span class="sr-only">Logger inn</span> </div> Logg inn </button> </div> </form> <p class="text-xl mt-8">Ikke medlem ennå? <a class="link" href="/blimedlem.do?saId=MB">Registrer deg her</a></p> <p class="text-xl">Glemt <a class="link" href="/medlem/loggInn.do?forgot-form&vis=ja#glemt">medlemsnummer/passord?</a></p> </div> </div> </dialog> <script> (function () { function initLoginDialog() { var loginDialog = document.querySelector("#loginPopupDialog"); dialogPolyfill.registerDialog(loginDialog); window.showUserMessages(loginDialog); var closedByUser = true; loginDialog.addEventListener("close", (event) => { if (closedByUser) { // Bruker lukket loginPopup loginDialog.dispatchEvent(new Event("userNotLoggedIn", {bubbles: true})); } }); const loginForm = loginDialog.querySelector(".loginForm"); const loginSpinner = loginDialog.querySelector(".loginSpinner"); loginForm.addEventListener("submit", async (event) => { event.preventDefault(); loginSpinner.classList.toggle('hidden'); const data = new URLSearchParams(new FormData(loginForm)); const response = await fetch('/loginPopup.do', { method: "POST", body: data }); loginSpinner.classList.toggle('hidden'); if (response.status !== 401) { // Vellykket login loginDialog.dispatchEvent(new Event("userLoggedIn", {bubbles: true})); window.initFavorites(); closedByUser = false; loginDialog.close(); } else { const html = await response.text(); loginDialog.outerHTML = html; initLoginDialog(); } }); } initLoginDialog(); })(); </script> <dialog id="addBasketDialog" class="m-auto p-4 py-6 md:p-6 md:py-8 w-[600px] bg-papirhvit max-w-[90vw] z-50 backdrop:bg-black backdrop:bg-opacity-10 shadow-lg"> <div class="contents"> <form method="dialog"> <button class="p-3 absolute right-1 top-1 text-base" tabindex="-1"> <svg class="h-[1em] w-[1em]" aria-hidden="true" role="img"> <use xlink:href="#icon-close"></use> </svg> </button> </form> <h1 class="h2">Handlekurv</h1> <div class="mx-auto"> <div id='FEIL.handlekurv' class='sambo_melding_feil' style='display:none'><div class='' style='display:none'></div></div> <div id='INFO.handlekurv' class='sambo_melding_info' style='display:none'><div class='' style='display:none'></div></div> <div id='INFO.mersalg' class='sambo_melding_info' style='display:none'><div class='' style='display:none'></div></div> <div id='INFO.ordregavekort' class='sambo_melding_info' style='display:none'><div class='' style='display:none'></div></div> </div> <hr class="h-0.5 bg-svart border-0 my-6 md:my-12"> <div class="grid grid-cols-1 gap-12 md:gap-20 chop-offset-6 md:chop-offset-10 chop-y-2 chop-svart mb-8 md:mb-16" data-content=""> </div> </div> </dialog> <script> (function () { const dialog = document.querySelector("#addBasketDialog"); if (dialog) { // La klikk utenfor dialog lukke den dialog.addEventListener("click", () => dialog.close()); const dialogContent = dialog.querySelector(".contents"); dialogContent.addEventListener("click", (event) => event.stopPropagation() ); } async function loadBasket(element, templat) { const response = await fetch(`/handlekurv.do?vis=${templat}`); const html = await response.text(); insertHtmlAndRunScripts(element, html); window.showUserMessages(dialog); } async function addtoBasket(produktId, el, prisType) { const basket = document.querySelector("#handlekurvinnhold"); var targetElement; var templat; var url; if (!basket) { // vis minihandlekurv-popup el.blur(); window.scrollTo(0, 0); dialog.showModal(); targetElement = dialog.querySelector("[data-content]"); templat = "dropdown"; } else { targetElement = basket; templat = "storInnhold"; } if (prisType!=null) { url = `/handlekurv.do?kjop=${produktId}&prisType=${prisType}`; } else { url = `/handlekurv.do?kjop=${produktId}`; } const response = await fetch(url); await loadBasket(targetElement, templat); targetElement.dispatchEvent(new Event("basketChanged", {bubbles: true})); } window.addtoBasket = window.addtoBasket || addtoBasket; })(); </script> <script> (function () { const dialog = document.querySelector("#addBasketDialog"); dialogPolyfill.registerDialog(dialog); async function changeBasketCount(itemId, fromCount, toCount) { let templat = "dropdown"; if (document.querySelector("#handlekurvinnhold")) { templat = "storInnhold"; } const response = await fetch(`/handlekurv.do?oppdater=${itemId}&antall=${toCount}&vis=${templat}`); const html = await response.text(); if (dialog && dialog.open) { // minihandlekurv er åpen insertHtmlAndRunScripts(dialog.querySelector("[data-content]"), html); window.showUserMessages(dialog); } else { const basket = document.querySelector("#handlekurvinnhold"); if (basket) { // viser handlekurven i kasse insertHtmlAndRunScripts(basket, html); const msgEl = document.getElementById('handlekurv-kasse-messages'); window.showUserMessages(msgEl); } } dialog.dispatchEvent(new Event("basketChanged", {bubbles: true})); } window.changeBasketCount = changeBasketCount; })(); </script> <script> (function() { let euid = "null"; const match = document.cookie.match( /(; )?KundeNr=([^;]*);?/ ); if(match) { euid = match[2]; } const script = document.createElement("script"); script.async = true; script.src = "https://recommender.sannsyn.com/jsrecapi/1.0/crec?service=bokklubben&euid=" + euid; document.head.appendChild(script); })(); </script> <script> (function() { function removeNonDigitsOnPaste(e) { if(e && e.clipboardData && e.clipboardData.getData) { e.preventDefault(); let pastedText = e.clipboardData.getData('text/plain'); e.target.value = pastedText.replace(/\D/g, ''); } } window.removeNonDigitsOnPaste = removeNonDigitsOnPaste; })(); </script> <footer class="sticky top-[100vh] py-8 md:py-20"> <div class="content-wrapper"> <hr class="h-0.5 bg-svart border-0"> <div class="grid grid-cols-2 md:grid-cols-4 gap-4 md:gap-8 my-6 md:my-12 text-lg"> <p> <strong class="block">Bokkilden</strong> <a href="/side.do?rom=MP" class="block underline hover:no-underline">Bøker</a> <a href="/side.do?dokId=649350" class="block underline hover:no-underline"> Gaver og interiør</a> <a href="/bestselgere.do?rom=skjonnlitteratur" class="block underline hover:no-underline"> Bestselgere</a> <a href="/side.do?dokId=665592" class="block underline hover:no-underline">GAVEKORT</a> </p><p> <strong class="block">Om oss</strong> <a href="/side.do?dokId=714336" class="block underline hover:no-underline"> Om Bokkilden </a><a href="/kundeservice.do" class="block underline hover:no-underline"> Kundeservice </a><a href="/side.do?dokId=714307" class="block underline hover:no-underline"> Personvern </a> </a> </p> <p> <strong class="block">Kontakt oss</strong> <a href="/kundeservice.do" class="block underline hover:no-underline">Kundeservice</a> </p> </div> <div class="flex flex-wrap gap-2 items-center justify-center md:justify-between"> <p class="text-sm md:text-base"> © Bokkilden | Org. nr.: 911 167 905 </p> </div> </div> </footer> <div id="popupDialogContainer"> </div> <script> (function () { async function lastKampanjePopup() { const response = await fetch("/kundeKampanje.do?plassering=popUp&kampDokId=&kampPlassering="); const html = await response.text(); window.insertHtmlAndRunScripts(document.getElementById("popupDialogContainer"), html); document.cookie = 'kampanjePopupVist=1'; } if(document.cookie.indexOf('kampanjePopupVist') < 0) { lastKampanjePopup(); } })(); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10