Commit Graph
100 Commits
Author SHA1 Message Date
popovskikandClaude Opus 4.8 da3acbff5e fix(guide): spell out abbreviated deadline months in SI/EN tables
Mirror the Macedonian reviewer's date fix to Slovenian and English: expand
feb/mar/sep... to full month names inside the deadline table cells on
application-deadlines, bachelor- and master-application (SI + EN).
Replacement is scoped to <td> cells to avoid touching words like SI 'nov'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-26 01:29:59 +02:00
popovskikandClaude Opus 4.8 5863c295b7 Merge origin/develop into feat/no-code-cms
Bring CMS/event branch up to date with develop. Net incoming change is the
CI deploy runner config (install rsync/openssh); all other develop history
was already present via shared kristijan-dev lineage.

Meet Student Slovenia 2026 remains on this branch only (unpublished).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-25 22:58:51 +02:00
popovskikandClaude Opus 4.8 c2a7724b0c chore(assistant): rebuild search index after content update
Regenerate assistant/index-{en,mk,si}.json to reflect real event photos
and Latinized titles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-25 22:28:05 +02:00
popovskikandClaude Opus 4.8 a963aade36 content(projects): swap event placeholders for real photos + copy cleanup
Replace event-placeholder.svg with real .webp photos across all 2025-2026
event/project pages (EN/MK/SI), updating OG/Twitter/JSON-LD image refs,
inline article images, and content/events/*.md. Also Latinize EN/SI titles
(e.g. "Kafanska večer") and drop empty "In numbers" TOC sections.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-25 22:25:26 +02:00
popovskikandClaude Opus 4.8 dc7b8b6809 content(projects): add 7 events/projects (2025-2026) with photo placeholders
Add trilingual (EN/MK/SI) event pages for seven MSOS activities:
- Joint Walk "Path Around the Wire" (May 2025)
- Kafanska vecher (May 2025)
- Watching the Macedonia-Wales match (Nov 2025)
- Team-building and MSOS Hub opening (Feb 2026)
- SEPA webinar with the National Bank of RNM (May 2026)
- President Siljanovska-Davkova lecture at UL (May 2026)
- Morning Coffee in front of CTK, 4th edition (Jun 2026)

Each page uses a neutral placeholder image (images/event-placeholder.svg)
in every hero/inline/gallery slot, with captions describing the intended
photo so real images can be dropped in later. Pages follow the existing
event template (narrative sections + scrollspy + photo gallery); no
"At a glance" classification box.

Wires the events into the Projects hub (filter cards), News hub, sitemap,
bot-discovery files and the offline search index. Unrelated pages were
kept out of this commit to avoid build-tool encoding churn.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 17:58:04 +02:00
popovskikandClaude Opus 4.8 f66db9873f content(guide): clarify visa D vs residence permit and residence application routes
Update the Student Welcome Guide residence pages (EN/MK/SI):

- visa-and-residence-explained: clarify that visa D mainly applies to
  study exchanges (e.g. Erasmus, up to one year) and is handled only by
  the embassy, while degree students use the temporary residence permit
  decided by the administrative unit (a permit, not a "visa").
- where-to-apply-for-residence: explain that the embassy only forwards
  the application to the administrative unit (slower, costlier); present
  applying directly at the administrative unit as usually faster and
  cheaper with the same documents; replace vague checklist prompts with
  concrete facts (appointment contact, standard document list, official
  Slovenian translation, certification, criminal-record recency, fees);
  keep the cautious lawful-stay wording and add a warning about leaving
  Slovenia while the application is pending.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 16:33:29 +02:00
popovskikandClaude Opus 4.8 af294ce8a4 chore: stop tracking compiled .pyc bytecode
These auto-generated Python caches were committed before .gitignore
listed __pycache__/ and *.pyc, so Git kept tracking them and they showed
up as spurious changes on every build. Untrack them (files stay on disk)
so .gitignore takes effect and they no longer appear in diffs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 08:17:17 +02:00
popovskikandClaude Opus 4.8 7bd85c11a0 feat(event): add print/PDF export styles for event pages
Add a @media print block so event pages export cleanly to PDF/print:
keep faithful colours (print-color-adjust: exact), unstick the header,
hide screen-only chrome (chat bubble, cookie consent, sticky CTA, back
link, newsletter box, mobile nav), and reset the hero image to full
width. No effect on the on-screen layout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 08:16:04 +02:00
popovskikandClaude Opus 4.8 027a888539 fix(news): style Sources lists with guide-linklist across articles
The Sources sections on the Welcome Days, accommodation-search and
Ad futura scholarship articles used bare <ul>/<ol> lists, which rendered
as default bullets/numbers with plain blue links instead of the site's
standard source-list style (chain icon, teal links, row dividers).

Add class="guide-linklist" to the Sources lists (converting Ad futura's
<ol> to <ul>) in the content/ source markdown and the generated en/mk/si
pages, matching the Student Welcome Guide. Edits scoped to the affected
articles to avoid unrelated build-tool reformatting churn.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 07:44:09 +02:00
popovskikandClaude Opus 4.8 09dbeb2bc7 fix(home): restore homepage event banner styling
The .event-banner rules were dropped during an _event.css rewrite, so the
homepage promo banner rendered unstyled (full-width dark text, no gradient).
Restored the banner styles and removed the em-dash from the banner copy.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-20 23:40:01 +02:00
popovskikandClaude Opus 4.8 954dfb4d7d feat(event,support): refine event page + add supporter form to Support page
Event page (Meet Student Slovenia 2026):
- Guide-style centred header with wide banner hero and caption
- Key facts on a plain background: When/Where side by side, subtle
  live-stream line, centred Register CTA, full-width note
- Partner logos (NLB patron, Embassy support) + sponsor
  Kapital Aset Menadžment DOOEL / Капитал асет менаџмент ДООЕЛ
- Inline photos between sections; em-dash removed from the subtitle
- "Support MSOS" call-out linking to the support page

Support page:
- Added the become-a-member supporter flow (supporter path only) via a
  new data-only-flow="supporter" mode in member-form.js; submits to the
  same combined Google Form tagged type=supporter
- Hero "Become a partner" button now scrolls to the form
- .ms-section carries its own brand vars so the form renders off the
  member page

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-20 23:35:43 +02:00
popovskikandClaude Opus 4.8 270df5b2f8 feat(news): add Meet Student Slovenia 2026 event page
Trilingual (EN/MK/SI) promo page for the upcoming "Meet Student Slovenia
2026" event, built through the content CMS (content/news/...) plus custom
sections styled to match the site.

- Guide-style centred header with a wide banner hero and caption
- Plain-background key facts (When/Where), subtle live-stream line,
  centred Register CTA, and partner/patron/sponsor logos
  (NLB Banka, Embassy of Slovenia; Capital Financial Center as text)
- Auto-scrolling "Moments from previous years" carousel + inline photos
- Embedded registration form (dropdowns, required study-plan fields,
  multi-field study preferences) wired to a Google Form; left-hand
  floating Register button
- Homepage promo banner (EN/MK/SI) + auto-listed in News hub, homepage
  latest, sitemap, llms.txt and the offline search index
- New assets: css/pages/_event.css, event-register.js

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-20 22:46:09 +02:00
popovskikandClaude Opus 4.8 2d535db7d5 feat(cms): U4 one-command site build + local preview
Add tools/build_site.py: runs the full pipeline in dependency order
(build_content -> build_listings -> seo_inject --all --sitemap ->
build_botlinks -> build_search_index), each as a subprocess so a failing
step aborts the build before anything downstream runs (no partial
deploy). --check verifies non-destructively; --images also runs
optimize_images. This is what CI will run in U5.

Fix a build_content idempotence bug found via U4: the hero and
article-header regions were emitted with leading indentation while the
regex left the template's pre-tag whitespace in place, so indentation
compounded (+16 spaces) on every rebuild. First line is now unindented;
the full build is verified idempotent (identical git tree across two
runs). Added a fixpoint test (re-rendering a page's own output is
byte-identical) so this can't regress.

docs/local-preview.md: build + serve on :8000 in all three languages.
tools/README.md: document build_site + build_content.

26 tests pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-08 17:04:00 +02:00
popovskikandClaude Opus 4.8 8ff968739a feat(cms): U3 derive article dates from content/ front-matter
Replace the hand-maintained ARTICLE_DATES registry as the source of
truth with dates read from content/ front-matter, so publishing a post
via the CMS needs no manual registry edit (plan R4).

- tools/content_index.py: load_dates() reads content/ front-matter into
  {source_folder/slug: {published|modified: iso}}. Standalone (os+yaml),
  no import cycle with seo_inject.
- tools/seo_inject.py: ARTICLE_DATES is now {**static_fallback,
  **content_dates}; content wins. The static table is kept only as a
  fallback for entries not present in content/.
- migration now preserves the published-vs-modified distinction
  (date_type), so the switch is byte-identical: content-derived dates
  equal the old static table exactly (17/17, incl. the one 'modified').

Verified: full `seo_inject --all --sitemap` + build_listings +
build_botlinks run produces ZERO changes to any site page. build_content
--check still reproduces all 51 pages.

build_botlinks.py needs no change (it scrapes built pages, which are a
pure function of content/). Listings get content-driven dates for free
via seo_inject.ARTICLE_DATES.

tools/tests/test_content_index.py: 5 tests (dates == legacy registry,
merged registry unchanged, published/modified distinction, events key on
projects/<slug>, one ISO date per entry).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-08 16:47:03 +02:00
popovskikandClaude Opus 4.8 596290acf8 feat(cms): U2 render content/ into detail pages (characterization-verified)
Add tools/build_content.py: renders every content/ entry into its blog /
news / event detail page by self-templating the page's own chrome and
replacing only content-derived regions (title, article header, hero,
body, and — for new pages only — the scrollspy).

Faithful reproduction, proven against the live site:
- body_format: html fragments injected verbatim, so guide-boxes, inline
  figures and event galleries render unchanged.
- scrollspy sidebars are preserved (labels are hand-curated, shorter than
  the H2s); only generated when a page has none.
- <title> suffix derived per page, so EN/SI " - MSOS", MK " - МСОС", and
  suffix-less event titles all reproduce exactly.
- hero /images/… rewritten to the page's ../../../ depth.
- ASCII-only console output (no cp1252 crash on Windows/CI).

tools/tests/test_build_content.py: 8 characterization tests; the core one
renders all 51 pages and asserts each is semantically equivalent
(whitespace/attr-order-insensitive) to the current page — the R5
no-regression guarantee.

Does NOT overwrite the committed pages; whether generated pages are
committed vs built fresh in CI is decided in U4/U5. Run:
  python tools/build_content.py --check   # verify equivalence
  python tools/build_content.py --write    # emit pages (for U4)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-08 16:36:11 +02:00
popovskikandClaude Opus 4.8 9ddd0f88ef feat(cms): U1 content model + migration scaffold for blog/news/events
Establish content/ as the source of truth for editable content and
back-fill it from the existing detail pages, per U1 of the no-code CMS
plan.

- docs/content-model.md: front-matter schema (EN/MK/SI), body_format
  html-vs-markdown, content/events -> projects/ output mapping.
- tools/migrate_pages_to_content.py: bs4/yaml extractor; pulls title,
  subtitle, category, ISO date (from ARTICLE_DATES), hero image+caption;
  preserves the article body PLUS trailing sibling sections (event
  galleries) verbatim as body_format: html. Reports unparseable pages
  instead of emitting half-formed files.
- content/**: 51 files (17 entries x EN/MK/SI), 0 skips.
- tools/tests/test_migrate_roundtrip.py: 12 characterization tests
  (structured fields, news-has-no-subtitle, event gallery/lightbox
  preserved, Cyrillic UTF-8 round-trip, every page parses).
- .gitignore: ignore __pycache__/ and *.pyc.

U1 is unblocked and standalone. U2 (render content -> pages) is next;
U5/U6 remain blocked on Open Question Q1 (Gitea<->GitHub topology).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-08 16:18:29 +02:00
popovskik 6204db5f0c docs: add no-code CMS implementation plan 2026-08-08 16:09:31 +02:00
popovskikandClaude Opus 4.8 23d89bfff8 Add photo copyright & usage clause (EN/MK/SI)
Add a "Photos, images & copyright" card to the Official information
(legal) page in all three languages, plus a short rights/removal note
on the Gallery and Events & Projects pages.

- Clarifies most images are MSOS property or used with permission, and
  that third-party images (Get to know Macedonia/Slovenia, Student
  Welcome Guide) remain their owners' property.
- Requires prior written permission to reuse MSOS's own images.
- Adds a photo-removal / consent-withdrawal path via info@msosorg.com.
- New shared .photo-rights-note style in css/pages/_gallery.css.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-08 12:24:25 +02:00
popovskikandClaude Opus 4.8 e8604a9665 Gallery: photos open lightbox, add project button, watermark our photos
Gallery flow:
- Album covers now open the photo lightbox directly (full album set), while
  the title/"Read the story" link opens the article. Previously the whole card
  linked to the article and photos were only at the bottom of it.
- Each album carries its full photo set in a hidden js-lightbox grid; added
  main.js support for [data-lightbox-target] cover triggers.
- Added the missing main.js include on the gallery page (its lightbox, mobile
  menu and language switcher never ran before).
- Lightbox gained an optional "Read the story ->" button (data-project-url /
  data-project-label) shown only for gallery albums.

Watermark:
- Baked a subtle "(c) msosorg.com" watermark (bottom-right, sized per image)
  into 114 of our own event/community photos. Stock/partner/logo/icon images
  excluded. Clean originals backed up to images/_originals/ (git-ignored); the
  script always re-derives from them so re-runs never stack.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-08 01:55:34 +02:00
popovskikandClaude Opus 4.8 91d29121c0 About Us "Through the years": retitle, redesign names, thank-you note
- Renamed the section from "Our members & friends" to "Through the years"
  (Низ годините / Skozi leta) — a retrospective framing that honours everyone
  who has been part of MSOS without labelling anyone a current member or friend.
  Updated title, marquee aria-label, image alt text and the dev comment.
- Removed dashes from the hero intro, section intro and closing note.
- Replaced the placeholder names with the full list of 74 contributors, kept
  the original five, sorted alphabetically per language (Latin for EN/SI,
  Macedonian Cyrillic with native collation for MK).
- New design for the names: a clean multi-column credits wall (accent dot,
  hairline rows, hover) instead of pill chips (css/pages/_about.css).
- Added a thank-you note to members past, present and future, and to everyone
  who has volunteered, contributed or supported MSOS. EN/MK/SI.

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-08 00:57:53 +02:00
popovskikandClaude Opus 4.8 a15e9f20f1 About Us: real member photos in the carousel + richer hero
- "Our members & friends" carousel now uses 22 curated, web-optimised photos
  (members-01..22.webp) from the members & friends library, chosen for warmth,
  smiles, hugs, events, team and community; applied to EN/MK/SI, with the
  seamless-loop duplicate set and per-language alt text. Old placeholder
  event photos removed.
- Hero slideshow enriched with 6 new candid 1920px slides (group hug, pizza,
  picnic, coffee, night group, arms-up cheer) interleaved among the existing
  crowd shots; the JS picks up all slides automatically (now 17).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-08 00:02:02 +02:00
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 0d49293693 GEO: FAQPage/NGO/Event schema + autonomous generation for new projects
Generative Engine Optimization pass so AI answer engines (ChatGPT, Gemini,
Perplexity, AI Overviews) can confidently identify and cite MSOS.

Schema (tools/seo_inject.py, propagated to all 231 pages):
- FAQPage JSON-LD parsed from the /faq/ Q&A blocks (33 Q&A x EN/MK/SI)
- Organization upgraded to NGO with entity-disambiguation fields:
  alternateName (all spellings), description, areaServed Slovenia,
  knowsLanguage, and foundingDate 2023-03-05
- Event JSON-LD on all 9 /projects/ recap pages (date + real location)

Autonomous for future content (no code edits to add a project):
- Event/Article dates auto-read from the English page's publish date;
  event city auto-detected from the body (Slovenian-city whitelist).
  ARTICLE_DATES/PROJECT_LOCATIONS are now optional overrides only.
  (Auto-detect corrected Paint & Wine to Nova Gorica.)
- build_listings.py: auto-date fallback so undated new content still lists
- pre-commit hook now runs seo_inject.py --all --sitemap first, then
  listings/botlinks, and re-stages changed pages (idempotent)

Docs: docs/geo-offsite-worklist.md - copy-paste-ready off-site plan
(Wikidata, Wikipedia fixes, directories, Google Business, AI-visibility tests).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-07 22:17:03 +02:00
popovskikandClaude Opus 4.8 43847ba935 Student Welcome Guide: batch fixes from changes-2 review (EN/MK/SI)
Layout / CSS (css/pages/_guide.css):
- Left-align .guide-checklist and .guide-steps (margin 16px 0) so bullet
  lists no longer drift right inside the flex article-body.
- Make .guide-table-wrap shrink to the viewport (width:100%; min-width:0)
  so wide tables scroll horizontally on mobile instead of overflowing.
- Add a reusable .guide-cta pill button for inline calls to action.

Content, applied across all three languages:
- Replace the info-pill row (guide-meta) on every guide page with a
  "Last checked" eyebrow above the title.
- application-deadlines: correct "North Macedonian citizen" to
  "Citizen of North Macedonia".
- study-cities: reword the "X map:" run-on paragraphs, give Nova Gorica
  and Celje proper strengths/challenges bullet lists.
- tuition-and-scholarships: fix the leftover "Link the exact call" note
  and add a prominent SRIPS 380th-call button.
- student-accommodation: retitle to "full-time student", delete the SRCe
  brokerage paragraph, add an ownership-check (land register / GURS)
  paragraph.
- prepare-to-move: add bus, flight, airport-transfer and car-sharing
  providers with links.
- administrative-basics: link the DR-02 form and FURS tax-number page and
  the bank-account blog; remove the "A common sequence" section.
- official-sources-and-checklists: remove the "Checklists to build"
  section and the pre-publication reminder sentence, and tidy the meta
  description that referenced the removed section.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-06 00:01:04 +02:00
popovskikandClaude Opus 4.8 b058c80713 Become a member: photo-only carousel + drop unconfirmed figures note
- Remove the coloured placeholder cards behind the "ways to be part of
  MSOS" carousel (override the _hub.css gradients on .mm-use) and load the
  photos eagerly with fetchpriority so they appear immediately.
- Remove the "Figures to confirm before launch." note (and the SI
  equivalent) from the MSOS-in-numbers section.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-06 00:00:30 +02:00
popovskikandClaude Opus 4.8 5d50604af4 Landing/About/guide polish + Proxify-style category filter bar
About Us:
- Replace the appreciation photo with an Apple-style scrolling marquee that
  focal-zooms the centred photo (main.js + _about.css); heading now sits above
  the carousel; remove the "Have any questions?" FAQ CTA (EN/MK/SI).

Landing hero:
- Turn the flat blue overlay into a Proxify-style radial vignette (light centre
  over the CTA, dark edges) and raise the "Become a member" button.

Filter bar (Events & Projects / Blog / News, EN/MK/SI):
- Add a shared Proxify-style rounded pill bar with a trailing search icon that
  swaps to a search field and opens a results dropdown (thumbnail + category +
  title). New css/pages/_filterbar.css + filter-search.js, layered on top of the
  existing filter/pagination JS. Blog category icons preserved.
- Balance the News filter bar spacing between the header and the cards.

Student Welcome Guide:
- Widen the intro paragraphs, constrain the full-bleed disclaimer to a normal
  centred width, and add space before the route configurator.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 22:28:16 +02:00
popovskikandClaude Opus 4.8 93af2d8051 Mission & Vision: remove white band behind title; hide box icons on mobile
- Override the inherited cream .page-header-section background to transparent so
  the "Mission and Vision" title sits directly on the section's blue gradient
  (no white rectangle behind it).
- On mobile, hide the mission/vision box icons (crosshair/eye) — text only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-05 18:59:11 +02:00
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 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
popovskikandClaude Opus 4.8 7c32f416f5 Fix mobile top spacing (double header offset) + CTA/newsletter gap
On mobile, body already has padding-top:60px to clear the fixed header, but
every page ALSO added its own clearance — doubling it and leaving a ~60px
white gap under the menu (content sat too low). Trimmed each page's mobile
top offset so it relies on the body padding (matching .article-page, which
was already correct): page-content, support/hub/legal pages, and the
news-hub / news-article / blog / member heroes. Content now sits ~32-42px
under the header.

Also add a 32px top gap to .newsletter-cta on mobile so it no longer
touches the CTA/content above it.

CSS only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 01:31:49 +02:00
popovskikandClaude Opus 4.8 04f7653001 Support page: full legal account-holder name + fix partners spacing
- Account holder on the bank card now shows the full legal name (…za
  študentsko podporo in kulturno sodelovanje), matching the Official
  information page, in all three languages
- Fix cramped spacing: the .sup-thanks rule had cut the partners section's
  bottom padding to 24px, pushing the logos against the teal CTA; raised to
  72px for clear separation

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 01:10:26 +02:00
popovskikandClaude Opus 4.8 f057e761cf Fix Official information page: hero layout, short name, SKD activity
- Fix the hero: override the global flex-row .container so the eyebrow,
  title and lead stack and centre (they were laid out in a row)
- Short name -> "Društvo MŠOS za študentsko podporo in kulturno sodelovanje"
  (official kratki naziv, normal case) instead of "MSOS"
- Add the main activity row: SKD 94.999 (activities of other membership
  organisations n.e.c.), and relabel S.15000 as the institutional sector
  (SKIS). All three languages.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 01:05:23 +02:00
popovskikandClaude Opus 4.8 974daa59f3 Add Official information page (EN/MK/SI) + fill real bank details
New legal/registration reference page at /{lang}/legal/ with the official
details: legal name, registered office, registration number (4128133000),
tax number (44932448), VAT status, SKIS activity, registration date, bank
(NLB d.d.), IBAN SI56 0284 3026 6115 703, SWIFT LJBASI2X, representative,
and contact. New css/pages/_legal.css. Linked as "Official information" in
the footer legal bar on all pages.

Also fills the Support page's bank-transfer card with the same real IBAN/
bank/SWIFT (placeholders removed). SEO block + hreflang + sitemap (210
pages) regenerated.

MK/SI labels AI-drafted -> native review. SWIFT LJBASI2X is inferred from
the IBAN bank code (02 = NLB) -> please double-check.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 00:56:19 +02:00
popovskikandClaude Opus 4.8 de3b65fb15 Add MSOS Hub venue page (EN/MK/SI) + add to Who We Are menu
A promo page for the MSOS Hub — a renovated community/event space in
Ljubljana for gatherings up to 50 people. Sections: hero with quick facts,
the funding/partner story (Ministry of Foreign Affairs and Trade of North
Macedonia, Municipality of Ljubljana, Macedonian Cultural Association
"Macedonia"), what you can do here, what's inside (amenities), an image
placeholder gallery (photos pending — captioned), "made possible by", and a
booking CTA (mailto info@msosorg.com). New css/pages/_hub.css.

'MSOS Hub' added to the Who We Are dropdown (desktop + mobile) on all pages.
SEO block + hreflang + sitemap (207 pages) regenerated.

MK/SI translations are AI-drafted -> native review. Real photos to replace
the captioned placeholders when available.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 00:39:58 +02:00
popovskikandClaude Opus 4.8 b9dee56628 Add Support MSOS page (EN/MK/SI) and wire the header button
New donation/partnership landing page telling the MSOS story of being
community-built: hero, "built by the community" narrative, four ways to
support (partner/sponsor, donate, offer skills/space, spread the word),
"where your support goes" impact, a bank-transfer card (placeholder IBAN/
bank/SWIFT for the org to fill in), a partners thank-you marquee, and a
contact CTA (mailto info@msosorg.com). New css/pages/_support.css.

The header "Support MSOS" button (previously a dead <button>) now links to
/{lang}/support/ on all pages. SEO block + hreflang + sitemap regenerated.

MK/SI translations are AI-drafted -> native review. Bank details are
placeholders pending real IBAN/SWIFT.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 23:54:00 +02:00
popovskikandClaude Opus 4.8 587fd3d197 Footer dedup, dual contact email, privacy-policy accuracy
- Remove the duplicate Privacy/Cookie links from the footer Organisation
  column; keep them (plus Manage cookies) in the bottom legal bar
- Show both info@msosorg.com and info.msosorg@gmail.com in the privacy +
  cookie policy prose (en/mk/si)
- Fix the privacy policy's now-false "no tracking cookies" sentence to
  reflect consent-based Google Analytics (en/mk/si)

MK/SI policy text is AI-drafted -> native review.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 23:28:04 +02:00
popovskikandClaude Opus 4.8 7fe36cdb8e Update cookie policy to reflect Google Analytics + consent banner
The policy previously claimed the site set no tracking/analytics cookies
and showed no consent banner - both untrue after adding GA4. Updated
en/mk/si: revised "how we use cookies", added an Analytics cookie type
and a Google Analytics third-party entry (_ga/_gid, Consent Mode), and
rewrote the consent section to describe the banner + "Manage cookies"
withdrawal. Bumped last-updated date. MK/SI text AI-drafted -> review.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 23:08:56 +02:00
popovskikandClaude Opus 4.8 8067d6a354 Add "Manage cookies" footer link (GDPR consent withdrawal)
Adds a per-language "Manage cookies" link to the footer legal bar on all
201 pages, wired to window.msosOpenConsent() so visitors can change or
withdraw their choice at any time (GDPR requirement). Verified: decline ->
re-open via link -> accept flips analytics consent to granted.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 22:17:13 +02:00
popovskikandClaude Opus 4.8 f24fc704d6 Add GDPR cookie-consent banner (Consent Mode v2)
- consent.js: self-contained, non-blocking bottom banner in EN/MK/SI,
  remembers the choice in localStorage, links to the per-language cookie
  policy. Accept -> gtag consent 'update' granted; Decline stays denied.
- Head GA snippet restores a returning visitor's prior "granted" choice
  before the first hit; loads /consent.js on every page.
- Re-openable via window.msosOpenConsent() for a "manage cookies" link.

Verified in-browser: shows for new visitors, Accept grants + remembers,
reload keeps consent without re-prompting, Slovene text + /si/ policy link.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 18:30:35 +02:00
popovskikandClaude Opus 4.8 9a6d2c335c Add Google Analytics 4 (G-WVYV807VSS) with Consent Mode v2
- gtag.js injected on all 201 pages via tools/seo_inject.py + on 404.html
- Consent Mode v2 defaults all storage to 'denied' (EEA-safe: tag loads,
  no tracking cookies until a consent banner grants analytics_storage)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 12:52:19 +02:00
popovskikandClaude Opus 4.8 788084e094 Add article dates, brand OG image, launch SEO checklist
- Add datePublished/dateModified to Article JSON-LD on the 11 dated
  articles (curated once from EN, applied to all languages)
- Replace og-default.jpg with the official brand OG image (1200x630)
- Add docs/launch-seo-checklist.md (go-live steps: redirects, Search
  Console, analytics, rich-result validation, monitoring)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 12:38:20 +02:00
popovskikandClaude Opus 4.8 6e8b8befe6 Add .htaccess: branded 404, compression, caching, MIME types
Appends static-site production defaults below the existing root->/en/
redirect: ErrorDocument 404 /404.html, gzip compression, browser caching
(short for CSS/JS since unhashed, longer for images/fonts), correct WebP/
SVG/manifest MIME types, -Indexes, and X-Content-Type-Options. All guarded
by <IfModule> so a missing module cannot 500; ignored by nginx.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 12:26:27 +02:00
popovskikandClaude Opus 4.8 314667f692 SEO polish: OG image, favicons, 404, article schema, image optimization
- Add branded 1200x630 og-default.jpg; article pages use their hero as
  og:image, others use the default
- Wire the existing (previously unlinked) favicon set into every page
- Add branded 404.html with root-absolute paths + noindex
- Emit Article + localized BreadcrumbList JSON-LD on all article pages
- Convert 74 heavy served photos to WebP (28MB -> 8.5MB, -70%), rewrite
  references, add loading=lazy/decoding=async to below-fold images and
  fetchpriority=high to heroes (protect LCP)
- Stop tracking images/original/ (458MB of unused source masters; kept on
  disk, gitignored) and ignore .playwright-mcp/

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 12:15:53 +02:00
popovskikandClaude Opus 4.8 b393859467 Add technical SEO foundation, MK/SI about-us + timeline, content fixes
SEO (all 201 pages, en/mk/si):
- Inject canonical, hreflang (en/mk/sl + x-default), Open Graph, Twitter
  cards and Organization JSON-LD via idempotent SEO:START/END block
- Generate multilingual sitemap.xml (xhtml:link alternates) + robots.txt
- Curated meta descriptions for lead-less pages (home, become-a-member,
  faq, news hub, my-route); every page now has a description
- Absolute URLs target final domain msosorg.com, not the temp host
- Add reusable tools/seo_inject.py (+ README)

Content fixes:
- Translate about-us and timeline-and-milestones into MK + SI, wire up
  their pages, and repair the previously-dead "Who We Are" nav links
  across all mk/si pages
- Remove duplicate en/projects/makedonska-studentska-vecer-vo-ljubljana
  (unreferenced; already covered by macedonian-student-night-in-ljubljana)

Locale correctness:
- Normalise Slovene pages to <html lang="sl"> (correct ISO 639-1)
- Map sl->si in main.js so the language-switcher highlight and newsletter
  i18n keep working on Slovene pages (data-lang="si" still maps to /si/)

MK/SI translations and descriptions are AI-drafted; flag for native review.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 11:43:10 +02:00
popovskikandClaude Opus 4.8 31487ad83e Add "How to open a Slovenian bank account" blog post (EN/MK/SI)
- New scrollspy article page in all three languages, with guide-style
  warning callout, sourced link list + last-checked line, and standard
  author + newsletter blocks
- Blog listing featured card now links to the article and shows the hero
  photo + read-time instead of the "coming soon" placeholder
- Add hero image and cropped MSOS emblem avatar; add .blog-read-time and
  .blog-feat-thumb--image styles

MK/SI translations are AI-produced and need a native-speaker proofread.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-02 10:37:45 +02:00
popovskikandClaude Opus 4.8 e1d596751a Pagination fixes, blog page chooser, Events & Projects redesign
Pagination
- Fix the broken mobile layout on News & Projects: page numbers on top,
  Previous / Next side-by-side below (shared .pagination component)
- Add a page chooser to the Blog: rewrite blog-filter.js to combine the
  topic filter with client-side pagination (page size 6), add the pager
  markup (all 3 languages) and .blog-pagination styles; it auto-hides
  when a topic has one page

Events & Projects — match the Blog/News design
- Hero: uppercase letter-spaced eyebrow, sentence-case bold title, lead
  subtitle, soft gradient; drop the redundant hero subscribe form and the
  placeholder copy (signup still available in the bottom newsletter CTA);
  align MK/SI titles to "Events & projects"
- Filters: News-style pills (dark active), left-aligned, with the thin
  separator line below; .filter-inner wrapper aligns pills/separator with
  the grid
- Spacing: reduce the gap under the header, add space below the filter so
  the separator / Events sub-filter no longer collide with "All our
  projects" (these hero/spacing tweaks also tidy the shared About/Get-to-know/
  Timeline heroes)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 20:30:47 +02:00
popovskikandClaude Opus 4.8 9e8cbc5876 Homepage refresh, activities redesign + newsletter rollout
Navigation
- Replace "Donate" with a "Support MSOS ❤️" CTA site-wide
- Remove dead nav links (Gallery, Press releases)
- Turn the one-item News dropdown into a direct link

Homepage
- Replace the non-functional "Become part" contact form with a
  "Find your people in Slovenia" join CTA (blue/white gradient band,
  orange button, photo collage), in all three languages
- Fix the placeholder Activities subtitle
- Redesign Activities into card-style tabs with icons; move per-tab
  content into HTML panels and switch by index so the tabs work in
  every language (MK/SI tabs were previously dead)

Newsletter (MailerLite)
- Add the subscribe block to the News hub, news articles, and every
  events/projects page and hub, in all three languages
- Resize/rebalance the block, shrink the privacy line, add top spacing
- Standardise on honest copy (drop the "2,000+ subscribers" claim)
- Load main.js on the News hub pages (they shipped without it, so the
  form and header dropdowns didn't work there)
- Fix a dead privacy-policy link on the makedonska-vecer page
- Document the signup convention in docs/newsletter-signup.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 19:51:59 +02:00
popovskikandClaude Opus 4.8 f492a8a547 Become a Member: bento benefits, merged/redesigned join form, floating CTA, fixes
Why become a member
- Rebuild the benefits grid as a 3x3 bento: 7 icon cards + 2 real event photos
  (with captions), fixes the orphan card, adds hover motion. Swap the blank
  fa-house-heart (Pro) for fa-house-user (Free) on "Feel at home".

Join form
- Merge the duplicate "There is a place for you here" section into the form's
  path step (student / supporter cards now carry the descriptions); drop the
  separate section. New heading "There is a place for you here"; centred layout.
- Redesign the choice cards: colour-coded (student orange / supporter teal)
  icon circles, descriptions, hover lift + "Choose this" reveal.
- Fix the stray "Support MSOS" submit button showing on the path step.

Conversion + polish
- Floating "Become a member" CTA that appears after the hero and hides near the
  form/final CTA, so the ask stays reachable without scrolling to the bottom.
- More space between section titles and their cards (numbers, reals, tests,
  showcase, benefits).
- Testimonials: Elena -> Katerina (Koper); un-swap Ana (Maribor) and Marko
  (Ljubljana); remove the "sample quotes" placeholder note.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 13:14:36 +02:00
popovskikandClaude Opus 4.8 51474b2da5 Polish Become a Member hero: full-bleed gradient, button sizing + interaction, remove tag pills
- Hero gradient now spans edge to edge (full-viewport ::before band behind the
  centred content) and is more colourful/on-brand (warm peach to soft teal).
- Both hero CTAs (Become a member / See what we do) share one size so they align.
- Add hover (lift + shadow + colour shift) and active (press) states to the
  reusable .btn classes, so all buttons site-wide get consistent feedback; plus
  a focus-visible outline for keyboard users.
- Remove the confusing Community/Events/Support/... tag pills (they duplicated
  the hero lead sentence). member.js updated + now emits main.js on the member
  pages so regeneration keeps the nav working.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 12:29:59 +02:00
popovskikandClaude Opus 4.8 d35324f988 Remove "Get Involved" nav dropdown + full-width header alignment
- Remove the "Get Involved" dropdown (Become a member / Support MSOS): dead
  href="#" links that duplicated the top-right buttons. Swept site-wide
  (desktop + mobile, en/si/mk) - 390 blocks across 195 pages, including the
  privacy-policy header the generators slice from, so regeneration stays clean.
  Nav is now Who We Are / What We Do / For Students / News + the two buttons.
- Header now spans the full page width: logo + text menus flush left, buttons +
  language switcher flush right (was constrained to a centred 1280px container,
  which left the logo floating inward on wide screens). CSS-only in _header.css,
  scoped so the mobile hamburger layout is unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 12:06:59 +02:00
popovskikandClaude Opus 4.8 f6fab99ebb Remove "Get Involved" nav dropdown (dead links, duplicated the CTA buttons)
The "Get Involved" dropdown (Become a member / Support MSOS) had dead href="#"
links and only duplicated the two top-right buttons (Become a member, Donate).
Removed it site-wide (desktop + mobile, en/si/mk) - 390 blocks across 195 pages,
including the privacy-policy header the generators slice from, so regeneration
stays clean. Nav is now Who We Are / What We Do / For Students / News + the two
pill buttons.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 11:59:34 +02:00
popovskikandClaude Opus 4.8 ac09e9eff5 Update proof-of-means to 507,43 EUR, add announcement page, European number format (EN)
- Update the residence-permit "sufficient means" figure to 507,43 EUR/month
  (Slovenian basic minimum income from 1 April 2026, source gov.si) across the
  guide, FAQ, budget note, sample parent statement and my-route tip; replaces
  the old 484,88 everywhere.
- New standalone news announcement page /<lang>/news/proof-of-means-updated-2026/
  (trilingual), published 1 August 2026, with a clickable gov.si source box and a
  hero image (Pixabay, credited). news.js now supports announcement items
  (slug + body) and shows them newest-first on the homepage and News hub; the
  image doubles as the card thumbnail. Optimised 6.98MB to 255KB.
- Switch English EUR amounts to European format (comma decimal, dot thousands):
  507,43 / 9.600 / 1.000 etc. Only euro-prefixed amounts are touched, so SI/MK
  (which use a euro suffix) are unaffected. New generator eurofmt.js.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 11:48:22 +02:00
popovskikandClaude Opus 4.8 efb3c6ea39 Fix mobile nav/TOC/overflow on article pages + harden membership form
Mobile fixes (article, guide, get-to-know, projects pages):
- Remove duplicate main.js include site-wide. footer.js emitted a
  <script src=main.js> inside the footer block while pages also load one
  before </body>, so DOMContentLoaded ran twice and every tap toggled the
  mobile menu / article TOC twice (net no-op). Menu and TOC only worked on
  the homepage. Now exactly one main.js per page, before </body>.
- Kill horizontal overflow: add overflow-x: clip to html/body (clips the
  off-canvas mobile nav panel without breaking position: sticky, unlike
  overflow-x: hidden).
- Reset align-items to stretch in the mobile .article-layout-container
  rule; the desktop flex-start made .article-container size to max-content
  width in a column flexbox and overflow the viewport.

Membership form hardening (Become a Member):
- Honeypot field + localStorage cooldown (30s gap, max 3/24h) + stronger
  email regex; trilingual cooldown alert message.
- Apps Script (setup doc): per-email auto-reply dedupe + daily send cap;
  applicant reply is a plain thank-you that never echoes submitted answers.
- Draft HTML welcome email (email-welcome-preview.html) for later use.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 10:59:55 +02:00
popovskikandClaude Opus 4.8 7bc249e8a4 Wire Become a Member form to the membership Google Form
Map path/name/email/phone/city/university/membership/consent columns plus a full Summary field; city and membership are derived from the student or supporter answers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 00:34:16 +02:00
popovskikandClaude Opus 4.8 af40ef9da9 Become a Member: add EUR10/year membership fee to the FAQ
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 00:24:58 +02:00
popovskikandClaude Opus 4.8 a21450c8c8 Add flagship Become a Member page with interactive multi-step form
New trilingual /<lang>/become-a-member/ conversion page: hero with real-photo collage, why-join benefits, animated MSOS-in-numbers, ways to participate, membership-in-real-life and projects showcase (real project photos), testimonials, who-can-join, an adaptive multi-step form (student + supporter flows, conditional fields, progress, personalised messages, validation, success screen), FAQ and final CTA. Site-wide 'Become a member' buttons now link here. Form posts to a Google Form once wired; metrics/testimonials are placeholders to confirm.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 00:14:13 +02:00
popovskikandClaude Opus 4.8 5b14cc2189 News hub: add working pagination that respects the type filter
Client-side paginator (9 per page) reusing the site's pagination styling; page numbers with dots for long lists, Previous/Next with disabled states, resets to page 1 on filter change and hides when a single page.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-31 23:56:42 +02:00
popovskikandClaude Opus 4.8 ea9acc4968 Add News hub and wire homepage Latest news to a dated content index
New /<lang>/news/ hub aggregates real projects (title+image read from their pages), placeholder news announcements, and blog items, newest-first with type badges and a type filter. Homepage Latest news now shows the newest dated items as badged cards with a working See all to the hub; the News menu link points there too. Dates in news.js are placeholders to replace with real publish dates.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-31 23:50:05 +02:00
popovskikandClaude Opus 4.8 ec794a32e6 Nav cleanup + new Blog page
Remove 'Mentorship Programme' and 'Open calls' from the menus, rename 'Announcements' to 'News and Announcements', and wire the Blog link. Add a trilingual /<lang>/blog/ page with a distinct look: featured strip, client-side topic filters, and a masonry card wall with colour-coded tags (placeholder posts for now).

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