# Milinda Uitgevers β€” Herontwerp Mobiele Webshop > **Pitch voor het herontwerp van de webshop van Milinda Uitgevers** --- ## πŸ“– Over dit project Dit project is een pitch voor het herontwerp van de webshop van Milinda Uitgevers. De huidige website is ruim vijftien jaar oud en voldoet niet meer aan de eisen van vandaag op het gebied van responsive design en toegankelijkheid. ### Doelstelling Het doel van dit herontwerp is om: 1. **Gebruiksgemak op alle platforms** β€” Een volledig responsieve mobiele ervaring die naadloos werkt op smartphones, tablets en desktops 2. **Toegankelijkheid** β€” Volledige ondersteuning voor gebruikers met een beperking (WCAG-richtlijnen) 3. **Behoud van de "feel"** β€” De oorspronkelijke sfeer en identiteit van de website behouden terwijl de visuele presentatie wordt gemoderniseerd ### Waarom deze aanpak? We hebben gekozen voor een **Web Components-architectuur** om de volgende redenen: - **Geen externe frameworks** β€” Werkt met vanilla JavaScript, geen React/Vue/Angular nodig - **Eenvoudige integratie** β€” De componenten kunnen gemakkelijk worden geΓ―ntegreerd met de bestaande back-end - **Toekomstbestendig** β€” Web Components zijn een webstandaard en werken in alle moderne browsers - **Modulair** β€” Elk component is zelfstandig en herbruikbaar - **Geen server-side libraries** β€” Volledig client-side, zoals gevraagd in de opdracht --- ## 🎯 UX Onderbouwing ### Paginastructuur De pagina's zijn opgebouwd volgens een bewuste hiΓ«rarchie die de gebruiker begeleidt van oriΓ«ntatie naar actie: ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Header (sticky) β”‚ ← Altijd toegankelijk β”‚ β”œβ”€β”€ Logo + Menu + Acties β”‚ β”‚ β”œβ”€β”€ Categorie navigatie β”‚ β”‚ └── Zoekbalk β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Hoofdinhoud β”‚ ← Scrollbare content β”‚ β”œβ”€β”€ Promotieblok (push-box) β”‚ β”‚ β”œβ”€β”€ Boekensecties β”‚ β”‚ β”œβ”€β”€ CategorieΓ«n β”‚ β”‚ └── Nieuwsbrief β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Footer β”‚ ← Service informatie β”‚ └── Accordion navigatie β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Ontwerpkeuzes per element #### πŸ” Zoekbalk (prominent in header) **Waarom:** De zoekfunctie staat bovenaan omdat: - **Directe toegang** β€” Terugkerende klanten weten vaak al wat ze zoeken - **Tijdsbesparing** β€” Sneller dan door categorieΓ«n navigeren - **Spraakherkenning** β€” Extra toegankelijkheid voor gebruikers met beperkingen of onderweg - **Verwachting** β€” Gebruikers verwachten een zoekfunctie bij een webshop #### πŸ“± Mobile Drawer (slide-in navigatie) **Waarom een drawer in plaats van dropdown:** - **Meer ruimte** β€” Volledige schermhoogte voor uitgebreide navigatie - **Touch-vriendelijk** β€” Grote klikgebieden, swipe om te sluiten - **Focus** β€” Backdrop voorkomt interactie met achterliggende content - **Overzicht** β€” Alle categorieΓ«n en imprints in één overzicht - **Authenticatie** β€” Plek voor inlog/registratie knoppen #### πŸ“š Boekkaarten (horizontale layout) **Waarom horizontale kaarten:** - **Scanbaarheid** β€” Cover links trekt de aandacht, tekst rechts geeft context - **EfficiΓ«nt** β€” Meer informatie zichtbaar per kaart dan bij verticale layout - **Touch targets** β€” Grote klikbare gebieden voor mobiel gebruik - **Consistentie** β€” Herkenbare structuur door hele site **InformatiehiΓ«rarchie:** 1. **Titel** (vetgedrukt, onderstreept) β€” Primair identificatie 2. **Beschrijving** β€” Context over de inhoud 3. **Auteur** (paars, onderstreept) β€” Secundair, maar klikbaar 4. **Prijs** (vetgedrukt) β€” Koopbeslissing informatie 5. **Winkelwagen knop** β€” Directe actie #### πŸ“¦ Push Boxes (promotieblokken) **Waarom push boxes:** - **Visuele onderbreking** β€” Doorbreekt de lijst met boeken - **Merkidentiteit** β€” Ruimte voor imprint logos (Asoka) - **Call-to-action** β€” Stuurt naar belangrijke pagina's - **Flexibiliteit** β€” Twee varianten (default/paars) voor verschillende contexten **Plaatsing:** - **Bovenaan homepage** β€” Introductie van het merk/imprint - **Onder boekdetails** β€” Klantenservice toegang na productinfo - **Strategisch** β€” Voorkomt "scroll fatigue" bij lange pagina's #### 🏷️ Categoriekaarten (grid layout) **Waarom visuele categorieΓ«n:** - **Herkenning** β€” Iconen zijn sneller te verwerken dan tekst - **Uitnodigend** β€” Visuele elementen nodigen uit tot verkennen - **OriΓ«ntatie** β€” Helpt nieuwe bezoekers het aanbod te begrijpen - **Twee kolommen** β€” Optimaal voor mobiele weergave #### πŸ“‘ Tabbladen (boekdetailpagina) **Waarom tabs voor Beschrijving/Inzage/Recensies:** - **Ruimtebesparing** β€” Voorkomt zeer lange pagina's - **Gebruikerskeuze** β€” Laat gebruiker kiezen wat relevant is - **Focus** β€” Toont één type informatie tegelijk - **Verwachting** β€” Bekend patroon van andere webshops #### πŸ“° Nieuwsbrief sectie **Waarom onderaan (maar boven footer):** - **Niet opdringerig** β€” Staat niet in de weg van productinhoud - **Logische plek** β€” Na het bekijken van content, uitnodiging om verbonden te blijven - **Visueel onderscheid** β€” Border maakt het herkenbaar als apart element #### 🦢 Footer met accordions **Waarom accordions:** - **Ruimtebesparing** β€” Veel links zonder lange scrolllijsten - **Georganiseerd** β€” Duidelijke categorisering van footer content - **Touch-vriendelijk** β€” Grote tap targets voor mobiel - **Verwachting** β€” Standaard patroon voor mobiele footers ### Visuele hiΓ«rarchie De kleurkeuzes ondersteunen de gebruikerservaring: | Element | Kleur | Reden | |---------|-------|-------| | Primaire acties | Paars (#951D51) | Opvallend, merkidentiteit | | Links | Paars + onderstreept | Herkenbaar als klikbaar | | Titels | Zwart + vetgedrukt | Maximaal contrast, hiΓ«rarchie | | Secundaire tekst | Grijs | Ondersteunend, niet afleidend | | Achtergronden | Lichtgrijs varianten | Subtiel onderscheid tussen secties | ### Scroll-gedrag header **Smart header die inklapt bij scrollen:** - **Naar beneden** β€” Header klapt deels in, meer ruimte voor content - **Naar boven** β€” Header verschijnt weer, navigatie altijd bereikbaar - **Drempel van 100px** β€” Voorkomt "flikkeren" bij kleine scrollbewegingen Dit patroon maximaliseert schermruimte terwijl navigatie toegankelijk blijft. --- ## πŸš€ Project starten ### Vereisten - Node.js 18.0.0 of hoger ### Installatie ```bash # Installeer dependencies npm install # Start de development server npm start ``` De applicatie is vervolgens beschikbaar op `http://localhost:3000`. ### Beschikbare pagina's | Pagina | URL | Beschrijving | |--------|-----|--------------| | Homepage | `/index.html` | Overzicht met uitgelichte boeken, categorieΓ«n en nieuwsbrief | | Boekdetail | `/book.html` | Detailpagina voor "Zen is opendoen" | --- ## πŸ“ Projectstructuur ``` milinda-pitch/ β”œβ”€β”€ css/ β”‚ └── styles.css # Globale stijlen en design tokens β”œβ”€β”€ images/ # Afbeeldingen en iconen β”œβ”€β”€ js/ β”‚ β”œβ”€β”€ app.js # Hoofdapplicatie entry point β”‚ β”œβ”€β”€ components/ # Web Components β”‚ β”œβ”€β”€ icons/ # SVG icon components β”‚ └── store/ # State management (winkelwagen) β”œβ”€β”€ index.html # Homepage β”œβ”€β”€ book.html # Boekdetailpagina └── package.json # Project configuratie ``` --- ## 🧩 Componenten ### Layout Componenten | Component | Bestand | Beschrijving | |-----------|---------|--------------| | `` | `site-header.js` | Sticky header met scroll-gedrag: klapt in bij scrollen naar beneden, verschijnt bij omhoog scrollen | | `` | `top-bar.js` | Bovenste balk met logo, menu-knop en acties (profiel, winkelwagen) | | `` | `horizontal-scroll-nav.js` | Horizontaal scrollbare categorie-navigatie met pill-vormige knoppen | | `` | `search-bar.js` | Zoekbalk met spraakherkenning (Nederlands) en zoek-icoon | | `` | `site-content.js` | Wrapper voor de hoofdinhoud van de pagina | | `` | `site-footer.js` | Footer met accordion-secties en linkkolommen | | `` | `mobile-drawer.js` | Slide-in navigatiemenu vanaf de linkerzijde met backdrop | ### Content Componenten | Component | Bestand | Beschrijving | |-----------|---------|--------------| | `` | `book-card.js` | Boekkaart met cover, titel, beschrijving, auteur en prijs. Ondersteunt licht/donker thema | | `` | `book-details.js` | Uitgebreide boekdetails met metadata, categorieΓ«n en koopknoppen | | `` | `book-description.js` | Gestileerde boekbeschrijving met citaten | | `` | `book-reviews.js` | Container voor boekrecensies | | `` | `book-review-item.js` | Individuele recensie met sterren, auteur en datum | | `` | `category-card.js` | Categoriekaart met icoon en titel | | `` | `image-gallery.js` | Afbeeldingsgalerij met thumbnails | | `` | `content-tabs.js` | Tabblad-interface voor verschillende secties (Beschrijving, Inzage, Recensies) met volledige keyboard navigatie | ### Interactieve Componenten | Component | Bestand | Beschrijving | |-----------|---------|--------------| | `` | `push-box.js` | Promotionele container met logo, titel en CTA. Ondersteunt `variant="purple"` | | `` | `newsletter-signup.js` | Nieuwsbrief aanmeldformulier met e-mail input | | `` | `footer-accordion-item.js` | Inklapbare sectie voor de footer met ARIA-ondersteuning | | `` | `add-to-cart-button.js` | Plus-knop voor toevoegen aan winkelwagen | ### Button Componenten | Component | Bestand | Beschrijving | |-----------|---------|--------------| | `` | `arrow-button.js` | Link met ronde pijl-icoon | | `` | `cta-button.js` | Full-width call-to-action knop | | `` | `icon-cta-button.js` | CTA knop met icoon (winkelwagen, e-book) | | `` | `icon-link-button.js` | Link met icoon (verlanglijstje, recensie) | | `` | `action-links-list.js` | Gegroepeerde actie-links | ### Utility Componenten | Component | Bestand | Beschrijving | |-----------|---------|--------------| | `` | `section-title.js` | Consistente sectietitel | --- ## 🎨 Iconen Alle iconen zijn geΓ―mplementeerd als Web Components en/of exporteerbare functies. Ze ondersteunen `size`, `color` en `stroke-width` attributen. | Icon Component | Bestand | Beschrijving | |----------------|---------|--------------| | `` | `menu-icon.js` | Hamburger menu icoon (3 lijnen) | | `` | `user-icon.js` | Gebruikersprofiel icoon | | `` | `shopping-bag-icon.js` | Boodschappentas icoon | | `` | `arrow-circle-right-icon.js` | Pijl in cirkel (rechts) | | `` | `book-open-icon.js` | Open boek icoon (placeholder) | | `` | `clipboard-icon.js` | Klembord icoon | | `` | `chevron-down-icon.js` | Pijl naar beneden (accordion) | | `` | `close-icon.js` | Sluiten/kruis icoon | ### Icon Functies | Functie | Bestand | Beschrijving | |---------|---------|--------------| | `micIcon()` | `mic.js` | Microfoon icoon (spraakherkenning) | | `searchIcon()` | `search.js` | Vergrootglas icoon | | `sendIcon()` | `send-icon.js` | Verstuur/pijl icoon (nieuwsbrief) | --- ## 🎨 Design System ### Lettertypen | Font | Gewichten | Gebruik | |------|-----------|---------| | **Outfit** | 400 (Regular), 700 (Bold) | Primair lettertype voor alle tekst, titels en UI elementen | | System fonts | - | Fallback: system-ui, -apple-system, etc. | Het Outfit lettertype wordt geladen via Google Fonts CDN. ### Kleuren #### Primaire Kleuren | Naam | Waarde | CSS Variable | Gebruik | |------|--------|--------------|---------| | **Purple (primair)** | `#951D51` | `--color-button-primary`, `--color-purple` | Knoppen, links, accenten | | **Purple Dark** | `#7A1842` | `--color-purple-dark` | Hover states | #### Tekst Kleuren | Naam | Waarde | CSS Variable | Gebruik | |------|--------|--------------|---------| | **Text** | `#1E293B` | `--color-text` | Primaire tekst | | **Text Light** | `#64748B` | `--color-text-light` | Secundaire tekst | | **Text Inverse** | `#FFFFFF` | `--color-text-inverse` | Tekst op donkere achtergrond | | **Black** | `#000000` | `--color-black` | Titels en koppen | #### Achtergrond Kleuren | Naam | Waarde | CSS Variable | Gebruik | |------|--------|--------------|---------| | **Background** | `#FFFFFF` | `--color-background` | Primaire achtergrond | | **Background Secondary** | `#F8FAFC` | `--color-background-secondary` | Pagina achtergrond | | **Background Tertiary** | `#F1F5F9` | `--color-background-tertiary` | Cards, secties | | **Push Box BG** | `#EBEEF4` | `--color-push-box-bg` | Promotie blokken | | **Card Dark BG** | `#EBEEF4` | `--color-card-dark-bg` | Donkere kaarten | | **Category Card** | `#F5F4FC` | - | Categorie kaarten | #### Overige Kleuren | Naam | Waarde | CSS Variable | Gebruik | |------|--------|--------------|---------| | **Border** | `#E2E8F0` | `--color-border` | Borders en scheidingslijnen | | **Accent** | `#F59E0B` | `--color-accent` | Sterren, favoriet icoon | | **Success** | `#22C55E` | `--color-success` | Bevestigingen | | **Error** | `#EF4444` | `--color-error` | Foutmeldingen | ### Spacing | Naam | Waarde | CSS Variable | |------|--------|--------------| | **XS** | 4px (0.25rem) | `--spacing-xs` | | **SM** | 8px (0.5rem) | `--spacing-sm` | | **MD** | 16px (1rem) | `--spacing-md` | | **LG** | 24px (1.5rem) | `--spacing-lg` | | **XL** | 32px (2rem) | `--spacing-xl` | | **2XL** | 48px (3rem) | `--spacing-2xl` | ### Typografie Schaal | Naam | Waarde | CSS Variable | |------|--------|--------------| | **XS** | 12px (0.75rem) | `--font-size-xs` | | **SM** | 14px (0.875rem) | `--font-size-sm` | | **Base** | 16px (1rem) | `--font-size-base` | | **LG** | 18px (1.125rem) | `--font-size-lg` | | **XL** | 20px (1.25rem) | `--font-size-xl` | | **2XL** | 24px (1.5rem) | `--font-size-2xl` | | **3XL** | 30px (1.875rem) | `--font-size-3xl` | ### Border Radius | Naam | Waarde | CSS Variable | |------|--------|--------------| | **SM** | 4px (0.25rem) | `--radius-sm` | | **MD** | 8px (0.5rem) | `--radius-md` | | **LG** | 12px (0.75rem) | `--radius-lg` | | **XL** | 16px (1rem) | `--radius-xl` | | **Full** | 9999px | `--radius-full` | ### Transities | Naam | Waarde | CSS Variable | |------|--------|--------------| | **Fast** | 150ms ease | `--transition-fast` | | **Normal** | 250ms ease | `--transition-normal` | | **Slow** | 350ms ease | `--transition-slow` | --- ## β™Ώ Toegankelijkheid (WCAG) Dit project is gebouwd met toegankelijkheid als prioriteit en volgt de WCAG 2.1 richtlijnen. ### GeΓ―mplementeerde functies #### Skip-to-content link - Verborgen link die verschijnt bij keyboard focus - Stelt gebruikers in staat direct naar de hoofdinhoud te navigeren - Slaat herhalende navigatie-elementen over - Geplaatst binnen de header landmark voor correcte WCAG compliance #### Semantische HTML - Correcte gebruik van `
`, `