Commit Graph

208 Commits

Author SHA1 Message Date
popovskik f309a90e1f About Us hero: align overlaid title to the top (off people's faces)
Switch the hero content from vertical-centre to top-aligned so the title/text sit
in the upper background area of the rotating group photos instead of over faces.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:52:21 +02:00
popovskik 2d2e422372 About Us: overlay title on the hero images + rename nav item to "About Us"
- Rework the About Us hero so the eyebrow, title and description are overlaid on
  the auto-rotating team images (centred, white, text-shadowed) exactly like the
  landing hero, instead of sitting in a separate white band above them. Remove the
  old page-header band and move its text into the hero. All three languages.
- Rename the "Who We Are" menu item from "Our team" to "About Us"
  (MK "За нас", SI "O nas") across all pages; footer "About us" link unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:47:48 +02:00
popovskik 53ae93a813 docs: note the SEO regeneration step for new pages
Record in PRE-LAUNCH-TODO.md that new pages still need ARTICLE_DATES + a
seo_inject.py --all --sitemap run (the commit hook covers News/homepage/bot
sync but not SEO), so it isn't forgotten.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:39:04 +02:00
popovskik 3eef7a9314 Add pre-commit hook to auto-sync News/homepage/bot pages
Versioned hook at tools/git-hooks/pre-commit runs build_listings.py and
build_botlinks.py on every commit and stages their output, so the News hub,
homepage "Latest news", /llms.txt and /links-for-bots/ always reflect the actual
Blog/Projects/News content — no manual step. Non-blocking: warns and proceeds if
Python or a generator fails. Activated with `git config core.hooksPath tools/git-hooks`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:32:55 +02:00
popovskik cf3fce2522 Interconnect News hub + homepage with Blog & Projects (real sync)
Rewrite tools/build_listings.py to treat the Blog, Projects and News detail
pages as the single source of truth. It now regenerates:
  - the News hub grid (all items, newest first, correct dates from ARTICLE_DATES)
  - the homepage "Latest news" block (top 3)
both marker-wrapped. Previously the News hub was hand-maintained with drifted,
hardcoded dates and only some blog posts; now adding a blog/event and running
the script flows through to News and the homepage automatically.

Card links/images are root-relative so they work on any host.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:27:40 +02:00
popovskik e12724bbd1 Bot pages: use root-relative links so they work on any host
The generated /links-for-bots/ pages linked to absolute https://msosorg.com/...
URLs, which 404 when the site is served from another host (e.g. local dev, or
before this branch is deployed). Switch the pages' navigation links to
root-relative (/llms.txt, /en/..., /links-for-bots/...). Canonical tags stay
absolute (SEO) and llms.txt keeps absolute URLs (llmstxt.org convention).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:18:32 +02:00
popovskik ac052c2b09 Bot pages: expose them in the footer under a "For bots" column
Previously /llms.txt and /links-for-bots/ existed but were not linked anywhere,
so users/bots couldn't find them. Following Proxify's pattern, add a "For bots"
footer column (all 225 pages, EN/MK/SI) linking to category link lists and an
AI summary page.

build_botlinks.py now also generates:
  /links-for-bots/blog|guide|projects/   per-section link lists (EN/MK/SI)
  /links-for-bots/about-msos/            "Hey AI, learn about us" summary
  /links-for-bots/  hub  +  /llms.txt

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:12:04 +02:00
popovskik b79ad2d0de Project pages: add ToC sidebar to all remaining articles (EN/MK/SI)
Give the 23 project pages that used a single-column layout the same scrollspy
table-of-contents sidebar as the others (built from their <h2> sections, with
language-agnostic section-N ids so it works for Cyrillic too), plus the mobile
ToC header. The "Like what we do?" sidebar CTA now sits under the ToC on every
non-memorial project page; the two memorial stories get the ToC but no CTA.
The full-width bottom CTA remains the mobile fallback.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:01:17 +02:00
popovskik 7c52f30e3b Project pages: move membership CTA into the ToC sidebar (Proxify-style)
Add a compact "Like what we do?" CTA box directly below the table of contents
in the left sidebar. The ToC already scrolls internally when long, so the box
stays pinned in the same visual field. The full-width bottom CTA is hidden on
desktop where a sidebar CTA exists (via :has()) and remains the mobile fallback.

Applied to the 4 project pages that have a ToC sidebar; the others (all MK/SI +
3 EN) have no sidebar and keep the bottom CTA.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 17:55:27 +02:00
popovskik d75dbc1edd Blog: add personal essay "How I coped with leaving home" (trilingual, prose)
Publish Vasil Handziski's personal essay in MK (original) with EN/SI AI-drafted
translations. Adds a prose article variant (no scrollspy sidebar, centred column,
custom byline) via .article-page--prose, plus blog index cards in all languages.
Converter now omits the "last checked" line when empty.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 17:37:14 +02:00
popovskik ae3f5e30c9 Blog: publish trilingual post 5 "Welcome Days" (EN/SI/MK)
Build the Welcome Days article in all three languages from the multilingual
source (# English / # Slovenščina / # Македонски sections + shared sources),
no machine translation. Date registered, SEO injected. Cards already existed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 17:29:03 +02:00
popovskik 3fed4db226 Blog: post 6 "Accommodation" now trilingual (MK/SI AI-drafted)
Add Macedonian and Slovenian versions of the accommodation post (AI-drafted,
flagged for native review), rebuild EN with a proper Student Welcome Guide link
and a real Sources section, and add MK/SI blog index cards. Converter now treats
a secondary "# Sources" heading as a section.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 17:26:32 +02:00
popovskik c7481ca998 Blog: publish trilingual posts 2-4 in EN/MK/SI from source content
Build full articles for "Learning Slovene", "Study in North Macedonia
(government scholarship)" and "Ad futura scholarship" in all three languages,
split from the trilingual Markdown sources (no machine translation). Dates
registered in ARTICLE_DATES and SEO re-injected per page. Blog index cards for
these already existed and now point to real content instead of stubs.

Hero images are placeholders pending topical photos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 17:16:17 +02:00
popovskik 9d53216b08 Blog: add markdown->page converter + new post "Where to search for accommodation" (EN)
tools/build_blog.py converts a Markdown source into the site's scrollspy blog
article (title, header, hero, sidebar nav from ## headings, body). First output:
the new EN post "Where to search for student accommodation in Slovenia", added at
the top of the blog index (newest first), dated 2026-08-03, SEO injected.

MK/SI of this post and the rest of the blog batch (refresh 1-5, split trilingual
posts 2-4, personal essay post 7) still to come.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 17:09:09 +02:00
popovskik 0bbc06c6bc changes.txt #9.2 & #9.4: team hero + members/friends appreciation
#9.2 Full-width auto-rotating team hero (crossfade every 4.5s, transparent blue
overlay) directly under the About Us title — 11 landscape photos supplied by MSOS.

#9.4 "Our members & friends" appreciation section after Mission & Vision: a
contained photo carousel + name chips. Photos and names are PLACEHOLDERS
(names in "First L." format) pending the full members list.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 16:41:28 +02:00
popovskik 195a48205c changes.txt #6: sync homepage "Latest news" from the News hub
Add tools/build_listings.py: copies the top 3 cards from each language's News
hub into the homepage "Latest news" block (marker-wrapped), so editing the News
page now updates the homepage. The News hub stays the hand-edited source of truth
(it may hold curated teaser cards without a detail page).

Also: fix the Gallery meta description (was a copy of the FAQ text) and add a
durable gallery override to seo_inject.py; refresh llms.txt / links-for-bots.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 16:20:55 +02:00
popovskik c14a227ac7 changes.txt #2: AI/crawler discovery files (llms.txt + links-for-bots)
Add tools/build_botlinks.py which regenerates, from the pages already on disk:
- /llms.txt          llmstxt.org-style Markdown index (English, with descriptions)
- /links-for-bots/   a lightweight fully-linked crawl hub covering EN/MK/SI

Re-run `python tools/build_botlinks.py` after adding or removing pages; it only
reads each page's <title> and meta description, so it stays current automatically.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 16:10:38 +02:00
popovskik 5abda945ed changes.txt #10: informative disclaimers (footer, guide, legal)
- Footer disclaimer on every page (informative-only, verify with official sources)
- "Good to know" callout across all Student Welcome Guide pages, pointing to
  the "Was this page helpful?" box for reporting errors
- "Website content & liability" disclaimer card on the Official information page
All three languages (EN/MK/SI).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 16:04:30 +02:00
popovskik 5e18020066 changes.txt Batch 1: nav, hero, gallery, project CTA, discl. groundwork
- #9.1 Reorder "Who We Are" nav to Our team, Timeline, MSOS Hub (all 225 pages)
- #4  Fix MK "Ask MSOS" label to "Прашај го МСОС"
- #11 Landing hero overlay -> radial blue vignette (lighter centre)
- #3  Gallery cards show the event date under the title (DD.MM.YYYY)
- #1  Membership/support CTA at the end of project pages (memorials excluded)
- #8  "Illustrative image" tag on blog/news photo captions
- #9.3 Mission & Vision: full-width gradient band + more space above title

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 15:54:33 +02:00
popovskik bec7e26dd4 Add four new blog articles + blog listing/styling updates
New posts (Ad futura scholarship, learning Slovene, welcome days,
study in North Macedonia) across EN/MK/SI, plus blog index and _blog.css
updates. (Also carries the site-wide nav reorder and the illustrative-image
caption tag on the bank-account post.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 15:54:17 +02:00
popovskik 4c27ebb105 Carousels: drag + position dots, and real Become-a-member photos
Convert the Hub / Become-a-member carousels from a pure-CSS marquee to a
JS-driven scroller with click-and-drag, touch swipe, and progress dots
(setupHubCarousel). Turn the "ways to be part of MSOS" cards into hub-style
photo cards and add the final Become-a-member photos (WebP).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 15:54:06 +02:00
popovskik a7782eb28f Turn membership "ways to join" grid into Hub-style slider
Convert the fixed 6-card grid in the "There is more than one way to be
part of MSOS" section into the Hub's auto-scrolling marquee, reusing the
existing .hub-carousel mechanics with icon-based gradient cards. Applied
across EN/MK/SI.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 12:50:39 +02:00
popovskik 764cf1ee66 Add real Hub photos to msos-hub sections
Replace the temporary placeholder images in the "What you can do here"
and "A glimpse of the space" sections with the final Hub photos
(converted to WebP) across EN/MK/SI, and drop the placeholder notes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 12:50:28 +02:00
popovskik db1fa813c2 Merge pull request 'Student Welcome Guide photos + Macedonian proofreading corrections' (#14) from kristijan-dev into develop
Deploy to Production on Develop Push / deploy (push) Successful in 13s Details
Reviewed-on: #14
2026-08-04 12:53:28 +00:00
popovskik 30bc83e064 content(MK): apply proofreading corrections from owner + rename header menu
Applies the corrections from "msos web corrections.docx" across 6 Macedonian
pages, plus two global fixes, plus matching English tweaks.

Per-page (MK):
- Landing: hero eyebrow/subtitle, story section, testimonials, FAQ block
- About us / Our team: "Раководен тим" -> "Управен одбор", team names to
  Cyrillic, Marko's title, removed duplicate top gradient + added spacing,
  fixed the broken "Still have questions" footer to match the landing page
- MSOS Hub: title widow (nbsp), hub descriptions
- FAQ: intro + 9 answer corrections (also fixed leftover English fragments)
- Become a Member: card label, removed stats note, consistent "ти" voice,
  Cyrillic names, form step + success text
- Support: title, subtitle, community section, support options

Global (all MK pages): header menu "Нашиот тим, мисија, визија и вредности"
-> "Нашиот тим"; напатница -> напотница. Visible punctuation dashes changed
to commas per owner preference.

English: testimonials section (en/index.html) and two document answers
(en/faq) updated to match.

Adds docs/MK-PROOFREADING.md (6 proofread, 63 remaining of 69 MK pages).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 13:13:04 +02:00
popovskik b1a2a62f1b content: add real photos + captions to all Student Welcome Guide pages
Replace the "Image placeholder" boxes on all 30 guide subpages + the guide
landing hero with real, optimized photos and captions, EN/MK/SI (93 figures).

- 31 source photos (up to 18 MB) optimized to WebP (<=1400px, all <500 KB)
  as images/guide-<slug>.webp.
- Captions follow the Get-to-Know style: description + "Photo:/Фото:/Foto:"
  + linked source (or MSOS for own event photos). Photographer credits kept.
  MK/SI descriptions are translated (proofread welcome).
- CSS: move the banner crop from the figure onto the <img> so the caption
  shows below it (was clipped by the figure's fixed height + overflow).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 12:58:45 +02:00
popovskik 4721b3cc75 docs: master pre-launch to-do list (paused before go-live)
Consolidates outstanding items so nothing is lost during the pause: domain
decision, content placeholders, MK/SI proofread, GA4 setup, plus a record of
what's already hardened. Dev-only doc (docs/ excluded from deploy).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 10:56:58 +02:00
popovskik c092e65ae0 Merge pull request 'security: enforce Content-Security-Policy' (#13) from kristijan-dev into develop
Deploy to Production on Develop Push / deploy (push) Successful in 12s Details
2026-08-04 08:48:52 +00:00
popovskik 9877b4bbd6 security(.htaccess): enforce Content-Security-Policy (was report-only)
Switch CSP from Report-Only to enforcing, with an allowlist verified in a
browser against a server sending this exact header (0 violations across the
homepage, a YouTube project page, the assistant, MailerLite JSONP, GA/gtag,
and the Google Forms endpoint).

Adds the sources the old report-only policy was missing (and would have
broken if enforced blindly): Google Fonts (style/font), Font Awesome cdnjs
(style/font), MailerLite newsletter (script/connect), the Google Forms
endpoint in connect-src, plus object-src 'none'. Keeps 'unsafe-inline' for
the in-<head> consent bootstrap; the host allowlists + form-action/base-uri
are the real hardening on top of existing output escaping.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 10:48:23 +02:00
popovskik 15624454e8 Merge pull request 'security: force HTTPS + HSTS' (#12) from kristijan-dev into develop
Deploy to Production on Develop Push / deploy (push) Successful in 12s Details
2026-08-04 08:39:59 +00:00
popovskik 0c07b05b1f security(.htaccess): force HTTPS + add HSTS
- Redirect all plain-http requests to https (double condition guards against
  a redirect loop behind a TLS-terminating proxy).
- Add Strict-Transport-Security (6-month max-age, no preload/includeSubDomains
  so it stays easy to adjust) so browsers refuse http after the first visit.

Closes the "HTTPS everywhere" gap: previously http:// served in the clear.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 10:37:37 +02:00
popovskik 77dc3ae940 Merge pull request 'HOTFIX: restore live site (revert cross-domain redirect that 404'd)' (#11) from kristijan-dev into develop
Deploy to Production on Develop Push / deploy (push) Successful in 13s Details
2026-08-04 00:09:43 +00:00
popovskik f30c9c6155 hotfix(.htaccess): stop cross-domain redirect that 404'd the live site
The earlier "canonical domain" redirect forced msos.spletnimojster.si (where
the site is actually served) to msosorg.com, which does NOT yet host these
files — so every page 404'd. Replace it with a host-relative root -> /en/
redirect so the live domain serves the site again. A canonical-host redirect
can be re-added once msosorg.com is pointed at this same docroot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 02:08:37 +02:00
popovskik a7dceb4f7b Merge pull request 'Pre-launch: security + health + a11y hardening & offline Ask MSOS assistant' (#10) from kristijan-dev into develop
Deploy to Production on Develop Push / deploy (push) Successful in 18s Details
Reviewed-on: #10
2026-08-04 00:02:42 +00:00
popovskik 55bc101410 feat(assistant): one-time disclaimer note + GA4 question-report guide
- Add a subtle disclaimer under the greeting (EN/MK/SI): "automated guide,
  can make mistakes — check the linked page for official steps." Shown once,
  not on every message, so it sets expectations without clutter. Persistent
  footer disclaimer stays.
- docs/GA4-ASSISTANT-REPORT.md: step-by-step for registering the custom
  dimensions and building the "top questions" + "unanswered questions"
  explorations in GA4 (dev-only doc, not deployed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 01:57:55 +02:00
popovskik 661943bb34 feat(assistant): v2 — query-language detection, analytics, chips, auto-index
Addresses real gaps found in testing (a Macedonian question on an English
page returned nothing):

- Detect the language of the QUESTION (Cyrillic -> MK; Slovene markers -> SI;
  else the page language) and load that language's index + curated answers.
  Fixes cross-language questions.
- Expand curated multilingual intents (now incl. enrolment/eVŠ, deadlines,
  health, "what is MSOS", etc.) with stem keywords for better paraphrase
  matching. MK/SI answers machine-drafted — proofread before launch.
- Suggested-question chips on open (localized) to guide users.
- Privacy-safe analytics: fire a GA4 'assistant_query' event ONLY after the
  visitor accepts cookies (q text, result type, question vs page language) so
  the team can see real FAQs and unanswered questions.
- Move the widget to bottom-left on pages with the floating "Become a member"
  CTA so they never overlap. Design polish (chips, typing dots, launcher pulse).
- CI: rebuild the search index on every deploy (setup-python + build script)
  so the assistant stays in sync with content automatically. Build script is
  now path-portable (no hardcoded path).

Verified in a headless browser: MK-on-EN now answers correctly, chips work,
analytics event fires only with consent, become-a-member offset applies,
zero console errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 01:48:39 +02:00
popovskik f7f297bd65 feat: offline in-browser "Ask MSOS" assistant (no API, zero cost)
A privacy-friendly help widget that answers visitor questions from the
site's own content and links to the full page — runs 100% in the browser,
no API, no server, no per-token cost.

- tools/build_search_index.py: parses every EN/MK/SI page into ~720
  heading-level chunks per language -> assistant/index-<lang>.json
  (lazy-loaded only when the chat is opened; gzips to ~80 KB).
- assistant.js: dependency-free BM25 search + multilingual stopword
  filtering + a curated short-answer layer for common questions, plus an
  accessible chat widget (role=dialog, keyboard, aria). CSP-safe (self only).
- assistant.css: scoped .msa-* styles in the site's teal palette;
  responsive (full-screen panel on mobile).
- Injected on 208 pages (blog WIP excluded; picks it up when that lands).

Verified in a headless browser across EN/MK/SI: curated answers, search
fallback with correct ranking (rare terms win), correct deep links,
Cyrillic + Slovene diacritics, and zero console errors. Curated MK/SI
answers are machine-drafted — proofread before launch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 01:29:22 +02:00
popovskik cca6fd18aa fix: remove unwired "Play video" button from homepage (en/mk/si)
The homepage "Every Student Has a Story" section had a <button class=
"play-button"> with no handler and no video wired to it — clicking did
nothing. Remove the dead button; keep the team photo and section copy.
The story video can be wired back in later.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 01:00:44 +02:00
popovskik c4da5de491 a11y: make mobile menu toggle keyboard & screen-reader accessible
The mobile hamburger is a <div class="mobile-menu-icon"> with a click
handler, so it worked on tap but was invisible to keyboard and screen-reader
users. Expose it as a button in main.js: role="button", tabindex="0",
aria-label, aria-expanded toggling, and Enter/Space activation. Verified in
a headless browser (focusable, Enter opens, aria state flips).

Also adds docs/PRE-LAUNCH-CHECKLIST.md (dev-only, excluded from deploy):
inventory of remaining content placeholders for the public launch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 00:57:27 +02:00
popovskik 9ce7450aa1 health: fix broken pages, add image dimensions, a11y & SEO wins
Site-wide health pass (excludes in-progress blog work). Verified with a
local server + headless browser: Timeline, homepage and gallery pages load
with zero console errors and no layout distortion.

Render bugs
- Timeline page (en/mk/si): fix ../../../ paths that overshot the site root,
  so the main stylesheet and hero image load again.
- Meet Student Slovenia 2023 (en/mk/si): remove a <figure> referencing
  event3-photo-11.png, an image that was never uploaded (broken image).

Performance
- Add intrinsic width/height to 1039 raster <img> tags to prevent layout
  shift (CLS); 450 SVGs correctly skipped. Add a global
  `img { max-width:100%; height:auto }` safety net so aspect ratio is
  preserved and images never overflow.
- Preload the homepage hero (LCP) image on en/mk/si.
- Load Font Awesome non-blocking (media=print/onload swap) with a <noscript>
  fallback, on 225 pages.

Accessibility
- Add aria-label to 57 unlabeled newsletter email inputs.
- Add an sr-only <h1> to the three "My Route" pages (had no h1).
- Add an .sr-only utility class.

SEO
- Add meta descriptions to legal/msos-hub/support pages (en/mk/si).

Note: MK/SI meta descriptions are machine-drafted and should be proofread
by a native speaker before considering them final.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 00:31:27 +02:00
popovskik 168e4ce378 security: harden static site (headers, exposed-file cleanup, privacy)
Proactive security & health pass. No live/exploitable vulnerabilities were
found; these changes remove information-disclosure surfaces and add
standard hardening.

- Remove publicly-downloadable 1.1 MB full source dump (code_export.txt)
  and stray empty l.php; add code_export.txt to .gitignore.
- Exclude dev files/folders (*.sh, *.py, docs/, templates/, tools/,
  README.md) from the rsync deploy so they never reach the live server.
- .htaccess: add X-Frame-Options, Referrer-Policy, Permissions-Policy,
  and a report-only Content-Security-Policy; add defense-in-depth deny
  block for dev/VCS files (robots.txt & sitemap.xml left served).
- .htaccess: fix root redirect to canonical msosorg.com + /en/.
- Swap 4 project-page YouTube embeds to youtube-nocookie.com so no
  Google cookies are set before consent (GDPR).
- Add rel="noopener" to 30 team social links on the About Us pages.
- Harden esc() in my-route.js to also escape single quotes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 23:56:48 +02:00
popovskik c2b1b6eb5a Content cleanup: fix unclosed tags, remove em/en dashes, verify translations
- Fixed 3 SI event posts that were missing their </article> and </main> tags
- Replaced all punctuation em-dashes and spaced en-dashes (435 across 64 files)
  with commas; normalized a SI date range to a hyphen to match EN/MK
- Verified the new Gallery + in-post gallery content is fully translated in
  EN/MK/SI (headings, titles, links, nav labels) with no English leftovers

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 15:46:50 +02:00
popovskik ea1afcd6ae Merge pull request 'Hub redesign, Gallery, per-language logos, footer/menu fixes + mobile polish' (#9) from kristijan-dev into develop
Deploy to Production on Develop Push / deploy (push) Successful in 6s Details
Reviewed-on: #9
2026-08-03 13:38:56 +00:00
popovskik 9edd6daa52 Roll out "Photos from the event" gallery to all event posts (EN/MK/SI)
- Added the reusable lightbox gallery block to all 9 event posts in every
  language (27 pages): shows 5 thumbnails + "+N more", opens the full-screen
  viewer with the whole photo set
- Inserted inside <article> (before the author footer where present) so it
  never breaks the sidebar/article flex layout
- Handled 3 SI posts that were missing their </article> tag by anchoring on
  the newsletter section instead

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 15:24:37 +02:00
popovskik 1f5e031be9 In-post event gallery block + lightbox; mobile polish
- Reusable "Photos from the event" grid (shows 5 thumbnails + "+N more") that
  opens a full-screen lightbox (arrows / keyboard / swipe / Esc); added to the
  Meet Student Slovenia 2024 post as the pattern
- New css/components/_lightbox.css + setupLightbox() in main.js (injects one
  shared overlay, wires any .js-lightbox grid)
- Mobile polish: gallery albums go single-column on phones, two on tablets;
  event-gallery grid 3-up on mobile; lightbox sizing/controls tuned for small
  screens

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 15:16:28 +02:00
popovskik 24c77e6171 Gallery: distinct album cards, blue tint, hover lift, whole card links to story
- Each album is now a bordered card with a resting shadow and clear separation
- Blue brand tint over the cover photos; fades on hover so images brighten
- Whole card lifts with a stronger shadow on hover (album-level, not per image)
- Clicking anywhere on a card opens the event story page (removed the lightbox)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 14:49:28 +02:00
popovskik d048226daf Redesign gallery as Pinterest-style album collage cards
- Each album is now a compact collage card (1 large + 2 small photos) with a
  "+N" overlay on the last tile; multiple cards per row (responsive grid)
- Title + photo count + "Read the story" link under each card
- All album photos remain in the DOM (hidden) so the lightbox still browses
  the full set; clicking any tile opens the lightbox at that photo

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 14:43:04 +02:00
popovskik d085e3376a Add Gallery page (per-event albums + lightbox); remove video-thumbnail blur
- New multilingual Gallery page (en/mk/si) with 9 event albums and a
  keyboard-accessible lightbox (prev/next scoped per album)
- Reuses existing event photos; links each album to its event post
- New css/pages/_gallery.css + setupGallery() lightbox in main.js
- "Gallery" link added to the "What We Do" nav (desktop + mobile) site-wide
- Gallery URLs added to sitemap.xml with hreflang
- Landing "Every Student Has a Story": removed backdrop blur on the video
  thumbnail, kept the bluish gradient tint

Note: images/original/ (458 MB of raw source photos, gitignored + unused by
the site) moved out of the working tree to reclaim disk.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 14:28:53 +02:00
popovskik f5dfd8830e Hub redesign, per-language logos, partner carousel, footer + menu fixes
MSOS Hub page:
- "What you can do here": Porsche-style vertical image cards in a
  continuous auto-scrolling marquee with edge fades (real photos placeholders)
- "A glimpse of the space": full-bleed band of 4 connected photos
- "A space we built together": full-bleed image banner with blue gradient overlay
- "Made possible by": partner logo tiles (Cultural Association + Ministry);
  processed Ministry + Cultural Association logos from source art
- Copy/spacing polish; removed em-dashes; larger section spacing; deeper
  final-CTA gradient so it no longer blends into the footer

Branding / partners:
- Per-language MSOS logos (SVG) in header + footer across all pages
- Partner carousel: added Ministry (wide variant), Cultural Association,
  Embassy of North Macedonia, and Spletni Mojster (width-capped); de-duplicated
  logos within each marquee group so new logos appear sooner

Footer:
- Build credit line (Spletni Mojster + Kristijan), clean centered text
- Synced MK/SI footers to EN (added missing About us + Timeline links)

Landing page:
- FAQ short CTA already avatar design (FAQ page kept its Email/Viber block)
- Swapped blurry stock video thumbnail for the real team photo
- Removed the intentional hero-background blur

Navigation:
- Mobile menu: use 100dvh so the language selector is reachable with submenus open
- Desktop: dropdown parents no longer navigate to dead "/#" links

Language suggestion banner:
- Dismissible, browser-language based banner suggesting the matching locale;
  remembers choice in localStorage and waits for the cookie-consent choice
  to avoid overlapping the consent card

Removed stale *.html.bak backup files.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 14:06:53 +02:00
popovskik 8a32c10273 Merge pull request 'Policy accuracy (GA/consent), dual contact email, footer dedup' (#8) from kristijan-dev into develop
Deploy to Production on Develop Push / deploy (push) Successful in 6s Details
Reviewed-on: #8
2026-08-03 08:39:13 +00:00