Topnote
A scent-discovery Shopify theme for home fragrance.
Version 0.1.0 · Shopify Online Store 2.0 · Liquid, JSON templates, native CSS and JavaScript
1. Purpose
Topnote is built for home fragrance stores that sell by note, room, mood, and intensity: candles, reed diffusers, room sprays, incense, refills, and sample sets. The buying anxiety is not “what is this?” It is “will this smell right in my room, and will it be too strong or too weak?”
The signature interaction is the Scent Finder. Four questions — room, mood, intensity, and format — narrow a collection to three products using product tags. A sample-first CTA sits beside the questions so a customer can try before committing to a full bottle. Everything is native Liquid and vanilla JavaScript: no app, no remote API, no dead button.
2. What is included
- Complete Online Store 2.0 theme: JSON templates, sections, blocks, header and footer section groups.
- Scent-led home page: full-bleed scent hero, five-family scent index, four-question scent finder, sample set, note pyramid, layering story, FAQ, and newsletter.
- Product page with top/heart/base notes, intensity meter, burn time or longevity, room size, wax and wick, clean-burn and refill notes, layering pairs, and a sample-first CTA.
- Note-card product cards with scent family, top/heart/base notes, intensity meter, format, price, and quick add.
- Dark editorial collection page with native filters for family, intensity, room, format, wax, and season.
- Cart drawer, predictive search, account component, gift card, password, 404, blog, article, and contact templates.
- Responsive images, keyboard access, visible focus, reduced-motion support, and semantic landmarks.
- Theme editor settings for colors, typography, layout, product cards, social links, and SEO.
- Licensed Shopify Burst photography (six product squares, two landscapes) and an importable six-product CSV in
demo/topnote/.
3. Requirements
- A Shopify store with the Online Store channel.
- A Shopify plan that supports the features you want to use (selling plans, pickup, markets).
- Shopify CLI 4.x for local development, or the Shopify admin upload workflow.
- A development store is strongly recommended before publishing.
4. Installation
Option A — Shopify CLI
npx shopify theme dev --store your-store.myshopify.com --path themes/topnote
To upload an unpublished theme:
npx shopify theme push --store your-store.myshopify.com --path themes/topnote --unpublished
Option B — Admin upload
- Create a ZIP of the
themes/topnotedirectory (do not zip the parent folder). - In Shopify admin, go to Online Store → Themes → Add theme → Upload ZIP file.
- Preview the theme, then publish when ready.
5. Configuration
Theme editor
Open Online Store → Themes → Customize. The main settings are:
- Colors — near-black, cream, amber, surface, rule, and smoke.
- Typography — Fraunces headings, Work Sans body, base size, heading scale.
- Layout — page width, section spacing, corner radius, amber ambient glow.
- Product cards — scent family, note ladder, intensity meter, arch or rectangle portraits.
- Social media — profile URLs used by the footer.
- SEO — social share image and favicon.
If the store's font library does not offer Fraunces, choose Playfair Display in the heading font picker. The theme reads the picker, so no code change is required.
Home page sections
The default index.json composes:
- Scent hero
- Scent families
- Scent finder
- Sample set
- Note pyramid
- Layering
- FAQ
- Newsletter
Every section can be reordered, hidden, or duplicated in the editor.
Scent Finder
The finder is a section setting plus a fixed four-question form:
| Question | Tags used |
|---|---|
| Room | room-living, room-bedroom, room-kitchen, room-bathroom |
| Mood | mood-calm, mood-bright, mood-warm, mood-grounding |
| Intensity | intensity-light, intensity-medium, intensity-strong |
| Format | format-candle, format-diffuser, format-spray, format-incense, format-refill, format-sample |
Choose a collection in the Scent finder section. Every product in that collection is rendered into a hidden pool with its tags and availability. On submit, vanilla JavaScript scores each product by exact tag matches, prefers available products, lowers the score of the sample set unless the customer asked for a sample, and clones the top three note cards into the results grid. The sample product setting adds a quick-add sample CTA below the questions.
The form posts to the selected collection URL, so without JavaScript the button still works as a clear path to the full collection. The results panel is hidden until JavaScript fills it.
Limitations: the finder depends on consistent product tags. Products without matching tags still appear as fallback results, but they will not be ranked. The finder searches the chosen collection only; it is not a global search. A no-JS customer sees the collection, not a personalized result.
Product signature
snippets/product-signature.liquid reads these product metafields, with section block fallbacks:
| Metafield | Type | Used by |
|---|---|---|
custom.scent_family |
Single-line text | Product card, product eyebrow |
custom.format |
Single-line text | Product card, burn-time label |
custom.top_notes |
Single-line text | Note pyramid |
custom.heart_notes |
Single-line text | Note pyramid |
custom.base_notes |
Single-line text | Note pyramid |
custom.intensity |
Single-line text | Intensity meter; use Light, Medium, or Strong |
custom.burn_time |
Single-line text | Burn time, longevity, or uses depending on format |
custom.room_size |
Single-line text | Room size |
custom.wax |
Single-line text | Wax |
custom.wick |
Single-line text | Wick |
custom.clean_burn |
Multi-line text | Clean-burn note |
custom.refill |
Multi-line text | Refill note |
custom.layering_pairs |
Single-line text | Comma-separated product handles for layering |
Missing rows are hidden. If no note, spec, prose, layering, or sample data exists, the signature section is not rendered at all.
The Sample product setting on the product section adds a sample-first CTA to every product page. It is hidden when blank and hidden on the sample product's own page. The CTA uses the sample product's first available variant and the shared quick-add behavior.
The burn-time label changes by format: diffusers show Longevity, room sprays show Uses, sample sets show Try, and candles, refills, and incense show Burn time. The value still comes from custom.burn_time, so a diffuser can hold “3–4 months” and a spray can hold “60+ uses”.
Demo catalog and tags
demo/topnote/products.csv contains six products: a candle, a diffuser, a room spray, a sample set, a refill, and incense. Tags cover all five families, four rooms, three intensities, six formats, wax, season, and mood. The demo README documents the exact tag vocabulary and collections.
Collections and filters
Create these collections:
scent-finder— all six products; used by the finder.samples— the sample trio.candles,diffusers,room-sprays,incense— format shelves.woody,citrus,floral,smoky,fresh— family shelves.layering— a curated pairing shelf.
In the Search & Discovery app, add tag filters for Family, Intensity, Room, Format, Wax, and Season. The collection page renders Shopify's native filters, active pills, sorting, and pagination.
Recommended content
- Pages: About, Scent guide, Contact (use the
page.contacttemplate), Samples, Shipping. - Menus:
main-menu,footer,customer-account-main-menu. - Two articles so the blog and article templates are testable.
- Shipping, refund, terms of service, and privacy policies.
6. Customisation
- Design tokens — edit
config/settings_schema.jsondefaults or use the theme editor. CSS variables are generated insnippets/css-variables.liquidand rendered in the theme, password, and gift card layouts. - Theme CSS —
assets/theme.csscontains the sensory editorial art direction.assets/base.csscontains shared commerce mechanics and content utilities. - Theme JavaScript —
assets/base.jscontains shared cart, search, header, media, and motion behavior.assets/theme.jscontains the scent finder. - Sections — add or duplicate sections in
sections/. Each section has a{% schema %}block. - Product page blocks — reorder or hide blocks in the editor. The purchase form is a block, so it can sit after the scent dossier.
- Translation — edit
locales/en.default.json. The theme usestfilters for storefront strings. - Icons —
snippets/icon.liquidcontains original SVG paths.
7. Validation status
shopify theme check --path themes/topnote --fail-level error: 0 offenses in the final run.node tools/validate-themes.mjs: required files, JSON, section references, render references, account component, localization, and Follow on Shop checks pass for Topnote.- Live-store installation, scent-finder cart behavior, checkout, filters, selling plans, pickup, and Lighthouse were not executed in this environment. Run the commands in section 8 on a development store before submission.
8. Pre-launch checklist
npx shopify theme check --path themes/topnote --fail-level error
node tools/validate-themes.mjs
npx shopify theme dev --store your-store.myshopify.com --path themes/topnote
Then verify on the development store:
- Scent Finder: all four questions, three results, sample CTA, reset, and no-JS collection fallback.
- Product page: note pyramid, intensity meter, burn-time label by format, layering links, and sample CTA.
- Variant selection, price, compare-at price, unit price, media, and add-to-cart state.
- Cart page and drawer quantities, remove, note, discounts, selling plans, and accelerated checkout.
- Collection filters for family, intensity, room, format, wax, and season; query preservation on search.
- Gift card recipient toggle and hidden fields.
- Mobile header, menu, search, cart, and horizontal overflow at 390×844.
- Heading order, keyboard access, focus states, plural labels, and reduced motion.
9. Known limitations
- The finder depends on consistent tags and the chosen collection. It is not a global search.
- Without JavaScript, the finder submits to the collection rather than rendering personalized results. The sample CTA and quick-add forms still post normally.
- The sample-first CTA is a section setting, not a per-product metafield. Use the same sample product across the catalog, or create alternate product templates with a different sample product.
- The demo catalog uses licensed Shopify Burst photography. Original SVGs remain in
demo/topnote/images/as offline fallbacks. - The
theme_infodocumentation and support URLs point todeivisoft.eu. Publish those pages before submission. - The theme ships one preset. Additional presets require a
/listingsfolder and separate demo stores. - Shopify Theme Store acceptance is not guaranteed. Review the current requirements and test on a development store before submitting.
10. Support and license
See LICENSE.md for the commercial license terms. See the repository root THIRD_PARTY_NOTICES.md for third-party components. This theme does not bundle third-party JavaScript libraries or font files.
For support, use the contact channel defined by the seller. Theme support covers theme bugs and documented configuration; it does not include custom design or code changes.
FAQ
How do I install the theme?
Install the ZIP from the Theme Store or upload it under Online Store → Themes → Add theme → Upload ZIP file. Then publish or preview the theme.
Does the theme require apps?
No. The core experience uses native Shopify features. App blocks are available for optional integrations such as reviews, subscriptions, or wholesale pricing.
How do I get support?
Use the support form. Include your store URL, theme name, and a description of the issue. We reply within two business days.
How do updates work?
Theme Store purchases include updates. Download the latest version from the Theme Store or your Shopify admin and apply it to a duplicate of your theme before publishing.