A custom Shopify storefront for a demi-fine jewelry brand β built on Dawn, restyled from the ground up.
Warm editorial art direction, a token-driven design layer, and three bespoke sections β without forking Dawn's rendering logic, accessibility work, or Online Store 2.0 contract.
- Overview
- Landing page design
- Design system
- Architecture
- Feature set
- Project structure
- Local development
- Merchant controls
- Accessibility
- Performance
- Roadmap
- Credits
Carly Taylor Jewelry sells gold and silver pieces in the $25β$100 band β jewelry meant to be layered and lived in rather than kept in a box. The storefront had to read as boutique and editorial while still behaving like a high-volume commerce theme: fast, accessible, and fully editable by a non-technical merchant from the Shopify theme editor.
This theme takes Dawn as its base and treats it as a
dependency, not a starting point to overwrite. Dawn's cart logic, Section Rendering API
wiring, predictive search, variant picker, and focus management are left untouched. Everything
brand-specific lives in an additive ct-* layer alongside it.
| Base theme | Shopify Dawn (Online Store 2.0, theme blocks enabled) |
| Custom sections | 3 built from scratch (ct-hero, ct-category-grid, ct-newsletter) + 8 Dawn sections extended |
| Custom stylesheets | 7 scoped files, all built on one shared token layer |
| Custom JavaScript | 2 files, both pure progressive enhancement |
| Build step | None β ships as-is to Shopify |
| Typography | Cormorant Garamond (self-hosted) + Karla (Shopify font library) |
The homepage is composed entirely of theme-editor sections defined in
templates/index.json β every heading, image, link and colour scheme
below is a merchant-editable setting, not hardcoded markup.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ANNOUNCEMENT BAR scheme-7 Β· ink on warm white β
β "Welcome to Carly Taylor β use code WELCOME for 10% offβ¦" β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β HEADER β logo Β« main menu Β» β βΎ β β
β sticky Β· transparent over the hero Β· solidifies after 40px scroll β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘
β β
β βCARLY TAYLOR JEWELRY βββββββββββββββββ β
β β ββ hero image β β
β βPieces you'll reach βββββββββββββββββ β
β β for every day βββββββββββββββββ β
β β βββββββββββββββββ β
β βGold and silver jewelry made to be lived in. βββββββββββββββββ β
β β βββββββββββββββββ β
β β( Shop the collection ) βββββββββββββββββ β
β β
β β ct-hero Β· 100vh Β· left-to-right scrim Β· eager-loaded LCP image β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘
β Shop by category β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β β β β β β β β β β
β β NECKLACEβ β BRACELETβ β EARRING β β ANKLET β β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β ( View all pieces ) β
β β‘ ct-category-grid Β· 4-up β 2-up Β· zoom-on-hover Β· collection-boundβ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘
β CUSTOMER FAVORITES β
β Featured pieces β
β ββββββββββ ββββββββββ ββββββββββ ββββββββββ β
β β img β β β img β β β img β β β img β β β = circular β
β β β β β β β β β quick add β
β ββββββββββ ββββββββββ ββββββββββ ββββββββββ β
β Tigerlily Ava Debbie Julia β
β necklace earrings anklet earrings β
β β’ featured-collection Β· 8 hand-picked products Β· 4-up β 2-up β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘
β βββββββββββββββββββββ β
β ββ banner image ββ The Art of Everyday Luxury β
β βββββββββββββββββββββ Inspired by you, designed by us β
β βββββββββββββββββββββ β
β βββββββββββββββββββββ [ SHOP NOW ] β
β β£ ct-hero reused Β· mirrored scrim Β· square CTA Β· lazy-loaded β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘
β Experience Carly Taylor β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β β β β β β β β β β β β β β
β βMade for β β Quality β βPriced toβ βGifts β β
β βEvery Dayβ βThat Lastsβ β Layer β βThat Feelβ β
β β β―β―β― β β β―β―β― β β β―β―β― β β β―β―β― β β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β β€ multicolumn restyled Β· 96px PNG icons Β· flush equal-height cardsβ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘
β STAY IN TOUCH βββββββββββββββββββββ β
β Be first to meet βββββββββββββββββββββ β
β the new pieces ββ newsletter img β β
β βββββββββββββββββββββ β
β [ Your email address ] ( Subscribe ) βββββββββββββββββββββ β
β β₯ ct-newsletter Β· image side is a setting Β· inline success state β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘
β FOOTER scheme-7 Β· ink surface β
β β Carly Taylor Shop Company Follow along β
β brand blurb All pieces Contact β β β β
β Necklaces Shipping Questions? β
β Bracelets Privacy hello@carlytaylor.co β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Β© 2026 Carly Taylor Jewelry [visa] [mc] [amex] [shop] β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| # | Section | Type | What it does | Key decisions |
|---|---|---|---|---|
| β | Hero | ct-hero (custom) |
Full-viewport brand statement with directional scrim and pill CTA | eager_load flag marks it as the LCP image; <em> inside the heading renders in italic Cormorant, controlled from the editor |
| β‘ | Category grid | ct-category-grid (custom) |
Four collection tiles bound to real collections | Falls back to bundled placeholder art when a collection has no image; label overlays are readable at any crop |
| β’ | Featured pieces | featured-collection (extended) |
Eight hand-picked products, secondary image on hover | Added a product_list setting so merchandising is explicit rather than "first N in collection"; added circular inline quick-add |
| β£ | Promo banner | ct-hero (reused) |
Mid-page campaign break | Deliberately not a second section type β same section, mirrored gradient_direction and content_position, square CTA variant |
| β€ | Experience grid | multicolumn (extended) |
Four value propositions with custom iconography | Added ct_icon (theme-asset PNG instead of an uploaded image) and ct_card_style so Dawn's stock multicolumn still works untouched when the flag is off |
| β₯ | Newsletter | ct-newsletter (custom) |
Split image / email capture | Wraps Shopify's native customer form, so double opt-in and spam handling stay native |
- Editorial, not e-commerce-default. Serif display type, generous vertical rhythm (72β88px section padding), and photography that bleeds to the viewport edge.
- Warm neutrals only. No pure black, no pure white anywhere on the page β the darkest
ink is
#3a2d23and the lightest surface is#fbf7f2. - One accent family. Bronze and champagne carry every hover, focus ring, and eyebrow.
- Two heading breaks are intentional. The hero and newsletter headings break before their italic phrase, matching the source design, and both are editor-editable rich text.
- Motion is a whisper. A single
0.35s easetoken drives every transition, and every animated rule has aprefers-reduced-motioncounterpart.
All brand values live in one file β assets/ct-tokens.css β loaded once
in layout/theme.liquid immediately after Dawn's base.css.
Ink & surfaces
| Token | Value | Role |
|---|---|---|
--ct-ink |
#3a2d23 |
Headings, dark surfaces, primary buttons |
--ct-cream |
#fbf7f2 |
Page background (scheme-6) |
--ct-surface |
#f1e8dc |
Raised cards, category tiles |
--ct-body |
#5c4e40 |
Body copy β deliberately lighter than heading ink |
--ct-muted |
#7a6a5a |
Captions, form labels, meta |
--ct-on-dark |
#f3e6d8 |
Text on the ink footer (scheme-7) |
Brand accents
| Token | Value | Role |
|---|---|---|
--ct-accent |
#a67b5b |
Secondary button label |
--ct-bronze |
#be9373 |
Eyebrows, link hover, button hover |
--ct-champagne |
#dbb894 |
Focus rings, on-dark hover, announcement highlight |
Borders & feedback
| Token | Value | Role |
|---|---|---|
--ct-border |
#e9ddd0 |
Hairline dividers |
--ct-border-strong |
#c9b49e |
Chips, outlined controls |
--ct-input-border |
#dacbb7 |
Form fields |
--ct-success / --ct-error |
#7c9070 / #b0563e |
Form and inventory states |
Geometry & motion
| Token | Value | Note |
|---|---|---|
--ct-container |
128rem (1280px) |
Dawn's page_width setting only steps in hundreds, so the exact value is pinned here |
--ct-radius-pill |
999px |
Exceeds every Dawn radius setting's 40px cap |
--ct-radius-panel β¦ --ct-radius-sm |
20 / 16 / 14 / 10px |
Cards, drawers, inputs |
--ct-ease |
0.35s ease |
Single shared duration for all interactive transitions |
--ct-tracking-eyebrow |
0.3em |
Uppercase eyebrow labels |
| Role | Family | Delivery | Weights |
|---|---|---|---|
| Display / headings | Cormorant Garamond | Self-hosted .woff2 in assets/ |
400, 500, 600, 400 italic |
| Body / UI | Karla | Shopify font library (settings.type_body_font) |
400 |
Cormorant Garamond is not available under that exact name in Shopify's font_picker library β
only the visually distinct Cormorant display cut β so it is self-hosted rather than substituted.
The 400 weight is <link rel="preload">ed because it renders the above-the-fold hero copy.
Three classes are defined once in the token layer and reused by every section, so there is a
single definition of each brand control: .ct-eyebrow, .ct-btn (with --dark, --light,
--square, --outline variants), and .ct-chip.
Two schemes were added to Dawn's native colour-scheme system rather than being hardcoded, so merchants can apply them to any section from the theme editor:
| Scheme | Background | Text | Used by |
|---|---|---|---|
scheme-6 |
#fbf7f2 cream |
#3a2d23 ink |
Every light section, cards, cart drawer |
scheme-7 |
#3a2d23 ink |
#f3e6d8 warm white |
Announcement bar, footer |
The guiding rule of this codebase: if Dawn can already express it, Dawn expresses it.
- Dawn's settings-driven variables (
--color-*,--page-width, radius settings) remain the source of truth. Thect-*tokens only cover roles Dawn's six-field colour-scheme model has no slot for. - No cart, variant, search, or form logic is reimplemented. The custom cart drawer styling sits
on top of Dawn's own drawer; the newsletter section wraps Shopify's native
customerform. - Extended Dawn sections stay backwards compatible.
multicolumnandfeatured-collectiongain new settings that are off by default β with the flag off, the section renders exactly as stock Dawn does. - Section Rendering API contracts are preserved.
sections/cart-icon-bubble.liquidmirrors the header's cart markup so live cart updates don't desync the header.
Every brand-owned file, class, setting, and locale key is prefixed ct- / ct_. This makes the
custom surface area greppable in one command and makes future Dawn upgrades a mechanical diff
rather than an archaeology exercise.
# Everything this project owns, in one query
grep -rn "ct-\|ct_" --include=*.liquid --include=*.css --include=*.js .Each stylesheet is loaded by the section that needs it, not globally:
| File | Loaded by | Scope |
|---|---|---|
ct-tokens.css |
layout/theme.liquid |
Global β tokens + shared primitives only |
ct-header.css |
header.liquid, announcement-bar.liquid |
.ct-header |
ct-homepage-sections.css |
hero, category grid, featured, multicolumn, newsletter | Per-section roots |
ct-footer.css |
footer.liquid |
.footer |
ct-product.css |
main-product.liquid |
.ct-product |
ct-cart-drawer.css |
cart-drawer.liquid |
.ct-cart-* |
ct-contact.css |
contact-form.liquid |
.ct-contact |
No bundler, transpiler, or preprocessor. The theme is plain Liquid, CSS custom properties, and vanilla JavaScript β it deploys to Shopify exactly as it exists in this repository. That keeps the theme editor's live preview honest and removes an entire class of "works locally, breaks in production" failures.
- Sticky, context-aware header β transparent over the homepage hero, solidifying past a 40px scroll threshold. Measures the announcement bar and header as one group so the hero pull-up clears both, and recalculates after webfonts settle.
- Announcement bar with merchant-controlled inline emphasis (the promo code is a rich-text
<strong>, not hardcoded markup). - Predictive search and customer accounts wired into the header as explicit, merchant-toggleable settings.
- Breadcrumb derived from the current collection, falling back through
collectionβproduct.collections.firstβ product type. - Accordion detail tabs β Dawn's native
<details>markup, height-animated via the Web Animations API. With JavaScript disabled the accordions still open and close correctly. - Mobile sticky add-to-bag bar β a Dawn-less component that never duplicates form state; its
button targets the real product form via the HTML
form=attribute, so the sameproduct-form.jshandler runs. - Live line total on the add-to-bag button (
Add to bag β 2 Γ $48), updating with quantity. - Inventory state indicators (in stock / low / backorder / out).
- Free shipping progress bar in the cart drawer, driven by a merchant-set threshold
(
ct_free_shipping_threshold, default$75) with a live remaining-amount message. - Branded empty state using the monogram mark.
- Circular inline quick-add on product cards, with proper
aria-labelper product.
- Rebuilt two-column contact page β intro column plus form column, with accessible error summary, per-field error links, and a focus-managed success state.
.
βββ assets/
β βββ ct-tokens.css # Design tokens, @font-face, shared primitives
β βββ ct-header.css # Header + announcement bar
β βββ ct-homepage-sections.css # Hero, category grid, newsletter, featured, experience
β βββ ct-footer.css # Footer
β βββ ct-product.css # Product detail page
β βββ ct-cart-drawer.css # Cart drawer + free-shipping bar
β βββ ct-contact.css # Contact page
β βββ ct-accordion.js # PDP accordion height animation (progressive enhancement)
β βββ ct-sticky-atc.js # Mobile sticky add-to-bag bar
β βββ cormorant-garamond-*.woff2 # Self-hosted display typeface
β βββ full-logo.svg / mark.svg # Wordmark + monogram
β βββ ct-*.jpg / ct-icon-*.png # Section placeholder art + experience icons
β
βββ sections/
β βββ ct-hero.liquid # β
Custom β hero and promo banner
β βββ ct-category-grid.liquid # β
Custom β shop-by-category tiles
β βββ ct-newsletter.liquid # β
Custom β split image / email capture
β βββ header.liquid # Extended β sticky + transparent-over-hero
β βββ footer.liquid # Extended β manual link blocks + follow block
β βββ featured-collection.liquid # Extended β product_list, eyebrow, circular quick add
β βββ multicolumn.liquid # Extended β theme-asset icons, card style
β βββ main-product.liquid # Extended β breadcrumb, accordions, sticky ATC
β βββ contact-form.liquid # Rebuilt β two-column layout
β
βββ snippets/
β βββ card-product.liquid # Extended β inline circular quick add
β βββ cart-drawer.liquid # Extended β free-shipping progress, branded empty state
β βββ buy-buttons.liquid # Extended β live line total
β
βββ templates/
β βββ index.json # Landing page composition
β βββ product.json
β βββ page.contact.json
β
βββ config/
β βββ settings_data.json # Brand palette (scheme-6/7), typography, layout
β βββ settings_schema.json # + free-shipping threshold setting
β
βββ locales/
β βββ en.default.json # Storefront strings
β βββ en.default.schema.json # Theme-editor strings for all custom settings
β
βββ docs/ # Repository documentation only β not uploaded to Shopify
βββ logo.svg # Wordmark (fixed bronze, for this README)
βββ mark.svg # Monogram
β = section that does not exist in Dawn.
Requires the Shopify CLI (v3+) and a development store.
# 1. Authenticate
shopify auth login
# 2. Start a live-reloading dev server against your store
shopify theme dev --store your-store.myshopify.com
# 3. Lint against Shopify's theme rules
shopify theme check
# 4. Push to an unpublished theme for review
shopify theme push --unpublished --theme "Carly Taylor β Review"Note β the homepage expects collections with the handles
necklace,bracelets,earrings, andanklets. Without them, the category grid renders its bundled placeholder art and links to/collections/all.
Everything below is editable from Online Store β Themes β Customize β no code changes needed.
| Setting | Location | Default |
|---|---|---|
| Hero image, heading, body, CTA label & link | Hero section | Bundled art + brand copy |
| Hero height, scrim direction, content position | Hero section | Fullscreen, left, middle-left |
| CTA style (light / dark / square) | Hero section | Light |
| Category tiles β collection, label, image | Category grid blocks | 4 tiles |
| Featured products β explicit product list | Featured collection | 8 products |
| Experience cards β icon, title, body | Multicolumn blocks | 4 cards |
| Newsletter image side, heading, body | Newsletter section | Right |
| Free shipping threshold | Theme settings β Cart | $75 |
| Announcement text + promo emphasis | Announcement bar | Welcome offer |
| Footer links, contact email, copyright | Footer blocks | Brand defaults |
| Search / account icon visibility | Header section | Both on |
Accessibility is treated as a constraint, not a pass at the end.
- Dawn's foundations are preserved β focus trapping in the drawer and modals, skip links,
visually-hiddenlabelling, and live regions are untouched. - Reduced motion is honoured everywhere. Every transition and animation in the
ct-*layer has aprefers-reduced-motion: reducecounterpart; the PDP accordion script exits early and falls back to native<details>behaviour. - Progressive enhancement, strictly. Both custom scripts null-check every lookup and fail silently to a working baseline. With JavaScript off: accordions still toggle, the product form still submits, the cart still works.
- Focus is always visible β
:focus-visiblerings use--ct-champagneat 2px with 2px offset, on every custom control. - Semantic headings β heading levels are editor-controlled (
heading_tag) so a merchant can keep exactly one<h1>per page. - Icon-only controls carry per-item accessible names (e.g. quick-add announces the product title, not just "Add").
- No build, no framework, no runtime dependency. Total custom JavaScript is two small
vanilla files, both
defer-loaded, plus a handful of inline section scripts. - LCP is explicit. The hero exposes an
eager_loadsetting that drivesloading="eager"andfetchpriority="high"; the mid-page banner reuse leaves it off and lazy-loads. - Fonts are self-hosted with
font-display: swap, and only the single above-the-fold weight is preloaded. - Stylesheets are section-scoped β the product page never downloads footer or contact CSS.
- Scroll work is throttled through
requestAnimationFramewith passive listeners.
- Collection page template restyle (filters, sort, pagination)
- Blog / journal template
- Product bundle and "complete the look" cross-sell block
- Metafield-driven care instructions on the PDP
- Additional locale files beyond
en.default
Built on Shopify Dawn, Shopify's reference Online Store 2.0 theme, which is released under the MIT License.
Typefaces: Cormorant Garamond and Karla, both under the SIL Open Font License.
Brand, art direction, and all ct-* source in this repository are the property of
Carly Taylor Jewelry.