Skip to content

Storefront inventory

What the Nova-family storefront themes share, and what each one has copied. Measured on 2026-10-28 at development commit 3a72258d7. Use it to decide which components are worth sharing; it records facts, not decisions.

Themes covered: nova, brock, atelier, depot, pop, spec, ridge, diorama, bistro. Every theme except Bistro is layered directly on Nova; Bistro is layered on Brock (Bistro, Brock, Nova), so it inherits Brock's fragments. The legacy Bootstrap theme is out of scope. How a template is found is in Theme resolution.

How the numbers were taken

  • Changed lines is diff a b | grep -c '^[<>]': lines removed plus lines added, so a one-line edit counts 2.
  • vs Nova compares a theme's copy with nova/<same path>. vs Brock compares with brock/<same path>. Brock is the baseline for the copies because the other layered themes were built from it.
  • Residual (written n→r) is the Brock diff after normalising each theme's class prefix to THEME in both files (brock-, at-, depot-, pop-, spec-, rg-, dio- and the matching message-key prefix, plus the short b-, d-, p-, sp- forms). A residual of 0 to 4 is the same markup with a rename. The short-prefix rule also rewrites Bootstrap's d-flex, so residuals on pages that use it (merchandisingNode, product, searchResults) are inflated by 2 to 4 lines of rename noise, not real differences.
  • CSS counts include every .css file under the theme's css/ folder. Nova's folder includes its extensions/ styles.

1. Fragment fork matrix

Each cell is changed lines vs Nova / changed lines vs Brock→residual. A dash means the theme ships no copy. Brock's cell shows only the Nova diff. Template length is Brock's line count.

Chrome fragments (fragment/)

File (Brock lines) Brock Atelier Depot Pop Spec Ridge Diorama Bistro
pagination (55) 98 98 / 40→2 98 / 40→2 98 / 40→2 98 / 40→2 - - -
sort-dropdown (15) 27 27 / 14→4 27 / 14→2 27 / 14→2 27 / 14→2 - - -
category-nav (31) 70 64 / 40→38 70 / 22→0 70 / 22→0 70 / 22→0 - - -
account-status (18) 32 27 / 15→15 32 / 14→0 32 / 14→0 32 / 14→0 - - -
mini-basket (178) 221 200 / 175→81 213 / 150→16 213 / 150→18 213 / 150→16 - - -
facet-rail (85) 150 153 / 97→55 150 / 68→2 147 / 67→5 150 / 68→2 - - -
footer (101) 86 81 / 81→49 83 / 61→7 83 / 61→7 83 / 61→7 73 / 81→77 59 / 73→71 -
auth-head (260) 88 109 / 45→25 88 / 22→2 - 101 / 39→27 - 114 / 56→46 -
head (153) 19 68 / 69→63 106 / 107→101 58 / 59→53 76 / 77→71 78 / 81→75 69 / 72→66 -
nav (170) 491 523 / 264→232 529 / 196→90 537 / 236→152 529 / 192→82 461 / 226→208 463 / 234→232 500 / 257→259
collection-product-grid (67) 91 - - - - - - -
promoCodeStyles (51) 64 - - - - - - -

Notes on the rows:

  • Pagination is five copies of the same file. The residual of 2 is one comment line that names the theme. Nothing else differs.
  • Category nav, account status: Depot, Pop and Spec are the same file as Brock after a rename (residual 0). Atelier's copy is a different design.
  • Sort dropdown: the only non-rename difference is Atelier's no-JS Apply button, which uses at-btn--ghost where the others use --outline.
  • Mini basket: Depot, Pop and Spec match Brock apart from the quantity stepper's class names (THEME-mini__stepper against THEME-stepper) and a clear-basket block Brock has and they lack (see "Behaviour that has drifted").
  • Facet rail: Depot and Spec match Brock (residual 2, comments). Pop renders each value as a pill and drops the checkbox glyph, which is a real design difference (residual 5). Atelier's rail differs in structure.
  • Footer: Depot, Pop and Spec match Brock except for Brock's footerNotice hook (for Bistro) and its commerceChromeEnabled guard on the payments row.
  • Auth head: a copy of Nova's with the theme's own stylesheet and tokens. Brock and Depot are the same file after the rename (residual 2); Atelier and Spec each add about 25 lines.
  • Head: Brock's differs from Nova's by only 19 lines (it keeps Nova's structure); every other theme differs from Nova by 58 to 106. The copies agree on the shared parts (viewport, bdgr.css, view transitions, canonical, shop-currency, pageTitles, theme colour) and differ in fonts, stylesheets and theme-specific scripts.
  • Nav is the one chrome fragment that is genuinely a per-theme design. Depot and Spec are the closest to Brock (residual 90 and 82 of about 210 lines).

Listing and page templates (top level and blog/)

File (Brock lines) Brock Atelier Depot Pop Spec Ridge Diorama
page.html (32) 13 13 / 12→2 13 / 12→4 13 / 12→2 13 / 12→4 13 / 12→6 14 / 13→9
product.html (41) 39 39 / 10→0 39 / 10→2 39 / 10→0 39 / 10→0 - -
searchResults.html (51) 90 80 / 44→38 90 / 20→2 90 / 20→0 90 / 20→0 - -
merchandisingNode.html (61) 88 108 / 62→56 92 / 34→12 88 / 28→0 88 / 28→0 - -
collection.html (43) 69 146 / 95→89 180 / 125→121 135 / 80→74 198 / 143→137 - -
blog/blogList.html (none in Brock) - - - - - 68 68
blog/blogPost.html (none in Brock) - - - - - 80 78
  • page.html, product.html, searchResults.html and merchandisingNode.html are thin shells (30 to 60 lines) that pick a layout and include the theme's listing or rail fragment. Four to six copies each are the same file after a rename.
  • collection.html is the one top-level template that differs a lot per theme (Spec carries the showcase layout, Depot a list view).
  • Ridge's and Diorama's blog templates differ from each other by 16 (list) and 30 (post) lines out of 37 and 46, so they are close to each other as well as to Nova's.
  • Nova's own page-3-9.html / page-9-3.html / page-empty.html are forked only by Ridge (page-3-9, page-9-3) and Brock (page-9-3).

Nova fragments no theme forks

breadcrumb, checkoutStyles, commerceTokens, content-results, facet-limit, facet-search, flags, gallery-labels, handoverItems, icons, landing-links, quick-filters, responsive-image, search-banner, search-form, search-scope, themeSelect, and all of nova/fragments/ (donationOptions, eventCardLine, fundraiserProgress, lineItemAttributes, quantitySelector).

Forks outside the requested scope

The same pattern repeats under productFragment/ and extensions/. Columns are vs Brock→residual.

File (lines in Brock) Atelier Depot Pop Spec Ridge Diorama Bistro
extensions/menuGeneratorExtension/menu (102) 66→4 66→4 66→4 66→4 145→129 153→147 147→147
extensions/collectionChooser/menu (76) 56→2 56→2 56→2 56→2 88→74 87→81 -
extensions/searchBar/main (54) 24→2 24→2 24→2 24→2 - - -
extensions/featuredProduct/main (9) 4→2 4→2 4→2 4→2 33→33 - -
extensions/trendingProducts/trendingProducts (9) 4→2 4→2 4→2 4→2 - - -
extensions/recentlyViewedProducts/... (8) 4→2 4→2 4→2 4→2 - - -
productFragment/productDetail (294) 298→182 318→288 185→53 332→302 - - -
productFragment/listingPageProduct (123) 150→126 128→100 84→50 131→105 - - -
productFragment/railCard (36) 39→29 19→7 23→9 22→12 - - -

2. Theme-only fragments

Fragments that exist in a theme and have no Nova counterpart.

Fragment Lines What it is
brock/fragment/brock-icons 33 Inline stroke icons for the chrome, 1em square, currentColor
brock/fragment/brock-listing 106 Shared body of search results and merchandising nodes (grid, rail, pager, sort, category nav)
brock/fragment/brock-rail 18 Titled row of product cards, scroll-snap on phones
brock/fragment/added-basket 59 "Added to your basket" pop-over, split out so Bistro can include it
brock/fragment/footerNotice 8 Empty hook at the top of Brock's footer; Bistro fills it
brock/fragment/themeAssets 9 Empty hook for extra stylesheets and scripts in a theme layered on Brock
atelier/fragment/atelier-icons, -listing (95), -rail (19) 33 Atelier's icons, listing body and rail
depot/fragment/depot-icons, -listing (132), -rail (18) 35 Depot's icons, listing body (with its category rail) and rail
pop/fragment/pop-icons, -listing (103), -rail (18) 33 Pop's icons, listing body and rail
spec/fragment/spec-icons, -listing (107), -rail (18) 35 Spec's icons, listing body and rail
spec/fragment/spec-showcase 66 One row of Spec's collection showcase: product on a spotlight, words beside it, rows alternate sides
ridge/fragment/ridge-icons 24 Ridge's chrome icons
diorama/fragment/diorama-icons 22 Diorama's chrome icons (header, menu, drawer)
diorama/fragment/diorama-cards 26 Post card shared by the latest-posts and related-posts blocks
bistro/fragment/footerNotice 20 Bistro's kitchen phone and allergen band, overriding Brock's empty hook
bistro/fragment/themeAssets 22 Bistro's menu stylesheet and script, loaded after Brock's

The -listing, -rail and -icons fragments are forks of Brock's under another name. Changed lines against Brock's after normalising the prefix:

Fragment Atelier Depot Pop Spec
*-rail 3 0 0 0
*-icons 6 10 6 8
*-listing 153 (different layout) 42 9 21

The icon files differ mainly in the stroke path data. Ridge and Diorama have no listing, rail or pager fragments.

3. Component families by class

Counts are distinct class names in the theme's own CSS folder and occurrences in its own template folder (the prefix is in brackets).

Buttons

Family Where Modifiers defined -btn uses in templates .x-btn rules in CSS
nova-btn Nova and every layered theme's shared pages -primary, -secondary, -outline, -error, -block, -sm, -lg, -icon (BEM-less, hyphenated) 328 in 46 files 44
brock-btn Brock, Bistro --block --buy --ink --lg --outline --quiet --sm (7) 121 in 15 files 23
depot-btn Depot --block --buy --dark --ink --lg --outline --pri --quiet --sm (9) 58 in 8 files 24
pop-btn Pop --block --buy --ink --lg --outline --paper --quiet --sm --tone (9) 58 in 8 files 46
spec-btn Spec --block --buy --dark --ink --lg --outline --pri --quiet --sm (9) 60 in 9 files 42
at-btn Atelier --block --ghost --sm --text (4) 22 in 5 files 10
rg-btn Ridge --block --cta --ghost --light --line (5) 25 in 3 files 18
dio-btn Diorama --accent --block (2) 5 in 1 file 8
bi-btn Bistro none 8 in 1 file 7
tb-btn Booking pages and booking extensions in Nova n/a 35 (25 in booking/manage.html)
le-btn Login error page n/a 19
ho-btn Basket handover extension n/a 13

Every layered theme's stylesheet also restyles .nova-btn (6 to 18 rules each, Diorama 18), because Nova's checkout, account and extension templates use nova-btn whatever the theme.

Brock, Depot, Pop and Spec share a modifier vocabulary (--buy, --ink, --outline, --quiet, --lg, --sm, --block); Depot and Spec also share --pri and --dark.

Cards, chips, badges, inputs, pagers, drawers

Distinct classes whose name contains the word (any BEM part), then template occurrences in the theme's own folder.

Family Nova Brock Atelier Depot Pop Spec Ridge Diorama
card 27 / 247 17 / 30 17 / 32 16 / 23 17 / 27 16 / 21 1 / 1 9 / 14
badge 6 / 8 5 / 8 5 / 12 5 / 8 5 / 2 5 / 8 0 0
chip 4 / 4 4 / 6 4 / 12 2 / 2 4 / 6 2 / 2 0 0
pill 6 / 59 0 1 / 1 0 0 1 / 2 0 0
input 6 / 108 6 / 23 4 / 5 4 / 5 4 / 5 4 / 5 0 0
field 5 / 52 5 / 35 1 / 2 1 / 2 1 / 2 1 / 2 0 0
select 6 / 7 4 / 7 4 / 7 4 / 7 4 / 7 4 / 7 0 0
pager 1 / 5 6 / 11 6 / 11 6 / 11 6 / 11 6 / 11 0 0
drawer 3 / 4 10 / 17 9 / 18 10 / 17 10 / 17 10 / 17 11 / 19 6 / 11
stepper 0 4 / 10 1 / 1 1 / 1 1 / 1 1 / 1 0 0

Total distinct own-prefix classes in CSS: Nova 491, Brock 409, Depot 288, Atelier 275, Pop 294, Spec 309, Ridge 149, Diorama 68, Bistro 55. CSS lines: Nova 7,272, Brock 2,373, Atelier 1,732, Depot 2,241, Pop 2,624, Spec 2,933, Ridge 860, Diorama 1,722, Bistro 254.

Reading the table: Brock, Atelier, Depot, Pop and Spec carry the same block set (pager, drawer, select, card, badge, chip) with the same counts, which is what a rename of one design looks like. Ridge and Diorama are content-site themes: no shop widgets, but each has its own drawer and buttons.

4. Tokens per theme

"Semantic" means the 79 tokens Nova defines on :root (--color-* 37, --font-* 18, --space-* 13, --radius-* 6, --shadow-* 5). "Re-pointed" means set again on :root, html or body in the theme's stylesheet. The --nb-* basket tokens are the public component tokens declared in nova/fragment/commerceTokens.html (35) plus seven read directly by the full basket and unified checkout templates (--nb-bar-bg, --nb-item-title-size, --nb-item-title-size-lg, --nb-item-title-weight, --nb-legend-size, --nb-sticky-top, --nb-total-weight).

Theme Private prefix (distinct props defined) Distinct custom props defined Semantic re-pointed (of 79) color / font / radius / shadow / space --nb-* set var() uses of own prefix
nova (defines them all) 105 79 37 / 18 / 6 / 5 / 13 0 n/a
brock --b- (17) 75 32 21 / 1 / 5 / 5 / 0 12 531
atelier --at- (27) 107 37 24 / 3 / 5 / 5 / 0 34 456
depot --d- (29) 106 35 21 / 4 / 5 / 5 / 0 26 498
pop --p- (19), --pop- (9) 101 37 24 / 3 / 5 / 5 / 0 18 477 + 232
spec --sp- (39), --bs- (34) 156 45 31 / 4 / 5 / 5 / 0 22 800
ridge --rg- (27), --bs- (17) 96 37 24 / 3 / 5 / 5 / 0 0 271
diorama --dio- (16), --bs- (27) 126 47 33 / 4 / 5 / 5 / 0 18 222
bistro --bi- (9), --rm- (11), --tb- (11) 40 0 0 / 0 / 0 / 0 / 0 3 (--nb-ink, --nb-line, --nb-muted) 89
  • No theme re-points any --space-* token, and none re-points --font-size-*, --font-weight-bold/medium/normal/semibold or --radius-full. These are the tokens Nova's own templates use most (549 --space-* and 190 --font-* uses in Nova's CSS).
  • Every theme re-points the colour ramp (--color-primary*, --color-gray-*, status colours), the --shadow-* set and five of six radii. The font family tokens are set by Atelier, Depot, Pop, Spec, Ridge and Diorama.
  • Own-prefix styling dominates: the theme's own listing, chrome and card CSS reads its private tokens (222 to 800 uses), not Nova's semantic ones. Ridge's own CSS uses semantic tokens twice.
  • Bistro re-points nothing, so it takes Brock's values, and its --nb-ink, --nb-line and --nb-muted are read by no template or stylesheet.
  • Public basket tokens (the --nb-* column counts every --nb-* a theme sets, of the 42 above): Atelier 34, Depot 26, Spec 22, Pop and Diorama 18, Brock 12. Ridge sets none (it has no basket). Of the 35 declared in commerceTokens.html, three are set by no theme: --nb-cta-shadow, --nb-image-ratio and --nb-title-font.

5. Inline styles and raw colours

Template counts cover the theme's own template folder (comments excluded). Raw hex is #rgb, #rgba, #rrggbb or #rrggbbaa. CSS hex is split into custom-property definitions (the palette; expected) and everything else (colours written straight into rules).

Theme Template files style=" attributes Hex in templates CSS hex, total CSS hex outside token definitions CSS hex in token definitions
nova 193 1,206 282 200 148 52
brock 47 66 12 33 13 20
atelier 27 12 6 48 13 35
depot 28 12 6 29 2 27
pop 26 10 4 47 14 33
spec 29 14 6 75 13 62
ridge 21 4 4 80 43 37
diorama 15 1 6 55 21 34
bistro 5 0 0 11 6 5

Nova holds nearly all inline styling (1,206 of 1,334 attributes, 90 percent). Depot is the cleanest theme (two hex values outside its palette); Ridge writes the most colour directly into rules.

6. Duplicated theme message keys

messages.properties holds 625 theme-prefixed keys: Brock 155, Depot 129, Spec 116, Atelier 109, Pop 108, Bistro 8. Ridge and Diorama have none. Of 191 distinct suffixes, 115 appear under more than one theme, covering 549 keys; in 90 of those suffixes the English text is identical in every theme that has it.

Largest groups (suffix prefix, number of suffixes in 2+ themes, themes, how many are identical text):

Group Suffixes Themes Identical text
basket.* 16 brock, atelier, depot, pop, spec (Bistro 1) 12
filters.* 14 brock, depot, pop, spec (Atelier 13) 12
pdp.* 13 brock, depot, spec (pop 12, atelier 10) 11
card.* 10 depot, spec (9); pop, atelier 5; brock 4 10
search.* 10 all five 6
added.* 9 all five 5
plp.* 9 all five (brock, pop, atelier 8) 5
nav.* 7 all five (Bistro 1) 6
sort.* 6 all five 6
mini.* 5 all five 5
pager.* 5 all five 5
promise.* 4 all five 3
account.* 3 brock, depot, pop, spec (Atelier 2) 2
rail.* 3 all five 1
footer.* 1 all five 1

The pager, sort and account keys in full (every theme with the key; text identical unless noted):

Key suffix Themes Text
pager.label, pager.next, pager.page, pager.previous, pager.summary atelier, brock, depot, pop, spec same
sort.featured, sort.nameAsc, sort.nameDesc, sort.priceAsc, sort.priceDesc, sort.rating atelier, brock, depot, pop, spec same
account.signIn atelier, brock, depot, pop, spec same
account.greeting brock, depot, pop, spec same
account.yourAccount atelier, brock, depot, pop, spec differs
plp.apply, plp.categoriesHeading, plp.emptyCta, plp.subcategories atelier, brock, depot, pop, spec same
plp.categoriesButton depot, spec same
plp.count, plp.emptyBody, plp.emptyTitle, plp.sortBy atelier, brock, depot, pop, spec differs

Merchants can override any of these in Site Text, so the prefixed names are part of the data a shared component has to keep working. Depot's merchandisingNode.html also reads depot.plp.searchScope, depot.plp.searchAll and depot.plp.searchIn where Brock, Pop and Spec read the shared search.inCategory.* keys.

7. Behaviour that has drifted

These are differences in what the page does, not in how it looks.

Where Finding
Language switcher and hreflang Fixed. languageSites (site config storefront-language-sites) was rendered only by Nova's nav and head, so a multi-language shop on Brock, Atelier, Depot, Pop, Spec, Ridge, Diorama or Bistro got neither the switcher nor the rel="alternate" hreflang links. Both are now ui/language-menu, called by every theme's nav and head.
Commerce chrome guard (commerceChromeEnabled) Fixed: every theme's header bar and drawer now hide the account and basket controls (Bistro's account links too), Atelier's footer hides its payment marks, and absent still means a shop (StorefrontChromeRenderTest). It was: on a site that sells nothing, Nova's nav hides the account and basket controls and its footer hides the payments strip. Brock does the same in nav (header, drawer and basket panel) and in the footer's payments row, and Diorama guards its nav controls. Atelier, Depot, Pop and Spec guard only the basket panel at the foot of nav: their header account and basket buttons and their drawer account and basket links are not guarded. None of Atelier, Depot, Pop, Spec, Ridge or Diorama guards the footer's payments row. Ridge's nav has no guard at all and always links to /p/basket.
Mini basket Brock's has a clear-basket confirmation (basket.clear.*); the Atelier, Depot, Pop and Spec copies do not.
"Added to basket" pop-over Brock moved it to fragment/added-basket (also used by Bistro). Atelier, Depot, Pop and Spec still define it inline in nav with their own added.* keys.
Accessibility aria-current appears in Nova's nav only, among the nav fragments.
Dead tokens Bistro sets --nb-ink, --nb-line and --nb-muted; nothing reads them.

8. Candidates to share

Ranked by near-identical copies times lines. "Near-identical" means a residual of at most about 10 percent of the file against Brock's copy. Lines are Brock's.

# Component Near-identical copies Lines Score What genuinely differs between themes
1 fragment/auth-head 4 (Brock, Depot, Atelier, Spec) about 265 about 1,060 Stylesheet link and token names; Atelier and Spec add about 25 lines of their own styling hooks
2 fragment/mini-basket 4 (Brock, Depot, Pop, Spec) 170 to 178 about 690 Stepper class names; Brock's clear-basket block; icon set and message-key prefix
3 extensions/menuGeneratorExtension/menu 5 (Brock, Atelier, Depot, Pop, Spec) 102 510 Class prefix only (residual 4)
4 fragment/footer 4 (Brock, Depot, Pop, Spec) 98 to 101 about 400 Brock's footerNotice hook and payments-row guard; icon set
5 extensions/collectionChooser/menu 5 76 380 Class prefix only (residual 2)
6 fragment/facet-rail 4 (Brock, Depot, Pop, Spec) 82 to 85 about 340 Pop shows values as pills and drops the checkbox glyph; the rest is a rename
7 *-listing 3 (Brock, Pop, Spec; Depot is 42 away) 103 to 107 about 315 Depot's category rail beside the grid; Spec's showcase rows; Atelier is a different layout
8 fragment/pagination 5 55 275 Nothing but the prefix, icon file and message keys (residual 2, a comment)
9 extensions/searchBar/main 5 54 270 Class prefix only (residual 2)
10 merchandisingNode.html 4 (Brock, Depot, Pop, Spec) 61 244 Depot's own search-scope message keys; otherwise a rename

Next in line:

Component Near-identical copies Lines What differs
product.html 5 41 Nothing (residual 0 to 2)
searchResults.html 4 51 Nothing (residual 0 to 2)
fragment/category-nav 4 (Brock, Depot, Pop, Spec) 31 Nothing (residual 0); Atelier is a different design
page.html 6 32 Class prefix and the body class (residual 2 to 9)
productFragment/railCard 4 36 Small markup differences (residual 7 to 12)
*-rail 4 18 Nothing (residual 0), Atelier 3
fragment/account-status 4 18 Nothing (residual 0); Atelier is a different design
fragment/sort-dropdown 5 15 Atelier's Apply button style (residual 2 to 4)
*-icons 4 33 to 35 Icon path data (residual 6 to 10)
extensions/featuredProduct, trendingProducts, recentlyViewedProducts 5 each 8 to 9 Nothing (residual 2)

Not worth sharing yet: nav (a different design in every theme), head (stylesheets and fonts per theme), collection.html and productFragment/productDetail (layouts differ), and Ridge's and Diorama's blog templates (they differ from Nova's by 68 to 80 lines and from each other by 16 to 30).