{%- comment -%} Header (open) — partner strip + sticky bar + logo, leaves the nav wrapper open. The `menu` block (composed in build.mjs) renders next, then header-close.liquid. Partner strip is driven live via {% fetch posts from:'partners' %}, filtered to MAIN partners only — partnerniva (relation, stored as a single UUID string) = "Huvudsponsorer" level (71f306db-a929-482d-945b-6dcb9224ff13). 4 partners. Brand: dark green #002418, accent yellow #f0b800, strip green #074a2e. {%- endcomment -%} {% fetch posts from: 'partners' where: 'content.partnerniva=71f306db-a929-482d-945b-6dcb9224ff13' limit: 4 sort: 'title:asc' into: 'hp' %} {%- comment -%} Fonts + shared CSS (jsodra.css) are loaded once in layout/theme.liquid's . {%- endcomment -%}
{% if hp and hp.size > 0 %}
{% for p in hp %}{%- assign c = p.content -%}{% if c.logotype %} {% if c.hemsida %}{{ p.title }}{% else %}{{ p.title }}{% endif %} {% endif %}{% endfor %}
{% endif %}
Biljetter Shop
No menu items
{%- comment -%} Header (close) — closes nav / actions / bar / header / sticky wrap opened in header-open.liquid {%- endcomment -%}
{%- comment -%} CTA buttons inside the hamburger drawer (Årskort + Shop), like the live MobileNav. The platform `menu` block's drawer has no CTA slot, so we append them client-side to .fs-mob-drawer-body. Styling lives in assets/jsodra.css (.jsm-drawer-cta). {%- endcomment -%}
{%- comment -%} HeroSlider → J-Södra headless src/app/components/HeroSlider(Client).tsx. Data: latest nyheter flagged "visa upp på start". Full-viewport slider, autoplay 5s, dark-green (#002418) bottom gradient, gold CTA. Background uses the image's FOCAL POINT (focal_x/focal_y, 0–100) via background-position so the crop keeps the important area. {%- endcomment -%} {% fetch posts from: 'nyheter' limit: 5 sort: 'published_at:desc' where: 'content.visa_upp_pa_start=true' into: 'slides' %} {%- if slides == blank or slides.size == 0 -%}{% fetch posts from: 'nyheter' limit: 5 sort: 'published_at:desc' into: 'slides' %}{%- endif -%} {%- if slides and slides.size > 0 -%}
{%- for n in slides -%} {%- assign img = n.content.omslagsbild -%}
{%- if forloop.first -%}

{{ n.title }}

{%- else -%}

{{ n.title }}

{%- endif -%} Läs mer
{%- endfor -%} {%- if slides.size > 1 -%}
{%- for n in slides -%}{%- endfor -%}
{%- endif -%}
{%- endif -%}
{%- comment -%} UpcomingMatchesBlock → Liquid (html block). Replaces the headless `custom` component "UpcomingMatchesBlock". Next scheduled matches, soonest first. Reuses .jsm-card styles from jsodra.css (markup inlined — html blocks can't {% render %}). {%- endcomment -%} {%- comment -%} html-block {% fetch %} can't interpolate {{ }} in the where (attr regex breaks on the inner quotes of {{ 'now'|date }}), and some old matches are still match_status=scheduled — so fetch all scheduled and filter datum>=today in the loop below. {%- endcomment -%} {% fetch posts from: 'svff-matcher' where: 'content.match_status=scheduled' sort: 'content.datum:asc' limit: 200 into: 'um' %} {% fetch standings team: '25585' into: 'tabH' %} {% fetch standings team: '238729' into: 'tabD' %} {%- assign monthsSv = 'januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december' | split: ',' -%}

Kommande matcher

Alla matcher →
{%- assign today = 'now' | date: '%Y-%m-%d' -%} {%- assign futureCount = 0 -%}{% for m in um %}{% if m.content.datum >= today %}{%- assign futureCount = futureCount | plus: 1 -%}{% endif %}{% endfor %} {% if futureCount > 0 %}
    {%- assign shown = 0 -%} {% for m in um %}{%- assign c = m.content -%}{% if c.datum >= today and shown < 3 %}{%- assign shown = shown | plus: 1 -%} {%- assign dp = c.datum | split: '-' -%}{%- assign mi = dp[1] | plus: 0 | minus: 1 -%}{%- assign dnum = dp[2] | plus: 0 -%}
  • {% if c.logotyp_hemmalag %}{{ c.hemmalag }}{% else %}{{ c.hemmalag | truncate: 3, '' | upcase }}{% endif %}
    {{ c.hemmalag }}
    {{ dnum }} {{ monthsSv[mi] }}
    {% if c.tid_for_avspark and c.tid_for_avspark != '' and c.tid_for_avspark != '00:00' %}{{ c.tid_for_avspark }}{% else %}TBD{% endif %}
    {% if c.logotype_bortalag %}{{ c.bortalag }}{% else %}{{ c.bortalag | truncate: 3, '' | upcase }}{% endif %}
    {{ c.bortalag }}
    {{ c.leaguename | default: c.arena }}
    {% if c.leaguename and c.arena %}
    {{ c.arena }}
    {% endif %}
  • {% endif %}{% endfor %}
{% else %}

Inga kommande matcher just nu.

{% endif %}
{% if tabH.rows.size > 0 or tabD.rows.size > 0 %} {% endif %}
{%- comment -%} LatestNewsBlock → Liquid (html block for the page-builder). Replaces the headless `custom` component "LatestNewsBlock". Self-contained: {% fetch %} + inline markup (html blocks can't use {% render %} snippets). Reuses .jsm-ncard styles from jsodra.css. {%- endcomment -%} {% fetch posts from: 'nyheter' limit: 3 sort: 'published_at:desc' into: 'ln' %} {%- assign months = 'januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december' | split: ',' -%}

Senaste nytt

Alla nyheter →
{% if ln and ln.size > 0 %}
{% for n in ln %} {%- assign img = n.featured_image | default: n.content.omslagsbild -%} {%- if img == nil or img == '' -%}{%- assign yl = n.content.youtubelink -%}{%- if yl and yl != '' -%}{%- assign ytid = '' -%}{%- if yl contains 'v=' -%}{%- assign ytid = yl | split: 'v=' | last | split: '&' | first | split: '?' | first -%}{%- elsif yl contains 'youtu.be/' -%}{%- assign ytid = yl | split: 'youtu.be/' | last | split: '?' | first | split: '&' | first -%}{%- elsif yl contains '/shorts/' -%}{%- assign ytid = yl | split: '/shorts/' | last | split: '?' | first -%}{%- elsif yl contains '/embed/' -%}{%- assign ytid = yl | split: '/embed/' | last | split: '?' | first -%}{%- endif -%}{%- if ytid != '' -%}{%- assign img = 'https://i.ytimg.com/vi/' | append: ytid | append: '/hqdefault.jpg' -%}{%- endif -%}{%- endif -%}{%- endif -%} {%- assign mnum = n.published_at | date: '%m' | plus: 0 | minus: 1 -%}
{% if n.content.youtubelink %}{% endif %}

{{ n.title }}

{% if n.published_at %}{{ n.published_at | date: '%-d' }} {{ months[mnum] }} {{ n.published_at | date: '%Y' }}{% endif %}
{% endfor %}
{% endif %}

Lagen

Herrlaget

Herrlaget

Följ vårt herrlag i Ettan Södra

Damlaget

Damlaget

Följ vårt damlag

Visa alla lag

Visa alla lag

Se alla våra lag och föreningens verksamhet