Help
RSS
API
Feed
Maltego
Contact
Domain > vadhander.kramfors.se
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2024-10-30
52.30.219.147
(
ClassC
)
2026-02-28
31.208.37.146
(
ClassC
)
Port 443
HTTP/1.1 200 OKTransfer-Encoding: chunkedContent-Type: text/html; charsetutf-8Server: Microsoft-IIS/10.0Strict-Transport-Security: max-age2592000X-TenantId: 11Content-Security-Policy: default-src self; base-uri self; object-src none; form-action self; frame-ancestors self; frame-src https://lookerstudio.google.com https://www.google.com; child-src https://lookerstudio.google.com https://www.google.com; script-src self unsafe-inline unsafe-eval https://cdn.jsdelivr.net https://unpkg.com https://lookerstudio.google.com https://www.google.com https://www.googletagmanager.com; script-src-elem self unsafe-inline https://cdn.jsdelivr.net https://unpkg.com https://lookerstudio.google.com https://www.google.com https://www.googletagmanager.com; style-src self unsafe-inline https://cdn.jsdelivr.net https://unpkg.com https://fonts.googleapis.com; style-src-elem self unsafe-inline https://cdn.jsdelivr.net https://unpkg.com https://fonts.googleapis.com; img-src self data: https://*.tile.openstreetmap.org https://unpkg.com; connect-src self https://nominatim.openstreetmap.org https://cdn.jsdelivr.net https://unpkg.com https://www.googletagmanager.com https://www.google-analytics.com https://*.google-analytics.com wss:; font-src self data: https://fonts.gstatic.com; upgrade-insecure-requestsSet-Cookie: .AspNetCore.Mvc.CookieTempDataProvider; expiresThu, 01 Jan 1970 00:00:00 GMT; path/; samesitelax; httponlyX-Powered-By: ASP.NETDate: Sat, 28 Feb 2026 23:39:46 GMT !doctype html>html langsv classh-full bg-neutral-50>head> meta charsetutf-8 /> meta nameviewport contentwidthdevice-width, initial-scale1 /> title>Kramfors/title> link relicon href/favicon.ico> link relicon typeimage/png sizes16x16 href/favicon-16.png> link relicon typeimage/png sizes32x32 href/favicon-32.png> link relapple-touch-icon sizes180x180 href/favicon-180.png> link relicon typeimage/png sizes192x192 href/favicon-192.png> meta nametheme-color content#111111> link relstylesheet href/css/tailwind.css?vco8WbUOdyq8mk9kmyU6xpGEfYX1AzS0yYbiHNwLlnIA /> link relpreconnect hrefhttps://fonts.googleapis.com /> link relpreconnect hrefhttps://fonts.gstatic.com crossorigin /> link hrefhttps://fonts.googleapis.com/css2?familyInter:wght@400;500;600;700;800&displayswap relstylesheet /> style> :root { --curated-nav-inset: 20px; --calbar-h: 0px; --z-share-pop: 11000; } #mobileMenu { z-index: 9999; } #curatedWrap .curated-nav.left { left: var(--curated-nav-inset); } #curatedWrap .curated-nav.right { right: var(--curated-nav-inset); } @media (min-width: 1280px) { :root { --curated-nav-inset: 28px; } } #topSticky { position: sticky; top: var(--calbar-h); z-index: 99999; background: rgba(255,255,255,.9); backdrop-filter: blur(8px); } .share-item { cursor: pointer; } html, body { font-family: Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji; } /* SR-only helper + focus-visible ring */ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0 } .focus-ring:focus-visible { outline: 2px solid #111; outline-offset: 2px; box-shadow: none; } :root { --z-share-pop: 11000; } /* SHARE MENU */ .share-pop { position: fixed; z-index: var(--z-share-pop); background: #fff; border: 1px solid rgb(229 231 235); box-shadow: 0 10px 25px rgba(0,0,0,.08); border-radius: .75rem; padding: .5rem; width: 260px } .share-item { display: flex; align-items: center; gap: .6rem; padding: .55rem .7rem; border-radius: .55rem; font-size: .9rem; line-height: 1.25rem; color: #111; text-decoration: none } .share-item:hover { background: rgb(249 250 251) } .share-item .ico { width: 18px; height: 18px; display: inline-block } .share-divider { height: 1px; background: rgb(229 231 235); margin: .25rem 0 } .share-btn { position: absolute; right: .5rem; top: .5rem; background: rgba(255,255,255,.9); border: 1px solid #6b7280; border-radius: .5rem; padding: .4rem; display: flex; align-items: center; justify-content: center; z-index: 20; } .share-btn:hover { background: #fff; } .share-icon { width: 20px; height: 20px; cursor: pointer; } /* Brand färger (bara ikonerna) */ .share-item .ico { color: currentColor } .share-item span { color: #111 } .share-itemdata-brandwhatsapp .ico { color: #25D366 } .share-itemdata-brandfacebook .ico { color: #1877F2 } .share-itemdata-brandx .ico { color: #000 } .share-itemdata-brandlinkedin .ico { color: #0A66C2 } .share-itemdata-brandtelegram .ico { color: #26A5E4 } .share-itemdata-brandmail .ico { color: #F2C94C } .share-itemdata-brandsms .ico { color: #22C55E } .share-itemdata-brandcopy .ico { color: #6B7280; } .share-itemdata-brandnative .ico { color: #111 } /* KARUSELL (curated) */ #curatedWrap { position: relative; } #curatedTrack { position: relative; z-index: 0; } .curated-scroll { display: flex; gap: 16px; overflow-x: auto; scroll-snap-type: x mandatory; scroll-padding: 0 12px; padding: 2px 12px; -webkit-overflow-scrolling: touch; -ms-overflow-style: none; scrollbar-width: none; cursor: grab; } .curated-scroll::-webkit-scrollbar { display: none; } .curated-scroll.dragging { cursor: grabbing; user-select: none; -webkit-user-select: none; -ms-user-select: none; } .curated-card { position: relative; flex: 0 0 100%; scroll-snap-align: start; scroll-snap-stop: always; border-radius: 18px; overflow: hidden; background: #fff; box-shadow: 0 8px 28px rgba(0,0,0,.10); aspect-ratio: 16/9; min-height: 260px; z-index: 0; isolation: isolate; } .curated-card .img { position: absolute; inset: 0; background-size: cover; background-position: center; pointer-events: none; } .curated-card::after { content: ; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,.0) 35%, rgba(0,0,0,.65) 100%); } .curated-card .body { position: relative; z-index: 1; color: #fff; padding: 18px; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; } .curated-badge { position: absolute; left: 12px; top: 12px; display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: 9999px; background: #ef4444; color: #fff; font-weight: 700; font-size: 12px; line-height: 1.1; box-shadow: 0 2px 6px rgba(0,0,0,.25); z-index: 2; } /* --- Klickbara pilar: bas (absolut) --- */ .curated-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 36px; height: 36px; border-radius: 999px; border: 1px solid #6b7280; background: #fff; color: #111; box-shadow: 0 2px 10px rgba(0,0,0,.08); z-index: 9999; pointer-events: auto; touch-action: manipulation; font-size: 0; padding: 0; display: none; place-items: center; } .curated-nav svg { width: 18px; height: 18px; } /* Visa pilar enbart på desktop och bara när det går att scrolla */ #curatedWrap .curated-nav { display: none; } @media (min-width:768px) { #curatedWrap.has-scroll .curated-nav { display: grid; } } /* Hint-chevrons (passiva) – visas endast på mobil vid behov */ #curatedWrap .hint-chevron { display: none; position: absolute; top: 50%; transform: translateY(-50%); width: 24px; height: 24px; pointer-events: none; opacity: .55; z-index: 6; } #curatedWrap .hint-chevron.left { left: 6px; } #curatedWrap .hint-chevron.right { right: 6px; } @media (max-width:767px) { #curatedWrap.has-scroll .hint-chevron { display: block; } #curatedWrapdata-at-starttrue .hint-chevron.left { display: none; } #curatedWrapdata-at-endtrue .hint-chevron.right { display: none; } /* Fade-kanter (mobil) */ #curatedWrap.has-scroll::before, #curatedWrap.has-scroll::after { content: ; position: absolute; top: 0; bottom: 0; width: 40px; pointer-events: none; z-index: 5; } #curatedWrap.has-scroll:not(data-at-starttrue)::before { left: 0; background: linear-gradient(to right, #fff, transparent); } #curatedWrap.has-scroll:not(data-at-endtrue)::after { right: 0; background: linear-gradient(to left, #fff, transparent); } /* Dölj klickbara pilar på mobil helt */ #curatedWrap .curated-nav { display: none !important; } } /* Prickrad (mobil) */ @media (max-width:767px) { #curatedDots { display: flex; justify-content: center; gap: 6px; margin-top: 8px; } #curatedDots .dot { width: 6px; height: 6px; border-radius: 9999px; background: #d1d5db; opacity: .8; } #curatedDots .dotaria-currenttrue { width: 20px; border-radius: 9999px; background: #111; opacity: 1; } } #curatedDots { position: absolute; left: 0; right: 0; bottom: 8px; display: flex; justify-content: center; gap: 8px; z-index: 5; /* över bilden */ pointer-events: none; /* så man kan dra/scrolla ändå */ } #curatedDots .dot { width: 6px; height: 6px; border-radius: 9999px; background: #d1d5db; opacity: .8; pointer-events: auto; /* klickbara */ } #curatedDots .dotaria-currenttrue { width: 22px; border-radius: 9999px; background: #111; opacity: 1; } /* Inaktiverade pilar */ #curatedWrap .curated-navaria-disabledtrue, #curatedWrap .curated-nav:disabled { opacity: 0.0; pointer-events: none; filter: grayscale(100%); } /* Gör gradienten starkare längre upp så texten kan ligga högre */ #curatedWrap .curated-card::after { background: linear-gradient(180deg, rgba(0,0,0,.0) 22%, rgba(0,0,0,.68) 82%); } /* Lägg mer “luft” i botten så blocket hamnar högre */ #curatedWrap .curated-card .body { padding: 18px; padding-bottom: 45px; /* var 18px – flyttar texten upp visuellt */ gap: 6px; } /* Liten tätare typografi hjälper också lite */ #curatedWrap .curated-card .body .curated-title { margin-bottom: 2px; line-height: 1.15; } #curatedDots .dotaria-currenttrue { width: 20px; /* “pillen” */ border-radius: 9999px; background: #111; /* svart kärna */ box-shadow: 0 0 0 2px #555, /* tunn vit ring */ 0 0 0 4px rgba(0,0,0,.12), /* mjuk outer-skugga för alla bakgrunder */ 0 2px 6px rgba(0,0,0,.25); /* lite djup */ } html { scroll-behavior: smooth; } /* Stjärn-effekt runt tack-meddelandet */ .celebrate-star { display: inline-block; font-size: 1.3rem; line-height: 1; animation: star-pop 1s ease-out forwards; transform-origin: center; filter: drop-shadow(0 0 4px rgba(234,179,8,0.7)); } .celebrate-star-right { animation-delay: 0.15s; /* lite förskjuten för höger stjärna */ } @keyframes star-pop { 0% { transform: scale(0) rotate(-20deg); opacity: 0; } 30% { transform: scale(1.5) rotate(8deg); opacity: 1; } /* Blink 1 */ 45% { opacity: 0; } 55% { opacity: 1; } /* Blink 2 */ 70% { opacity: 0; } 80% { opacity: 1; } 100% { transform: scale(1) rotate(0deg); opacity: 1; } } /style>/head>body classmin-h-full text-neutral-900> !-- Skip-länk --> a href#main classsr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:bg-white focus:text-black focus:px-3 focus:py-2 focus:rounded>Hoppa till innehåll/a> nav idcalbar classhidden md:block sticky top-0 z-60 border-b bg-white/90 backdrop-blur isolate aria-labelKalenderlänkar> div classmx-auto w-full max-w-7xl px-4> ul classflex flex-wrap gap-x-3 gap-y-1 overflow-visible whitespace-normal py-1.5 text-13px leading-6 text-neutral-600> li classshrink-0> a classinline-flex items-center gap-1 rounded-full px-2 py-0.5 transition hover:text-neutral-900 hover:underline focus-ring hrefhttps://vadhander.hogakusten.com/ target_blank relnoopener noreferrer titleEvenemang i Höga Kusten> span aria-hiddentrue>📌/span> span classfont-medium>Evenemang i Höga Kusten/span> span classsr-only>(öppnas i ny flik)/span> /a> /li> li classshrink-0> a classinline-flex items-center gap-1 rounded-full px-2 py-0.5 transition hover:text-neutral-900 hover:underline focus-ring hrefhttps://dethander.harnosand.se/ target_blank relnoopener noreferrer titleEvenemang i Härnösand> span aria-hiddentrue>📌/span> span classfont-medium>Evenemang i Härnösand/span> span classsr-only>(öppnas i ny flik)/span> /a> /li> li classshrink-0> a classinline-flex items-center gap-1 rounded-full px-2 py-0.5 transition hover:text-neutral-900 hover:underline focus-ring hrefhttps://pagang.7an.se/ target_blank relnoopener noreferrer titleEvenemang i Örnsköldsvik> span aria-hiddentrue>📌/span> span classfont-medium>Evenemang i Örnsköldsvik/span> span classsr-only>(öppnas i ny flik)/span> /a> /li> li classshrink-0> a classinline-flex items-center gap-1 rounded-full px-2 py-0.5 transition hover:text-neutral-900 hover:underline focus-ring hrefhttps://vadhander.solleftea.se/ target_blank relnoopener noreferrer titleEvenemang i Sollefteå> span aria-hiddentrue>📌/span> span classfont-medium>Evenemang i Sollefteå/span> span classsr-only>(öppnas i ny flik)/span> /a> /li> /ul> /div> /nav> div idtopSticky classbg-white/90 backdrop-blur border-b> header classrelative z-50 bg-white/90 backdrop-blur rolebanner> div classmx-auto flex w-full max-w-7xl items-center justify-between gap-2 sm:gap-4 px-4 py-3> div classflex items-center gap-3 flex-shrink min-w-0> a href#pageTop idlogoLink classblock focus-ring min-w-0 aria-labelScrolla till toppen> img classh-8 sm:h-10 w-auto max-w-120px sm:max-w-180px md:max-w-none srcimages/kramfors_logo.png altKramfors> /a> /div> div classrelative flex items-center gap-2 flex-shrink-0> a classinline-flex items-center gap-1.5 sm:gap-2 rounded-lg bg-red-700 px-2.5 sm:px-3 py-1.5 sm:py-2 text-xs sm:text-sm font-semibold text-white shadow hover:bg-red-700 focus-ring whitespace-nowrap href/ny> Lägg in event svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2> path dM12 5v14M5 12h14 /> /svg> /a> button idmenuBtn typebutton classmd:hidden inline-flex items-center justify-center rounded-lg border bg-white/90 px-3 py-2 text-sm font-semibold text-neutral-900 shadow-sm hover:bg-white focus-ring aria-haspopupmenu aria-expandedfalse aria-controlsmobileMenu> svg classh-5 w-5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2 aria-hiddentrue> path stroke-linecapround dM4 6h16M4 12h16M4 18h16 /> /svg> span classsr-only>Öppna meny/span> /button> div idmobileMenu classmd:hidden hidden fixed right-4 top-16 w-72 max-w-calc(100vw-1rem) rounded-xl border bg-white shadow-lg p-2 z-999999 rolemenu aria-labelKalenderlänkar> div classpx-2 pb-2 text-xs font-semibold text-neutral-500>Kalendrar/div> div classgrid gap-1> a rolemenuitem classinline-flex items-center gap-2 rounded-lg px-2 py-2 text-sm hover:bg-neutral-50 focus-ring hrefhttps://vadhander.hogakusten.com/ target_blank relnoopener noreferrer titleEvenemang i Höga Kusten> span aria-hiddentrue>📌/span> span classfont-medium>Evenemang i Höga Kusten/span> span classsr-only>(öppnas i ny flik)/span> /a> a rolemenuitem classinline-flex items-center gap-2 rounded-lg px-2 py-2 text-sm hover:bg-neutral-50 focus-ring hrefhttps://dethander.harnosand.se/ target_blank relnoopener noreferrer titleEvenemang i Härnösand> span aria-hiddentrue>📌/span> span classfont-medium>Evenemang i Härnösand/span> span classsr-only>(öppnas i ny flik)/span> /a> a rolemenuitem classinline-flex items-center gap-2 rounded-lg px-2 py-2 text-sm hover:bg-neutral-50 focus-ring hrefhttps://pagang.7an.se/ target_blank relnoopener noreferrer titleEvenemang i Örnsköldsvik> span aria-hiddentrue>📌/span> span classfont-medium>Evenemang i Örnsköldsvik/span> span classsr-only>(öppnas i ny flik)/span> /a> a rolemenuitem classinline-flex items-center gap-2 rounded-lg px-2 py-2 text-sm hover:bg-neutral-50 focus-ring hrefhttps://vadhander.solleftea.se/ target_blank relnoopener noreferrer titleEvenemang i Sollefteå> span aria-hiddentrue>📌/span> span classfont-medium>Evenemang i Sollefteå/span> span classsr-only>(öppnas i ny flik)/span> /a> /div> /div> /div> /div> div idpageTop>/div> /header> section classrelative z-10 mx-auto w-full max-w-7xl px-4 pb-3 aria-labelFilter> div classrounded-2xl border bg-white p-3 sm:px-3 sm:py-2> div classflex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between> div classgrid grid-cols-3 gap-2 sm:flex sm:flex-wrap sm:items-center> a data-ga-eventscope_click data-ga-scopeAlla data-ga-category data-ga-page-sectionfilters classinline-flex items-center justify-center text-sm font-semibold rounded-full px-4 py-2 h-11 sm:px-3 sm:py-1.5 sm:h-auto bg-red-700 text-white shadow w-full sm:w-auto text-center href?scopealla&cat aria-currentpage>Alla/a> a data-ga-eventscope_click data-ga-scopeIdag data-ga-category data-ga-page-sectionfilters classinline-flex items-center justify-center text-sm font-semibold rounded-full px-4 py-2 h-11 sm:px-3 sm:py-1.5 sm:h-auto bg-neutral-100 text-neutral-800 hover:bg-neutral-200 w-full sm:w-auto text-center href?scopeidag&cat>Idag/a> a data-ga-eventscope_click data-ga-scopeI helgen data-ga-category data-ga-page-sectionfilters classinline-flex items-center justify-center text-sm font-semibold rounded-full px-4 py-2 h-11 sm:px-3 sm:py-1.5 sm:h-auto bg-neutral-100 text-neutral-800 hover:bg-neutral-200 w-full sm:w-auto text-center href?scopehelgen&cat>I helgen/a> /div> form methodget classflex items-center gap-2 sm:justify-end> input typehidden namescope valuealla /> label forcat classsr-only>Kategori/label> select idcat namecat classw-full sm:w-56 rounded-xl border px-3 py-2 text-sm focus-ring onchangeif (window.gaTrack) window.gaTrack(select_category, { category_name: this.value }); this.form.submit()> option value selectedselected>Välj kategori/option> option valueBarn & Familj>Barn & Familj/option> option valueBarn & Unga>Barn & Unga/option> option valueFilmvisning>Filmvisning/option> option valueFunkis>Funkis/option> option valueFöreläsning>Föreläsning/option> option valueFörfattarbesök>Författarbesök/option> option valueKultur & Nöje>Kultur & Nöje/option> option valueKurser & Utbildningar>Kurser & Utbildningar/option> option valueLoppisar, Återbruk & Marknader>Loppisar, Återbruk & Marknader/option> option valueMat & Dryck>Mat & Dryck/option> option valueMusik>Musik/option> option valueMöten & Samtal>Möten & Samtal/option> option valueSagostund>Sagostund/option> option valueSport & Fritid>Sport & Fritid/option> option valueSportlov>Sportlov/option> option valueUtställningar & Konst>Utställningar & Konst/option> /select> /form> /div> /div> /section> /div> main idmain classmx-auto w-full max-w-7xl space-y-6 px-4 pb-16 pt-6 rolemain> !-- Intro + Karusell/Fallback --> section classgrid grid-cols-1 gap-4 md:grid-cols-3 aria-labelledbyintro-heading> !-- Intro --> div classrelative flex h-full flex-col overflow-hidden rounded-3xl p-6 md:col-span-1 text-white stylebackground: linear-gradient(to right, rgba(0,0,0,.45) 0%, rgba(0,0,0,.36) 38%, rgba(0,0,0,.24) 62%, rgba(0,0,0,0) 76%), radial-gradient(280px 280px at 88% 14%, rgba(255,255,255,.52) 0%, rgba(255,255,255,.24) 56%, rgba(255,255,255,0) 72%), linear-gradient(180deg, #1d90bd 0%, #1d90bd 100%);> div classrelative flex h-full flex-col> h1 idintro-heading classmb-2 text-2xl font-extrabold leading-tight drop-shadow-sm> Vad händer i Kramfors /h1> p classmb-5 max-w-xs text-sm/6 text-white/95 whitespace-pre-line>Här samlar vi det som händer i Kramfors under året. Är du arrangör och vill registrera ditt evenemang så gör du det via knappen. Vill du veta mer om allt som finns att se och göra i Kramfors och Höga Kusten, då besöker du hogakusten.com. /p> div classflex flex-wrap gap-2 stylemargin-top: auto;> a classinline-flex items-center gap-2 rounded-xl bg-white px-3 py-2 text-sm font-semibold text-neutral-900 shadow-sm ring-1 ring-inset ring-white/25 hover:bg-white/95 focus:outline-none focus-visible:ring-2 focus-visible:ring-white/80 href/ny>Registrera ditt evenemang/a> /div> /div> /div> !-- Karusell --> div classmd:col-span-2> section idcuratedWrap classrelative hidden roleregion aria-labelUtvalda evenemang> svg classhint-chevron left viewBox0 0 24 24 aria-hiddentrue>path dM15 18l-6-6 6-6 fillnone strokecurrentColor stroke-width2 />/svg> svg classhint-chevron right viewBox0 0 24 24 aria-hiddentrue>path dM9 6l6 6-6 6 fillnone strokecurrentColor stroke-width2 />/svg> button typebutton classcurated-nav left cursor-pointer aria-labelFöregående data-dir-1> svg viewBox0 0 24 24 aria-hiddentrue>path dM15 18L9 12l6-6 fillnone strokecurrentColor stroke-width2 />/svg> /button> div classcurated-scroll idcuratedTrack aria-labelUtvalda evenemang>/div> div idcuratedDots aria-labelSidor classhidden>/div> button typebutton classcurated-nav right cursor-pointer aria-labelNästa data-dir1> svg viewBox0 0 24 24 aria-hiddentrue>path dM9 6l6 6-6 6 fillnone strokecurrentColor stroke-width2 />/svg> /button> /section> !-- Fallback-kort --> div idfallbackHero classgrid grid-cols-1 md:grid-cols-2 gap-4 mt-0> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm> button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1160 data-ga-titleNYLANDS FÄBODAR, VIBYGGERÅ FJÄLLSKOG. data-ga-categoryBarn & Familj classshare-btn focus-ring typebutton data-id1160 data-titleNYLANDS FÄBODAR, VIBYGGERÅ FJÄLLSKOG. aria-labelDela evenemang: NYLANDS FÄBODAR, VIBYGGERÅ FJÄLLSKOG. aria-haspopupmenu aria-expandedfalse> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1160 data-ga-titleNYLANDS FÄBODAR, VIBYGGERÅ FJÄLLSKOG. data-ga-categoryBarn & Familj aria-labelLäs mer: NYLANDS FÄBODAR, VIBYGGERÅ FJÄLLSKOG. href/event/1160> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50.00% 50.00% src/uploads/common/2026-02/1773215a3b2d40c9a13b22a69d48c991.jpg altNYLANDS FÄBODAR, VIBYGGERÅ FJÄLLSKOG. /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>1 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>NYLANDS FÄBODAR, VIBYGGERÅ FJÄLLSKOG./h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Barn & Familj /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Nylands fäbodar, Vibyggerå fjällskog., Docksta /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm> button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1174 data-ga-titlePOPUP- CAFÈ CHRISTOFFER GALLERIAN under v.9 data-ga-categoryBarn & Familj classshare-btn focus-ring typebutton data-id1174 data-titlePOPUP- CAFÈ CHRISTOFFER GALLERIAN under v.9 aria-labelDela evenemang: POPUP- CAFÈ CHRISTOFFER GALLERIAN under v.9 aria-haspopupmenu aria-expandedfalse> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1174 data-ga-titlePOPUP- CAFÈ CHRISTOFFER GALLERIAN under v.9 data-ga-categoryBarn & Familj aria-labelLäs mer: POPUP- CAFÈ CHRISTOFFER GALLERIAN under v.9 href/event/1174> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50.00% 50.00% src/uploads/common/2026-02/b50d5242f57848789545fa124f43b1d1.jpg altPOPUP- CAFÈ CHRISTOFFER GALLERIAN under v.9 /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>1 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>POPUP- CAFÈ CHRISTOFFER GALLERIAN under v.9/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Barn & Familj /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Galleria Christoffer, Kramfors /span> /div> /div> /a> /article> /div> /div> /section> !-- GRID --> section aria-labelledbyeventlist-heading> h2 ideventlist-heading classsr-only>Evenemangslista/h2> div idgrid classgrid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 aria-livepolite aria-busyfalse> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1486 data-ga-titleSportlovsfiske i Grössjön data-ga-categoryBarn & Familj aria-expandedfalse classshare-btn focus-ring typebutton data-id1486 data-titleSportlovsfiske i Grössjön aria-labelDela evenemang: Sportlovsfiske i Grössjön aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1486 data-ga-titleSportlovsfiske i Grössjön data-ga-categoryBarn & Familj aria-labelLäs mer: Sportlovsfiske i Grössjön href/event/1486> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50.00% 50.00% src/uploads/common/2026-02/483c74ca3ff24bcca1b9737b56928505.jpg altSportlovsfiske i Grössjön /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>1 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Sportlovsfiske i Grössjön/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Barn & Familj /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Grössjön, Väja /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1382 data-ga-titleSveriges finaste mineralsamling data-ga-categoryBarn & Familj aria-expandedfalse classshare-btn focus-ring typebutton data-id1382 data-titleSveriges finaste mineralsamling aria-labelDela evenemang: Sveriges finaste mineralsamling aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1382 data-ga-titleSveriges finaste mineralsamling data-ga-categoryBarn & Familj aria-labelLäs mer: Sveriges finaste mineralsamling href/event/1382> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50% 50% src/uploads/common/2026-02/79ba75791b8e4e3085b2e4e6f033300e.jpg altSveriges finaste mineralsamling /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>1 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Sveriges finaste mineralsamling/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Barn & Familj /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> High Coast Mineral Museum, Kramfors /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1356 data-ga-titleAfternoon Tea data-ga-categoryMat & Dryck aria-expandedfalse classshare-btn focus-ring typebutton data-id1356 data-titleAfternoon Tea aria-labelDela evenemang: Afternoon Tea aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1356 data-ga-titleAfternoon Tea data-ga-categoryMat & Dryck aria-labelLäs mer: Afternoon Tea href/event/1356> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50.00% 50.00% src/uploads/common/2026-02/6b06a16c5c6541a396cde2d86b4c8547.jpg altAfternoon Tea /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>1 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Afternoon Tea/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Mat & Dryck /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Länsmansgården, Lugnvik /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1459 data-ga-titleSagostund med brandkåren data-ga-categoryBarn & Familj aria-expandedfalse classshare-btn focus-ring typebutton data-id1459 data-titleSagostund med brandkåren aria-labelDela evenemang: Sagostund med brandkåren aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1459 data-ga-titleSagostund med brandkåren data-ga-categoryBarn & Familj aria-labelLäs mer: Sagostund med brandkåren href/event/1459> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50% 50% src/uploads/common/2026-02/720fd6c9018341f2b64d6ab5dde35587.jpg altSagostund med brandkåren /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>3 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Sagostund med brandkåren/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Barn & Familj /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Kramfors bibliotek, Kramfors /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1365 data-ga-titleFöreläsning: Från fiskebåt till stridsbåt data-ga-categoryFöreläsning aria-expandedfalse classshare-btn focus-ring typebutton data-id1365 data-titleFöreläsning: Från fiskebåt till stridsbåt aria-labelDela evenemang: Föreläsning: Från fiskebåt till stridsbåt aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1365 data-ga-titleFöreläsning: Från fiskebåt till stridsbåt data-ga-categoryFöreläsning aria-labelLäs mer: Föreläsning: Från fiskebåt till stridsbåt href/event/1365> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50% 50% src/uploads/common/2026-02/4606b4dc15b14b69b01903d03e47f942.jpg altFöreläsning: Från fiskebåt till stridsbåt /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>3 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Föreläsning: Från fiskebåt till stridsbåt/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Föreläsning /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Kramfors bibliotek, Kramfors /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1313 data-ga-titleSportlovsläger på travskolan data-ga-categoryBarn & Familj aria-expandedfalse classshare-btn focus-ring typebutton data-id1313 data-titleSportlovsläger på travskolan aria-labelDela evenemang: Sportlovsläger på travskolan aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1313 data-ga-titleSportlovsläger på travskolan data-ga-categoryBarn & Familj aria-labelLäs mer: Sportlovsläger på travskolan href/event/1313> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50.00% 50.00% src/uploads/common/2026-02/893251249cd7439ab2be0ae99abdf778.jpg altSportlovsläger på travskolan /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>3 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Sportlovsläger på travskolan/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Barn & Familj /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Dannero Travbana, Nyland /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1310 data-ga-titleSportlovsRöj data-ga-categoryBarn & Familj aria-expandedfalse classshare-btn focus-ring typebutton data-id1310 data-titleSportlovsRöj aria-labelDela evenemang: SportlovsRöj aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1310 data-ga-titleSportlovsRöj data-ga-categoryBarn & Familj aria-labelLäs mer: SportlovsRöj href/event/1310> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50.00% 50.00% src/uploads/common/2026-02/eb09acef9efb4a459ba1ad75e5800636.jpg altSportlovsRöj /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>3 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>SportlovsRöj/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Barn & Familj /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Gudmundrå församlingsgård, Kramfors /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id618 data-ga-titleZumba data-ga-categorySport & Fritid aria-expandedfalse classshare-btn focus-ring typebutton data-id618 data-titleZumba aria-labelDela evenemang: Zumba aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id618 data-ga-titleZumba data-ga-categorySport & Fritid aria-labelLäs mer: Zumba href/event/618> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 57.26% 29.39% src/uploads/common/2026-01/a562e0eaf5bc4119ab2d2cbf4ce9345c.jpg altZumba /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>5 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Zumba/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Sport & Fritid /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Storgatan 20, 87052 Nyland /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1395 data-ga-titleZumba på Hola folkhögskola data-ga-categorySport & Fritid aria-expandedfalse classshare-btn focus-ring typebutton data-id1395 data-titleZumba på Hola folkhögskola aria-labelDela evenemang: Zumba på Hola folkhögskola aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1395 data-ga-titleZumba på Hola folkhögskola data-ga-categorySport & Fritid aria-labelLäs mer: Zumba på Hola folkhögskola href/event/1395> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50.00% 50.00% src/uploads/common/2026-02/d1b2e6faf29347f992fe5da611883745.jpg altZumba på Hola folkhögskola /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>5 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Zumba på Hola folkhögskola/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Sport & Fritid /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Hola folkhögskola, Nyland /span> /div> /div> /a> /article> article classgroup relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm > button data-ga-eventshare data-ga-methodnative data-ga_locationevent_details data-ga-event-id1387 data-ga-titleSportlovskul vid Gällstasjön data-ga-categoryBarn & Familj aria-expandedfalse classshare-btn focus-ring typebutton data-id1387 data-titleSportlovskul vid Gällstasjön aria-labelDela evenemang: Sportlovskul vid Gällstasjön aria-haspopupmenu> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 />path dM16 6l-4-4-4 4 />path dM12 2v14 />/svg> /button> a classblock focus-ring data-ga-eventevent_detail_click data-ga-event-id1387 data-ga-titleSportlovskul vid Gällstasjön data-ga-categoryBarn & Familj aria-labelLäs mer: Sportlovskul vid Gällstasjön href/event/1387> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: 50.00% 50.00% src/uploads/common/2026-02/2b12f6b5d1f84196817b92e336b4ea19.jpg altSportlovskul vid Gällstasjön /> span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>5 MARS./span> /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>Sportlovskul vid Gällstasjön/h2> div classflex items-center gap-3 text-xs text-neutral-600> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg> Barn & Familj /span> span classinline-flex items-center gap-1> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg> Vindskyddet vid Gällstasjön, Docksta /span> /div> /div> /a> /article> /div> !-- ARIA-live announcer --> p idannouncer classsr-only aria-livepolite>/p> !-- Fallback för oändlig scroll --> div classmt-4 flex justify-center> button idloadMoreBtn classrounded-lg border px-4 py-2 text-sm focus-ring typebutton hidden aria-hiddentrue> Visa fler /button> /div> noscript> p>a classunderline href?page2>Visa fler (kräver inte JavaScript)/a>/p> /noscript> /section> /main> script> /* Init */ (function () { const grid document.getElementById(grid); if (!grid) return; /* Karusell */ try { const wrap document.getElementById(curatedWrap); const track document.getElementById(curatedTrack); const fallback document.getElementById(fallbackHero); if (!wrap || !track) throw new Error(Carousel DOM missing); const FALLBACK_IMG /images/fallback.jpg; /* --- HJÄLPARE: definiera först (fix) --- */ function esc(s){ return String(s ?? ).replace(/&>/g, c>({ &:&,:<,>:>,:",:' }c)) } // Ersätt din fmtDate med denna function fmtDate(iso) { if (!iso) return ; const ymd String(iso).trim().slice(0, 10); // ta bara YYYY-MM-DD const m /^(\d{4})-(\d{2})-(\d{2})$/.exec(ymd); if (!m) return ; // fel format → visa inget const dd parseInt(m3, 10); const monthIdx parseInt(m2, 10) - 1; // 0..11 const MONTHS_SV JAN,FEB,MAR,APR,MAJ,JUN,JUL,AUG,SEP,OKT,NOV,DEC; if (monthIdx 0 || monthIdx > 11) return ; // extra skydd return `${dd} ${MONTHS_SVmonthIdx}`; } function makeEventUrl(id){ return `/event/${encodeURIComponent(id)}`; } function safeCardHtml(ev){ const id ev.id ?? ev.Id ?? ev.eventId ?? ev.EventId; const title ev.title ?? ev.Title ?? ev.name ?? ev.Name ?? ; const image ev.image ?? ev.imageUrl ?? ev.ImageUrl ?? ev.hero ?? ev.Hero ?? FALLBACK_IMG; const date ev.DateIso ?? ev.dateIso ?? ev.Date ?? ev.date ?? null; const cat ev.category ?? ev.Category ?? ; const venue ev.venue ?? ev.Venue ?? ; const city ev.city ?? ev.City ?? ; if (!id || !title) return ; const loc venue, city.filter(Boolean).join(, ); const focusX ev.focusX ?? ev.FocusX ?? 50; const focusY ev.focusY ?? ev.FocusY ?? 50; return ` div classcurated-card> div classimg stylebackground-image:url(${esc(image)}); background-position: ${focusX}% ${focusY}%>/div> span classcurated-badge>${fmtDate(date) || SNART}/span> !-- Share-knappen --> button classshare-btn typebutton aria-haspopupmenu aria-expandedfalse aria-labelDela evenemang: ${esc(title)} data-ga-eventshare data-ga-methodnative data-ga-locationevent_details data-ga-page-sectioncurated data-id${esc(id)} data-title${esc(title)} data-ga-event-id${esc(id)} data-ga-title${esc(title)} data-ga-category${esc(cat)}> svg aria-hiddentrue classshare-icon viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2> path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7 /> path dM16 6l-4-4-4 4 /> path dM12 2v14 /> /svg> /button> !-- Klick på kortet (läs mer) --> a classbody href${makeEventUrl(id)} aria-labelLäs mer: ${esc(title)} data-ga-eventevent_detail_click data-ga-locationevent_details data-ga-page-sectioncurated data-ga-event-id${esc(id)} data-ga-title${esc(title)} data-ga-category${esc(cat)}> h3 classcurated-title text-lg font-extrabold leading-tight line-clamp-2>${esc(title)}/h3> div classcurated-meta> ${cat ? `span>${esc(cat)}/span>` : } ${loc ? `span>📍 ${esc(loc)}/span>` : } /div> /a> /div>`; } // Period: **enbart idag** const from new Date(); from.setHours(0, 0, 0, 0); const to new Date(from); // samma dag function ymdLocal(d) { const y d.getFullYear(); const m String(d.getMonth() + 1).padStart(2, 0); const day String(d.getDate()).padStart(2, 0); return `${y}-${m}-${day}`; // lokalt YYYY-MM-DD } const qs new URLSearchParams({ handler: Curated, from: ymdLocal(from), to: ymdLocal(to), take: 12 }); // Hämta dagens kuraterade (utan cache) fetch(location.pathname + ? + qs.toString(), { credentials: same-origin, cache: no-store }) .then(r > r.ok ? r.json() : Promise.reject(r.status)) .then(list > { if (!Array.isArray(list) || list.length 0) return; // låt fallback vara kvar const html list.map(safeCardHtml).filter(Boolean).join(); if (!html) return; // **FIX: Flytta fallback-korten till huvudgridet INNAN vi visar karusellen** if (fallback) { const fallbackCards Array.from(fallback.querySelectorAll(article)); const targetGrid document.getElementById(grid); if (targetGrid && fallbackCards.length > 0) { // Spara referens till första barnet i gridet const firstGridChild targetGrid.querySelector(article); // // Flytta varje fallback-kort till början av gridet (före befintliga event) fallbackCards.forEach(card > { if (firstGridChild) { targetGrid.insertBefore(card, firstGridChild); } else { targetGrid.appendChild(card); } }); } // Dölj fallback-containern efter flytten fallback.style.display none; } // Visa karusellen wrap.classList.remove(hidden); track.innerHTML html; /* Samma “index-navigering”, prickar & pilar som innan */ const styles getComputedStyle(track); const GAP parseFloat(styles.columnGap) || 16; const PAD_L parseFloat(styles.paddingLeft) || 0; const CARDS track.querySelectorAll(.curated-card); const COUNT CARDS.length; if (COUNT > 1) wrap.classList.add(has-scroll); const leftBtn wrap.querySelector(.curated-nav.left); const rightBtn wrap.querySelector(.curated-nav.right); const dotsEl document.getElementById(curatedDots); function renderDots() { if (!dotsEl) return; if (COUNT 1) { dotsEl.classList.add(hidden); dotsEl.innerHTML ; return; } dotsEl.classList.remove(hidden); dotsEl.innerHTML Array.from({ length: COUNT }, (_, i) > `span classdot rolebutton data-i${i} aria-current${i0}>/span>` ).join(); } function setActiveDot(i) { dotsEl?.querySelectorAll(.dot).forEach((d, idx) > { d.setAttribute(aria-current, String(idx i)); }); } renderDots(); setActiveDot(0); dotsEl?.addEventListener(click, (e) > { const dot e.target.closest(.dot); if (!dot) return; const i Number(dot.dataset.i || 0); goTo(i); }); dotsEl?.addEventListener(keydown, (e) > { const dot e.target.closest(.dot); if (!dot) return; if (e.key Enter || e.key ) { e.preventDefault(); const i Number(dot.dataset.i || 0); goTo(i); } }); dotsEl?.querySelectorAll(.dot).forEach(d > d.tabIndex 0); const clampVal (n, a, b) > Math.max(a, Math.min(b, n)); const cardWidth () > (CARDS0?.getBoundingClientRect().width || track.clientWidth); const getIndex () > { const w cardWidth(); const raw (track.scrollLeft - PAD_L) / (w + GAP); return clampVal(Math.round(raw), 0, COUNT - 1); }; const goTo (i) > { const w cardWidth(); const idx clampVal(i, 0, COUNT - 1); const left PAD_L + idx * (w + GAP); track.scrollTo({ left, behavior: smooth }); }; const updateArrows () > { const i getIndex(); const atStart i 0; const atEnd i > COUNT - 1 || COUNT 1; wrap.setAttribute(data-at-start, String(atStart)); wrap.setAttribute(data-at-end, String(atEnd)); if (leftBtn) { leftBtn.hidden atStart; leftBtn.disabled atStart; leftBtn.setAttribute(aria-disabled, String(atStart)); } if (rightBtn) { rightBtn.hidden atEnd; rightBtn.disabled atEnd; rightBtn.setAttribute(aria-disabled, String(atEnd)); } setActiveDot(i); }; updateArrows(); if (leftBtn) { leftBtn.addEventListener(mousedown, (e) > { e.preventDefault(); e.stopPropagation(); }, { capture: true }); leftBtn.addEventListener(click, (e) > { e.preventDefault(); if (leftBtn.disabled || leftBtn.getAttribute(aria-disabled) true) return; goTo(getIndex() - 1); requestAnimationFrame(updateArrows); setTimeout(updateArrows, 350); }); } if (rightBtn) { rightBtn.addEventListener(mousedown, (e) > { e.preventDefault(); e.stopPropagation(); }, { capture: true }); rightBtn.addEventListener(click, (e) > { e.preventDefault(); if (rightBtn.disabled || rightBtn.getAttribute(aria-disabled) true) return; goTo(getIndex() + 1); requestAnimationFrame(updateArrows); setTimeout(updateArrows, 350); }); } track.addEventListener(scroll, () > { if (track.__raf) return; track.__raf requestAnimationFrame(() > { track.__raf null; updateArrows(); }); }, { passive:true }); window.addEventListener(resize, () > { clearTimeout(track.__resizeTimer); track.__resizeTimer setTimeout(updateArrows, 120); }); // Mushjul → horisontell scroll (som innan) track.addEventListener(wheel, (e) > { if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) { e.preventDefault(); track.scrollBy({ left: e.deltaY, behavior: auto }); } }, { passive: false }); // Drag to scroll (som innan) let isDown false, startX 0, startLeft 0, dragged false; const down (clientX) > { isDown true; dragged false; startX clientX; startLeft track.scrollLeft; track.classList.add(dragging); }; const move (clientX) > { if (!isDown) return; const dx startX - clientX; if (Math.abs(dx) > 4) dragged true; track.scrollLeft startLeft + dx; }; const up () > { isDown false; track.classList.remove(dragging); setTimeout(()> dragged false, 0); }; track.addEventListener(mousedown, (e)> down(e.clientX), {capture:true}); track.addEventListener(mousemove, (e)> move(e.clientX), {capture:true}); track.addEventListener(mouseup, up, {capture:true}); track.addEventListener(mouseleave, up, {capture:true}); track.addEventListener(touchstart, (e)> down(e.touches0.clientX), {passive:true, capture:true}); track.addEventListener(touchmove, (e)> move(e.touches0.clientX), {passive:false, capture:true}); track.addEventListener(touchend, up, {capture:true}); track.querySelectorAll(.curated-card, .curated-card a).forEach(el>{ el.addEventListener(click, (e)> { if (dragged) e.preventDefault(); }, true); }); }) .catch(() > { /* tyst fallback – påverka inte övrig kod */ }); } catch (err) { console.error(err); } /* Infinite scroll */ let skip 12; const take 12; let loading false; let hasMore true; const seen new Set(); (function primeSeenFromDom(){ grid.querySelectorAll(ahref^/Event, ahref^/event).forEach(a>{ const m a.getAttribute(href)?.match(/\/event\/(\d+)|id(\d+)/i); const id m ? (m1 || m2) : null; if (id) seen.add(String(id)); }); })(); const params new URLSearchParams(window.location.search); const scope params.get(scope) || alla; const cat params.get(cat) || ; const btn document.getElementById(loadMoreBtn); const liveStartBusy () > grid.setAttribute(aria-busy,true); const liveEndBusy () > grid.setAttribute(aria-busy,false); // Spara läget innan vi klickar in på ett event const STATE_KEY eventtool:indexState; function saveScrollState() { try { const state { scrollY: window.scrollY, url: window.location.pathname + window.location.search }; sessionStorage.setItem(STATE_KEY, JSON.stringify(state)); } catch { /* ignorerar om sessionStorage är avstängd */ } } // Spara när användaren klickar på ett eventkort document.addEventListener(click, (e) > { const a e.target.closest(ahref^/event, ahref^/Event); if (!a) return; saveScrollState(); }); function updateLoadMoreButton(){ if (!btn) return; btn.disabled loading || !hasMore; btn.setAttribute(aria-disabled, btn.disabled ? true : false); btn.hidden !hasMore; } function createCard(ev){ const fall /images/fallback.jpg; const imgSrc ev.imageUrl && ev.imageUrl.length ? ev.imageUrl : fall; const place ev.venue, ev.city.filter(Boolean).join(, ); const hasCol2 ev.spanTwoCols ? lg:col-span-2 : ; const dateBadge ev.dateLabel ? `span classabsolute left-3 top-3 inline-flex items-center rounded-full bg-red-700 px-2.5 py-1 text-11px font-bold text-white shadow>${ev.dateLabel}/span>` : ; const tagIcon `svg xmlnshttp://www.w3.org/2000/svg classh-3.5 w-3.5 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2>path stroke-linecapround stroke-linejoinround dM20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L3 13V3h10l7.59 7.59a2 2 0 0 1 0 2.82z />circle cx7.5 cy7.5 r1.5 />/svg>`; const pinIcon `svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 text-neutral-600 fillnone viewBox0 0 24 24 strokecurrentColor>path stroke-linecapround stroke-linejoinround stroke-width2 dM12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10z />circle cx12 cy11 r2>/circle>/svg>`; const catChunk ev.category ? `span classinline-flex items-center gap-1>${tagIcon}${ev.category}/span>` : ; const placeChunk place ? `span classinline-flex items-center gap-1>${pinIcon}${place}/span>` : ; const article document.createElement(article); article.className `group relative overflow-hidden rounded-3xl border border-neutral-500 ring-1 ring-inset ring-neutral-300 bg-white shadow-sm ${hasCol2} `; article.innerHTML ` button classshare-btn typebutton data-id${ev.eventId} data-ga-eventshare data-ga-methodnative data-ga-locationevent_hero data-title${(ev.title || ).replace(//g, ")} aria-labelDela evenemang: ${(ev.title || ).replace(//g, ")} aria-haspopupmenu aria-expandedfalse> svg aria-hiddentrue classshare-icon xmlnshttp://www.w3.org/2000/svg viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2> path dM4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7/> path dM16 6l-4-4-4 4/> path dM12 2v14/> /svg> /button> a classblock focus-ring href/event/${ev.eventId} aria-labelLäs mer: ${(ev.title || ).replace(//g, ")} data-ga-eventevent_detail_click data-ga-event-id${ev.eventId} data-ga-title${(ev.title || ).replace(//g, ")} data-ga-category${(ev.category || ).replace(//g, ")} data-ga-locationhero_card> div classrelative aspect-16/10 w-full overflow-hidden> img classh-full w-full object-cover styleobject-position: ${ev.focusX || 50}% ${ev.focusY || 50}% src${imgSrc} alt${(ev.title || ).replace(//g, ")} /> ${dateBadge} /div> div classspace-y-1 p-4> h2 classline-clamp-1 text-15px font-semibold group-hover:underline>${ev.title || }/h2> div classflex items-center gap-3 text-xs text-neutral-600>${catChunk}${placeChunk}/div> /div> /a>`; return article; } async function loadMore(){ if (loading || !hasMore) return; loading true; updateLoadMoreButton(); liveStartBusy(); try{ const url `/?handlerLoadMore&skip${skip}&take${take}&scope${encodeURIComponent(scope)}&cat${encodeURIComponent(cat)}`; const res await fetch(url, { headers: { Accept:application/json } }); if (!res.ok){ console.error(LoadMore failed, res.status, await res.text()); hasMorefalse; updateLoadMoreButton(); liveEndBusy(); return; } const payload await res.json(); const events Array.isArray(payload) ? payload : (payload.items || ); const nextSkip !Array.isArray(payload) && Number.isFinite(payload.nextSkip) ? payload.nextSkip : null; const serverHasMore !Array.isArray(payload) && typeof payload.hasMore boolean ? payload.hasMore : null; let appended 0; for (const ev of events){ const id String(ev.eventId ?? ev.id ?? ); if (!id || seen.has(id)) continue; seen.add(id); grid.appendChild(createCard(ev)); appended++; } const announcer document.getElementById(announcer); if (announcer && appended > 0) announcer.textContent `${appended} nya evenemang laddades.`; if (nextSkip ! null) skip nextSkip; else skip + events.length; if (serverHasMore ! null) hasMore serverHasMore; else if (events.length 0) hasMore false; } catch(e){ console.error(e); } finally{ loading false; updateLoadMoreButton(); liveEndBusy(); } } // Fyll om sidan är för kort async function fillViewportIfNeeded(){ let safety8; while (hasMore && document.documentElement.scrollHeight window.innerHeight + 200 && safety-- > 0){ await loadMore(); } } // Sentinel let sentinel document.getElementById(sentinel); if (!sentinel) { sentinel document.createElement(div); sentinel.id sentinel; sentinel.style.height 1px; grid.parentNode.appendChild(sentinel); } btn?.addEventListener(click, loadMore); if (IntersectionObserver in window) { const io new IntersectionObserver( (entries) > { for (const e of entries) { if (e.isIntersecting) loadMore(); } }, { rootMargin: 800px 0px 800px 0px } ); io.observe(sentinel); } updateLoadMoreButton(); fillViewportIfNeeded(); // Försök återställa läget (scroll + inladdade events) (function restoreScrollIfAny() { try { const raw sessionStorage.getItem(STATE_KEY); if (!raw) return; const state JSON.parse(raw); // Säkerställ att vi är på samma sida (scope/kat) const currentUrl window.location.pathname + window.location.search; if (state.url && state.url ! currentUrl) return; sessionStorage.removeItem(STATE_KEY); const targetY typeof state.scrollY number ? state.scrollY : 0; if (targetY 0) return; // Kör asynkront så layout + första batchen hinner renderas setTimeout(() > { (async () > { let safety 15; // Ladda fler events tills sidan är tillräckligt lång while ( hasMore && (document.documentElement.scrollHeight targetY + window.innerHeight + 200) && safety-- > 0 ) { await loadMore(); } // Scrolla dit användaren var window.scrollTo(0, targetY); })(); }, 40); } catch { // Om något strular, skit i återställning – sidan funkar ändå } })(); let resizeTimer; window.addEventListener(resize, () > { clearTimeout(resizeTimer); resizeTimer setTimeout(() > { fillViewportIfNeeded(); }, 150); }); })(); /script> script src/js/share-menu.js>/script> script> // A) Karusell-prickar: role/label/tab + Enter/Space (function () { const dotsEl document.getElementById(curatedDots); if (!dotsEl) return; function enhanceDots() { const dots dotsEl.querySelectorAll(.dot); dots.forEach((dot, idx) > { dot.setAttribute(role, button); dot.tabIndex 0; dot.setAttribute(aria-label, `Gå till bild ${idx + 1}`); }); } // Kör nu och om prickarna renderas om new MutationObserver(enhanceDots).observe(dotsEl, { childList: true }); enhanceDots(); dotsEl.addEventListener(keydown, (e) > { const dot e.target.closest(.dot); if (!dot) return; if (e.key Enter || e.key ) { e.preventDefault(); const i Number(dot.dataset.i || 0); const track document.getElementById(curatedTrack); const card track?.querySelector(.curated-card); if (track && card) { const styles getComputedStyle(track); const GAP parseFloat(styles.columnGap) || 16; const PAD_L parseFloat(styles.paddingLeft) || 0; const w card.getBoundingClientRect().width || track.clientWidth; track.scrollTo({ left: PAD_L + i * (w + GAP), behavior: smooth }); } } }); })(); /script> script> // B) Delningsmeny: ARIA, fokus-in, ESC, klick utanför (function () { // Markera triggers document.querySelectorAll(.share-btnaria-haspopupmenu).forEach(btn > { btn.setAttribute(aria-expanded, false); btn.addEventListener(click, () > { btn.setAttribute(aria-expanded, true); btn.dataset.shareOpener 1; }, { capture: true }); }); const mo new MutationObserver((records) > { for (const r of records) { r.addedNodes.forEach(node > { if (!(node instanceof HTMLElement)) return; if (!node.classList.contains(share-pop)) return; node.setAttribute(role, menu); const items node.querySelectorAll(a, button); items.forEach(i > i.setAttribute(role, menuitem)); items0?.focus(); const onKey (e) > { if (e.key Escape) { e.stopPropagation(); closeMenu(node); } }; node.addEventListener(keydown, onKey); function closeMenu(menuEl) { const opener document.querySelector(.share-btndata-share-opener1); if (menuEl?.parentNode) menuEl.parentNode.removeChild(menuEl); if (opener) { opener.setAttribute(aria-expanded, false); opener.removeAttribute(data-share-opener); opener.focus(); } node.removeEventListener(keydown, onKey); } const outside (e) > { if (!node.contains(e.target)) closeMenu(node); }; setTimeout(() > document.addEventListener(mousedown, outside, { once: true }), 0); }); } }); mo.observe(document.body, { childList: true, subtree: true }); })(); /script> script> (function () { const cal document.getElementById(calbar); function syncCalbarOffset() { const h cal ? cal.offsetHeight : 0; document.documentElement.style.setProperty(--calbar-h, h + px); } // Kör vid load + när calbar ändrar storlek + vid resize window.addEventListener(load, syncCalbarOffset); window.addEventListener(resize, () > { clearTimeout(syncCalbarOffset._t); syncCalbarOffset._t setTimeout(syncCalbarOffset, 100); }); if (window.ResizeObserver && cal) { const ro new ResizeObserver(syncCalbarOffset); ro.observe(cal); } syncCalbarOffset(); const link document.getElementById(logoLink); if (!link) return; link.addEventListener(click, function (e) { // Hindra sid-omladdning på vissa browsers e.preventDefault(); window.scrollTo({ top: 0, behavior: smooth }); // Uppdatera hash för bakåt-knappen utan att “hoppa” history.replaceState(null, , #pageTop); }); })(); /script> script> (function () { const btn document.getElementById(menuBtn); const menu document.getElementById(mobileMenu); if (!btn || !menu) return; function openMenu() { if (menu.parentElement ! document.body) { document.body.appendChild(menu); // flytta ut ur sticky/transform } menu.classList.remove(hidden); btn.setAttribute(aria-expanded, true); const r btn.getBoundingClientRect(); menu.style.position fixed; menu.style.top (r.bottom + 8) + px; menu.style.right (window.innerWidth - r.right) + px; menu.style.zIndex 999999; } function closeMenu() { menu.classList.add(hidden); btn.setAttribute(aria-expanded, false); } btn.addEventListener(click, (e) > { e.stopPropagation(); const isOpen !menu.classList.contains(hidden); isOpen ? closeMenu() : openMenu(); }); document.addEventListener(click, (e) > { if (!menu.contains(e.target) && !btn.contains(e.target)) closeMenu(); }); document.addEventListener(keydown, (e) > { if (e.key Escape) closeMenu(); }); function syncMenuPos() { if (menu.classList.contains(hidden)) return; const r btn.getBoundingClientRect(); menu.style.top (r.bottom + 8) + px; menu.style.right (window.innerWidth - r.right) + px; } window.addEventListener(resize, syncMenuPos); window.addEventListener(scroll, syncMenuPos, { passive: true }); })(); /script> /body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]