sluggish-cafe is the production website for Sluggish, a specialty café in Kuwait. The site's purpose is to make a prospective customer feel the café's "slow down" philosophy before they ever walk in — calm, warm, premium, and quietly playful — and then give them everything they need to act: browse the menu, meet the signature drinks, see the room, check whether the café is open right now in Kuwait time, and reach the café by WhatsApp, phone, Instagram, or a delivery app.
The site is bilingual English/Arabic with a real mirrored RTL layout, mobile-first (most visitors are on phones in Kuwait), and built to a hard performance and accessibility bar. It is a complete, working, statically generated site — not a mockup — with all café content (menu, hours, contact) held in one editable data file and every placeholder photograph clearly marked for later replacement.
The visual language is warm cream and muted sage with a deep ink-green primary — no brown — and the motion language is fluid and super slick: an animated slug character (drawn from the user's supplied slug reference image) and cinematic, camera-like scroll choreography inspired by the 8080 3D-camera-portfolio reference, all still delivered as layered 2D DOM/SVG/CSS motion that protects the mobile Lighthouse targets.
The audience is phone-first, bilingual, design-literate Kuwaiti café-goers willing to pay a premium for a calm, unhurried experience, plus Arabic readers who expect the same information and actions in their own language and reading direction.
Sluggish is delivered as a statically generated, bilingual marketing site with no customer accounts, no ordering, and no transactional state. Every visitor is anonymous and public. The site presents eight source-named sections — Hero, Our story, Menu, Signature drinks, Gallery, Visit us, Contact, and Footer — composed into a single scrolling page experience with a sticky minimal header and a mobile slide-in menu.
All café content (menu items, categories, hours, address, contact numbers, social and delivery links, gallery images, signature drinks) lives in one editable data file consumed at build time. The site is rendered to static HTML/CSS/JS (SSG) and served as static assets. A shared FastAPI backend process and a MariaDB database are provisioned in the scaffold; they are available for application APIs and domain modules but are not required by any accepted customer-facing behavior in this release, because the site is static and read-only for visitors. No authentication, no accounts, and no persistent visitor data are introduced.
Two accepted human personas use the site: the Café visitor (English-first browsing) and the Arabic-speaking visitor (switches to Arabic and expects a fully mirrored RTL experience). Both are anonymous public visitors with identical access to all eight sections.
Removed from scope
#4A2E1E, brown palette) — removed per the user's explicit feedback that they do not like the brown colour; the palette is revised to cream, sage, and deep ink-green.Delivery ownership. The site is a first-party, statically generated public website. All eight sections are first-party pages owned by the application and reachable anonymously with no access requirement. There is no protected area, no identity establishment, and no session continuity requirement, because no accepted behavior creates durable visitor-specific state, a commitment, an entitlement, or a value transfer that must remain bound to a visitor.
Provider and external ownership. Several actions leave the site and are owned by external providers, not by Sluggish:
Current vs. future. Everything in this document is current. The scaffold's FastAPI backend and MariaDB database are provisioned infrastructure available for future application APIs and domain modules; they do not add product behavior in this release. No future features are committed here.
Placeholder boundary. Where the café has not supplied real photography, high-quality placeholder coffee photography is used and every placeholder is clearly marked (a data-placeholder attribute plus a visible caption) so real photos can be swapped in. The Instagram reference is authoritative for look, colour, and mood, but its pixels were unretrievable; the user's stated warm cream / muted sage palette is the operative brief and is reproduced, not replaced. The user's later feedback explicitly rejects brown, so the espresso-brown member of that palette is superseded by a deep ink-green primary while the warm, calm, premium mood is preserved.
Motion reference boundary. The 8080 3D-camera-portfolio reference is inspiration_only: it informs the quality and fluidity of motion (cinematic camera-like depth, seamless section transitions, scroll-driven flow) and nothing else — none of its content, copy, or imagery is imported. The slug reference image is authoritative for the animated slug character's visual basis only; it is not a content source.
All eight pages are anonymous public surfaces with no access requirement. Each is a section of the single scrolling site, reachable via the sticky header, the mobile slide-in menu, and in-page anchors. All content is bilingual and mirrors under RTL.
SlugCharacter (inline SVG slug with a fluid, squash-and-stretch crawl loop and a soft sage trail) layered over the hero's lower edge, never over readable text or controls.transform layers for a camera-like parallax).Each story carries provenance: explicit (source-stated), basic_default (accepted default), or required_inference (indispensable inferred mechanics).
FR-1 — Complete working site (explicit) As a Café visitor I should land on a complete, production-quality, fully working Sluggish website (not a mockup) so that I can learn about the café and act on it.
FR-2 — Slow-down brand theme (explicit) As a Café visitor I should feel a calm, warm, premium, quietly playful "slow down" mood — with a tasteful sloth/snail-pace wink, never cartoony — so that the café's philosophy is communicated.
FR-3 — Instagram-derived palette via CSS variables, revised away from brown (explicit) As a Café visitor I should see a warm cream / muted sage palette with a deep ink-green primary — drawn from the café's Instagram mood and revised away from brown per the user's feedback — implemented with CSS variables so it is easy to change.
:root; café can swap real Instagram hexes in one place.FR-4 — Typography with Arabic support (explicit) As a Café visitor I should see one characterful display serif for headings and one clean sans for body, with Arabic support via a matching Arabic font (e.g., IBM Plex Sans Arabic or Tajawal).
FR-5 — Bilingual with mirrored RTL (explicit) As an Arabic-speaking visitor I should switch to Arabic via a language toggle and get a fully mirrored RTL layout (not just translated text) so that the experience matches my reading direction.
dir="rtl", logical properties mirror the grid, all copy in Arabic. Failure/recovery: toggle remains reachable in header and footer. Continuation: browse all sections in Arabic.FR-6 — Hero (explicit) As a Café visitor I should see a full-bleed hero image or short muted looping video of coffee being poured, a tagline (e.g., "Good things take time"), a primary CTA "View Menu" and a secondary CTA "Find Us" so that I immediately understand the café and can navigate.
FR-7 — Our story (explicit) As a Café visitor I should read short, warm copy about the slow-coffee philosophy with an image so that I connect with the café's values.
FR-8 — Filterable menu (explicit) As a Café visitor I should filter the menu by Coffee, Cold Drinks, Tea, Desserts, and Breakfast, and see each item's name, short description, price in KWD with 3 decimals (e.g., 1.750 KWD), optional photo, and tags (iced, vegan, signature) so that I can decide what to order.
FR-9 — Single editable menu data source (explicit) As the café owner I should have menu data live in one JSON/array so that it is easy to edit.
FR-10 — Signature drinks carousel (explicit) As a Café visitor I should browse a horizontal scroll or carousel of 4–6 signature hero items with large photography so that I can see the café's signature drinks.
FR-11 — Gallery with lightbox and Instagram link (explicit) As a Café visitor I should browse an Instagram-style masonry grid with a lightbox and a link to the café's Instagram handle so that I can see the café's visual world and follow it.
FR-12 — Visit us with Kuwait-time open badge (explicit) As a Café visitor I should see the address (area, block, street), an embedded Google Map, opening hours, and an "Open now / Closed" badge computed using Kuwait time (Asia/Kuwait) so that I know where the café is and whether it is open now.
FR-13 — Contact and delivery links (explicit) As a Café visitor I should reach the café via a WhatsApp click-to-chat button, phone, Instagram, and delivery links (Talabat / Deliveroo / Jahez) so that I can contact or order.
FR-14 — Footer (explicit) As a Café visitor I should see a footer with logo, hours, socials, and a language toggle so that I can re-orient and switch language at the end of the page.
FR-15 — Buttery smooth scrolling and reveals (explicit) As a Café visitor I should experience buttery smooth scrolling (Lenis or native smooth scroll) with scroll-triggered fade/slide-up reveals, staggered menu items, and subtle parallax on hero and gallery images so that the site feels slow and luxurious.
transform and opacity; never animate layout properties; hold steady 60fps including mid-range phones.FR-16 — Micro-interactions (explicit) As a Café visitor I should get magnetic/hover-lift buttons, soft image zoom on hover, smooth menu-filter transitions (FLIP/layout animation), and slow luxurious page-section transitions (ease-out, 400–800ms) that never block interaction.
FR-17 — Brand delight touch (explicit) As a Café visitor I should encounter a small delightful brand touch — a slowly drifting steam animation over the hero cup, or a loader that "takes its time" but completes in under 1s.
FR-18 — Reduced motion (explicit)
As a motion-sensitive visitor I should have parallax and large motion disabled when prefers-reduced-motion is set, so that the site remains comfortable and usable.
FR-19 — Performance targets (explicit) As a Café visitor on a phone I should get Lighthouse 95+ on Performance, Accessibility, Best Practices, and SEO on mobile, with LCP < 2.0s, CLS < 0.05, and INP < 200ms.
FR-20 — Image optimization (explicit)
As a Café visitor I should receive AVIF/WebP images with responsive srcset, lazy loading below the fold, explicit width/height, blur-up placeholders, and a preloaded hero image so that the page loads fast without layout shift.
FR-21 — Font optimization (explicit)
As a Café visitor I should receive self-hosted, subset fonts with font-display: swap and a preloaded display font so that text renders quickly.
FR-22 — Minimal JS, static output (explicit) As a Café visitor I should get minimal, code-split JS with no heavy libraries for things CSS can do, delivered as static/SSG output.
FR-23 — Mobile-first responsive (explicit) As a Café visitor on a phone I should get a mobile-first, fully responsive layout from 360px to 1920px.
FR-24 — Accessibility (explicit) As a visitor using assistive technology I should get semantic HTML, keyboard navigability, visible focus states, AA contrast, and alt text on every image.
FR-25 — SEO (explicit) As a search engine or social platform I should receive meta tags, an Open Graph image, LocalBusiness / CafeOrCoffeeShop JSON-LD schema with address, hours, and geo, a sitemap, and EN/AR hreflang so that the café is discoverable and correctly indexed.
FR-26 — Sticky header and mobile menu (explicit) As a Café visitor I should get a sticky, minimal header that hides on scroll down and shows on scroll up, with a mobile slide-in menu.
FR-27 — Clean componentized code and single content file (explicit) As the café owner I should have clean, organized, componentized code with content (menu, hours, contact) kept in one editable data file so that updates are easy.
FR-28 — Placeholder photography marked (explicit) As the café owner I should have high-quality placeholder coffee photography where images were not supplied, with every placeholder clearly marked so that I can swap in real photos.
FR-29 — Animated slug character (explicit) As a Café visitor I should meet a fluid, animated slug character based on the user's supplied slug reference image so that the "slow down" theme becomes a living, tactile brand gesture rather than a static logo.
transform and opacity; the loop must hold 60fps on mid-range phones and must not block the hero CTAs.FR-30 — Super-slick fluid motion language (explicit) As a Café visitor I should experience motion with the fluidity and cinematic quality of the 8080 3D-camera-portfolio reference — without copying its content — so that the site feels expensive, seamless, and unhurried.
transform and opacity; never animate layout properties; hold steady 60fps including mid-range phones; transitions never block interaction.Flow A — Café visitor discovers the café and decides to visit (English)
Flow B — Arabic-speaking visitor reads the site in Arabic
dir="rtl", the grid mirrors via logical properties, and all copy renders in Arabic with the Arabic font. (all sections)Flow C — Café owner updates content
data-placeholder attribute and captions. (assets)The creative direction (sensual slow minimalism after Karim Rashid) is authoritative for this section. The user's warm cream / espresso brown / muted sage palette brief is reproduced, not replaced.
Muse and headline: Karim Rashid — sensual pop minimalism; headline gesture: "Good things take time." set oversized in italic display serif.
Colour tokens (light mode, CSS custom properties on :root):
--bg: #F3EBDD — warm cream page ground (largest area).--surface: #FBF6EC — lighter cream for cards, menu rows, mobile slide-in panel.--text: #1E2A24 — deep ink-green body ink on cream (readable contrast).--primary: #24382E — deep ink-green; headings, wordmark, filled buttons, dark section grounds (cream text passes AA at body size). Replaces the rejected espresso brown.--accent: #7E8F6A — muted sage; single hot accent (~8% of surface): open-now badge, signature tags, active filter pill, hover underline, steam wisps, slug trail.--muted: #6F7A6C — muted sage-grey; secondary copy, rules, hairlines only (never body text on cream without darkening).:root and from all component styles.Typography:
clamp(); display sizes as ranges, e.g. clamp(2.5rem, 9vw, 8rem).Shape language: Rashid's organic capsule and blob vocabulary, restrained — pill-shaped buttons and filter chips, 28–40px soft radii on image frames and menu cards, curved section boundaries where cream meets ink-green, one recurring "slow" capsule motif as section divider and loader, and the animated slug's soft, rounded silhouette as the living expression of the same vocabulary. Glossy surfaces implied by a single soft top highlight on ink-green blocks and buttons — no glassmorphism, no gradients behind text.
Layout: Mobile-first asymmetric editorial grid; hero full-bleed pour photograph with an oversized flush-left tagline on a cream block breaking the image edge; sections alternate cream and deep ink-green grounds with curved boundaries; Menu single-column ruled rows on mobile → two-column asymmetric at 768px → 12-column at 1280px with sticky filter pills; Signature drinks horizontal snap-scroll of capsule-cropped photos; Gallery true masonry (CSS columns) with lightbox; Arabic mirrors via dir="rtl" and logical properties.
Imagery style: High-quality placeholder coffee photography, clearly marked — full-bleed pour shots, macro crema and latte-art, warm-lit café interiors with cream and wood, sage-toned ceramics; organic crops (capsule and arch masks, bled off edge, rotated 1–2°) but never over readable text.
The public entry is not a centred SaaS hero. It is a full-bleed, slightly warm-graded photograph of coffee being poured into a cream ceramic cup, occupying the right 60% of the viewport at 1280px (full width on mobile). Overlapping it from the left, a solid cream #F3EBDD block with a curved right edge carries the oversized Fraunces italic tagline "Good things take time." at clamp(2.5rem, 9vw, 8rem), flush-left and stacked over three lines, with the two CTAs — deep ink-green-filled View Menu pill and sage-outlined Find Us pill — pinned beneath it. A small sage Open now capsule sits top-right of the image. Three barely-there sage steam wisps drift up over the cup. Along the hero's lower edge, the animated slug crawls slowly across a sage trail, its body rippling with squash-and-stretch — the brand's slow-down wink, rendered as refined inline SVG, never cartoony and never over readable text. At 375px the block becomes a full-width band beneath the image with the same type-scale floor; no text ever sits under the photograph's busy area. The type, not the photo, is the hero.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
Landing Hero Motion Brief
motion/react) or GSAP for scroll-linked transforms; IntersectionObserver reveals with 600–800ms ease-out fade/slide-up; staggered menu rows (40ms apart); FLIP-style filter transitions; magnetic hover-lift on buttons; soft 1.05 image hover scale; steam wisps; slug crawl loop; capsule loader filling ~700ms; camera-like layered depth on hero, story, and gallery; shared-element zoom into the Gallery lightbox; scroll-velocity skew/scale on the Signature drinks row.transform and opacity; never animate layout properties; hold steady 60fps including mid-range phones; section transitions never block interaction.prefers-reduced-motion; disable parallax, steam, slug crawl, and large motion.srcset, lazy-load below fold, explicit width/height, blur-up placeholders, preload hero image.font-display: swap, preload display font.dir="rtl" and logical properties, not text-only translation.data-placeholder + caption) for swap-in.motion/react) or GSAP for scroll-linked, velocity-aware transforms, with lightweight IntersectionObserver/FLIP techniques — no heavy animation library where CSS suffices, and no WebGL/Canvas/Three.js.[paste their menu], [hours], [number], [links], [area, block, street]), the build uses clearly marked placeholder values.transform and opacity; never animate layout properties.prefers-reduced-motion: disable parallax and large motion when set.dir="rtl" and logical properties.#24382E) that replaces the rejected espresso brown across headings, wordmark, filled buttons, and dark section grounds.data-placeholder + caption) to be swapped for real café photos.
No comments yet. Be the first!