added on WebSTLs (webstls.com) at 2026-07-01 22:27:05
| 1 | <!-- ===================================================================== | |
| 2 | Public storefront — buyer-facing. | |
| 3 | Rendered by store.cgi using webstls_marketing.html as the outer shell. | |
| 4 | ===================================================================== --> | |
| 5 | ||
| 6 | <!-- Per-storefront theme. The values come from MODS::WebSTLs::Themes | |
| 7 | based on storefronts.theme_id. Overrides the site's :root colors. --> | |
| 8 | <style> | |
| 9 | :root { | |
| 10 | $theme_css_vars | |
| 11 | } | |
| 12 | </style> | |
| 13 | ||
| 14 | [if:$preview_banner] | |
| 15 | <div style="position:sticky;top:0;z-index:9000;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"> | |
| 16 | <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> | |
| 17 | $preview_banner | |
| 18 | </div> | |
| 19 | [/if] | |
| 20 | ||
| 21 | <!-- ===== Storefront top bar ============================================ --> | |
| 22 | <header style="border-bottom:1px solid var(--col-border);background:var(--col-bg-2);padding:18px 32px;display:flex;align-items:center;gap:18px"> | |
| 23 | <a href="/store.cgi?id=$store_id" style="display:flex;align-items:center;gap:12px;text-decoration:none"> | |
| 24 | <div class="brand-mark" style="background:linear-gradient(130deg,#7c3aed 0%,#3b82f6 100%)">$store_initials</div> | |
| 25 | <div class="brand-text" style="line-height:1.2"> | |
| 26 | <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> | |
| 27 | <span class="brand-sub" style="font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--col-text-3)">Powered by webstls.com</span> | |
| 28 | </div> | |
| 29 | </a> | |
| 30 | <!-- Dynamic nav -- a Home link + every published page from | |
| 31 | storefront_pages (loop set up in store.cgi as @nav_pages). | |
| 32 | Layouts that want their own nav can ignore this; this is the | |
| 33 | global storefront top bar that every layout sits under. --> | |
| 34 | <nav style="display:flex;gap:24px;margin-left:32px"> | |
| 35 | <a href="/store.cgi?id=$store_id" style="font-size:13px;color:var(--col-text-2);font-weight:500">Home</a> | |
| 36 | [loop:@nav_pages] | |
| 37 | <a href="$loop1.href" style="font-size:13px;color:var(--col-text-2);font-weight:500">$loop1.title</a> | |
| 38 | [/loop] | |
| 39 | </nav> | |
| 40 | <div style="margin-left:auto;display:flex;gap:10px;align-items:center"> | |
| 41 | <button class="icon-btn" title="Search"> | |
| 42 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/></svg> | |
| 43 | </button> | |
| 44 | <a href="#" class="btn btn-secondary btn-sm">Sign in</a> | |
| 45 | <a href="#" class="btn btn-primary btn-sm"> | |
| 46 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="9" cy="21" r="1"/><circle cx="20" cy="21" r="1"/><path d="M1 1h4l2.7 13.4a2 2 0 0 0 2 1.6h9.7a2 2 0 0 0 2-1.6L23 6H6"/></svg> | |
| 47 | Cart | |
| 48 | </a> | |
| 49 | </div> | |
| 50 | </header> | |
| 51 | ||
| 52 | ||
| 53 | [if:$is_specific_page] | |
| 54 | [if:$page_not_found] | |
| 55 | <section style="padding:120px 32px;text-align:center;max-width:600px;margin:0 auto"> | |
| 56 | <h1 class="hero-title" style="font-size:48px">Page not found</h1> | |
| 57 | <p class="hero-sub" style="margin:16px auto">This storefront doesn't have a page at that URL — it may have been moved or hidden.</p> | |
| 58 | <a href="/store.cgi?id=$store_id" class="btn btn-primary btn-lg">Back to home</a> | |
| 59 | </section> | |
| 60 | [/if] | |
| 61 | [if:!$page_not_found] | |
| 62 | <section style="padding:80px 32px 60px;max-width:900px;margin:0 auto"> | |
| 63 | <span class="section-eyebrow">$page_slug</span> | |
| 64 | <h1 class="hero-title" style="font-size:48px">$page_title</h1> | |
| 65 | <div class="text-secondary" style="font-size:17px;line-height:1.7;margin-top:24px;white-space:pre-wrap">$page_body</div> | |
| 66 | [if:$is_draft_page] | |
| 67 | <div class="banner warning mt-4"> | |
| 68 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/></svg> | |
| 69 | <div class="text-xs">This page is a <strong>draft</strong>. Buyers won't see it until you publish.</div> | |
| 70 | </div> | |
| 71 | [/if] | |
| 72 | </section> | |
| 73 | [/if] | |
| 74 | [/if] | |
| 75 | ||
| 76 | [if:!$is_specific_page] | |
| 77 | <!-- ===== Hero ========================================================= --> | |
| 78 | <section style="position:relative;padding:80px 32px 60px;overflow:hidden"> | |
| 79 | <div style="position:absolute;width:700px;height:700px;top:-200px;right:-100px;background:radial-gradient(circle, rgba(124,58,237,0.18), transparent 65%);filter:blur(80px);pointer-events:none"></div> | |
| 80 | <div style="position:absolute;width:500px;height:500px;bottom:-150px;left:5%;background:radial-gradient(circle, rgba(59,130,246,0.16), transparent 65%);filter:blur(80px);pointer-events:none"></div> | |
| 81 | ||
| 82 | <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"> | |
| 83 | <div> | |
| 84 | <span class="hero-pill"><span class="dot"></span> $product_count designs · battle‑ready</span> | |
| 85 | <h1 class="hero-title" style="font-size:clamp(38px,5vw,68px)"> | |
| 86 | Premium <span class="grad">3D printable</span> designs | |
| 87 | </h1> | |
| 88 | <p class="hero-sub">$store_tagline</p> | |
| 89 | <div class="hero-cta"> | |
| 90 | <a href="#shop" class="btn btn-primary btn-lg">Browse the catalog</a> | |
| 91 | <a href="#about" class="btn btn-secondary btn-lg">Meet the maker</a> | |
| 92 | </div> | |
| 93 | <div class="hero-trust"> | |
| 94 | <div class="hero-trust-item"> | |
| 95 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg> | |
| 96 | Pre-supported · slicer-ready | |
| 97 | </div> | |
| 98 | <div class="hero-trust-item"> | |
| 99 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg> | |
| 100 | Instant download after purchase | |
| 101 | </div> | |
| 102 | <div class="hero-trust-item"> | |
| 103 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg> | |
| 104 | Personal-use license included | |
| 105 | </div> | |
| 106 | </div> | |
| 107 | </div> | |
| 108 | ||
| 109 | <div style="position:relative;height:480px"> | |
| 110 | <div class="float-card fc-1" style="width:300px;background:url('/assets/images/4.webp') center/cover;height:380px;top:0;border:1px solid var(--col-border-2)"></div> | |
| 111 | <div class="float-card fc-2" style="width:240px;background:url('/assets/images/9.webp') center/cover;height:300px;top:60px;right:-20px;border:1px solid var(--col-border-2)"></div> | |
| 112 | <div class="float-card fc-3" style="width:260px;background:url('/assets/images/14.webp') center/cover;height:320px;bottom:0;left:30px;border:1px solid var(--col-border-2)"></div> | |
| 113 | </div> | |
| 114 | </div> | |
| 115 | </section> | |
| 116 | ||
| 117 | ||
| 118 | <!-- ===== Catalog ====================================================== --> | |
| 119 | <section id="shop" style="padding:60px 32px;max-width:1480px;margin:0 auto"> | |
| 120 | <div style="display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:32px;flex-wrap:wrap;gap:18px"> | |
| 121 | <div> | |
| 122 | <span class="section-eyebrow">The catalog</span> | |
| 123 | <h2 class="section-title" style="font-size:32px;margin:0">$product_count designs</h2> | |
| 124 | </div> | |
| 125 | <div style="display:flex;gap:10px"> | |
| 126 | <select class="select" style="width:auto;min-width:160px"> | |
| 127 | <option>All categories</option> | |
| 128 | <option>Miniatures</option> | |
| 129 | <option>Terrain</option> | |
| 130 | <option>Bundles</option> | |
| 131 | </select> | |
| 132 | <select class="select" style="width:auto;min-width:160px"> | |
| 133 | <option>Newest first</option> | |
| 134 | <option>Price: low to high</option> | |
| 135 | <option>Price: high to low</option> | |
| 136 | <option>Best sellers</option> | |
| 137 | </select> | |
| 138 | </div> | |
| 139 | </div> | |
| 140 | ||
| 141 | [if:$has_products] | |
| 142 | <div class="model-grid"> | |
| 143 | [loop:@products] | |
| 144 | <a href="#" class="model-card" style="text-decoration:none"> | |
| 145 | <div class="model-thumb"> | |
| 146 | <img src="/assets/images/$loop1.image_idx.webp" alt="$loop1.title" loading="lazy"> | |
| 147 | <div class="model-badges">$loop1.rating_html</div> | |
| 148 | </div> | |
| 149 | <div class="model-info"> | |
| 150 | <div class="model-name">$loop1.title</div> | |
| 151 | <div class="model-row"> | |
| 152 | <span class="model-price">$loop1.price</span> | |
| 153 | <span class="text-dim text-xs">$loop1.rating_n reviews</span> | |
| 154 | </div> | |
| 155 | </div> | |
| 156 | </a> | |
| 157 | [/loop] | |
| 158 | </div> | |
| 159 | [/if] | |
| 160 | ||
| 161 | [if:!$has_products] | |
| 162 | <div class="card" style="text-align:center;padding:64px 32px"> | |
| 163 | <div style="font-family:var(--font-display);font-size:24px;color:var(--col-text);margin-bottom:8px">No products yet</div> | |
| 164 | <p class="text-secondary">This storefront hasn't published any designs. Check back soon, or browse other creators on WebSTLs.</p> | |
| 165 | </div> | |
| 166 | [/if] | |
| 167 | </section> | |
| 168 | ||
| 169 | ||
| 170 | <!-- ===== About strip ================================================== --> | |
| 171 | <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)"> | |
| 172 | <div style="max-width:1100px;margin:0 auto;display:grid;grid-template-columns:1fr 1.4fr;gap:48px;align-items:center"> | |
| 173 | <div> | |
| 174 | <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> | |
| 175 | </div> | |
| 176 | <div> | |
| 177 | <span class="section-eyebrow">$about_eyebrow</span> | |
| 178 | <h2 class="section-title" style="font-size:30px">$about_heading</h2> | |
| 179 | <p class="text-secondary" style="font-size:15px;line-height:1.75">$store_about</p> | |
| 180 | <div class="flex gap-3 mt-3"> | |
| 181 | <span class="pill brand">Trusted creator</span> | |
| 182 | <span class="pill success">Verified payouts</span> | |
| 183 | <span class="pill">$product_count releases</span> | |
| 184 | </div> | |
| 185 | </div> | |
| 186 | </div> | |
| 187 | </section> | |
| 188 | ||
| 189 | ||
| 190 | <!-- ===== Reviews -- pulled from external_comments (cross-platform inbox). | |
| 191 | Only shown when the seller has 4+ star real reviews on file. --> | |
| 192 | [if:$has_reviews] | |
| 193 | <section style="padding:60px 32px;max-width:1280px;margin:0 auto"> | |
| 194 | <span class="section-eyebrow">What buyers are saying</span> | |
| 195 | <h2 class="section-title" style="font-size:28px;margin-bottom:32px">Real reviews from real prints</h2> | |
| 196 | ||
| 197 | <div class="dash-grid-3"> | |
| 198 | [loop:@reviews] | |
| 199 | <div class="card"> | |
| 200 | <div class="text-warning mb-2">$loop1.stars_str</div> | |
| 201 | <p class="text-sm" style="line-height:1.7">$loop1.body</p> | |
| 202 | <div class="text-xs text-dim mt-3">— $loop1.author[if:$loop1.has_model] · $loop1.model_title[/if]</div> | |
| 203 | </div> | |
| 204 | [/loop] | |
| 205 | </div> | |
| 206 | </section> | |
| 207 | [/if] | |
| 208 | [/if] | |
| 209 | ||
| 210 | ||
| 211 | <!-- ===== Footer ======================================================== --> | |
| 212 | <footer style="background:var(--col-bg-2);border-top:1px solid var(--col-border);padding:40px 32px 24px;margin-top:60px"> | |
| 213 | <div style="max-width:1280px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:18px"> | |
| 214 | <div class="flex items-center gap-3"> | |
| 215 | <div class="brand-mark" style="background:linear-gradient(130deg,#7c3aed,#3b82f6);width:32px;height:32px;font-size:14px">$store_initials</div> | |
| 216 | <div> | |
| 217 | <div class="brand-name" style="font-family:var(--font-display);font-size:18px;font-weight:700;color:var(--col-text)">$store_name</div> | |
| 218 | <div class="text-xs text-dim" style="letter-spacing:1px;text-transform:uppercase">Powered by webstls.com</div> | |
| 219 | </div> | |
| 220 | </div> | |
| 221 | <div class="text-xs text-dim"> | |
| 222 | $footer_trust | |
| 223 | </div> | |
| 224 | </div> | |
| 225 | </footer> |