{"handle":"origin","url":"https://cdn.shopify.com/mock-shop-production-media/_themes/c6d6e701424d37e0c06bef4397f91c5f22fab8777fe371cc169141644185d220.zip","sha256":"c6d6e701424d37e0c06bef4397f91c5f22fab8777fe371cc169141644185d220","description":"Horizon 4.1.5 with the themegen `origin` home page: a hero, an editorial section, a collection-backed product row, a second hero, a brand statement, and a closing media-and-content block. Inter at three weights, pill buttons and badges, 8px inputs, a tight display line height, and the cart in a drawer.","bestSuitedFor":"A catalog with a collection worth showing and editorial imagery to spend: the home page asks for four images and the handle of the collection its product row draws from. Every one of those images is an `image_picker` setting, so each has to be imported into the destination shop first and then named as `shopify://shop_images/<filename>`; a URL renders nothing. The row itself needs nothing per-product: `product_list_themegen` reads that collection and draws its products as cards that link to them. A shop with no collection worth showing can enable `section_product_placeholders` in its place and fill nine tokens by hand, three of them further images, but those three cards are painted on and link nowhere.","install":["Download `url`, check it against `sha256`, and unzip it. `THEMEGEN_PLACEHOLDERS.md` inside lists every `[[TOKEN]]` it carries; `tokens` above says the same thing and names the section each one feeds.","Replace every `[[TOKEN]]` in `templates/index.json` and `sections/footer-group.json` with the value of the same name in the shop's `mock_shop.theme` metafield `placeholders` (the shop's `llms.txt` shows the request). Each token sits inside a JSON string and the value goes in as that string's contents: the quotes around it stay, and any `\"`, `\\` or line break in the value is escaped the way JSON requires, or the file no longer parses and the push fails. Parsing the file, substituting inside its string values and writing it back does that without a slip.","`IMAGE_*` values arrive as image URLs, and every `IMAGE_*` token is an `image_picker` setting, where a URL renders nothing. Import each URL into the destination shop's files first (Admin API `fileCreate` with the URL as `originalSource`, then poll until `fileStatus` is `READY`) and write `shopify://shop_images/<filename>` in the token's place, where `<filename>` is the last path segment of the URL.","A token the shop's metafield does not carry is never filled with an invented value. What stands in for it is what the reference render does, and it differs by region: a section whose copy is missing is disabled, with `\"disabled\": true` (`ABOUT_MERCHANT_BODY` → `section_JpEEkW`, `ABOUT_PRODUCT_HEADING` → `hero_pjNAy4`, `BRAND_STATEMENT` → `section_x8mrnx`, `CREATIVE_TEXT` → `media_with_content_7nKFKW`); a missing supporting line (`BILLBOARD_SUBHEAD`, `ABOUT_PRODUCT_SUBHEAD`) is left empty and its section kept; a missing `BILLBOARD_HEADING` is the shop's name; a missing `ABOUT_PRODUCT_SHOP_NOW_URI` is `/collections/all`; a missing `IMAGE_*` in a section that is kept is a photograph from the shop's own catalog, collection imagery first and product photography after, so import one of those the same way and pick it. `FOOTER_HEADING` sits in `sections/footer-group.json` rather than in any home section; without it, write the shop's name.","Leave the product row as shipped: `product_list_themegen` enabled, reading the collection `COLLECTION_HANDLE` names, and `section_product_placeholders` disabled. `sections[].rule` says when to swap them, and it is only for a shop with no collection worth showing.","Where the shop's `mock_shop.hero` metafield names a hero, that hero's section replaces `hero_hRhTz6` at the front of `order` in `templates/index.json`; the hero's own `install` says how, and when the shop cannot fill it, in which case `hero_hRhTz6` stays. Without a hero named at all, `hero_hRhTz6` stays too and draws `IMAGE_BILLBOARD` under `BILLBOARD_HEADING`.","Push the directory with `shopify theme push --unpublished` and look at the preview it prints before publishing it. Nothing in this theme lists a product or builds a menu: it draws whatever the shop already has."],"sections":[{"handle":"hero_hRhTz6","type":"hero","enabled":true,"description":"The opening hero: IMAGE_BILLBOARD full-bleed, with BILLBOARD_HEADING and a button at its foot. Its supporting line is not here — BILLBOARD_SUBHEAD belongs to the section below it.","aesthetics":["cinematic","minimal"],"qualities":["full-bleed","image-dominant","centered","quiet"]},{"handle":"section_JpEEkW","type":"section","enabled":true,"description":"The merchant's story: IMAGE_ABOUT_MERCHANT as a group background beside two paragraphs — BILLBOARD_SUBHEAD, which finishes the hero above, then ABOUT_MERCHANT_BODY."},{"handle":"section_product_placeholders","type":"section","enabled":false,"description":"Three product cards built out of layout primitives: a row of groups, each an image and two text blocks. Nothing here reads the catalog — the nine IMAGE_PRODUCT_n, PRODUCT_n_TITLE and PRODUCT_n_PRICE tokens are literal settings, which is why a product costs three tokens here and none in product_list_themegen. Nothing here links either: the image block takes a link and this section leaves it empty, so the three cards are pictures rather than ways through to a product.","rule":"Disabled as shipped, because three products painted on read as a shop's own until a shopper clicks one and nothing happens. Enable it only where no collection is worth showing, disabling product_list_themegen in the same edit — never both, or the page shows a shop's own products beside three that are not."},{"handle":"product_list_themegen","type":"product-list","enabled":true,"description":"The real product row: Horizon's product-list, its card assembled from _product-card-gallery, price and swatches blocks that read the collection COLLECTION_HANDLE names. Per-product tokens are what it does not need.","rule":"Enabled as shipped, and COLLECTION_HANDLE is the only value it needs. Disable it only for a shop with no collection worth showing, enabling section_product_placeholders in the same edit."},{"handle":"hero_pjNAy4","type":"hero","enabled":true,"description":"A second hero, making the case for one product: IMAGE_ABOUT_PRODUCT behind ABOUT_PRODUCT_HEADING, ABOUT_PRODUCT_SUBHEAD and a button linking to ABOUT_PRODUCT_SHOP_NOW_URI."},{"handle":"section_x8mrnx","type":"section","enabled":true,"description":"One line of large type, BRAND_STATEMENT, over a row of five icons and a button. IMAGE_BRAND_STATEMENT is not here despite the name — it belongs to the closing section."},{"handle":"media_with_content_7nKFKW","type":"media-with-content","enabled":true,"description":"The closing block, split in two: IMAGE_BRAND_STATEMENT as the media half, CREATIVE_TEXT as the content half."}],"substitutions":23,"tokens":{"ABOUT_MERCHANT_BODY":{"description":"Brand / merchant story paragraph","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_JpEEkW"]},"ABOUT_PRODUCT_HEADING":{"description":"Product story heading","substitutions":1,"paths":{"templates/index.json":1},"sections":["hero_pjNAy4"]},"ABOUT_PRODUCT_SHOP_NOW_URI":{"description":"Where the product story's Shop now button goes — a path on the storefront (e.g. `/products/heavyweight-hoodie`); `/collections/all` when no single product is its subject","substitutions":1,"paths":{"templates/index.json":1},"sections":["hero_pjNAy4"]},"ABOUT_PRODUCT_SUBHEAD":{"description":"Product story supporting copy","substitutions":1,"paths":{"templates/index.json":1},"sections":["hero_pjNAy4"]},"BILLBOARD_HEADING":{"description":"Hero headline","substitutions":1,"paths":{"templates/index.json":1},"sections":["hero_hRhTz6"]},"BILLBOARD_SUBHEAD":{"description":"Hero supporting copy","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_JpEEkW"]},"BRAND_STATEMENT":{"description":"Short brand statement","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_x8mrnx"]},"COLLECTION_HANDLE":{"description":"Collection handle for `product_list_themegen`, the product row this theme ships enabled — it renders that collection's own products as cards that link to them","substitutions":1,"paths":{"templates/index.json":1},"sections":["product_list_themegen"]},"CREATIVE_TEXT":{"description":"Large decorative marquee text","substitutions":1,"paths":{"templates/index.json":1},"sections":["media_with_content_7nKFKW"]},"FOOTER_HEADING":{"description":"Footer / newsletter heading","substitutions":1,"paths":{"sections/footer-group.json":1},"sections":[]},"IMAGE_ABOUT_MERCHANT":{"description":"Merchant story image, as `shopify://shop_images/<filename>` naming a file already imported into the destination shop — this is an image_picker setting, and a URL put here renders nothing","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_JpEEkW"]},"IMAGE_ABOUT_PRODUCT":{"description":"Product story image, as `shopify://shop_images/<filename>` naming a file already imported into the destination shop — this is an image_picker setting, and a URL put here renders nothing","substitutions":1,"paths":{"templates/index.json":1},"sections":["hero_pjNAy4"]},"IMAGE_BILLBOARD":{"description":"Hero image, as `shopify://shop_images/<filename>` naming a file already imported into the destination shop — this is an image_picker setting, and a URL put here renders nothing","substitutions":1,"paths":{"templates/index.json":1},"sections":["hero_hRhTz6"]},"IMAGE_BRAND_STATEMENT":{"description":"Brand statement image, as `shopify://shop_images/<filename>` naming a file already imported into the destination shop — this is an image_picker setting, and a URL put here renders nothing","substitutions":1,"paths":{"templates/index.json":1},"sections":["media_with_content_7nKFKW"]},"IMAGE_PRODUCT_1":{"description":"Product 1 image, as `shopify://shop_images/<filename>` naming a file already imported into the destination shop — this is an image_picker setting, and a URL put here renders nothing; only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]},"IMAGE_PRODUCT_2":{"description":"Product 2 image, as `shopify://shop_images/<filename>` naming a file already imported into the destination shop — this is an image_picker setting, and a URL put here renders nothing; only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]},"IMAGE_PRODUCT_3":{"description":"Product 3 image, as `shopify://shop_images/<filename>` naming a file already imported into the destination shop — this is an image_picker setting, and a URL put here renders nothing; only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]},"PRODUCT_1_PRICE":{"description":"Product 1 price, formatted (e.g. £24.00), painted on rather than read from the catalog — only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]},"PRODUCT_1_TITLE":{"description":"Product 1 name, painted on rather than read from the catalog — only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]},"PRODUCT_2_PRICE":{"description":"Product 2 price, formatted (e.g. £24.00), painted on rather than read from the catalog — only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]},"PRODUCT_2_TITLE":{"description":"Product 2 name, painted on rather than read from the catalog — only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]},"PRODUCT_3_PRICE":{"description":"Product 3 price, formatted (e.g. £24.00), painted on rather than read from the catalog — only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]},"PRODUCT_3_TITLE":{"description":"Product 3 name, painted on rather than read from the catalog — only rendered if you enable the disabled `section_product_placeholders`","substitutions":1,"paths":{"templates/index.json":1},"sections":["section_product_placeholders"]}}}