gap-12 (3rem) tussen grid-items plus mb-6 op de kop-div stapelden op
tot te veel ruimte tussen "// over" en de foto op mobiel. Op mobiel nu
gap-6 en mb-2; vanaf sm ongewijzigd (gap-12, geen extra marge).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
De kop "// over" wordt nu los van de paragrafen gepositioneerd, zodat
op mobiel de volgorde kop -> foto -> tekst is in plaats van foto ->
kop -> tekst. Desktop-layout (tekst links, foto rechts naast kop +
paragrafen) blijft ongewijzigd via de grid-rijen/kolommen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Op mobiel (grid-cols-1) volgde de layout de DOM-volgorde, waardoor de
fotoplaceholder onder de tekst stond. Met order-1/order-2 staat de
foto nu bovenaan op mobiel, en blijft de bestaande tekst-links/foto-
rechts indeling behouden vanaf sm.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
De tijdelijke pull_request-conditie in deploy-test zorgde dat elke PR
automatisch naar test deployde. Dat is niet meer gewenst: een
test-deploy vanaf een feature-branch kan al zonder PR via een
handmatige workflow_dispatch-run met 'Deploy to Test' aangevinkt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ververst hero-, werkwijze- en over-teksten, plaatst de Over-sectie
voor de pakketten en vervangt de tech-stack-lijst door een
fotoplaceholder zodat bezoekers straks een gezicht bij het bedrijf
zien.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
De knop was ook zichtbaar op de testomgeving (VITE_APP_ENV=test).
Nu uitsluitend zichtbaar bij pnpm dev, zodat de testomgeving een
productie-equivalente build draait.
Het project gebruikt pnpm (pnpm-lock.yaml, CI draait pnpm install
--frozen-lockfile), maar de README-instructies en scripts-tabel
verwezen nog naar npm.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Nu de pakketten dynamisch uit de API komen is het id een GUID, wat
niet leesbaar is op de pagina. Voeg een slug-veld toe aan
PackageCardData en toon dat op de kaart; id blijft ongewijzigd
gebruikt als React key en data-testid.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Voorkomt dat CI onnodig doorloopt op een verouderde commit. Runs op
push naar master en workflow_dispatch worden nooit geannuleerd (groep
valt terug op github.run_id, altijd uniek), zodat de automatische
test-deploy niet halverwege afgebroken kan worden.
Toont 3 pulserende placeholder-kaarten (zelfde afmetingen/structuur als
PackageCard) zolang de offerings-fetch nog bezig is, zodat de sectie
niet leeg oogt en de layout niet verspringt zodra de echte data binnenkomt.
Lokaal (.env.local, niet gecommit) kan VITE_API_BASE_URL op
https://localhost:7223 gezet worden zodat /api/v1/... calls naar een
lokaal draaiende backend gaan i.p.v. hetzelfde origin. Op test/productie
blijft de variabele ongezet, dus blijven calls relatief zoals voorheen.
PackagesSection gebruikte tot nu toe statische data via een placeholder
query-hook (FR-5). usePackagesQuery haalt nu echt op bij /api/v1/packages
(relatief pad, zelfde domein op test en productie), met een foutmelding
in de UI als het request faalt.
Voegt ook een hand-off-document toe voor de agent die de CMS/API-kant
gaat bouwen: het endpoint-contract, per veld het type/gebruik, en de
huidige statische content als seed-data.
Voegt een deploy_test-checkbox toe voor handmatige runs, analoog aan de
bestaande deploy_production-checkbox. De automatische testdeploy bij een
push/merge naar master blijft ongewijzigd en onafhankelijk van dit vinkje.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Volgt de aanpak uit het React 2025 folder structure artikel en het
SlpModularCms/frontend referentieproject: components/{layout,ui,shared},
features/landing/{components,data,hooks,pages,__tests__}, en lib/ voor
de query client. routes/index.tsx wordt een dunne wrapper rond de nieuwe
features/landing/pages/LandingPage.tsx.
Gitea Actions plakt ${{ secrets.* }} als platte tekst in het run-script
vóórdat bash het uitvoert. Bevat het wachtwoord een shell-metateken
zoals '$', dan interpreteert bash dat alsnog, waardoor sshpass een
ander wachtwoord krijgt dan bedoeld ("Permission denied"). Via env:
en sshpass -e komt de waarde als kant-en-klare string binnen, zonder
die tweede interpretatieslag.
Deze snapshot bleek achteraf niet nodig - de configs staan inmiddels op
pi-entry/pi-main zelf, en hoeven niet ook nog los in de repo bewaard te
worden.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
De configs die deze sessie zijn nagelopen en gefixt (slpsoftware-analytics.conf,
slpsoftware-test-webserver.conf, slpsoftware.conf) stonden alleen als geplakte
tekst in de chat en een tijdelijke scratchpad-map, niet in de repo of op de
Pi's zelf toegepast. Dit zet ze duurzaam vast als referentiesnapshot, met een
README die per bestand aangeeft wat er is aangepast en waarom. Nog steeds
handmatig te kopiëren naar de Pi's; niet automatisch gesynchroniseerd.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
production-nginx.conf.example (vóór certbot) en
production-nginx.conf.post-certbot.example (referentie, na certbot) dekken
alléén de react-frontend-site op slpsoftware.nl/www.slpsoftware.nl; de
mail/iRedAdmin-proxying die op de daadwerkelijke productieserver ook op dit
domein draait valt buiten de scope van deze feature en is bewust
weggelaten. Bevat de acme-challenge location in het 443-blok (niet het
poort-80-blok) en de sentry-tunnel-proxy, analoog aan de testomgeving-
configuratie. Documentatie in deployment-plan.md en
deployment-instructions.md bijgewerkt met productie-nginx-setupstappen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Hernoemt de Gitea-variable achter VITE_UMAMI_WEBSITE_ID naar
VITE_UMAMI_WEBSITE_ID_TEST, zodat deze consistent is met
VITE_UMAMI_WEBSITE_ID_PRODUCTION en DEPLOY_PATH_TEST/DEPLOY_PATH_PRODUCTION.
De Vite build-time envvar-naam die de app zelf verwacht
(VITE_UMAMI_WEBSITE_ID) verandert niet, alleen de naam van de Gitea
repository variable erachter. Bewust gedeelde variabelen (VITE_UMAMI_SCRIPT_URL,
VITE_SENTRY_DSN, PI_MAIN_* secrets) krijgen geen postfix, want die zijn
geen omgevingsspecifieke waarden. Documentatie in umami-setup.md,
deployment-instructions.md en monitoring-plan.md bijgewerkt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
build-production hergebruikte vars.VITE_UMAMI_WEBSITE_ID van de testbuild,
maar Umami-website-ID's horen bij één specifieke domeinentry in het
dashboard. Zonder deze fix zou productieverkeer in de teststatistieken
terechtkomen. Introduceert VITE_UMAMI_WEBSITE_ID_PRODUCTION als losse Gitea
variable, en documenteert dat er twee aparte Umami-website-entries nodig
zijn (test.slpsoftware.nl / slpsoftware.nl). VITE_UMAMI_SCRIPT_URL en
VITE_SENTRY_DSN blijven bewust gedeeld tussen omgevingen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Voegt build-production en deploy-production jobs toe aan
continuous_integration.yaml, alleen actief bij een handmatige
workflow_dispatch-run met het deploy_production-vinkje aangevinkt (nooit
automatisch bij een push naar master). Een aparte build-production job is
nodig omdat VITE_APP_ENV een build-time Vite-variabele is: dezelfde bundel
kan niet zowel als test als production getagd zijn in Sentry/analytics.
Uploadpad komt uit de nieuwe Gitea-variable DEPLOY_PATH_PRODUCTION, analoog
aan DEPLOY_PATH_TEST. Documentatie en production-readiness-checklist
bijgewerkt om dit open item als opgelost te markeren.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Vervangt het hardcoded testpad in continuous_integration.yaml door de
Gitea repository variable DEPLOY_PATH_TEST, zodat het uploadpad aan te
passen is zonder de workflow zelf te wijzigen. Documentatie bijgewerkt
met de vereiste eenmalige Gitea-variable-setup.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
De reverse-proxy en analytics nginx-configs toonden al de door certbot beheerde
eindstaat (met SSL-directives), terwijl je die juist nodig hebt vóórdat certbot
draait. Nu is het .example-bestand de kale HTTP-versie om te kopiëren, met een
apart .post-certbot.example ter referentie voor de staat erna. Alle configs
(inclusief webserver-nginx.conf.example) hebben nu ook expliciete error_log/
access_log directives.
Gitea Actions kent geen GitLab/Azure DevOps-achtige manual approval
gate; workflow_dispatch is het dichtstbijzijnde equivalent.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>