Bidder 1 Restaurant
Crunchwrap Supreme
The single source of truth for Fizook.com and the Reverse Auction web app β colors, gradients, type, components, motion, and voice. Synced with fzk-new.html (the live auction, v8) and the marketing / account suite β index.html, auction-details.html, fizook-demo.html, fizook-register.html, fizook-vendor.html, fizook-history.html, fizook-profile.html (all v3). The v3 marketing release added the hero banner, gradient mesh, glassmorphic surfaces, gradient text, scroll-progress bar and in-sheet hold-flash. The v8 live-auction release expanded the bidder pool to 19 restaurants (distributed 8 / 8 / 3 across a 3-auction series) and introduced the battle ticker and the Live Top 3 podium. The hold tray remains 8 slots.
Fizook flips the auction model on its head β vendors compete to lower their price for everyday meals. The product needs to feel alive, fast, and friendly: bidders are dropping prices in real time, and users should always feel they are catching a deal.
prefers-reduced-motion.Every color is defined as a CSS custom property on :root. Reference the token name (e.g. var(--primary)) β never hard-code the hex.
β οΈ --surface-3 currently lives only in auction-details.html β it's a setup-flow extension for nested summary rows. Don't paint other pages with it unless the rest of the suite adopts the token.
These hexes only appear inside gradients (hero banner, gradient text, scroll bar, animated held ring). They are not tokens β never reach for them in flat fills.
Gradients are first-class brand assets in v3. Six canonical recipes show up across every page; pick the one that fits the surface and don't invent new ones.
Page backgrounds use multi-layer radial gradients on body plus a slowly-drifting overlay on body::before (animated via fzMeshShift, 22 s loop). Replaces the old full-page background image β same depth, no asset weight.
/* body */
background:
radial-gradient(900px 500px at 10% -10%, rgba(124,58,237,.10), transparent 60%),
radial-gradient(900px 500px at 110% 0%, rgba(36,129,188,.12), transparent 60%),
radial-gradient(700px 400px at 50% 110%, rgba(22,163,74,.06), transparent 70%),
#f8fafc;
background-attachment: fixed;
radial-gradient(160% 80% at 0% 0%, rgba(36,129,188,.04), transparent 60%) to blend onto the mesh without flattening.linear-gradient(180deg, rgba(36,129,188,.05), rgba(124,58,237,.05)) with a 14 % border tint.linear-gradient(90deg, rgba(36,129,188,.06), rgba(124,58,237,.06)) swept in plus a 2 px translateX.Fixed 3-px stripe at the top of every page (z-index: 90). JS scales width from 0 % to 100 % as the user scrolls. Same gradient as the held-tray ring so the two read as a family.
Fizook uses Inter as the single UI typeface β loaded via Google Fonts at five weights (400 / 500 / 600 / 700 / 800). Code samples use JetBrains Mono. Set the base via the html, body font-family.
font-family: 'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
Spacing follows multiples of 4 px. Radius is tokenized so cards, buttons, and pills feel consistent.
| Token | Use | Sample |
|---|---|---|
| 4px | Tight gaps inside compact components (chip iconβtext) | gap:4px |
| 6β8px | Stat tiles, button padding, dense grids | padding:8px |
| 10β14px | Card padding, gaps between cards | padding:12px 14px |
| 16β24px | Section padding, hero edges | padding:16px |
| 24β48px | Hero / page-top breathing room | padding:48px 24px |
Three discrete elevation levels. Hover lifts elements by 1β4 px and bumps to the next shadow.
All buttons use .btn as the base, then layer a variant. Border-radius is locked at 6 px. Padding is 10px 14px; icons live to the left with a 6 px gap.
In v3 the dock's Start button (and every btn-success on the marketing pages) gets a white-gradient gloss that sweeps left-to-right on hover via a ::after pseudo-element. Hover this to see it.
btn-ghost-light replaces btn-ghost when the surface is dark (hero, final CTA, live-peek). 16 % white fill, 30 % white border.
10β11 px / 14β16 px padding, .88β.95 rem font..btn-lg β 13 px / 20 px padding, 1 rem font. Used for hero CTAs..btn-block β full-width inside its container; standard for the login form.Same base button, branded fill colors. Hover lifts 2 px and scales the icon 1.15.
translateY(-1px)). Disabled state drops opacity to 55% and removes lift. btn-success in v3 has a 0.6 s shimmer sweep on hover; btn-success on the dark hero uses a heavier 0 6px 18px shadow.Chips drive filter / sort selection. The active chip switches to the primary gradient. Same 6 px radius as buttons for visual consistency.
Inputs are minimal: 1 px border, 8 px radius, 8β10 px padding, white surface. No focus ring is custom-styled β rely on the browser's default outline.
Tiny pills communicate state in-line: feed kind, savings, trend direction, ribbons. They share the 999 px pill radius.
The status text in the Fizook Auction card has four shapes β empty before first start, the running composition with a flashing red word + flashing red hand, paused, and the multi-part ended composition.
.ended-static (solid red "Ended!"), .ended-flash (solid green action phrase), and .hand-bounce (green hand icon bouncing Β±4 px). Every 7 s the action phrase swaps between "Choose or Hold Any Deal!" and "or, Run Another Fizook Auction!". The endedFlash keyframe is defined but currently unused β re-enable it by adding animation:endedFlash 1s ease-in-out infinite to .ended-flash.Cards are the primary container pattern. White surface, 14 px radius, 1 px border, soft shadow. Hover lifts and tightens the border.
Crunchwrap Supreme
Whopper
Quesadilla
repeat(4, 1fr) on tablet and up. The live auction draws from a pool of 19 restaurants split across a 3-auction series: auction 1 renders 8 cards (2 rows Γ 4), auction 2 renders another 8 cards, and auction 3 renders the remaining 3 cards (a partial row). Each card always carries the same 14 px radius / soft-shadow chrome β the layout adapts, the chrome does not. On phone (β€ 559 px) cards collapse to a logo-only grid; the full detail (meal, prices, actions) lives in the bottom sheet that opens on tap.v3 introduces a family of high-energy marketing surfaces β used on the live auction (a slim banner above the status card) and on the homepage (a full split hero, animated counters, a live peek demo, value-prop and audience cards, a green final CTA, and a dark footer). All share the same gradient + ambient-motion language.
Gradient block with two floating colored blobs (cyan + pink, blurred 48 px), 5 falling-coin emoji and 3 drifting sparkles. The status card below it is lifted with a -40 px bottom margin so it floats over the banner edge β creates a single composition. The headline and sub copy are the v8 "battle" framing; the marketing homepage uses a different hero (see below).
::before/::after blurred blobs (animated fzFloatA 9 s / fzFloatB 11 s) + absolutely-positioned .fz-coin spans (fzCoinFall 8β13 s, staggered) + .fz-spark spans (fzSparkleDrift 7 s). Inner stack: pill tag β h1 with .grad text β max-560 px paragraph.The homepage uses a split hero β left pitch + right glass login card β and softer copy. The tag pill swaps to "Live Β· restaurants are bidding right now" and the headline reads "Restaurants compete for your business.". The lead paragraph below it is: "Fizook is a reverse auction for everyday meals. Tell us what you want, when you want it β hundreds of restaurants drop their prices in real time until your wallet wins." (The homepage demo widget renders 6 tiles as a sample; the marketing claim is the full marketplace, and the live auction itself runs the 19-bidder pool per series.)
Four tiles with gradient-text counters that animate 0 β target on scroll-into-view (IntersectionObserver). Color-coded: blue/purple (default), green, cyan, amber.
Used on the homepage "Why Fizook" grid. Hover lifts the card 4 px and rotates the gradient icon -8Β° + scale(1.08). A radial blue blob sits in the upper-left corner inside ::before.
Vendors compete for your order β prices only go down.
Watch the live activity feed as bidders undercut each other.
Stockpile favorites across 3 auctions, then pick the winner.
Three cards on the homepage segment users into Diner / Vendor / Returning user. Same hover lift as the feature card; arrow icon nudges right 4 px on hover.
Run an auction in 90 seconds β no card required.
Get startedWin demand from local diners β only pay when you win.
List my menuCloses every long-form marketing page. Green-to-teal gradient with a soft white halo radial in the upper-left.
See your wallet win β then come back for dinner tomorrow.
Sits flush at the bottom of every marketing page. #0b1220 background, white headings, 86 % opacity links. Social icons are 34 px circles that lift 2 px and switch to a cyan-tinted background on hover.
Cards that sit on top of the gradient hero use frosted-glass styling β semi-transparent white background, backdrop blur, subtle white border, and a soft halo behind the panel. Two patterns: a light glass card for forms (homepage login) and a dark glass pill for inline stats on the hero.
Sign in to start an auction.
background: rgba(255,255,255,.94), backdrop-filter: saturate(1.4) blur(10px), border: 1px solid rgba(255,255,255,.6), --shadow-lg, plus a ::before at inset: -1px with the cyanβpurpleβpink halo blurred 14 px at 55 % opacity. Inputs: 10 px radius, 36 px left padding for an absolutely-positioned icon.backdrop-filter: blur(8px). The strong uses one of the soft gradient-accent colors (#a7f3d0, #a5f3fc, #fbcfe8) so the number pops against the dark hero.The v8 live auction (fzk-new.html) doubled the bidder pool and added two new spectator-mode surfaces on top of the v3 chrome: a battle ticker that scrolls live commentary across the screen, and a Live Top 3 podium that surfaces the cheapest three bidders at any moment. The status hero also grew from 4 stats to 6.
repeat(4, 1fr) at β₯ 560 px; logo-only collapse at < 560 px (taps open the bottom sheet for detail).A sportscaster-style strip that sits between the hero banner and the status card. The left chip is a red "ON THE WIRE" label with a pulsing dot; the right belt is a CSS-driven horizontal scroll (.fz-ticker-belt with a 30 s linear-infinite translateX, duplicated content for seamless wrap). JS rewrites the belt with the latest 8β12 events every few seconds.
.drop (green bolt β a price cut), .lead (amber trophy β leaderboard swap), .war (cyan fire β multi-bidder skirmish), .event (purple bolt β lifecycle: start/pause/end). Vendor names use .ti-vendor (cyan-200 weight 700); prices use .ti-price (emerald-200 weight 800, tabular numerals). Hover (or prefers-reduced-motion) pauses the belt via .fz-ticker-belt.paused.Three glassmorphic tiles sit on the gradient hero. Grid order is silver β gold β bronze so the tallest gold tile lives in the middle (classic podium). Each tile shows medal pill β square logo β vendor β meal β live price. When a rank changes hands the tile flips and the medal glows briefly.
.fz-pod.empty) hides medal / vendor / price and dashes the border. Medal pills: gold = amber gradient, silver = slate gradient, bronze = darker amber gradient. Prices use cyan-200 (#a5f3fc) so they pop against the dark hero, matching the live-peek price treatment on the homepage.The status card's stat row carries six tiles (was four in v2). On phone they restack to 3-up, then 2-up at β€ 419 px. After the auction ends, Best price now and Biggest savings become clickable shortcuts that open the offer sheet.
--primary), Best price now = green (--success), Biggest savings = purple (--accent). The other three tiles use the default text color so the eye lands on the money tiles first.Five buttons in fixed order: Start (success), Pause (ghost, disabled at rest), Reset (ghost), Settings toggle (ghost, phone-only β opens the Rounds / Speed panel), Clear All (red ghost fa-undo). On phone the five spread to equal width with a 10 px gap. The settings panel is always visible on desktop and toggled on phone via the sliders icon.
The setup flow (auction-details.html), signup pages (fizook-register.html, fizook-vendor.html), and account suite (fizook-profile.html, fizook-history.html) share a family of form patterns that aren't used on the auction or marketing pages. They follow the same tokens and motion language; only the components are new.
Mutually-exclusive segmented control β Delivery vs. Pickup, Solo vs. Group, Daily vs. One-off. Each pill is a .toggle wrapping a hidden radio plus .toggle-bg and .toggle-label. Active pill swaps to the primary gradient. Six-pixel radius and small padding keep them compact.
Used by the vendor signup form for "what days are you bidding". Each button is a 46 px minimum-width 10 px-radius pill. Three labels per button: .day-abbr (Mon β default), .day-full (Monday β wider viewports), .day-off-mobile/-desktop (the offset state).
Auto-fill grid (minmax(64px, 1fr)) of 60-minute slots. Selected hours flip to the success gradient (green = "yes, bidding open").
Square (14 px radius) for cover images, circle (.is-circle) for logos/avatars. Dashed 2 px border, surface-2 fill, hover lifts and turns the border brand-blue. Replaces native <input type="file"> chrome.
A right-rail card that mirrors a real bidder card in miniature so the vendor sees how their listing will appear. Updates as they edit menu / pricing fields.
Crunchwrap Combo
Dark gradient block with a soft cyan radial in the upper-right corner. Always carries an icon-titled h4 and a bulleted list. Used on auction-details and fizook-vendor to coach the user mid-form.
One row per OAuth provider β icon tile, name + sub-label, and a pill that shows the connection state. .conn-state.on uses the success-light pill; .off uses the muted-fill pill.
Soft-red bordered block that holds destructive actions (delete account, leave vendor program). Heading + explanation + a single red button. Always last on the profile page so it's hard to hit by accident.
Deleting your account erases your auction history and any held offers. This can't be undone.
A floating bar that slides in from the bottom the moment the user edits any field (and out when they save or revert). Carries a one-line summary on the left and the action buttons on the right.
Dark gradient card that summarizes a closed auction β eyebrow ("Auction #1842"), meal name, vendor, then a row stack of "Was / Now / Saved" with a totaled "You paid" at the bottom. Used inside the history detail sheet.
auction-details.html defines an additional surface token --surface-3: #eef2f7 for tertiary fills inside the multi-step setup form (e.g. nested cards, summary rows). It is scoped to that page β don't propagate it elsewhere unless the rest of the suite adopts it.Long-form detail uses a bottom sheet on phone (full-screen feel) and a centered modal at β₯ 900 px. Brief feedback uses a top-center toast that auto-dismisses after 1.7 s.
Two seasoned tacos paired with golden fries and a chilled drink β bold spices, familiar comfort.
When the user clicks Hold offer from inside the bottom sheet, a centered green pill fades in over the sheet body for ~3 s ("Deal N of 8 Held"), then fades out. The sheet stays open so the user can immediately hold another offer. Implemented as .sheet-hold-flash.show; uses role="status" + aria-live="polite" for screen readers.
.toast shadow gains an inner 0 0 0 1px rgba(255,255,255,.08) inset ring so the chip reads as a layered surface, not a flat tile. Auto-dismiss is still 1.7 s.Triggered when the user clicks the muted Start button after running 3 auctions in a series. The "Yes" button wipes every held deal, resets the series counter, and starts a brand-new auction; "Cancel" (or the backdrop / Γ ) closes the dialog and leaves everything intact.
You've reached the limit of 3 auctions per series. From here you can either pick a deal from the offers you've held, or start a brand new auction series.
A live, prepended list of price drops and system events sits inside a card titled "Live activity". Drop rows are clickable shortcuts into the offer sheet; info rows are read-only.
.feed-clickable class β hand-pointer cursor, soft hover background, and a one-line "Tap to view this deal" tooltip. A single delegated click handler reads the row's data-bi / data-id and calls openSheet(bi, id). Info rows (auction lifecycle messages, hold / accept confirmations) stay non-interactive.linear-gradient(90deg, rgba(36,129,188,.06), rgba(124,58,237,.06)) on hover and slide right 2 px. Makes the row read like a button without changing the markup.fa-bolt icon pulses its drop-shadow from 4 px to 12 px every 2.4 s (fzBoltShimmer keyframe) so the "Live activity" header always reads as alive.v2 motion communicates state (live, paused, ended, best). v3 layers on a second class of ambient motion β slow, calm, looping β that says "this product is alive" without demanding attention. State-motion is fast (β€ 1 s); ambient motion is slow (1.6 s β 22 s). Every long-running animation is gated by prefers-reduced-motion.
All v3 keyframes are namespaced with the fz prefix to avoid collisions with v2 animations. They drift, breathe, and shimmer; none of them snap or bounce.
@keyframes slideInL Β· 0.7s β hero pitch fades in from -24 px on the X axis.@keyframes slideInR Β· 0.7s β login card mirrors the same motion from +24 px.@keyframes cardIn Β· 0.6s β every section.block fades up 20 px on first paint.@keyframes coinFall, floatA, floatB, gradShift, pulse β unprefixed twins of the auction-page fz-* versions, used inside the homepage hero.data-count-to tiles tween 0 β target on IntersectionObserver entry. No CSS.These keyframes live on a single page each and are intentionally not fz-prefixed β they're local flourishes, not part of the shared design language. Treat them as one-offs; promote a name into the fz namespace before reusing it on a second page.
welcomeShift (gradient eyebrow drift), greetSwap (rotating greeting), wave (waving hand), beamDrift (light beam across stepper), sparkleDrift, startRipple / startWiggle (Start-button attention), bidderBounce (preview tiles), fadeIn.pricePop (number flash on price drop), hypeScroll (testimonial belt), perkIn (perk-card stagger), sparkBurst, beamDrift.avatarPulse (profile avatar halo), bounceX (page-tab indicator).@keyframes endedFlash β green β light-green color/opacity loop. Defined in CSS; .ended-flash intentionally renders solid right now. Re-enable by adding animation:endedFlash 1s ease-in-out infinite to .ended-flash.translateY(-1 to -2 px) on hover, transition 150 ms ease.::after pseudo, 600 ms ease.4 px, gain a translucent purple 0 0 0 2px ring, and bump to a 0 16px 30px shadow.4 px, swap to --shadow, and rotate the gradient icon -8Β° + scale(1.08); arrow icon nudges 4 px right.translateX(2 px), hand-pointer cursor.2 px and switch background to rgba(34,211,238,.25) on hover.Fizook uses Font Awesome 4.7 (the classic CSS-class API). Icons are sized via parent font-size and inherit color via currentColor.
Used only as drifting confetti/sparkle inside the marketing hero (and the v3 in-auction banner). Always wrapped in aria-hidden="true". Do not use emoji inside body copy, toasts, or buttons.
β Browse alternatives in the Floating Emoji Picker β preview swaps live on a hero banner and copy the snippet.
Fizook talks like a calm but excited friend who just saw a great deal. Always present-tense, always plain English. Punctuation can be expressive but doesn't need to be loud.
A "series" is up to 3 sequential auction runs. Held deals carry across runs so the user can stockpile favorites before deciding. After three runs, the Start button mutes and a popup gates a fresh start. v8 widened the bidder pool to 19 restaurants split across the series β 8 / 8 / 3 β while keeping the hold tray at 8 slots.
.btn-muted style (gray-on-gray, no shadow) but stays clickable. Clicking it opens the series-limit popup.state.heldIds, resets state.auctionCount to 0, un-mutes Start, then immediately runs auction 1 of a fresh series.auctionCount is preserved, so once you've burned 3 you can't restart by pressing Reset.fa-undo in the dock) β full wipe: feed, held deals, auction state, AND auctionCount. Returns the page to its just-loaded state.All pages center inside a max-width:1280px container with 16 px gutters. The grid uses display:grid with explicit column counts at each breakpoint. v8 holds the bidder grid at repeat(4, 1fr) on tablet+: auction 1 and 2 each render 8 cards (2 rows of 4) and auction 3 renders the remaining 3 (partial row) from the 19-restaurant pool. The held tray stays 8-up on tablet+.
max-width:1280px; margin:0 auto; padding:0 16px;.wrap on marketing pages uses margin:-40px auto 0 to lift the first section over the gradient hero edge β same depth trick as the v3 banner.scroll-behavior:smooth on html,body for in-page anchor links.body::before animated mesh overlay (so it sits behind every painted element).Ambient motion and gradient text are pretty, but they have to fail gracefully for users who can't or don't want them. v3 adopted these baselines on every new surface β apply them to anything new.
Every long-running ambient animation is wrapped in a prefers-reduced-motion media query that sets animation:none. Users keep the colors and layouts; they lose the looping movement.
@media (prefers-reduced-motion: reduce) {
body::before,
.fz-hero-banner::before, .fz-hero-banner::after,
.fz-coin, .fz-spark,
.chip.active, .feed-head h3 i,
.held .held-grid, .held-counter,
.fz-hero-banner h1 .grad {
animation: none !important;
}
}
role="status" + aria-live="polite" so screen readers announce "Deal 3 of 8 held" without interrupting.aria-hidden="true". Same for the floating ::before/::after blobs (no markup needed).aria-label ("Welcome to Fizook", "Live auction welcome", "Sign in", etc.) so the page outline is meaningful.aria-current="page" in addition to the visual .active class.<label>; the password reveal toggle uses aria-label="Show password"; autocomplete is set on email + password.0 0 0 3px rgba(36,129,188,.18)) β never override the browser's default outline without supplying one of your own.#0f172a / #fff β 17:1, well above AA.#64748b / #fff β 4.7:1, AA-passing for body but not for headlines. Keep --muted at β₯ 14 px.#0b1220) where the headline sits β never let h1 land on the brightest violet stop.