ThemeRelease Notes

Release notes

Everything that’s shipped in each version of the Sideboard theme, newest first.

Finding your version. In your Shopify admin, go to Online Store → Themes, then Customize on the Sideboard theme to open the theme editor. In the top bar, open the theme actions menu (the icon to the left of the theme name); it shows the theme’s name and its version number.

Once you know your version, find it in the list below. Anything listed above it is what a newer version would bring to your store.

The current release is 0.18.0.

0.18.0 (2026-09-17)

Added

  • Card pages now describe themselves to Google the way a shop listing would. The description a search result shows is built live from the card itself — its name, set and collector number, rarity, then each finish with its lowest in-stock price or “sold out”, and your store’s name — instead of the card’s rules text. Nothing changes on the page itself. Sealed product keeps its written description. Nothing is written to your products, and the wording updates on its own as stock and prices change.
  • A collection page that is filtered, re-sorted or has nothing in it now tells search engines not to index that view (its links are still followed). Page 2, 3 … of a collection stay indexable, and every page keeps the same canonical address as before.
  • A listing the Sideboard app has marked “hidden from search engines” (a card you have never carried) now carries that instruction in the theme itself, not only through Shopify. It stays on your storefront, in your collections and reachable by link either way. Shopify’s own search leaves it out, which is Shopify’s rule for hidden listings: the type-ahead suggestions always, and your search results page unless the search page’s “Search results come from” setting is Sideboard search.
  • New theme setting, “Default finish for collection cards” (Theme settings > Condition & finish options), lets a merchant open collection grid cards on Normal instead of Foil. Foil stays the default, so nothing changes until a merchant switches it.

Fixed

  • On a collection page with list view and Sideboard filtering (the default), switching a list row’s finish chip now actually updates the price and the variant that gets added to cart, and the -/+ quantity buttons now work. Both were visually responsive but inert, because the list row’s script never loaded on those pages.

0.17.1 (2026-09-16)

Fixed

  • The playset quick-add button on the product page now uses the sizes set in “Playset sizes” (Theme settings), matching what the product cards already show. It used to ignore that setting and always offer +4 (or +3 for Yu-Gi-Oh and Flesh and Blood), so lowering a game’s playset size in the theme editor changed the cards but not the product page.

0.17.0 (2026-09-12)

Added

  • The header section now has two spacing sliders for the logo: one for space above and below, one for space to either side. Both default to 0, so an existing header looks the same until a merchant opens the theme editor and moves them.
  • Deck boxes, bundles, and any other product whose type isn’t a “Singles” type now show a normal photo gallery: one large image plus a row of thumbnails for every picture uploaded, so a shopper can click through all of them. Picking a variant with its own picture (like a specific sleeve color) swaps the large image and highlights that thumbnail. Cards are unchanged — they keep the flip-to-see-the-back view and holo effect.

Changed

  • The quantity stepper on product cards now takes the condition and finish chips’ visual language instead of the button’s: chip-sized outline, corner radius and text, but spans the full width of its own row above Add to cart instead of sitting beside it sized to its content. The − and + are small drawn icons anchored at the two ends of the bar, each with a click target covering its whole end, not just the icon; the number sits centered between them with equal-width digits so it never shifts between 9 and 10. Add to cart stays the only filled control in the row. On a touch screen the bar grows taller for easier tapping without ever growing wider than its row, while a mouse keeps it chip-height. − dims out at a quantity of 1 and + dims out at the card’s stock, so the shopper never taps past either limit.

Fixed

  • In the header, when the logo sits on the left, the navigation runs inline beside it, and search shows as an icon, the navigation now uses all the room up to the account/cart icons before collapsing links into “More”. It used to give up half the bar to an empty middle, dropping links into “More” while a gap sat between “More” and the icons.
  • Choosing a Condition, Finish, Language, or Edition a card isn’t stocked in no longer adds the wrong card to the basket. A store can stock a card in Japanese in one finish only, so “Normal + Japanese” may not exist — the page used to keep the previous variant, showing the English price and English stock while “Japanese” was selected, and the shopper received the English card. Every value the product carries anywhere stays clickable (so a Japanese-only card is never unreachable), but choosing a combination the rest of the selection can’t satisfy now snaps the other choices to a variant that actually carries it, preferring one that’s in stock. If there’s genuinely no such card, Add to Cart is disabled rather than selling a different one.
  • The number beside each swatch value (and its dimmed/struck-through state) now reflects every other option on screen at once — condition, finish, language, edition — instead of just finish. It used to add up every language at once, so a condition’s count showed the same number however you clicked through the options.
  • Choosing a different language on a card now shows that language’s picture. A store stocking one card in both English and Japanese has a single listing with a single photo, so picking “Japanese” used to leave the English card on screen while the buyer paid for the Japanese one. Variants with no picture of their own keep the product’s default, so nothing changes for cards stocked in one language.
  • The card-flip view no longer treats a second picture as the back of the card, and the collection grid no longer treats it as the hover image. Both used to assume any second photo was the reverse face, which would have shown a Japanese card as the back of an English one once per-language pictures arrive. A back face is now a second photo that belongs to the product itself rather than to one of its variants, so a genuinely double-sided card still flips.
  • The quantity stepper’s + on a sold-out product card no longer works. It used to read the card’s zero stock as “no limit” and let a shopper click their way up to 99 of a card that isn’t in stock. The whole stepper — −, the number, and + — now stays disabled on a sold-out card, and switching a card’s condition or finish to a sold-out combination disables it too, re-enabling with the right stock limit once an in-stock combination is chosen again.

0.16.5 (2026-09-06)

Fixed

  • Event cards with a featured image show the picture again instead of a Liquid error, on the store homepage teaser and on both the calendar and list views of the events page.

0.16.4 (2026-09-06)

Fixed

  • A date with a time (e.g. “September 15, 2026 · 4:30 PM”) no longer loses the spaces around the separator.
  • The recurring-series strip on the events overview now shows a shadow at its right edge when there’s more to scroll to, and the shadow disappears once everything fits or you’ve scrolled to the end.

0.16.3 (2026-09-05)

Fixed

  • Stores with more than 20 upcoming events now show the right event in every calendar slot. Past that count, the calendar, the events list and the homepage teaser could all repeat the same event instead of the real one, so a day could show the right number of entries but the wrong name, time and link.

0.16.2 (2026-09-04)

Fixed

  • Sorting or filtering a Sideboard-mode collection no longer wipes the product grid or shows an error message in its place. The grid now updates directly instead of round-tripping through a page render that could fail.

0.16.1 (2026-09-01)

Fixed

  • Stores with more than 50 events now show all of them, on both the events page and the homepage events widget. Past that count, the extra events were silently left off the list and calendar.
  • The events calendar’s previous and next month buttons no longer render as empty squares. The arrow icons inside them are visible again.

0.16.0 (2026-08-29)

Added

  • A “Google Customer Reviews” settings group lets a merchant add the Google Customer Reviews badge without touching code: paste the numeric merchant ID from Merchant Center, pick a corner, and turn it on. The settings panel spells out the two steps Merchant Center itself doesn’t do for you (enabling Customer Reviews, adding the survey block to the Thank You page) since nobody walks a merchant through this by hand. Off by default; renders nothing until both a merchant ID is present and the badge is enabled.

Fixed

  • Sealed boxes, ETBs, and other non-card products no longer get cropped to the TCG card shape on product cards. Their full box art now fits inside the image instead of having its edges sliced off. Singles are unaffected. These products also no longer pick up the foil-shine hover effect meant for singles, both on cards and on the product page’s own image.

0.15.0 (2026-08-25)

Added

  • The collection list section’s “View all” link now has configurable label and destination settings. A merchant can pick where it points (a collection, a page, or any other destination) through the theme editor’s link picker and change its text, instead of it always reading “View all” and pointing at the collections index. Leaving either setting blank keeps today’s behaviour. The link also no longer disappears when the section’s heading is cleared.
  • The events overview list now caps how many events it shows. A store with heavy weekly recurrence could scroll almost forever in the Cards and Rows list views. The list now shows a merchant-set number of events (default 10, via a new range setting on the section) with a “Show all upcoming events” button revealing the rest in place. This section is the events page, so there’s nowhere else to send the shopper. The cap counts events, not day groups, so a day whose events are all past it doesn’t leave a heading with nothing under it, and the game filter still reaches a capped-out event without fighting the cap. The calendar view is unaffected. (SID-820)

Fixed

  • The events calendar’s Today control now disables itself while the current month is already showing, instead of reading “Today” identically on every month with no way to tell whether it would do anything. (SID-815)
  • The event details hero no longer washes its title out against a featured image. The scrim gradient ran strongest at the bottom while the hero’s content is top-aligned, so the event title sat under the thinnest part of it. It now runs strongest at the top.
  • Event surfaces that paint a background now paint the matching foreground with it, so a store whose secondary colours differ from its base colours reads correctly: the event details hero, its closed-registration card and its quantity field, plus the events overview view toggle and empty state.
  • The quantity stepper on the event details page no longer renders its number in a different colour from the − and + buttons beside it.
  • The cancelled-events banner on the events overview no longer fades its message a second time on top of the muted text colour it already uses.
  • Rainbow Foil, Fracture Foil, and other special foils now shimmer everywhere. The server-rendered foil check only accepted a finish named exactly “Foil”, so special foils rendered without the holo effect on collection grids, search results, and the product page’s first paint, until a swatch click or price sort ran the JS check, which had always accepted them. Both checks now agree: any finish containing “foil” (except “Non-Foil”) counts. The foil-first landing selection uses the same rule, so a card whose only foil is a special foil now leads with it like plain-Foil cards do. (SID-705)
  • The cart drawer’s “You might also like” recommendations no longer sit in a box nested inside the footer’s own box. The footer already draws a border and top padding above its contents; the recommendations block repeated both, producing two horizontal rules a few pixels apart. The separator is now the footer’s alone, so the drawer still renders exactly as it does today with recommendations turned off or empty.

0.14.1 (2026-08-24)

Fixed

  • Announcement bar marquee no longer gaps or pops on wide screens. The scrolling text rendered a fixed 4 copies of the message, so on viewports wider than two copies the loop showed blank space and the next sentence popped in instead of scrolling continuously. The bar now clones the message until it spans twice the visible width and scales the animation time so the scroll speed stays the same.
  • Announcement bar marquee no longer repeats itself to screen readers. Each cloned copy of the message included a countdown span with aria-live “polite”, so on a wide monitor a screen reader announced the same sentence and countdown a dozen or more times. Only the first copy is now exposed to assistive tech, and the rest are marked aria-hidden since they’re visual fill.

0.14.0 (2026-08-17)

Added

  • Image fit setting for the collection list section. Wide, short images like a set logo were forced into the card’s tall aspect ratio with object-fit: cover, cropping them into something unrecognizable. A new “Image fit” setting on the section lets a merchant switch a card’s image from “Crop to fill” (the existing behavior) to “Fit inside,” which shows the whole image letterboxed on a card-colored background instead.

Fixed

  • Collection cards and the product page render every option the same way, and no longer show $0.00 or add the wrong variant to cart. The card’s variant picker only understood Condition and Finish, so on products with a third option like Edition a price sort or a swatch click could re-resolve to the first same-condition sibling, often a $0.00 sold-out placeholder, and the add-to-cart button pointed at that wrong variant. Condition, Finish, and any extra option now render through one uniform control style — chips by default, or dropdowns for every option (Condition included) via the new “Option selector style” setting under Condition & finish options — with out-of-stock values disabled or struck through identically across every group, on both cards and the product page (dropdowns don’t show the low-stock count a chip can). Variant resolution matches on the full option set, prefers in-stock real-priced variants, availability updates live as a shopper changes selections, and price sorting on cards applies exactly the variant it computed. A collection card for a multi-option product of any kind — not just Condition/Finish — now shows an option chip for every option under the existing “Show condition/finish swatches” setting, and an option with only one choice is uniformly shown or hidden by the “Show options with only one choice” setting, the same as any other option. The product page’s extra options default to chips where they previously always showed a dropdown; switch the new setting to Dropdowns to keep the old look. (SID-824)
  • The collection list-view row now renders every option, not just Condition, and works on products that have no Condition option at all. The row’s variant picker previously only understood a Condition option, and rendered zero controls on a product without one (a t-shirt with Size and Color, say). Its condition chips also carried the cheapest variant of that condition across every Finish and edition, so clicking a condition on a multi-option TCG product could add the wrong Finish/edition to cart with no way to pick the right one. The row now detects and renders Condition, Finish, and any extra option through the same cascading variant resolution as the collection grid card, with the same chip/dropdown styling, out-of-stock states, and price-sort behavior. (SID-824)
  • A fully sold-out product in the collection list view now has working option chips and price sorting. The row’s quantity/add-to-cart form only rendered when the product was available, so a sold-out row’s JS init bailed out immediately and its option chips bound to nothing, and the Sideboard grid’s price sort couldn’t repaint the row. The form now renders regardless of availability, with the quantity stepper, playset button, and a disabled “Sold out” add button in place of the live one, so the JS binds and the row behaves like the collection grid card’s sold-out state. In-stock rows are unchanged. (SID-824)

0.13.0 (2026-08-10)

Added

  • Stock indicator toggle on the product page. The “x in stock” / “In stock” line under the price can now be turned off with a “Show stock indicator” checkbox in the Product section settings. On by default, so existing stores are unchanged.

Fixed

  • The events calendar’s Today button now actually returns to today’s month. It used to jump to the month of the next upcoming event instead — on a store whose events all start next month, Today landed there from anywhere and looked dead once you were on it. It now always shows the current month and focuses today’s cell, with or without events on the day.
  • An event card with no page to link to is no longer a link. Until the store’s event metaobject definition gains the onlineStore capability (granted by the Sideboard backend), entries have no storefront URL and every card was an <a href=""> that silently reloaded the page on click. Those cards now render as plain text; they become links on their own once the backend grants the capability.

0.12.1 (2026-08-06)

Fixed

  • Events sections no longer error on a store without events. On a store where the Sideboard backend hasn’t created the event metaobject definition yet, every events surface rendered a storefront Liquid error (“Array ‘metaobjects.event.values’ is not paginateable”) instead of the section, because paginating the missing definition’s nil values throws at render time. The events page, the homepage teaser, and the event page’s “other dates” block now check that the definition exists and has entries first, and fall back to their normal empty states. Stores with events render exactly as before.

0.12.0 (2026-08-04)

Added

  • Advanced search. A shopper-facing card search built entirely from the store’s own data, fetched over the app proxy (GET /apps/sideboard/v1/advanced-search). New sections/advanced-search.liquid + templates/page.advanced-search.json.

    The shopper ticks the games they want, and each game’s own fields appear below it under that game’s name. The heading is the point: a filter under “Magic: The Gathering” constrains Magic cards and nothing else. Tick Magic and Lorcana, ask for red and amber, and you get red Magic cards and amber Lorcana cards. Above the games sits everything that belongs to the listing rather than the card — name, condition, finish, language, price, in stock — and that applies to all of it.

    Fields include the ones a filter sidebar could never carry, because they have no short list of values to offer: rules text, artist, collector number, mana cost, type line, and format legality. Nothing is hardcoded per game; the page adapts to whatever a merchant sells, and a merchant chooses which facets appear with the per-facet “Advanced search” toggle in the app.

    Searching composes a URL and hands off to the search page, so results come with a filter sidebar to refine in, a sort, real pagination, and an address a shopper can share, bookmark and hit Back into from a card.

  • The search page can run on Sideboard. sections/search.liquid gains a “Search results come from” setting. It ships set to Shopify search, so your search page is exactly what it is today until you change it. Switch it to Sideboard and results come from /apps/sideboard/v1/products with the filter sidebar beside them, the same engine the collection page uses: relevance is ours, so a two-word card name finds the card, and a search arrives with facets to refine in. This is also where the advanced-search page sends shoppers, so it needs turning on for that hand-off to land somewhere useful. Native results still render hidden underneath as the no-JS / SEO / API-down fallback.

    The result count is ours too. The heading was reading Shopify’s search.results_count, which knows nothing about our matches — it says “0 results found” for a card the store stocks but Shopify’s engine missed, and a search with no search term (“red mythics under $5”) has no native results to count at all. The count now comes from our own total, the same way the collection page’s does.

  • Refining a search keeps the search. Ticking a sidebar checkbox rebuilds the URL from the filter form, and the form owns only the facets and the price band — so the search itself (q, games, and each game’s fields) was being dropped, turning a refine into a browse of the whole store. It’s carried across the change now, the same way an active sort already was. A sidebar tick narrows a search; it never discards it.

0.11.0 (2026-08-04)

Added

  • A card that comes in only one finish can now say so instead of showing nothing, via the new “Show options with only one choice” theme setting. It ships off, so nothing on your storefront changes until you turn it on. Finish swatches are hidden whenever a product has a single finish value, so a Foil-only card looks exactly like a plain one and a shopper has no way to tell what they’re buying; tick the setting and that lone value renders as a chip on the product page, the variant table and the collection card. Only choices the product actually has are shown: the theme can’t tell “this card has no foil printing” from “this store doesn’t stock the foil”, so it never invents the missing one. Note this covers cards whose Finish option has one value; a card published with no Finish option at all still shows nothing, since there’s no value to render.
  • Event Details can fall back to your store’s address for an event that has no location of its own, via the new “Use shop address” section setting. It ships off, so no store starts publishing its street address on update; tick it if your events are held at the shop. With it off an event with a blank location shows no location row, same as before.
  • Events: a paid event you collect at the door now shows its price instead of “Free”. The event metaobject gains a price field (in cents) that Sideboard writes on every payment rail, so a store set to “Collect payment in person” (which deliberately never creates a ticket product) can still advertise a real figure: a price pill on cards and list rows, an “Entry fee” line on the event’s own page, and a schema.org offer search engines can read. Only an event priced at 0 shows as Free. Needs the matching Sideboard app release to do anything; until then no entry carries a price and every surface behaves exactly as it does today.

Changed

  • Events Overview calendar cells stack the event name over its start time, against a left accent rule rather than a filled pill. Cells drop the end time and the price/Free badge, so a badge in a cell now means something worth acting on (cancelled, sold out, or seats running low). Previously a “3:00 PM to 5:00 PM” range plus a badge took the full column width and squeezed the event name down to a character or two.
  • Events system: ground-up rebuild of all three events sections around the real Sideboard-published data shape (occurrences, not series; upcoming/cancelled only, no past status; capacity from ticket inventory, not a merchant-typed number). Events Overview is now calendar-first — a server-rendered month calendar with Prev/Next/Today nav, a List view (rows or cards), data-derived game filter chips (no filter bar at all on single-game stores), and a series strip for recurring events. Event Details gets multi-tier ticket selection (radio list with per-variant price/availability), a “Register in store” card for the free/in-person events that are the normal case rather than an edge case, a cancelled-event banner, an “Other dates” cross-link list, and schema.org/Event JSON-LD. Upcoming Events now shows one card per event series (its next occurrence) instead of every individual occurrence, so a weekly recurring event no longer fills the whole grid. All filtering/sorting/dedup now runs through one shared Liquid pipeline (snippets/events-data.liquid) instead of three separate implementations, so behavior can’t drift between surfaces. See docs/events-setup.md.
  • Upcoming Events and the Events Overview series strip only collapse events that declare themselves recurring. Both surfaces show the next occurrence per series, but an event with a blank recurring field is treated as a one-off and always keeps its own card, so two hand-authored entries that happen to share a name (two “Prerelease” events for different sets) no longer collapse into one.

Removed

  • Events Overview section settings that no longer do anything (values are ignored if a template still sets them): enable_agenda_view, enable_calendar_view, enable_cards_view, agenda_label, calendar_label, cards_label, games, game_filter, show_past_events, agenda_date_format, card_layout (replaced by list_layout), cards_show_image, cards_show_location, cards_show_price, cards_show_spots. show_past_events is the one with a visible consequence: past events can no longer be listed at all. Sideboard prunes occurrences a day after they pass, so a synced store has almost nothing to show either way.

Fixed

  • Sold-out singles opened at Damaged condition instead of Near Mint. When nothing was in stock, the product page fell back to the cheapest real-priced variant, and Damaged is always the cheapest condition, so a sold-out card landed on DMG at the DMG price with every condition swatch disabled (they are all out of stock) and no way to move off it. Behind the new “Sold-out cards open on Near Mint” theme setting, which ships off, so nothing on your storefront changes until you turn it on. Tick it and the product page, the grid card and the list row all anchor a sold-out product on Near Mint, falling back to the most expensive real-priced variant only when the product has no NM variant, so the price stays real and never renders $0. It also lines the page up with the cards, which already anchored on the most expensive variant: a card showing $1.00 NM in the grid opens at $0.40 DMG today. Leave it off and every surface behaves exactly as it did before 0.11.0, which was not the same everywhere: the product page opens on the cheapest condition, collection cards and list rows on the most expensive. In-stock products are unchanged either way, and ?variant= deep links are still honoured. One gap remains, with the setting on: when the Sideboard filter grid re-sorts by price it re-picks the sold-out variant in JavaScript, and that path still takes the most expensive variant with no Near Mint preference. On the usual price ladder NM is the priciest anyway and both agree; on an irregular one a sold-out card can repaint to a different condition than it first rendered with.
  • Events: every event rendered as an empty card. The shared pipeline handed each entry’s position in the metaobjects.event.values array back to its callers, which looked the entry up again by index. That collection only supports iteration: .first, [0] and [i] all return nil on it, so every caller was handed nothing. Calendar cells, the day list, the game filter chips, the series strip and the homepage teaser all went blank at once, each event showing no name, no time, a dead link, and a fallback “Free” pill. Rows now carry each entry’s handle and resolve through metaobjects.event[handle], the access path Shopify documents. Introduced in this same rebuild, so no released version shipped it.
  • Events: a malformed sort_date is now read the same way on an event’s own page as it is everywhere else. The details page fell back to event_date only when sort_date was empty, while the calendar and the day list fall back whenever it isn’t exactly 8 characters, so a bad hand-authored value could put “Happening today” on a page whose event the calendar had on a different day. Sideboard always writes this field correctly, so it only ever affected hand-authored entries.
  • Events: past events are dropped again on every surface. The shared pipeline reformatted the YYYYMMDD “today” its callers hand it, and Liquid reads an all-digit string as a Unix timestamp, so “20260803” became “19700823” and the past-event guard compared every event against a date in 1970. The same line in event-datetime meant the “Today at 6:00 PM” wording never rendered on any card, calendar cell, or list row. Introduced in this same rebuild, so no released version shipped it.
  • Collection price slider (both the native and Sideboard filter modes): the slider no longer arms a price filter the shopper never set. It used to infer filter state from where the handles sat, and a coarse step size made the true maximum unreachable, so a page could load with a hidden price ceiling that wrote itself into the URL on the next filter change and tightened as the result set changed. The shopper’s chosen band is now held as explicit state, seeded from the URL and clamped to the current bounds, so the readout, the Reset link, and the URL always agree.

0.10.0 (2026-07-28)

Added

  • Sidebar: a Sets block — the set browser from SID-529. Pick collections; each renders as a collapsible group with a “View all” link, and two checkboxes add a link per rarity and per foil finish. Nothing is authored: Sideboard already tags every synced product with its facet vocabulary (rarities:rare, variant:foil), so the values are read straight off the collection’s own tags and stay correct as inventory changes. Each link is the collection URL plus a native filter.p.tag= param — the same vocabulary the filter sidebar’s checkboxes submit — so it feeds the existing filter engine rather than adding a second one. Foil links use the stock-aware instock. tag family in Sideboard mode (SID-373) so they land on results in the default in-stock view. The set you’re currently viewing is marked active and starts open.
  • Header: a third Mobile search option — Icon in the header bar. A magnifier sits beside the cart and opens the menu drawer with its search field already focused, so search is one tap from anywhere instead of two (hamburger, then find the field). Focus is timed to the drawer’s slide so the mobile keyboard actually comes up, and tapping it while the drawer is already open re-focuses the field rather than closing the drawer. When the search style is also set to Icon, the mobile setting wins below 990px so only one magnifier ever shows.
  • Header: Account icon on mobile — In the header bar (default, unchanged), In the menu drawer, or Hidden. Below 990px only; desktop still follows “Show account icon”. The drawer option is the counterpart to the search icon: it frees the bar slot without stranding login, which previously required moving the whole icon cluster into the drawer. Cart stays in the bar either way.
  • Collection product cards: a Hide sold-out swatches setting. Off by default, so cards keep showing swatches struck through unless a merchant opts in. On, a sold-out condition or finish drops out of the row entirely — a card with one NM copy shows just “NM (1)” rather than NM beside four struck-through conditions nobody can buy, which is most of a singles grid. Applies to both grid and list cards, so a collection page stays consistent when shoppers switch layouts. Hiding is keyed on the same state the grid card’s runtime already maintains, so it follows the selected finish: a condition that is dead in Normal but stocked in Foil reappears when you pick Foil, instead of freezing at whatever the first paint decided. A card’s current selection is never hidden, since it carries the price and the variant the quick-add would send.

0.9.0 (2026-07-27)

Added

  • Hero: a new Split layout mode. Sets a content column (a wordmark/content image, or the heading text, plus subheading and buttons) beside a feature image on a flat background color — no photo, no overlay. New settings under “Split layout”: content image, feature image, feature position (left/right), background color, and a hide-feature-image-on-mobile toggle. Purely additive and opt-in: the layout defaults to Full width and every new setting defaults to empty, so existing heroes render exactly as before.

Fixed

  • Collection (Sideboard filter mode): the empty-collection “Browse all products” button is clickable again. On a collection with no products, the page could get stuck in its loading state — invisible in this mode — which left the button (and the rest of the empty state) unresponsive to clicks.

0.8.1 (2026-07-10)

Fixed

  • Collection (Sideboard filter mode): smoother first load. The page used to paint unfiltered products, then swap the sidebar, then re-fetch the whole section to apply the in-stock default — a visible stagger of flashes on every visit. Now the server paints a skeleton grid and the products + filters load together in one pass, so the grid and sidebar fill at the same time. The in-stock default no longer costs a URL round-trip (the products and filters APIs already default to in-stock only). The real products render hidden as a fallback, shown if the products API is down and kept in the HTML for SEO / no-JS.
  • Collection (Sideboard filter mode): the first load now respects the collection’s sort. The grid is fetched from the Sideboard products API, which was called with no sort on a bare URL, so it fell back to A-Z — while the sort dropdown showed the collection’s actual default (e.g. “Price, high to low”). The two disagreed until you touched the dropdown. The container now carries the collection’s default sort and the products request seeds from it when the URL has none, so the first page comes back in the order the dropdown claims.

0.8.0 (2026-07-10)

Changed

  • Header: where the search, account, and cart icons sit on mobile is now a setting (Auto / In the header bar / In the menu drawer). Auto is the default: icons stay in the bar unless the logo is centered, where the bar has no room for them and they move into the menu drawer. Left-logo stores get their mobile bar icons (and the cart count badge) back without touching a setting; the drawer treatment stays available as an explicit choice.

0.7.0 (2026-07-09)

Added

  • Header: icon size slider for the search, account, and cart icons (16–32px, default 20 = unchanged), next to the existing social icon size slider.
  • Header: the CTA button can now sit in its own row above or below the icons (two new Position options, desktop only). Keeps a large button from crowding the icons and a wide centered logo at narrower widths; on mobile the new options behave like “after the icons”. The rest of the bar — social icons, a left logo, inline nav, search — aligns as one band with the icons row (a centered logo stays centered), so the two icon groups can’t drift apart vertically.

0.6.0 (2026-07-08)

Added

  • Cart page: a batch of layout settings, all off by default so existing stores are unchanged. Item count in the title (“Your Cart (3)”), quantity stepper in its own column beside the price, custom checkout button text, additional payment buttons (Shop Pay etc.) under Checkout, a Continue-shopping link position (below checkout / beside the title / hidden), an “Estimated tax — calculated at checkout” summary row, and a “We accept” payment-icons row sourced from the store’s enabled payment methods.

Fixed

  • Cart page: each row’s price now updates live when the quantity changes — line price, per-unit “ea” price, and the strikethrough compare price. Only the summary totals refreshed before; row prices went stale until a reload.
  • Cart page: the quantity stepper stops at available stock (same rule as the product-card stepper — inventory tracked and overselling denied). The + button disables at the cap, typed values clamp, and the input snaps to whatever the cart actually accepted, so a click can no longer look like it did nothing. The item count in the title also updates live now.
  • Cart drawer: the stepper now follows the same inventory rule as the cart page — the + button disables at available stock, and variants that allow overselling are no longer capped (the drawer previously capped everything at stock or 99 regardless of the variant’s policy).

0.5.0 (2026-07-08)

Added

  • Header: social icon size slider (12–32px, default unchanged at 16px) under the social media settings (SID-690).
  • Header: optional call-to-action button. Set a label and link to show it; hidden otherwise. Position it before the logo or after the icons, pick solid or outline style and one of three sizes (the bar grows to fit the larger ones, with breathing room and outline border weight scaling alongside), and on mobile keep it in the bar or move it into the menu drawer. Solid follows the global button colors; outline inherits the header’s text color. Both get real hover states (darkened fill / faint tint) instead of the opacity fade.
  • Header: social icons position setting — place them left of the logo or with the account/cart icons on the right.

Changed

  • Header: the bar is now a single three-zone grid (left / center / right). Each element is routed into a zone by its setting instead of switching between per-mode layout classes, so every placement setting does what its label says in every combination.
  • Header, mobile: the bar now carries only the logo and the menu button. Account, cart (with a live count badge) and the search toggle move into the menu drawer, in a row group at the top under the drawer title. The cart entry links to the cart page. Desktop is unchanged.
  • Header: the CTA button’s mobile placement now defaults to the menu drawer instead of the header bar. The bar is tight on small screens; the drawer pins the button at the bottom of the menu where it stays visible and easy to reach. Stores that explicitly chose a placement are unaffected.
  • Header: navigation placement now follows its setting in all cases. “Inline” puts the menu beside the logo even when the logo is centered, and a full-width search no longer pushes the menu to its own row.
  • Header: “Full width between logo & icons” search always stays in the bar. With a centered logo it fills the span from the logo to the icons instead of dropping to a row below.
  • Header: with a centered logo, inline search sits in the right zone beside the account/cart icons.
  • Header: social icons render from the shared social-links snippet instead of duplicated inline SVGs.

Fixed

  • Header: a centered logo no longer crushes the account/cart icons and the menu button to zero width on small screens. Icons hold their size; a too-wide logo truncates with an ellipsis (text) or scales down (image) instead.

0.4.0 (2026-07-06)

Added

  • Multicolumn: image size and corner-radius controls. An “Image size” slider sizes the circle/rounded/square image (capped at the column width, so a large value fills the column instead of overflowing), and a “Corner radius” slider sets the rounding on the rounded style. Defaults unchanged (circle at 100px).
  • Footer: a per-block “Content alignment” setting (left/center/right) on every column block — Brand, Menu, Text and Newsletter — so a column’s contents can be centered or right-aligned within its track. Defaults to left, so existing footers are unchanged.
  • Sidebar: a new site-wide left-rail navigation — two columns on desktop, an off-canvas drawer on mobile. Off by default: a global Enable site-wide sidebar theme setting gates it, so the layout renders exactly as before on stores that don’t turn it on. All its config (enable, per-page visibility, heading, sizing) lives in the theme’s Sidebar settings; the sidebar section only carries the content blocks. It’s a generic, store-agnostic rail built from two block types: a Menu block (a navigation menu — top-level links render flat, links with sub-links become collapsible groups; point links at collections to list them) and a Text block (freeform richtext). Every link points wherever the merchant sends it; the sidebar builds no URLs and knows nothing about filtering. Also placeable as a standalone section.
  • Hero: a “Content position” setting to anchor the heading/text/buttons to the top, middle or bottom of the hero box — the vertical counterpart to the existing left/center/right text alignment. Section-wide for a single hero and per-slide in a slideshow, matching how text alignment works. Defaults to middle, so existing heroes are unchanged.
  • Hero slideshow: per-slide “Text color” and “Overlay color” settings, so each slide can set its own text and image tint. Both default to empty (the theme colors); overlay strength still comes from the section’s overlay opacity.

Fixed

  • Hero slideshow: every slide now fills the same fixed box, so slides with different images (or different amounts of text) all render at the same size, and the overlay covers the full slide instead of hugging the text. The active slide previously collapsed to its content height.

0.3.0 (2026-07-02)

The collection-filters release. Search & Discovery mode is rebuilt on Shopify’s native storefront filtering, the filter source is choosable per collection template, and the two filter systems now share one look. Behavior change for S&D-mode stores: the sidebar renders exactly what’s configured in the Search & Discovery app — stores relying on the old theme-built tag list must configure their filters there (the sidebar hides until they do).

Added

  • Per-template filter source: the collection section has a “Filter source” select (Theme default / Sideboard / Search & Discovery / No filters), so an alternate collection template — e.g. for sealed product — can use a different filter system than the rest of the store. Defaults to the theme-wide setting, so existing stores are unaffected.

Changed

  • Search & Discovery filter sidebar brought visually in line with the Sideboard one: price renders as the same dual-handle slider (replacing the From/To boxes), long facets get the same “show more” cap and type-to-narrow search box, and the shopper’s search/expand/collapse state survives filtering. New theme settings under Collection filters: “Option counts” (right-aligned to match Sideboard, or next to the label) and “Options with no matches” (hide — the new default, matching Sideboard — or show greyed out).
  • Theme editor: trimmed the Collection filters setting descriptions and made them link out — the Filter source settings link to the merchant guide’s Collection filters page, and Search & Discovery mode links to the S&D app.
  • Search & Discovery filter mode now renders the filters configured in the Search & Discovery app (via Shopify’s collection.filters) instead of a theme-built tag list scraped from the current page of products. All S&D filter types work now — tags, availability, price, vendor, product type, variant options, metafields — with per-option counts and zero-match options disabled. The sidebar is hidden when no filters are configured in the app (or above Shopify’s ~5k filtering limit), and the toolbar In-Stock checkbox hides when the sidebar already carries the Availability filter. Also fixes: filter options no longer vary by page, taps apply on mobile (they previously did nothing), the active sort survives filter changes, active-filter pills no longer render twice, and the sidebar counts refresh after each change. Sideboard filter mode is unchanged, except its on-error fallback is now an empty sidebar rather than the old tag list.

Fixed

  • Theme editor: added missing setting labels for the Event details, Product carousel, and Upcoming events sections (they referenced translation keys that weren’t defined). Clears 12 theme-check schema-translation errors.
  • Product page: the main image is now a valid Largest Contentful Paint element on single-image products. The 3D flip-card context (which excluded it from LCP) is scoped to flippable two-image cards only. Improves real-world LCP/Core Web Vitals and lets the page produce a Lighthouse performance score. Holo/foil unaffected.
  • Collection pagination: the whole page button is clickable, not just the number text (clicks on the button’s padding used to miss the link).
  • Collection sort dropdown defaults to the collection’s admin sort order (default_sort_by) instead of always showing Featured.
  • Sold-out cards show their most expensive variant (book value) instead of the cheapest, matching how the price sort ranks them — across the grid, list view, and predictive search.
  • Sold-out cards render the add-to-cart row (disabled) so cards stay aligned and the price-sort logic applies to them (it previously skipped formless cards).

0.2.0 (2026-06-26)

First tracked release. Versioning, the changelog, and release tags begin here — 0.2.0 is the baseline of the theme as currently deployed to client stores. Work that shipped before this under the untracked 0.1.0 init stamp is not itemized; the list below covers the most recent notable changes leading into the baseline.

Added

  • Predictive search: card-shaped thumbnails (63:88 card ratio) and the TCG set name on result tiles.
  • “Image with text (blocks)” section (formerly “Collage”) for arranging uploaded photos into responsive layouts.
  • Collection grid: skeleton cards while a filtered grid loads.
  • Search page: setting to hide the in-page search bar.
  • Collection: a non-filterable collection template.
  • Staging deploy environment for an early client store.

Changed

  • Mobile drawers run full height on iOS using dvh instead of bottom: 0.
  • Playset quick-add is offered on singles only, not sealed product.
  • Collection filters apply on tap on mobile, matching desktop; facets default to tap-to-expand, collapsed.
  • Cart recommendations: price separated from the Add to cart button.
  • Mobile page margin has its own, tighter gutter setting.