Diff -- /var/www/vhosts/webstls.com/httpdocs/TEMPLATES/webstls_store.html
Diff

/var/www/vhosts/webstls.com/httpdocs/TEMPLATES/webstls_store.html

added on WebSTLs (webstls.com) at 2026-07-01 22:27:05

Added
+225
lines
Removed
-0
lines
Context
0
unchanged
Blobs
from
to 4abbb00c7203
Restore this content →
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.
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">&mdash; $loop1.author[if:$loop1.has_model] &middot; $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>
Keyboard: j next diff k previous diff g top G bottom r restore c compile-check ? help