Skip to content

Hero - navbar UI#266

Open
RaphaGil wants to merge 8 commits into
OpenMS:mainfrom
RaphaGil:hero-navbar-UI
Open

Hero - navbar UI#266
RaphaGil wants to merge 8 commits into
OpenMS:mainfrom
RaphaGil:hero-navbar-UI

Conversation

@RaphaGil
Copy link
Copy Markdown

@RaphaGil RaphaGil commented May 26, 2026

Updated the hero section with the new layout/UI as discussed and moved the logo to the navbar.

Summary by CodeRabbit

  • New Features

    • Modern hero with animated waveform, gradient title, secondary CTA, and stats with count-up animation
    • Site-wide news banner and donate CTA in the footer
    • Cloned responsive navbar and improved mobile navbar behavior; Google Fonts loaded dynamically
  • Style

    • New design token palette, global typography, and many components updated to use CSS variables for consistent theming
  • Chores

    • Site configuration updated for enhanced hero, navbar, footer, and font settings

Review Change Stack

@netlify
Copy link
Copy Markdown

netlify Bot commented May 26, 2026

Deploy Preview for openms ready!

Name Link
🔨 Latest commit 6b7c11a
🔍 Latest deploy log https://app.netlify.com/projects/openms/deploys/6a15aa2e9194e900086b438c
😎 Deploy Preview https://deploy-preview-266--openms.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 26, 2026

📝 Walkthrough

Walkthrough

This PR adds a new modern hero UI (CSS, responsive breakpoints, reduced-motion/contrast rules, animated waveform), site params/config to drive split hero titles and stats, a hero-stats partial and counter JS, new/updated navbar and footer partials, client-side navbar behavior, global typography/design tokens, and multiple CSS updates to use the new variables.

Changes

Modern Hero Section Feature

Layer / File(s) Summary
Design tokens & global typography
assets/css/brand-palette.css, assets/css/typography.css
Adds CSS custom properties for fonts, sizes, colors and global typography utilities used site-wide.
Modern Hero Visual Design
assets/css/hero.css
Defines .hero-modern layout, gradient title, CTA styles, stats block, animated waveform, responsive breakpoints, prefers-reduced-motion, and prefers-contrast overrides.
Hero configuration, stats partial & counter JS
config.yaml, layouts/partials/hero-stats.html, assets/js/hero-stats.js
Adds hero params (split title, description, CTAs, stats), a partial to render stats with data attributes, and a script to animate counts when visible with reduced-motion fallback.
Navbar & header CSS and responsive rules
assets/css/styles_override.css, assets/css/navbar-responsive.css, assets/css/site-header.css, assets/css/news-banner.css
Overhauls fresh navbar styling, adds sticky site-header and news-banner styles, integrates hero-aware translucent navbar rule, and provides breakpoint-specific navbar/menu behavior.
Navbar templates, clone, social, CTA partials and JS wiring
layouts/partials/navbar.html, layouts/partials/navbar-clone.html, layouts/partials/navbar-sublinks.html, layouts/partials/navbar-cta.html, layouts/partials/navbar-social.html, assets/js/navbar.js, layouts/partials/css.html
Adds main and cloned navbar partials with CTA/social/sublink helpers, dynamic Google Fonts loading from site params, and client-side burger/dropdown behavior including header-height CSS var updates.
Footer, news-banner and footer template changes
layouts/partials/news-banner.html, layouts/partials/footer.html, assets/css/styles_override.css
Adds a configurable news banner, updates footer partial to accept optional logo and donate CTA, and updates footer styling to use new theme variables.
Component CSS variable conversions and tweaks
assets/css/* (casestudies, keyfeatures, mailchimp, quick-facts, shell, tabs, terminal, webapps, members, content_override.css)
Converts multiple component styles from hard-coded colors/sizes to theme variables, adjusts minor responsive and accessibility-related sizes and colors.
Layout template small changes
layouts/_default/baseof.html, layouts/index.html, content/en/about.md
Wraps navbar and news-banner in a header element, removes conditional news partial from index, and adds anchors to about page sections.
  • Possibly related PRs:

  • Suggested reviewers:

    • matteopilz
  • Poem

🐰 A modern hero springs to life,
With gradients dancing, sans the strife,
Stats shimmer, buttons call with care,
A waveform hums through vibrant air,
The navbar floats in frosted grace—
A hero fit for any space!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive The PR description is minimal and lacks the required structure from the template, which expects a 'Brief description' section with issue references or detailed change descriptions. Expand the description to follow the template format and provide more detail about the changes, such as what was updated in the hero section and how the logo repositioning impacts the navbar.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Hero - navbar UI' is directly related to the main changes in the changeset, which include a complete redesign of the hero section and significant navbar restructuring.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@layouts/partials/hero.html`:
- Around line 22-24: The primary CTA anchor is currently rendered when only
$buttonText exists, which can produce an invalid link; update the conditional
around the anchor (the block that renders the <a class="hero-modern__btn
hero-modern__btn--primary"...> element) to require both $buttonText and
$buttonLink (e.g., change the if from checking only $buttonText to checking both
$buttonText and $buttonLink) so the button only renders when it has both text
and a valid href.

In `@layouts/partials/navbar-clone.html`:
- Line 1: The template sets $title := .Site.Params.title and uses it as the logo
alt fallback which can be empty; update the fallback to use .Site.Title instead
of .Site.Params.title by changing the variable or the alt usage (references:
$title, .Site.Params.title, .Site.Title, altText) so that when altText is unset
the logo alt uses .Site.Title; apply the same change to the other occurrence
noted (line 9).
- Around line 26-31: The dropdown parent is rendered without an href so it drops
.url and isn't keyboard-navigable; update the anchor in navbar-clone.html inside
the {{- if .sublinks }} block to include href="{{ .url }}" (fall back to "#" if
.url is empty) and add appropriate accessibility attributes (e.g., role="button"
aria-haspopup="true" aria-expanded="false" and tabindex="0") so the element both
links to the configured parent page and supports keyboard/assistive navigation
while keeping the existing .title and {{ if .is_external }}{{ partial "svg-icon"
"launch" }}{{ end }} content.

In `@layouts/partials/navbar.html`:
- Line 1: The fallback for the logo alt text uses $title which is set from
.Site.Params.title and may be empty; change uses of $title (and any alt fallback
logic referencing .Site.Params.title) to use .Site.Title instead so the logo alt
text falls back to the site-wide title; update both the initial declaration
(where $title is assigned) and the other occurrence around the logo markup (the
second instance mentioned) to reference .Site.Title as the fallback for altText.
- Around line 26-31: The dropdown parent anchor rendered inside the {{- if
.sublinks }} block currently drops the configured .url and becomes
non-navigable; update the <a class="navbar-link"> for the parent (inside the
.sublinks branch) to include href="{{ .url }}" so it preserves navigation, keep
the external icon logic using .is_external and partial "svg-icon", and when
.is_external is true add target="_blank" rel="noopener" (and appropriate aria
attributes like aria-haspopup/aria-expanded or tabindex as needed) to restore
keyboard accessibility and correct external-link behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1d96a367-a8bd-4865-ac68-091336e7d4e4

📥 Commits

Reviewing files that changed from the base of the PR and between 183e68e and 987e409.

📒 Files selected for processing (6)
  • assets/css/hero.css
  • assets/css/styles_override.css
  • config.yaml
  • layouts/partials/hero.html
  • layouts/partials/navbar-clone.html
  • layouts/partials/navbar.html

Comment thread layouts/partials/hero.html Outdated
Comment on lines +22 to +24
{{- if $buttonText }}
<a class="hero-modern__btn hero-modern__btn--primary" href="{{ $buttonLink }}">{{ $buttonText }}</a>
{{- end }}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard primary CTA rendering on both text and URL.

Right now the primary button is rendered when buttontext exists, even if buttonlink is missing, which can produce an empty/invalid navigation target.

Suggested fix
-        {{- if $buttonText }}
+        {{- if and $buttonText $buttonLink }}
         <a class="hero-modern__btn hero-modern__btn--primary" href="{{ $buttonLink }}">{{ $buttonText }}</a>
         {{- end }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{{- if $buttonText }}
<a class="hero-modern__btn hero-modern__btn--primary" href="{{ $buttonLink }}">{{ $buttonText }}</a>
{{- end }}
{{- if and $buttonText $buttonLink }}
<a class="hero-modern__btn hero-modern__btn--primary" href="{{ $buttonLink }}">{{ $buttonText }}</a>
{{- end }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@layouts/partials/hero.html` around lines 22 - 24, The primary CTA anchor is
currently rendered when only $buttonText exists, which can produce an invalid
link; update the conditional around the anchor (the block that renders the <a
class="hero-modern__btn hero-modern__btn--primary"...> element) to require both
$buttonText and $buttonLink (e.g., change the if from checking only $buttonText
to checking both $buttonText and $buttonLink) so the button only renders when it
has both text and a valid href.

@@ -0,0 +1,63 @@
{{- $title := .Site.Params.title }}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use .Site.Title for the logo alt fallback.

The fallback title source should be .Site.Title; .Site.Params.title can be empty and produce a broken fallback alt string when altText is not set.

Suggested fix
-{{- $title          := .Site.Params.title }}
+{{- $title          := .Site.Title }}

Also applies to: 9-9

🧰 Tools
🪛 HTMLHint (1.9.2)

[error] 1-1: Doctype must be declared before any non-comment content.

(doctype-first)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@layouts/partials/navbar-clone.html` at line 1, The template sets $title :=
.Site.Params.title and uses it as the logo alt fallback which can be empty;
update the fallback to use .Site.Title instead of .Site.Params.title by changing
the variable or the alt usage (references: $title, .Site.Params.title,
.Site.Title, altText) so that when altText is unset the logo alt uses
.Site.Title; apply the same change to the other occurrence noted (line 9).

Comment thread layouts/partials/navbar-clone.html
@@ -0,0 +1,63 @@
{{- $title := .Site.Params.title }}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use .Site.Title for the logo alt fallback.

$title is read from .Site.Params.title, which is typically unset here; fallback alt text can degrade to an incorrect string when altText is absent.

Suggested fix
-{{- $title          := .Site.Params.title }}
+{{- $title          := .Site.Title }}

Also applies to: 9-9

🧰 Tools
🪛 HTMLHint (1.9.2)

[error] 1-1: Doctype must be declared before any non-comment content.

(doctype-first)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@layouts/partials/navbar.html` at line 1, The fallback for the logo alt text
uses $title which is set from .Site.Params.title and may be empty; change uses
of $title (and any alt fallback logic referencing .Site.Params.title) to use
.Site.Title instead so the logo alt text falls back to the site-wide title;
update both the initial declaration (where $title is assigned) and the other
occurrence around the logo markup (the second instance mentioned) to reference
.Site.Title as the fallback for altText.

Comment thread layouts/partials/navbar.html
RaphaGil and others added 6 commits May 26, 2026 10:23
Add sticky site header, news banner styling, brand typography, and hero stats animation while restructuring the navbar for tablet and mobile.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@assets/css/hero.css`:
- Line 16: The .hero-modern rule uses overflow: hidden which clips the mobile
stats block that is positioned with bottom: 0 and transform: translateY(100%);
change the overflow so the stats aren't cut off — e.g., remove overflow: hidden
or set overflow-y: visible (or use overflow-x: hidden; overflow-y: visible) on
.hero-modern, and apply the same fix to the related rules around the
mobile-stats styles referenced in the diff (lines ~520-526) so the
absolutely-positioned/styled stats can render off the bottom without being
clipped.

In `@assets/css/mailchimp.css`:
- Around line 84-93: The rule for .sign-up-container .signup-button removes the
default focus outline, which breaks keyboard accessibility on mobile; restore a
visible keyboard focus style by adding a matching .sign-up-container
.signup-button:focus-visible rule (or :focus for broader support) that applies a
clear, contrasty focus indicator (e.g. outline or box-shadow and/or border color
change) and keep the existing border: none/outline: none only for pointer
interactions if needed; update the stylesheet to define .sign-up-container
.signup-button:focus-visible with a visible outline/box-shadow to ensure
keyboard users can see focus.

In `@assets/css/navbar-responsive.css`:
- Line 381: Locate the CSS declaration "fill: currentColor;" (occurs in the
diff) and change the keyword to lowercase so it reads "fill: currentcolor;";
update every occurrence (e.g., in navbar-responsive and styles_override where
that declaration appears) to satisfy stylelint value-keyword-case.

In `@assets/css/news-banner.css`:
- Around line 61-67: The .news-banner__cta CSS rule uses an unreadably small
font-size (0.5rem / 0.4375rem); update the font-size to a more accessible value
(e.g., 0.75rem–0.875rem) in the .news-banner__cta selector and make the same
change for the repeated CTA rule later (the other .news-banner__cta occurrences
mentioned) so the CTA text is consistently larger and readable across screens;
keep font-weight/color/whitespace/transition intact.

In `@assets/js/hero-stats.js`:
- Around line 17-20: The code reads data-count attributes directly and can
produce NaN or invalid decimals; update the parsing around the variables target,
suffix and decimals (where parseFloat and parseInt are used and where
formatValue/animation are called) to validate and provide safe fallbacks: use
Number.isFinite(Number(...)) or isFinite to check parseFloat result and default
target to 0 if invalid, clamp decimals from parseInt to a safe integer range
(e.g., 0–10) and default to 0 if invalid, and keep suffix as the empty string if
missing; apply the same guards where those attributes are parsed later (the
lines referencing target/decimals for animation) so formatValue and any
animation never receive NaN or invalid decimals.

In `@config.yaml`:
- Around line 53-57: The newsBanner configuration is advertising a past event;
update the newsBanner block by either setting enabled: false to hide the banner
or updating text (and link if needed) to reflect a current/future event and
date; specifically modify the newsBanner.enabled and newsBanner.text fields (and
newsBanner.link if the destination changes) so the site no longer displays the
April 30th 2026 workshop as an active/newsworthy item.

In `@layouts/partials/hero-stats.html`:
- Around line 16-18: The template currently injects a <span
class="hero-modern__stat-sep"> directly under the <dl> via the conditional that
checks lt (add $index 1) $statCount; remove that span output (delete the
conditional block that renders hero-modern__stat-sep) and instead implement the
separator in CSS using a pseudo-element on the appropriate child element (e.g.,
target the <dd> or <div> that represents each stat with a selector like
.hero-modern__stat-item:not(:last-child)::after) so separators are rendered
purely with CSS and no non-dt/dd/div children appear under the <dl>.

In `@layouts/partials/navbar-social.html`:
- Around line 5-10: The aria-label currently uses "{{ .icon | humanize }}" which
can be empty when .icon is missing; update the aria-label expression on the
anchor so it falls back to a non-empty value (e.g., .title, .name, .link, or a
literal like "Social link") when .icon is falsy, and keep the existing visual
fallback (the span with class "icon" and the partial "svg-icon") as-is so the
accessible name is always present.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 25db8afd-50b6-4843-8f91-c15462e6dd41

📥 Commits

Reviewing files that changed from the base of the PR and between 987e409 and 6b7c11a.

⛔ Files ignored due to path filters (1)
  • assets/icons/linkedin.svg is excluded by !**/*.svg
📒 Files selected for processing (34)
  • assets/css/brand-palette.css
  • assets/css/casestudies.css
  • assets/css/content_override.css
  • assets/css/hero.css
  • assets/css/keyfeatures_override.css
  • assets/css/mailchimp.css
  • assets/css/members.css
  • assets/css/navbar-responsive.css
  • assets/css/news-banner.css
  • assets/css/quick-facts.css
  • assets/css/shell.css
  • assets/css/site-header.css
  • assets/css/styles_override.css
  • assets/css/tabs.css
  • assets/css/terminal.css
  • assets/css/typography.css
  • assets/css/vars_override.css
  • assets/css/webapps.css
  • assets/js/hero-stats.js
  • assets/js/navbar.js
  • config.yaml
  • content/en/about.md
  • layouts/_default/baseof.html
  • layouts/index.html
  • layouts/partials/css.html
  • layouts/partials/footer.html
  • layouts/partials/hero-stats.html
  • layouts/partials/hero.html
  • layouts/partials/navbar-clone.html
  • layouts/partials/navbar-cta.html
  • layouts/partials/navbar-social.html
  • layouts/partials/navbar-sublinks.html
  • layouts/partials/navbar.html
  • layouts/partials/news-banner.html
💤 Files with no reviewable changes (1)
  • assets/css/vars_override.css
✅ Files skipped from review due to trivial changes (3)
  • assets/css/members.css
  • content/en/about.md
  • assets/css/keyfeatures_override.css

Comment thread assets/css/hero.css

.hero-modern {
position: relative;
overflow: hidden;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Mobile stats can be clipped off-screen by parent overflow.

overflow: hidden on .hero-modern conflicts with mobile stats positioned at bottom: 0 plus translateY(100%), so the stats block can be cut off.

Suggested fix
 `@media` (max-width: 768px) {
   .hero-modern {
     padding: clamp(0.75rem, 1.5vh, 1.5rem) 1.25rem;
     min-height: min(28rem, calc(100dvh - var(--openms-hero-chrome)));
+    overflow: visible;
   }

Also applies to: 520-526

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@assets/css/hero.css` at line 16, The .hero-modern rule uses overflow: hidden
which clips the mobile stats block that is positioned with bottom: 0 and
transform: translateY(100%); change the overflow so the stats aren't cut off —
e.g., remove overflow: hidden or set overflow-y: visible (or use overflow-x:
hidden; overflow-y: visible) on .hero-modern, and apply the same fix to the
related rules around the mobile-stats styles referenced in the diff (lines
~520-526) so the absolutely-positioned/styled stats can render off the bottom
without being clipped.

Comment thread assets/css/mailchimp.css
Comment on lines +84 to 93
.sign-up-container .signup-button {
display: block;
height: 35px;
border-radius: 5px;
margin-left: 5px;
width: 60px;
color: black;
border:none;
outline:none;
border: none;
outline: none;
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Restore a visible keyboard focus style for the mobile signup button.

Line [92] removes the focus outline without adding an equivalent :focus-visible treatment in this rule block.

Proposed fix
 `@media` only screen and (max-width: 850px) {
   .sign-up-container .signup-button {
     display: block;
     height: 35px;
     border-radius: 5px;
     margin-left: 5px;
     width: 60px;
     color: black;
     border: none;
     outline: none;
   }
+
+  .sign-up-container .signup-button:focus-visible {
+    outline: 2px solid var(--openms-blue);
+    outline-offset: 2px;
+  }
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.sign-up-container .signup-button {
display: block;
height: 35px;
border-radius: 5px;
margin-left: 5px;
width: 60px;
color: black;
border:none;
outline:none;
border: none;
outline: none;
}
.sign-up-container .signup-button {
display: block;
height: 35px;
border-radius: 5px;
margin-left: 5px;
width: 60px;
color: black;
border: none;
outline: none;
}
.sign-up-container .signup-button:focus-visible {
outline: 2px solid var(--openms-blue);
outline-offset: 2px;
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@assets/css/mailchimp.css` around lines 84 - 93, The rule for
.sign-up-container .signup-button removes the default focus outline, which
breaks keyboard accessibility on mobile; restore a visible keyboard focus style
by adding a matching .sign-up-container .signup-button:focus-visible rule (or
:focus for broader support) that applies a clear, contrasty focus indicator
(e.g. outline or box-shadow and/or border color change) and keep the existing
border: none/outline: none only for pointer interactions if needed; update the
stylesheet to define .sign-up-container .signup-button:focus-visible with a
visible outline/box-shadow to ensure keyboard users can see focus.

#navbar-clone.navbar.is-fresh .navbar-menu .navbar-mobile-social svg.icon {
width: 1.5rem;
height: 1.5rem;
fill: currentColor;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify remaining value-keyword-case violations for currentColor
rg -n '\bcurrentColor\b' --type css

Repository: OpenMS/OpenMS-website

Length of output: 183


Fix Stylelint value-keyword-case by lowercasing currentColor

fill: currentColor; appears in:

  • assets/css/navbar-responsive.css:381
  • assets/css/styles_override.css:468
-    fill: currentColor;
+    fill: currentcolor;
Proposed fix
-    fill: currentColor;
+    fill: currentcolor;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
fill: currentColor;
fill: currentcolor;
🧰 Tools
🪛 Stylelint (17.12.0)

[error] 381-381: Expected "currentColor" to be "currentcolor" (value-keyword-case)

(value-keyword-case)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@assets/css/navbar-responsive.css` at line 381, Locate the CSS declaration
"fill: currentColor;" (occurs in the diff) and change the keyword to lowercase
so it reads "fill: currentcolor;"; update every occurrence (e.g., in
navbar-responsive and styles_override where that declaration appears) to satisfy
stylelint value-keyword-case.

Comment on lines +61 to +67
.news-banner__cta {
margin-left: 0.3rem;
font-size: 0.5rem;
font-weight: 600;
color: var(--openms-yellow);
white-space: nowrap;
transition: color 0.2s ease;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Increase CTA font size for readability.

0.5rem / 0.4375rem makes the CTA text extremely hard to read on many screens; this is an accessibility risk for a key interactive element.

Suggested fix
 .news-banner__cta {
   margin-left: 0.3rem;
-  font-size: 0.5rem;
+  font-size: 0.75rem;
   font-weight: 600;
   color: var(--openms-yellow);
   white-space: nowrap;
   transition: color 0.2s ease;
 }
@@
   .news-banner__cta {
-    font-size: 0.4375rem;
+    font-size: 0.6875rem;
   }

Also applies to: 96-98

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@assets/css/news-banner.css` around lines 61 - 67, The .news-banner__cta CSS
rule uses an unreadably small font-size (0.5rem / 0.4375rem); update the
font-size to a more accessible value (e.g., 0.75rem–0.875rem) in the
.news-banner__cta selector and make the same change for the repeated CTA rule
later (the other .news-banner__cta occurrences mentioned) so the CTA text is
consistently larger and readable across screens; keep
font-weight/color/whitespace/transition intact.

Comment thread assets/js/hero-stats.js
Comment on lines +17 to +20
var target = parseFloat(counter.getAttribute("data-count-value"));
var suffix = counter.getAttribute("data-count-suffix") || "";
var decimals = parseInt(counter.getAttribute("data-count-decimals") || "0", 10);
counter.textContent = formatValue(target, decimals) + suffix;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard invalid counter attributes before rendering.

Line 17 and Line 27 parse values without validation. Bad CMS/config data can render NaN (or fail formatting for invalid decimals). Add safe fallbacks before formatting/animating.

Suggested patch
   function setFinal(counter) {
-    var target = parseFloat(counter.getAttribute("data-count-value"));
+    var target = parseFloat(counter.getAttribute("data-count-value"));
+    if (!Number.isFinite(target)) target = 0;
     var suffix = counter.getAttribute("data-count-suffix") || "";
-    var decimals = parseInt(counter.getAttribute("data-count-decimals") || "0", 10);
+    var decimals = parseInt(counter.getAttribute("data-count-decimals") || "0", 10);
+    if (!Number.isInteger(decimals) || decimals < 0) decimals = 0;
     counter.textContent = formatValue(target, decimals) + suffix;
   }
@@
-    var target = parseFloat(counter.getAttribute("data-count-value"));
+    var target = parseFloat(counter.getAttribute("data-count-value"));
+    if (!Number.isFinite(target)) target = 0;
     var suffix = counter.getAttribute("data-count-suffix") || "";
-    var decimals = parseInt(counter.getAttribute("data-count-decimals") || "0", 10);
+    var decimals = parseInt(counter.getAttribute("data-count-decimals") || "0", 10);
+    if (!Number.isInteger(decimals) || decimals < 0) decimals = 0;

Also applies to: 27-30

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@assets/js/hero-stats.js` around lines 17 - 20, The code reads data-count
attributes directly and can produce NaN or invalid decimals; update the parsing
around the variables target, suffix and decimals (where parseFloat and parseInt
are used and where formatValue/animation are called) to validate and provide
safe fallbacks: use Number.isFinite(Number(...)) or isFinite to check parseFloat
result and default target to 0 if invalid, clamp decimals from parseInt to a
safe integer range (e.g., 0–10) and default to 0 if invalid, and keep suffix as
the empty string if missing; apply the same guards where those attributes are
parsed later (the lines referencing target/decimals for animation) so
formatValue and any animation never receive NaN or invalid decimals.

Comment thread config.yaml
Comment on lines +53 to +57
newsBanner:
enabled: true
label: News
text: Workshop at University of Helsinki on April 30th 2026.
link: /news/
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

News banner announces a past date.

With enabled: true, the banner currently advertises an event on April 30, 2026, which is already in the past as of May 26, 2026. Please update the text/date or disable the banner to avoid stale homepage messaging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@config.yaml` around lines 53 - 57, The newsBanner configuration is
advertising a past event; update the newsBanner block by either setting enabled:
false to hide the banner or updating text (and link if needed) to reflect a
current/future event and date; specifically modify the newsBanner.enabled and
newsBanner.text fields (and newsBanner.link if the destination changes) so the
site no longer displays the April 30th 2026 workshop as an active/newsworthy
item.

Comment on lines +16 to +18
{{- if lt (add $index 1) $statCount }}
<span class="hero-modern__stat-sep" aria-hidden="true">|</span>
{{- end }}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Avoid non-dt/dd/div children directly under <dl>.

Line [17] inserts a <span> directly under <dl>, which is invalid for definition list structure. Render separators with CSS pseudo-elements instead.

Proposed template-side adjustment
-  {{- if lt (add $index 1) $statCount }}
-  <span class="hero-modern__stat-sep" aria-hidden="true">|</span>
-  {{- end }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@layouts/partials/hero-stats.html` around lines 16 - 18, The template
currently injects a <span class="hero-modern__stat-sep"> directly under the <dl>
via the conditional that checks lt (add $index 1) $statCount; remove that span
output (delete the conditional block that renders hero-modern__stat-sep) and
instead implement the separator in CSS using a pseudo-element on the appropriate
child element (e.g., target the <dd> or <div> that represents each stat with a
selector like .hero-modern__stat-item:not(:last-child)::after) so separators are
rendered purely with CSS and no non-dt/dd/div children appear under the <dl>.

Comment on lines +5 to +10
<a href="{{ .link }}" aria-label="{{ .icon | humanize }}" target="_blank" rel="noopener noreferrer">
{{- if .icon -}}
{{- partial "svg-icon" .icon -}}
{{- else -}}
<span class="icon">ⓘ</span>
{{- end }}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Ensure each social link always has a non-empty accessible name.

When .icon is missing (Lines [8]-[9]), the current aria-label expression on Line [5] can be empty.

Proposed fix
 {{- range $socialMedia }}
-  <a href="{{ .link }}" aria-label="{{ .icon | humanize }}" target="_blank" rel="noopener noreferrer">
+  {{- $label := .icon | default "social media link" | humanize }}
+  <a href="{{ .link }}" aria-label="{{ $label }}" target="_blank" rel="noopener noreferrer">
     {{- if .icon -}}
     {{- partial "svg-icon" .icon -}}
     {{- else -}}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<a href="{{ .link }}" aria-label="{{ .icon | humanize }}" target="_blank" rel="noopener noreferrer">
{{- if .icon -}}
{{- partial "svg-icon" .icon -}}
{{- else -}}
<span class="icon"></span>
{{- end }}
{{- $label := .icon | default "social media link" | humanize }}
<a href="{{ .link }}" aria-label="{{ $label }}" target="_blank" rel="noopener noreferrer">
{{- if .icon -}}
{{- partial "svg-icon" .icon -}}
{{- else -}}
<span class="icon"></span>
{{- end }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@layouts/partials/navbar-social.html` around lines 5 - 10, The aria-label
currently uses "{{ .icon | humanize }}" which can be empty when .icon is
missing; update the aria-label expression on the anchor so it falls back to a
non-empty value (e.g., .title, .name, .link, or a literal like "Social link")
when .icon is falsy, and keep the existing visual fallback (the span with class
"icon" and the partial "svg-icon") as-is so the accessible name is always
present.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant