Fø værfilteret

This commit is contained in:
Erol Haagenrud 2026-04-19 09:49:47 +02:00
parent 3d3470267c
commit 89e2670c11
8 changed files with 200 additions and 133 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View file

@ -2874,14 +2874,16 @@ async def quick_edit_facility(facility_id: int, request: QuickEditRequest):
).strip() ).strip()
if request.field == 'footnote': if request.field == 'footnote':
normalized_value = str(request.value or '').strip() or None normalized_value = str(request.value or '').strip() or None
footnote_updated_at = datetime.utcnow() if normalized_value else None
await conn.execute( await conn.execute(
""" """
UPDATE facilities UPDATE facilities
SET footnote = $1, SET footnote = $1,
footnote_updated_at = CASE WHEN $1 IS NULL THEN NULL ELSE NOW() END footnote_updated_at = $2
WHERE id = $2 WHERE id = $3
""", """,
normalized_value, normalized_value,
footnote_updated_at,
facility_id facility_id
) )
else: else:

View file

@ -47,12 +47,25 @@ Etablert fontbruk i appen:
- Display: `Oswald` - Display: `Oswald`
- UI/brødtekst: `Mulish` - UI/brødtekst: `Mulish`
Anbefalt typescale:
- Hero-eyebrow / små systemetiketter: `0.6875rem` til `0.75rem`, uppercase, høy tracking
- Filterlabels og kortbadges: `0.625rem` til `0.75rem`, uppercase, høy tracking
- Brødtekst kompakt: `0.9375rem`
- Standard brødtekst: `1rem`
- Lang lese-/forklaringstekst: `1rem` til `1.0625rem` med romslig linjehøyde
- Seksjonsoverskrift mobil: `2rem` til `2.5rem`
- Seksjonsoverskrift desktop: `3rem` til `3.75rem`
- Hero-hovedbudskap mobil: minst `1.75rem`
- Hero-hovedbudskap tablet/desktop: `3rem` til `5rem`
Regler: Regler:
- Overskrifter skal bruke display-font og tåle høy vekt, store størrelser og tett linjehøyde. - Overskrifter skal bruke display-font og tåle høy vekt, store størrelser og tett linjehøyde.
- Brødtekst, skjemaer, kortmetadata og hjelpetekst skal bruke UI-font. - Brødtekst, skjemaer, kortmetadata og hjelpetekst skal bruke UI-font.
- Eyebrows, små etiketter og filterlabels skal ofte være uppercase med tydelig tracking. - Eyebrows, små etiketter og filterlabels skal ofte være uppercase med tydelig tracking.
- Lange forklaringer skal være lettleste, ikke komprimerte. - Lange forklaringer skal være lettleste, ikke komprimerte.
- Mobil skal ikke få "samme typografi, bare mindre". De viktigste budskapene må fortsatt oppleves store og prioriterte på smale skjermer.
Tone i typografi: Tone i typografi:

View file

@ -379,6 +379,7 @@ export default function FacilitySearch({
const [facilityFilter, setFacilityFilter] = useState(""); const [facilityFilter, setFacilityFilter] = useState("");
const [sortMethod, setSortMethod] = useState<SortMethod>("updated"); const [sortMethod, setSortMethod] = useState<SortMethod>("updated");
const [userLocation, setUserLocation] = useState<{ lat: number; lng: number } | null>(null); const [userLocation, setUserLocation] = useState<{ lat: number; lng: number } | null>(null);
const [isMobileSearchOpen, setIsMobileSearchOpen] = useState(false);
useEffect(() => { useEffect(() => {
setAreaFilter(fixedAreaFilter); setAreaFilter(fixedAreaFilter);
@ -588,6 +589,14 @@ export default function FacilitySearch({
filtersCount > 0 ? `${filtersCount} aktive filtre` : "" filtersCount > 0 ? `${filtersCount} aktive filtre` : ""
}`; }`;
const labelClassName = variant === "home" ? "text-white/70" : "text-[#617063]"; const labelClassName = variant === "home" ? "text-white/70" : "text-[#617063]";
const isCollapsibleHomeSearch = variant === "home";
const searchPanelOpen = !isCollapsibleHomeSearch || isMobileSearchOpen;
useEffect(() => {
if (isCollapsibleHomeSearch && filtersCount > 0) {
setIsMobileSearchOpen(true);
}
}, [filtersCount, isCollapsibleHomeSearch]);
return ( return (
<section className="mx-auto max-w-[1400px] px-4 py-6 sm:px-6 sm:py-8 lg:px-8 lg:py-10"> <section className="mx-auto max-w-[1400px] px-4 py-6 sm:px-6 sm:py-8 lg:px-8 lg:py-10">
@ -601,11 +610,45 @@ export default function FacilitySearch({
<div className={getSearchShellClasses(variant)}> <div className={getSearchShellClasses(variant)}>
<div className="mb-5"> <div className="mb-5">
<h2 className="section-title text-3xl sm:text-4xl"> {isCollapsibleHomeSearch ? (
{variant === "home" ? "Søk golfbaner" : "Filtrer oversikten"} <>
</h2> <button
type="button"
onClick={() => setIsMobileSearchOpen((current) => !current)}
aria-expanded={searchPanelOpen}
className="flex w-full items-center justify-between gap-4 rounded-[1.4rem] border border-white/12 bg-white/6 px-4 py-4 text-left transition hover:bg-white/10 md:hidden"
>
<span className="section-title text-[1.7rem] text-white">Søk golfbaner</span>
<span
className={`inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-full border border-white/15 bg-white/10 text-white transition-transform duration-300 ${
searchPanelOpen ? "rotate-180" : ""
}`}
aria-hidden="true"
>
<svg className="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2">
<path d="m6 9 6 6 6-6" strokeLinecap="round" strokeLinejoin="round" />
</svg>
</span>
</button>
<div className="hidden md:block">
<h2 className="section-title text-3xl sm:text-4xl">Søk golfbaner</h2>
</div>
</>
) : (
<h2 className="section-title text-3xl sm:text-4xl">Filtrer oversikten</h2>
)}
</div> </div>
<div
className={`overflow-hidden transition-[max-height,opacity,margin] duration-300 ease-out md:!visible md:!mt-0 md:!max-h-none md:!opacity-100 ${
isCollapsibleHomeSearch
? searchPanelOpen
? "visible mt-0 max-h-[1200px] opacity-100"
: "invisible -mt-2 max-h-0 opacity-0 md:visible"
: "visible mt-0 max-h-none opacity-100"
}`}
aria-hidden={isCollapsibleHomeSearch && !searchPanelOpen}
>
<div className="grid gap-3 md:grid-cols-2 xl:grid-cols-4"> <div className="grid gap-3 md:grid-cols-2 xl:grid-cols-4">
{!fixedAreaFilter && ( {!fixedAreaFilter && (
<FieldSelect label="Område" value={areaFilter} onChange={setAreaFilter} labelClassName={labelClassName}> <FieldSelect label="Område" value={areaFilter} onChange={setAreaFilter} labelClassName={labelClassName}>
@ -624,7 +667,7 @@ export default function FacilitySearch({
<option value="stenger_snart">Stenger snart</option> <option value="stenger_snart">Stenger snart</option>
<option value="aapner_snart">Åpner snart</option> <option value="aapner_snart">Åpner snart</option>
<option value="stengt">Stengt</option> <option value="stengt">Stengt</option>
<option value="under_utvikling">Under utvikling</option> <option value="under-utvikling">Under utvikling</option>
<option value="nedlagt">Nedlagt</option> <option value="nedlagt">Nedlagt</option>
<option value="ukjent">Ukjent status</option> <option value="ukjent">Ukjent status</option>
</FieldSelect> </FieldSelect>
@ -638,11 +681,10 @@ export default function FacilitySearch({
<option value="under-utvikling">Under utvikling</option> <option value="under-utvikling">Under utvikling</option>
</FieldSelect> </FieldSelect>
<FieldSelect label="Ekstra" value={specialFilter} onChange={setSpecialFilter} labelClassName={labelClassName}> <FieldSelect label="NSG / GOLFAMORE" value={specialFilter} onChange={setSpecialFilter} labelClassName={labelClassName}>
<option value="">Ingen tillegg</option> <option value="">Ingen tillegg</option>
<option value="golfamore">Golfamore</option> <option value="golfamore">Golfamore</option>
<option value="nsg">Seniorgolf / NSG</option> <option value="nsg">Seniorgolf / NSG</option>
<option value="simulator">Simulator</option>
</FieldSelect> </FieldSelect>
</div> </div>
@ -729,6 +771,7 @@ export default function FacilitySearch({
</span> </span>
</div> </div>
</div> </div>
</div>
{processedFacilities.length === 0 ? ( {processedFacilities.length === 0 ? (
<div className="surface-card mt-6 rounded-[2rem] px-6 py-12 text-center"> <div className="surface-card mt-6 rounded-[2rem] px-6 py-12 text-center">

View file

@ -189,9 +189,12 @@ export default function HeroSlider({
<div className="absolute inset-0 z-10 mx-auto flex max-w-[1400px] flex-col justify-between px-4 py-5 sm:px-6 sm:py-7 lg:px-8 lg:py-10"> <div className="absolute inset-0 z-10 mx-auto flex max-w-[1400px] flex-col justify-between px-4 py-5 sm:px-6 sm:py-7 lg:px-8 lg:py-10">
<div className="flex justify-end"> <div className="flex justify-end">
<div className="max-w-[14rem] text-right sm:max-w-[22rem] lg:max-w-[48rem]"> <div className="w-full max-w-full text-right sm:w-auto sm:max-w-[24rem] lg:max-w-[48rem]">
<h1 className="text-sm font-bold uppercase leading-tight tracking-tight text-white sm:text-3xl lg:text-5xl"> <h1 className="text-[1.43rem] font-bold uppercase leading-[0.92] tracking-[-0.01em] text-white sm:text-3xl lg:text-5xl">
<span>TeeOff.no gir deg komplett oversikt over </span> <span className="block sm:inline">TeeOff.no gir deg komplett oversikt</span>
<span className="block sm:inline">
<span className="sm:hidden"> over </span>
<span className="hidden sm:inline"> over </span>
<Link <Link
href="/golfbaner" href="/golfbaner"
className="font-extrabold transition hover:text-white" className="font-extrabold transition hover:text-white"
@ -201,6 +204,7 @@ export default function HeroSlider({
ALLE ALLE
</Link> </Link>
<span> norske golfbaner!</span> <span> norske golfbaner!</span>
</span>
</h1> </h1>
</div> </div>
</div> </div>

View file

@ -12,6 +12,7 @@ export const dynamic = "force-dynamic";
const articleSlug = "note-to-self-lenker-til-viktige-turneringer-i-golfbox"; const articleSlug = "note-to-self-lenker-til-viktige-turneringer-i-golfbox";
const pageTitle = "Turneringer"; const pageTitle = "Turneringer";
const pageIntro = "Her er alle turneringene vi ikke vet hvordan vi skal finne i Golfbox (og andre steder). God golfsesong!";
function renderBlock(block: CourseVisitBodyBlock, index: number) { function renderBlock(block: CourseVisitBodyBlock, index: number) {
if (block.type !== "richText") { if (block.type !== "richText") {
return null; return null;
@ -70,7 +71,7 @@ export default async function TournamentsPage() {
type="application/ld+json" type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbJsonLd) }} dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbJsonLd) }}
/> />
<InfoPageShell eyebrow="Turneringer" title={article.title} intro={article.excerpt}> <InfoPageShell eyebrow="Turneringer" title={article.title} intro={pageIntro}>
<div className="space-y-6"> <div className="space-y-6">
<CourseVisitGallery title={article.title} media={article.mediaGallery.slice(0, 1)} /> <CourseVisitGallery title={article.title} media={article.mediaGallery.slice(0, 1)} />
{article.blocks.map((block, index) => renderBlock(block, index))} {article.blocks.map((block, index) => renderBlock(block, index))}

View file

@ -3,11 +3,13 @@ import type { ReactNode } from "react";
type InfoPageShellProps = { type InfoPageShellProps = {
eyebrow: string; eyebrow: string;
title: string; title: string;
intro: string; intro?: string;
children: ReactNode; children: ReactNode;
}; };
export default function InfoPageShell({ eyebrow, title, intro, children }: InfoPageShellProps) { export default function InfoPageShell({ eyebrow, title, intro, children }: InfoPageShellProps) {
const normalizedIntro = String(intro || "").trim();
return ( return (
<main className="site-shell min-h-screen"> <main className="site-shell min-h-screen">
<section className="border-b border-[#112015]/8 bg-[linear-gradient(135deg,rgba(139,195,74,0.16),rgba(255,255,255,0.92))]"> <section className="border-b border-[#112015]/8 bg-[linear-gradient(135deg,rgba(139,195,74,0.16),rgba(255,255,255,0.92))]">
@ -16,7 +18,9 @@ export default function InfoPageShell({ eyebrow, title, intro, children }: InfoP
{eyebrow} {eyebrow}
</p> </p>
<h1 className="text-5xl font-black text-[#112015] sm:text-6xl">{title}</h1> <h1 className="text-5xl font-black text-[#112015] sm:text-6xl">{title}</h1>
<p className="mt-6 text-base leading-7 text-[#4F5F50] sm:text-lg">{intro}</p> {normalizedIntro ? (
<p className="mt-6 text-base leading-7 text-[#4F5F50] sm:text-lg">{normalizedIntro}</p>
) : null}
</div> </div>
</section> </section>

View file

@ -510,9 +510,9 @@
"link": "https://teeoff.no/meninger/note-to-self-lenker-til-viktige-turneringer-i-golfbox/", "link": "https://teeoff.no/meninger/note-to-self-lenker-til-viktige-turneringer-i-golfbox/",
"title": "Lenker til viktige turneringer i Golfbox", "title": "Lenker til viktige turneringer i Golfbox",
"titleHtml": "Lenker til viktige turneringer i Golfbox", "titleHtml": "Lenker til viktige turneringer i Golfbox",
"excerpt": "Her er alle turneringene vi ikke vet hvordan vi skal finne i Golfbox (og andre steder). God golfsesong! Narvesen Tour Region Midt Region Vestland Region Rogaland Region Sør Region Viken Vest Region Innlandet Region Nord-Norge Srixon Tour Srixon Tour Callaway Østlandstour Callaway Østlandstour Garmin Norgescup Garmin Norgescup Nordic Golf League Nordic Golf League…", "excerpt": "",
"excerptHtml": "<p>Her er alle turneringene vi ikke vet hvordan vi skal finne i Golfbox (og andre steder). God golfsesong! Narvesen Tour Region Midt Region Vestland Region Rogaland Region Sør Region Viken Vest Region Innlandet Region Nord-Norge Srixon Tour Srixon Tour Callaway &#8211; Østlandstour Callaway &#8211; Østlandstour Garmin Norgescup Garmin Norgescup Nordic Golf League Nordic Golf League&hellip;</p>\n", "excerptHtml": "",
"contentHtml": "\n\n\t<p>Her er alle turneringene vi ikke vet hvordan vi skal finne i Golfbox (og andre steder).</p>\n<p>God golfsesong!</p>\n\t<h2>Narvesen Tour</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/?language=1044#/customer/873/schedule\" target=\"_blank\" rel=\"noopener\">Region Midt</a></li>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/?language=1044#/customer/874/schedule\" target=\"_blank\" rel=\"noopener\">Region Vestland</a></li>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/?language=1044#/customer/875/schedule\" target=\"_blank\" rel=\"noopener\">Region Rogaland</a></li>\n<li><a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/876/schedule\" target=\"_blank\" rel=\"noopener\">Region Sør</a></li>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/?language=1044#/customer/877/schedule\" target=\"_blank\" rel=\"noopener\">Region Viken Vest</a></li>\n<li><a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/878/schedule\" target=\"_blank\" rel=\"noopener\">Region Innlandet</a></li>\n<li><a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/1442/schedule\" target=\"_blank\" rel=\"noopener\">Region Nord-Norge</a></li>\n</ul>\n<h2>Srixon Tour</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=1044#/customer/18/schedule/2022/7671\" target=\"_blank\" rel=\"noopener\">Srixon Tour</a></li>\n</ul>\n<h2>Callaway &#8211; Østlandstour</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/livescoring/tour/default.asp?language=1044#/customer/895/schedule/2022\" target=\"_blank\" rel=\"noopener\">Callaway &#8211; Østlandstour</a></li>\n</ul>\n<h2>Garmin Norgescup</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=2057#/customer/18/schedule/2022/1276\" target=\"_blank\" rel=\"noopener\">Garmin Norgescup</a></li>\n</ul>\n<h2>Nordic Golf League</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/portal/golf_info/gbtourframe.asp?language=1044#/customer/1/schedule\" target=\"_blank\" rel=\"noopener\">Nordic Golf League</a></li>\n</ul>\n<h2>NM</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=2057#/customer/18/schedule/2022/9896\" target=\"_blank\" rel=\"noopener\">NM</a></li>\n</ul>\n<h2>Lag-NM</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=2057#/customer/18/schedule/2022/9897\" target=\"_blank\" rel=\"noopener\">Lag-NM</a></li>\n</ul>\n<h2>Øvrige forbundsturneringer</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=2057#/customer/18/schedule/2022/3697\" target=\"_blank\" rel=\"noopener\">Øvrige forbundsturneringer</a></li>\n</ul>\n\t<h2>Norsk Senior Golf</h2>\n<ul>\n<li><a href=\"https://www.golfbox.dk/livescoring/tour/default.asp?language=1044#/customer/154/schedule\" target=\"_blank\" rel=\"noopener\">Norsk Senior Golf</a></li>\n</ul>\n<h2>Golfhäftet</h2>\n<ul>\n<li><a href=\"https://www.golfhaftet.com/no/konkurranse/trophy/\" target=\"_blank\" rel=\"noopener\">Golfhäftet Trophy</a></li>\n</ul>\n<h2>Norsk MidAm</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/184/schedule\" target=\"_blank\" rel=\"noopener\">Norsk MidAm</a> (Besøk hjemmesiden til <a href=\"http://www.midam.no/\" target=\"_blank\" rel=\"noopener\">Norsk MidAm her</a>.)</li>\n</ul>\n<h2>Åpne turneringer på Sørlandet</h2>\n<ul>\n<li>Klubbene på Sørlandet har gått sammen om en Facebook-side for de åpne turneringene de arrangerer. Den kan ses ved å klikke <a href=\"https://www.facebook.com/golfturneringpaasorlandet/\" target=\"_blank\" rel=\"noopener\">her</a>.</li>\n</ul>\n<h2>Region Nord-Norge (med NNM)</h2>\n<ul>\n<li><a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/1442/schedule\" target=\"_blank\" rel=\"noopener\">Nord-Norge</a></li>\n</ul>\n<h2>Tour de Golf</h2>\n<ul>\n<li><a href=\"http://www.tourdegolf.no/om-tour-de-golf/tour-de-golf/\" target=\"_blank\" rel=\"noopener\">Tour de Golf</a></li>\n</ul>\n<h2>International Pairs (tidligere Nordea Pairs)</h2>\n<ul>\n<li><a href=\"https://www.facebook.com/International-Pairs-Norway-2022-112067397687588/\" target=\"_blank\" rel=\"noopener\">International Pairs (Facebook)</a></li>\n</ul>\n<p>&#8212;</p>\n<p>(Ytterligere en ting som er fint å få unnagjort før sesongen starter&#8230;)</p>\n<p>-Det er forresten bare å gi beskjed dersom det er noen regionale eller nasjonale oversikter som mangler her!</p>\n<h3>Bonus</h3>\n<p>Norges Golfforbund har også klart å gjemme bort nyhetene sine. De kan finnes <a href=\"https://www.golfforbundet.no/ngf-nytt/\" target=\"_blank\" rel=\"noopener\">her</a>.</p>\n\n", "contentHtml": "\n\n\t<p>Her er alle turneringene vi ikke vet hvordan vi skal finne i Golfbox (og andre steder).</p>\n <p>God golfsesong!</p>\n\t <h2>Narvesen Tour</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/?language=1044#/customer/873/schedule\" target=\"_blank\" rel=\"noopener\">Region Midt</a>\n </li>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/?language=1044#/customer/874/schedule\" target=\"_blank\" rel=\"noopener\">Region Vestland</a>\n </li>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/?language=1044#/customer/875/schedule\" target=\"_blank\" rel=\"noopener\">Region Rogaland</a>\n </li>\n <li>\n <a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/876/schedule\" target=\"_blank\" rel=\"noopener\">Region Sør</a>\n </li>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/?language=1044#/customer/877/schedule\" target=\"_blank\" rel=\"noopener\">Region Viken Vest</a>\n </li>\n <li>\n <a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/878/schedule\" target=\"_blank\" rel=\"noopener\">Region Innlandet</a>\n </li>\n <li>\n <a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/1442/schedule\" target=\"_blank\" rel=\"noopener\">Region Nord-Norge</a>\n </li>\n </ul>\n <h2>Srixon Tour</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=1044#/customer/18/schedule/2026/7671\" target=\"_blank\" rel=\"noopener\">Srixon Tour</a>\n </li>\n </ul>\n <h2>Callaway &#8211; Østlandstour</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/livescoring/tour/default.asp?language=1044#/customer/895/schedule/2026\" target=\"_blank\" rel=\"noopener\">Callaway &#8211; Østlandstour</a>\n </li>\n </ul>\n <h2>Garmin Norgescup</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=2057#/customer/18/schedule/2026/1276\" target=\"_blank\" rel=\"noopener\">Garmin Norgescup</a>\n </li>\n </ul>\n <h2>Nordic Golf League</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/portal/golf_info/gbtourframe.asp?language=1044#/customer/1/schedule\" target=\"_blank\" rel=\"noopener\">Nordic Golf League</a>\n </li>\n </ul>\n <h2>NM</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=2057#/customer/18/schedule/2026/9896\" target=\"_blank\" rel=\"noopener\">NM</a>\n </li>\n </ul>\n <h2>Lag-NM</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=2057#/customer/18/schedule/2026/9897\" target=\"_blank\" rel=\"noopener\">Lag-NM</a>\n </li>\n </ul>\n <h2>Øvrige forbundsturneringer</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/app_livescoring/tour/default.asp?language=2057#/customer/18/schedule/2026/3697\" target=\"_blank\" rel=\"noopener\">Øvrige forbundsturneringer</a>\n </li>\n </ul>\n\t <h2>Norsk Senior Golf</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.dk/livescoring/tour/default.asp?language=1044#/customer/154/schedule\" target=\"_blank\" rel=\"noopener\">Norsk Senior Golf</a>\n </li>\n </ul>\n <h2>Golfamore</h2>\n <ul>\n <li>\n <a href=\"https://www.golfamore.com/no/konkurranse/trophy/\" target=\"_blank\" rel=\"noopener\">Golfamore Trophy</a>\n </li>\n </ul>\n <h2>Åpne turneringer på Sørlandet</h2>\n <ul>\n <li>Klubbene på Sørlandet har gått sammen om en Facebook-side for de åpne turneringene de arrangerer. Den kan ses ved å klikke <a href=\"https://www.facebook.com/golfturneringpaasorlandet/\" target=\"_blank\" rel=\"noopener\">her</a>. </li>\n </ul>\n <h2>Region Nord-Norge (med NNM)</h2>\n <ul>\n <li>\n <a href=\"https://www.golfbox.no/livescoring/tour/?language=1044#/customer/1442/schedule\" target=\"_blank\" rel=\"noopener\">Nord-Norge</a>\n </li>\n </ul>\n <p>&#8212;</p>\n <p>(Ytterligere en ting som er fint å få unnagjort før sesongen starter&#8230;)</p>\n <p>-Det er forresten bare å gi beskjed dersom det er noen regionale eller nasjonale oversikter som mangler her!</p>\n <h3>Bonus</h3>\n <p>Norges Golfforbund har også klart å gjemme bort nyhetene sine. De kan finnes <a href=\"https://www.golfforbundet.no/ngf-nytt/\" target=\"_blank\" rel=\"noopener\">her</a>. </p>\n\n",
"publishedAt": "2019-03-17T07:00:27", "publishedAt": "2019-03-17T07:00:27",
"updatedAt": "2024-08-18T10:45:18", "updatedAt": "2024-08-18T10:45:18",
"author": { "author": {