added on local at 2026-07-01 13:47:49
| 1 | <!-- ===================================================================== | |
| 2 | LAYOUT: Catalog Classic | |
| 3 | Hero with floating cards + 3-col grid + about strip + reviews. | |
| 4 | The safe, balanced default. | |
| 5 | ===================================================================== --> | |
| 6 | ||
| 7 | <style>:root { $theme_css_vars }</style> | |
| 8 | ||
| 9 | [if:$preview_banner] | |
| 10 | <div style="position:sticky;top:0;z-index:9999;background:#0a0e1c;border-bottom:1px solid rgba(59,130,246,0.40);box-shadow:0 4px 16px rgba(0,0,0,0.55);padding:10px 20px;text-align:center;font-size:13px;color:#93c5fd;font-weight:600"> | |
| 11 | <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" style="vertical-align:-2px"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="3"/></svg> | |
| 12 | $preview_banner | |
| 13 | </div> | |
| 14 | [/if] | |
| 15 | ||
| 16 | <header style="border-bottom:1px solid var(--col-border);background:var(--col-bg-2);padding:18px 32px;display:flex;align-items:center;gap:18px;flex-wrap:wrap"> | |
| 17 | <a href="/store.cgi?id=$store_id" style="display:flex;align-items:center;gap:12px;text-decoration:none;flex-shrink:0"> | |
| 18 | <div class="brand-mark" style="background:linear-gradient(130deg, var(--col-accent) 0%, var(--col-accent-bright) 100%)">$store_initials</div> | |
| 19 | <div class="brand-text" style="line-height:1.2"> | |
| 20 | <span class="brand-name" style="font-family:var(--font-display);font-size:24px;font-weight:700;display:block;color:var(--col-text)">$store_name</span> | |
| 21 | <span class="brand-sub" style="font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--col-text-3)">Powered by affiliate.3dshawn.com</span> | |
| 22 | </div> | |
| 23 | </a> | |
| 24 | <div style="flex:1;display:flex;justify-content:center;min-width:0">$store_search_form</div> | |
| 25 | <!-- Dynamic nav -- Home + every published page from storefront_pages | |
| 26 | (store.cgi builds @nav_pages and passes it in). Sign in + Cart | |
| 27 | come from store.cgi tvars so every layout shares one source. --> | |
| 28 | <nav style="display:flex;gap:18px;align-items:center;flex-wrap:wrap"> | |
| 29 | <a href="/store.cgi?id=$store_id" style="font-size:13px;color:var(--col-text-2);font-weight:500">Home</a> | |
| 30 | [loop:@nav_pages] | |
| 31 | <a href="$loop1.href" style="font-size:13px;color:var(--col-text-2);font-weight:500">$loop1.title</a> | |
| 32 | [/loop] | |
| 33 | $store_signin_link | |
| 34 | $store_cart_link | |
| 35 | </nav> | |
| 36 | </header> | |
| 37 | ||
| 38 | [if:$is_specific_page] | |
| 39 | [if:$page_not_found] | |
| 40 | <section style="padding:120px 32px;text-align:center;max-width:600px;margin:0 auto"> | |
| 41 | <h1 class="hero-title" style="font-size:48px">Page not found</h1> | |
| 42 | <p class="hero-sub" style="margin:16px auto">This storefront doesn't have a page at that URL.</p> | |
| 43 | <a href="/store.cgi?id=$store_id" class="btn btn-primary btn-lg">Back to home</a> | |
| 44 | </section> | |
| 45 | [/if] | |
| 46 | [if:!$page_not_found] | |
| 47 | <section style="padding:80px 32px 40px;max-width:1480px;margin:0 auto"> | |
| 48 | <span class="section-eyebrow">$page_slug</span> | |
| 49 | <h1 class="hero-title" style="font-size:48px">$page_title</h1> | |
| 50 | <div class="text-secondary" style="font-size:17px;line-height:1.7;margin-top:24px;white-space:pre-wrap;max-width:900px">$page_body</div> | |
| 51 | [if:$is_draft_page] | |
| 52 | <div class="banner warning mt-4"> | |
| 53 | <div class="text-xs">This page is a <strong>draft</strong>. Buyers won't see it until you publish.</div> | |
| 54 | </div> | |
| 55 | [/if] | |
| 56 | </section> | |
| 57 | [if:$is_collection_page] | |
| 58 | <!-- Collection-type pages (page_type='collection') render the | |
| 59 | product grid below the page header so /shop, /product_list, | |
| 60 | and any other product-listing page actually shows the products | |
| 61 | instead of just the placeholder body copy. --> | |
| 62 | <section id="shop" style="padding:20px 32px 80px;max-width:1480px;margin:0 auto"> | |
| 63 | [if:$has_products] | |
| 64 | <div class="model-grid"> | |
| 65 | [loop:@products] | |
| 66 | <a href="/listing_details.cgi?id=$loop1.id" class="model-card" style="text-decoration:none"> | |
| 67 | <div class="model-thumb"> | |
| 68 | <img src="$loop1.hero_image" alt="$loop1.title" loading="lazy"> | |
| 69 | <div class="model-badges">$loop1.rating_html</div> | |
| 70 | </div> | |
| 71 | <div class="model-info"> | |
| 72 | <div class="model-name">$loop1.title</div> | |
| 73 | <div class="model-row"> | |
| 74 | <span class="model-price">$loop1.price</span> | |
| 75 | <span class="text-dim text-xs">$loop1.rating_n reviews</span> | |
| 76 | </div> | |
| 77 | </div> | |
| 78 | </a> | |
| 79 | [/loop] | |
| 80 | </div> | |
| 81 | [/if] | |
| 82 | [if:!$has_products] | |
| 83 | <div class="card" style="text-align:center;padding:60px 32px"> | |
| 84 | <div style="font-family:var(--font-display);font-size:22px;color:var(--col-text);margin-bottom:8px">No products yet</div> | |
| 85 | <p class="text-secondary">This storefront hasn't published any designs.</p> | |
| 86 | </div> | |
| 87 | [/if] | |
| 88 | $pagination_html | |
| 89 | </section> | |
| 90 | [/if] | |
| 91 | [/if] | |
| 92 | [/if] | |
| 93 | ||
| 94 | [if:!$is_specific_page] | |
| 95 | <section style="position:relative;padding:80px 32px 60px;overflow:hidden"> | |
| 96 | <div style="position:absolute;width:700px;height:700px;top:-200px;right:-100px;background:radial-gradient(circle, var(--col-accent-glow), transparent 65%);filter:blur(80px);pointer-events:none"></div> | |
| 97 | ||
| 98 | <div style="max-width:1280px;margin:0 auto;display:grid;grid-template-columns:1.1fr 1fr;gap:64px;align-items:center;position:relative;z-index:2"> | |
| 99 | <div> | |
| 100 | <span class="hero-pill"><span class="dot"></span> $product_count designs · $hero_pill_label</span> | |
| 101 | <h1 class="hero-title" style="font-size:clamp(38px,5vw,68px)">$hero_title</h1> | |
| 102 | <p class="hero-sub">$store_tagline</p> | |
| 103 | <div class="hero-cta"> | |
| 104 | <a href="#shop" class="btn btn-primary btn-lg">$hero_cta_primary_label</a> | |
| 105 | <a href="#about" class="btn btn-secondary btn-lg">$hero_cta_secondary_label</a> | |
| 106 | </div> | |
| 107 | </div> | |
| 108 | <div style="position:relative;height:480px"> | |
| 109 | <div class="float-card fc-1" data-we-editable="image" data-we-field="hero_image_1" style="width:300px;background:url('$hero_image_1') $hero_image_1_pos/cover;height:380px;top:0;border:1px solid var(--col-border-2)"></div> | |
| 110 | <div class="float-card fc-2" data-we-editable="image" data-we-field="hero_image_2" style="width:240px;background:url('$hero_image_2') $hero_image_2_pos/cover;height:300px;top:60px;right:-20px;border:1px solid var(--col-border-2)"></div> | |
| 111 | <div class="float-card fc-3" data-we-editable="image" data-we-field="hero_image_3" style="width:260px;background:url('$hero_image_3') $hero_image_3_pos/cover;height:320px;bottom:0;left:30px;border:1px solid var(--col-border-2)"></div> | |
| 112 | </div> | |
| 113 | </div> | |
| 114 | </section> | |
| 115 | ||
| 116 | <section id="shop" style="padding:60px 32px;max-width:1480px;margin:0 auto"> | |
| 117 | <div style="display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:32px;flex-wrap:wrap;gap:18px"> | |
| 118 | <div> | |
| 119 | <span class="section-eyebrow">$section_eyebrow</span> | |
| 120 | <h2 class="section-title" style="font-size:32px;margin:0">$product_count designs</h2> | |
| 121 | </div> | |
| 122 | </div> | |
| 123 | ||
| 124 | [if:$has_products] | |
| 125 | <div class="model-grid"> | |
| 126 | [loop:@products] | |
| 127 | <a href="/listing_details.cgi?id=$loop1.id" class="model-card" style="text-decoration:none"> | |
| 128 | <div class="model-thumb"> | |
| 129 | <img src="$loop1.hero_image" alt="$loop1.title" loading="lazy"> | |
| 130 | <div class="model-badges">$loop1.rating_html</div> | |
| 131 | </div> | |
| 132 | <div class="model-info"> | |
| 133 | <div class="model-name">$loop1.title</div> | |
| 134 | <div class="model-row"> | |
| 135 | <span class="model-price">$loop1.price</span> | |
| 136 | <span class="text-dim text-xs">$loop1.rating_n reviews</span> | |
| 137 | </div> | |
| 138 | </div> | |
| 139 | </a> | |
| 140 | [/loop] | |
| 141 | </div> | |
| 142 | [/if] | |
| 143 | ||
| 144 | $pagination_html | |
| 145 | ||
| 146 | [if:!$has_products] | |
| 147 | <div class="card" style="text-align:center;padding:64px 32px"> | |
| 148 | <div style="font-family:var(--font-display);font-size:24px;color:var(--col-text);margin-bottom:8px">No products yet</div> | |
| 149 | <p class="text-secondary">This storefront hasn't published any designs.</p> | |
| 150 | </div> | |
| 151 | [/if] | |
| 152 | </section> | |
| 153 | ||
| 154 | <section id="about" style="padding:80px 32px;background:var(--col-bg-2);border-top:1px solid var(--col-border);border-bottom:1px solid var(--col-border)"> | |
| 155 | <div style="max-width:1100px;margin:0 auto;display:grid;grid-template-columns:1fr 1.4fr;gap:48px;align-items:center"> | |
| 156 | <div> | |
| 157 | <div data-we-editable="image" data-we-field="about_image" style="aspect-ratio:1;background:url('$about_image') $about_image_pos/cover;border-radius:16px;border:1px solid var(--col-border)"></div> | |
| 158 | </div> | |
| 159 | <div> | |
| 160 | <span class="section-eyebrow">$about_eyebrow</span> | |
| 161 | <h2 class="section-title" style="font-size:30px">$about_heading</h2> | |
| 162 | <p class="text-secondary" style="font-size:15px;line-height:1.75">$store_about</p> | |
| 163 | </div> | |
| 164 | </div> | |
| 165 | </section> | |
| 166 | [/if] | |
| 167 | ||
| 168 | <footer style="background:var(--col-bg-2);border-top:1px solid var(--col-border);padding:40px 32px 24px;margin-top:60px"> | |
| 169 | <div style="max-width:1280px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:18px"> | |
| 170 | <div class="flex items-center gap-3"> | |
| 171 | <div class="brand-mark" style="background:linear-gradient(130deg, var(--col-accent), var(--col-accent-bright));width:32px;height:32px;font-size:14px">$store_initials</div> | |
| 172 | <div> | |
| 173 | <div class="brand-name" style="font-family:var(--font-display);font-size:18px;font-weight:700;color:var(--col-text)">$store_name</div> | |
| 174 | <div class="text-xs text-dim" style="letter-spacing:1px;text-transform:uppercase">Powered by affiliate.3dshawn.com</div> | |
| 175 | </div> | |
| 176 | </div> | |
| 177 | <div class="text-xs text-dim">$footer_trust</div> | |
| 178 | </div> | |
| 179 | </footer> |