Commit Graph

13 Commits

Author SHA1 Message Date
popovskik 9812835d24 feat(press): add link-only press kit for Meet Student Slovenia 2026
Unlisted MK press kit for media covering the 4 Sept 2026 event: fact
sheet, ready-to-quote boilerplate, key messages, downloadable event
photos + logos, and info@ contact. Reuses _press.css with new press-kit
blocks (one-line hero title, centered CTAs, tightened fact columns,
photo download grid).

Keep it link-only: add an UNLISTED mechanism to tools/seo_inject.py so
the page gets robots=noindex,nofollow on every run and is excluded from
sitemap.xml (and not exposed in robots.txt). Without this the pre-commit
SEO injector would make the page indexable and list it publicly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-01 19:54:34 +02:00
popovskik e0ba30ea6a fix(a11y): activities tablist must contain only tabs
The "Become a member" CTA was a direct child of role="tablist", which
violates the ARIA rule that a tablist may only contain role="tab" children
(axe: aria-required-children). Wrap the 4 tabs in an inner
.activities-tabs[role=tablist] and leave the CTA as a sibling; add matching
flex CSS so the layout is unchanged. JS uses `.activities-nav .activity-tab`
(descendant), so tab behavior is unaffected. EN/MK/SI. Cache-bust bump.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-30 17:00:40 +02:00
popovskik abd9103500 feat(seo): add Google Preferred Sources button + footer link
New self-contained preferred-source.js (referenced site-wide via
seo_inject GA_LINES):
- small "Add us on Google" text link in the footer (.legal-links) on
  every page, trilingual, using the domain deeplink;
- Google's official interactive pill (publisher.js) on the homepage,
  News hub and Blog hub only, localized (en/mk/sl).
Lets readers mark MSOS as a preferred source (Top Stories / Discover /
News / AI surfaces). Cache-bust bump included.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-30 11:25:07 +02:00
popovskik be9df211a0 feat(consent): benefit-led banner copy + analytics-only consent
- Warmer, accurate trilingual cookie-banner text to lift voluntary
  opt-in (EN/MK/SI), keeping Accept and Decline equally one-click
  (GDPR-compliant, no dark patterns).
- grant() now grants analytics_storage only; advertising consent stays
  denied, matching what the banner discloses (MSOS runs no ads).
- Cache-bust bump so the updated consent.js is fetched.
  (Cookie-withdrawal link already present in footer via msosOpenConsent.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-30 10:53:02 +02:00
popovskik 616c48bc60 feat(analytics): add cookieless Cloudflare Web Analytics beacon
Adds the Cloudflare Web Analytics beacon to every page (injected in
GA_LINES alongside the GA tag). Cookieless and consent-free, so it
counts all visitors regardless of the cookie banner — complements GA4,
which only records consented sessions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-30 10:01:13 +02:00
popovskik 508cb79334 fix(seo): add endDate, performer, offers to Event structured data
Clears the 3 non-critical Events issues in Search Console
("Missing field endDate/performer/offers") across all /projects/
recap pages. These are free, single-day events, so endDate mirrors
startDate, performer is MSOS (host org), and offers is a zero-price
Offer. Generated centrally in tools/seo_inject.py and re-injected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-30 09:40:14 +02:00
popovskik 0a1971efad style(brand): unify orange to #FA7850 + yellow token; fix tablet header gap
Deploy to Production on Develop Push / deploy (push) Successful in 22s Details
- Brand orange is now the official #FA7850 everywhere: folded the stray
  oranges (#F2762E, #E8833A, #ff6b2c) into it and kept a single darker shade
  (#E85D2A) for gradient depth + button hover. Added the official brand
  --yellow (#FFE16E) token.
- Tablet header gap (769-1024px): the fixed header shrinks 80->60px there but
  first-section paddings kept their 80px clearance; pull the first section up
  by the 20px delta in that range only (phones untouched). Verified on
  interior pages and the full-bleed homepage hero — gap now matches desktop,
  no overlap.
- Re-stamped cache-bust (v=f95de694).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-27 20:48:50 +02:00
popovskik fd9df42995 style(qa3): design-token foundation + safe polish/a11y fixes
Deploy to Production on Develop Push / deploy (push) Successful in 20s Details
- Add :root design tokens in _typography.css (was empty) — brand teal/orange,
  ink/text greys, radius + type scale + section rhythm. Visually neutral;
  new rules can reference var()s instead of scattered literals.
- a11y: visible :focus-visible ring on header nav + dropdown links (keyboard
  users had none).
- Fix synthesized faux-bold: .route-report h1 800 -> 700 (Inter loads 400-700).
- Testimonials column: overflow-y scroll -> auto (no permanent scrollbar gutter).
- Lightbox image radius 6px -> 8px (matches the site rounding scale).
- Consistent card affordance: homepage .news-card now lifts on hover like the
  news-hub / blog cards.
- Re-stamped cache-bust (v=1f64b22f).

Deferred (needs a brand decision): unifying the two primary oranges
(#FA7850 vs #F2762E) and the fuller literal->token migration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-27 19:45:59 +02:00
popovskik 0052b38c1c fix(qa2): responsive Latest-news/FAQ at tablet + muted-text contrast sweep
Deploy to Production on Develop Push / deploy (push) Successful in 22s Details
- Latest-news row and FAQ grid now go 3 -> 2 -> 1 columns (added a 1024px
  tablet step); .news-card drops its brittle fixed 405.33px width and fills a
  responsive grid cell. Fixes cramped 3-across cards on 769-1024px.
- Contrast: replace #98A2B3 text color (2.58:1 on white) with the palette
  muted #667085 (~4.8:1) across 13 CSS files (31 text-color uses; borders/
  backgrounds untouched, verified none on dark backgrounds).
- Re-stamped cache-bust (v=6770822f).

Note: the ~20px-looser header top-gap at 769-1024px is left as a minor,
lower-risk follow-up (would need a coordinated multi-page padding pass).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-27 19:33:31 +02:00
popovskik c5bdb59a92 fix(qa): SI hero copy, footer width, form contrast + iOS input-zoom
Deploy to Production on Develop Push / deploy (push) Successful in 21s Details
From the QA audit — high-impact, low-risk fixes:
- SI homepage hero: replace leftover template boilerplate subtitle
  ("timski nabiralniki"...) and truncated badge with proper Slovene copy
  matching EN/MK.
- Footer: .footer-container was a hard width:1280px and got clipped by
  overflow-x:clip on 769-1279px screens; now width:100%; max-width:1280px.
- WCAG AA contrast: darken orange text (.article-publish-date, .mm-real-link)
  and the Ask-MSOS footer (.msa-foot) which were ~2.6-3:1 on white.
- iOS Safari focus-zoom: bump form/search/assistant inputs to 16px
  (.ms-field, .msa-input, .filterbar-search-field).
- Re-stamped cache-bust (v=9ff60d7a).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-27 19:18:17 +02:00
popovskik 954f186761 build: content-hash cache-busting for local CSS/JS (?v=hash)
Deploy to Production on Develop Push / deploy (push) Successful in 20s Details
Stops deploys being served stale from browser cache — the recurring "changes
do not show up until a hard refresh" problem.

- New tools/cache_bust.py stamps a global content hash onto every local
  <link>/<script> CSS/JS ref AND the @import lines in css/main.css (so partial
  edits bust too). External (https://) refs are untouched. Deterministic and
  idempotent: same content -> same stamp, any asset edit -> new stamp sitewide.
- Wired as the final step of tools/build_site.py so every build/deploy stamps.
- Initial stamp applied across 259 pages + main.css (v=64a53dd6).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-27 18:14:44 +02:00
popovskik 659f720e44 content(press): add MSOS president interview (YouTube) to 'In the media'
Add the interview 'Македонците се поврзуваат — интервју со лидерот на МСОС'
(youtube.com/watch?v=Vi6wzK9Zfwc) as the first item in the In the media list
on the EN/MK/SI press pages, with localized descriptions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-26 01:30:43 +02:00
popovskik 57a3ca187b Press: add /press/ page (EN/MK/SI) + footer link + coverage list
- New Press & media page in all three languages: press-enquiries contact,
  a 6-way logo download grid (EN/SI/MK x colour/white), an "MSOS at a glance"
  fact sheet (full legal name + preferred name), and a grouped coverage list
  (media, universities & institutions, official records, reference, government)
  with 29 verified third-party links, each described in EN/MK/SL.
- Styling in css/pages/_press.css (imported by main.css), on the site's tokens.
- Footer: added a "Press & media" link to the Organisation column on every page
  (all languages, relative paths correct for each page depth).
- SEO/sitemap refreshed so the new pages carry NGO schema + hreflang.

MK/SI copy is AI-drafted and pending a native proofread.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-07 23:35:49 +02:00