palette DESIGNER DOCUMENTATION

Torvali
Theme Spec v2

Everything you need to build and distribute a custom CSS theme for any Torvali storefront. Themes are a single .css file uploaded by merchants from their dashboard.

What's new in v2

text_fields
Merchant font picker

Merchants select from 20 Google Fonts in the dashboard. The chosen font is applied via --font. Themes should use var(--font) rather than hardcoding a typeface.

visibility_off
Hero hide toggle

Merchants can hide the hero section entirely. When hidden, #sfHero has display:none. Themes must not assume the hero is always visible.

view_column
Multi-column footer

Footer grid is now flexbox. Up to 3 page columns are appended dynamically. Merchants label each column. On mobile all columns stack vertically.

category
Categories on product page

The category bar (.sf-cats) now appears on product pages too. Clicking a category navigates back to the storefront filtered by that category.

article
Page footer parity

Custom pages (page.html) now render the same full footer as the storefront — About Us, contact, policies, and all page columns.

link
Nav page links

Pages marked "Show in nav" now correctly appear in #sfNavPages on the main storefront. Style them via #sfNavPages a.

How it works

1

Write a CSS file

Override CSS variables and component selectors. Your file is additive — it loads after the base storefront.css.

2

Merchant uploads it

Merchants go to Dashboard → Storefront → Theme Studio and upload your .css file. Max 500 KB.

3

Goes live instantly

The storefront loads your CSS on every page. The merchant's accent color and chosen font still apply on top — your theme must respect both var(--accent) and var(--font).

Quick Start

Copy this minimal template and start customizing:

/* ───────────────────────────────────────────────── my-theme.css | Torvali Theme Spec v2 Replace every placeholder with your own values. ───────────────────────────────────────────────── */ /* 1. Override global design tokens */ :root { --text: #111827; /* body text */ --text-muted: #6b7280; /* secondary text */ --border: #e5e7eb; /* dividers & card borders */ --surface: #f9fafb; /* section backgrounds */ --white: #ffffff; /* card/nav backgrounds */ --radius: 10px; /* card border radius */ --shadow: 0 1px 3px rgba(0,0,0,.07); /* --accent is set by the merchant's brand color — don't override */ /* --font is set by the merchant's font choice — don't override */ } /* 2. Style the navigation bar */ .sf-nav { background: rgba(255,255,255,.95); border-bottom: 1px solid var(--border); } /* 3. Hero section (may be hidden by merchant) */ .sf-hero-bg { background: linear-gradient(135deg, var(--accent), #1e1b4b); } /* 4. Product cards */ .sf-product-card { border-radius: var(--radius); border: 1px solid var(--border); } .sf-product-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,.1); } /* 5. Footer */ .sf-footer { background: var(--text); } /* 6. Anything else you want to customize... */

CSS Variables

All variables live on :root. Override only what you need — every variable has a sensible default.

Variable
Default
Purpose
--accent
#4F46E5
⚠ Set by merchant brand color — do not override
--font
'Inter', system-ui
⚠ Set by merchant font choice — do not override. Used on body { font-family: var(--font) }
--text
#111827
Primary body text
--text-muted
#6B7280
Secondary / caption text
--border
#E5E7EB
Dividers, card borders, input borders
--surface
#F9FAFB
Section / container backgrounds
--white
#FFFFFF
Nav, cards, cart sidebar background
--radius
10px
Border radius for cards and inputs
--shadow
0 1px 3px…
Card drop shadow

Merchant Controls

These settings are configured by the merchant in their dashboard and affect the storefront at runtime. Your theme must coexist gracefully with all combinations.

SettingWhere setEffect on storefront
--accentBranding → Accent colorApplied as CSS variable on :root
--fontTheme Studio → FontGoogle Font loaded + applied as CSS variable. Body uses var(--font)
hide_heroHero Content → Hide#sfHero set to display:none. Do not rely on hero always being present.
announcementBranding → Announcement bar.sf-announcement shown above nav when filled
footer columnsFooter → Column labelsUp to 3 .sf-footer-col divs appended to .sf-footer-grid. Grid is flexbox; columns stack on mobile.
layoutLayout Studiobody gets class: layout-sidebar, layout-magazine, layout-nordic, etc.

Selector Reference

Navigation

.sf-announcement — top banner bar
.sf-nav — sticky top nav bar
.sf-logo — store name / logo link
.sf-search-input — search bar
#sfNavPages a — nav page links
.sf-account-btn — account icon button
.sf-cart-btn — cart icon button

Hero Section

.sf-hero — full hero wrapper (may be hidden)
.sf-hero-bg — gradient/color background
.sf-hero-img — banner image (if uploaded)
.sf-hero-eyebrow — tagline above heading
.sf-hero h1 — hero heading
.sf-hero-desc — description paragraph
.sf-hero-btn — "Shop now" CTA button

Categories & Products

.sf-cats — category filter bar (storefront + product page)
.sf-cat-btn — category button
.sf-cat-btn.active — selected category
.sf-products — product grid container
.sf-product-card — individual product card
.sf-product-img — image container
.sf-product-name — product title
.sf-product-brand — brand label
.sf-price — current price
.sf-compare-price — crossed-out was-price
.sf-discount-badge — % off badge

Footer

.sf-footer — footer wrapper
.sf-footer-grid — flex row of columns
.sf-footer-brand — first column (name + about)
.sf-footer-col — dynamic page columns (up to 3)
.sf-footer-col h4 — column heading
.sf-footer-col ul li a — page links
#sfContactCol — contact column (hidden if empty)
.sf-footer-bottom — copyright + policy links

Cart, Checkout & Auth

.cart-sidebar — sliding cart panel
.checkout-modal-inner — checkout dialog
.auth-overlay — sign-in / register overlay
.auth-card — auth modal card
#legalModal — policy modal (terms, returns, etc.)

Layout body classes

body — default grid layout
body.layout-sidebar — sidebar + product grid
body.layout-magazine — editorial magazine layout
body.layout-minimal — minimal list layout
body.layout-boutique — large image boutique
body.layout-compact — compact dense grid
body.layout-nordic — wide nordic style
body.theme-bold — bold dark theme class
body.theme-warm — warm cream theme class
body.theme-minimal — minimal light theme class
body.theme-vivid — vivid gradient theme class
body.theme-dark — dark immersive theme class

Rules & Constraints

cancel Don't Do

  • Override --accent — it's set by the merchant's brand color
  • Override --font or set font-family on body — the merchant's font choice takes precedence
  • Use !important except as a last resort for specificity conflicts
  • Load scripts or untrusted fonts — only .css is accepted
  • Exceed 500 KB file size
  • Use position:fixed in a way that obscures cart, checkout, or auth UI
  • Assume the hero is always visible — merchants can hide it

check_circle Best Practices

  • Use var(--accent) for interactive elements — buttons, hover states, links
  • Use var(--font) only for heading overrides (e.g. serif headings with sans body)
  • Test with hero hidden, footer with 0–3 page columns, and nav with page links
  • Test all 7 layout body classes and all 5 built-in theme classes
  • Test at 375px mobile width — footer must stack, nav must stay usable
  • Test with 5 different accent colors including dark and bright values
  • Namespace any custom selectors with a unique class prefix
  • Include a comment header with theme name, version, and author

Full Example — "Luxe" Theme

A complete theme demonstrating v2 best practices: respects merchant font, warm palette, elegant product cards, multi-column footer.

/* ───────────────────────────────────────────────────────── luxe.css | Torvali Theme Spec v2 Author: Jane Designer · jane@example.com Version: 2.0.0 Description: Warm, boutique theme — works with any merchant font ───────────────────────────────────────────────────────── */ /* Global tokens */ :root { --text: #1a1208; --text-muted: #8a7260; --border: #ecdcc8; --surface: #fdf8f2; --white: #fffef9; --radius: 2px; --shadow: 0 2px 12px rgba(80,40,0,.08); /* --accent and --font are left to the merchant */ } /* Background */ body { background: #fdf8f2; } /* Headings in a serif — respects merchant body font via var(--font) */ h1, h2, h3, .sf-logo, .sf-section-title { font-family: 'Georgia', 'Times New Roman', serif; } /* Nav */ .sf-nav { background: rgba(253,248,242,.97); border-color: var(--border); } .sf-logo { font-style: italic; color: var(--accent); font-size: 1.4rem; } #sfNavPages a { color: var(--text-muted); } #sfNavPages a:hover { color: var(--accent); } /* Category bar */ .sf-cat-btn { border-radius: 2px; font-family: inherit; } .sf-cat-btn.active { color: var(--accent); border-bottom-color: var(--accent); } /* Hero (only styled when visible — merchant may hide it) */ .sf-hero:not([style*="display:none"]) .sf-hero-bg { background: linear-gradient(160deg, #8b5e3c, #2d1906); } .sf-hero h1 { font-style: italic; letter-spacing: -.02em; } .sf-hero-btn { border-radius: 2px; background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.3); color: #fff; letter-spacing: .1em; text-transform: uppercase; font-size: .8rem; } /* Product cards */ .sf-product-card { border-radius: 2px; border-color: var(--border); background: var(--white); } .sf-product-card:hover { box-shadow: 0 8px 32px rgba(80,40,0,.14); transform: translateY(-4px); } .sf-product-name { font-style: italic; } .sf-price { color: var(--accent); } /* Footer — flexbox grid; columns stack on mobile automatically */ .sf-footer { background: #1a1208; } .sf-footer-col h4 { letter-spacing: .08em; text-transform: uppercase; font-size: .72rem; }

Testing Checklist

send

Share your theme

Built something beautiful? Share it with the Torvali community. We feature the best themes in our marketplace for merchants to install with one click.