How shah-in-alam/celler--webpage works
1. Project shape: This is a single-page React site for a neighbourhood wine shop, built with Vite and shipped as a static frontend. There is no visible backend, database, or API layer in the repo; everything is content-driven on the client.
2. Entry and app shell: index.html hosts the Vite app, src/main.jsx mounts it, and src/App.jsx acts as the composition root. The app likely orchestrates the page’s global state such as language selection, modal visibility, and the age-gate state.
3. Page composition: The UI is assembled from section components in src/components/ rather than nested route pages. The main sections are Hero, About, Wine selection, Shop, Events, Reviews, Visit, Footer, with Nav providing in-page navigation to anchors.
4. Content/data boundary: The site separates structured content from presentation. src/i18n.jsx contains the bilingual copy for EN/NL, while src/data/wines.js holds the wine catalogue data. This means most copy updates and product edits can happen without touching component logic.
5. Wine catalogue flow: WineSelection.jsx, Bottle.jsx, and Shop.jsx form the product-facing subsystem. The wine data from src/data/wines.js is rendered into cards/selection UI, and the shop area presents the purchasing or pickup message around those items.
6. Age-gated shop experience: AgeGate.jsx is a distinct boundary around the wine-shop section. The README says the 18+ check is remembered via localStorage, so the gate is client-side and persistent across visits, protecting only the alcohol-related parts of the experience.
7. Modal-driven interactions: BookingModal.jsx and ShopModal.jsx indicate overlay-based interactions rather than full page navigation. These modals likely handle booking/pickup/shop calls-to-action, keeping the user inside the single-page flow.
8. Narrative and visual sections: Hero.jsx, About.jsx, Events.jsx, Reviews.jsx, and Visit.jsx are the content-heavy marketing/brand sections. About also appears to include a replaceable photo slot, while Visit concentrates address, hours, contact links, social links, and map entry points.
9. Shared UI and motion system: Components like SectionHead.jsx, Reveal.jsx, Calendar.jsx, and Confetti.jsx suggest reusable presentation primitives and light interaction effects. Reveal and the README’s reduced-motion note imply animation is intentionally optional and accessibility-aware.
10. Styling and assets: Styling is centralized in src/styles.css with no CSS framework. Static media lives under public/images, supporting a brand-heavy, image-led layout.
11. Accessibility and UX constraints: The README calls out a skip link, keyboard focus visibility, semantic landmarks, high-contrast colors, and prefers-reduced-motion support. That means the architecture is not just visual composition; it also enforces accessibility as a first-class concern across sections.
12. Operational/tooling boundary: The only repo-level automation shown is GitHub Actions CodeQL scanning in .github/workflows/codeql.yml. This is a security/static-analysis boundary around the frontend codebase, not a runtime dependency.
13. External touchpoints: The public-facing integrations are lightweight: map URL, phone/email links, and Instagram in the Visit section. There is no evidence of an external CMS, booking backend, or commerce engine in the repository.
14. Diagram takeaway: The cleanest architecture diagram is a client-only SPA with one app shell, two main data sources (i18n content and wine data), a gated shop flow, and several presentational sections rendered in-page with shared styling and small interaction helpers.
Main entry points: App.jsx App · SectionHead.jsx SectionHead · WineSelection.jsx WineSelection · Hero.jsx Hero
Components 23
App shell
Vite entry and root composition for the single-page site
- index.html · HTML host for the client app
index.html - main · Mounts the React app into the page
src/main.jsx - App · Top-level site orchestration and state
src/App.jsx
Content sources
Structured copy and product data kept separate from components
Page sections
In-page marketing and information sections rendered from the app shell
- Nav · In-page navigation across site sections
src/components/Nav.jsx - Hero · Top-of-page brand introduction
src/components/Hero.jsx - About · Background and replaceable photo-driven content
src/components/About.jsx - Events · Upcoming happenings and related content
src/components/Events.jsx - Reviews · Customer quotes and endorsements
src/components/Reviews.jsx - Visit · Address, hours, contact, map, and social links
src/components/Visit.jsx - Footer · Closing site-wide information and links
src/components/Footer.jsx
Shop flow
Age-gated product browsing and modal-driven purchase interactions
- AgeGate · Client-side age check remembered in localStorage
src/components/AgeGate.jsx - WineSelection · Renders wines into selection cards
src/components/WineSelection.jsx - Bottle · Individual wine item presentation
src/components/Bottle.jsx - Shop · Purchase or pickup messaging around wines
src/components/Shop.jsx - BookingModal · Modal for booking-related calls to action
src/components/BookingModal.jsx - ShopModal · Modal for shop or checkout interactions
src/components/ShopModal.jsx
Shared UI
Reusable presentation and motion primitives used across sections
- SectionHead · Reusable section title and lead component
src/components/SectionHead.jsx - Reveal · Accessible reveal animation wrapper
src/components/Reveal.jsx - Calendar · Calendar-style event presentation helper
src/components/Calendar.jsx - Confetti · Light celebratory visual effect
src/components/Confetti.jsx
Tooling
Repository-level automation and checks
- CodeQL · GitHub Actions static analysis for the frontend repo
.github/workflows/codeql.yml
Connections 28
- index.html → main: loads · Browser host loads the Vite entry
- main → App: mounts · Entry bootstrap renders the app shell
- App → Nav: composes · App shell includes navigation
- App → Hero: renders · Top-level page composition
- App → About: renders · Top-level page composition
- App → WineSelection: renders · Top-level page composition
- App → Shop: renders · Top-level page composition
- App → Events: renders · Top-level page composition
- App → Reviews: renders · Top-level page composition
- App → Visit: renders · Top-level page composition
- App → Footer: renders · Top-level page composition
- App → AgeGate: guards · Age check wraps alcohol-related experience
- App → BookingModal: opens · Manages booking overlay state
- App → ShopModal: opens · Manages shop overlay state
- App → Copy: reads · Consumes bilingual site copy
- WineSelection → Wines: maps · Selection view is driven by catalogue data
- WineSelection → Bottle: uses · Wine cards are built from bottle component
- Shop → WineSelection: embeds · Shop section contains the product selection flow
- Shop → ShopModal: triggers · Shop calls to action open modal interactions
- Events → Calendar: uses · Events section uses calendar presentation
- About → Reveal: wraps · Section content animates with reveal helper
- Hero → Confetti: decorates · Hero uses decorative celebratory effect
- Hero → SectionHead: shares · Uses common section heading pattern
- About → SectionHead: shares · Uses common section heading pattern
- Events → SectionHead: shares · Uses common section heading pattern
- Reviews → SectionHead: shares · Uses common section heading pattern
- Visit → SectionHead: shares · Uses common section heading pattern
- CodeQL → App: scans · Workflow covers the frontend codebase